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

Merge branch 'pm-cpuidle'

* pm-cpuidle:
intel_idle: Graceful probe failure when MWAIT is disabled
cpuidle: Avoid assignment in if () argument
cpuidle: Clean up cpuidle_enable_device() error handling a bit
cpuidle: ladder: Add per CPU PM QoS resume latency support
ARM: cpuidle: Refactor rollback operations if init fails
ARM: cpuidle: Correct driver unregistration if init fails
intel_idle: replace conditionals with static_cpu_has(X86_FEATURE_ARAT)
cpuidle: fix broadcast control when broadcast can not be entered

Conflicts:
drivers/idle/intel_idle.c

+122 -75
+88 -65
drivers/cpuidle/cpuidle-arm.c
··· 72 72 }; 73 73 74 74 /* 75 - * arm_idle_init 75 + * arm_idle_init_cpu 76 76 * 77 77 * Registers the arm specific cpuidle driver with the cpuidle 78 78 * framework. It relies on core code to parse the idle states 79 79 * and initialize them using driver data structures accordingly. 80 + */ 81 + static int __init arm_idle_init_cpu(int cpu) 82 + { 83 + int ret; 84 + struct cpuidle_driver *drv; 85 + struct cpuidle_device *dev; 86 + 87 + drv = kmemdup(&arm_idle_driver, sizeof(*drv), GFP_KERNEL); 88 + if (!drv) 89 + return -ENOMEM; 90 + 91 + drv->cpumask = (struct cpumask *)cpumask_of(cpu); 92 + 93 + /* 94 + * Initialize idle states data, starting at index 1. This 95 + * driver is DT only, if no DT idle states are detected (ret 96 + * == 0) let the driver initialization fail accordingly since 97 + * there is no reason to initialize the idle driver if only 98 + * wfi is supported. 99 + */ 100 + ret = dt_init_idle_driver(drv, arm_idle_state_match, 1); 101 + if (ret <= 0) { 102 + ret = ret ? : -ENODEV; 103 + goto out_kfree_drv; 104 + } 105 + 106 + ret = cpuidle_register_driver(drv); 107 + if (ret) { 108 + pr_err("Failed to register cpuidle driver\n"); 109 + goto out_kfree_drv; 110 + } 111 + 112 + /* 113 + * Call arch CPU operations in order to initialize 114 + * idle states suspend back-end specific data 115 + */ 116 + ret = arm_cpuidle_init(cpu); 117 + 118 + /* 119 + * Skip the cpuidle device initialization if the reported 120 + * failure is a HW misconfiguration/breakage (-ENXIO). 121 + */ 122 + if (ret == -ENXIO) 123 + return 0; 124 + 125 + if (ret) { 126 + pr_err("CPU %d failed to init idle CPU ops\n", cpu); 127 + goto out_unregister_drv; 128 + } 129 + 130 + dev = kzalloc(sizeof(*dev), GFP_KERNEL); 131 + if (!dev) { 132 + pr_err("Failed to allocate cpuidle device\n"); 133 + ret = -ENOMEM; 134 + goto out_unregister_drv; 135 + } 136 + dev->cpu = cpu; 137 + 138 + ret = cpuidle_register_device(dev); 139 + if (ret) { 140 + pr_err("Failed to register cpuidle device for CPU %d\n", 141 + cpu); 142 + goto out_kfree_dev; 143 + } 144 + 145 + return 0; 146 + 147 + out_kfree_dev: 148 + kfree(dev); 149 + out_unregister_drv: 150 + cpuidle_unregister_driver(drv); 151 + out_kfree_drv: 152 + kfree(drv); 153 + return ret; 154 + } 155 + 156 + /* 157 + * arm_idle_init - Initializes arm cpuidle driver 158 + * 159 + * Initializes arm cpuidle driver for all CPUs, if any CPU fails 160 + * to register cpuidle driver then rollback to cancel all CPUs 161 + * registeration. 80 162 */ 81 163 static int __init arm_idle_init(void) 82 164 { ··· 167 85 struct cpuidle_device *dev; 168 86 169 87 for_each_possible_cpu(cpu) { 170 - 171 - drv = kmemdup(&arm_idle_driver, sizeof(*drv), GFP_KERNEL); 172 - if (!drv) { 173 - ret = -ENOMEM; 88 + ret = arm_idle_init_cpu(cpu); 89 + if (ret) 174 90 goto out_fail; 175 - } 176 - 177 - drv->cpumask = (struct cpumask *)cpumask_of(cpu); 178 - 179 - /* 180 - * Initialize idle states data, starting at index 1. This 181 - * driver is DT only, if no DT idle states are detected (ret 182 - * == 0) let the driver initialization fail accordingly since 183 - * there is no reason to initialize the idle driver if only 184 - * wfi is supported. 185 - */ 186 - ret = dt_init_idle_driver(drv, arm_idle_state_match, 1); 187 - if (ret <= 0) { 188 - ret = ret ? : -ENODEV; 189 - goto init_fail; 190 - } 191 - 192 - ret = cpuidle_register_driver(drv); 193 - if (ret) { 194 - pr_err("Failed to register cpuidle driver\n"); 195 - goto init_fail; 196 - } 197 - 198 - /* 199 - * Call arch CPU operations in order to initialize 200 - * idle states suspend back-end specific data 201 - */ 202 - ret = arm_cpuidle_init(cpu); 203 - 204 - /* 205 - * Skip the cpuidle device initialization if the reported 206 - * failure is a HW misconfiguration/breakage (-ENXIO). 207 - */ 208 - if (ret == -ENXIO) 209 - continue; 210 - 211 - if (ret) { 212 - pr_err("CPU %d failed to init idle CPU ops\n", cpu); 213 - goto out_fail; 214 - } 215 - 216 - dev = kzalloc(sizeof(*dev), GFP_KERNEL); 217 - if (!dev) { 218 - pr_err("Failed to allocate cpuidle device\n"); 219 - ret = -ENOMEM; 220 - goto out_fail; 221 - } 222 - dev->cpu = cpu; 223 - 224 - ret = cpuidle_register_device(dev); 225 - if (ret) { 226 - pr_err("Failed to register cpuidle device for CPU %d\n", 227 - cpu); 228 - kfree(dev); 229 - goto out_fail; 230 - } 231 91 } 232 92 233 93 return 0; 234 - init_fail: 235 - kfree(drv); 94 + 236 95 out_fail: 237 96 while (--cpu >= 0) { 238 97 dev = per_cpu(cpuidle_devices, cpu); 98 + drv = cpuidle_get_cpu_driver(dev); 239 99 cpuidle_unregister_device(dev); 240 - kfree(dev); 241 - drv = cpuidle_get_driver(); 242 100 cpuidle_unregister_driver(drv); 101 + kfree(dev); 243 102 kfree(drv); 244 103 } 245 104
+10 -4
drivers/cpuidle/cpuidle.c
··· 208 208 return -EBUSY; 209 209 } 210 210 target_state = &drv->states[index]; 211 + broadcast = false; 211 212 } 212 213 213 214 /* Take note of the planned idle state. */ ··· 388 387 if (dev->enabled) 389 388 return 0; 390 389 390 + if (!cpuidle_curr_governor) 391 + return -EIO; 392 + 391 393 drv = cpuidle_get_cpu_driver(dev); 392 394 393 - if (!drv || !cpuidle_curr_governor) 395 + if (!drv) 394 396 return -EIO; 395 397 396 398 if (!dev->registered) ··· 403 399 if (ret) 404 400 return ret; 405 401 406 - if (cpuidle_curr_governor->enable && 407 - (ret = cpuidle_curr_governor->enable(drv, dev))) 408 - goto fail_sysfs; 402 + if (cpuidle_curr_governor->enable) { 403 + ret = cpuidle_curr_governor->enable(drv, dev); 404 + if (ret) 405 + goto fail_sysfs; 406 + } 409 407 410 408 smp_wmb(); 411 409
+7
drivers/cpuidle/governors/ladder.c
··· 17 17 #include <linux/pm_qos.h> 18 18 #include <linux/jiffies.h> 19 19 #include <linux/tick.h> 20 + #include <linux/cpu.h> 20 21 21 22 #include <asm/io.h> 22 23 #include <linux/uaccess.h> ··· 68 67 struct cpuidle_device *dev) 69 68 { 70 69 struct ladder_device *ldev = this_cpu_ptr(&ladder_devices); 70 + struct device *device = get_cpu_device(dev->cpu); 71 71 struct ladder_device_state *last_state; 72 72 int last_residency, last_idx = ldev->last_state_idx; 73 73 int first_idx = drv->states[0].flags & CPUIDLE_FLAG_POLLING ? 1 : 0; 74 74 int latency_req = pm_qos_request(PM_QOS_CPU_DMA_LATENCY); 75 + int resume_latency = dev_pm_qos_raw_read_value(device); 76 + 77 + if (resume_latency < latency_req && 78 + resume_latency != PM_QOS_RESUME_LATENCY_NO_CONSTRAINT) 79 + latency_req = resume_latency; 75 80 76 81 /* Special case when user has set very strict latency requirement */ 77 82 if (unlikely(latency_req == 0)) {
+17 -6
drivers/idle/intel_idle.c
··· 913 913 struct cpuidle_state *state = &drv->states[index]; 914 914 unsigned long eax = flg2MWAIT(state->flags); 915 915 unsigned int cstate; 916 + bool uninitialized_var(tick); 916 917 int cpu = smp_processor_id(); 917 - 918 - cstate = (((eax) >> MWAIT_SUBSTATE_SIZE) & MWAIT_CSTATE_MASK) + 1; 919 918 920 919 /* 921 920 * leave_mm() to avoid costly and often unnecessary wakeups ··· 923 924 if (state->flags & CPUIDLE_FLAG_TLB_FLUSHED) 924 925 leave_mm(cpu); 925 926 926 - if (!(lapic_timer_reliable_states & (1 << (cstate)))) 927 - tick_broadcast_enter(); 927 + if (!static_cpu_has(X86_FEATURE_ARAT)) { 928 + cstate = (((eax) >> MWAIT_SUBSTATE_SIZE) & 929 + MWAIT_CSTATE_MASK) + 1; 930 + tick = false; 931 + if (!(lapic_timer_reliable_states & (1 << (cstate)))) { 932 + tick = true; 933 + tick_broadcast_enter(); 934 + } 935 + } 928 936 929 937 mwait_idle_with_hints(eax, ecx); 930 938 931 - if (!(lapic_timer_reliable_states & (1 << (cstate)))) 939 + if (!static_cpu_has(X86_FEATURE_ARAT) && tick) 932 940 tick_broadcast_exit(); 933 941 934 942 return index; ··· 1067 1061 }; 1068 1062 1069 1063 #define ICPU(model, cpu) \ 1070 - { X86_VENDOR_INTEL, 6, model, X86_FEATURE_MWAIT, (unsigned long)&cpu } 1064 + { X86_VENDOR_INTEL, 6, model, X86_FEATURE_ANY, (unsigned long)&cpu } 1071 1065 1072 1066 static const struct x86_cpu_id intel_idle_ids[] __initconst = { 1073 1067 ICPU(INTEL_FAM6_NEHALEM_EP, idle_cpu_nehalem), ··· 1128 1122 boot_cpu_data.x86 == 6) 1129 1123 pr_debug("does not run on family %d model %d\n", 1130 1124 boot_cpu_data.x86, boot_cpu_data.x86_model); 1125 + return -ENODEV; 1126 + } 1127 + 1128 + if (!boot_cpu_has(X86_FEATURE_MWAIT)) { 1129 + pr_debug("Please enable MWAIT in BIOS SETUP\n"); 1131 1130 return -ENODEV; 1132 1131 } 1133 1132