diff options
| -rw-r--r-- | arch/x86/kernel/acpi/boot.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index fd24c55e4ae2..29dc0c89d4af 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
| @@ -538,9 +538,10 @@ static int __cpuinit _acpi_map_lsapic(acpi_handle handle, int *pcpu) | |||
| 538 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; | 538 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; |
| 539 | union acpi_object *obj; | 539 | union acpi_object *obj; |
| 540 | struct acpi_madt_local_apic *lapic; | 540 | struct acpi_madt_local_apic *lapic; |
| 541 | cpumask_t tmp_map, new_map; | 541 | cpumask_var_t tmp_map, new_map; |
| 542 | u8 physid; | 542 | u8 physid; |
| 543 | int cpu; | 543 | int cpu; |
| 544 | int retval = -ENOMEM; | ||
| 544 | 545 | ||
| 545 | if (ACPI_FAILURE(acpi_evaluate_object(handle, "_MAT", NULL, &buffer))) | 546 | if (ACPI_FAILURE(acpi_evaluate_object(handle, "_MAT", NULL, &buffer))) |
| 546 | return -EINVAL; | 547 | return -EINVAL; |
| @@ -569,23 +570,37 @@ static int __cpuinit _acpi_map_lsapic(acpi_handle handle, int *pcpu) | |||
| 569 | buffer.length = ACPI_ALLOCATE_BUFFER; | 570 | buffer.length = ACPI_ALLOCATE_BUFFER; |
| 570 | buffer.pointer = NULL; | 571 | buffer.pointer = NULL; |
| 571 | 572 | ||
| 572 | tmp_map = cpu_present_map; | 573 | if (!alloc_cpumask_var(&tmp_map, GFP_KERNEL)) |
| 574 | goto out; | ||
| 575 | |||
| 576 | if (!alloc_cpumask_var(&new_map, GFP_KERNEL)) | ||
| 577 | goto free_tmp_map; | ||
| 578 | |||
| 579 | cpumask_copy(tmp_map, cpu_present_mask); | ||
| 573 | acpi_register_lapic(physid, lapic->lapic_flags & ACPI_MADT_ENABLED); | 580 | acpi_register_lapic(physid, lapic->lapic_flags & ACPI_MADT_ENABLED); |
| 574 | 581 | ||
| 575 | /* | 582 | /* |
| 576 | * If mp_register_lapic successfully generates a new logical cpu | 583 | * If mp_register_lapic successfully generates a new logical cpu |
| 577 | * number, then the following will get us exactly what was mapped | 584 | * number, then the following will get us exactly what was mapped |
| 578 | */ | 585 | */ |
| 579 | cpus_andnot(new_map, cpu_present_map, tmp_map); | 586 | cpumask_andnot(new_map, cpu_present_mask, tmp_map); |
| 580 | if (cpus_empty(new_map)) { | 587 | if (cpumask_empty(new_map)) { |
| 581 | printk ("Unable to map lapic to logical cpu number\n"); | 588 | printk ("Unable to map lapic to logical cpu number\n"); |
| 582 | return -EINVAL; | 589 | retval = -EINVAL; |
| 590 | goto free_new_map; | ||
| 583 | } | 591 | } |
| 584 | 592 | ||
| 585 | cpu = first_cpu(new_map); | 593 | cpu = cpumask_first(new_map); |
| 586 | 594 | ||
| 587 | *pcpu = cpu; | 595 | *pcpu = cpu; |
| 588 | return 0; | 596 | retval = 0; |
| 597 | |||
| 598 | free_new_map: | ||
| 599 | free_cpumask_var(new_map); | ||
| 600 | free_tmp_map: | ||
| 601 | free_cpumask_var(tmp_map); | ||
| 602 | out: | ||
| 603 | return retval; | ||
| 589 | } | 604 | } |
| 590 | 605 | ||
| 591 | /* wrapper to silence section mismatch warning */ | 606 | /* wrapper to silence section mismatch warning */ |
