Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 96d2ab48 authored by Arjan van de Ven's avatar Arjan van de Ven
Browse files

hrtimer: fix signed/unsigned bug in slack estimator



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: default avatarArjan van de Ven <arjan@linux.intel.com>
parent 704af52b
Loading
Loading
Loading
Loading
+8 −5
Original line number Diff line number Diff line
@@ -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)
@@ -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;
@@ -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;
@@ -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 (;;) {