From 077127705acf80cdb9393b891d934509a7081d71 Mon Sep 17 00:00:00 2001 From: Guillaume Nault Date: Sat, 27 Aug 2016 22:22:51 +0200 Subject: ppp: declare PPP devices as LLTX ppp_xmit_process() already locks the xmit path. If HARD_TX_LOCK() tries to hold the _xmit_lock we can get lock inversion. [ 973.726130] ====================================================== [ 973.727311] [ INFO: possible circular locking dependency detected ] [ 973.728546] 4.8.0-rc2 #1 Tainted: G O [ 973.728986] ------------------------------------------------------- [ 973.728986] accel-pppd/1806 is trying to acquire lock: [ 973.728986] (&qdisc_xmit_lock_key){+.-...}, at: [] sch_direct_xmit+0x8d/0x221 [ 973.728986] [ 973.728986] but task is already holding lock: [ 973.728986] (l2tp_sock){+.-...}, at: [] l2tp_xmit_skb+0x1e8/0x5d7 [l2tp_core] [ 973.728986] [ 973.728986] which lock already depends on the new lock. [ 973.728986] [ 973.728986] [ 973.728986] the existing dependency chain (in reverse order) is: [ 973.728986] -> #3 (l2tp_sock){+.-...}: [ 973.728986] [] lock_acquire+0x150/0x217 [ 973.728986] [] _raw_spin_lock+0x2d/0x3c [ 973.728986] [] l2tp_xmit_skb+0x1e8/0x5d7 [l2tp_core] [ 973.728986] [] pppol2tp_xmit+0x1f2/0x25e [l2tp_ppp] [ 973.728986] [] ppp_channel_push+0xb5/0x14a [ppp_generic] [ 973.728986] [] ppp_write+0x104/0x11c [ppp_generic] [ 973.728986] [] __vfs_write+0x56/0x120 [ 973.728986] [] vfs_write+0xbd/0x11b [ 973.728986] [] SyS_write+0x5e/0x96 [ 973.728986] [] entry_SYSCALL_64_fastpath+0x18/0xa8 [ 973.728986] -> #2 (&(&pch->downl)->rlock){+.-...}: [ 973.728986] [] lock_acquire+0x150/0x217 [ 973.728986] [] _raw_spin_lock_bh+0x31/0x40 [ 973.728986] [] ppp_push+0xa7/0x82d [ppp_generic] [ 973.728986] [] __ppp_xmit_process+0x48/0x877 [ppp_generic] [ 973.728986] [] ppp_xmit_process+0x4b/0xaf [ppp_generic] [ 973.728986] [] ppp_write+0x10e/0x11c [ppp_generic] [ 973.728986] [] __vfs_write+0x56/0x120 [ 973.728986] [] vfs_write+0xbd/0x11b [ 973.728986] [] SyS_write+0x5e/0x96 [ 973.728986] [] entry_SYSCALL_64_fastpath+0x18/0xa8 [ 973.728986] -> #1 (&(&ppp->wlock)->rlock){+.-...}: [ 973.728986] [] lock_acquire+0x150/0x217 [ 973.728986] [] _raw_spin_lock_bh+0x31/0x40 [ 973.728986] [] __ppp_xmit_process+0x27/0x877 [ppp_generic] [ 973.728986] [] ppp_xmit_process+0x4b/0xaf [ppp_generic] [ 973.728986] [] ppp_start_xmit+0x21b/0x22a [ppp_generic] [ 973.728986] [] dev_hard_start_xmit+0x1a9/0x43d [ 973.728986] [] sch_direct_xmit+0xd6/0x221 [ 973.728986] [] __dev_queue_xmit+0x62a/0x912 [ 973.728986] [] dev_queue_xmit+0xb/0xd [ 973.728986] [] neigh_direct_output+0xc/0xe [ 973.728986] [] ip6_finish_output2+0x5a9/0x623 [ 973.728986] [] ip6_output+0x15e/0x16a [ 973.728986] [] dst_output+0x76/0x7f [ 973.728986] [] mld_sendpack+0x335/0x404 [ 973.728986] [] mld_send_initial_cr.part.21+0x99/0xa2 [ 973.728986] [] ipv6_mc_dad_complete+0x42/0x71 [ 973.728986] [] addrconf_dad_completed+0x1cf/0x2ea [ 973.728986] [] addrconf_dad_work+0x453/0x520 [ 973.728986] [] process_one_work+0x365/0x6f0 [ 973.728986] [] worker_thread+0x2de/0x421 [ 973.728986] [] kthread+0x121/0x130 [ 973.728986] [] ret_from_fork+0x1f/0x40 [ 973.728986] -> #0 (&qdisc_xmit_lock_key){+.-...}: [ 973.728986] [] __lock_acquire+0x1118/0x1483 [ 973.728986] [] lock_acquire+0x150/0x217 [ 973.728986] [] _raw_spin_lock+0x2d/0x3c [ 973.728986] [] sch_direct_xmit+0x8d/0x221 [ 973.728986] [] __dev_queue_xmit+0x62a/0x912 [ 973.728986] [] dev_queue_xmit+0xb/0xd [ 973.728986] [] neigh_direct_output+0xc/0xe [ 973.728986] [] ip_finish_output2+0x5db/0x609 [ 973.728986] [] ip_finish_output+0x152/0x15e [ 973.728986] [] ip_output+0x8c/0x96 [ 973.728986] [] ip_local_out+0x41/0x4a [ 973.728986] [] ip_queue_xmit+0x5a5/0x609 [ 973.728986] [] l2tp_xmit_skb+0x582/0x5d7 [l2tp_core] [ 973.728986] [] pppol2tp_xmit+0x1f2/0x25e [l2tp_ppp] [ 973.728986] [] ppp_channel_push+0xb5/0x14a [ppp_generic] [ 973.728986] [] ppp_write+0x104/0x11c [ppp_generic] [ 973.728986] [] __vfs_write+0x56/0x120 [ 973.728986] [] vfs_write+0xbd/0x11b [ 973.728986] [] SyS_write+0x5e/0x96 [ 973.728986] [] entry_SYSCALL_64_fastpath+0x18/0xa8 [ 973.728986] [ 973.728986] other info that might help us debug this: [ 973.728986] [ 973.728986] Chain exists of: &qdisc_xmit_lock_key --> &(&pch->downl)->rlock --> l2tp_sock [ 973.728986] Possible unsafe locking scenario: [ 973.728986] [ 973.728986] CPU0 CPU1 [ 973.728986] ---- ---- [ 973.728986] lock(l2tp_sock); [ 973.728986] lock(&(&pch->downl)->rlock); [ 973.728986] lock(l2tp_sock); [ 973.728986] lock(&qdisc_xmit_lock_key); [ 973.728986] [ 973.728986] *** DEADLOCK *** [ 973.728986] [ 973.728986] 6 locks held by accel-pppd/1806: [ 973.728986] #0: (&(&pch->downl)->rlock){+.-...}, at: [] ppp_channel_push+0x56/0x14a [ppp_generic] [ 973.728986] #1: (l2tp_sock){+.-...}, at: [] l2tp_xmit_skb+0x1e8/0x5d7 [l2tp_core] [ 973.728986] #2: (rcu_read_lock){......}, at: [] rcu_lock_acquire+0x0/0x20 [ 973.728986] #3: (rcu_read_lock_bh){......}, at: [] rcu_lock_acquire+0x0/0x20 [ 973.728986] #4: (rcu_read_lock_bh){......}, at: [] rcu_lock_acquire+0x0/0x20 [ 973.728986] #5: (dev->qdisc_running_key ?: &qdisc_running_key#2){+.....}, at: [] __dev_queue_xmit+0x564/0x912 [ 973.728986] [ 973.728986] stack backtrace: [ 973.728986] CPU: 2 PID: 1806 Comm: accel-pppd Tainted: G O 4.8.0-rc2 #1 [ 973.728986] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Debian-1.8.2-1 04/01/2014 [ 973.728986] ffff7fffffffffff ffff88003436f850 ffffffff812a20f4 ffffffff82156e30 [ 973.728986] ffffffff82156920 ffff88003436f890 ffffffff8115c759 ffff88003344ae00 [ 973.728986] ffff88003344b5c0 0000000000000002 0000000000000006 ffff88003344b5e8 [ 973.728986] Call Trace: [ 973.728986] [] dump_stack+0x67/0x90 [ 973.728986] [] print_circular_bug+0x22e/0x23c [ 973.728986] [] __lock_acquire+0x1118/0x1483 [ 973.728986] [] lock_acquire+0x150/0x217 [ 973.728986] [] ? lock_acquire+0x150/0x217 [ 973.728986] [] ? sch_direct_xmit+0x8d/0x221 [ 973.728986] [] _raw_spin_lock+0x2d/0x3c [ 973.728986] [] ? sch_direct_xmit+0x8d/0x221 [ 973.728986] [] sch_direct_xmit+0x8d/0x221 [ 973.728986] [] __dev_queue_xmit+0x62a/0x912 [ 973.728986] [] dev_queue_xmit+0xb/0xd [ 973.728986] [] neigh_direct_output+0xc/0xe [ 973.728986] [] ip_finish_output2+0x5db/0x609 [ 973.728986] [] ? dst_mtu+0x29/0x2e [ 973.728986] [] ip_finish_output+0x152/0x15e [ 973.728986] [] ? ip_output+0x74/0x96 [ 973.728986] [] ip_output+0x8c/0x96 [ 973.728986] [] ip_local_out+0x41/0x4a [ 973.728986] [] ip_queue_xmit+0x5a5/0x609 [ 973.728986] [] ? udp_set_csum+0x207/0x21e [ 973.728986] [] l2tp_xmit_skb+0x582/0x5d7 [l2tp_core] [ 973.728986] [] pppol2tp_xmit+0x1f2/0x25e [l2tp_ppp] [ 973.728986] [] ppp_channel_push+0xb5/0x14a [ppp_generic] [ 973.728986] [] ppp_write+0x104/0x11c [ppp_generic] [ 973.728986] [] __vfs_write+0x56/0x120 [ 973.728986] [] ? fsnotify_perm+0x27/0x95 [ 973.728986] [] ? security_file_permission+0x4d/0x54 [ 973.728986] [] vfs_write+0xbd/0x11b [ 973.728986] [] SyS_write+0x5e/0x96 [ 973.728986] [] entry_SYSCALL_64_fastpath+0x18/0xa8 [ 973.728986] [] ? trace_hardirqs_off_caller+0x121/0x12f Signed-off-by: Guillaume Nault Signed-off-by: David S. Miller --- drivers/net/ppp/ppp_generic.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'drivers/net/ppp/ppp_generic.c') diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c index 57fc550aa14b..5489c0ec1d9a 100644 --- a/drivers/net/ppp/ppp_generic.c +++ b/drivers/net/ppp/ppp_generic.c @@ -1363,6 +1363,8 @@ static void ppp_setup(struct net_device *dev) dev->netdev_ops = &ppp_netdev_ops; SET_NETDEV_DEVTYPE(dev, &ppp_type); + dev->features |= NETIF_F_LLTX; + dev->hard_header_len = PPP_HDRLEN; dev->mtu = PPP_MRU; dev->addr_len = 0; -- cgit v1.2.3-59-g8ed1b