Alexei Starovoitov
d45ed4a4e3
net: fix unsafe set_memory_rw from softirq
on x86 system with net.core.bpf_jit_enable = 1
sudo tcpdump -i eth1 'tcp port 22'
causes the warning:
[ 56.766097] Possible unsafe locking scenario:
[ 56.766097]
[ 56.780146] CPU0
[ 56.786807] ----
[ 56.793188] lock(&(&vb->lock)->rlock);
[ 56.799593] <Interrupt>
[ 56.805889] lock(&(&vb->lock)->rlock);
[ 56.812266]
[ 56.812266] *** DEADLOCK ***
[ 56.812266]
[ 56.830670] 1 lock held by ksoftirqd/1/13:
[ 56.836838] #0: (rcu_read_lock){.+.+..}, at: [<ffffffff8118f44c>] vm_unmap_aliases+0x8c/0x380
[ 56.849757]
[ 56.849757] stack backtrace:
[ 56.862194] CPU: 1 PID: 13 Comm: ksoftirqd/1 Not tainted 3.12.0-rc3+ #45
[ 56.868721] Hardware name: System manufacturer System Product Name/P8Z77 WS, BIOS 3007 07/26/2012
[ 56.882004] ffffffff821944c0 ffff88080bbdb8c8 ffffffff8175a145 0000000000000007
[ 56.895630] ffff88080bbd5f40 ffff88080bbdb928 ffffffff81755b14 0000000000000001
[ 56.909313] ffff880800000001 ffff880800000000 ffffffff8101178f 0000000000000001
[ 56.923006] Call Trace:
[ 56.929532] [<ffffffff8175a145>] dump_stack+0x55/0x76
[ 56.936067] [<ffffffff81755b14>] print_usage_bug+0x1f7/0x208
[ 56.942445] [<ffffffff8101178f>] ? save_stack_trace+0x2f/0x50
[ 56.948932] [<ffffffff810cc0a0>] ? check_usage_backwards+0x150/0x150
[ 56.955470] [<ffffffff810ccb52>] mark_lock+0x282/0x2c0
[ 56.961945] [<ffffffff810ccfed>] __lock_acquire+0x45d/0x1d50
[ 56.968474] [<ffffffff810cce6e>] ? __lock_acquire+0x2de/0x1d50
[ 56.975140] [<ffffffff81393bf5>] ? cpumask_next_and+0x55/0x90
[ 56.981942] [<ffffffff810cef72>] lock_acquire+0x92/0x1d0
[ 56.988745] [<ffffffff8118f52a>] ? vm_unmap_aliases+0x16a/0x380
[ 56.995619] [<ffffffff817628f1>] _raw_spin_lock+0x41/0x50
[ 57.002493] [<ffffffff8118f52a>] ? vm_unmap_aliases+0x16a/0x380
[ 57.009447] [<ffffffff8118f52a>] vm_unmap_aliases+0x16a/0x380
[ 57.016477] [<ffffffff8118f44c>] ? vm_unmap_aliases+0x8c/0x380
[ 57.023607] [<ffffffff810436b0>] change_page_attr_set_clr+0xc0/0x460
[ 57.030818] [<ffffffff810cfb8d>] ? trace_hardirqs_on+0xd/0x10
[ 57.037896] [<ffffffff811a8330>] ? kmem_cache_free+0xb0/0x2b0
[ 57.044789] [<ffffffff811b59c3>] ? free_object_rcu+0x93/0xa0
[ 57.051720] [<ffffffff81043d9f>] set_memory_rw+0x2f/0x40
[ 57.058727] [<ffffffff8104e17c>] bpf_jit_free+0x2c/0x40
[ 57.065577] [<ffffffff81642cba>] sk_filter_release_rcu+0x1a/0x30
[ 57.072338] [<ffffffff811108e2>] rcu_process_callbacks+0x202/0x7c0
[ 57.078962] [<ffffffff81057f17>] __do_softirq+0xf7/0x3f0
[ 57.085373] [<ffffffff81058245>] run_ksoftirqd+0x35/0x70
cannot reuse jited filter memory, since it's readonly,
so use original bpf insns memory to hold work_struct
defer kfree of sk_filter until jit completed freeing
tested on x86_64 and i386
Signed-off-by: Alexei Starovoitov <ast@plumgrid.com>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2013-10-07 15:16:45 -04:00
..
2013-09-11 12:34:13 -07:00
2013-09-18 12:37:27 -05:00
2013-04-23 13:25:51 -04:00
2013-08-02 12:33:54 -07:00
2013-04-08 17:16:57 -04:00
2013-09-30 12:44:38 +02:00
2013-08-09 13:09:41 -07:00
2013-08-14 01:12:58 +02:00
2012-06-17 16:29:38 -07:00
2013-08-29 14:55:54 -04:00
2013-07-31 17:24:22 -07:00
2013-09-28 15:56:15 -04:00
2013-07-31 17:50:01 -07:00
2013-08-10 01:16:44 -07:00
2013-07-27 22:14:06 -07:00
2013-07-31 17:50:02 -07:00
2011-11-30 18:51:03 -05:00
2013-07-31 17:50:02 -07:00
2013-08-28 17:45:48 -04:00
2011-08-08 14:26:29 -04:00
2013-08-29 14:08:24 -04:00
2013-07-31 17:50:02 -07:00
2012-06-01 14:18:29 -04:00
2013-09-05 14:54:29 -07:00
2012-08-10 16:52:54 -07:00
2012-04-15 12:44:40 -04:00
2011-10-06 15:49:51 -04:00
2012-04-05 05:08:04 -04:00
2013-03-22 10:31:16 -04:00
2013-01-28 00:15:27 -05:00
2012-04-15 12:44:40 -04:00
2011-12-01 11:41:06 -05:00
2013-01-09 23:59:53 -08:00
2012-07-19 10:43:03 -07:00
2013-09-04 00:27:26 -04:00
2013-08-03 11:53:54 -07:00
2013-03-26 12:32:13 -04:00
2013-03-20 12:14:36 -04:00
2012-10-08 17:42:36 -04:00
2011-05-12 17:46:56 -04:00
2013-06-11 02:51:03 -07:00
2013-08-28 17:19:17 -04:00
2013-07-03 14:37:39 -07:00
2013-01-27 22:46:33 -05:00
2013-02-22 15:10:18 -05:00
2013-07-16 09:58:05 +03:00
2013-04-08 12:00:16 -04:00
2011-11-14 00:19:42 -05:00
2013-09-04 14:53:20 -04:00
2012-07-16 03:44:56 -07:00
2013-02-21 18:15:58 -05:00
2012-07-19 11:02:03 -07:00
2013-03-12 08:30:34 -04:00
2013-05-28 23:49:07 -07:00
2013-05-06 11:06:51 -04:00
2013-02-27 19:10:24 -08:00
2013-06-12 03:13:50 -07:00
2013-02-27 19:10:24 -08:00
2012-07-10 22:40:14 -07:00
2013-01-08 17:56:10 -08:00
2013-08-01 14:16:20 -07:00
2013-08-31 22:29:59 -04:00
2013-09-04 00:27:25 -04:00
2013-07-02 00:33:52 -07:00
2013-09-04 00:27:25 -04:00
2013-09-18 14:39:03 -05:00
2013-09-19 14:11:15 -04:00
2013-08-31 22:29:59 -04:00
2011-04-24 10:54:56 -07:00
2011-03-31 11:26:23 -03:00
2012-05-17 18:45:20 -04:00
2013-04-29 15:41:56 -04:00
2012-04-15 12:44:40 -04:00
2013-09-03 22:34:47 -04:00
2012-05-15 20:14:35 -04:00
2012-09-17 13:13:24 -04:00
2013-08-29 14:08:24 -04:00
2012-06-26 21:06:11 -07:00
2013-09-04 14:53:20 -04:00
2013-09-23 16:53:52 -04:00
2013-09-11 17:04:09 -04:00
2013-07-31 17:50:02 -07:00
2013-09-28 15:09:15 -07:00
2011-05-27 13:41:33 -04:00
2013-01-14 15:04:59 -05:00
2012-09-17 18:08:54 -07:00
2012-09-10 15:30:41 -04:00
2013-09-05 14:54:29 -07:00
2013-02-27 19:10:24 -08:00
2013-06-05 16:37:30 -07:00
2013-07-31 17:24:22 -07:00
2013-08-31 00:32:32 -04:00
2012-11-15 17:39:51 -05:00
2012-05-19 01:08:16 -04:00
2012-04-16 23:53:11 -04:00
2013-01-03 13:01:30 +01:00
2013-04-22 15:55:48 -04:00
2013-08-14 13:09:07 +02:00
2013-03-22 10:31:16 -04:00
2013-08-31 18:09:45 -04:00
2013-04-22 20:32:51 -04:00
2013-09-28 15:19:40 -07:00
2012-08-06 13:40:47 -07:00
2013-10-07 15:16:45 -04:00
2012-04-10 10:04:07 -07:00
2013-09-04 00:27:28 -04:00
2012-06-09 14:56:12 -07:00
2013-06-04 16:43:42 -07:00
2013-07-27 22:16:36 -07:00
2012-03-12 17:05:21 -07:00
2013-07-27 22:14:06 -07:00
2013-09-05 12:44:30 -04:00
2012-04-15 12:44:40 -04:00
2012-05-16 15:17:08 -04:00
2012-04-15 12:44:40 -04:00
2013-09-05 14:58:52 -04:00