veth: create by default nr_possible_cpus queues
authorPaolo Abeni <pabeni@redhat.com>
Tue, 20 Jul 2021 08:41:51 +0000 (10:41 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 20 Jul 2021 13:11:18 +0000 (06:11 -0700)
This allows easier XDP usage. The number of default active
queues is not changed: 1 RX and 1 TX so that this does
not introduce overhead on the datapath for queue selection.

v1 -> v2:
 - drop the module parameter, force default to nr_possible_cpus - Toke

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/veth.c

index ae869c0..381670c 100644 (file)
@@ -1609,6 +1609,23 @@ static void veth_disable_gro(struct net_device *dev)
        netdev_update_features(dev);
 }
 
+static int veth_init_queues(struct net_device *dev, struct nlattr *tb[])
+{
+       int err;
+
+       if (!tb[IFLA_NUM_TX_QUEUES] && dev->num_tx_queues > 1) {
+               err = netif_set_real_num_tx_queues(dev, 1);
+               if (err)
+                       return err;
+       }
+       if (!tb[IFLA_NUM_RX_QUEUES] && dev->num_rx_queues > 1) {
+               err = netif_set_real_num_rx_queues(dev, 1);
+               if (err)
+                       return err;
+       }
+       return 0;
+}
+
 static int veth_newlink(struct net *src_net, struct net_device *dev,
                        struct nlattr *tb[], struct nlattr *data[],
                        struct netlink_ext_ack *extack)
@@ -1718,13 +1735,21 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,
 
        priv = netdev_priv(dev);
        rcu_assign_pointer(priv->peer, peer);
+       err = veth_init_queues(dev, tb);
+       if (err)
+               goto err_queues;
 
        priv = netdev_priv(peer);
        rcu_assign_pointer(priv->peer, dev);
+       err = veth_init_queues(peer, tb);
+       if (err)
+               goto err_queues;
 
        veth_disable_gro(dev);
        return 0;
 
+err_queues:
+       unregister_netdevice(dev);
 err_register_dev:
        /* nothing to do */
 err_configure_peer:
@@ -1770,6 +1795,16 @@ static struct net *veth_get_link_net(const struct net_device *dev)
        return peer ? dev_net(peer) : dev_net(dev);
 }
 
+static unsigned int veth_get_num_queues(void)
+{
+       /* enforce the same queue limit as rtnl_create_link */
+       int queues = num_possible_cpus();
+
+       if (queues > 4096)
+               queues = 4096;
+       return queues;
+}
+
 static struct rtnl_link_ops veth_link_ops = {
        .kind           = DRV_NAME,
        .priv_size      = sizeof(struct veth_priv),
@@ -1780,6 +1815,8 @@ static struct rtnl_link_ops veth_link_ops = {
        .policy         = veth_policy,
        .maxtype        = VETH_INFO_MAX,
        .get_link_net   = veth_get_link_net,
+       .get_num_tx_queues      = veth_get_num_queues,
+       .get_num_rx_queues      = veth_get_num_queues,
 };
 
 /*