|
@@ -26,8 +26,6 @@
|
|
|
static int hlt_counter;
|
|
|
int ubc_usercnt = 0;
|
|
|
|
|
|
-#define HARD_IDLE_TIMEOUT (HZ / 3)
|
|
|
-
|
|
|
void (*pm_idle)(void);
|
|
|
void (*pm_power_off)(void);
|
|
|
EXPORT_SYMBOL(pm_power_off);
|
|
@@ -44,16 +42,39 @@ void enable_hlt(void)
|
|
|
}
|
|
|
EXPORT_SYMBOL(enable_hlt);
|
|
|
|
|
|
+static int __init nohlt_setup(char *__unused)
|
|
|
+{
|
|
|
+ hlt_counter = 1;
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+__setup("nohlt", nohlt_setup);
|
|
|
+
|
|
|
+static int __init hlt_setup(char *__unused)
|
|
|
+{
|
|
|
+ hlt_counter = 0;
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+__setup("hlt", hlt_setup);
|
|
|
+
|
|
|
void default_idle(void)
|
|
|
{
|
|
|
- if (!hlt_counter)
|
|
|
- cpu_sleep();
|
|
|
- else
|
|
|
- cpu_relax();
|
|
|
+ if (!hlt_counter) {
|
|
|
+ clear_thread_flag(TIF_POLLING_NRFLAG);
|
|
|
+ smp_mb__after_clear_bit();
|
|
|
+ set_bl_bit();
|
|
|
+ while (!need_resched())
|
|
|
+ cpu_sleep();
|
|
|
+ clear_bl_bit();
|
|
|
+ set_thread_flag(TIF_POLLING_NRFLAG);
|
|
|
+ } else
|
|
|
+ while (!need_resched())
|
|
|
+ cpu_relax();
|
|
|
}
|
|
|
|
|
|
void cpu_idle(void)
|
|
|
{
|
|
|
+ set_thread_flag(TIF_POLLING_NRFLAG);
|
|
|
+
|
|
|
/* endless idle loop with no priority at all */
|
|
|
while (1) {
|
|
|
void (*idle)(void) = pm_idle;
|