mirror of
https://github.com/lkl/linux.git
synced 2025-12-19 08:03:01 +09:00
netns: add pre_exit method to struct pernet_operations
Current struct pernet_operations exit() handlers are highly
discouraged to call synchronize_rcu().
There are cases where we need them, and exit_batch() does
not help the common case where a single netns is dismantled.
This patch leverages the existing synchronize_rcu() call
in cleanup_net()
Calling optional ->pre_exit() method before ->exit() or
->exit_batch() allows to benefit from a single synchronize_rcu()
call.
Note that the synchronize_rcu() calls added in this patch
are only in error paths or slow paths.
Tested:
$ time for i in {1..1000}; do unshare -n /bin/false;done
real 0m2.612s
user 0m0.171s
sys 0m2.216s
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
2a54003e7a
commit
d7d99872c1
@@ -355,8 +355,13 @@ struct pernet_operations {
|
||||
* synchronize_rcu() related to these pernet_operations,
|
||||
* instead of separate synchronize_rcu() for every net.
|
||||
* Please, avoid synchronize_rcu() at all, where it's possible.
|
||||
*
|
||||
* Note that a combination of pre_exit() and exit() can
|
||||
* be used, since a synchronize_rcu() is guaranteed between
|
||||
* the calls.
|
||||
*/
|
||||
int (*init)(struct net *net);
|
||||
void (*pre_exit)(struct net *net);
|
||||
void (*exit)(struct net *net);
|
||||
void (*exit_batch)(struct list_head *net_exit_list);
|
||||
unsigned int *id;
|
||||
|
||||
Reference in New Issue
Block a user