x86: change flush_tlb_others to take a const struct cpumask
Impact: reduce stack usage, use new cpumask API. This is made a little more tricky by uv_flush_tlb_others which actually alters its argument, for an IPI to be sent to the remaining cpus in the mask. I solve this by allocating a cpumask_var_t for this case and falling back to IPI should this fail. To eliminate temporaries in the caller, all flush_tlb_others implementations now do the this-cpu-elimination step themselves. Note also the curious "cpus_or(f->flush_cpumask, cpumask, f->flush_cpumask)" which has been there since pre-git and yet f->flush_cpumask is always zero at this point. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Signed-off-by: Mike Travis <travis@sgi.com>
This commit is contained in:
committed by
Ingo Molnar
parent
802bf931f2
commit
4595f9620c
@@ -212,11 +212,11 @@ static int uv_wait_completion(struct bau_desc *bau_desc,
|
||||
* The cpumaskp mask contains the cpus the broadcast was sent to.
|
||||
*
|
||||
* Returns 1 if all remote flushing was done. The mask is zeroed.
|
||||
* Returns 0 if some remote flushing remains to be done. The mask is left
|
||||
* unchanged.
|
||||
* Returns 0 if some remote flushing remains to be done. The mask will have
|
||||
* some bits still set.
|
||||
*/
|
||||
int uv_flush_send_and_wait(int cpu, int this_blade, struct bau_desc *bau_desc,
|
||||
cpumask_t *cpumaskp)
|
||||
struct cpumask *cpumaskp)
|
||||
{
|
||||
int completion_status = 0;
|
||||
int right_shift;
|
||||
@@ -263,13 +263,13 @@ int uv_flush_send_and_wait(int cpu, int this_blade, struct bau_desc *bau_desc,
|
||||
* Success, so clear the remote cpu's from the mask so we don't
|
||||
* use the IPI method of shootdown on them.
|
||||
*/
|
||||
for_each_cpu_mask(bit, *cpumaskp) {
|
||||
for_each_cpu(bit, cpumaskp) {
|
||||
blade = uv_cpu_to_blade_id(bit);
|
||||
if (blade == this_blade)
|
||||
continue;
|
||||
cpu_clear(bit, *cpumaskp);
|
||||
cpumask_clear_cpu(bit, cpumaskp);
|
||||
}
|
||||
if (!cpus_empty(*cpumaskp))
|
||||
if (!cpumask_empty(cpumaskp))
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
@@ -296,7 +296,7 @@ int uv_flush_send_and_wait(int cpu, int this_blade, struct bau_desc *bau_desc,
|
||||
* Returns 1 if all remote flushing was done.
|
||||
* Returns 0 if some remote flushing remains to be done.
|
||||
*/
|
||||
int uv_flush_tlb_others(cpumask_t *cpumaskp, struct mm_struct *mm,
|
||||
int uv_flush_tlb_others(struct cpumask *cpumaskp, struct mm_struct *mm,
|
||||
unsigned long va)
|
||||
{
|
||||
int i;
|
||||
@@ -315,7 +315,7 @@ int uv_flush_tlb_others(cpumask_t *cpumaskp, struct mm_struct *mm,
|
||||
bau_nodes_clear(&bau_desc->distribution, UV_DISTRIBUTION_SIZE);
|
||||
|
||||
i = 0;
|
||||
for_each_cpu_mask(bit, *cpumaskp) {
|
||||
for_each_cpu(bit, cpumaskp) {
|
||||
blade = uv_cpu_to_blade_id(bit);
|
||||
BUG_ON(blade > (UV_DISTRIBUTION_SIZE - 1));
|
||||
if (blade == this_blade) {
|
||||
|
Reference in New Issue
Block a user