Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Revert "intel_idle: Add support for using intel_idle in a VM guest using just hlt"

This reverts commit 2f3d08f074b0 ("intel_idle: Add support for using
intel_idle in a VM guest using just hlt"), because it causes functional
issues to appear and it is not really useful without a related commit
that got reverted previously.

Link: https://lore.kernel.org/linux-pm/5c7de6d5-7706-c4a5-7c41-146db1269aff@intel.com
Reported-by: Xiaoyao Li <xiaoyao.li@intel.com>
Requested-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

+1 -116
+1 -116
drivers/idle/intel_idle.c
··· 199 199 return __intel_idle(dev, drv, index); 200 200 } 201 201 202 - static __always_inline int __intel_idle_hlt(struct cpuidle_device *dev, 203 - struct cpuidle_driver *drv, int index) 204 - { 205 - raw_safe_halt(); 206 - raw_local_irq_disable(); 207 - return index; 208 - } 209 - 210 - /** 211 - * intel_idle_hlt - Ask the processor to enter the given idle state using hlt. 212 - * @dev: cpuidle device of the target CPU. 213 - * @drv: cpuidle driver (assumed to point to intel_idle_driver). 214 - * @index: Target idle state index. 215 - * 216 - * Use the HLT instruction to notify the processor that the CPU represented by 217 - * @dev is idle and it can try to enter the idle state corresponding to @index. 218 - * 219 - * Must be called under local_irq_disable(). 220 - */ 221 - static __cpuidle int intel_idle_hlt(struct cpuidle_device *dev, 222 - struct cpuidle_driver *drv, int index) 223 - { 224 - return __intel_idle_hlt(dev, drv, index); 225 - } 226 - 227 - static __cpuidle int intel_idle_hlt_irq_on(struct cpuidle_device *dev, 228 - struct cpuidle_driver *drv, int index) 229 - { 230 - int ret; 231 - 232 - raw_local_irq_enable(); 233 - ret = __intel_idle_hlt(dev, drv, index); 234 - raw_local_irq_disable(); 235 - 236 - return ret; 237 - } 238 - 239 202 /** 240 203 * intel_idle_s2idle - Ask the processor to enter the given idle state. 241 204 * @dev: cpuidle device of the target CPU. ··· 1242 1279 .enter = NULL } 1243 1280 }; 1244 1281 1245 - static struct cpuidle_state vmguest_cstates[] __initdata = { 1246 - { 1247 - .name = "C1", 1248 - .desc = "HLT", 1249 - .flags = MWAIT2flg(0x00) | CPUIDLE_FLAG_IRQ_ENABLE, 1250 - .exit_latency = 5, 1251 - .target_residency = 10, 1252 - .enter = &intel_idle_hlt, }, 1253 - { 1254 - .enter = NULL } 1255 - }; 1256 - 1257 1282 static const struct idle_cpu idle_cpu_nehalem __initconst = { 1258 1283 .state_table = nehalem_cstates, 1259 1284 .auto_demotion_disable_flags = NHM_C1_AUTO_DEMOTE | NHM_C3_AUTO_DEMOTE, ··· 1841 1890 1842 1891 static void state_update_enter_method(struct cpuidle_state *state, int cstate) 1843 1892 { 1844 - if (state->enter == intel_idle_hlt) { 1845 - if (force_irq_on) { 1846 - pr_info("forced intel_idle_irq for state %d\n", cstate); 1847 - state->enter = intel_idle_hlt_irq_on; 1848 - } 1849 - return; 1850 - } 1851 - if (state->enter == intel_idle_hlt_irq_on) 1852 - return; /* no update scenarios */ 1853 - 1854 1893 if (state->flags & CPUIDLE_FLAG_INIT_XSTATE) { 1855 1894 /* 1856 1895 * Combining with XSTATE with IBRS or IRQ_ENABLE flags ··· 1872 1931 pr_info("forced intel_idle_irq for state %d\n", cstate); 1873 1932 state->enter = intel_idle_irq; 1874 1933 } 1875 - } 1876 - 1877 - /* 1878 - * For mwait based states, we want to verify the cpuid data to see if the state 1879 - * is actually supported by this specific CPU. 1880 - * For non-mwait based states, this check should be skipped. 1881 - */ 1882 - static bool should_verify_mwait(struct cpuidle_state *state) 1883 - { 1884 - if (state->enter == intel_idle_hlt) 1885 - return false; 1886 - if (state->enter == intel_idle_hlt_irq_on) 1887 - return false; 1888 - 1889 - return true; 1890 1934 } 1891 1935 1892 1936 static void __init intel_idle_init_cstates_icpu(struct cpuidle_driver *drv) ··· 1922 1996 } 1923 1997 1924 1998 mwait_hint = flg2MWAIT(cpuidle_state_table[cstate].flags); 1925 - if (should_verify_mwait(&cpuidle_state_table[cstate]) && !intel_idle_verify_cstate(mwait_hint)) 1999 + if (!intel_idle_verify_cstate(mwait_hint)) 1926 2000 continue; 1927 2001 1928 2002 /* Structure copy. */ ··· 2056 2130 cpuidle_unregister_device(per_cpu_ptr(intel_idle_cpuidle_devices, i)); 2057 2131 } 2058 2132 2059 - static int __init intel_idle_vminit(const struct x86_cpu_id *id) 2060 - { 2061 - int retval; 2062 - 2063 - cpuidle_state_table = vmguest_cstates; 2064 - 2065 - icpu = (const struct idle_cpu *)id->driver_data; 2066 - 2067 - pr_debug("v" INTEL_IDLE_VERSION " model 0x%X\n", 2068 - boot_cpu_data.x86_model); 2069 - 2070 - intel_idle_cpuidle_devices = alloc_percpu(struct cpuidle_device); 2071 - if (!intel_idle_cpuidle_devices) 2072 - return -ENOMEM; 2073 - 2074 - intel_idle_cpuidle_driver_init(&intel_idle_driver); 2075 - 2076 - retval = cpuidle_register_driver(&intel_idle_driver); 2077 - if (retval) { 2078 - struct cpuidle_driver *drv = cpuidle_get_driver(); 2079 - printk(KERN_DEBUG pr_fmt("intel_idle yielding to %s\n"), 2080 - drv ? drv->name : "none"); 2081 - goto init_driver_fail; 2082 - } 2083 - 2084 - retval = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "idle/intel:online", 2085 - intel_idle_cpu_online, NULL); 2086 - if (retval < 0) 2087 - goto hp_setup_fail; 2088 - 2089 - return 0; 2090 - hp_setup_fail: 2091 - intel_idle_cpuidle_devices_uninit(); 2092 - cpuidle_unregister_driver(&intel_idle_driver); 2093 - init_driver_fail: 2094 - free_percpu(intel_idle_cpuidle_devices); 2095 - return retval; 2096 - } 2097 - 2098 2133 static int __init intel_idle_init(void) 2099 2134 { 2100 2135 const struct x86_cpu_id *id; ··· 2074 2187 id = x86_match_cpu(intel_idle_ids); 2075 2188 if (id) { 2076 2189 if (!boot_cpu_has(X86_FEATURE_MWAIT)) { 2077 - if (boot_cpu_has(X86_FEATURE_HYPERVISOR)) 2078 - return intel_idle_vminit(id); 2079 2190 pr_debug("Please enable MWAIT in BIOS SETUP\n"); 2080 2191 return -ENODEV; 2081 2192 }