Messages in this thread | | | From | Jason Wang <> | Date | Mon, 13 Dec 2021 15:48:53 +0800 | Subject | Re: [PATCH] virtio-net: make copy len check in xdp_linearize_page |
| |
On Mon, Dec 13, 2021 at 12:50 PM <mengensun8801@gmail.com> wrote: > > From: mengensun <mengensun@tencent.com> > > xdp_linearize_page asume ring elem size is smaller then page size > when copy the first ring elem, but, there may be a elem size bigger > then page size. > > add_recvbuf_mergeable may add a hole to ring elem, the hole size is > not sure, according EWMA.
The logic is to try to avoid dropping packets in this case, so I wonder if it's better to "fix" the add_recvbuf_mergeable().
Or another idea is to switch to use XDP generic here where we can use skb_linearize() which should be more robust and we can drop the xdp_linearize_page() logic completely.
Thanks
> > so, fix it by check copy len,if checked failed, just dropped the > whole frame, not make the memory dirty after the page. > > Signed-off-by: mengensun <mengensun@tencent.com> > Reviewed-by: MengLong Dong <imagedong@tencent.com> > Reviewed-by: ZhengXiong Jiang <mungerjiang@tencent.com> > --- > drivers/net/virtio_net.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c > index 36a4b7c195d5..844bdbd67ff7 100644 > --- a/drivers/net/virtio_net.c > +++ b/drivers/net/virtio_net.c > @@ -662,8 +662,12 @@ static struct page *xdp_linearize_page(struct receive_queue *rq, > int page_off, > unsigned int *len) > { > - struct page *page = alloc_page(GFP_ATOMIC); > + struct page *page; > > + if (*len > PAGE_SIZE - page_off) > + return NULL; > + > + page = alloc_page(GFP_ATOMIC); > if (!page) > return NULL; > > -- > 2.27.0 >
| |