diff options
| -rw-r--r-- | drivers/acpi/osl.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index 71670719d61a..5691f165a952 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c | |||
| @@ -189,11 +189,36 @@ acpi_status __init acpi_os_initialize(void) | |||
| 189 | return AE_OK; | 189 | return AE_OK; |
| 190 | } | 190 | } |
| 191 | 191 | ||
| 192 | static void bind_to_cpu0(struct work_struct *work) | ||
| 193 | { | ||
| 194 | set_cpus_allowed(current, cpumask_of_cpu(0)); | ||
| 195 | kfree(work); | ||
| 196 | } | ||
| 197 | |||
| 198 | static void bind_workqueue(struct workqueue_struct *wq) | ||
| 199 | { | ||
| 200 | struct work_struct *work; | ||
| 201 | |||
| 202 | work = kzalloc(sizeof(struct work_struct), GFP_KERNEL); | ||
| 203 | INIT_WORK(work, bind_to_cpu0); | ||
| 204 | queue_work(wq, work); | ||
| 205 | } | ||
| 206 | |||
| 192 | acpi_status acpi_os_initialize1(void) | 207 | acpi_status acpi_os_initialize1(void) |
| 193 | { | 208 | { |
| 209 | /* | ||
| 210 | * On some machines, a software-initiated SMI causes corruption unless | ||
| 211 | * the SMI runs on CPU 0. An SMI can be initiated by any AML, but | ||
| 212 | * typically it's done in GPE-related methods that are run via | ||
| 213 | * workqueues, so we can avoid the known corruption cases by binding | ||
| 214 | * the workqueues to CPU 0. | ||
| 215 | */ | ||
| 194 | kacpid_wq = create_singlethread_workqueue("kacpid"); | 216 | kacpid_wq = create_singlethread_workqueue("kacpid"); |
| 217 | bind_workqueue(kacpid_wq); | ||
| 195 | kacpi_notify_wq = create_singlethread_workqueue("kacpi_notify"); | 218 | kacpi_notify_wq = create_singlethread_workqueue("kacpi_notify"); |
| 219 | bind_workqueue(kacpi_notify_wq); | ||
| 196 | kacpi_hotplug_wq = create_singlethread_workqueue("kacpi_hotplug"); | 220 | kacpi_hotplug_wq = create_singlethread_workqueue("kacpi_hotplug"); |
| 221 | bind_workqueue(kacpi_hotplug_wq); | ||
| 197 | BUG_ON(!kacpid_wq); | 222 | BUG_ON(!kacpid_wq); |
| 198 | BUG_ON(!kacpi_notify_wq); | 223 | BUG_ON(!kacpi_notify_wq); |
| 199 | BUG_ON(!kacpi_hotplug_wq); | 224 | BUG_ON(!kacpi_hotplug_wq); |
