struct bau_control      *uvhub_master;
        struct bau_control      *socket_master;
        struct ptc_stats        *statp;
+       cpumask_t               *cpumask;
        unsigned long           timeout_interval;
        unsigned long           set_bau_on_time;
        atomic_t                active_descriptor_count;
 
        int pnode;
        int apnode;
        int maskbits;
-       cpumask_t mask;
        int sender = bcp->cpu;
+       cpumask_t *mask = bcp->uvhub_master->cpumask;
        struct bau_control *smaster = bcp->socket_master;
        struct reset_args reset_args;
 
        reset_args.sender = sender;
-       cpus_clear(mask);
+       cpus_clear(*mask);
        /* find a single cpu for each uvhub in this distribution mask */
        maskbits = sizeof(struct pnmask) * BITSPERBYTE;
        /* each bit is a pnode relative to the partition base pnode */
                        continue;
                apnode = pnode + bcp->partition_base_pnode;
                cpu = pnode_to_first_cpu(apnode, smaster);
-               cpu_set(cpu, mask);
+               cpu_set(cpu, *mask);
        }
 
        /* IPI all cpus; preemption is already disabled */
-       smp_call_function_many(&mask, do_reset, (void *)&reset_args, 1);
+       smp_call_function_many(mask, do_reset, (void *)&reset_args, 1);
        return;
 }
 
        }
 }
 
+/*
+ * Each uvhub is to get a local cpumask.
+ */
+static void make_per_hub_cpumask(struct bau_control *hmaster)
+{
+       int sz = sizeof(cpumask_t);
+
+       hmaster->cpumask = kzalloc_node(sz, GFP_KERNEL, hmaster->osnode);
+}
+
 /*
  * Initialize all the per_cpu information for the cpu's on a given socket,
  * given what has been gathered into the socket_desc struct.
                        socket++;
                        socket_mask = (socket_mask >> 1);
                }
+               make_per_hub_cpumask(hmaster);
        }
        return 0;
 }