static void wait_while_offlining(void);
 
 static DECLARE_WAIT_QUEUE_HEAD(ksm_thread_wait);
+static DECLARE_WAIT_QUEUE_HEAD(ksm_iter_wait);
 static DEFINE_MUTEX(ksm_thread_mutex);
 static DEFINE_SPINLOCK(ksm_mmlist_lock);
 
 
 static int ksm_scan_thread(void *nothing)
 {
+       unsigned int sleep_ms;
+
        set_freezable();
        set_user_nice(current, 5);
 
                try_to_freeze();
 
                if (ksmd_should_run()) {
-                       schedule_timeout_interruptible(
-                               msecs_to_jiffies(ksm_thread_sleep_millisecs));
+                       sleep_ms = READ_ONCE(ksm_thread_sleep_millisecs);
+                       wait_event_interruptible_timeout(ksm_iter_wait,
+                               sleep_ms != READ_ONCE(ksm_thread_sleep_millisecs),
+                               msecs_to_jiffies(sleep_ms));
                } else {
                        wait_event_freezable(ksm_thread_wait,
                                ksmd_should_run() || kthread_should_stop());
                return -EINVAL;
 
        ksm_thread_sleep_millisecs = msecs;
+       wake_up_interruptible(&ksm_iter_wait);
 
        return count;
 }