datapath: compat: remove __net_init and __net_exit annotations.
authorPravin B Shelar <pshelar@nicira.com>
Thu, 15 Aug 2013 03:53:32 +0000 (20:53 -0700)
committerPravin B Shelar <pshelar@nicira.com>
Thu, 15 Aug 2013 03:53:32 +0000 (20:53 -0700)
net_namespace-device can get registered after module init, e.g. vxlan
registers name-space-device on port add.  On kernel without namespace
support __net_init is defined as __init which cause panic on vxlan port
add. Following patch fixes it.

BUG: unable to handle kernel paging request at ffffffffa02b6293
IP: [<ffffffffa02b6293>] 0xffffffffa02b6293
PGD 1a87067 PUD 1a8b063 PMD 8371de067 PTE 0
Oops: 0010 [#1] SMP
Process ovs-vswitchd (pid: 10330, threadinfo ffff8808367fe000, task
      f880839e16aa0)
Stack:
Call Trace:
 [<ffffffff8144b254>] ? register_pernet_gen_device+0x74/0xd0
 [<ffffffffa027e220>] ? vxlan_rcv+0x0/0x60 [openvswitch]
 [<ffffffffa0280a7b>] vxlan_handler_add+0x3cb/0x480 [openvswitch]
 [<ffffffffa027e1f4>] vxlan_tnl_create+0xc4/0xf0 [openvswitch]
 [<ffffffffa027b6f3>] ovs_vport_add+0x53/0xb0 [openvswitch]
 [<ffffffffa0273bc6>] new_vport+0x16/0x60 [openvswitch]
 [<ffffffffa0276399>] ovs_vport_cmd_new+0x109/0x210 [openvswitch]
 [<ffffffff81478f80>] genl_rcv_msg+0x1d0/0x210
 [<ffffffff81477e29>] netlink_rcv_skb+0xa9/0xd0
 [<ffffffff81478d95>] genl_rcv+0x25/0x40
 [<ffffffff81477a63>] netlink_unicast+0x283/0x2d0
 [<ffffffff814783de>] netlink_sendmsg+0x1fe/0x2e0
 [<ffffffff8143c8d3>] sock_sendmsg+0x123/0x150
 [<ffffffff8143e0b6>] __sys_sendmsg+0x406/0x420
 [<ffffffff8143e2d9>] sys_sendmsg+0x49/0x90
 [<ffffffff8100b072>] system_call_fastpath+0x16/0x1b
Code:  Bad RIP value.
RIP  [<ffffffffa02b6293>] 0xffffffffa02b6293

Signed-off-by: Pravin B Shelar <pshelar@nicira.com>
Acked-by: Jesse Gross <jesse@nicira.com>
Bug #19178

datapath/linux/compat/include/net/net_namespace.h
datapath/linux/compat/net_namespace.c
datapath/linux/compat/vxlan.c

index 85dee1a..440c601 100644 (file)
@@ -82,23 +82,23 @@ extern void rpl_unregister_pernet_gen_device(struct rpl_pernet_operations *ops);
 
 #else /* for 2.6.32* */
 
-int __net_init compat_init_net(struct net *net, struct rpl_pernet_operations *pnet);
-void __net_exit compat_exit_net(struct net *net, struct rpl_pernet_operations *pnet);
+int compat_init_net(struct net *net, struct rpl_pernet_operations *pnet);
+void compat_exit_net(struct net *net, struct rpl_pernet_operations *pnet);
 
 #define DEFINE_COMPAT_PNET_REG_FUNC(TYPE)                                      \
                                                                        \
 static struct rpl_pernet_operations *pnet_gen_##TYPE;                  \
-static int __net_init compat_init_net_gen_##TYPE(struct net *net)      \
+static int compat_init_net_gen_##TYPE(struct net *net) \
 {                                                                      \
        return compat_init_net(net, pnet_gen_##TYPE);                   \
 }                                                                      \
                                                                        \
-static void __net_exit compat_exit_net_gen_##TYPE(struct net *net)     \
+static void compat_exit_net_gen_##TYPE(struct net *net)        \
 {                                                                      \
        compat_exit_net(net, pnet_gen_##TYPE);                          \
 }                                                                      \
                                                                        \
-static int __net_init rpl_register_pernet_gen_##TYPE(struct rpl_pernet_operations *rpl_pnet)   \
+static int rpl_register_pernet_gen_##TYPE(struct rpl_pernet_operations *rpl_pnet)      \
 {                                                                              \
        pnet_gen_##TYPE = rpl_pnet;                                             \
        rpl_pnet->ops.init = compat_init_net_gen_##TYPE;                        \
@@ -106,7 +106,7 @@ static int __net_init rpl_register_pernet_gen_##TYPE(struct rpl_pernet_operation
        return register_pernet_gen_##TYPE(pnet_gen_##TYPE->id, &rpl_pnet->ops); \
 }                                                                                      \
                                                                                        \
-static void __net_exit rpl_unregister_pernet_gen_##TYPE(struct rpl_pernet_operations *rpl_pnet)                \
+static void rpl_unregister_pernet_gen_##TYPE(struct rpl_pernet_operations *rpl_pnet)           \
 {                                                                                      \
        unregister_pernet_gen_##TYPE(*pnet_gen_##TYPE->id, &rpl_pnet->ops);             \
 }
index 82404af..843e6c1 100644 (file)
@@ -8,7 +8,7 @@
 static int net_assign_generic(struct net *net, int id, void *data);
 #endif
 
-int __net_init compat_init_net(struct net *net, struct rpl_pernet_operations *pnet)
+int compat_init_net(struct net *net, struct rpl_pernet_operations *pnet)
 {
        int err;
        void *ovs_net = kzalloc(pnet->size, GFP_KERNEL);
@@ -32,7 +32,7 @@ err:
        return err;
 }
 
-void __net_exit compat_exit_net(struct net *net, struct rpl_pernet_operations *pnet)
+void compat_exit_net(struct net *net, struct rpl_pernet_operations *pnet)
 {
        void *ovs_net = net_generic(net, *pnet->id);
 
index 6e6b945..f3df4e3 100644 (file)
@@ -429,7 +429,7 @@ void vxlan_handler_put(struct vxlan_handler *vh)
                queue_work(&vh->del_work);
 }
 
-static __net_init int vxlan_init_net(struct net *net)
+static int vxlan_init_net(struct net *net)
 {
        struct vxlan_net *vn = net_generic(net, vxlan_net_id);
        unsigned int h;