Re: [PATCH 7/8] soundcore_open: Reduce the area BKL coverage

Takashi Iwai
2010-07-05T16:09:19Z

At Sun, 4 Jul 2010 00:02:31 +0200,
Arnd Bergmann wrote:
>
> From: John Kacur <jkacur@redhat.com>
>
> Most of this function is protected by the sound_loader_lock.
> We can push down the BKL to this call out err = file->f_op->open(inode,file);
>
> In order to build the sound core without the BKL, we
> will need to push the lock_kernel() call into the ~20
> device drivers that register their file operations.
>
> Signed-off-by: John Kacur <jkacur@redhat.com>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> Acked-by: Alan Cox <alan@linux.intel.com>
> Cc: Takashi Iwai <tiwai@suse.de>

I applied this one to sound git tree now. Thanks!

Takashi

> ---
> sound/sound_core.c | 13 ++++++++-----
> 1 files changed, 8 insertions(+), 5 deletions(-)
>
> diff --git a/sound/sound_core.c b/sound/sound_core.c
> index 7c2d677..c8627fc 100644
> --- a/sound/sound_core.c
> +++ b/sound/sound_core.c
> @@ -576,8 +576,6 @@ static int soundcore_open(struct inode *inode, struct file *file)
> struct sound_unit *s;
> const struct file_operations *new_fops = NULL;
>
> - lock_kernel ();
> -
> chain=unit&0x0F;
> if(chain==4 || chain==5) /* dsp/audio/dsp16 */
> {
> @@ -630,18 +628,23 @@ static int soundcore_open(struct inode *inode, struct file *file)
> const struct file_operations *old_fops = file->f_op;
> file->f_op = new_fops;
> spin_unlock(&sound_loader_lock);
> - if(file->f_op->open)
> +
> + if (file->f_op->open) {
> + /* TODO: push down BKL into indivial open functions */
> + lock_kernel();
> err = file->f_op->open(inode,file);
> + unlock_kernel();
> + }
> +
> if (err) {
> fops_put(file->f_op);
> file->f_op = fops_get(old_fops);
> }
> +
> fops_put(old_fops);
> - unlock_kernel();
> return err;
> }
> spin_unlock(&sound_loader_lock);
> - unlock_kernel();
> return -ENODEV;
> }
>
> --
> 1.7.1
>