Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2aecfec7 authored by Dragos Tatulea's avatar Dragos Tatulea Committed by Greg Kroah-Hartman
Browse files

IB/IPoIB: Fix queue count inconsistency for PKEY child interfaces



[ Upstream commit dbc94a0fb81771a38733c0e8f2ea8c4fa6934dc1 ]

There are 2 ways to create IPoIB PKEY child interfaces:
1) Writing a PKEY to /sys/class/net/<ib parent interface>/create_child.
2) Using netlink with iproute.

While with sysfs the child interface has the same number of tx and
rx queues as the parent, with netlink there will always be 1 tx
and 1 rx queue for the child interface. That's because the
get_num_tx/rx_queues() netlink ops are missing and the default value
of 1 is taken for the number of queues (in rtnl_create_link()).

This change adds the get_num_tx/rx_queues() ops which allows for
interfaces with multiple queues to be created over netlink. This
constant only represents the max number of tx and rx queues on that
net device.

Fixes: 9baa0b03 ("IB/ipoib: Add rtnl_link_ops support")
Signed-off-by: default avatarDragos Tatulea <dtatulea@nvidia.com>
Link: https://lore.kernel.org/r/f4a42c8aa43c02d5ae5559a60c3e5e0f18c82531.1670485816.git.leonro@nvidia.com


Signed-off-by: default avatarLeon Romanovsky <leon@kernel.org>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 88f4ea62
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -42,6 +42,11 @@ static const struct nla_policy ipoib_policy[IFLA_IPOIB_MAX + 1] = {
	[IFLA_IPOIB_UMCAST]	= { .type = NLA_U16 },
};

static unsigned int ipoib_get_max_num_queues(void)
{
	return min_t(unsigned int, num_possible_cpus(), 128);
}

static int ipoib_fill_info(struct sk_buff *skb, const struct net_device *dev)
{
	struct ipoib_dev_priv *priv = netdev_priv(dev);
@@ -167,6 +172,8 @@ static struct rtnl_link_ops ipoib_link_ops __read_mostly = {
	.dellink	= ipoib_unregister_child_dev,
	.get_size	= ipoib_get_size,
	.fill_info	= ipoib_fill_info,
	.get_num_rx_queues = ipoib_get_max_num_queues,
	.get_num_tx_queues = ipoib_get_max_num_queues,
};

int __init ipoib_netlink_init(void)