Patch "bpf, cpumap: Handle skb as well when clean up ptr_ring" has been added to the 6.1-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    bpf, cpumap: Handle skb as well when clean up ptr_ring

to the 6.1-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     bpf-cpumap-handle-skb-as-well-when-clean-up-ptr_ring.patch
and it can be found in the queue-6.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit fc5a512af4b6a4bff0cf7019a2255f166938d283
Author: Hou Tao <houtao1@xxxxxxxxxx>
Date:   Sat Jul 29 17:51:07 2023 +0800

    bpf, cpumap: Handle skb as well when clean up ptr_ring
    
    [ Upstream commit 7c62b75cd1a792e14b037fa4f61f9b18914e7de1 ]
    
    The following warning was reported when running xdp_redirect_cpu with
    both skb-mode and stress-mode enabled:
    
      ------------[ cut here ]------------
      Incorrect XDP memory type (-2128176192) usage
      WARNING: CPU: 7 PID: 1442 at net/core/xdp.c:405
      Modules linked in:
      CPU: 7 PID: 1442 Comm: kworker/7:0 Tainted: G  6.5.0-rc2+ #1
      Hardware name: QEMU Standard PC (i440FX + PIIX, 1996)
      Workqueue: events __cpu_map_entry_free
      RIP: 0010:__xdp_return+0x1e4/0x4a0
      ......
      Call Trace:
       <TASK>
       ? show_regs+0x65/0x70
       ? __warn+0xa5/0x240
       ? __xdp_return+0x1e4/0x4a0
       ......
       xdp_return_frame+0x4d/0x150
       __cpu_map_entry_free+0xf9/0x230
       process_one_work+0x6b0/0xb80
       worker_thread+0x96/0x720
       kthread+0x1a5/0x1f0
       ret_from_fork+0x3a/0x70
       ret_from_fork_asm+0x1b/0x30
       </TASK>
    
    The reason for the warning is twofold. One is due to the kthread
    cpu_map_kthread_run() is stopped prematurely. Another one is
    __cpu_map_ring_cleanup() doesn't handle skb mode and treats skbs in
    ptr_ring as XDP frames.
    
    Prematurely-stopped kthread will be fixed by the preceding patch and
    ptr_ring will be empty when __cpu_map_ring_cleanup() is called. But
    as the comments in __cpu_map_ring_cleanup() said, handling and freeing
    skbs in ptr_ring as well to "catch any broken behaviour gracefully".
    
    Fixes: 11941f8a8536 ("bpf: cpumap: Implement generic cpumap")
    Signed-off-by: Hou Tao <houtao1@xxxxxxxxxx>
    Acked-by: Jesper Dangaard Brouer <hawk@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20230729095107.1722450-3-houtao@xxxxxxxxxxxxxxx
    Signed-off-by: Martin KaFai Lau <martin.lau@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/kernel/bpf/cpumap.c b/kernel/bpf/cpumap.c
index 09141351d5457..e5888d401d799 100644
--- a/kernel/bpf/cpumap.c
+++ b/kernel/bpf/cpumap.c
@@ -134,11 +134,17 @@ static void __cpu_map_ring_cleanup(struct ptr_ring *ring)
 	 * invoked cpu_map_kthread_stop(). Catch any broken behaviour
 	 * gracefully and warn once.
 	 */
-	struct xdp_frame *xdpf;
+	void *ptr;
 
-	while ((xdpf = ptr_ring_consume(ring)))
-		if (WARN_ON_ONCE(xdpf))
-			xdp_return_frame(xdpf);
+	while ((ptr = ptr_ring_consume(ring))) {
+		WARN_ON_ONCE(1);
+		if (unlikely(__ptr_test_bit(0, &ptr))) {
+			__ptr_clear_bit(0, &ptr);
+			kfree_skb(ptr);
+			continue;
+		}
+		xdp_return_frame(ptr);
+	}
 }
 
 static void put_cpu_map_entry(struct bpf_cpu_map_entry *rcpu)



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux