lkml.org 
[lkml]   [2023]   [May]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/4] rcuwait: Support timeouts
    Date
    The rcuwait utility provides an efficient and safe single
    wait/wake mechanism. It is used in situations where queued
    wait is the wrong semantics, and often too bulky. For example,
    cases where the wait is already done under a lock.

    In the past, rcuwait has been extended to support beyond only
    uninterruptible sleep, and similarly, there are users that can
    benefit for the addition of timeouts.

    As such, tntroduce rcuwait_wait_event_timeout(), with semantics
    equivalent to calls for queued wait counterparts.

    Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: Davidlohr Bueso <dave@stgolabs.net>
    ---
    include/linux/rcuwait.h | 23 ++++++++++++++++++++---
    1 file changed, 20 insertions(+), 3 deletions(-)

    diff --git a/include/linux/rcuwait.h b/include/linux/rcuwait.h
    index 8052d34da782..27343424225c 100644
    --- a/include/linux/rcuwait.h
    +++ b/include/linux/rcuwait.h
    @@ -49,9 +49,9 @@ static inline void prepare_to_rcuwait(struct rcuwait *w)

    extern void finish_rcuwait(struct rcuwait *w);

    -#define rcuwait_wait_event(w, condition, state) \
    +#define ___rcuwait_wait_event(w, condition, state, ret, cmd) \
    ({ \
    - int __ret = 0; \
    + long __ret = ret; \
    prepare_to_rcuwait(w); \
    for (;;) { \
    /* \
    @@ -67,10 +67,27 @@ extern void finish_rcuwait(struct rcuwait *w);
    break; \
    } \
    \
    - schedule(); \
    + cmd; \
    } \
    finish_rcuwait(w); \
    __ret; \
    })

    +#define rcuwait_wait_event(w, condition, state) \
    + ___rcuwait_wait_event(w, condition, state, 0, schedule())
    +
    +#define __rcuwait_wait_event_timeout(w, condition, state, timeout) \
    + ___rcuwait_wait_event(w, ___wait_cond_timeout(condition), \
    + state, timeout, \
    + __ret = schedule_timeout(__ret))
    +
    +#define rcuwait_wait_event_timeout(w, condition, state, timeout) \
    +({ \
    + long __ret = timeout; \
    + if (!___wait_cond_timeout(condition)) \
    + __ret = __rcuwait_wait_event_timeout(w, condition, \
    + state, timeout); \
    + __ret; \
    +})
    +
    #endif /* _LINUX_RCUWAIT_H_ */
    --
    2.40.1
    \
     
     \ /
      Last update: 2023-05-23 19:54    [W:3.729 / U:0.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site