Switch all instances of malloc/free in the DRM to drm_alloc, drm_free
authoroga <oga@openbsd.org>
Tue, 29 Jul 2008 19:44:13 +0000 (19:44 +0000)
committeroga <oga@openbsd.org>
Tue, 29 Jul 2008 19:44:13 +0000 (19:44 +0000)
and drm_calloc.

With the recent change to check overflow in drm_calloc, this means that
all allocations that require multiplication are now checked. Also use
drm_calloc() when zeroing is needed and drop the bzero/memset
afterwards.  Finally, make drm_free() check for NULL, so we don't need
to do so every time.

ok miod@, deraadt@

22 files changed:
sys/dev/pci/drm/drmP.h
sys/dev/pci/drm/drm_agpsupport.c
sys/dev/pci/drm/drm_auth.c
sys/dev/pci/drm/drm_bufs.c
sys/dev/pci/drm/drm_context.c
sys/dev/pci/drm/drm_dma.c
sys/dev/pci/drm/drm_drawable.c
sys/dev/pci/drm/drm_drv.c
sys/dev/pci/drm/drm_fops.c
sys/dev/pci/drm/drm_ioctl.c
sys/dev/pci/drm/drm_irq.c
sys/dev/pci/drm/drm_memory.c
sys/dev/pci/drm/drm_pci.c
sys/dev/pci/drm/drm_scatter.c
sys/dev/pci/drm/i915_dma.c
sys/dev/pci/drm/mach64_dma.c
sys/dev/pci/drm/mga_dma.c
sys/dev/pci/drm/r128_cce.c
sys/dev/pci/drm/radeon_cp.c
sys/dev/pci/drm/radeon_mem.c
sys/dev/pci/drm/savage_bci.c
sys/dev/pci/drm/savage_state.c

index 24f8c6b..0db2e7d 100644 (file)
 #define DRM_KERNEL_CONTEXT    0         /* Change drm_resctx if changed          */
 #define DRM_RESERVED_CONTEXTS 1         /* Change drm_resctx if changed          */
 
-#define DRM_MEM_DMA       0
-#define DRM_MEM_SAREA     1
-#define DRM_MEM_DRIVER    2
-#define DRM_MEM_MAGIC     3
-#define DRM_MEM_IOCTLS    4
-#define DRM_MEM_MAPS      5
-#define DRM_MEM_BUFS      6
-#define DRM_MEM_SEGS      7
-#define DRM_MEM_PAGES     8
-#define DRM_MEM_FILES    9
-#define DRM_MEM_QUEUES   10
-#define DRM_MEM_CMDS     11
-#define DRM_MEM_MAPPINGS  12
-#define DRM_MEM_BUFLISTS  13
-#define DRM_MEM_AGPLISTS  14
-#define DRM_MEM_TOTALAGP  15
-#define DRM_MEM_BOUNDAGP  16
-#define DRM_MEM_CTXBITMAP 17
-#define DRM_MEM_STUB     18
-#define DRM_MEM_SGLISTS          19
-#define DRM_MEM_DRAWABLE  20
-#define DRM_MEM_MM     21
+#define DRM_MEM_DMA            0
+#define DRM_MEM_SAREA          1
+#define DRM_MEM_DRIVER         2
+#define DRM_MEM_MAGIC          3
+#define DRM_MEM_IOCTLS         4
+#define DRM_MEM_MAPS           5
+#define DRM_MEM_BUFS           6
+#define DRM_MEM_SEGS           7
+#define DRM_MEM_PAGES          8
+#define DRM_MEM_FILES          9
+#define DRM_MEM_QUEUES         10
+#define DRM_MEM_CMDS           11
+#define DRM_MEM_MAPPINGS       12
+#define DRM_MEM_BUFLISTS       13
+#define DRM_MEM_AGPLISTS       14
+#define DRM_MEM_TOTALAGP       15
+#define DRM_MEM_BOUNDAGP       16
+#define DRM_MEM_CTXBITMAP      17
+#define DRM_MEM_CTXLIST                18
+#define DRM_MEM_STUB           19
+#define DRM_MEM_SGLISTS                20
+#define DRM_MEM_DRAWABLE       21
+#define DRM_MEM_MM             22
 
 #define DRM_MAX_CTXBITMAP (PAGE_SIZE * 8)
 
@@ -371,7 +372,6 @@ typedef struct drm_dma_handle {
        bus_dmamap_t    dmamap;
        bus_dma_segment_t seg;
        void *addr;
-       bus_addr_t dmaaddr;
        size_t size;
 } drm_dma_handle_t;
 
index fe52736..cada9cf 100644 (file)
@@ -192,7 +192,7 @@ drm_agp_alloc(struct drm_device *dev, drm_agp_buffer_t *request)
        if (!dev->agp || !dev->agp->acquired)
                return EINVAL;
 
-       entry = malloc(sizeof(*entry), M_DRM, M_NOWAIT | M_ZERO);
+       entry = drm_alloc(sizeof(*entry), DRM_MEM_AGPLISTS);
        if (entry == NULL)
                return ENOMEM;
 
@@ -203,7 +203,7 @@ drm_agp_alloc(struct drm_device *dev, drm_agp_buffer_t *request)
        handle = drm_agp_allocate_memory(pages, type);
        DRM_LOCK();
        if (handle == NULL) {
-               free(entry, M_DRM);
+               drm_free(entry, sizeof(*entry), DRM_MEM_AGPLISTS);
                return ENOMEM;
        }
        
@@ -352,7 +352,7 @@ drm_agp_free(struct drm_device *dev, drm_agp_buffer_t *request)
        drm_agp_free_memory(entry->handle);
        DRM_LOCK();
 
-       free(entry, M_DRM);
+       drm_free(entry, sizeof(*entry), DRM_MEM_AGPLISTS);
 
        return 0;
 
@@ -388,7 +388,7 @@ drm_agp_init(void)
        DRM_DEBUG("agp_available = %d\n", agp_available);
 
        if (agp_available) {
-               head = malloc(sizeof(*head), M_DRM, M_NOWAIT | M_ZERO);
+               head = drm_calloc(1, sizeof(*head), DRM_MEM_AGPLISTS);
                if (head == NULL)
                        return NULL;
                head->agpdev = agpdev;
index cbe4fd8..02568d9 100644 (file)
@@ -70,7 +70,7 @@ drm_add_magic(struct drm_device *dev, struct drm_file *priv, drm_magic_t magic)
 
        DRM_SPINLOCK_ASSERT(&dev->dev_lock);
 
-       if ((entry = malloc(sizeof(*entry), M_DRM, M_ZERO | M_NOWAIT)) == NULL)
+       if ((entry = drm_alloc(sizeof(*entry), DRM_MEM_MAGIC)) == NULL)
                return (ENOMEM);
        entry->magic = magic;
        entry->priv = priv;
@@ -97,7 +97,7 @@ drm_remove_magic(struct drm_device *dev, drm_magic_t magic)
        if ((pt = SPLAY_FIND(drm_magic_tree, &dev->magiclist, &key)) == NULL)
                return (EINVAL);
        SPLAY_REMOVE(drm_magic_tree, &dev->magiclist, pt);
-       free(pt, M_DRM);
+       drm_free(pt, sizeof(*pt), DRM_MEM_MAGIC);
        return (0);
 }
 
index 93b0548..e9973eb 100644 (file)
@@ -160,7 +160,7 @@ drm_addmap(struct drm_device * dev, unsigned long offset, unsigned long size,
        /* Allocate a new map structure, fill it in, and do any type-specific
         * initialization necessary.
         */
-       map = malloc(sizeof(*map), M_DRM, M_ZERO | M_NOWAIT);
+       map = drm_calloc(1, sizeof(*map), DRM_MEM_MAPS);
        if ( !map ) {
                DRM_LOCK();
                return ENOMEM;
@@ -176,14 +176,14 @@ drm_addmap(struct drm_device * dev, unsigned long offset, unsigned long size,
            PAGE_SIZE, 0);
        if (map->mm == NULL) {
                DRM_ERROR("can't find free offset\n");
-               free(map, M_DRM);
+               drm_free(map, sizeof(*map), DRM_MEM_MAPS);
                return ENOMEM;
        }
        map->mm = drm_memrange_get_block(map->mm, map->size,
            PAGE_SIZE); 
        if (map->mm == NULL) {
                DRM_ERROR("can't get block\n");
-               free(map, M_DRM);
+               drm_free(map, sizeof(*map), DRM_MEM_MAPS);
                return ENOMEM;
        }
 
@@ -234,7 +234,7 @@ drm_addmap(struct drm_device * dev, unsigned long offset, unsigned long size,
                        }
                }
                if (!TAILQ_EMPTY(&dev->agp->memory) && !valid) {
-                       free(map, M_DRM);
+                       drm_free(map, sizeof(*map), DRM_MEM_MAPS);
                        DRM_LOCK();
                        DRM_ERROR("invalid agp map requested\n");
                        return EACCES;
@@ -243,7 +243,7 @@ drm_addmap(struct drm_device * dev, unsigned long offset, unsigned long size,
                break;
        case _DRM_SCATTER_GATHER:
                if (!dev->sg) {
-                       free(map, M_DRM);
+                       drm_free(map, sizeof(*map), DRM_MEM_MAPS);
                        DRM_LOCK();
                        return EINVAL;
                }
@@ -262,7 +262,7 @@ drm_addmap(struct drm_device * dev, unsigned long offset, unsigned long size,
                        align = PAGE_SIZE;
                map->dmah = drm_pci_alloc(dev, map->size, align, 0xfffffffful);
                if (map->dmah == NULL) {
-                       free(map, M_DRM);
+                       drm_free(map, sizeof(*map), DRM_MEM_MAPS);
                        DRM_LOCK();
                        return ENOMEM;
                }
@@ -275,7 +275,7 @@ drm_addmap(struct drm_device * dev, unsigned long offset, unsigned long size,
                        if (dev->lock.hw_lock != NULL) {
                                DRM_UNLOCK();
                                drm_pci_free(dev, map->dmah);
-                               free(map, M_DRM);
+                               drm_free(map, sizeof(*map), DRM_MEM_MAPS);
                                DRM_LOCK();
                                return EBUSY;
                        }
@@ -285,7 +285,7 @@ drm_addmap(struct drm_device * dev, unsigned long offset, unsigned long size,
                break;
        default:
                DRM_ERROR("Bad map type %d\n", map->type);
-               free(map, M_DRM);
+               drm_free(map, sizeof(*map), DRM_MEM_MAPS);
                DRM_LOCK();
                return EINVAL;
        }
@@ -369,7 +369,7 @@ drm_rmmap(struct drm_device *dev, drm_local_map_t *map)
 
        drm_memrange_put_block(map->mm);
 
-       free(map, M_DRM);
+       drm_free(map, sizeof(*map), DRM_MEM_MAPS);
 }
 
 /* Remove a map private from list and deallocate resources if the mapping
@@ -412,16 +412,19 @@ drm_cleanup_buf_error(struct drm_device *dev, drm_buf_entry_t *entry)
                for (i = 0; i < entry->seg_count; i++) {
                        drm_pci_free(dev, entry->seglist[i]);
                }
-               free(entry->seglist, M_DRM);
+               drm_free(entry->seglist, entry->seg_count *
+                   sizeof(*entry->seglist), DRM_MEM_BUFS);
 
                entry->seg_count = 0;
        }
 
        if (entry->buf_count) {
                for (i = 0; i < entry->buf_count; i++) {
-                       free(entry->buflist[i].dev_private, M_DRM);
+                       drm_free(entry->buflist[i].dev_private,
+                           entry->buflist[i].dev_priv_size, DRM_MEM_BUFS);
                }
-               free(entry->buflist, M_DRM);
+               drm_free(entry->buflist, entry->buf_count *
+                   sizeof(*entry->buflist), DRM_MEM_BUFS);
 
                entry->buf_count = 0;
        }
@@ -493,8 +496,8 @@ drm_do_addbufs_agp(struct drm_device *dev, drm_buf_desc_t *request)
 
        entry = &dma->bufs[order];
 
-       entry->buflist = malloc(count * sizeof(*entry->buflist), M_DRM,
-           M_NOWAIT | M_ZERO);
+       entry->buflist = drm_calloc(count, sizeof(*entry->buflist),
+           DRM_MEM_BUFS);
        if ( !entry->buflist ) {
                return ENOMEM;
        }
@@ -519,8 +522,8 @@ drm_do_addbufs_agp(struct drm_device *dev, drm_buf_desc_t *request)
                buf->file_priv = NULL;
 
                buf->dev_priv_size = dev->driver.buf_priv_size;
-               buf->dev_private = malloc(buf->dev_priv_size, M_DRM,
-                   M_NOWAIT | M_ZERO);
+               buf->dev_private = drm_calloc(1, buf->dev_priv_size,
+                   DRM_MEM_BUFS);
                if (buf->dev_private == NULL) {
                        /* Set count correctly so we free the proper amount. */
                        entry->buf_count = count;
@@ -597,25 +600,25 @@ drm_do_addbufs_pci(struct drm_device *dev, drm_buf_desc_t *request)
 
        entry = &dma->bufs[order];
 
-       entry->buflist = malloc(count * sizeof(*entry->buflist), M_DRM,
-           M_NOWAIT | M_ZERO);
-       entry->seglist = malloc(count * sizeof(*entry->seglist), M_DRM,
-           M_NOWAIT | M_ZERO);
+       entry->buflist = drm_calloc(count, sizeof(*entry->buflist),
+           DRM_MEM_BUFS);
+       entry->seglist = drm_calloc(count, sizeof(*entry->seglist),
+           DRM_MEM_BUFS);
 
        /* Keep the original pagelist until we know all the allocations
         * have succeeded
         */
-       temp_pagelist = malloc((dma->page_count + (count << page_order)) *
-           sizeof(*dma->pagelist), M_DRM, M_NOWAIT);
+       temp_pagelist = drm_calloc((dma->page_count + (count << page_order)),
+           sizeof(*dma->pagelist), DRM_MEM_BUFS);
 
        if (entry->buflist == NULL || entry->seglist == NULL || 
            temp_pagelist == NULL) {
-               if (temp_pagelist)
-                       free(temp_pagelist, M_DRM);
-               if (entry->seglist)
-                       free(entry->seglist, M_DRM);
-               if (entry->buflist)
-                       free(entry->buflist, M_DRM);
+               drm_free(temp_pagelist, (dma->page_count + (count <<
+                   page_order)) * sizeof(*dma->pagelist), DRM_MEM_BUFS);
+               drm_free(entry->seglist, count * sizeof(*entry->seglist),
+                   DRM_MEM_BUFS);
+               drm_free(entry->buflist, count * sizeof(*entry->buflist),
+                   DRM_MEM_BUFS);
                return ENOMEM;
        }
 
@@ -638,7 +641,9 @@ drm_do_addbufs_pci(struct drm_device *dev, drm_buf_desc_t *request)
                        entry->buf_count = count;
                        entry->seg_count = count;
                        drm_cleanup_buf_error(dev, entry);
-                       free(temp_pagelist, M_DRM);
+                       drm_free(temp_pagelist, (dma->page_count +
+                          (count << page_order)) * sizeof(*dma->pagelist),
+                          DRM_MEM_BUFS);
                        return ENOMEM;
                }
 
@@ -666,14 +671,17 @@ drm_do_addbufs_pci(struct drm_device *dev, drm_buf_desc_t *request)
                        buf->file_priv    = NULL;
 
                        buf->dev_priv_size = dev->driver.buf_priv_size;
-                       buf->dev_private = malloc(buf->dev_priv_size, M_DRM,
-                           M_NOWAIT | M_ZERO);
+                       buf->dev_private = drm_calloc(1, buf->dev_priv_size,
+                           DRM_MEM_BUFS);
                        if (buf->dev_private == NULL) {
                                /* Set count correctly so we free the proper amount. */
                                entry->buf_count = count;
                                entry->seg_count = count;
                                drm_cleanup_buf_error(dev, entry);
-                               free(temp_pagelist, M_DRM);
+                               drm_free(temp_pagelist, (dma->page_count +
+                                   (count << page_order)) *
+                                   sizeof(*dma->pagelist),
+                                   DRM_MEM_BUFS);
                                return ENOMEM;
                        }
 
@@ -689,7 +697,9 @@ drm_do_addbufs_pci(struct drm_device *dev, drm_buf_desc_t *request)
        if (temp_buflist == NULL) {
                /* Free the entry because it isn't valid */
                drm_cleanup_buf_error(dev, entry);
-               free(temp_pagelist, M_DRM);
+               drm_free(temp_pagelist, (dma->page_count +
+                   (count << page_order)) * sizeof(*dma->pagelist),
+                   DRM_MEM_BUFS);
                return ENOMEM;
        }
        dma->buflist = temp_buflist;
@@ -701,7 +711,8 @@ drm_do_addbufs_pci(struct drm_device *dev, drm_buf_desc_t *request)
        /* No allocations failed, so now we can replace the orginal pagelist
         * with the new one.
         */
-       free(dma->pagelist, M_DRM);
+       drm_free(dma->pagelist, dma->page_count * sizeof(*dma->pagelist),
+           DRM_MEM_BUFS);
        dma->pagelist = temp_pagelist;
 
        dma->buf_count += entry->buf_count;
@@ -756,8 +767,8 @@ drm_do_addbufs_sg(struct drm_device *dev, drm_buf_desc_t *request)
 
        entry = &dma->bufs[order];
 
-       entry->buflist = malloc(count * sizeof(*entry->buflist), M_DRM,
-           M_NOWAIT | M_ZERO);
+       entry->buflist = drm_calloc(count, sizeof(*entry->buflist),
+           DRM_MEM_BUFS);
        if (entry->buflist == NULL)
                return ENOMEM;
 
@@ -781,8 +792,8 @@ drm_do_addbufs_sg(struct drm_device *dev, drm_buf_desc_t *request)
                buf->file_priv = NULL;
 
                buf->dev_priv_size = dev->driver.buf_priv_size;
-               buf->dev_private = malloc(buf->dev_priv_size, M_DRM,
-                   M_NOWAIT | M_ZERO);
+               buf->dev_private = drm_calloc(1, buf->dev_priv_size,
+                   DRM_MEM_BUFS);
                if (buf->dev_private == NULL) {
                        /* Set count correctly so we free the proper amount. */
                        entry->buf_count = count;
index 85ea241..fcf0d25 100644 (file)
@@ -90,8 +90,8 @@ drm_ctxbitmap_next(struct drm_device *dev)
                        dev->context_sareas[bit] = NULL;
                } else {
                        /* max_context == 1 at this point */
-                       dev->context_sareas = malloc(dev->max_context * 
-                           sizeof(*dev->context_sareas), M_DRM, M_NOWAIT);
+                       dev->context_sareas = drm_calloc(dev->max_context, 
+                           sizeof(*dev->context_sareas), DRM_MEM_CTXLIST);
                        if (dev->context_sareas == NULL) {
                                clear_bit(bit, dev->ctx_bitmap);
                                DRM_UNLOCK();
@@ -111,7 +111,7 @@ drm_ctxbitmap_init(struct drm_device *dev)
        int temp;
 
        DRM_LOCK();
-       dev->ctx_bitmap = malloc(PAGE_SIZE, M_DRM, M_NOWAIT | M_ZERO);
+       dev->ctx_bitmap = drm_calloc(1, PAGE_SIZE, DRM_MEM_CTXBITMAP);
        if ( dev->ctx_bitmap == NULL ) {
                DRM_UNLOCK();
                return ENOMEM;
@@ -132,9 +132,9 @@ void
 drm_ctxbitmap_cleanup(struct drm_device *dev)
 {
        DRM_LOCK();
-       if (dev->context_sareas != NULL)
-               free(dev->context_sareas, M_DRM);
-       free(dev->ctx_bitmap, M_DRM);
+       drm_free(dev->context_sareas,
+           sizeof(dev->context_sareas) * dev->max_context, DRM_MEM_CTXLIST);
+       drm_free(dev->ctx_bitmap, PAGE_SIZE, DRM_MEM_CTXBITMAP);
        DRM_UNLOCK();
 }
 
index 5bb0242..f5bfaa8 100644 (file)
@@ -42,7 +42,7 @@ int
 drm_dma_setup(struct drm_device *dev)
 {
 
-       dev->dma = malloc(sizeof(*dev->dma), M_DRM, M_NOWAIT | M_ZERO);
+       dev->dma = drm_calloc(1, sizeof(*dev->dma), DRM_MEM_DRIVER);
        if (dev->dma == NULL)
                return ENOMEM;
 
@@ -90,7 +90,7 @@ drm_dma_takedown(struct drm_device *dev)
        if (dma->pagelist)
                free(dma->pagelist, M_DRM);
        if (dev->dma)
-               free(dev->dma, M_DRM);
+               drm_free(dev->dma, sizeof(*dev->dma), DRM_MEM_DMA);
        dev->dma = NULL;
        DRM_SPINUNINIT(&dev->dma_lock);
 }
index 2a63b0e..2c963d6 100644 (file)
@@ -154,7 +154,7 @@ drm_update_draw(struct drm_device *dev, void *data, struct drm_file *file_priv)
                        return 0;
                }
                if (info->rects == NULL) {
-                       info->rects = drm_alloc(sizeof(*info->rects) *
+                       info->rects = drm_calloc(sizeof(*info->rects),
                            update->num, DRM_MEM_DRAWABLE);
                        if (info->rects == NULL) {
                                DRM_SPINUNLOCK(&dev->drw_lock);
@@ -175,15 +175,12 @@ drm_update_draw(struct drm_device *dev, void *data, struct drm_file *file_priv)
 void
 drm_drawable_free(struct drm_device *dev, struct bsd_drm_drawable_info *draw)
 {
-       if (draw) {
-               RB_REMOVE(drawable_tree, &dev->drw_head, draw);
-               if (draw->info.rects)
-                       drm_free(draw->info.rects,
-                           sizeof(*draw->info.rects) * draw->info.num_rects,
-                           DRM_MEM_DRAWABLE);
-               drm_free(draw, sizeof(*draw),
-                   DRM_MEM_DRAWABLE);
-       }
+       if (draw == NULL)
+               return;
+       RB_REMOVE(drawable_tree, &dev->drw_head, draw);
+       drm_free(draw->info.rects,
+           sizeof(*draw->info.rects) * draw->info.num_rects, DRM_MEM_DRAWABLE);
+       drm_free(draw, sizeof(*draw), DRM_MEM_DRAWABLE);
 }
 
 void
index 9f5a107..13f7c62 100644 (file)
@@ -286,7 +286,7 @@ drm_lastclose(struct drm_device *dev)
                drm_irq_uninstall(dev);
 
        if ( dev->unique ) {
-               free(dev->unique, M_DRM);
+               drm_free(dev->unique, dev->unique_len + 1,  DRM_MEM_DRIVER);
                dev->unique = NULL;
                dev->unique_len = 0;
        }
@@ -295,7 +295,7 @@ drm_lastclose(struct drm_device *dev)
                                /* Clear pid list */
        while ((pt = SPLAY_ROOT(&dev->magiclist)) != NULL) {
                SPLAY_REMOVE(drm_magic_tree, &dev->magiclist, pt);
-               free(pt, M_DRM);
+               drm_free(pt, sizeof(*pt), DRM_MEM_MAGIC);
        }
 
                                /* Clear AGP information */
@@ -310,7 +310,7 @@ drm_lastclose(struct drm_device *dev)
                                drm_agp_unbind_memory(entry->handle);
                        drm_agp_free_memory(entry->handle);
                        TAILQ_REMOVE(&dev->agp->memory, entry, link);
-                       free(entry, M_DRM);
+                       drm_free(entry, sizeof(*entry), DRM_MEM_AGPLISTS);
                }
 
                if (dev->agp->acquired)
@@ -447,7 +447,7 @@ drm_unload(struct drm_device *dev)
        DRM_UNLOCK();
 
        if ( dev->agp ) {
-               free(dev->agp, M_DRM);
+               drm_free(dev->agp, sizeof(*dev->agp), DRM_MEM_AGPLISTS);
                dev->agp = NULL;
        }
 
@@ -596,7 +596,7 @@ drmclose(DRM_CDEV kdev, int flags, int fmt, DRM_STRUCTPROC *p)
        if (dev->driver.postclose != NULL)
                dev->driver.postclose(dev, file_priv);
        TAILQ_REMOVE(&dev->files, file_priv, link);
-       free(file_priv, M_DRM);
+       drm_free(file_priv, sizeof(*file_priv), DRM_MEM_FILES);
 
        /* ========================================================
         * End inline drm_release
index 4684f7a..ebe0bd0 100644 (file)
@@ -69,7 +69,7 @@ drm_open_helper(DRM_CDEV kdev, int flags, int fmt, DRM_STRUCTPROC *p,
        if (priv) {
                priv->refs++;
        } else {
-               priv = malloc(sizeof(*priv), M_DRM, M_NOWAIT | M_ZERO);
+               priv = drm_calloc(1, sizeof(*priv), DRM_MEM_FILES);
                if (priv == NULL) {
                        DRM_UNLOCK();
                        return ENOMEM;
@@ -79,7 +79,6 @@ drm_open_helper(DRM_CDEV kdev, int flags, int fmt, DRM_STRUCTPROC *p,
 
                priv->refs = 1;
                priv->minor = m;
-               priv->ioctl_count = 0;
 
                /* for compatibility root is always authenticated */
                priv->authenticated = DRM_SUSER(p);
@@ -88,7 +87,7 @@ drm_open_helper(DRM_CDEV kdev, int flags, int fmt, DRM_STRUCTPROC *p,
                        /* shared code returns -errno */
                        retcode = -dev->driver.open(dev, priv);
                        if (retcode != 0) {
-                               free(priv, M_DRM);
+                               drm_free(priv, sizeof(*priv), DRM_MEM_FILES);
                                DRM_UNLOCK();
                                return retcode;
                        }
@@ -96,7 +95,7 @@ drm_open_helper(DRM_CDEV kdev, int flags, int fmt, DRM_STRUCTPROC *p,
 
                /* first opener automatically becomes master if root */
                if (TAILQ_EMPTY(&dev->files) && !DRM_SUSER(p)) {
-                       free(priv, M_DRM);
+                       drm_free(priv, sizeof(*priv), DRM_MEM_FILES);
                        DRM_UNLOCK();
                        return (EPERM);
                }
index 7f6b719..0b40485 100644 (file)
@@ -74,12 +74,12 @@ drm_setunique(struct drm_device *dev, void *data, struct drm_file *file_priv)
        if (!u->unique_len || u->unique_len > 1024)
                return EINVAL;
 
-       busid = malloc(u->unique_len + 1, M_DRM, M_WAITOK);
+       busid = drm_alloc(u->unique_len + 1, DRM_MEM_DRIVER);
        if (busid == NULL)
                return ENOMEM;
 
        if (DRM_COPY_FROM_USER(busid, u->unique, u->unique_len)) {
-               free(busid, M_DRM);
+               drm_free(busid, u->unique_len + 1, DRM_MEM_DRIVER);
                return EFAULT;
        }
        busid[u->unique_len] = '\0';
@@ -92,7 +92,7 @@ drm_setunique(struct drm_device *dev, void *data, struct drm_file *file_priv)
 #endif /* Net and Openbsd don't have sscanf in the kernel this is deprecated anyway. */
 
        if (ret != 3) {
-               free(busid, M_DRM);
+               drm_free(busid, u->unique_len + 1, DRM_MEM_DRIVER);
                return EINVAL;
        }
        domain = bus >> 8;
@@ -102,7 +102,7 @@ drm_setunique(struct drm_device *dev, void *data, struct drm_file *file_priv)
            (bus != dev->pci_bus) ||
            (slot != dev->pci_slot) ||
            (func != dev->pci_func)) {
-               free(busid, M_DRM);
+               drm_free(busid, u->unique_len + 1, DRM_MEM_DRIVER);
                return EINVAL;
        }
 
@@ -133,7 +133,7 @@ drm_set_busid(struct drm_device *dev)
        }
 
        dev->unique_len = 20;
-       dev->unique = malloc(dev->unique_len + 1, M_DRM, M_NOWAIT);
+       dev->unique = drm_alloc(dev->unique_len + 1, DRM_MEM_DRIVER);
        if (dev->unique == NULL) {
                DRM_UNLOCK();
                return ENOMEM;
index 9c216f5..e359aba 100644 (file)
@@ -421,11 +421,8 @@ drm_wait_vblank(struct drm_device *dev, void *data, struct drm_file *file_priv)
 
        if (flags & _DRM_VBLANK_SIGNAL) {
 #if 0 /* disabled */
-               if (dev->vblank_suspend[crtc])
-                       return (EBUSY);
-
-               drm_vbl_sig_t *vbl_sig = malloc(sizeof(drm_vbl_sig_t), M_DRM,
-                   M_NOWAIT | M_ZERO);
+               drm_vbl_sig_t *vbl_sig = drm_calloc(1, sizeof(drm_vbl_sig_t),
+                   DRM_MEM_DRIVER);
                if (vbl_sig == NULL)
                        return ENOMEM;
 
@@ -499,7 +496,7 @@ drm_vbl_send_signals(struct drm_device *dev, int crtc)
                                psignal(p, vbl_sig->signo);
 
                        TAILQ_REMOVE(&dev->vbl_sig_list, vbl_sig, link);
-                       DRM_FREE(vbl_sig,sizeof(*vbl_sig));
+                       drm_free(vbl_sig, sizeof(*vbl_sig), DRM_MEM_DRIVER);
                }
                vbl_sig = next;
        }
index 8d99963..b613d27 100644 (file)
@@ -81,7 +81,8 @@ drm_realloc(void *oldpt, size_t oldsize, size_t size, int area)
 void
 drm_free(void *pt, size_t size, int area)
 {
-       free(pt, M_DRM);
+       if (pt != NULL)
+               free(pt, M_DRM);
 }
 
 void *
index 61b53ed..7e205c3 100644 (file)
@@ -52,7 +52,7 @@ drm_pci_alloc(struct drm_device *dev, size_t size, size_t align,
                return NULL;
        }
 
-       dmah = malloc(sizeof(drm_dma_handle_t), M_DRM, M_ZERO | M_NOWAIT);
+       dmah = drm_alloc(sizeof(*dmah), DRM_MEM_DMA);
        if (dmah == NULL)
                return NULL;
 
@@ -95,7 +95,7 @@ free:
 destroy:
        bus_dmamap_destroy(dev->pa.pa_dmat, dmah->dmamap);
 dmahfree:
-       free(dmah, M_DRM);
+       drm_free(dmah, sizeof(*dmah), DRM_MEM_DMA);
 
        return (NULL);
 
@@ -115,7 +115,7 @@ drm_pci_free(struct drm_device *dev, drm_dma_handle_t *dmah)
        bus_dmamem_free(dev->pa.pa_dmat, &dmah->seg, 1);
        bus_dmamap_destroy(dev->pa.pa_dmat, dmah->dmamap);
 
-       free(dmah, M_DRM);
+       drm_free(dmah, sizeof(*dmah), DRM_MEM_DMA);
 }
 
 /*@}*/
index e18aa7a..6cccbee 100644 (file)
@@ -41,12 +41,12 @@ void        drm_sg_dmamem_free(struct drm_sg_dmamem *);
 void
 drm_sg_cleanup(drm_sg_mem_t *entry)
 {
-       if (entry) {
-               if (entry->mem)
+       if (entry != NULL) {
+               if (entry->mem != NULL)
                        drm_sg_dmamem_free(entry->mem);
-               if (entry->busaddr)
-                       free(entry->busaddr, M_DRM);
-               free(entry, M_DRM);
+               drm_free(entry->busaddr,
+                   sizeof(*entry->busaddr) * entry->pages, DRM_MEM_SGLISTS);
+               drm_free(entry, sizeof(entry), DRM_MEM_SGLISTS);
        }
 }
 
@@ -60,17 +60,17 @@ drm_sg_alloc(struct drm_device * dev, drm_scatter_gather_t * request)
        if ( dev->sg )
                return EINVAL;
 
-       entry = malloc(sizeof(*entry), M_DRM, M_WAITOK | M_ZERO);
-       if ( !entry )
-               return ENOMEM;
+       entry = drm_calloc(1, sizeof(*entry), DRM_MEM_SGLISTS);
+        if ( !entry )
+                return ENOMEM;
 
        pages = round_page(request->size) / PAGE_SIZE;
        DRM_DEBUG( "sg size=%ld pages=%ld\n", request->size, pages );
 
        entry->pages = pages;
 
-       entry->busaddr = malloc(pages * sizeof(*entry->busaddr), M_DRM,
-           M_WAITOK | M_ZERO);
+       entry->busaddr = drm_calloc(pages, sizeof(*entry->busaddr),
+           DRM_MEM_SGLISTS);
        if ( !entry->busaddr ) {
                drm_sg_cleanup(entry);
                return ENOMEM;
@@ -148,12 +148,12 @@ drm_sg_dmamem_alloc(struct drm_device *dev, size_t pages)
        bus_size_t               size = pages << PAGE_SHIFT;
        int                      ret = 0;
 
-       dsd = malloc(sizeof(*dsd), M_DRM, M_NOWAIT | M_ZERO);
+       dsd = drm_calloc(1, sizeof(*dsd), DRM_MEM_SGLISTS);
        if (dsd == NULL)
                return (NULL);
 
-       dsd->sg_segs = malloc(sizeof(*dsd->sg_segs) * pages, M_DRM,
-           M_NOWAIT | M_ZERO);
+       dsd->sg_segs = drm_calloc(sizeof(*dsd->sg_segs), pages,
+           DRM_MEM_SGLISTS);
        if (dsd->sg_segs == NULL)
                goto dsdfree;
 
@@ -189,10 +189,10 @@ free:
 destroy:
        bus_dmamap_destroy(dev->pa.pa_dmat, dsd->sg_map);
 segsfree:
-       free(dsd->sg_segs, M_DRM);
+       drm_free(dsd->sg_segs, sizeof(*dsd->sg_segs) * pages, DRM_MEM_SGLISTS);
 
 dsdfree:
-       free(dsd, M_DRM);
+       drm_free(dsd, sizeof(*dsd), DRM_MEM_SGLISTS);
 
        return (NULL);
 }
@@ -204,6 +204,7 @@ drm_sg_dmamem_free(struct drm_sg_dmamem *mem)
        bus_dmamem_unmap(mem->sg_tag, mem->sg_kva, mem->sg_size);
        bus_dmamem_free(mem->sg_tag, mem->sg_segs, mem->sg_nsegs);
        bus_dmamap_destroy(mem->sg_tag, mem->sg_map);
-       free(mem->sg_segs, M_DRM);
-       free(mem, M_DRM);
+       drm_free(mem->sg_segs, sizeof(*mem->sg_segs) *
+           (mem->sg_size >> PAGE_SHIFT), DRM_MEM_SGLISTS);
+       drm_free(mem, sizeof(*mem), DRM_MEM_SGLISTS);
 }
index 6690aac..fe2d54c 100644 (file)
@@ -1025,12 +1025,10 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
        dev->types[8] = _DRM_STAT_SECONDARY;
        dev->types[9] = _DRM_STAT_DMA;
 
-       dev_priv = drm_alloc(sizeof(drm_i915_private_t), DRM_MEM_DRIVER);
+       dev_priv = drm_calloc(1, sizeof(drm_i915_private_t), DRM_MEM_DRIVER);
        if (dev_priv == NULL)
                return -ENOMEM;
 
-       memset(dev_priv, 0, sizeof(drm_i915_private_t));
-
        dev->dev_private = (void *)dev_priv;
 
        /* Add register map (needed for suspend/resume) */
index 339234f..1fd9e71 100644 (file)
@@ -1006,12 +1006,10 @@ static int mach64_do_dma_init(struct drm_device * dev, drm_mach64_init_t * init)
 
        DRM_DEBUG("\n");
 
-       dev_priv = drm_alloc(sizeof(drm_mach64_private_t), DRM_MEM_DRIVER);
+       dev_priv = drm_calloc(1, sizeof(drm_mach64_private_t), DRM_MEM_DRIVER);
        if (dev_priv == NULL)
                return -ENOMEM;
 
-       memset(dev_priv, 0, sizeof(drm_mach64_private_t));
-
        dev_priv->is_pci = init->is_pci;
 
        dev_priv->fb_bpp = init->fb_bpp;
@@ -1477,10 +1475,9 @@ int mach64_init_freelist(struct drm_device * dev)
        for (i = 0; i < dma->buf_count; i++) {
                if ((entry =
                     (drm_mach64_freelist_t *)
-                    drm_alloc(sizeof(drm_mach64_freelist_t),
+                    drm_calloc(1, sizeof(drm_mach64_freelist_t),
                               DRM_MEM_BUFLISTS)) == NULL)
                        return -ENOMEM;
-               memset(entry, 0, sizeof(drm_mach64_freelist_t));
                entry->buf = dma->buflist[i];
                ptr = &entry->list;
                list_add_tail(ptr, &dev_priv->free_list);
index d56f4d7..dad747c 100644 (file)
@@ -254,23 +254,21 @@ static int mga_freelist_init(struct drm_device * dev, drm_mga_private_t * dev_pr
        int i;
        DRM_DEBUG("count=%d\n", dma->buf_count);
 
-       dev_priv->head = drm_alloc(sizeof(drm_mga_freelist_t), DRM_MEM_DRIVER);
+       dev_priv->head = drm_calloc(1, sizeof(drm_mga_freelist_t), DRM_MEM_DRIVER);
        if (dev_priv->head == NULL)
                return -ENOMEM;
 
-       memset(dev_priv->head, 0, sizeof(drm_mga_freelist_t));
        SET_AGE(&dev_priv->head->age, MGA_BUFFER_USED, 0);
 
        for (i = 0; i < dma->buf_count; i++) {
                buf = dma->buflist[i];
                buf_priv = buf->dev_private;
 
-               entry = drm_alloc(sizeof(drm_mga_freelist_t), DRM_MEM_DRIVER);
+               entry = drm_calloc(1, sizeof(drm_mga_freelist_t),
+                   DRM_MEM_DRIVER);
                if (entry == NULL)
                        return -ENOMEM;
 
-               memset(entry, 0, sizeof(drm_mga_freelist_t));
-
                entry->next = dev_priv->head->next;
                entry->prev = dev_priv->head;
                SET_AGE(&entry->age, MGA_BUFFER_FREE, 0);
@@ -397,12 +395,11 @@ int mga_driver_load(struct drm_device *dev, unsigned long flags)
 {
        drm_mga_private_t *dev_priv;
 
-       dev_priv = drm_alloc(sizeof(drm_mga_private_t), DRM_MEM_DRIVER);
+       dev_priv = drm_calloc(1, sizeof(drm_mga_private_t), DRM_MEM_DRIVER);
        if (!dev_priv)
                return -ENOMEM;
 
        dev->dev_private = (void *)dev_priv;
-       memset(dev_priv, 0, sizeof(drm_mga_private_t));
 
        dev_priv->usec_timeout = MGA_DEFAULT_USEC_TIMEOUT;
        dev_priv->chipset = flags;
index 995c6f2..cfe02b7 100644 (file)
@@ -353,12 +353,10 @@ static int r128_do_init_cce(struct drm_device * dev, drm_r128_init_t * init)
 
        DRM_DEBUG("\n");
 
-       dev_priv = drm_alloc(sizeof(drm_r128_private_t), DRM_MEM_DRIVER);
+       dev_priv = drm_calloc(1, sizeof(drm_r128_private_t), DRM_MEM_DRIVER);
        if (dev_priv == NULL)
                return -ENOMEM;
 
-       memset(dev_priv, 0, sizeof(drm_r128_private_t));
-
        dev_priv->is_pci = init->is_pci;
 
        if (dev_priv->is_pci && !dev->sg) {
@@ -765,11 +763,11 @@ static int r128_freelist_init(struct drm_device * dev)
        drm_r128_freelist_t *entry;
        int i;
 
-       dev_priv->head = drm_alloc(sizeof(drm_r128_freelist_t), DRM_MEM_DRIVER);
+       dev_priv->head = drm_calloc(1, sizeof(drm_r128_freelist_t),
+           DRM_MEM_DRIVER);
        if (dev_priv->head == NULL)
                return -ENOMEM;
 
-       memset(dev_priv->head, 0, sizeof(drm_r128_freelist_t));
        dev_priv->head->age = R128_BUFFER_USED;
 
        for (i = 0; i < dma->buf_count; i++) {
index 0d47eb0..272ab8a 100644 (file)
@@ -1698,11 +1698,10 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags)
        drm_radeon_private_t *dev_priv;
        int ret = 0;
 
-       dev_priv = drm_alloc(sizeof(drm_radeon_private_t), DRM_MEM_DRIVER);
+       dev_priv = drm_calloc(1, sizeof(drm_radeon_private_t), DRM_MEM_DRIVER);
        if (dev_priv == NULL)
                return -ENOMEM;
 
-       memset(dev_priv, 0, sizeof(drm_radeon_private_t));
        dev->dev_private = (void *)dev_priv;
        dev_priv->flags = flags;
 
index 1e582ee..fe4e726 100644 (file)
@@ -139,7 +139,7 @@ static int init_heap(struct mem_block **heap, int start, int size)
        if (!blocks)
                return -ENOMEM;
 
-       *heap = drm_alloc(sizeof(**heap), DRM_MEM_BUFS);
+       *heap = drm_calloc(1, sizeof(**heap), DRM_MEM_BUFS);
        if (!*heap) {
                drm_free(blocks, sizeof(*blocks), DRM_MEM_BUFS);
                return -ENOMEM;
@@ -150,7 +150,6 @@ static int init_heap(struct mem_block **heap, int start, int size)
        blocks->file_priv = NULL;
        blocks->next = blocks->prev = *heap;
 
-       memset(*heap, 0, sizeof(**heap));
        (*heap)->file_priv = (struct drm_file *) - 1;
        (*heap)->next = (*heap)->prev = blocks;
        return 0;
index 4b8a89f..c4fe281 100644 (file)
@@ -298,8 +298,8 @@ static int savage_dma_init(drm_savage_private_t *dev_priv)
 
        dev_priv->nr_dma_pages = dev_priv->cmd_dma->size /
                (SAVAGE_DMA_PAGE_SIZE*4);
-       dev_priv->dma_pages = drm_alloc(sizeof(drm_savage_dma_page_t) *
-                                       dev_priv->nr_dma_pages, DRM_MEM_DRIVER);
+       dev_priv->dma_pages = drm_calloc(sizeof(drm_savage_dma_page_t),
+           dev_priv->nr_dma_pages, DRM_MEM_DRIVER);
        if (dev_priv->dma_pages == NULL)
                return -ENOMEM;
 
@@ -539,11 +539,10 @@ int savage_driver_load(struct drm_device *dev, unsigned long chipset)
 {
        drm_savage_private_t *dev_priv;
 
-       dev_priv = drm_alloc(sizeof(drm_savage_private_t), DRM_MEM_DRIVER);
+       dev_priv = drm_calloc(1, sizeof(drm_savage_private_t), DRM_MEM_DRIVER);
        if (dev_priv == NULL)
                return -ENOMEM;
 
-       memset(dev_priv, 0, sizeof(drm_savage_private_t));
        dev->dev_private = (void *)dev_priv;
 
        dev_priv->chipset = (enum savage_family)chipset;
@@ -804,7 +803,7 @@ static int savage_do_init_bci(struct drm_device *dev, drm_savage_init_t *init)
                dev_priv->fake_dma.size = SAVAGE_FAKE_DMA_SIZE;
                dev_priv->fake_dma.type = _DRM_SHM;
                dev_priv->fake_dma.handle = drm_alloc(SAVAGE_FAKE_DMA_SIZE,
-                                                     DRM_MEM_DRIVER);
+                   DRM_MEM_DRIVER);
                if (!dev_priv->fake_dma.handle) {
                        DRM_ERROR("could not allocate faked DMA buffer!\n");
                        savage_do_cleanup_bci(dev);
index 1c5a0e2..a0e4105 100644 (file)
@@ -987,7 +987,7 @@ int savage_bci_cmdbuf(struct drm_device *dev, void *data, struct drm_file *file_
         * for locking on FreeBSD.
         */
        if (cmdbuf->size) {
-               kcmd_addr = drm_alloc(cmdbuf->size * 8, DRM_MEM_DRIVER);
+               kcmd_addr = drm_calloc(cmdbuf->size, 8, DRM_MEM_DRIVER);
                if (kcmd_addr == NULL)
                        return -ENOMEM;
 
@@ -1014,9 +1014,8 @@ int savage_bci_cmdbuf(struct drm_device *dev, void *data, struct drm_file *file_
                cmdbuf->vb_addr = kvb_addr;
        }
        if (cmdbuf->nbox) {
-               kbox_addr = drm_alloc(cmdbuf->nbox *
-                                     sizeof(struct drm_clip_rect),
-                                     DRM_MEM_DRIVER);
+               kbox_addr = drm_calloc(cmdbuf->nbox, 
+                   sizeof(struct drm_clip_rect), DRM_MEM_DRIVER);
                if (kbox_addr == NULL) {
                        ret = -ENOMEM;
                        goto done;