Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753664Ab3GHFfW (ORCPT ); Mon, 8 Jul 2013 01:35:22 -0400 Received: from e23smtp02.au.ibm.com ([202.81.31.144]:57821 "EHLO e23smtp02.au.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753534Ab3GHFfV (ORCPT ); Mon, 8 Jul 2013 01:35:21 -0400 Message-ID: <51DA4EC5.10707@linux.vnet.ibm.com> Date: Mon, 08 Jul 2013 11:01:49 +0530 From: "Srivatsa S. Bhat" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120828 Thunderbird/15.0 MIME-Version: 1.0 To: Marcus Gelderie CC: artem.bityutskiy@linux.intel.com, herbert@gondor.hengli.com.au, linux-kernel@vger.kernel.org Subject: Re: [PATCH] kernel:time fix race condition in alaramtimer.c References: <1373126870-17978-1-git-send-email-redmnic@gmail.com> In-Reply-To: <1373126870-17978-1-git-send-email-redmnic@gmail.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13070805-5490-0000-0000-000003C714FF Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1852 Lines: 56 On 07/06/2013 09:37 PM, Marcus Gelderie wrote: > This patch fixes a race condition whereby the process can be caused to > sleep indefinitely. The problem occurs when the process is preempted > after having set its state to TASK_INTERRUPTIBLE but before starting the > alarm. > I don't think there is any such problem. The __schedule() function does this check before dequeuing a task: if (prev->state && !(preempt_count() & PREEMPT_ACTIVE)) The latter part helps prevent the kind of indefinite sleeping you described above. Also, take a look at preempt_schedule(), preempt_schedule_irq() and friends to see how in-kernel preemption is dealt with, by using PREEMPT_ACTIVE. That would clarify why there is no bug here. Regards, Srivatsa S. Bhat > --- > kernel/time/alarmtimer.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c > index f11d83b..81c8b31 100644 > --- a/kernel/time/alarmtimer.c > +++ b/kernel/time/alarmtimer.c > @@ -585,15 +585,19 @@ static int alarmtimer_do_nsleep(struct alarm *alarm, ktime_t absexp) > { > alarm->data = (void *)current; > do { > + preempt_disable(); > set_current_state(TASK_INTERRUPTIBLE); > alarm_start(alarm, absexp); > + preempt_enable_no_resched(); > if (likely(alarm->data)) > schedule(); > > + preempt_disable(); > alarm_cancel(alarm); > + __set_current_state(TASK_RUNNING); > + preempt_enable_no_resched(); > } while (alarm->data && !signal_pending(current)); > > - __set_current_state(TASK_RUNNING); > > return (alarm->data == NULL); > } > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/