diff options
author | Daniel Drake <ddrake@brontes3d.com> | 2006-10-20 15:56:01 +0200 |
---|---|---|
committer | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2006-12-07 21:31:25 +0100 |
commit | 75dcf5dc5a0dc4e895944368780cc2fc40008a55 (patch) | |
tree | e4fdb1e7515107bbff0543a7edbbdcfff7d87dbc /drivers | |
parent | video1394: small optimizations to frame retrieval codepath (diff) | |
download | linux-75dcf5dc5a0dc4e895944368780cc2fc40008a55.tar.xz linux-75dcf5dc5a0dc4e895944368780cc2fc40008a55.zip |
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 <ddrake@brontes3d.com>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/ieee1394/video1394.c | 30 |
1 files changed, 6 insertions, 24 deletions
diff --git a/drivers/ieee1394/video1394.c b/drivers/ieee1394/video1394.c index 776b6618e80e..77f58bc83135 100644 --- a/drivers/ieee1394/video1394.c +++ b/drivers/ieee1394/video1394.c @@ -714,8 +714,8 @@ static inline unsigned video1394_buffer_state(struct dma_iso_ctx *d, 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 *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 *file, unsigned int cmd, unsigned long a 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(struct file *file, poll_table *pt) 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(struct file *file, poll_table *pt) } } spin_unlock_irqrestore(&d->lock, flags); -done: - unlock_kernel(); return mask; } @@ -1257,7 +1241,6 @@ static int video1394_release(struct inode *inode, struct file *file) 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 inode *inode, struct file *file) kfree(ctx); file->private_data = NULL; - unlock_kernel(); return 0; } |