Commit 4ea3c51d authored by Cliff Wickman's avatar Cliff Wickman Committed by Ingo Molnar

x86: UV BAU distribution and payload MMRs

This patch correctly sets BAU memory mapped registers to point
to the sending activation descriptor table and target payload table.

The "Broadcast Assist Unit" is used for TLB shootdown in UV.

The memory mapped registers that point to sending and receiving
memory structures contain node numbers.

In one case the __pa() function did not provide the node id of
memory on blade zero in configurations where that id is nonzero.
In another case, it was assumed that memory was allocated on
the local node.  That assumption is not true in a configuration
in which the node has no memory.

Tested on the UV hardware simulator.

[ Impact: fix possible runtime crash due to incorrect TLB logic ]
Signed-off-by: default avatarCliff Wickman <cpw@sgi.com>
LKML-Reference: <E1LuR5Z-0007An-B8@eag09.americas.sgi.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 94ca8e48
...@@ -717,7 +717,7 @@ uv_activation_descriptor_init(int node, int pnode) ...@@ -717,7 +717,7 @@ uv_activation_descriptor_init(int node, int pnode)
adp = (struct bau_desc *)kmalloc_node(16384, GFP_KERNEL, node); adp = (struct bau_desc *)kmalloc_node(16384, GFP_KERNEL, node);
BUG_ON(!adp); BUG_ON(!adp);
pa = __pa((unsigned long)adp); pa = uv_gpa(adp); /* need the real nasid*/
n = pa >> uv_nshift; n = pa >> uv_nshift;
m = pa & uv_mmask; m = pa & uv_mmask;
...@@ -754,6 +754,8 @@ static struct bau_payload_queue_entry * __init ...@@ -754,6 +754,8 @@ static struct bau_payload_queue_entry * __init
uv_payload_queue_init(int node, int pnode, struct bau_control *bau_tablesp) uv_payload_queue_init(int node, int pnode, struct bau_control *bau_tablesp)
{ {
struct bau_payload_queue_entry *pqp; struct bau_payload_queue_entry *pqp;
unsigned long pa;
int pn;
char *cp; char *cp;
pqp = (struct bau_payload_queue_entry *) kmalloc_node( pqp = (struct bau_payload_queue_entry *) kmalloc_node(
...@@ -764,10 +766,14 @@ uv_payload_queue_init(int node, int pnode, struct bau_control *bau_tablesp) ...@@ -764,10 +766,14 @@ uv_payload_queue_init(int node, int pnode, struct bau_control *bau_tablesp)
cp = (char *)pqp + 31; cp = (char *)pqp + 31;
pqp = (struct bau_payload_queue_entry *)(((unsigned long)cp >> 5) << 5); pqp = (struct bau_payload_queue_entry *)(((unsigned long)cp >> 5) << 5);
bau_tablesp->va_queue_first = pqp; bau_tablesp->va_queue_first = pqp;
/*
* need the pnode of where the memory was really allocated
*/
pa = uv_gpa(pqp);
pn = pa >> uv_nshift;
uv_write_global_mmr64(pnode, uv_write_global_mmr64(pnode,
UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST, UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST,
((unsigned long)pnode << ((unsigned long)pn << UV_PAYLOADQ_PNODE_SHIFT) |
UV_PAYLOADQ_PNODE_SHIFT) |
uv_physnodeaddr(pqp)); uv_physnodeaddr(pqp));
uv_write_global_mmr64(pnode, UVH_LB_BAU_INTD_PAYLOAD_QUEUE_TAIL, uv_write_global_mmr64(pnode, UVH_LB_BAU_INTD_PAYLOAD_QUEUE_TAIL,
uv_physnodeaddr(pqp)); uv_physnodeaddr(pqp));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment