Commit 9d3684c2 authored by Paolo Abeni's avatar Paolo Abeni Committed by David S. Miller

veth: create by default nr_possible_cpus queues

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: default avatarPaolo Abeni <pabeni@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4752eeb3
...@@ -1609,6 +1609,23 @@ static void veth_disable_gro(struct net_device *dev) ...@@ -1609,6 +1609,23 @@ static void veth_disable_gro(struct net_device *dev)
netdev_update_features(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, static int veth_newlink(struct net *src_net, struct net_device *dev,
struct nlattr *tb[], struct nlattr *data[], struct nlattr *tb[], struct nlattr *data[],
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
...@@ -1718,13 +1735,21 @@ static int veth_newlink(struct net *src_net, struct net_device *dev, ...@@ -1718,13 +1735,21 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,
priv = netdev_priv(dev); priv = netdev_priv(dev);
rcu_assign_pointer(priv->peer, peer); rcu_assign_pointer(priv->peer, peer);
err = veth_init_queues(dev, tb);
if (err)
goto err_queues;
priv = netdev_priv(peer); priv = netdev_priv(peer);
rcu_assign_pointer(priv->peer, dev); rcu_assign_pointer(priv->peer, dev);
err = veth_init_queues(peer, tb);
if (err)
goto err_queues;
veth_disable_gro(dev); veth_disable_gro(dev);
return 0; return 0;
err_queues:
unregister_netdevice(dev);
err_register_dev: err_register_dev:
/* nothing to do */ /* nothing to do */
err_configure_peer: err_configure_peer:
...@@ -1770,6 +1795,16 @@ static struct net *veth_get_link_net(const struct net_device *dev) ...@@ -1770,6 +1795,16 @@ static struct net *veth_get_link_net(const struct net_device *dev)
return peer ? dev_net(peer) : dev_net(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 = { static struct rtnl_link_ops veth_link_ops = {
.kind = DRV_NAME, .kind = DRV_NAME,
.priv_size = sizeof(struct veth_priv), .priv_size = sizeof(struct veth_priv),
...@@ -1780,6 +1815,8 @@ static struct rtnl_link_ops veth_link_ops = { ...@@ -1780,6 +1815,8 @@ static struct rtnl_link_ops veth_link_ops = {
.policy = veth_policy, .policy = veth_policy,
.maxtype = VETH_INFO_MAX, .maxtype = VETH_INFO_MAX,
.get_link_net = veth_get_link_net, .get_link_net = veth_get_link_net,
.get_num_tx_queues = veth_get_num_queues,
.get_num_rx_queues = veth_get_num_queues,
}; };
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment