lkml.org 
[lkml]   [2008]   [Aug]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 5/5] select: make poll() use schedule_hrtimeout() as well

    From: Arjan van de Ven <arjan@linux.intel.com>
    Date: Thu, 28 Aug 2008 13:46:47 -0700
    Subject: [PATCH] select: make poll() use schedule_hrtimeout() as well

    similar to the select() patch, use schedule_hrtimeout() in the
    poll() codepath.

    Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
    ---
    fs/select.c | 46 ++++++++++++++++++++++++++++++----------------
    1 files changed, 30 insertions(+), 16 deletions(-)

    diff --git a/fs/select.c b/fs/select.c
    index 62b9767..e881b97 100644
    --- a/fs/select.c
    +++ b/fs/select.c
    @@ -631,6 +631,10 @@ static int do_poll(unsigned int nfds, struct poll_list *list,
    {
    int count = 0;
    poll_table* pt = &wait->pt;
    + int use_hr = 0;
    +
    + if (*timeout < HZ && *timeout > 0)
    + use_hr = 1;

    /* Optimise the no-wait case */
    if (!(*timeout))
    @@ -673,24 +677,34 @@ static int do_poll(unsigned int nfds, struct poll_list *list,
    if (count || !*timeout)
    break;

    - if (*timeout < 0) {
    - /* Wait indefinitely */
    - __timeout = MAX_SCHEDULE_TIMEOUT;
    - } else if (unlikely(*timeout >= (s64)MAX_SCHEDULE_TIMEOUT-1)) {
    - /*
    - * Wait for longer than MAX_SCHEDULE_TIMEOUT. Do it in
    - * a loop
    - */
    - __timeout = MAX_SCHEDULE_TIMEOUT - 1;
    - *timeout -= __timeout;
    + if (use_hr) {
    + struct timespec now;
    + ktime_t expire;
    + schedule_hrtimeout(end_time, HRTIMER_MODE_ABS);
    + getnstimeofday(&now);
    + expire = ktime_sub(timespec_to_ktime(*end_time), timespec_to_ktime(now));
    + if (ktime_to_ns(expire) <= 0)
    + break;
    } else {
    - __timeout = *timeout;
    - *timeout = 0;
    - }
    + if (*timeout < 0) {
    + /* Wait indefinitely */
    + __timeout = MAX_SCHEDULE_TIMEOUT;
    + } else if (unlikely(*timeout >= (s64)MAX_SCHEDULE_TIMEOUT-1)) {
    + /*
    + * Wait for longer than MAX_SCHEDULE_TIMEOUT. Do it in
    + * a loop
    + */
    + __timeout = MAX_SCHEDULE_TIMEOUT - 1;
    + *timeout -= __timeout;
    + } else {
    + __timeout = *timeout;
    + *timeout = 0;
    + }

    - __timeout = schedule_timeout(__timeout);
    - if (*timeout >= 0)
    - *timeout += __timeout;
    + __timeout = schedule_timeout(__timeout);
    + if (*timeout >= 0)
    + *timeout += __timeout;
    + }
    }
    __set_current_state(TASK_RUNNING);
    return count;
    --
    1.5.5.1


    \
     
     \ /
      Last update: 2008-08-29 17:25    [W:0.024 / U:60.512 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site