From a20d4bc95134b5438e8bdb1e6de41f0e1b1bf787 Mon Sep 17 00:00:00 2001 From: Guillaume Knispel Date: Tue, 22 Sep 2009 16:43:30 -0700 Subject: [PATCH] --- yaml --- r: 164667 b: refs/heads/master c: 5ae87e79ecb5baa65e9cf48be874098fafad0668 h: refs/heads/master i: 164665: b1365c5d00729456dc66170be091db3f34eee977 164663: d9370668ac4caa09a13c9d823d2e4f5c5d73cf07 v: v3 --- [refs] | 2 +- trunk/fs/select.c | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 0572865b418c..baf1be9ef071 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f58f2fa9286db0ce9124ca9986d56aa5420b7f59 +refs/heads/master: 5ae87e79ecb5baa65e9cf48be874098fafad0668 diff --git a/trunk/fs/select.c b/trunk/fs/select.c index 8084834e123e..a201fc370223 100644 --- a/trunk/fs/select.c +++ b/trunk/fs/select.c @@ -41,22 +41,28 @@ * better solutions.. */ +#define MAX_SLACK (100 * NSEC_PER_MSEC) + static long __estimate_accuracy(struct timespec *tv) { long slack; int divfactor = 1000; + if (tv->tv_sec < 0) + return 0; + if (task_nice(current) > 0) divfactor = divfactor / 5; + if (tv->tv_sec > MAX_SLACK / (NSEC_PER_SEC/divfactor)) + return MAX_SLACK; + slack = tv->tv_nsec / divfactor; slack += tv->tv_sec * (NSEC_PER_SEC/divfactor); - if (slack > 100 * NSEC_PER_MSEC) - slack = 100 * NSEC_PER_MSEC; + if (slack > MAX_SLACK) + return MAX_SLACK; - if (slack < 0) - slack = 0; return slack; }