Commit 80690ec6 authored by Ido Schimmel's avatar Ido Schimmel Committed by David S. Miller

nexthop: Convert to blocking notification chain

Currently, the only listener of the nexthop notification chain is the
VXLAN driver. Subsequent patches will add more listeners (e.g., device
drivers such as netdevsim) that need to be able to block when processing
notifications.

Therefore, convert the notification chain to a blocking one. This is
safe as notifications are always emitted from process context.
Signed-off-by: default avatarIdo Schimmel <idosch@nvidia.com>
Reviewed-by: default avatarDavid Ahern <dsahern@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 52f7232a
...@@ -14,6 +14,6 @@ struct netns_nexthop { ...@@ -14,6 +14,6 @@ struct netns_nexthop {
unsigned int seq; /* protected by rtnl_mutex */ unsigned int seq; /* protected by rtnl_mutex */
u32 last_id_allocated; u32 last_id_allocated;
struct atomic_notifier_head notifier_chain; struct blocking_notifier_head notifier_chain;
}; };
#endif #endif
...@@ -42,7 +42,7 @@ static int call_nexthop_notifiers(struct net *net, ...@@ -42,7 +42,7 @@ static int call_nexthop_notifiers(struct net *net,
{ {
int err; int err;
err = atomic_notifier_call_chain(&net->nexthop.notifier_chain, err = blocking_notifier_call_chain(&net->nexthop.notifier_chain,
event_type, nh); event_type, nh);
return notifier_to_errno(err); return notifier_to_errno(err);
} }
...@@ -1959,13 +1959,14 @@ static struct notifier_block nh_netdev_notifier = { ...@@ -1959,13 +1959,14 @@ static struct notifier_block nh_netdev_notifier = {
int register_nexthop_notifier(struct net *net, struct notifier_block *nb) int register_nexthop_notifier(struct net *net, struct notifier_block *nb)
{ {
return atomic_notifier_chain_register(&net->nexthop.notifier_chain, nb); return blocking_notifier_chain_register(&net->nexthop.notifier_chain,
nb);
} }
EXPORT_SYMBOL(register_nexthop_notifier); EXPORT_SYMBOL(register_nexthop_notifier);
int unregister_nexthop_notifier(struct net *net, struct notifier_block *nb) int unregister_nexthop_notifier(struct net *net, struct notifier_block *nb)
{ {
return atomic_notifier_chain_unregister(&net->nexthop.notifier_chain, return blocking_notifier_chain_unregister(&net->nexthop.notifier_chain,
nb); nb);
} }
EXPORT_SYMBOL(unregister_nexthop_notifier); EXPORT_SYMBOL(unregister_nexthop_notifier);
...@@ -1986,7 +1987,7 @@ static int __net_init nexthop_net_init(struct net *net) ...@@ -1986,7 +1987,7 @@ static int __net_init nexthop_net_init(struct net *net)
net->nexthop.devhash = kzalloc(sz, GFP_KERNEL); net->nexthop.devhash = kzalloc(sz, GFP_KERNEL);
if (!net->nexthop.devhash) if (!net->nexthop.devhash)
return -ENOMEM; return -ENOMEM;
ATOMIC_INIT_NOTIFIER_HEAD(&net->nexthop.notifier_chain); BLOCKING_INIT_NOTIFIER_HEAD(&net->nexthop.notifier_chain);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment