From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752738AbbJUOIa (ORCPT ); Wed, 21 Oct 2015 10:08:30 -0400 Received: from mail-qk0-f169.google.com ([209.85.220.169]:34582 "EHLO mail-qk0-f169.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751023AbbJUOI3 (ORCPT ); Wed, 21 Oct 2015 10:08:29 -0400 Subject: Re: Missing wait_event_killable_timeout? To: "Kilian, Jens" , "linux-kernel@vger.kernel.org" References: From: Peter Hurley Message-ID: <56279C56.7050306@hurleysoftware.com> Date: Wed, 21 Oct 2015 10:08:22 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Jens, On 10/21/2015 03:20 AM, Kilian, Jens wrote: > I'd like to use a version of wait_event_killable() with a timeout, but it seems to be missing? I found a mention of it in a recent LKML message though: > > https://lkml.org/lkml/2015/10/14/337 > > Does this patch look reasonable? Where is the in-tree user? Without that, someone will notice this isn't being used and will remove it. Regards, Peter Hurley > diff --git a/include/linux/wait.h b/include/linux/wait.h > index 1e1bf9f..8419986 100644 > --- a/include/linux/wait.h > +++ b/include/linux/wait.h > @@ -738,6 +738,41 @@ do { \ > __ret; \ > }) > > +#define __wait_event_killable_timeout(wq, condition, timeout) \ > + ___wait_event(wq, ___wait_cond_timeout(condition), \ > + TASK_KILLABLE, 0, timeout, \ > + __ret = schedule_timeout(__ret)) > + > +/** > + * wait_event_killable_timeout - sleep until a condition gets true or a timeout elapses > + * @wq: the waitqueue to wait on > + * @condition: a C expression for the event to wait for > + * @timeout: timeout, in jiffies > + * > + * The process is put to sleep (TASK_KILLABLE) until the @condition > + * evaluates to true or a signal is received. > + * The @condition is checked each time the waitqueue @wq is woken up. > + * > + * wake_up() has to be called after changing any variable that could > + * change the result of the wait condition. > + * > + * Returns: > + * 0 if the @condition evaluated to %false after the @timeout elapsed, > + * 1 if the @condition evaluated to %true after the @timeout elapsed, > + * the remaining jiffies (at least 1) if the @condition evaluated > + * to %true before the @timeout elapsed, or -%ERESTARTSYS if it was > + * interrupted by a signal. > + */ > +#define wait_event_killable_timeout(wq, condition, timeout) \ > +({ \ > + long __ret = timeout; \ > + might_sleep(); \ > + if (!___wait_cond_timeout(condition)) \ > + __ret = __wait_event_killable_timeout(wq, \ > + condition, timeout); \ > + __ret; \ > +}) > + > > #define __wait_event_lock_irq(wq, condition, lock, cmd) \ > (void)___wait_event(wq, condition, TASK_UNINTERRUPTIBLE, 0, 0, \ > >