Mirsad Goran Todorovac
13d357d9f2
r8169: fix the KCSAN reported data-race in rtl_tx while reading TxDescArray[entry].opts1
[ Upstream commit dcf75a0f6bc136de94e88178ae5f51b7f879abc9 ]
KCSAN reported the following data-race:
==================================================================
BUG: KCSAN: data-race in rtl8169_poll (drivers/net/ethernet/realtek/r8169_main.c:4368 drivers/net/ethernet/realtek/r8169_main.c:4581) r8169
race at unknown origin, with read to 0xffff888140d37570 of 4 bytes by interrupt on cpu 21:
rtl8169_poll (drivers/net/ethernet/realtek/r8169_main.c:4368 drivers/net/ethernet/realtek/r8169_main.c:4581) r8169
__napi_poll (net/core/dev.c:6527)
net_rx_action (net/core/dev.c:6596 net/core/dev.c:6727)
__do_softirq (kernel/softirq.c:553)
__irq_exit_rcu (kernel/softirq.c:427 kernel/softirq.c:632)
irq_exit_rcu (kernel/softirq.c:647)
sysvec_apic_timer_interrupt (arch/x86/kernel/apic/apic.c:1074 (discriminator 14))
asm_sysvec_apic_timer_interrupt (./arch/x86/include/asm/idtentry.h:645)
cpuidle_enter_state (drivers/cpuidle/cpuidle.c:291)
cpuidle_enter (drivers/cpuidle/cpuidle.c:390)
call_cpuidle (kernel/sched/idle.c:135)
do_idle (kernel/sched/idle.c:219 kernel/sched/idle.c:282)
cpu_startup_entry (kernel/sched/idle.c:378 (discriminator 1))
start_secondary (arch/x86/kernel/smpboot.c:210 arch/x86/kernel/smpboot.c:294)
secondary_startup_64_no_verify (arch/x86/kernel/head_64.S:433)
value changed: 0xb0000042 -> 0x00000000
Reported by Kernel Concurrency Sanitizer on:
CPU: 21 PID: 0 Comm: swapper/21 Tainted: G L 6.6.0-rc2-kcsan-00143-gb5cbe7c00aa0 #41
Hardware name: ASRock X670E PG Lightning/X670E PG Lightning, BIOS 1.21 04/26/2023
==================================================================
The read side is in
drivers/net/ethernet/realtek/r8169_main.c
=========================================
4355 static void rtl_tx(struct net_device *dev, struct rtl8169_private *tp,
4356 int budget)
4357 {
4358 unsigned int dirty_tx, bytes_compl = 0, pkts_compl = 0;
4359 struct sk_buff *skb;
4360
4361 dirty_tx = tp->dirty_tx;
4362
4363 while (READ_ONCE(tp->cur_tx) != dirty_tx) {
4364 unsigned int entry = dirty_tx % NUM_TX_DESC;
4365 u32 status;
4366
→ 4367 status = le32_to_cpu(tp->TxDescArray[entry].opts1);
4368 if (status & DescOwn)
4369 break;
4370
4371 skb = tp->tx_skb[entry].skb;
4372 rtl8169_unmap_tx_skb(tp, entry);
4373
4374 if (skb) {
4375 pkts_compl++;
4376 bytes_compl += skb->len;
4377 napi_consume_skb(skb, budget);
4378 }
4379 dirty_tx++;
4380 }
4381
4382 if (tp->dirty_tx != dirty_tx) {
4383 dev_sw_netstats_tx_add(dev, pkts_compl, bytes_compl);
4384 WRITE_ONCE(tp->dirty_tx, dirty_tx);
4385
4386 netif_subqueue_completed_wake(dev, 0, pkts_compl, bytes_compl,
4387 rtl_tx_slots_avail(tp),
4388 R8169_TX_START_THRS);
4389 /*
4390 * 8168 hack: TxPoll requests are lost when the Tx packets are
4391 * too close. Let's kick an extra TxPoll request when a burst
4392 * of start_xmit activity is detected (if it is not detected,
4393 * it is slow enough). -- FR
4394 * If skb is NULL then we come here again once a tx irq is
4395 * triggered after the last fragment is marked transmitted.
4396 */
4397 if (READ_ONCE(tp->cur_tx) != dirty_tx && skb)
4398 rtl8169_doorbell(tp);
4399 }
4400 }
tp->TxDescArray[entry].opts1 is reported to have a data-race and READ_ONCE() fixes
this KCSAN warning.
4366
→ 4367 status = le32_to_cpu(READ_ONCE(tp->TxDescArray[entry].opts1));
4368 if (status & DescOwn)
4369 break;
4370
Cc: Heiner Kallweit <hkallweit1@gmail.com>
Cc: nic_swsd@realtek.com
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Eric Dumazet <edumazet@google.com>
Cc: Jakub Kicinski <kuba@kernel.org>
Cc: Paolo Abeni <pabeni@redhat.com>
Cc: Marco Elver <elver@google.com>
Cc: netdev@vger.kernel.org
Link: https://lore.kernel.org/lkml/dc7fc8fa-4ea4-e9a9-30a6-7c83e6b53188@alu.unizg.hr/
Signed-off-by: Mirsad Goran Todorovac <mirsad.todorovac@alu.unizg.hr>
Acked-by: Marco Elver <elver@google.com>
Fixes: 1da177e4c3
("Linux-2.6.12-rc2")
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2023-11-08 17:30:41 +01:00
..
2023-05-30 12:57:59 +01:00
2022-04-08 14:39:48 +02:00
2022-12-14 11:32:04 +01:00
2022-06-14 18:32:41 +02:00
2023-07-27 08:44:31 +02:00
2023-06-09 10:30:05 +02:00
2022-11-16 09:57:12 +01:00
2023-01-14 10:15:43 +01:00
2022-12-08 11:23:56 +01:00
2021-10-20 11:45:03 +02:00
2023-09-23 11:01:06 +02:00
2023-10-10 21:53:28 +02:00
2023-04-20 12:10:26 +02:00
2022-12-14 11:32:03 +01:00
2022-11-16 09:57:13 +01:00
2022-09-08 11:11:40 +02:00
2022-05-25 09:18:00 +02:00
2023-08-11 11:57:37 +02:00
2022-07-21 21:20:10 +02:00
2023-09-19 12:20:02 +02:00
2023-07-27 08:44:20 +02:00
2023-10-10 21:53:27 +02:00
2022-11-25 17:45:46 +01:00
2022-01-27 10:54:36 +01:00
2023-08-30 16:23:14 +02:00
2023-10-25 11:54:20 +02:00
2023-10-25 11:54:23 +02:00
2023-09-19 12:20:29 +02:00
2023-10-25 11:54:24 +02:00
2022-11-03 23:57:53 +09:00
2023-07-27 08:44:19 +02:00
2022-08-31 17:15:17 +02:00
2023-02-15 17:22:24 +01:00
2023-01-14 10:16:12 +01:00
2023-04-05 11:23:35 +02:00
2023-01-14 10:15:42 +01:00
2022-12-19 12:27:30 +01:00
2022-12-08 11:23:56 +01:00
2023-05-30 12:57:58 +01:00
2022-03-16 14:15:58 +01:00
2022-12-02 17:40:00 +01:00
2023-05-30 12:57:48 +01:00
2023-07-27 08:44:21 +02:00
2023-10-25 11:54:19 +02:00
2023-06-28 10:28:11 +02:00
2023-01-14 10:16:10 +01:00
2023-11-08 17:30:41 +01:00
2023-10-25 11:54:18 +02:00
2022-09-08 11:11:36 +02:00
2022-03-08 19:09:35 +01:00
2023-07-27 08:43:42 +02:00
2021-08-04 12:46:44 +02:00
2022-07-07 17:52:19 +02:00
2023-08-11 11:57:50 +02:00
2023-10-10 21:53:38 +02:00
2023-06-09 10:30:15 +02:00
2023-10-10 21:53:38 +02:00
2023-04-05 11:23:34 +02:00
2022-11-16 09:57:14 +01:00
2021-09-18 13:40:35 +02:00
2023-08-11 11:57:49 +02:00
2023-04-05 11:23:34 +02:00
2023-01-14 10:15:43 +01:00
2021-10-20 11:45:03 +02:00
2022-11-03 23:57:52 +09:00
2022-01-05 12:40:31 +01:00