XDP core assumes that the frame_size of xdp_buff and the length of the frag are PAGE_SIZE. But before xdp is set, the length of the prefilled buffer may exceed PAGE_SIZE, which may cause the processing of xdp to fail, so we disable the hole mechanism when xdp is loaded. Signed-off-by: Heng Qi <hengqi@xxxxxxxxxxxxxxxxx> Reviewed-by: Xuan Zhuo <xuanzhuo@xxxxxxxxxxxxxxxxx> --- drivers/net/virtio_net.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 9cce7dec7366..c5046d21b281 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -1419,8 +1419,11 @@ static int add_recvbuf_mergeable(struct virtnet_info *vi, /* To avoid internal fragmentation, if there is very likely not * enough space for another buffer, add the remaining space to * the current buffer. + * XDP core assumes that frame_size of xdp_buff and the length + * of the frag are PAGE_SIZE, so we disable the hole mechanism. */ - len += hole; + if (!vi->xdp_enabled) + len += hole; alloc_frag->offset += hole; } -- 2.19.1.6.gb485710b