x86: Fix UV BAU activation descriptor init
The UV tlb shootdown code has a serious initialization error. An array of structures [32*8] is initialized as if it were [32]. The array is indexed by (cpu number on the blade)*8, so the short initialization works for up to 4 cpus on a blade. But above that, we provide an invalid opcode to the hub's broadcast assist unit. This patch changes the allocation of the array to use its symbolic dimensions for better clarity. And initializes all 32*8 entries. Shortened 'UV_ACTIVATION_DESCRIPTOR_SIZE' to 'UV_ADP_SIZE' per Ingo's recommendation. Tested on the UV simulator. Signed-off-by: Cliff Wickman <cpw@sgi.com> Cc: <stable@kernel.org> LKML-Reference: <E1M6lZR-0007kV-Aq@eag09.americas.sgi.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:

committato da
Ingo Molnar

parent
d9244b5d2f
commit
0e2595cdfd
@@ -715,7 +715,12 @@ uv_activation_descriptor_init(int node, int pnode)
|
||||
struct bau_desc *adp;
|
||||
struct bau_desc *ad2;
|
||||
|
||||
adp = (struct bau_desc *)kmalloc_node(16384, GFP_KERNEL, node);
|
||||
/*
|
||||
* each bau_desc is 64 bytes; there are 8 (UV_ITEMS_PER_DESCRIPTOR)
|
||||
* per cpu; and up to 32 (UV_ADP_SIZE) cpu's per blade
|
||||
*/
|
||||
adp = (struct bau_desc *)kmalloc_node(sizeof(struct bau_desc)*
|
||||
UV_ADP_SIZE*UV_ITEMS_PER_DESCRIPTOR, GFP_KERNEL, node);
|
||||
BUG_ON(!adp);
|
||||
|
||||
pa = uv_gpa(adp); /* need the real nasid*/
|
||||
@@ -729,7 +734,13 @@ uv_activation_descriptor_init(int node, int pnode)
|
||||
(n << UV_DESC_BASE_PNODE_SHIFT | m));
|
||||
}
|
||||
|
||||
for (i = 0, ad2 = adp; i < UV_ACTIVATION_DESCRIPTOR_SIZE; i++, ad2++) {
|
||||
/*
|
||||
* initializing all 8 (UV_ITEMS_PER_DESCRIPTOR) descriptors for each
|
||||
* cpu even though we only use the first one; one descriptor can
|
||||
* describe a broadcast to 256 nodes.
|
||||
*/
|
||||
for (i = 0, ad2 = adp; i < (UV_ADP_SIZE*UV_ITEMS_PER_DESCRIPTOR);
|
||||
i++, ad2++) {
|
||||
memset(ad2, 0, sizeof(struct bau_desc));
|
||||
ad2->header.sw_ack_flag = 1;
|
||||
/*
|
||||
|
Fai riferimento in un nuovo problema
Block a user