From 0eb4e62ecb3f4db6b71bb3f306a1aa106c9af0bb Mon Sep 17 00:00:00 2001 From: Thomas Schoebel-Theuer Date: Tue, 8 Nov 2011 11:17:41 +0100 Subject: [PATCH] fix possible endless loop in msleep() upon signals --- brick.c | 17 +++++++++++++++++ brick.h | 5 +++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/brick.c b/brick.c index 54aa5de4..6e437cb5 100644 --- a/brick.c +++ b/brick.c @@ -12,6 +12,23 @@ #include "brick.h" #include "brick_mem.h" +int brick_msleep(int msecs, bool shorten) +{ + unsigned long timeout; + if (msecs <= 0) { + schedule(); + return 0; + } + timeout = msecs_to_jiffies(msecs) + 1; + if (shorten) + timeout = schedule_timeout_interruptible(timeout); + else + while (timeout) + timeout = schedule_timeout_interruptible(timeout); + return jiffies_to_msecs(timeout); +} +EXPORT_SYMBOL_GPL(brick_msleep); + ///////////////////////////////////////////////////////////////////// // messaging diff --git a/brick.h b/brick.h index 74982437..5f3b5155 100644 --- a/brick.h +++ b/brick.h @@ -2,8 +2,6 @@ #ifndef BRICK_H #define BRICK_H -#define msleep msleep_interruptible - #include #include #include @@ -23,6 +21,9 @@ #define _NORMAL_CODE(X) X #endif +#define msleep(msecs) brick_msleep(msecs, false) +extern int brick_msleep(int msecs, bool shorten); + ///////////////////////////////////////////////////////////////////////// // printk() replacements