Merge branch 'rework/misc-cleanups' into for-linus
[linux-block.git] / kernel / printk / printk.c
index a8fab94f4c040a341700ce2cf5ae507f6fc594ba..95689eccf0fb274116e3d6d4aa0a0636fccd4ce8 100644 (file)
@@ -3727,7 +3727,8 @@ late_initcall(printk_late_init);
 /* If @con is specified, only wait for that console. Otherwise wait for all. */
 static bool __pr_flush(struct console *con, int timeout_ms, bool reset_on_progress)
 {
-       int remaining = timeout_ms;
+       unsigned long timeout_jiffies = msecs_to_jiffies(timeout_ms);
+       unsigned long remaining_jiffies = timeout_jiffies;
        struct console *c;
        u64 last_diff = 0;
        u64 printk_seq;
@@ -3744,6 +3745,9 @@ static bool __pr_flush(struct console *con, int timeout_ms, bool reset_on_progre
        console_unlock();
 
        for (;;) {
+               unsigned long begin_jiffies;
+               unsigned long slept_jiffies;
+
                diff = 0;
 
                /*
@@ -3772,24 +3776,20 @@ static bool __pr_flush(struct console *con, int timeout_ms, bool reset_on_progre
                console_srcu_read_unlock(cookie);
 
                if (diff != last_diff && reset_on_progress)
-                       remaining = timeout_ms;
+                       remaining_jiffies = timeout_jiffies;
 
                console_unlock();
 
                /* Note: @diff is 0 if there are no usable consoles. */
-               if (diff == 0 || remaining == 0)
+               if (diff == 0 || remaining_jiffies == 0)
                        break;
 
-               if (remaining < 0) {
-                       /* no timeout limit */
-                       msleep(100);
-               } else if (remaining < 100) {
-                       msleep(remaining);
-                       remaining = 0;
-               } else {
-                       msleep(100);
-                       remaining -= 100;
-               }
+               /* msleep(1) might sleep much longer. Check time by jiffies. */
+               begin_jiffies = jiffies;
+               msleep(1);
+               slept_jiffies = jiffies - begin_jiffies;
+
+               remaining_jiffies -= min(slept_jiffies, remaining_jiffies);
 
                last_diff = diff;
        }