From: Hans Verkuil <hverkuil@xs4all.nl>
To: Arnd Bergmann <arnd@arndb.de>
Cc: linux-kernel@vger.kernel.org,
Mauro Carvalho Chehab <m.chehab@samsung.com>,
linux-media@vger.kernel.org
Subject: Re: [PATCH, RFC 07/30] [media] radio-cadet: avoid interruptible_sleep_on race
Date: Fri, 07 Feb 2014 10:47:14 +0100 [thread overview]
Message-ID: <52F4ABA2.5000905@xs4all.nl> (raw)
In-Reply-To: <52F4A82C.7010104@xs4all.nl>
On 02/07/2014 10:32 AM, Hans Verkuil wrote:
> Hi Arnd!
>
> On 01/17/2014 03:28 PM, Arnd Bergmann wrote:
>> On Friday 17 January 2014, Hans Verkuil wrote:
>>>> @@ -323,25 +324,32 @@ static ssize_t cadet_read(struct file *file, char __user *data, size_t count, lo
>>>> struct cadet *dev = video_drvdata(file);
>>>> unsigned char readbuf[RDS_BUFFER];
>>>> int i = 0;
>>>> + DEFINE_WAIT(wait);
>>>>
>>>> mutex_lock(&dev->lock);
>>>> if (dev->rdsstat == 0)
>>>> cadet_start_rds(dev);
>>>> - if (dev->rdsin == dev->rdsout) {
>>>> + while (1) {
>>>> + prepare_to_wait(&dev->read_queue, &wait, TASK_INTERRUPTIBLE);
>>>> + if (dev->rdsin != dev->rdsout)
>>>> + break;
>>>> +
>>>> if (file->f_flags & O_NONBLOCK) {
>>>> i = -EWOULDBLOCK;
>>>> goto unlock;
>>>> }
>>>> mutex_unlock(&dev->lock);
>>>> - interruptible_sleep_on(&dev->read_queue);
>>>> + schedule();
>>>> mutex_lock(&dev->lock);
>>>> }
>>>> +
>>>
>>> This seems overly complicated. Isn't it enough to replace interruptible_sleep_on
>>> by 'wait_event_interruptible(&dev->read_queue, dev->rdsin != dev->rdsout);'?
>>>
>>> Or am I missing something subtle?
>>
>> The existing code sleeps with &dev->lock released because the cadet_handler()
>> function needs to grab (and release) the same lock before it can wake up
>> the reader thread.
>>
>> Doing the simple wait_event_interruptible() would result in a deadlock here.
>
> I don't see it. I propose this patch:
>
> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
>
> diff --git a/drivers/media/radio/radio-cadet.c b/drivers/media/radio/radio-cadet.c
> index 545c04c..2f658c6 100644
> --- a/drivers/media/radio/radio-cadet.c
> +++ b/drivers/media/radio/radio-cadet.c
> @@ -327,13 +327,15 @@ static ssize_t cadet_read(struct file *file, char __user *data, size_t count, lo
> mutex_lock(&dev->lock);
> if (dev->rdsstat == 0)
> cadet_start_rds(dev);
> - if (dev->rdsin == dev->rdsout) {
> + while (dev->rdsin == dev->rdsout) {
> if (file->f_flags & O_NONBLOCK) {
> i = -EWOULDBLOCK;
> goto unlock;
> }
> mutex_unlock(&dev->lock);
> - interruptible_sleep_on(&dev->read_queue);
> + if (wait_event_interruptible(&dev->read_queue,
Oops, that's without an '&' before dev->read_queue. I forgot to update my
patch before posting, sorry about that.
Hans
> + dev->rdsin != dev->rdsout))
> + return -EINTR;
> mutex_lock(&dev->lock);
> }
> while (i < count && dev->rdsin != dev->rdsout)
>
> Tested with my radio-cadet card.
>
> This looks good to me. If I am still missing something, let me know!
>
> Regards,
>
> Hans
> --
> To unsubscribe from this list: send the line "unsubscribe linux-media" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
next prev parent reply other threads:[~2014-02-07 9:47 UTC|newest]
Thread overview: 85+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-01-02 12:07 [PATCH, RFC 00/30] sleep_on removal Arnd Bergmann
2014-01-02 12:07 ` Arnd Bergmann
2014-01-02 12:07 ` [PATCH, RFC 01/30] ataflop: fix sleep_on races Arnd Bergmann
2014-01-02 12:27 ` Fwd: " Geert Uytterhoeven
2014-01-05 1:39 ` Michael Schmitz
2014-01-02 12:07 ` [PATCH, RFC 02/30] scsi: atari_scsi: fix sleep_on race Arnd Bergmann
2014-01-02 12:26 ` Fwd: " Geert Uytterhoeven
2014-01-05 1:35 ` Michael Schmitz
2014-01-12 1:40 ` Michael Schmitz
2014-01-12 20:00 ` Arnd Bergmann
2014-01-13 7:35 ` Michael Schmitz
2014-01-27 8:28 ` Michael Schmitz
2014-01-29 14:53 ` Arnd Bergmann
2014-01-30 7:54 ` schmitz
2014-01-30 7:57 ` Geert Uytterhoeven
2014-01-30 8:08 ` schmitz
2014-01-30 8:27 ` Geert Uytterhoeven
2014-01-30 8:06 ` schmitz
2014-01-13 8:20 ` schmitz
2014-01-14 8:29 ` Michael Schmitz
2014-01-19 22:04 ` Michael Schmitz
2014-01-28 7:52 ` [PATCH 0/3] m68k/atari - Atari NCR5380 SCSI driver fixes Michael Schmitz
2014-01-28 8:02 ` Geert Uytterhoeven
2014-01-28 7:52 ` [PATCH 1/3] m68k/atari - atari_scsi: fix wait_event completion conditions Michael Schmitz
2014-01-28 7:52 ` [PATCH 2/3] m68k/atari - atari_scsi: change abort/reset return codes Michael Schmitz
2014-01-28 7:52 ` [PATCH 3/3] m68k/atari - atari_scsi lock fixes: punt if deadlocked Michael Schmitz
2014-01-28 23:55 ` [PATCH 0/3] m68k/atari - Atari NCR5380 SCSI driver fixes (resent) Michael Schmitz
2014-01-28 23:55 ` [PATCH 1/3] m68k/atari - atari_scsi: fix wait_event completion conditions Michael Schmitz
2014-01-28 23:55 ` [PATCH 2/3] m68k/atari - atari_scsi: change abort/reset return codes Michael Schmitz
2014-01-28 23:55 ` [PATCH 3/3] m68k/atari - atari_scsi lock fixes: punt if deadlocked Michael Schmitz
2014-01-02 12:07 ` [PATCH, RFC 03/30] DAC960: remove sleep_on usage Arnd Bergmann
2014-01-02 12:07 ` [PATCH, RFC 04/30] swim3: fix interruptible_sleep_on race Arnd Bergmann
2014-01-02 12:07 ` [PATCH, RFC 05/30] [media] omap_vout: avoid sleep_on race Arnd Bergmann
2014-01-17 10:23 ` Hans Verkuil
2014-02-26 9:03 ` Arnd Bergmann
2014-02-26 9:56 ` Hans Verkuil
2014-01-02 12:07 ` [PATCH, RFC 06/30] [media] usbvision: remove bogus sleep_on_timeout Arnd Bergmann
2014-01-17 10:26 ` Hans Verkuil
2014-01-02 12:07 ` [PATCH, RFC 07/30] [media] radio-cadet: avoid interruptible_sleep_on race Arnd Bergmann
2014-01-17 10:47 ` Hans Verkuil
2014-01-17 14:28 ` Arnd Bergmann
2014-02-07 9:32 ` Hans Verkuil
2014-02-07 9:47 ` Hans Verkuil [this message]
2014-02-07 10:17 ` Arnd Bergmann
2014-02-07 11:35 ` Hans Verkuil
2014-02-09 20:53 ` Arnd Bergmann
2014-01-02 12:07 ` [PATCH, RFC 08/30] [media] arv: fix sleep_on race Arnd Bergmann
2014-01-17 10:51 ` Hans Verkuil
2014-02-07 9:16 ` Hans Verkuil
2014-02-26 8:57 ` Arnd Bergmann
2014-01-02 12:07 ` [PATCH, RFC 09/30] staging: serqt_usb2: don't use sleep_on Arnd Bergmann
2014-01-02 12:07 ` [PATCH, RFC 10/30] staging: gdm72xx: fix interruptible_sleep_on race Arnd Bergmann
2014-01-02 12:07 ` [PATCH, RFC 11/30] staging: panel: " Arnd Bergmann
2014-01-02 12:07 ` [PATCH, RFC 12/30] parport: " Arnd Bergmann
2014-01-02 12:07 ` [PATCH, RFC 13/30] cris: sync_serial: remove interruptible_sleep_on Arnd Bergmann
2014-01-09 9:52 ` Jesper Nilsson
2014-01-02 12:07 ` [PATCH, RFC 14/30] tty/amiserial: avoid interruptible_sleep_on Arnd Bergmann
2014-01-02 12:27 ` Fwd: " Geert Uytterhoeven
2014-01-02 12:07 ` [PATCH, RFC 15/30] usbserial: stop using interruptible_sleep_on Arnd Bergmann
2014-01-02 21:36 ` Johan Hovold
2014-01-03 14:01 ` Arnd Bergmann
2014-01-02 12:07 ` [PATCH, RFC 16/30] tty: synclink: avoid sleep_on race Arnd Bergmann
2014-01-02 12:07 ` [PATCH, RFC 17/30] atm: nicstar: remove interruptible_sleep_on_timeout Arnd Bergmann
2014-01-02 12:07 ` [PATCH, RFC 18/30] atm: firestream: fix interruptible_sleep_on race Arnd Bergmann
2014-01-02 12:07 ` [PATCH, RFC 19/30] isdn: pcbit: " Arnd Bergmann
2014-01-02 12:07 ` [PATCH, RFC 20/30] isdn: hisax/elsa: fix sleep_on race in elsa FSM Arnd Bergmann
2014-01-02 12:07 ` [PATCH, RFC 21/30] isdn: divert, hysdn: fix interruptible_sleep_on race Arnd Bergmann
2014-01-02 15:01 ` Sergei Shtylyov
2014-01-02 16:48 ` Arnd Bergmann
2014-01-02 23:00 ` Sergei Shtylyov
2014-01-02 12:07 ` [PATCH, RFC 22/30] isdn: fix multiple sleep_on races Arnd Bergmann
2014-01-02 12:07 ` [PATCH, RFC 23/30] oss: msnd_pinnacle: avoid interruptible_sleep_on_timeout Arnd Bergmann
2014-01-02 12:07 ` Arnd Bergmann
2014-01-14 15:16 ` Takashi Iwai
2014-01-02 12:07 ` [PATCH, RFC 24/30] oss: midibuf: fix sleep_on races Arnd Bergmann
2014-01-02 12:07 ` Arnd Bergmann
2014-01-02 12:07 ` [PATCH, RFC 25/30] oss: vwsnd: avoid interruptible_sleep_on Arnd Bergmann
2014-01-02 12:07 ` Arnd Bergmann
2014-01-02 12:07 ` [PATCH, RFC 26/30] oss: dmasound: kill SLEEP() macro to avoid race Arnd Bergmann
2014-01-02 12:07 ` Arnd Bergmann
2014-01-02 12:07 ` [PATCH, RFC 27/30] oss: remove last sleep_on users Arnd Bergmann
2014-01-02 12:07 ` [PATCH, RFC 28/30] sgi-xp: open-code interruptible_sleep_on_timeout Arnd Bergmann
2014-01-02 16:04 ` Robin Holt
2014-01-02 12:07 ` [PATCH, RFC 29/30] char: nwbutton: open-code interruptible_sleep_on Arnd Bergmann
2014-01-02 12:07 ` [PATCH, RFC 30/30] sched: remove sleep_on() and friends Arnd Bergmann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=52F4ABA2.5000905@xs4all.nl \
--to=hverkuil@xs4all.nl \
--cc=arnd@arndb.de \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=m.chehab@samsung.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.