It handles the case when qemu performs read on tun using file operations. Signed-off-by: Prashant Bhole <prashantbhole.linux@xxxxxxxxx> --- drivers/net/tun.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 084ca95358fe..639921c10e32 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -2318,8 +2318,10 @@ static ssize_t tun_do_read(struct tun_struct *tun, struct tun_file *tfile, struct iov_iter *to, int noblock, void *ptr) { + struct xdp_frame *frame; ssize_t ret; int err; + u32 act; tun_debug(KERN_INFO, tun, "tun_do_read\n"); @@ -2333,6 +2335,15 @@ static ssize_t tun_do_read(struct tun_struct *tun, struct tun_file *tfile, ptr = tun_ring_recv(tfile, noblock, &err); if (!ptr) return err; + + if (tun_is_xdp_frame(ptr)) { + frame = tun_ptr_to_xdp(ptr); + act = tun_do_xdp_offload(tun, tfile, frame); + } else { + act = tun_do_xdp_offload_generic(tun, ptr); + } + if (act != XDP_PASS) + return err; } if (tun_is_xdp_frame(ptr)) { -- 2.20.1