Patch "IB/mlx4: Fix incorrectly releasing steerable UD QPs when have only ETH ports" has been added to the 4.14-stable tree
Subsystems (5)
This is a note to let you know that I've just added the patch titled
IB/mlx4: Fix incorrectly releasing steerable UD QPs when have only ETH ports
to the 4.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
ib-mlx4-fix-incorrectly-releasing-steerable-ud-qps-when-have-only-eth-ports.patch
and it can be found in the queue-4.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
852f6927594d0d3e8632c889b2ab38cbc46476adMon Sep 17 00:00:00 2001
From: Jack Morgenstein <[email protected]>
Date: Fri, 12 Jan 2018 07:58:40 +0200
Subject: IB/mlx4: Fix incorrectly releasing steerable UD QPs when have only ETH ports
From: Jack Morgenstein <[email protected]>
commit 852f6927594d0d3e8632c889b2ab38cbc46476ad upstream.
Allocating steerable UD QPs depends on having at least one IB port, while releasing those QPs does not.
As a result, when there are only ETH ports, the IB (RoCE) driver requests releasing a qp range whose base qp is zero, with qp count zero.
When SR-IOV is enabled, and the VF driver is running on a VM over a hypervisor which treats such qp release calls as errors (rather than NOPs), we see lines in the VM message log like:
mlx4_core 0002:00:02.0: Failed to release qp range base:0 cnt:0
Fix this by adding a check for a zero count in mlx4_release_qp_range() (which thus treats releasing 0 qps as a nop), and eliminating the check for device managed flow steering when releasing steerable UD QPs. (Freeing ib_uc_qpns_bitmap unconditionally is also OK, since it remains NULL when steerable UD QPs are not allocated).
--- drivers/infiniband/hw/mlx4/main.c | 13 +++++-------- drivers/net/ethernet/mellanox/mlx4/qp.c | 3 +++ 2 files changed, 8 insertions(+), 8 deletions(-)
drivers/infiniband/hw/mlx4/main.c +5 -8
@@ -2972,9 +2972,8 @@ err_steer_free_bitmap:kfree (ibdev->ib_uc_qpns_bitmap); err_steer_qp_release: -if (ibdev->steering_support ==MLX4_STEERING_MODE_DEVICE_MANAGED ) -mlx4_qp_release_range (dev, ibdev->steer_qpn_base, - ibdev->steer_qpn_count); +mlx4_qp_release_range (dev, ibdev->steer_qpn_base, + ibdev->steer_qpn_count); err_counter:for (i =0 ; i < ibdev->num_ports; ++i)mlx4_ib_delete_counters_table (ibdev, &ibdev->counters_table[i]);
@@ -3079,11 +3078,9 @@ static void mlx4_ib_remove(struct mlx4_d ibdev->iboe.nb.notifier_call =NULL ; } -if (ibdev->steering_support ==MLX4_STEERING_MODE_DEVICE_MANAGED ) { -mlx4_qp_release_range (dev, ibdev->steer_qpn_base, - ibdev->steer_qpn_count); -kfree (ibdev->ib_uc_qpns_bitmap); - } +mlx4_qp_release_range (dev, ibdev->steer_qpn_base, + ibdev->steer_qpn_count); +kfree (ibdev->ib_uc_qpns_bitmap);iounmap (ibdev->uar_map);for (p =0 ; p < ibdev->num_ports; ++p)
drivers/net/ethernet/mellanox/mlx4/qp.c +3 -0
@@ -287,6 +287,9 @@ void mlx4_qp_release_range(struct mlx4_du64 in_param =0 ;int err; +if (!cnt) +return ; +if (mlx4_is_mfunc (dev)) {set_param_l (&in_param, base_qpn);set_param_h (&in_param, cnt);
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/ib-mlx4-fix-incorrectly-releasing-steerable-ud-qps-when-have-only-eth-ports.patch queue-4.14/ib-umad-fix-use-of-unprotected-device-pointer.patch