On 6/4/25 07:37, Jason Wang wrote:
On Tue, Jun 3, 2025 at 11:07 PM Bui Quang Minh <minhquangbu...@gmail.com> wrote:
In virtio-net, we have not yet supported multi-buffer XDP packet in
zerocopy mode when there is a binding XDP program. However, in that
case, when receiving multi-buffer XDP packet, we skip the XDP program
and return XDP_PASS. As a result, the packet is passed to normal network
stack which is an incorrect behavior. This commit instead returns
XDP_DROP in that case.

Fixes: 99c861b44eb1 ("virtio_net: xsk: rx: support recv merge mode")
Cc: sta...@vger.kernel.org
Signed-off-by: Bui Quang Minh <minhquangbu...@gmail.com>
---
  drivers/net/virtio_net.c | 11 ++++++++---
  1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index e53ba600605a..4c35324d6e5b 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -1309,9 +1309,14 @@ static struct sk_buff *virtnet_receive_xsk_merge(struct 
net_device *dev, struct
         ret = XDP_PASS;
It would be simpler to just assign XDP_DROP here?

Or if you wish to stick to the way, we can simply remove this assignment.

This XDP_PASS is returned for the case when there is no XDP program binding (!prog).


         rcu_read_lock();
         prog = rcu_dereference(rq->xdp_prog);
-       /* TODO: support multi buffer. */
-       if (prog && num_buf == 1)
-               ret = virtnet_xdp_handler(prog, xdp, dev, xdp_xmit, stats);
+       if (prog) {
+               /* TODO: support multi buffer. */
+               if (num_buf == 1)
+                       ret = virtnet_xdp_handler(prog, xdp, dev, xdp_xmit,
+                                                 stats);
+               else
+                       ret = XDP_DROP;
+       }
         rcu_read_unlock();

         switch (ret) {
--
2.43.0

Thanks



Thanks,
Quang Minh.



Reply via email to