summaryrefslogtreecommitdiffstats
path: root/fs/select.c
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2009-11-01 11:11:07 +0100
committerTakashi Iwai <tiwai@suse.de>2009-11-01 11:11:07 +0100
commite87a3dd33eab30b4db539500064a9584867e4f2c (patch)
tree2f7ad16e46ae30518ff63bb5391b63f7f7cc74dd /fs/select.c
parentb14f5de731ae657d498d18d713c6431bfbeefb4b (diff)
parent3d00941371a765779c4e3509214c7e5793cce1fe (diff)
downloadkernel-crypto-e87a3dd33eab30b4db539500064a9584867e4f2c.tar.gz
kernel-crypto-e87a3dd33eab30b4db539500064a9584867e4f2c.tar.xz
kernel-crypto-e87a3dd33eab30b4db539500064a9584867e4f2c.zip
Merge branch 'fix/misc' into topic/misc
Diffstat (limited to 'fs/select.c')
-rw-r--r--fs/select.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/fs/select.c b/fs/select.c
index 8084834e123..fd38ce2e32e 100644
--- a/fs/select.c
+++ b/fs/select.c
@@ -15,6 +15,7 @@
*/
#include <linux/kernel.h>
+#include <linux/sched.h>
#include <linux/syscalls.h>
#include <linux/module.h>
#include <linux/slab.h>
@@ -41,22 +42,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;
}