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: Paolo Abeni <pabeni@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
4752eeb3d8
commit
9d3684c24a
1 changed files with 37 additions and 0 deletions
|
@ -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,
|
||||||
|
|
||||||
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)
|
||||||
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 = {
|
||||||
.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,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Reference in a new issue