From: Kan Liang <kan.li...@intel.com> For CPU hotplug, the NET policy subsystem will rebuild the sys map and object list.
Signed-off-by: Kan Liang <kan.li...@intel.com> --- net/core/netpolicy.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/net/core/netpolicy.c b/net/core/netpolicy.c index 2a04fcf..3b523fc 100644 --- a/net/core/netpolicy.c +++ b/net/core/netpolicy.c @@ -37,6 +37,7 @@ #include <net/net_namespace.h> #include <linux/sort.h> #include <linux/ctype.h> +#include <linux/cpu.h> static int netpolicy_get_dev_info(struct net_device *dev, struct netpolicy_dev_info *d_info) @@ -838,6 +839,73 @@ static struct notifier_block netpolicy_dev_notf = { .notifier_call = netpolicy_notify, }; +/** + * update_netpolicy_sys_map() - rebuild the sys map and object list + * + * This function go through all the available net policy supported device, + * and rebuild sys map and object list. + * + */ +void update_netpolicy_sys_map(void) +{ + struct net *net; + struct net_device *dev, *aux; + enum netpolicy_name cur_policy; + + for_each_net(net) { + for_each_netdev_safe(net, dev, aux) { + spin_lock(&dev->np_lock); + if (!dev->netpolicy) + goto unlock; + cur_policy = dev->netpolicy->cur_policy; + if (cur_policy == NET_POLICY_NONE) + goto unlock; + + dev->netpolicy->cur_policy = NET_POLICY_NONE; + + /* rebuild everything */ + netpolicy_disable(dev); + netpolicy_enable(dev); + if (netpolicy_gen_obj_list(dev, cur_policy)) { + pr_warn("NETPOLICY: Failed to generate netpolicy object list for dev %s\n", + dev->name); + netpolicy_disable(dev); + goto unlock; + } + if (dev->netdev_ops->ndo_set_net_policy(dev, cur_policy)) { + pr_warn("NETPOLICY: Failed to set netpolicy for dev %s\n", + dev->name); + netpolicy_disable(dev); + goto unlock; + } + + dev->netpolicy->cur_policy = cur_policy; +unlock: + spin_unlock(&dev->np_lock); + } + } +} + +static int netpolicy_cpu_callback(struct notifier_block *nfb, + unsigned long action, void *hcpu) +{ + switch (action & ~CPU_TASKS_FROZEN) { + case CPU_ONLINE: + update_netpolicy_sys_map(); + break; + case CPU_DYING: + update_netpolicy_sys_map(); + break; + } + return NOTIFY_OK; +} + +static struct notifier_block netpolicy_cpu_notifier = { + &netpolicy_cpu_callback, + NULL, + 0 +}; + static int __init netpolicy_init(void) { int ret; @@ -846,6 +914,10 @@ static int __init netpolicy_init(void) if (!ret) register_netdevice_notifier(&netpolicy_dev_notf); + cpu_notifier_register_begin(); + __register_cpu_notifier(&netpolicy_cpu_notifier); + cpu_notifier_register_done(); + return ret; } @@ -853,6 +925,10 @@ static void __exit netpolicy_exit(void) { unregister_netdevice_notifier(&netpolicy_dev_notf); unregister_pernet_subsys(&netpolicy_net_ops); + + cpu_notifier_register_begin(); + __unregister_cpu_notifier(&netpolicy_cpu_notifier); + cpu_notifier_register_done(); } subsys_initcall(netpolicy_init); -- 2.5.5