Date: Fri, 20 Oct 2006 14:56:01 +0100 (BST) From: Daniel Drake Subject: video1394: remove BKL contention video1394 does not need to take the BKL. The data structures shared between file_operations and interrupts are already protected through context-specific spinlocks. The only other danger is video1394_release() being called during another operation, however this cannot happen because release is only ever invoked when the last thread has closed the fd. Signed-off-by: Daniel Drake Signed-off-by: Stefan Richter --- Index: linux/drivers/ieee1394/video1394.c =================================================================== --- linux.orig/drivers/ieee1394/video1394.c +++ linux/drivers/ieee1394/video1394.c @@ -714,8 +714,8 @@ static inline unsigned video1394_buffer_ return ret; } -static int __video1394_ioctl(struct file *file, - unsigned int cmd, unsigned long arg) +static long video1394_ioctl(struct file *file, + unsigned int cmd, unsigned long arg) { struct file_ctx *ctx = (struct file_ctx *)file->private_data; struct ti_ohci *ohci = ctx->ohci; @@ -1158,15 +1158,6 @@ static int __video1394_ioctl(struct file } } -static long video1394_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -{ - int err; - lock_kernel(); - err = __video1394_ioctl(file, cmd, arg); - unlock_kernel(); - return err; -} - /* * This maps the vmalloced and reserved buffer to user space. * @@ -1179,17 +1170,14 @@ static long video1394_ioctl(struct file static int video1394_mmap(struct file *file, struct vm_area_struct *vma) { struct file_ctx *ctx = (struct file_ctx *)file->private_data; - int res = -EINVAL; - lock_kernel(); if (ctx->current_ctx == NULL) { PRINT(KERN_ERR, ctx->ohci->host->id, "Current iso context not set"); - } else - res = dma_region_mmap(&ctx->current_ctx->dma, file, vma); - unlock_kernel(); + return -EINVAL; + } - return res; + return dma_region_mmap(&ctx->current_ctx->dma, file, vma); } static unsigned int video1394_poll(struct file *file, poll_table *pt) @@ -1200,14 +1188,12 @@ static unsigned int video1394_poll(struc struct dma_iso_ctx *d; int i; - lock_kernel(); ctx = file->private_data; d = ctx->current_ctx; if (d == NULL) { PRINT(KERN_ERR, ctx->ohci->host->id, "Current iso context not set"); - mask = POLLERR; - goto done; + return POLLERR; } poll_wait(file, &d->waitq, pt); @@ -1220,8 +1206,6 @@ static unsigned int video1394_poll(struc } } spin_unlock_irqrestore(&d->lock, flags); -done: - unlock_kernel(); return mask; } @@ -1257,7 +1241,6 @@ static int video1394_release(struct inod struct list_head *lh, *next; u64 mask; - lock_kernel(); list_for_each_safe(lh, next, &ctx->context_list) { struct dma_iso_ctx *d; d = list_entry(lh, struct dma_iso_ctx, link); @@ -1278,7 +1261,6 @@ static int video1394_release(struct inod kfree(ctx); file->private_data = NULL; - unlock_kernel(); return 0; }