* [PATCH net] net/mlx4: always create the eth and ib auxiliary devices
@ 2026-10-20 16:42 Peter Morrow
2026-10-20 16:48 ` sashiko-bot
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Peter Morrow @ 2026-10-20 16:42 UTC (permalink / raw)
To: Tariq Toukan
Cc: Leon Romanovsky, Petr Pavlu, Yishai Hadas, Jakub Kicinski,
Paolo Abeni, Eric Dumazet, Andrew Lunn, David S . Miller, netdev,
linux-rdma, regressions, Peter Morrow
Since commit 7d22b1cb9d84 ("mlx4: Connect the infiniband part to the
auxiliary bus"), mlx4_core creates the "ib" auxiliary device only for
an IB port or a device that advertises IBoE. Before it, each mlx4
interface was offered every device and decided in its own add callback.
mlx4_ib_add() accepted Ethernet ports without IBoE and registered them
for raw packet QPs only.
ConnectX-3 VFs on Azure have an Ethernet port and no IBoE, so since
v6.6 they get no RDMA device. DPDK's mlx4 PMD, which needs only raw
packet QPs, then cannot open them:
net_mlx4: cannot access device, is mlx4_ib loaded?
Restore the old behaviour by creating both auxiliary devices for every
device and letting mlx4_en and mlx4_ib decide in probe, as their add
callbacks did. mlx4_ib_probe() returns -ENODEV when there are no usable
ports, and mlx4_en_probe() binds a device without Ethernet ports but
creates no netdevs, as mlx4_en_add() did.
Tested on 6.12.111 on an Azure VM with two ConnectX-3 VFs: each gets an
eth and an ib auxiliary device, and DPDK attaches both VFs and passes
traffic through them.
Fixes: 7d22b1cb9d84 ("mlx4: Connect the infiniband part to the auxiliary bus")
Closes: https://lore.kernel.org/r/20261014133951.3219055-1-pdmorrow@gmail.com
Suggested-by: Leon Romanovsky <leon@kernel.org>
Assisted-by: LLM
Signed-off-by: Peter Morrow <pdmorrow@gmail.com>
---
drivers/net/ethernet/mellanox/mlx4/intf.c | 15 ++-------------
1 file changed, 2 insertions(+), 13 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlx4/intf.c b/drivers/net/ethernet/mellanox/mlx4/intf.c
index 82e467c..31860b4 100644
--- a/drivers/net/ethernet/mellanox/mlx4/intf.c
+++ b/drivers/net/ethernet/mellanox/mlx4/intf.c
@@ -43,23 +43,12 @@ static DEFINE_IDA(mlx4_adev_ida);
static bool is_eth_supported(struct mlx4_dev *dev)
{
- for (int port = 1; port <= dev->caps.num_ports; port++)
- if (dev->caps.port_type[port] == MLX4_PORT_TYPE_ETH)
- return true;
-
- return false;
+ return true;
}
static bool is_ib_supported(struct mlx4_dev *dev)
{
- for (int port = 1; port <= dev->caps.num_ports; port++)
- if (dev->caps.port_type[port] == MLX4_PORT_TYPE_IB)
- return true;
-
- if (dev->caps.flags & MLX4_DEV_CAP_FLAG_IBOE)
- return true;
-
- return false;
+ return true;
}
static const struct mlx4_adev_device {
--
2.47.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH net] net/mlx4: always create the eth and ib auxiliary devices
2026-10-20 16:42 [PATCH net] net/mlx4: always create the eth and ib auxiliary devices Peter Morrow
@ 2026-10-20 16:48 ` sashiko-bot
2026-10-22 10:19 ` Simon Horman
2026-10-23 11:22 ` Daniel Machon
2 siblings, 0 replies; 6+ messages in thread
From: sashiko-bot @ 2026-10-20 16:48 UTC (permalink / raw)
To: Peter Morrow; +Cc: linux-rdma
> Since commit 7d22b1cb9d84 ("mlx4: Connect the infiniband part to the
> auxiliary bus"), mlx4_core creates the "ib" auxiliary device only for
> an IB port or a device that advertises IBoE. Before it, each mlx4
> interface was offered every device and decided in its own add callback.
> mlx4_ib_add() accepted Ethernet ports without IBoE and registered them
> for raw packet QPs only.
>
> ConnectX-3 VFs on Azure have an Ethernet port and no IBoE, so since
> v6.6 they get no RDMA device. DPDK's mlx4 PMD, which needs only raw
> packet QPs, then cannot open them:
>
> net_mlx4: cannot access device, is mlx4_ib loaded?
>
> Restore the old behaviour by creating both auxiliary devices for every
> device and letting mlx4_en and mlx4_ib decide in probe, as their add
> callbacks did. mlx4_ib_probe() returns -ENODEV when there are no usable
> ports, and mlx4_en_probe() binds a device without Ethernet ports but
> creates no netdevs, as mlx4_en_add() did.
>
> Tested on 6.12.111 on an Azure VM with two ConnectX-3 VFs: each gets an
> eth and an ib auxiliary device, and DPDK attaches both VFs and passes
> traffic through them.
>
> Fixes: 7d22b1cb9d84 ("mlx4: Connect the infiniband part to the auxiliary bus")
> Closes: https://lore.kernel.org/r/20261014133951.3219055-1-pdmorrow@gmail.com
> Suggested-by: Leon Romanovsky <leon@kernel.org>
> Assisted-by: LLM
> Signed-off-by: Peter Morrow <pdmorrow@gmail.com>
Sashiko has reviewed this patch and found no issues.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261020164239.3808903-1-pdmorrow@gmail.com?part=1
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH net] net/mlx4: always create the eth and ib auxiliary devices
2026-10-20 16:42 [PATCH net] net/mlx4: always create the eth and ib auxiliary devices Peter Morrow
2026-10-20 16:48 ` sashiko-bot
@ 2026-10-22 10:19 ` Simon Horman
2026-10-23 14:08 ` Peter Morrow
2026-10-23 11:22 ` Daniel Machon
2 siblings, 1 reply; 6+ messages in thread
From: Simon Horman @ 2026-10-22 10:19 UTC (permalink / raw)
To: Peter Morrow
Cc: Tariq Toukan, Leon Romanovsky, Petr Pavlu, Yishai Hadas,
Jakub Kicinski, Paolo Abeni, Eric Dumazet, Andrew Lunn,
David S . Miller, netdev, linux-rdma, regressions
On Tue, Oct 20, 2026 at 05:42:39PM +0100, Peter Morrow wrote:
> Since commit 7d22b1cb9d84 ("mlx4: Connect the infiniband part to the
> auxiliary bus"), mlx4_core creates the "ib" auxiliary device only for
> an IB port or a device that advertises IBoE. Before it, each mlx4
> interface was offered every device and decided in its own add callback.
> mlx4_ib_add() accepted Ethernet ports without IBoE and registered them
> for raw packet QPs only.
>
> ConnectX-3 VFs on Azure have an Ethernet port and no IBoE, so since
> v6.6 they get no RDMA device. DPDK's mlx4 PMD, which needs only raw
> packet QPs, then cannot open them:
>
> net_mlx4: cannot access device, is mlx4_ib loaded?
>
> Restore the old behaviour by creating both auxiliary devices for every
> device and letting mlx4_en and mlx4_ib decide in probe, as their add
> callbacks did. mlx4_ib_probe() returns -ENODEV when there are no usable
> ports, and mlx4_en_probe() binds a device without Ethernet ports but
> creates no netdevs, as mlx4_en_add() did.
>
> Tested on 6.12.111 on an Azure VM with two ConnectX-3 VFs: each gets an
> eth and an ib auxiliary device, and DPDK attaches both VFs and passes
> traffic through them.
>
> Fixes: 7d22b1cb9d84 ("mlx4: Connect the infiniband part to the auxiliary bus")
> Closes: https://lore.kernel.org/r/20261014133951.3219055-1-pdmorrow@gmail.com
> Suggested-by: Leon Romanovsky <leon@kernel.org>
> Assisted-by: LLM
> Signed-off-by: Peter Morrow <pdmorrow@gmail.com>
Thanks, this looks good to me.
And I think the minimal approach taken here is appropriate for net.
Reviewed-by: Simon Horman <horms@kernel.org>
I do, however, wonder if a follow-up is warranted.
It seems to me that the is_supported callback could
be removed entirely. Leaving either:
1. struct mlx4_adev_device with a single member, .suffix
2. mlx4_adev_devices as an array of of strings
To explore this idea a little further I tried coding-up approach 2.
Which lead to the following (compile tested only):
diff --git a/drivers/net/ethernet/mellanox/mlx4/intf.c b/drivers/net/ethernet/mellanox/mlx4/intf.c
index 82e467c45d23..f2f35306aeb3 100644
--- a/drivers/net/ethernet/mellanox/mlx4/intf.c
+++ b/drivers/net/ethernet/mellanox/mlx4/intf.c
@@ -41,34 +41,7 @@
static DEFINE_MUTEX(intf_mutex);
static DEFINE_IDA(mlx4_adev_ida);
-static bool is_eth_supported(struct mlx4_dev *dev)
-{
- for (int port = 1; port <= dev->caps.num_ports; port++)
- if (dev->caps.port_type[port] == MLX4_PORT_TYPE_ETH)
- return true;
-
- return false;
-}
-
-static bool is_ib_supported(struct mlx4_dev *dev)
-{
- for (int port = 1; port <= dev->caps.num_ports; port++)
- if (dev->caps.port_type[port] == MLX4_PORT_TYPE_IB)
- return true;
-
- if (dev->caps.flags & MLX4_DEV_CAP_FLAG_IBOE)
- return true;
-
- return false;
-}
-
-static const struct mlx4_adev_device {
- const char *suffix;
- bool (*is_supported)(struct mlx4_dev *dev);
-} mlx4_adev_devices[] = {
- { "eth", is_eth_supported },
- { "ib", is_ib_supported },
-};
+static const char * const mlx4_adev_devices[] = { "eth", "ib" };
int mlx4_adev_init(struct mlx4_dev *dev)
{
@@ -109,8 +82,8 @@ static void adev_release(struct device *dev)
static struct mlx4_adev *add_adev(struct mlx4_dev *dev, int idx)
{
+ const char *suffix = mlx4_adev_devices[idx];
struct mlx4_priv *priv = mlx4_priv(dev);
- const char *suffix = mlx4_adev_devices[idx].suffix;
struct auxiliary_device *adev;
struct mlx4_adev *madev;
int ret;
@@ -222,7 +195,7 @@ int mlx4_do_bond(struct mlx4_dev *dev, bool enable)
priv->adev[i] = add_adev(dev, i);
if (IS_ERR(priv->adev[i])) {
mlx4_warn(dev, "Device[%d] (%s) failed to load\n", i,
- mlx4_adev_devices[i].suffix);
+ mlx4_adev_devices[i]);
priv->adev[i] = NULL;
continue;
}
@@ -269,21 +242,13 @@ static int add_drivers(struct mlx4_dev *dev)
int i, ret = 0;
for (i = 0; i < ARRAY_SIZE(mlx4_adev_devices); i++) {
- bool is_supported = false;
-
if (priv->adev[i])
continue;
- if (mlx4_adev_devices[i].is_supported)
- is_supported = mlx4_adev_devices[i].is_supported(dev);
-
- if (!is_supported)
- continue;
-
priv->adev[i] = add_adev(dev, i);
if (IS_ERR(priv->adev[i])) {
mlx4_warn(dev, "Device[%d] (%s) failed to load\n", i,
- mlx4_adev_devices[i].suffix);
+ mlx4_adev_devices[i]);
/* We continue to rescan drivers and leave to the caller
* to make decision if to release everything or
* continue. */
@@ -297,23 +262,15 @@ static int add_drivers(struct mlx4_dev *dev)
static void delete_drivers(struct mlx4_dev *dev)
{
struct mlx4_priv *priv = mlx4_priv(dev);
- bool delete_all;
int i;
- delete_all = !(dev->persist->interface_state & MLX4_INTERFACE_STATE_UP);
+ if (dev->persist->interface_state & MLX4_INTERFACE_STATE_UP)
+ return;
for (i = ARRAY_SIZE(mlx4_adev_devices) - 1; i >= 0; i--) {
- bool is_supported = false;
-
if (!priv->adev[i])
continue;
- if (mlx4_adev_devices[i].is_supported && !delete_all)
- is_supported = mlx4_adev_devices[i].is_supported(dev);
-
- if (is_supported)
- continue;
-
del_adev(&priv->adev[i]->adev);
priv->adev[i] = NULL;
}
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH net] net/mlx4: always create the eth and ib auxiliary devices
2026-10-20 16:42 [PATCH net] net/mlx4: always create the eth and ib auxiliary devices Peter Morrow
2026-10-20 16:48 ` sashiko-bot
2026-10-22 10:19 ` Simon Horman
@ 2026-10-23 11:22 ` Daniel Machon
2 siblings, 0 replies; 6+ messages in thread
From: Daniel Machon @ 2026-10-23 11:22 UTC (permalink / raw)
To: Peter Morrow
Cc: Tariq Toukan, Leon Romanovsky, Petr Pavlu, Yishai Hadas,
Jakub Kicinski, Paolo Abeni, Eric Dumazet, Andrew Lunn,
David S . Miller, netdev, linux-rdma, regressions
> Since commit 7d22b1cb9d84 ("mlx4: Connect the infiniband part to the
> auxiliary bus"), mlx4_core creates the "ib" auxiliary device only for
> an IB port or a device that advertises IBoE. Before it, each mlx4
> interface was offered every device and decided in its own add callback.
> mlx4_ib_add() accepted Ethernet ports without IBoE and registered them
> for raw packet QPs only.
>
> ConnectX-3 VFs on Azure have an Ethernet port and no IBoE, so since
> v6.6 they get no RDMA device. DPDK's mlx4 PMD, which needs only raw
> packet QPs, then cannot open them:
>
> net_mlx4: cannot access device, is mlx4_ib loaded?
>
> Restore the old behaviour by creating both auxiliary devices for every
> device and letting mlx4_en and mlx4_ib decide in probe, as their add
> callbacks did. mlx4_ib_probe() returns -ENODEV when there are no usable
> ports, and mlx4_en_probe() binds a device without Ethernet ports but
> creates no netdevs, as mlx4_en_add() did.
>
> Tested on 6.12.111 on an Azure VM with two ConnectX-3 VFs: each gets an
> eth and an ib auxiliary device, and DPDK attaches both VFs and passes
> traffic through them.
>
> Fixes: 7d22b1cb9d84 ("mlx4: Connect the infiniband part to the auxiliary bus")
> Closes: https://lore.kernel.org/r/20261014133951.3219055-1-pdmorrow@gmail.com
> Suggested-by: Leon Romanovsky <leon@kernel.org>
> Assisted-by: LLM
> Signed-off-by: Peter Morrow <pdmorrow@gmail.com>
Reviewed-by: Daniel Machon <daniel.machon@microchip.com>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH net] net/mlx4: always create the eth and ib auxiliary devices
2026-10-22 10:19 ` Simon Horman
@ 2026-10-23 14:08 ` Peter Morrow
2026-10-23 16:56 ` Simon Horman
0 siblings, 1 reply; 6+ messages in thread
From: Peter Morrow @ 2026-10-23 14:08 UTC (permalink / raw)
To: Simon Horman
Cc: Tariq Toukan, Leon Romanovsky, Petr Pavlu, Yishai Hadas,
Jakub Kicinski, Paolo Abeni, Eric Dumazet, Andrew Lunn,
David S . Miller, netdev, linux-rdma, regressions
On Thu, 22 Oct 2026 at 11:19, Simon Horman <horms@kernel.org> wrote:
>
> Thanks, this looks good to me.
> And I think the minimal approach taken here is appropriate for net.
>
> Reviewed-by: Simon Horman <horms@kernel.org>
>
> I do, however, wonder if a follow-up is warranted.
> It seems to me that the is_supported callback could
> be removed entirely. Leaving either:
> 1. struct mlx4_adev_device with a single member, .suffix
> 2. mlx4_adev_devices as an array of of strings
>
> To explore this idea a little further I tried coding-up approach 2.
> Which lead to the following (compile tested only):
[...]
Thanks Simon. Agreed, a cleanup here would be nice. I'm happy to test
and send your suggested patch to net-next once/if the reviewed change is
merged, unless you'd like to send it yourself.
Thanks,
Peter
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH net] net/mlx4: always create the eth and ib auxiliary devices
2026-10-23 14:08 ` Peter Morrow
@ 2026-10-23 16:56 ` Simon Horman
0 siblings, 0 replies; 6+ messages in thread
From: Simon Horman @ 2026-10-23 16:56 UTC (permalink / raw)
To: Peter Morrow
Cc: Tariq Toukan, Leon Romanovsky, Petr Pavlu, Yishai Hadas,
Jakub Kicinski, Paolo Abeni, Eric Dumazet, Andrew Lunn,
David S . Miller, netdev, linux-rdma, regressions
On Fri, Oct 23, 2026 at 03:08:23PM +0100, Peter Morrow wrote:
> On Thu, 22 Oct 2026 at 11:19, Simon Horman <horms@kernel.org> wrote:
> >
> > Thanks, this looks good to me.
> > And I think the minimal approach taken here is appropriate for net.
> >
> > Reviewed-by: Simon Horman <horms@kernel.org>
> >
> > I do, however, wonder if a follow-up is warranted.
> > It seems to me that the is_supported callback could
> > be removed entirely. Leaving either:
> > 1. struct mlx4_adev_device with a single member, .suffix
> > 2. mlx4_adev_devices as an array of of strings
> >
> > To explore this idea a little further I tried coding-up approach 2.
> > Which lead to the following (compile tested only):
> [...]
>
> Thanks Simon. Agreed, a cleanup here would be nice. I'm happy to test
> and send your suggested patch to net-next once/if the reviewed change is
> merged, unless you'd like to send it yourself.
Thanks Peter,
If you could handle preparing and posting a formal patch I'd be most grateful.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-10-23 16:56 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-20 16:42 [PATCH net] net/mlx4: always create the eth and ib auxiliary devices Peter Morrow
2026-10-20 16:48 ` sashiko-bot
2026-10-22 10:19 ` Simon Horman
2026-10-23 14:08 ` Peter Morrow
2026-10-23 16:56 ` Simon Horman
2026-10-23 11:22 ` Daniel Machon
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox