mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
drop_monitor: use raw_cpu_ptr() in tracepoint probes
syzbot reported a preemption warning in sk_skb_reason_drop(): BUG: using smp_processor_id() in preemptible [00000000] code: syz.0.17/5917 caller is net_dm_packet_trace_kfree_skb_hit+0x119/0x350 net/core/drop_monitor.c:519 In net_dm_packet_trace_kfree_skb_hit(), data = this_cpu_ptr(&dm_cpu_data) is evaluated before spin_lock_irqsave(&data->drop_queue.lock, flags). When kfree_skb() is called from preemptible context (e.g. process context during close() on /dev/net/tun), preemption is enabled, triggering the CONFIG_DEBUG_PREEMPT warning in smp_processor_id(). The same pattern exists in net_dm_hw_trap_summary_probe() and net_dm_hw_trap_packet_probe() for dm_hw_cpu_data. This is a false positive because each per-cpu structure is protected by its own spinlock. If the task migrates to another CPU right after reading the per-cpu pointer, the lock still safely synchronizes access to that queue. Use raw_cpu_ptr() instead of this_cpu_ptr() to silence CONFIG_DEBUG_PREEMPT without disturbing interrupt state or breaking PREEMPT_RT locking semantics. Fixes:ca30707dee("drop_monitor: Add packet alert mode") Fixes:5855357cd4("drop_monitor: Prepare probe functions for devlink tracepoint") Reported-by: syzbot+dc57fd6722deb17e92af@syzkaller.appspotmail.com Closes: https://lore.kernel.org/netdev/6aa316b2.f81106d8.2ab401.0014.GAE@google.com/ Signed-off-by: Eric Dumazet <edumazet@google.com> Link: https://patch.msgid.link/20260910204612.3762015-4-edumazet@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
c391a40f71
commit
c19b7d3508
|
|
@ -448,7 +448,7 @@ net_dm_hw_trap_summary_probe(void *ignore, const struct devlink *devlink,
|
|||
if (metadata->trap_type == DEVLINK_TRAP_TYPE_CONTROL)
|
||||
return;
|
||||
|
||||
hw_data = this_cpu_ptr(&dm_hw_cpu_data);
|
||||
hw_data = raw_cpu_ptr(&dm_hw_cpu_data);
|
||||
raw_spin_lock_irqsave(&hw_data->lock, flags);
|
||||
hw_entries = hw_data->hw_entries;
|
||||
|
||||
|
|
@ -516,7 +516,7 @@ static void net_dm_packet_trace_kfree_skb_hit(void *ignore,
|
|||
*/
|
||||
nskb->tstamp = tstamp;
|
||||
|
||||
data = this_cpu_ptr(&dm_cpu_data);
|
||||
data = raw_cpu_ptr(&dm_cpu_data);
|
||||
|
||||
spin_lock_irqsave(&data->drop_queue.lock, flags);
|
||||
if (skb_queue_len(&data->drop_queue) < net_dm_queue_len)
|
||||
|
|
@ -983,7 +983,7 @@ net_dm_hw_trap_packet_probe(void *ignore, const struct devlink *devlink,
|
|||
NET_DM_SKB_CB(nskb)->hw_metadata = n_hw_metadata;
|
||||
nskb->tstamp = tstamp;
|
||||
|
||||
hw_data = this_cpu_ptr(&dm_hw_cpu_data);
|
||||
hw_data = raw_cpu_ptr(&dm_hw_cpu_data);
|
||||
|
||||
spin_lock_irqsave(&hw_data->drop_queue.lock, flags);
|
||||
if (skb_queue_len(&hw_data->drop_queue) < net_dm_queue_len)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user