From ad8eb0ed01d96cc16cdafd3b48c0f0cd73d315b4 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Tue, 27 May 2008 14:12:51 -0700 Subject: [FreeBSD] Convert from drm_device_t to struct drm_device for consistency. --- bsd-core/drm_bufs.c | 45 ++++++++++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 19 deletions(-) (limited to 'bsd-core/drm_bufs.c') diff --git a/bsd-core/drm_bufs.c b/bsd-core/drm_bufs.c index 9b58c593..7cefb773 100644 --- a/bsd-core/drm_bufs.c +++ b/bsd-core/drm_bufs.c @@ -56,7 +56,7 @@ int drm_order(unsigned long size) * drm_get_resource_*. Note that they are not RF_ACTIVE, so there's no virtual * address for accessing them. Cleaned up at unload. */ -static int drm_alloc_resource(drm_device_t *dev, int resource) +static int drm_alloc_resource(struct drm_device *dev, int resource) { if (resource >= DRM_MAX_PCI_RESOURCE) { DRM_ERROR("Resource %d too large\n", resource); @@ -82,7 +82,8 @@ static int drm_alloc_resource(drm_device_t *dev, int resource) return 0; } -unsigned long drm_get_resource_start(drm_device_t *dev, unsigned int resource) +unsigned long drm_get_resource_start(struct drm_device *dev, + unsigned int resource) { if (drm_alloc_resource(dev, resource) != 0) return 0; @@ -90,7 +91,8 @@ unsigned long drm_get_resource_start(drm_device_t *dev, unsigned int resource) return rman_get_start(dev->pcir[resource]); } -unsigned long drm_get_resource_len(drm_device_t *dev, unsigned int resource) +unsigned long drm_get_resource_len(struct drm_device *dev, + unsigned int resource) { if (drm_alloc_resource(dev, resource) != 0) return 0; @@ -98,7 +100,8 @@ unsigned long drm_get_resource_len(drm_device_t *dev, unsigned int resource) return rman_get_size(dev->pcir[resource]); } -int drm_addmap(drm_device_t * dev, unsigned long offset, unsigned long size, +int drm_addmap(struct drm_device * dev, unsigned long offset, + unsigned long size, drm_map_type_t type, drm_map_flags_t flags, drm_local_map_t **map_ptr) { drm_local_map_t *map; @@ -261,7 +264,8 @@ done: return 0; } -int drm_addmap_ioctl(drm_device_t *dev, void *data, struct drm_file *file_priv) +int drm_addmap_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv) { drm_map_t *request = data; drm_local_map_t *map; @@ -294,7 +298,7 @@ int drm_addmap_ioctl(drm_device_t *dev, void *data, struct drm_file *file_priv) return 0; } -void drm_rmmap(drm_device_t *dev, drm_local_map_t *map) +void drm_rmmap(struct drm_device *dev, drm_local_map_t *map) { DRM_SPINLOCK_ASSERT(&dev->dev_lock); @@ -340,7 +344,8 @@ void drm_rmmap(drm_device_t *dev, drm_local_map_t *map) * isn't in use. */ -int drm_rmmap_ioctl(drm_device_t *dev, void *data, struct drm_file *file_priv) +int drm_rmmap_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv) { drm_local_map_t *map; drm_map_t *request = data; @@ -366,7 +371,8 @@ int drm_rmmap_ioctl(drm_device_t *dev, void *data, struct drm_file *file_priv) } -static void drm_cleanup_buf_error(drm_device_t *dev, drm_buf_entry_t *entry) +static void drm_cleanup_buf_error(struct drm_device *dev, + drm_buf_entry_t *entry) { int i; @@ -389,7 +395,7 @@ static void drm_cleanup_buf_error(drm_device_t *dev, drm_buf_entry_t *entry) } } -static int drm_do_addbufs_agp(drm_device_t *dev, drm_buf_desc_t *request) +static int drm_do_addbufs_agp(struct drm_device *dev, drm_buf_desc_t *request) { drm_device_dma_t *dma = dev->dma; drm_buf_entry_t *entry; @@ -520,7 +526,7 @@ static int drm_do_addbufs_agp(drm_device_t *dev, drm_buf_desc_t *request) return 0; } -static int drm_do_addbufs_pci(drm_device_t *dev, drm_buf_desc_t *request) +static int drm_do_addbufs_pci(struct drm_device *dev, drm_buf_desc_t *request) { drm_device_dma_t *dma = dev->dma; int count; @@ -667,7 +673,7 @@ static int drm_do_addbufs_pci(drm_device_t *dev, drm_buf_desc_t *request) } -static int drm_do_addbufs_sg(drm_device_t *dev, drm_buf_desc_t *request) +static int drm_do_addbufs_sg(struct drm_device *dev, drm_buf_desc_t *request) { drm_device_dma_t *dma = dev->dma; drm_buf_entry_t *entry; @@ -778,7 +784,7 @@ static int drm_do_addbufs_sg(drm_device_t *dev, drm_buf_desc_t *request) return 0; } -int drm_addbufs_agp(drm_device_t *dev, drm_buf_desc_t *request) +int drm_addbufs_agp(struct drm_device *dev, drm_buf_desc_t *request) { int order, ret; @@ -809,7 +815,7 @@ int drm_addbufs_agp(drm_device_t *dev, drm_buf_desc_t *request) return ret; } -int drm_addbufs_sg(drm_device_t *dev, drm_buf_desc_t *request) +int drm_addbufs_sg(struct drm_device *dev, drm_buf_desc_t *request) { int order, ret; @@ -843,7 +849,7 @@ int drm_addbufs_sg(drm_device_t *dev, drm_buf_desc_t *request) return ret; } -int drm_addbufs_pci(drm_device_t *dev, drm_buf_desc_t *request) +int drm_addbufs_pci(struct drm_device *dev, drm_buf_desc_t *request) { int order, ret; @@ -877,7 +883,8 @@ int drm_addbufs_pci(drm_device_t *dev, drm_buf_desc_t *request) return ret; } -int drm_addbufs_ioctl(drm_device_t *dev, void *data, struct drm_file *file_priv) +int drm_addbufs_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv) { drm_buf_desc_t *request = data; int err; @@ -892,7 +899,7 @@ int drm_addbufs_ioctl(drm_device_t *dev, void *data, struct drm_file *file_priv) return err; } -int drm_infobufs(drm_device_t *dev, void *data, struct drm_file *file_priv) +int drm_infobufs(struct drm_device *dev, void *data, struct drm_file *file_priv) { drm_device_dma_t *dma = dev->dma; drm_buf_info_t *request = data; @@ -941,7 +948,7 @@ int drm_infobufs(drm_device_t *dev, void *data, struct drm_file *file_priv) return retcode; } -int drm_markbufs(drm_device_t *dev, void *data, struct drm_file *file_priv) +int drm_markbufs(struct drm_device *dev, void *data, struct drm_file *file_priv) { drm_device_dma_t *dma = dev->dma; drm_buf_desc_t *request = data; @@ -970,7 +977,7 @@ int drm_markbufs(drm_device_t *dev, void *data, struct drm_file *file_priv) return 0; } -int drm_freebufs(drm_device_t *dev, void *data, struct drm_file *file_priv) +int drm_freebufs(struct drm_device *dev, void *data, struct drm_file *file_priv) { drm_device_dma_t *dma = dev->dma; drm_buf_free_t *request = data; @@ -1007,7 +1014,7 @@ int drm_freebufs(drm_device_t *dev, void *data, struct drm_file *file_priv) return retcode; } -int drm_mapbufs(drm_device_t *dev, void *data, struct drm_file *file_priv) +int drm_mapbufs(struct drm_device *dev, void *data, struct drm_file *file_priv) { drm_device_dma_t *dma = dev->dma; int retcode = 0; -- cgit v1.2.3 From 9a2ae28fbe0e1e5cce0a5d89fbcc84fbdba1206e Mon Sep 17 00:00:00 2001 From: Owain Ainsworth Date: Tue, 27 May 2008 15:07:04 -0700 Subject: [BSD] Fix lock leaks in error paths in drm_bufs.c. --- bsd-core/drm_bufs.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) (limited to 'bsd-core/drm_bufs.c') diff --git a/bsd-core/drm_bufs.c b/bsd-core/drm_bufs.c index 7cefb773..3508331a 100644 --- a/bsd-core/drm_bufs.c +++ b/bsd-core/drm_bufs.c @@ -152,8 +152,10 @@ int drm_addmap(struct drm_device * dev, unsigned long offset, * initialization necessary. */ map = malloc(sizeof(*map), M_DRM, M_ZERO | M_NOWAIT); - if ( !map ) + if ( !map ) { + DRM_LOCK(); return ENOMEM; + } map->offset = offset; map->size = size; @@ -176,6 +178,7 @@ int drm_addmap(struct drm_device * dev, unsigned long offset, map->size, drm_order(map->size), map->handle ); if ( !map->handle ) { free(map, M_DRM); + DRM_LOCK(); return ENOMEM; } map->offset = (unsigned long)map->handle; @@ -216,12 +219,14 @@ int drm_addmap(struct drm_device * dev, unsigned long offset, } if (!valid) { free(map, M_DRM); + DRM_LOCK(); return EACCES; }*/ break; case _DRM_SCATTER_GATHER: if (!dev->sg) { free(map, M_DRM); + DRM_LOCK(); return EINVAL; } map->offset = map->offset + dev->sg->handle; @@ -239,6 +244,7 @@ int drm_addmap(struct drm_device * dev, unsigned long offset, map->dmah = drm_pci_alloc(dev, map->size, align, 0xfffffffful); if (map->dmah == NULL) { free(map, M_DRM); + DRM_LOCK(); return ENOMEM; } map->handle = map->dmah->vaddr; @@ -247,6 +253,7 @@ int drm_addmap(struct drm_device * dev, unsigned long offset, default: DRM_ERROR("Bad map type %d\n", map->type); free(map, M_DRM); + DRM_LOCK(); return EINVAL; } @@ -788,8 +795,6 @@ int drm_addbufs_agp(struct drm_device *dev, drm_buf_desc_t *request) { int order, ret; - DRM_SPINLOCK(&dev->dma_lock); - if (request->count < 0 || request->count > 4096) return EINVAL; @@ -797,6 +802,8 @@ int drm_addbufs_agp(struct drm_device *dev, drm_buf_desc_t *request) if (order < DRM_MIN_ORDER || order > DRM_MAX_ORDER) return EINVAL; + DRM_SPINLOCK(&dev->dma_lock); + /* No more allocations after first buffer-using ioctl. */ if (dev->buf_use != 0) { DRM_SPINUNLOCK(&dev->dma_lock); @@ -819,14 +826,14 @@ int drm_addbufs_sg(struct drm_device *dev, drm_buf_desc_t *request) { int order, ret; - DRM_SPINLOCK(&dev->dma_lock); - if (!DRM_SUSER(DRM_CURPROC)) return EACCES; if (request->count < 0 || request->count > 4096) return EINVAL; - + + DRM_SPINLOCK(&dev->dma_lock); + order = drm_order(request->size); if (order < DRM_MIN_ORDER || order > DRM_MAX_ORDER) return EINVAL; @@ -853,18 +860,18 @@ int drm_addbufs_pci(struct drm_device *dev, drm_buf_desc_t *request) { int order, ret; - DRM_SPINLOCK(&dev->dma_lock); - if (!DRM_SUSER(DRM_CURPROC)) return EACCES; if (request->count < 0 || request->count > 4096) return EINVAL; - + order = drm_order(request->size); if (order < DRM_MIN_ORDER || order > DRM_MAX_ORDER) return EINVAL; + DRM_SPINLOCK(&dev->dma_lock); + /* No more allocations after first buffer-using ioctl. */ if (dev->buf_use != 0) { DRM_SPINUNLOCK(&dev->dma_lock); @@ -967,6 +974,7 @@ int drm_markbufs(struct drm_device *dev, void *data, struct drm_file *file_priv) DRM_SPINLOCK(&dev->dma_lock); if (request->low_mark > dma->bufs[order].buf_count || request->high_mark > dma->bufs[order].buf_count) { + DRM_SPINUNLOCK(&dev->dma_lock); return EINVAL; } -- cgit v1.2.3