Skip to content

Commit

Permalink
hrtimer: fix signed/unsigned bug in slack estimator
Browse files Browse the repository at this point in the history
the slack estimator used unsigned math; however for very short delay it's
possible that by the time you calculate the timeout, it's already passed and
you get a negative time/slack... in an unsigned variable... which then gets
turned into a 100 msec delay rather than zero.

This patch fixes this by using a signed typee in the right places.

Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
  • Loading branch information
Arjan van de Ven committed Sep 7, 2008
1 parent 704af52 commit 96d2ab4
Showing 1 changed file with 8 additions and 5 deletions.
13 changes: 8 additions & 5 deletions fs/select.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,9 @@
* better solutions..
*/

static unsigned long __estimate_accuracy(struct timespec *tv)
static long __estimate_accuracy(struct timespec *tv)
{
unsigned long slack;
long slack;
int divfactor = 1000;

if (task_nice(current) > 0)
Expand All @@ -54,10 +54,13 @@ static unsigned long __estimate_accuracy(struct timespec *tv)

if (slack > 100 * NSEC_PER_MSEC)
slack = 100 * NSEC_PER_MSEC;

if (slack < 0)
slack = 0;
return slack;
}

static unsigned long estimate_accuracy(struct timespec *tv)
static long estimate_accuracy(struct timespec *tv)
{
unsigned long ret;
struct timespec now;
Expand Down Expand Up @@ -330,7 +333,7 @@ int do_select(int n, fd_set_bits *fds, struct timespec *end_time)
timed_out = 1;
}

if (end_time)
if (end_time && !timed_out)
slack = estimate_accuracy(end_time);

retval = 0;
Expand Down Expand Up @@ -656,7 +659,7 @@ static int do_poll(unsigned int nfds, struct poll_list *list,
timed_out = 1;
}

if (end_time)
if (end_time && !timed_out)
slack = estimate_accuracy(end_time);

for (;;) {
Expand Down

0 comments on commit 96d2ab4

Please sign in to comment.