From: Rodolfo Giometti <giometti@enneenne.com>
To: Alexander Gordeev <lasaine@lvk.cs.msu.su>
Cc: linux-kernel@vger.kernel.org,
"Nikita V. Youshchenko" <yoush@cs.msu.su>,
linuxpps@ml.enneenne.com, john stultz <johnstul@us.ibm.com>,
Andrew Morton <akpm@linux-foundation.org>,
Tejun Heo <tj@kernel.org>, Joonwoo Park <joonwpark81@gmail.com>
Subject: Re: [PATCHv3 03/16] pps: fix race in PPS_FETCH handler
Date: Thu, 5 Aug 2010 11:15:32 +0200 [thread overview]
Message-ID: <20100805091532.GG26615@gundam.enneenne.com> (raw)
In-Reply-To: <033148d225d9e4929fcc02ed8de0fcfa3637cffe.1280952801.git.lasaine@lvk.cs.msu.su>
On Thu, Aug 05, 2010 at 01:06:40AM +0400, Alexander Gordeev wrote:
> There was a race in PPS_FETCH ioctl handler when several processes want
> to obtain PPS data simultaneously using sleeping PPS_FETCH. They all
> sleep most of the time in the system call.
> With the old approach when the first process waiting on the pps queue
> is waken up it makes new system call right away and zeroes pps->go. So
> other processes continue to sleep. This is a clear race condition
> because of the global 'go' variable.
> With the new approach pps->last_ev holds some value increasing at each
> PPS event. PPS_FETCH ioctl handler saves current value to the local
> variable at the very beginning so it can safely check that there is a
> new event by just comparing both variables.
>
> Signed-off-by: Alexander Gordeev <lasaine@lvk.cs.msu.su>
> ---
> drivers/pps/kapi.c | 4 ++--
> drivers/pps/pps.c | 10 +++++++---
> include/linux/pps_kernel.h | 2 +-
> 3 files changed, 10 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/pps/kapi.c b/drivers/pps/kapi.c
> index 55f3961..3f89f5e 100644
> --- a/drivers/pps/kapi.c
> +++ b/drivers/pps/kapi.c
> @@ -326,8 +326,8 @@ void pps_event(int source, struct pps_ktime *ts, int event, void *data)
>
> /* Wake up if captured something */
> if (captured) {
> - pps->go = ~0;
> - wake_up_interruptible(&pps->queue);
> + pps->last_ev++;
> + wake_up_interruptible_all(&pps->queue);
>
> kill_fasync(&pps->async_queue, SIGIO, POLL_IN);
> }
> diff --git a/drivers/pps/pps.c b/drivers/pps/pps.c
> index c76afb9..cb24147 100644
> --- a/drivers/pps/pps.c
> +++ b/drivers/pps/pps.c
> @@ -136,6 +136,7 @@ static long pps_cdev_ioctl(struct file *file,
>
> case PPS_FETCH: {
> struct pps_fdata fdata;
> + unsigned int ev;
>
> pr_debug("PPS_FETCH: source %d\n", pps->id);
>
> @@ -143,11 +144,12 @@ static long pps_cdev_ioctl(struct file *file,
> if (err)
> return -EFAULT;
>
> - pps->go = 0;
> + ev = pps->last_ev;
>
> /* Manage the timeout */
> if (fdata.timeout.flags & PPS_TIME_INVALID)
> - err = wait_event_interruptible(pps->queue, pps->go);
> + err = wait_event_interruptible(pps->queue,
> + ev < pps->last_ev);
> else {
> unsigned long ticks;
>
> @@ -159,7 +161,9 @@ static long pps_cdev_ioctl(struct file *file,
>
> if (ticks != 0) {
> err = wait_event_interruptible_timeout(
> - pps->queue, pps->go, ticks);
> + pps->queue,
> + ev < pps->last_ev,
> + ticks);
> if (err == 0)
> return -ETIMEDOUT;
> }
> diff --git a/include/linux/pps_kernel.h b/include/linux/pps_kernel.h
> index c930d11..c3aed4b 100644
> --- a/include/linux/pps_kernel.h
> +++ b/include/linux/pps_kernel.h
> @@ -55,7 +55,7 @@ struct pps_device {
> struct pps_ktime clear_tu;
> int current_mode; /* PPS mode at event time */
>
> - int go; /* PPS event is arrived? */
> + unsigned int last_ev; /* last PPS event id */
> wait_queue_head_t queue; /* PPS event queue */
>
> unsigned int id; /* PPS source unique ID */
> --
> 1.7.1
Yes. It was added when we passed from ioctl to unlocked_ioctl...
Acked-by: Rodolfo Giometti <giometti@linux.it>
--
GNU/Linux Solutions e-mail: giometti@enneenne.com
Linux Device Driver giometti@linux.it
Embedded Systems phone: +39 349 2432127
UNIX programming skype: rodolfo.giometti
Freelance ICT Italia - Consulente ICT Italia - www.consulenti-ict.it
next prev parent reply other threads:[~2010-08-05 9:15 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-08-04 21:06 [PATCHv3 00/16] pps: several fixes and improvements Alexander Gordeev
2010-08-04 21:06 ` [PATCHv3 01/16] pps: trivial fixes Alexander Gordeev
2010-08-05 8:57 ` Rodolfo Giometti
2010-08-04 21:06 ` [PATCHv3 02/16] pps: declare variables where they are used in switch Alexander Gordeev
2010-08-05 9:05 ` Rodolfo Giometti
2010-08-04 21:06 ` [PATCHv3 03/16] pps: fix race in PPS_FETCH handler Alexander Gordeev
2010-08-05 5:19 ` Vitezslav Samel
2010-08-05 10:19 ` Alexander Gordeev
2010-08-05 11:07 ` Vitezslav Samel
2010-08-05 14:31 ` Alexander Gordeev
2010-08-05 9:15 ` Rodolfo Giometti [this message]
2010-08-04 21:06 ` [PATCHv3 04/16] pps: unify timestamp gathering Alexander Gordeev
2010-08-05 9:17 ` Rodolfo Giometti
2010-08-04 21:06 ` [PATCHv3 05/16] pps: access pps device by direct pointer Alexander Gordeev
2010-08-05 9:32 ` Rodolfo Giometti
2010-08-05 11:42 ` Alexander Gordeev
2010-08-05 12:31 ` Rodolfo Giometti
2010-08-09 7:53 ` Alexander Gordeev
2010-08-09 12:47 ` Rodolfo Giometti
2010-08-04 21:06 ` [PATCHv3 06/16] pps: convert printk/pr_* to dev_* Alexander Gordeev
2010-08-04 21:06 ` [PATCHv3 07/16] pps: move idr stuff to pps.c Alexander Gordeev
2010-08-04 21:06 ` [PATCHv3 08/16] pps: add async PPS event handler Alexander Gordeev
2010-08-04 21:06 ` [PATCHv3 09/16] pps: don't disable interrupts when using spin locks Alexander Gordeev
2010-08-04 21:06 ` [PATCHv3 10/16] pps: use BUG_ON for kernel API safety checks Alexander Gordeev
2010-08-04 21:06 ` [PATCHv3 11/16] pps: simplify conditions a bit Alexander Gordeev
2010-08-04 21:06 ` [PATCHv3 12/16] ntp: add hardpps implementation Alexander Gordeev
2010-08-04 22:49 ` john stultz
2010-08-05 12:00 ` Alexander Gordeev
2010-08-04 23:26 ` Andrew Morton
2010-08-04 23:39 ` David Daney
2010-08-04 23:49 ` Andrew Morton
2010-08-04 21:06 ` [PATCHv3 13/16] pps: capture MONOTONIC_RAW timestamps as well Alexander Gordeev
2010-08-04 23:03 ` john stultz
2010-08-05 12:16 ` Alexander Gordeev
2010-08-04 23:29 ` Andrew Morton
2010-08-05 12:29 ` Alexander Gordeev
2010-08-04 21:06 ` [PATCHv3 14/16] pps: add kernel consumer support Alexander Gordeev
2010-08-04 21:06 ` [PATCHv3 15/16] pps: add parallel port PPS client Alexander Gordeev
2010-08-04 23:34 ` Andrew Morton
2010-08-05 12:48 ` Alexander Gordeev
2010-08-04 21:06 ` [PATCHv3 16/16] pps: add parallel port PPS signal generator Alexander Gordeev
2010-08-04 23:38 ` Andrew Morton
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=20100805091532.GG26615@gundam.enneenne.com \
--to=giometti@enneenne.com \
--cc=akpm@linux-foundation.org \
--cc=johnstul@us.ibm.com \
--cc=joonwpark81@gmail.com \
--cc=lasaine@lvk.cs.msu.su \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxpps@ml.enneenne.com \
--cc=tj@kernel.org \
--cc=yoush@cs.msu.su \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome