mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 04:31:50 +00:00
rcu: Initialize and destroy rcu_synchronize only when necessary
The __wait_rcu_gp() function unconditionally initializes and cleans up each element of rs_array[], whether used or not. This is slightly wasteful and rather confusing, so this commit skips both initialization and cleanup for duplicate callback functions. Signed-off-by: Wei Yang <richard.weiyang@gmail.com> Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
This commit is contained in:
parent
9ebcfadb06
commit
7ee880b7bf
@ -390,13 +390,14 @@ void __wait_rcu_gp(bool checktiny, int n, call_rcu_func_t *crcu_array,
|
|||||||
might_sleep();
|
might_sleep();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
init_rcu_head_on_stack(&rs_array[i].head);
|
|
||||||
init_completion(&rs_array[i].completion);
|
|
||||||
for (j = 0; j < i; j++)
|
for (j = 0; j < i; j++)
|
||||||
if (crcu_array[j] == crcu_array[i])
|
if (crcu_array[j] == crcu_array[i])
|
||||||
break;
|
break;
|
||||||
if (j == i)
|
if (j == i) {
|
||||||
|
init_rcu_head_on_stack(&rs_array[i].head);
|
||||||
|
init_completion(&rs_array[i].completion);
|
||||||
(crcu_array[i])(&rs_array[i].head, wakeme_after_rcu);
|
(crcu_array[i])(&rs_array[i].head, wakeme_after_rcu);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Wait for all callbacks to be invoked. */
|
/* Wait for all callbacks to be invoked. */
|
||||||
@ -407,9 +408,10 @@ void __wait_rcu_gp(bool checktiny, int n, call_rcu_func_t *crcu_array,
|
|||||||
for (j = 0; j < i; j++)
|
for (j = 0; j < i; j++)
|
||||||
if (crcu_array[j] == crcu_array[i])
|
if (crcu_array[j] == crcu_array[i])
|
||||||
break;
|
break;
|
||||||
if (j == i)
|
if (j == i) {
|
||||||
wait_for_completion(&rs_array[i].completion);
|
wait_for_completion(&rs_array[i].completion);
|
||||||
destroy_rcu_head_on_stack(&rs_array[i].head);
|
destroy_rcu_head_on_stack(&rs_array[i].head);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(__wait_rcu_gp);
|
EXPORT_SYMBOL_GPL(__wait_rcu_gp);
|
||||||
|
Loading…
Reference in New Issue
Block a user