diff options
Diffstat (limited to 'arch/x86/kernel/tlb_uv.c')
| -rw-r--r-- | arch/x86/kernel/tlb_uv.c | 15 | 
1 files changed, 13 insertions, 2 deletions
diff --git a/arch/x86/kernel/tlb_uv.c b/arch/x86/kernel/tlb_uv.c index 8c7b03b0cfc..124d40c575d 100644 --- a/arch/x86/kernel/tlb_uv.c +++ b/arch/x86/kernel/tlb_uv.c @@ -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;  		/*  |