Re: [RFC] BKL in open functions in drivers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wednesday 01 April 2009 23:00:56 Alexey Klimov wrote:
> Hello,
>
> Few days ago Alessio Igor Bogani<abogani@xxxxxxxxxx> sent me patch
> that removes BKLs like lock/unlock_kernel() in open call and place mutex
> there in media/radio/radio-mr800.c.
> This patch broke the driver, so we figured out new approah. We added one
> more mutex lock that was used in open call. The patch is below:
>
> diff -r ffa5df73ebeb linux/drivers/media/radio/radio-mr800.c
> --- a/linux/drivers/media/radio/radio-mr800.c Fri Mar 13 00:43:34 2009
> +0000
> +++ b/linux/drivers/media/radio/radio-mr800.c	Thu Apr 02 00:40:56 2009
> +0400
> @@ -163,6 +163,7 @@
>
>  	unsigned char *buffer;
>  	struct mutex lock;	/* buffer locking */
> +	struct mutex open;
>  	int curfreq;
>  	int stereo;
>  	int users;
> @@ -570,7 +571,7 @@
>  	struct amradio_device *radio = video_get_drvdata(video_devdata(file));
>  	int retval;
>
> -	lock_kernel();
> +	mutex_lock(&radio->open);
>
>  	radio->users = 1;
>  	radio->muted = 1;
> @@ -580,7 +581,7 @@
>  		amradio_dev_warn(&radio->videodev->dev,
>  			"radio did not start up properly\n");
>  		radio->users = 0;
> -		unlock_kernel();
> +		mutex_unlock(&radio->open);
>  		return -EIO;
>  	}
>
> @@ -594,7 +595,7 @@
>  		amradio_dev_warn(&radio->videodev->dev,
>  			"set frequency failed\n");
>
> -	unlock_kernel();
> +	mutex_unlock(&radio->open);
>  	return 0;
>  }
>
> @@ -735,6 +736,7 @@
>  	radio->stereo = -1;
>
>  	mutex_init(&radio->lock);
> +	mutex_init(&radio->open);
>
>  	video_set_drvdata(radio->videodev, radio);
>  	retval = video_register_device(radio->videodev, VFL_TYPE_RADIO,
> radio_nr);
>
> I tested such approach using stress tool that tries to open /dev/radio0
> few hundred times. Looks fine.
>
> So, questions are:
>
> 1) What for is lock/unlock_kernel() used in open?

It's pointless. Just remove it.

> 2) Can it be replaced by mutex, for example?

No need.

> Please, comments, exaplanations are more than welcome.

But what is really wrong is the way the 'users' field is used: that should 
be an atomic counter: on the first-time-open you set up the device, and 
when the last user goes away you can close it down.

Currently if you open the device a second time and then close that second 
fh, the first gets muted by that close. Not what you want!

Actually, I don't see why this stuff is in the open/close at all, unless 
this saves some measurable amount of power consumption. I'd just move the 
setup code in the open() to the probe() and after that both the open() and 
close() functions become no-ops.

Regards,

	Hans

-- 
Hans Verkuil - video4linux developer - sponsored by TANDBERG
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux