static int cmm_thread(void *dummy) { int rc; while (1) { rc = wait_event_interruptible(cmm_thread_wait, (cmm_pages != cmm_pages_target || cmm_timed_pages != cmm_timed_pages_target || kthread_should_stop())); if (kthread_should_stop() || rc == -ERESTARTSYS) { cmm_pages_target = cmm_pages; cmm_timed_pages_target = cmm_timed_pages; break; } if (cmm_pages_target > cmm_pages) { if (cmm_alloc_pages(1, &cmm_pages, &cmm_page_list)) cmm_pages_target = cmm_pages; } else if (cmm_pages_target < cmm_pages) { cmm_free_pages(1, &cmm_pages, &cmm_page_list); } if (cmm_timed_pages_target > cmm_timed_pages) { if (cmm_alloc_pages(1, &cmm_timed_pages, &cmm_timed_page_list)) cmm_timed_pages_target = cmm_timed_pages; } else if (cmm_timed_pages_target < cmm_timed_pages) { cmm_free_pages(1, &cmm_timed_pages, &cmm_timed_page_list); } if (cmm_timed_pages > 0 && !timer_pending(&cmm_timer)) cmm_set_timer(); } return 0; }
static int cmm_thread(void *dummy) { int rc; daemonize("cmmthread"); set_cpus_allowed(current, cpumask_of_cpu(0)); while (1) { rc = wait_event_interruptible(cmm_thread_wait, (cmm_pages != cmm_pages_target || cmm_timed_pages != cmm_timed_pages_target)); if (rc == -ERESTARTSYS) { /* Got kill signal. End thread. */ clear_bit(0, &cmm_thread_active); cmm_pages_target = cmm_pages; cmm_timed_pages_target = cmm_timed_pages; break; } if (cmm_pages_target > cmm_pages) { if (cmm_alloc_pages(1, &cmm_pages, &cmm_page_list)) cmm_pages_target = cmm_pages; } else if (cmm_pages_target < cmm_pages) { cmm_free_pages(1, &cmm_pages, &cmm_page_list); } if (cmm_timed_pages_target > cmm_timed_pages) { if (cmm_alloc_pages(1, &cmm_timed_pages, &cmm_timed_page_list)) cmm_timed_pages_target = cmm_timed_pages; } else if (cmm_timed_pages_target < cmm_timed_pages) { cmm_free_pages(1, &cmm_timed_pages, &cmm_timed_page_list); } if (cmm_timed_pages > 0 && !timer_pending(&cmm_timer)) cmm_set_timer(); } return 0; }
/** * cmm_thread - CMM task thread * @dummy: not used * * Return value: * 0 **/ static int cmm_thread(void *dummy) { unsigned long timeleft; while (1) { timeleft = msleep_interruptible(delay * 1000); if (kthread_should_stop() || timeleft) break; if (mutex_trylock(&hotplug_mutex)) { if (hotplug_occurred) { hotplug_occurred = 0; mutex_unlock(&hotplug_mutex); cmm_dbg("Hotplug operation has occurred, " "loaning activity suspended " "for %d seconds.\n", hotplug_delay); timeleft = msleep_interruptible(hotplug_delay * 1000); if (kthread_should_stop() || timeleft) break; continue; } mutex_unlock(&hotplug_mutex); } else { cmm_dbg("Hotplug operation in progress, activity " "suspended\n"); continue; } cmm_get_mpp(); if (loaned_pages_target > loaned_pages) { if (cmm_alloc_pages(loaned_pages_target - loaned_pages)) loaned_pages_target = loaned_pages; } else if (loaned_pages_target < loaned_pages) cmm_free_pages(loaned_pages - loaned_pages_target); } return 0; }
/** * cmm_thread - CMM task thread * @dummy: not used * * Return value: * 0 **/ static int cmm_thread(void *dummy) { unsigned long timeleft; while (1) { timeleft = msleep_interruptible(delay * 1000); if (kthread_should_stop() || timeleft) { loaned_pages_target = loaned_pages; break; } cmm_get_mpp(); if (loaned_pages_target > loaned_pages) { if (cmm_alloc_pages(loaned_pages_target - loaned_pages)) loaned_pages_target = loaned_pages; } else if (loaned_pages_target < loaned_pages) cmm_free_pages(loaned_pages - loaned_pages_target); } return 0; }