Message ID | 20230113080016.45505-3-hengqi@linux.alibaba.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | virtio-net: support multi buffer xdp | expand |
On Fri, 13 Jan 2023 16:00:08 +0800 Heng Qi wrote: > When single-buffer xdp is loaded, the size of the buffer filled each time > is 'sz = (PAGE_SIZE - headroom - tailroom)', which is the maximum packet > length that the driver allows the device to pass in. Otherwise, the packet > with a length greater than sz will come in, so num_buf will be greater than > or equal to 2, and then xdp_linearize_page() will be performed and the > packet will be dropped because the total length is greater than PAGE_SIZE. > So the maximum value of MTU for single-buffer xdp is 'max_sz = sz - ETH_HLEN'. drivers/net/virtio_net.c:3111:56: warning: format specifies type 'unsigned long' but the argument has type 'unsigned int' [-Wformat] netdev_warn(dev, "XDP requires MTU less than %lu\n", max_sz); ~~~ ^~~~~~ %u
在 2023/1/14 下午2:24, Jakub Kicinski 写道: > On Fri, 13 Jan 2023 16:00:08 +0800 Heng Qi wrote: >> When single-buffer xdp is loaded, the size of the buffer filled each time >> is 'sz = (PAGE_SIZE - headroom - tailroom)', which is the maximum packet >> length that the driver allows the device to pass in. Otherwise, the packet >> with a length greater than sz will come in, so num_buf will be greater than >> or equal to 2, and then xdp_linearize_page() will be performed and the >> packet will be dropped because the total length is greater than PAGE_SIZE. >> So the maximum value of MTU for single-buffer xdp is 'max_sz = sz - ETH_HLEN'. > drivers/net/virtio_net.c:3111:56: warning: format specifies type 'unsigned long' but the argument has type 'unsigned int' [-Wformat] > netdev_warn(dev, "XDP requires MTU less than %lu\n", max_sz); > ~~~ ^~~~~~ > %u The corresponding netdev_warn are split into [PATCH net-next v4 03/10], and I will reorganize the patches [PATCH net-next v4 02/10] and [PATCH net-next v4 03/10] to be more independent. Thanks.
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 443aa7b8f0ad..87226dd8d262 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; struct virtnet_info *vi = netdev_priv(dev); struct bpf_prog *old_prog; u16 xdp_qp = 0, curr_qp;