lkml.org 
[lkml]   [2011]   [Sep]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] hrtimers: Special-case zero length sleeps
    Date
    sleep(0) is a common construct used by applications that want to trigger
    the scheduler. sched_yield() might make more sense, but only appeared in
    POSIX.1-2001 and so plenty of example code still uses the sleep(0) form.
    This wouldn't normally be a problem, but it means that event-driven
    applications that are merely trying to avoid starving other processes may
    actually end up sleeping due to having large timer_slack values. Special-
    casing this seems reasonable.

    Signed-off-by: Matthew Garrett <mjg@redhat.com>
    ---
    kernel/hrtimer.c | 8 ++++++++
    1 files changed, 8 insertions(+), 0 deletions(-)

    diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c
    index a9205e3..0bb70a7 100644
    --- a/kernel/hrtimer.c
    +++ b/kernel/hrtimer.c
    @@ -1566,6 +1566,14 @@ long hrtimer_nanosleep(struct timespec *rqtp, struct timespec __user *rmtp,
    if (rt_task(current))
    slack = 0;

    + /*
    + * Applications will often sleep(0) to indicate that they wish to
    + * be scheduled. Special case that to avoid actually putting them
    + * to sleep for the duration of the slack.
    + */
    + if (rqtp->tv_sec == 0 && rqtp->tv_nsec == 0)
    + slack = 0;
    +
    hrtimer_init_on_stack(&t.timer, clockid, mode);
    hrtimer_set_expires_range_ns(&t.timer, timespec_to_ktime(*rqtp), slack);
    if (do_nanosleep(&t, mode))
    --
    1.7.6.4


    \
     
     \ /
      Last update: 2011-09-29 17:01    [W:2.397 / U:0.112 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site