Blame view
net/openvswitch/dp_notify.c
1.99 KB
c94229992 treewide: Replace... |
1 |
// SPDX-License-Identifier: GPL-2.0-only |
ccb1352e7 net: Add Open vSw... |
2 |
/* |
caf2ee14b openvswitch: Repl... |
3 |
* Copyright (c) 2007-2012 Nicira, Inc. |
ccb1352e7 net: Add Open vSw... |
4 5 6 7 |
*/ #include <linux/netdevice.h> #include <net/genetlink.h> |
8e4e1713e openvswitch: Simp... |
8 |
#include <net/netns/generic.h> |
ccb1352e7 net: Add Open vSw... |
9 10 11 12 |
#include "datapath.h" #include "vport-internal_dev.h" #include "vport-netdev.h" |
8e4e1713e openvswitch: Simp... |
13 14 15 16 17 18 |
static void dp_detach_port_notify(struct vport *vport) { struct sk_buff *notify; struct datapath *dp; dp = vport->dp; |
9354d4520 openvswitch: reli... |
19 20 |
notify = ovs_vport_cmd_build_info(vport, ovs_dp_get_net(dp), 0, 0, OVS_VPORT_CMD_DEL); |
8e4e1713e openvswitch: Simp... |
21 22 |
ovs_dp_detach_port(vport); if (IS_ERR(notify)) { |
68eb55031 genetlink: pass f... |
23 |
genl_set_err(&dp_vport_genl_family, ovs_dp_get_net(dp), 0, |
2a94fe48f genetlink: make m... |
24 |
0, PTR_ERR(notify)); |
8e4e1713e openvswitch: Simp... |
25 26 |
return; } |
68eb55031 genetlink: pass f... |
27 28 |
genlmsg_multicast_netns(&dp_vport_genl_family, ovs_dp_get_net(dp), notify, 0, |
2a94fe48f genetlink: make m... |
29 |
0, GFP_KERNEL); |
8e4e1713e openvswitch: Simp... |
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
} void ovs_dp_notify_wq(struct work_struct *work) { struct ovs_net *ovs_net = container_of(work, struct ovs_net, dp_notify_work); struct datapath *dp; ovs_lock(); list_for_each_entry(dp, &ovs_net->dps, list_node) { int i; for (i = 0; i < DP_VPORT_HASH_BUCKETS; i++) { struct vport *vport; struct hlist_node *n; hlist_for_each_entry_safe(vport, n, &dp->ports[i], dp_hash_node) { |
131753030 openvswitch: fix ... |
46 |
if (vport->ops->type == OVS_VPORT_TYPE_INTERNAL) |
8e4e1713e openvswitch: Simp... |
47 |
continue; |
44e372594 net: openvswitch:... |
48 |
if (!(netif_is_ovs_port(vport->dev))) |
8e4e1713e openvswitch: Simp... |
49 50 51 52 53 54 |
dp_detach_port_notify(vport); } } } ovs_unlock(); } |
ccb1352e7 net: Add Open vSw... |
55 56 57 |
static int dp_device_event(struct notifier_block *unused, unsigned long event, void *ptr) { |
8e4e1713e openvswitch: Simp... |
58 |
struct ovs_net *ovs_net; |
351638e7d net: pass info st... |
59 |
struct net_device *dev = netdev_notifier_info_to_dev(ptr); |
8e4e1713e openvswitch: Simp... |
60 |
struct vport *vport = NULL; |
ccb1352e7 net: Add Open vSw... |
61 |
|
8e4e1713e openvswitch: Simp... |
62 |
if (!ovs_is_internal_dev(dev)) |
ccb1352e7 net: Add Open vSw... |
63 64 65 66 |
vport = ovs_netdev_get_vport(dev); if (!vport) return NOTIFY_DONE; |
8e4e1713e openvswitch: Simp... |
67 |
if (event == NETDEV_UNREGISTER) { |
b07c26511 openvswitch: fix ... |
68 69 70 71 |
/* upper_dev_unlink and decrement promisc immediately */ ovs_netdev_detach_dev(vport); /* schedule vport destroy, dev_put and genl notification */ |
8e4e1713e openvswitch: Simp... |
72 73 |
ovs_net = net_generic(dev_net(dev), ovs_net_id); queue_work(system_wq, &ovs_net->dp_notify_work); |
ccb1352e7 net: Add Open vSw... |
74 75 76 77 78 79 80 81 |
} return NOTIFY_DONE; } struct notifier_block ovs_dp_device_notifier = { .notifier_call = dp_device_event }; |