On Mon, Jan 9, 2023 at 10:48 AM Heng Qi <hengqi@xxxxxxxxxxxxxxxxx> wrote: > > > > 在 2023/1/3 下午2:40, Heng Qi 写道: > > When the xdp program sets xdp.frags, which means it can process > > multi-buffer packets over larger MTU, so we continue to support xdp. > > But for single-buffer xdp, we should keep checking for MTU. > > > > Signed-off-by: Heng Qi <hengqi@xxxxxxxxxxxxxxxxx> > > Reviewed-by: Xuan Zhuo <xuanzhuo@xxxxxxxxxxxxxxxxx> > > --- > > drivers/net/virtio_net.c | 10 ++++++---- > > 1 file changed, 6 insertions(+), 4 deletions(-) > > > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c > > index 443aa7b8f0ad..60e199811212 100644 > > --- a/drivers/net/virtio_net.c > > +++ b/drivers/net/virtio_net.c > > @@ -3074,7 +3074,9 @@ static int virtnet_restore_guest_offloads(struct virtnet_info *vi) > > static int virtnet_xdp_set(struct net_device *dev, struct bpf_prog *prog, > > struct netlink_ext_ack *extack) > > { > > - unsigned long int max_sz = PAGE_SIZE - sizeof(struct padded_vnet_hdr); > > + unsigned int room = SKB_DATA_ALIGN(VIRTIO_XDP_HEADROOM + > > + sizeof(struct skb_shared_info)); > > + unsigned int max_sz = PAGE_SIZE - room - ETH_HLEN; > > Hi Jason, I've updated the calculation of 'max_sz' in this patch instead > of a separate bugfix, since doing so also seemed clear. Sure, I will review it with this series no later than the end of this week. Thanks > > Thanks. > > > struct virtnet_info *vi = netdev_priv(dev); > > struct bpf_prog *old_prog; > > u16 xdp_qp = 0, curr_qp; > > @@ -3095,9 +3097,9 @@ static int virtnet_xdp_set(struct net_device *dev, struct bpf_prog *prog, > > return -EINVAL; > > } > > > > - if (dev->mtu > max_sz) { > > - NL_SET_ERR_MSG_MOD(extack, "MTU too large to enable XDP"); > > - netdev_warn(dev, "XDP requires MTU less than %lu\n", max_sz); > > + if (prog && !prog->aux->xdp_has_frags && dev->mtu > max_sz) { > > + NL_SET_ERR_MSG_MOD(extack, "MTU too large to enable XDP without frags"); > > + netdev_warn(dev, "single-buffer XDP requires MTU less than %u\n", max_sz); > > return -EINVAL; > > } > > >