diff mbox

rdma_rxe: Fix kernel crash when IPV6 disabled.

Message ID 1474730674-4017-1-git-send-email-pandit.parav@gmail.com (mailing list archive)
State Superseded
Headers show

Commit Message

Parav Pandit Sept. 24, 2016, 3:24 p.m. UTC
This patch fixes below kernel crash when CONFIG_IPV6 is disabled by
avoiding ip6 socket initialization.

Additionally it has below minor related cleanup around recv_sockets elements.

1. Avoid extern for structure which is locally used in file
2. Define recv_sockets as static as its used by single file
3. Follow reverse deallocation order than allocation order for
recv_sockets elements

kernel: [  348.527616] general protection fault: 0000 [#1] SMP
kernel: [  348.528052] Modules linked in: rdma_rxe(+) udp_tunnel ib_core binfmt_misc dm_mirror dm_region_hash dm_log dm_mod mousedev psmouse sg pcspkr evdev floppy button acpi_cpufreq ext4(E) crc16(E) jbd2(E) mbcache(E) sd_mod(E) ata_piix(E) libata(E) scsi_mod(E)
kernel: [  348.528052] CPU: 0 PID: 2561 Comm: modprobe Tainted: G            E   4.8.0-rc6+ #8
kernel: [  348.528052] task: ffff880037af1d80 task.stack: ffff88003df50000
kernel: [  348.528052] RIP: 0010:[<ffffffffa03212bd>]  [<ffffffffa03212bd>] setup_udp_tunnel_sock+0xd/0x70 [udp_tunnel]
kernel: [  348.528052] RSP: 0018:ffff88003df53c38  EFLAGS: 00010202
kernel: [  348.528052] RAX: 840fc28949c08548 RBX: 0000000000000000 RCX: 00000000685eba97
kernel: [  348.528052] RDX: ffff88003df53c68 RSI: ffffffff81197185 RDI: ffffffff81acc800
kernel: [  348.528052] RBP: ffff88003df53c38 R08: 000000000001b1c0 R09: ffffffff812ef300
kernel: [  348.528052] R10: ffff88003e21b1c0 R11: ffffea0000f36000 R12: ffffffffa033e000
kernel: [  348.528052] R13: ffffffffa0339c10 R14: ffff88003d17b240 R15: ffffffffa0339bc0
kernel: [  348.528052] FS:  00007f910f913740(0000) GS:ffff88003e200000(0000) knlGS:0000000000000000
kernel: [  348.528052] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
kernel: [  348.528052] CR2: 00007f910eac0000 CR3: 0000000037a07000 CR4: 00000000001406f0
kernel: [  348.528052] Stack:
kernel: [  348.528052]  ffff88003df53ca0 ffffffffa0331fbb ffffffff81197185 0000000a00000000
kernel: [  348.528052]  0000000000000000 000000080000b712 0000000000000000 ffffffffa0335701
kernel: [  348.528052]  ffffffffa0332320 0000000000000000 ffff88003d17b240 ffffffffa0339bc0
kernel: [  348.528052] Call Trace:
kernel: [  348.528052]  [<ffffffffa0331fbb>] rxe_setup_udp_tunnel.constprop.14+0x6b/0xc0 [rdma_rxe]
kernel: [  348.528052]  [<ffffffff81197185>] ? kmem_cache_create+0x85/0x1c0
kernel: [  348.528052]  [<ffffffffa0332320>] ? net_to_rxe+0x80/0x80 [rdma_rxe]
kernel: [  348.528052]  [<ffffffffa03326de>] rxe_net_init+0x1e/0xe0 [rdma_rxe]
kernel: [  348.528052]  [<ffffffffa033e027>] rxe_module_init+0x27/0x57 [rdma_rxe]
kernel: [  348.528052]  [<ffffffff8100214d>] do_one_initcall+0x3d/0x160
kernel: [  348.528052]  [<ffffffff811b4145>] ? __vunmap+0x85/0xd0
kernel: [  348.528052]  [<ffffffff811b41fe>] ? vfree+0x2e/0x70
kernel: [  348.528052]  [<ffffffff8116ce63>] do_init_module+0x60/0x1e0
kernel: [  348.528052]  [<ffffffff810ec622>] load_module+0x1dc2/0x2650
kernel: [  348.528052]  [<ffffffff810e9970>] ? __symbol_put+0x40/0x40
kernel: [  348.528052]  [<ffffffff810ecfae>] SYSC_init_module+0xfe/0x110
kernel: [  348.528052]  [<ffffffff810ed07e>] SyS_init_module+0xe/0x10
kernel: [  348.528052]  [<ffffffff81502df2>] entry_SYSCALL_64_fastpath+0x1a/0xa4
kernel: [  348.528052] Code: ca 0e 10 e1 48 89 df e8 32 22 10 e1 5b 5d c3 66 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 48 8b 46 20 55 48 89 e5 <80> a0 d0 02 00 00 ef 80 80 d3 02 00 00 01 48 8b 0a 48 89 88 28
kernel: [  348.528052] RIP  [<ffffffffa03212bd>] setup_udp_tunnel_sock+0xd/0x70 [udp_tunnel]
kernel: [  348.528052]  RSP <ffff88003df53c38>
kernel: [  348.772092] ---[ end trace 432dfe51deb7b58e ]---

Signed-off-by: Parav Pandit <pandit.parav@gmail.com>
---
 drivers/infiniband/sw/rxe/rxe_net.c | 20 +++++++++-----------
 drivers/infiniband/sw/rxe/rxe_net.h |  2 --
 2 files changed, 9 insertions(+), 13 deletions(-)

Comments

Leon Romanovsky Sept. 25, 2016, 4:36 a.m. UTC | #1
On Sat, Sep 24, 2016 at 03:24:34PM +0000, Parav Pandit wrote:
> This patch fixes below kernel crash when CONFIG_IPV6 is disabled by
> avoiding ip6 socket initialization.
>
> Additionally it has below minor related cleanup around recv_sockets elements.
>
> 1. Avoid extern for structure which is locally used in file
> 2. Define recv_sockets as static as its used by single file
> 3. Follow reverse deallocation order than allocation order for
> recv_sockets elements

Thanks Parav,
This crash was already fixed upstream.
https://git.kernel.org/cgit/linux/kernel/git/dledford/rdma.git/commit/drivers/infiniband/sw/rxe?id=dfdd6158ca2c8838313470c5ab79243d04da70b2
Parav Pandit Sept. 25, 2016, 5:16 a.m. UTC | #2
On Sun, Sep 25, 2016 at 10:06 AM, Leon Romanovsky <leon@kernel.org> wrote:
> On Sat, Sep 24, 2016 at 03:24:34PM +0000, Parav Pandit wrote:
>> This patch fixes below kernel crash when CONFIG_IPV6 is disabled by
>> avoiding ip6 socket initialization.
>>
>> Additionally it has below minor related cleanup around recv_sockets elements.
>>
>> 1. Avoid extern for structure which is locally used in file
>> 2. Define recv_sockets as static as its used by single file
>> 3. Follow reverse deallocation order than allocation order for
>> recv_sockets elements
>
> Thanks Parav,
> This crash was already fixed upstream.
> https://git.kernel.org/cgit/linux/kernel/git/dledford/rdma.git/commit/drivers/infiniband/sw/rxe?id=dfdd6158ca2c8838313470c5ab79243d04da70b2

ok. Thanks. I was in 4.8-rc branch and I searched for rdma_rxe tag for
commits based on Stephen's rdma_rxe tag. This one was done using
IB/rxe.
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/infiniband/sw/rxe/rxe_net.c b/drivers/infiniband/sw/rxe/rxe_net.c
index 0b8d2ea..dc9851f 100644
--- a/drivers/infiniband/sw/rxe/rxe_net.c
+++ b/drivers/infiniband/sw/rxe/rxe_net.c
@@ -48,6 +48,8 @@ 
 static LIST_HEAD(rxe_dev_list);
 static spinlock_t dev_list_lock; /* spinlock for device list */
 
+static struct rxe_recv_sockets recv_sockets;
+
 struct rxe_dev *net_to_rxe(struct net_device *ndev)
 {
 	struct rxe_dev *rxe;
@@ -81,9 +83,6 @@  struct rxe_dev *get_rxe_by_name(const char* name)
 	return found;
 }
 
-
-struct rxe_recv_sockets recv_sockets;
-
 static __be64 rxe_mac_to_eui64(struct net_device *ndev)
 {
 	unsigned char *mac_addr = ndev->dev_addr;
@@ -277,7 +276,8 @@  static struct socket *rxe_setup_udp_tunnel(struct net *net, __be16 port,
 
 static void rxe_release_udp_tunnel(struct socket *sk)
 {
-	udp_tunnel_sock_release(sk);
+	if (sk)
+		udp_tunnel_sock_release(sk);
 }
 
 static void prepare_udp_hdr(struct sk_buff *skb, __be16 src_port,
@@ -668,6 +668,7 @@  int rxe_net_init(void)
 
 	spin_lock_init(&dev_list_lock);
 
+#if IS_ENABLED(CONFIG_IPV6)
 	recv_sockets.sk6 = rxe_setup_udp_tunnel(&init_net,
 			htons(ROCE_V2_UDP_DPORT), true);
 	if (IS_ERR(recv_sockets.sk6)) {
@@ -675,7 +676,7 @@  int rxe_net_init(void)
 		pr_err("rxe: Failed to create IPv6 UDP tunnel\n");
 		return -1;
 	}
-
+#endif
 	recv_sockets.sk4 = rxe_setup_udp_tunnel(&init_net,
 			htons(ROCE_V2_UDP_DPORT), false);
 	if (IS_ERR(recv_sockets.sk4)) {
@@ -688,8 +689,8 @@  int rxe_net_init(void)
 
 	err = register_netdevice_notifier(&rxe_net_notifier);
 	if (err) {
-		rxe_release_udp_tunnel(recv_sockets.sk6);
 		rxe_release_udp_tunnel(recv_sockets.sk4);
+		rxe_release_udp_tunnel(recv_sockets.sk6);
 		pr_err("rxe: Failed to rigister netdev notifier\n");
 	}
 
@@ -698,11 +699,8 @@  int rxe_net_init(void)
 
 void rxe_net_exit(void)
 {
-	if (recv_sockets.sk6)
-		rxe_release_udp_tunnel(recv_sockets.sk6);
-
-	if (recv_sockets.sk4)
-		rxe_release_udp_tunnel(recv_sockets.sk4);
+	rxe_release_udp_tunnel(recv_sockets.sk4);
+	rxe_release_udp_tunnel(recv_sockets.sk6);
 
 	unregister_netdevice_notifier(&rxe_net_notifier);
 }
diff --git a/drivers/infiniband/sw/rxe/rxe_net.h b/drivers/infiniband/sw/rxe/rxe_net.h
index 7b06f76..106c586 100644
--- a/drivers/infiniband/sw/rxe/rxe_net.h
+++ b/drivers/infiniband/sw/rxe/rxe_net.h
@@ -43,8 +43,6 @@  struct rxe_recv_sockets {
 	struct socket *sk6;
 };
 
-extern struct rxe_recv_sockets recv_sockets;
-
 struct rxe_dev *rxe_net_add(struct net_device *ndev);
 
 int rxe_net_init(void);