diff options
| -rw-r--r-- | arch/x86/kernel/tlb_uv.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/arch/x86/kernel/tlb_uv.c b/arch/x86/kernel/tlb_uv.c index fced96e94e22..98307f953492 100644 --- a/arch/x86/kernel/tlb_uv.c +++ b/arch/x86/kernel/tlb_uv.c | |||
| @@ -25,6 +25,8 @@ static int uv_bau_retry_limit __read_mostly; | |||
| 25 | 25 | ||
| 26 | /* position of pnode (which is nasid>>1): */ | 26 | /* position of pnode (which is nasid>>1): */ |
| 27 | static int uv_nshift __read_mostly; | 27 | static int uv_nshift __read_mostly; |
| 28 | /* base pnode in this partition */ | ||
| 29 | static int uv_partition_base_pnode __read_mostly; | ||
| 28 | 30 | ||
| 29 | static unsigned long uv_mmask __read_mostly; | 31 | static unsigned long uv_mmask __read_mostly; |
| 30 | 32 | ||
| @@ -43,7 +45,7 @@ static int __init blade_to_first_node(int blade) | |||
| 43 | if (blade == b) | 45 | if (blade == b) |
| 44 | return node; | 46 | return node; |
| 45 | } | 47 | } |
| 46 | BUG(); | 48 | return -1; /* shouldn't happen */ |
| 47 | } | 49 | } |
| 48 | 50 | ||
| 49 | /* | 51 | /* |
| @@ -359,7 +361,8 @@ const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask, | |||
| 359 | locals++; | 361 | locals++; |
| 360 | continue; | 362 | continue; |
| 361 | } | 363 | } |
| 362 | bau_node_set(pnode, &bau_desc->distribution); | 364 | bau_node_set(pnode - uv_partition_base_pnode, |
| 365 | &bau_desc->distribution); | ||
| 363 | i++; | 366 | i++; |
| 364 | } | 367 | } |
| 365 | if (i == 0) { | 368 | if (i == 0) { |
| @@ -728,7 +731,12 @@ uv_activation_descriptor_init(int node, int pnode) | |||
| 728 | for (i = 0, ad2 = adp; i < UV_ACTIVATION_DESCRIPTOR_SIZE; i++, ad2++) { | 731 | for (i = 0, ad2 = adp; i < UV_ACTIVATION_DESCRIPTOR_SIZE; i++, ad2++) { |
| 729 | memset(ad2, 0, sizeof(struct bau_desc)); | 732 | memset(ad2, 0, sizeof(struct bau_desc)); |
| 730 | ad2->header.sw_ack_flag = 1; | 733 | ad2->header.sw_ack_flag = 1; |
| 731 | ad2->header.base_dest_nodeid = uv_cpu_to_pnode(0); | 734 | /* |
| 735 | * base_dest_nodeid is the first node in the partition, so | ||
| 736 | * the bit map will indicate partition-relative node numbers. | ||
| 737 | * note that base_dest_nodeid is actually a nasid. | ||
| 738 | */ | ||
| 739 | ad2->header.base_dest_nodeid = uv_partition_base_pnode << 1; | ||
| 732 | ad2->header.command = UV_NET_ENDPOINT_INTD; | 740 | ad2->header.command = UV_NET_ENDPOINT_INTD; |
| 733 | ad2->header.int_both = 1; | 741 | ad2->header.int_both = 1; |
| 734 | /* | 742 | /* |
| @@ -825,6 +833,11 @@ static int __init uv_bau_init(void) | |||
| 825 | kmalloc(nblades * sizeof(struct bau_control *), GFP_KERNEL); | 833 | kmalloc(nblades * sizeof(struct bau_control *), GFP_KERNEL); |
| 826 | BUG_ON(!uv_bau_table_bases); | 834 | BUG_ON(!uv_bau_table_bases); |
| 827 | 835 | ||
| 836 | uv_partition_base_pnode = 0x7fffffff; | ||
| 837 | for (blade = 0; blade < nblades; blade++) | ||
| 838 | if (uv_blade_nr_possible_cpus(blade) && | ||
| 839 | (uv_blade_to_pnode(blade) < uv_partition_base_pnode)) | ||
| 840 | uv_partition_base_pnode = uv_blade_to_pnode(blade); | ||
| 828 | for (blade = 0; blade < nblades; blade++) | 841 | for (blade = 0; blade < nblades; blade++) |
| 829 | if (uv_blade_nr_possible_cpus(blade)) | 842 | if (uv_blade_nr_possible_cpus(blade)) |
| 830 | uv_init_blade(blade); | 843 | uv_init_blade(blade); |
