|
@@ -1484,15 +1484,16 @@ calculate_destination_timeout(void)
|
|
|
/*
|
|
|
* initialize the bau_control structure for each cpu
|
|
|
*/
|
|
|
-static void uv_init_per_cpu(int nuvhubs)
|
|
|
+static void __init uv_init_per_cpu(int nuvhubs)
|
|
|
{
|
|
|
int i;
|
|
|
int cpu;
|
|
|
int pnode;
|
|
|
int uvhub;
|
|
|
+ int have_hmaster;
|
|
|
short socket = 0;
|
|
|
unsigned short socket_mask;
|
|
|
- unsigned int uvhub_mask;
|
|
|
+ unsigned char *uvhub_mask;
|
|
|
struct bau_control *bcp;
|
|
|
struct uvhub_desc *bdp;
|
|
|
struct socket_desc *sdp;
|
|
@@ -1516,28 +1517,29 @@ static void uv_init_per_cpu(int nuvhubs)
|
|
|
uvhub_descs = (struct uvhub_desc *)
|
|
|
kmalloc(nuvhubs * sizeof(struct uvhub_desc), GFP_KERNEL);
|
|
|
memset(uvhub_descs, 0, nuvhubs * sizeof(struct uvhub_desc));
|
|
|
+ uvhub_mask = kzalloc((nuvhubs+7)/8, GFP_KERNEL);
|
|
|
for_each_present_cpu(cpu) {
|
|
|
bcp = &per_cpu(bau_control, cpu);
|
|
|
memset(bcp, 0, sizeof(struct bau_control));
|
|
|
pnode = uv_cpu_hub_info(cpu)->pnode;
|
|
|
uvhub = uv_cpu_hub_info(cpu)->numa_blade_id;
|
|
|
- uvhub_mask |= (1 << uvhub);
|
|
|
+ *(uvhub_mask + (uvhub/8)) |= (1 << (uvhub%8));
|
|
|
bdp = &uvhub_descs[uvhub];
|
|
|
bdp->num_cpus++;
|
|
|
bdp->uvhub = uvhub;
|
|
|
bdp->pnode = pnode;
|
|
|
/* kludge: 'assuming' one node per socket, and assuming that
|
|
|
disabling a socket just leaves a gap in node numbers */
|
|
|
- socket = (cpu_to_node(cpu) & 1);;
|
|
|
+ socket = (cpu_to_node(cpu) & 1);
|
|
|
bdp->socket_mask |= (1 << socket);
|
|
|
sdp = &bdp->socket[socket];
|
|
|
sdp->cpu_number[sdp->num_cpus] = cpu;
|
|
|
sdp->num_cpus++;
|
|
|
}
|
|
|
- uvhub = 0;
|
|
|
- while (uvhub_mask) {
|
|
|
- if (!(uvhub_mask & 1))
|
|
|
- goto nexthub;
|
|
|
+ for (uvhub = 0; uvhub < nuvhubs; uvhub++) {
|
|
|
+ if (!(*(uvhub_mask + (uvhub/8)) & (1 << (uvhub%8))))
|
|
|
+ continue;
|
|
|
+ have_hmaster = 0;
|
|
|
bdp = &uvhub_descs[uvhub];
|
|
|
socket_mask = bdp->socket_mask;
|
|
|
socket = 0;
|
|
@@ -1551,8 +1553,10 @@ static void uv_init_per_cpu(int nuvhubs)
|
|
|
bcp->cpu = cpu;
|
|
|
if (i == 0) {
|
|
|
smaster = bcp;
|
|
|
- if (socket == 0)
|
|
|
+ if (!have_hmaster) {
|
|
|
+ have_hmaster++;
|
|
|
hmaster = bcp;
|
|
|
+ }
|
|
|
}
|
|
|
bcp->cpus_in_uvhub = bdp->num_cpus;
|
|
|
bcp->cpus_in_socket = sdp->num_cpus;
|
|
@@ -1566,11 +1570,9 @@ nextsocket:
|
|
|
socket++;
|
|
|
socket_mask = (socket_mask >> 1);
|
|
|
}
|
|
|
-nexthub:
|
|
|
- uvhub++;
|
|
|
- uvhub_mask = (uvhub_mask >> 1);
|
|
|
}
|
|
|
kfree(uvhub_descs);
|
|
|
+ kfree(uvhub_mask);
|
|
|
for_each_present_cpu(cpu) {
|
|
|
bcp = &per_cpu(bau_control, cpu);
|
|
|
bcp->baudisabled = 0;
|