From 2e49de59def6a3e073646ea641fbde2d1d993d10 Mon Sep 17 00:00:00 2001 From: Xuan Zhuo Date: Mon, 23 Nov 2020 10:18:24 +0800 Subject: [PATCH 2707/2944] ck: virtio: add module option to force_xdp to #30641046 * VIRTIO_NET_F_GUEST_CSUM * VIRTIO_NET_F_GUEST_TSO4 * VIRTIO_NET_F_GUEST_TSO6 * VIRTIO_NET_F_GUEST_ECN * VIRTIO_NET_F_GUEST_UFO * VIRTIO_NET_F_MTU If these features are negotiated successfully, it may cause virtio-net to receive large packages, which will cause xdp to fail to load. And in many cases, it cannot be dynamically turned off, so add a module option to turn off these features. Signed-off-by: Xuan Zhuo Acked-by: Tony Lu Acked-by: Dust Li --- drivers/net/virtio_net.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 8a3db47..9459965 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -36,13 +36,17 @@ #include #include +/* skip virtio_check_driver_offered_feature check for force_xdp */ +#define virtio_has_feature __virtio_test_bit + static int napi_weight = NAPI_POLL_WEIGHT; module_param(napi_weight, int, 0444); -static bool csum = true, gso = true, napi_tx; +static bool csum = true, gso = true, napi_tx, force_xdp; module_param(csum, bool, 0444); module_param(gso, bool, 0444); module_param(napi_tx, bool, 0644); +module_param(force_xdp, bool, 0644); /* FIXME: MTU in config. */ #define GOOD_PACKET_LEN (ETH_HLEN + VLAN_HLEN + ETH_DATA_LEN) @@ -3244,6 +3248,22 @@ static __maybe_unused int virtnet_restore(struct virtio_device *vdev) VIRTIO_F_ANY_LAYOUT, }; +static unsigned int features_force_xdp[] = { + VIRTIO_NET_F_CSUM, + VIRTIO_NET_F_MAC, + VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_UFO, VIRTIO_NET_F_HOST_TSO6, + VIRTIO_NET_F_HOST_ECN, + VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS, VIRTIO_NET_F_CTRL_VQ, + VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN, + VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ, + VIRTIO_NET_F_CTRL_MAC_ADDR, + VIRTIO_NET_F_CTRL_GUEST_OFFLOADS, + VIRTIO_NET_F_SPEED_DUPLEX, VIRTIO_NET_F_STANDBY, + /* legacy */ + VIRTIO_NET_F_GSO, + VIRTIO_F_ANY_LAYOUT, +}; + static struct virtio_driver virtio_net_driver = { .feature_table = features, .feature_table_size = ARRAY_SIZE(features), @@ -3277,6 +3297,16 @@ static __init int virtio_net_driver_init(void) if (ret) goto err_dead; + if (force_xdp) { + virtio_net_driver.feature_table = features_force_xdp; + virtio_net_driver.feature_table_size = + ARRAY_SIZE(features_force_xdp) - 2; + + virtio_net_driver.feature_table_legacy = features_force_xdp; + virtio_net_driver.feature_table_size_legacy = + ARRAY_SIZE(features_force_xdp); + } + ret = register_virtio_driver(&virtio_net_driver); if (ret) goto err_virtio; -- 1.8.3.1