Upstream commit: After 614732eaa12d, no refcount is maintained for the vport-vxlan module. This allows the userspace to remove such module while vport-vxlan devices still exist, which leads to later oops.
v1 -> v2: - move vport 'owner' initialization in ovs_vport_ops_register() and make such function a macro Fixes: 614732eaa12d ("openvswitch: Use regular VXLAN net_device device") Signed-off-by: Paolo Abeni <pab...@redhat.com> Signed-off-by: David S. Miller <da...@davemloft.net> Upstream: 83e4bf7a74 ("openvswitch: properly refcount vport-vxlan module"). Signed-off-by: Pravin B Shelar <pshe...@nicira.com> --- datapath/vport-geneve.c | 1 - datapath/vport-gre.c | 1 - datapath/vport-lisp.c | 1 - datapath/vport-stt.c | 1 - datapath/vport.c | 4 ++-- datapath/vport.h | 8 +++++++- 6 files changed, 9 insertions(+), 7 deletions(-) diff --git a/datapath/vport-geneve.c b/datapath/vport-geneve.c index 3b5c1ab..392d750 100644 --- a/datapath/vport-geneve.c +++ b/datapath/vport-geneve.c @@ -129,7 +129,6 @@ static struct vport_ops ovs_geneve_vport_ops = { .destroy = ovs_netdev_tunnel_destroy, .get_options = geneve_get_options, .send = geneve_xmit, - .owner = THIS_MODULE, .get_egress_tun_info = geneve_get_egress_tun_info, }; diff --git a/datapath/vport-gre.c b/datapath/vport-gre.c index a9ac0d4..50aaba5 100644 --- a/datapath/vport-gre.c +++ b/datapath/vport-gre.c @@ -97,7 +97,6 @@ static struct vport_ops ovs_gre_vport_ops = { .send = gre_fb_xmit, .get_egress_tun_info = gre_get_egress_tun_info, .destroy = ovs_netdev_tunnel_destroy, - .owner = THIS_MODULE, }; static int __init ovs_gre_tnl_init(void) diff --git a/datapath/vport-lisp.c b/datapath/vport-lisp.c index e6c00fa..3ce8613 100644 --- a/datapath/vport-lisp.c +++ b/datapath/vport-lisp.c @@ -129,7 +129,6 @@ static struct vport_ops ovs_lisp_vport_ops = { .destroy = ovs_netdev_tunnel_destroy, .get_options = lisp_get_options, .send = lisp_xmit, - .owner = THIS_MODULE, .get_egress_tun_info = lisp_get_egress_tun_info, }; diff --git a/datapath/vport-stt.c b/datapath/vport-stt.c index 9e2079a..b8e0c88 100644 --- a/datapath/vport-stt.c +++ b/datapath/vport-stt.c @@ -131,7 +131,6 @@ static struct vport_ops ovs_stt_vport_ops = { .destroy = ovs_netdev_tunnel_destroy, .get_options = stt_get_options, .send = ovs_stt_xmit, - .owner = THIS_MODULE, .get_egress_tun_info = stt_get_egress_tun_info, }; diff --git a/datapath/vport.c b/datapath/vport.c index 899119f..01702d7 100644 --- a/datapath/vport.c +++ b/datapath/vport.c @@ -113,7 +113,7 @@ static struct hlist_head *hash_bucket(const struct net *net, const char *name) return &dev_table[hash & (VPORT_HASH_BUCKETS - 1)]; } -int ovs_vport_ops_register(struct vport_ops *ops) +int __ovs_vport_ops_register(struct vport_ops *ops) { int err = -EEXIST; struct vport_ops *o; @@ -129,7 +129,7 @@ errout: ovs_unlock(); return err; } -EXPORT_SYMBOL_GPL(ovs_vport_ops_register); +EXPORT_SYMBOL_GPL(__ovs_vport_ops_register); void ovs_vport_ops_unregister(struct vport_ops *ops) { diff --git a/datapath/vport.h b/datapath/vport.h index d820719..33c3935 100644 --- a/datapath/vport.h +++ b/datapath/vport.h @@ -212,7 +212,13 @@ static inline const char *ovs_vport_name(struct vport *vport) return vport->dev->name; } -int ovs_vport_ops_register(struct vport_ops *ops); +int __ovs_vport_ops_register(struct vport_ops *ops); +#define ovs_vport_ops_register(ops) \ +({ \ + (ops)->owner = THIS_MODULE; \ + __ovs_vport_ops_register(ops); \ +}) + void ovs_vport_ops_unregister(struct vport_ops *ops); static inline struct rtable *ovs_tunnel_route_lookup(struct net *net, -- 1.7.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev