diff options
| -rw-r--r-- | arch/sparc64/kernel/smp.c | 39 |
1 files changed, 21 insertions, 18 deletions
diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c index 063668feab1e..868625e3b661 100644 --- a/arch/sparc64/kernel/smp.c +++ b/arch/sparc64/kernel/smp.c | |||
| @@ -459,13 +459,13 @@ again: | |||
| 459 | } | 459 | } |
| 460 | } | 460 | } |
| 461 | 461 | ||
| 462 | static inline void spitfire_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t mask) | 462 | static inline void spitfire_xcall_deliver(u64 data0, u64 data1, u64 data2, const cpumask_t *mask) |
| 463 | { | 463 | { |
| 464 | u64 pstate; | 464 | u64 pstate; |
| 465 | int i; | 465 | int i; |
| 466 | 466 | ||
| 467 | __asm__ __volatile__("rdpr %%pstate, %0" : "=r" (pstate)); | 467 | __asm__ __volatile__("rdpr %%pstate, %0" : "=r" (pstate)); |
| 468 | for_each_cpu_mask(i, mask) | 468 | for_each_cpu_mask_nr(i, *mask) |
| 469 | spitfire_xcall_helper(data0, data1, data2, pstate, i); | 469 | spitfire_xcall_helper(data0, data1, data2, pstate, i); |
| 470 | } | 470 | } |
| 471 | 471 | ||
| @@ -473,14 +473,17 @@ static inline void spitfire_xcall_deliver(u64 data0, u64 data1, u64 data2, cpuma | |||
| 473 | * packet, but we have no use for that. However we do take advantage of | 473 | * packet, but we have no use for that. However we do take advantage of |
| 474 | * the new pipelining feature (ie. dispatch to multiple cpus simultaneously). | 474 | * the new pipelining feature (ie. dispatch to multiple cpus simultaneously). |
| 475 | */ | 475 | */ |
| 476 | static void cheetah_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t mask) | 476 | static void cheetah_xcall_deliver(u64 data0, u64 data1, u64 data2, const cpumask_t *mask_p) |
| 477 | { | 477 | { |
| 478 | u64 pstate, ver, busy_mask; | 478 | u64 pstate, ver, busy_mask; |
| 479 | int nack_busy_id, is_jbus, need_more; | 479 | int nack_busy_id, is_jbus, need_more; |
| 480 | cpumask_t mask; | ||
| 480 | 481 | ||
| 481 | if (cpus_empty(mask)) | 482 | if (cpus_empty(*mask_p)) |
| 482 | return; | 483 | return; |
| 483 | 484 | ||
| 485 | mask = *mask_p; | ||
| 486 | |||
| 484 | /* Unfortunately, someone at Sun had the brilliant idea to make the | 487 | /* Unfortunately, someone at Sun had the brilliant idea to make the |
| 485 | * busy/nack fields hard-coded by ITID number for this Ultra-III | 488 | * busy/nack fields hard-coded by ITID number for this Ultra-III |
| 486 | * derivative processor. | 489 | * derivative processor. |
| @@ -511,7 +514,7 @@ retry: | |||
| 511 | { | 514 | { |
| 512 | int i; | 515 | int i; |
| 513 | 516 | ||
| 514 | for_each_cpu_mask(i, mask) { | 517 | for_each_cpu_mask_nr(i, mask) { |
| 515 | u64 target = (i << 14) | 0x70; | 518 | u64 target = (i << 14) | 0x70; |
| 516 | 519 | ||
| 517 | if (is_jbus) { | 520 | if (is_jbus) { |
| @@ -550,7 +553,7 @@ retry: | |||
| 550 | : : "r" (pstate)); | 553 | : : "r" (pstate)); |
| 551 | if (unlikely(need_more)) { | 554 | if (unlikely(need_more)) { |
| 552 | int i, cnt = 0; | 555 | int i, cnt = 0; |
| 553 | for_each_cpu_mask(i, mask) { | 556 | for_each_cpu_mask_nr(i, mask) { |
| 554 | cpu_clear(i, mask); | 557 | cpu_clear(i, mask); |
| 555 | cnt++; | 558 | cnt++; |
| 556 | if (cnt == 32) | 559 | if (cnt == 32) |
| @@ -584,7 +587,7 @@ retry: | |||
| 584 | /* Clear out the mask bits for cpus which did not | 587 | /* Clear out the mask bits for cpus which did not |
| 585 | * NACK us. | 588 | * NACK us. |
| 586 | */ | 589 | */ |
| 587 | for_each_cpu_mask(i, mask) { | 590 | for_each_cpu_mask_nr(i, mask) { |
| 588 | u64 check_mask; | 591 | u64 check_mask; |
| 589 | 592 | ||
| 590 | if (is_jbus) | 593 | if (is_jbus) |
| @@ -605,16 +608,16 @@ retry: | |||
| 605 | } | 608 | } |
| 606 | 609 | ||
| 607 | /* Multi-cpu list version. */ | 610 | /* Multi-cpu list version. */ |
| 608 | static void hypervisor_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t mask) | 611 | static void hypervisor_xcall_deliver(u64 data0, u64 data1, u64 data2, const cpumask_t *mask) |
| 609 | { | 612 | { |
| 613 | int cnt, retries, this_cpu, prev_sent, i; | ||
| 614 | unsigned long flags, status; | ||
| 615 | cpumask_t error_mask; | ||
| 610 | struct trap_per_cpu *tb; | 616 | struct trap_per_cpu *tb; |
| 611 | u16 *cpu_list; | 617 | u16 *cpu_list; |
| 612 | u64 *mondo; | 618 | u64 *mondo; |
| 613 | cpumask_t error_mask; | ||
| 614 | unsigned long flags, status; | ||
| 615 | int cnt, retries, this_cpu, prev_sent, i; | ||
| 616 | 619 | ||
| 617 | if (cpus_empty(mask)) | 620 | if (cpus_empty(*mask)) |
| 618 | return; | 621 | return; |
| 619 | 622 | ||
| 620 | /* We have to do this whole thing with interrupts fully disabled. | 623 | /* We have to do this whole thing with interrupts fully disabled. |
| @@ -642,7 +645,7 @@ static void hypervisor_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t | |||
| 642 | 645 | ||
| 643 | /* Setup the initial cpu list. */ | 646 | /* Setup the initial cpu list. */ |
| 644 | cnt = 0; | 647 | cnt = 0; |
| 645 | for_each_cpu_mask(i, mask) | 648 | for_each_cpu_mask_nr(i, *mask) |
| 646 | cpu_list[cnt++] = i; | 649 | cpu_list[cnt++] = i; |
| 647 | 650 | ||
| 648 | cpus_clear(error_mask); | 651 | cpus_clear(error_mask); |
| @@ -729,7 +732,7 @@ fatal_mondo_cpu_error: | |||
| 729 | "were in error state\n", | 732 | "were in error state\n", |
| 730 | this_cpu); | 733 | this_cpu); |
| 731 | printk(KERN_CRIT "CPU[%d]: Error mask [ ", this_cpu); | 734 | printk(KERN_CRIT "CPU[%d]: Error mask [ ", this_cpu); |
| 732 | for_each_cpu_mask(i, error_mask) | 735 | for_each_cpu_mask_nr(i, error_mask) |
| 733 | printk("%d ", i); | 736 | printk("%d ", i); |
| 734 | printk("]\n"); | 737 | printk("]\n"); |
| 735 | return; | 738 | return; |
| @@ -756,7 +759,7 @@ dump_cpu_list_and_out: | |||
| 756 | printk("]\n"); | 759 | printk("]\n"); |
| 757 | } | 760 | } |
| 758 | 761 | ||
| 759 | static void (*xcall_deliver)(u64, u64, u64, cpumask_t); | 762 | static void (*xcall_deliver)(u64, u64, u64, const cpumask_t *); |
| 760 | 763 | ||
| 761 | /* Send cross call to all processors mentioned in MASK | 764 | /* Send cross call to all processors mentioned in MASK |
| 762 | * except self. | 765 | * except self. |
| @@ -769,7 +772,7 @@ static void smp_cross_call_masked(unsigned long *func, u32 ctx, u64 data1, u64 d | |||
| 769 | cpus_and(mask, mask, cpu_online_map); | 772 | cpus_and(mask, mask, cpu_online_map); |
| 770 | cpu_clear(this_cpu, mask); | 773 | cpu_clear(this_cpu, mask); |
| 771 | 774 | ||
| 772 | xcall_deliver(data0, data1, data2, mask); | 775 | xcall_deliver(data0, data1, data2, &mask); |
| 773 | /* NOTE: Caller runs local copy on master. */ | 776 | /* NOTE: Caller runs local copy on master. */ |
| 774 | 777 | ||
| 775 | put_cpu(); | 778 | put_cpu(); |
| @@ -903,7 +906,7 @@ void smp_flush_dcache_page_impl(struct page *page, int cpu) | |||
| 903 | } | 906 | } |
| 904 | if (data0) { | 907 | if (data0) { |
| 905 | xcall_deliver(data0, __pa(pg_addr), | 908 | xcall_deliver(data0, __pa(pg_addr), |
| 906 | (u64) pg_addr, mask); | 909 | (u64) pg_addr, &mask); |
| 907 | #ifdef CONFIG_DEBUG_DCFLUSH | 910 | #ifdef CONFIG_DEBUG_DCFLUSH |
| 908 | atomic_inc(&dcpage_flushes_xcall); | 911 | atomic_inc(&dcpage_flushes_xcall); |
| 909 | #endif | 912 | #endif |
| @@ -945,7 +948,7 @@ void flush_dcache_page_all(struct mm_struct *mm, struct page *page) | |||
| 945 | } | 948 | } |
| 946 | if (data0) { | 949 | if (data0) { |
| 947 | xcall_deliver(data0, __pa(pg_addr), | 950 | xcall_deliver(data0, __pa(pg_addr), |
| 948 | (u64) pg_addr, mask); | 951 | (u64) pg_addr, &mask); |
| 949 | #ifdef CONFIG_DEBUG_DCFLUSH | 952 | #ifdef CONFIG_DEBUG_DCFLUSH |
| 950 | atomic_inc(&dcpage_flushes_xcall); | 953 | atomic_inc(&dcpage_flushes_xcall); |
| 951 | #endif | 954 | #endif |
