From: Vladimir Sokolovsky Date: Tue, 12 May 2015 10:38:45 +0000 (+0300) Subject: mlx4/5: Added bug fixes X-Git-Tag: vofed-3.18~11 X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=6daf1579f265d1420912fbe2ac38207b7a9b0eb1;p=~tnikolova%2Fcompat-rdma%2F.git mlx4/5: Added bug fixes 7c68dd435b3ea128550c3eed62cd3cb405431374 net/mlx4_core: Fix wrong reading of reserved_eqs 492f5add4be84652bbe13da8a250d60c6856a5c5 net/mlx4_en: Doorbell is byteswapped in Little Endian archs 772103e6b1a0ceb4fb482fb9414e55ac9be27250 net/mlx4_core: Fix mem leak in SRIOV mlx4_init_one error flow 30a5da5b3301e386de99911fe6c1cd1aa37fb970 net/mlx4_core: Fix HW2SW_EQ to conform to the firmware spec 19ab574f6271a2f912a449cfdea14a60098fba90 net/mlx4: Fix memory corruption in mlx4_MAD_IFC_wrapper 5a2e87b16875f9b83b7e9494cf1fce8e17dc764a net/mlx4_core: Fix kernel Oops (mem corruption) when working f5956fafb00afab474c3886b6297f9b5e7aff722 net/mlx4_core: Fix wrong mask and error flow for the a16f3565703cfc3094938fb3c979cbb90f6d9eb4 net/mlx4_en: Fix off-by-one in ethtool statistics display 4cbdd27c9c3abf87d6fe88cdd749218193ed3e12 net/mlx5_core: Fix a bug in alloc_token fde913e25496761a4e2a4c81230c913aba6289a2 net/mlx4_core: Fix error message deprecation for ConnectX-2 42eab005a5dd5d7ea2b0328aecc4d6cc0c23c9c2 mlx4: Fix tx ring affinity_mask creation f94813f3c1d02090cc02dcfcbed339897830acb8 mlx4_en: Use correct loop cursor in error path. 479163f4608214d18bc3266ab6e4b578897a3052 mlx5: don't duplicate kvfree() 3a9e161a59b29b3aa2f39446b26622867322bf2b net/mlx5_core: Fix min vectors value in 2d446d18aa09f16aef9e34774c4fcbc8a84a923e net/mlx5_core: Fix command queue size enforcement 6b60d5e221ce11f6b247136bd221dbd952fe931e net/mlx5_core: Clear outbox of dealloc uar 28c167fa8f8ea1850e6053bffb8ee30c1ac4411a net/mlx5_core: Add more supported devices 065bd8c28ba37d04c9a5b732173c1508954b1f58 mlx5: avoid build warnings on 32-bit 1c755cc5be5023c9523d558de0c507316efa6c62 net/mlx5_core: Move to use hex PCI device IDs 1d966d03a37f7f58abf12e87203d03f96950cfd0 net: Mellanox: Delete unnecessary checks before the de61390cb3e03186f85997fe08a11dcb9f7a01a3 net/mlx5_core: Fix configuration of log_uar_page_sz 6b9f53bc102d4e61b73c13f661de4a1c358768c1 net/mlx5_core: don't export static symbol 9ef9baa2acda077f3831f6e7cdf751bc8691f78f net/mlx5_core: Avoid setting DC requestor/responder b812b5441e359adb9bd44108f7f91e5b0ba4a768 net/mlx5_core: Clear doorbell record inside 60722c2ba02be052140998bc80ed77d74e3c03df net/mlx5_core: Use the right inbox struct in destroy 05e4ecd1dc8b085a9010f20dcb5409b25488480a net/mlx5_core: Avoid copying outbox in aysnc command 21db507439ec3a76a9587f2ad50ad3e4d13f4440 net/mlx5_core: Avoid usage command work entry after 59d2d18cc4e9ba30b370db18d0e02d792699da96 mlx5: wrong page mask if CONFIG_ARCH_DMA_ADDR_T_64BIT Signed-off-by: Vladimir Sokolovsky --- diff --git a/linux-next-cherry-picks/0018-net-mlx4_core-Fix-wrong-reading-of-reserved_eqs.patch b/linux-next-cherry-picks/0018-net-mlx4_core-Fix-wrong-reading-of-reserved_eqs.patch new file mode 100644 index 0000000..bea78a0 --- /dev/null +++ b/linux-next-cherry-picks/0018-net-mlx4_core-Fix-wrong-reading-of-reserved_eqs.patch @@ -0,0 +1,31 @@ +From 7c68dd435b3ea128550c3eed62cd3cb405431374 Mon Sep 17 00:00:00 2001 +From: Matan Barak +Date: Thu, 13 Nov 2014 14:45:27 +0200 +Subject: [PATCH] net/mlx4_core: Fix wrong reading of reserved_eqs + +We mistakenly read the reserved_eqs field as a standard +numeric value rather than a log2 value. + +Signed-off-by: Matan Barak +Signed-off-by: Or Gerlitz +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mellanox/mlx4/fw.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c +index d6dba77..9051b36 100644 +--- a/drivers/net/ethernet/mellanox/mlx4/fw.c ++++ b/drivers/net/ethernet/mellanox/mlx4/fw.c +@@ -611,7 +611,7 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap) + MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_MPT_OFFSET); + dev_cap->max_mpts = 1 << (field & 0x3f); + MLX4_GET(field, outbox, QUERY_DEV_CAP_RSVD_EQ_OFFSET); +- dev_cap->reserved_eqs = field & 0xf; ++ dev_cap->reserved_eqs = 1 << (field & 0xf); + MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_EQ_OFFSET); + dev_cap->max_eqs = 1 << (field & 0xf); + MLX4_GET(field, outbox, QUERY_DEV_CAP_RSVD_MTT_OFFSET); +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0019-net-mlx4_en-Doorbell-is-byteswapped-in-Little-Endian.patch b/linux-next-cherry-picks/0019-net-mlx4_en-Doorbell-is-byteswapped-in-Little-Endian.patch new file mode 100644 index 0000000..4d66af3 --- /dev/null +++ b/linux-next-cherry-picks/0019-net-mlx4_en-Doorbell-is-byteswapped-in-Little-Endian.patch @@ -0,0 +1,46 @@ +From 492f5add4be84652bbe13da8a250d60c6856a5c5 Mon Sep 17 00:00:00 2001 +From: Amir Vadai +Date: Mon, 22 Dec 2014 10:21:57 +0200 +Subject: [PATCH] net/mlx4_en: Doorbell is byteswapped in Little Endian archs + +iowrite32() will byteswap it's argument on big endian archs. +iowrite32be() will byteswap on little endian archs. +Since we don't want to do this unnecessary byteswap on the fast path, +doorbell is stored in the NIC's native endianness. Using the right +iowrite() according to the arch endianness. + +CC: Wei Yang +CC: David Laight +Fixes: 6a4e812 ("net/mlx4_en: Avoid calling bswap in tx fast path") +Signed-off-by: Amir Vadai +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mellanox/mlx4/en_tx.c | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c +index a308d41..e3357bf 100644 +--- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c ++++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c +@@ -962,7 +962,17 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev) + tx_desc->ctrl.owner_opcode = op_own; + if (send_doorbell) { + wmb(); +- iowrite32(ring->doorbell_qpn, ++ /* Since there is no iowrite*_native() that writes the ++ * value as is, without byteswapping - using the one ++ * the doesn't do byteswapping in the relevant arch ++ * endianness. ++ */ ++#if defined(__LITTLE_ENDIAN) ++ iowrite32( ++#else ++ iowrite32be( ++#endif ++ ring->doorbell_qpn, + ring->bf.uar->map + MLX4_SEND_DOORBELL); + } else { + ring->xmit_more++; +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0020-net-mlx4_core-Fix-mem-leak-in-SRIOV-mlx4_init_one-er.patch b/linux-next-cherry-picks/0020-net-mlx4_core-Fix-mem-leak-in-SRIOV-mlx4_init_one-er.patch new file mode 100644 index 0000000..bd72552 --- /dev/null +++ b/linux-next-cherry-picks/0020-net-mlx4_core-Fix-mem-leak-in-SRIOV-mlx4_init_one-er.patch @@ -0,0 +1,34 @@ +From 772103e6b1a0ceb4fb482fb9414e55ac9be27250 Mon Sep 17 00:00:00 2001 +From: Jack Morgenstein +Date: Tue, 27 Jan 2015 15:58:01 +0200 +Subject: [PATCH] net/mlx4_core: Fix mem leak in SRIOV mlx4_init_one error flow + +Structs allocated for the resource tracker must be freed in +the error flow. + +Signed-off-by: Jack Morgenstein +Signed-off-by: Amir Vadai +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mellanox/mlx4/main.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c +index 51d5550..cc9f484 100644 +--- a/drivers/net/ethernet/mellanox/mlx4/main.c ++++ b/drivers/net/ethernet/mellanox/mlx4/main.c +@@ -2979,8 +2979,10 @@ err_free_eq: + mlx4_free_eq_table(dev); + + err_master_mfunc: +- if (mlx4_is_master(dev)) ++ if (mlx4_is_master(dev)) { ++ mlx4_free_resource_tracker(dev, RES_TR_FREE_STRUCTS_ONLY); + mlx4_multi_func_cleanup(dev); ++ } + + if (mlx4_is_slave(dev)) { + kfree(dev->caps.qp0_qkey); +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0021-net-mlx4_core-Fix-HW2SW_EQ-to-conform-to-the-firmwar.patch b/linux-next-cherry-picks/0021-net-mlx4_core-Fix-HW2SW_EQ-to-conform-to-the-firmwar.patch new file mode 100644 index 0000000..f93c167 --- /dev/null +++ b/linux-next-cherry-picks/0021-net-mlx4_core-Fix-HW2SW_EQ-to-conform-to-the-firmwar.patch @@ -0,0 +1,133 @@ +From 30a5da5b3301e386de99911fe6c1cd1aa37fb970 Mon Sep 17 00:00:00 2001 +From: Jack Morgenstein +Date: Tue, 27 Jan 2015 15:58:03 +0200 +Subject: [PATCH] net/mlx4_core: Fix HW2SW_EQ to conform to the firmware spec + +The driver incorrectly assigned an out-mailbox to this command, +and used an opcode modifier = 0, which is a reserved value (it +should use opcode modifier = 1). + +Signed-off-by: Jack Morgenstein +Signed-off-by: Amir Vadai +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mellanox/mlx4/cmd.c | 2 +- + drivers/net/ethernet/mellanox/mlx4/eq.c | 26 ++++------------------ + .../net/ethernet/mellanox/mlx4/resource_tracker.c | 16 ++++--------- + 3 files changed, 9 insertions(+), 35 deletions(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c +index 2b48932..928b706 100644 +--- a/drivers/net/ethernet/mellanox/mlx4/cmd.c ++++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c +@@ -1221,7 +1221,7 @@ static struct mlx4_cmd_info cmd_info[] = { + { + .opcode = MLX4_CMD_HW2SW_EQ, + .has_inbox = false, +- .has_outbox = true, ++ .has_outbox = false, + .out_is_imm = false, + .encode_slave_id = true, + .verify = NULL, +diff --git a/drivers/net/ethernet/mellanox/mlx4/eq.c b/drivers/net/ethernet/mellanox/mlx4/eq.c +index 4df006d..264bc15 100644 +--- a/drivers/net/ethernet/mellanox/mlx4/eq.c ++++ b/drivers/net/ethernet/mellanox/mlx4/eq.c +@@ -868,12 +868,10 @@ static int mlx4_SW2HW_EQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox, + MLX4_CMD_WRAPPED); + } + +-static int mlx4_HW2SW_EQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox, +- int eq_num) ++static int mlx4_HW2SW_EQ(struct mlx4_dev *dev, int eq_num) + { +- return mlx4_cmd_box(dev, 0, mailbox->dma, eq_num, +- 0, MLX4_CMD_HW2SW_EQ, MLX4_CMD_TIME_CLASS_A, +- MLX4_CMD_WRAPPED); ++ return mlx4_cmd(dev, 0, eq_num, 1, MLX4_CMD_HW2SW_EQ, ++ MLX4_CMD_TIME_CLASS_A, MLX4_CMD_WRAPPED); + } + + static int mlx4_num_eq_uar(struct mlx4_dev *dev) +@@ -1046,7 +1044,6 @@ static void mlx4_free_eq(struct mlx4_dev *dev, + struct mlx4_eq *eq) + { + struct mlx4_priv *priv = mlx4_priv(dev); +- struct mlx4_cmd_mailbox *mailbox; + int err; + int i; + /* CX3 is capable of extending the CQE/EQE from 32 to 64 bytes, with +@@ -1054,24 +1051,10 @@ static void mlx4_free_eq(struct mlx4_dev *dev, + */ + int npages = PAGE_ALIGN(dev->caps.eqe_size * eq->nent) / PAGE_SIZE; + +- mailbox = mlx4_alloc_cmd_mailbox(dev); +- if (IS_ERR(mailbox)) +- return; +- +- err = mlx4_HW2SW_EQ(dev, mailbox, eq->eqn); ++ err = mlx4_HW2SW_EQ(dev, eq->eqn); + if (err) + mlx4_warn(dev, "HW2SW_EQ failed (%d)\n", err); + +- if (0) { +- mlx4_dbg(dev, "Dumping EQ context %02x:\n", eq->eqn); +- for (i = 0; i < sizeof (struct mlx4_eq_context) / 4; ++i) { +- if (i % 4 == 0) +- pr_cont("[%02x] ", i * 4); +- pr_cont(" %08x", be32_to_cpup(mailbox->buf + i * 4)); +- if ((i + 1) % 4 == 0) +- pr_cont("\n"); +- } +- } + synchronize_irq(eq->irq); + tasklet_disable(&eq->tasklet_ctx.task); + +@@ -1083,7 +1066,6 @@ static void mlx4_free_eq(struct mlx4_dev *dev, + + kfree(eq->page_list); + mlx4_bitmap_free(&priv->eq_table.bitmap, eq->eqn, MLX4_USE_RR); +- mlx4_free_cmd_mailbox(dev, mailbox); + } + + static void mlx4_free_irqs(struct mlx4_dev *dev) +diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c +index 3e93879..79feeb6 100644 +--- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c ++++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c +@@ -4677,7 +4677,6 @@ static void rem_slave_eqs(struct mlx4_dev *dev, int slave) + int state; + LIST_HEAD(tlist); + int eqn; +- struct mlx4_cmd_mailbox *mailbox; + + err = move_all_busy(dev, slave, RES_EQ); + if (err) +@@ -4703,20 +4702,13 @@ static void rem_slave_eqs(struct mlx4_dev *dev, int slave) + break; + + case RES_EQ_HW: +- mailbox = mlx4_alloc_cmd_mailbox(dev); +- if (IS_ERR(mailbox)) { +- cond_resched(); +- continue; +- } +- err = mlx4_cmd_box(dev, slave, 0, +- eqn & 0xff, 0, +- MLX4_CMD_HW2SW_EQ, +- MLX4_CMD_TIME_CLASS_A, +- MLX4_CMD_NATIVE); ++ err = mlx4_cmd(dev, slave, eqn & 0xff, ++ 1, MLX4_CMD_HW2SW_EQ, ++ MLX4_CMD_TIME_CLASS_A, ++ MLX4_CMD_NATIVE); + if (err) + mlx4_dbg(dev, "rem_slave_eqs: failed to move slave %d eqs %d to SW ownership\n", + slave, eqn); +- mlx4_free_cmd_mailbox(dev, mailbox); + atomic_dec(&eq->mtt->ref_count); + state = RES_EQ_RESERVED; + break; +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0022-net-mlx4-Fix-memory-corruption-in-mlx4_MAD_IFC_wrapp.patch b/linux-next-cherry-picks/0022-net-mlx4-Fix-memory-corruption-in-mlx4_MAD_IFC_wrapp.patch new file mode 100644 index 0000000..bd1e28f --- /dev/null +++ b/linux-next-cherry-picks/0022-net-mlx4-Fix-memory-corruption-in-mlx4_MAD_IFC_wrapp.patch @@ -0,0 +1,39 @@ +From 19ab574f6271a2f912a449cfdea14a60098fba90 Mon Sep 17 00:00:00 2001 +From: Matan Barak +Date: Tue, 27 Jan 2015 15:58:07 +0200 +Subject: [PATCH] net/mlx4: Fix memory corruption in mlx4_MAD_IFC_wrapper + +Fix a memory corruption at mlx4_MAD_IFC_wrapper. + +A table of size dev->caps.pkey_table_len[port]*sizeof(*table) +was allocated, but get_full_pkey_table() assumes that the number +of entries in the table is a multiplication of 32 (which isn't always +correct). + +Fixes: 0a9a018 ('mlx4: MAD_IFC paravirtualization') +Signed-off-by: Matan Barak +Signed-off-by: Or Gerlitz +Signed-off-by: Amir Vadai +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mellanox/mlx4/cmd.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c +index 928b706..154effb 100644 +--- a/drivers/net/ethernet/mellanox/mlx4/cmd.c ++++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c +@@ -901,7 +901,9 @@ static int mlx4_MAD_IFC_wrapper(struct mlx4_dev *dev, int slave, + index = be32_to_cpu(smp->attr_mod); + if (port < 1 || port > dev->caps.num_ports) + return -EINVAL; +- table = kcalloc(dev->caps.pkey_table_len[port], sizeof *table, GFP_KERNEL); ++ table = kcalloc((dev->caps.pkey_table_len[port] / 32) + 1, ++ sizeof(*table) * 32, GFP_KERNEL); ++ + if (!table) + return -ENOMEM; + /* need to get the full pkey table because the paravirtualized +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0023-net-mlx4_core-Fix-kernel-Oops-mem-corruption-when-wo.patch b/linux-next-cherry-picks/0023-net-mlx4_core-Fix-kernel-Oops-mem-corruption-when-wo.patch new file mode 100644 index 0000000..c8c2dae --- /dev/null +++ b/linux-next-cherry-picks/0023-net-mlx4_core-Fix-kernel-Oops-mem-corruption-when-wo.patch @@ -0,0 +1,52 @@ +From 5a2e87b16875f9b83b7e9494cf1fce8e17dc764a Mon Sep 17 00:00:00 2001 +From: Jack Morgenstein +Date: Mon, 2 Feb 2015 15:18:42 +0200 +Subject: [PATCH] net/mlx4_core: Fix kernel Oops (mem corruption) when working + with more than 80 VFs + +Commit de966c592802 (net/mlx4_core: Support more than 64 VFs) was meant to +allow up to 126 VFs. However, due to leaving MLX4_MFUNC_MAX too low, using +more than 80 VFs resulted in memory corruptions (and Oopses) when more than +80 VFs were requested. In addition, the number of slaves was left too high. + +This commit fixes these issues. + +Fixes: de966c592802 ("net/mlx4_core: Support more than 64 VFs") +Signed-off-by: Jack Morgenstein +Signed-off-by: Amir Vadai +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mellanox/mlx4/mlx4.h | 3 ++- + include/linux/mlx4/device.h | 2 +- + 2 files changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h b/drivers/net/ethernet/mellanox/mlx4/mlx4.h +index bdd4eea..210691c 100644 +--- a/drivers/net/ethernet/mellanox/mlx4/mlx4.h ++++ b/drivers/net/ethernet/mellanox/mlx4/mlx4.h +@@ -235,7 +235,8 @@ do { \ + extern int mlx4_log_num_mgm_entry_size; + extern int log_mtts_per_seg; + +-#define MLX4_MAX_NUM_SLAVES (MLX4_MAX_NUM_PF + MLX4_MAX_NUM_VF) ++#define MLX4_MAX_NUM_SLAVES (min(MLX4_MAX_NUM_PF + MLX4_MAX_NUM_VF, \ ++ MLX4_MFUNC_MAX)) + #define ALL_SLAVES 0xff + + struct mlx4_bitmap { +diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h +index 25c791e..5f3a9aa 100644 +--- a/include/linux/mlx4/device.h ++++ b/include/linux/mlx4/device.h +@@ -97,7 +97,7 @@ enum { + MLX4_MAX_NUM_PF = 16, + MLX4_MAX_NUM_VF = 126, + MLX4_MAX_NUM_VF_P_PORT = 64, +- MLX4_MFUNC_MAX = 80, ++ MLX4_MFUNC_MAX = 128, + MLX4_MAX_EQ_NUM = 1024, + MLX4_MFUNC_EQ_NUM = 4, + MLX4_MFUNC_MAX_EQES = 8, +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0024-net-mlx4_core-Fix-wrong-mask-and-error-flow-for-the-.patch b/linux-next-cherry-picks/0024-net-mlx4_core-Fix-wrong-mask-and-error-flow-for-the-.patch new file mode 100644 index 0000000..7970bc8 --- /dev/null +++ b/linux-next-cherry-picks/0024-net-mlx4_core-Fix-wrong-mask-and-error-flow-for-the-.patch @@ -0,0 +1,89 @@ +From f5956fafb00afab474c3886b6297f9b5e7aff722 Mon Sep 17 00:00:00 2001 +From: Or Gerlitz +Date: Mon, 2 Mar 2015 18:22:15 +0200 +Subject: [PATCH] net/mlx4_core: Fix wrong mask and error flow for the + update-qp command + +The bit mask for currently supported driver features (MLX4_UPDATE_QP_SUPPORTED_ATTRS) +of the update-qp command was defined twice (using enum value and pre-processor +define directive) and wrong. + +The return value of the call to mlx4_update_qp() from within the SRIOV +resource-tracker was wrongly voided down. + +Fix both issues. + +issue: none +Fixes: 09e05c3f78e9 ('net/mlx4: Set vlan stripping policy by the right command') +Fixes: ce8d9e0d6746 ('net/mlx4_core: Add UPDATE_QP SRIOV wrapper support') +Signed-off-by: Matan Barak +Signed-off-by: Or Gerlitz +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mellanox/mlx4/qp.c | 1 - + drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | 9 ++++++--- + include/linux/mlx4/qp.h | 2 +- + 3 files changed, 7 insertions(+), 5 deletions(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx4/qp.c b/drivers/net/ethernet/mellanox/mlx4/qp.c +index 2bb8553..eda29db 100644 +--- a/drivers/net/ethernet/mellanox/mlx4/qp.c ++++ b/drivers/net/ethernet/mellanox/mlx4/qp.c +@@ -412,7 +412,6 @@ err_icm: + + EXPORT_SYMBOL_GPL(mlx4_qp_alloc); + +-#define MLX4_UPDATE_QP_SUPPORTED_ATTRS MLX4_UPDATE_QP_SMAC + int mlx4_update_qp(struct mlx4_dev *dev, u32 qpn, + enum mlx4_update_qp_attr attr, + struct mlx4_update_qp_params *params) +diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c +index 486e3d2..d97ca88 100644 +--- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c ++++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c +@@ -713,7 +713,7 @@ static int update_vport_qp_param(struct mlx4_dev *dev, + struct mlx4_vport_oper_state *vp_oper; + struct mlx4_priv *priv; + u32 qp_type; +- int port; ++ int port, err = 0; + + port = (qpc->pri_path.sched_queue & 0x40) ? 2 : 1; + priv = mlx4_priv(dev); +@@ -738,7 +738,9 @@ static int update_vport_qp_param(struct mlx4_dev *dev, + } else { + struct mlx4_update_qp_params params = {.flags = 0}; + +- mlx4_update_qp(dev, qpn, MLX4_UPDATE_QP_VSD, ¶ms); ++ err = mlx4_update_qp(dev, qpn, MLX4_UPDATE_QP_VSD, ¶ms); ++ if (err) ++ goto out; + } + } + +@@ -773,7 +775,8 @@ static int update_vport_qp_param(struct mlx4_dev *dev, + qpc->pri_path.feup |= MLX4_FSM_FORCE_ETH_SRC_MAC; + qpc->pri_path.grh_mylmc = (0x80 & qpc->pri_path.grh_mylmc) + vp_oper->mac_idx; + } +- return 0; ++out: ++ return err; + } + + static int mpt_mask(struct mlx4_dev *dev) +diff --git a/include/linux/mlx4/qp.h b/include/linux/mlx4/qp.h +index 2bbc62a..551f854 100644 +--- a/include/linux/mlx4/qp.h ++++ b/include/linux/mlx4/qp.h +@@ -427,7 +427,7 @@ struct mlx4_wqe_inline_seg { + + enum mlx4_update_qp_attr { + MLX4_UPDATE_QP_SMAC = 1 << 0, +- MLX4_UPDATE_QP_VSD = 1 << 2, ++ MLX4_UPDATE_QP_VSD = 1 << 1, + MLX4_UPDATE_QP_SUPPORTED_ATTRS = (1 << 2) - 1 + }; + +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0025-net-mlx4_en-Fix-off-by-one-in-ethtool-statistics-dis.patch b/linux-next-cherry-picks/0025-net-mlx4_en-Fix-off-by-one-in-ethtool-statistics-dis.patch new file mode 100644 index 0000000..6876e41 --- /dev/null +++ b/linux-next-cherry-picks/0025-net-mlx4_en-Fix-off-by-one-in-ethtool-statistics-dis.patch @@ -0,0 +1,33 @@ +From a16f3565703cfc3094938fb3c979cbb90f6d9eb4 Mon Sep 17 00:00:00 2001 +From: Eran Ben Elisha +Date: Wed, 18 Mar 2015 16:51:36 +0200 +Subject: [PATCH] net/mlx4_en: Fix off-by-one in ethtool statistics display + +NUM_PORT_STATS was 9 instead of 10, which caused off-by-one bug when +displaying the statistics starting from tx_chksum_offload in ethtool. + +Fixes: f8c6455bb04b ('net/mlx4_en: Extend checksum offloading by CHECKSUM COMPLETE') +Signed-off-by: Eran Ben Elisha +Signed-off-by: Hadar Hen Zion +Signed-off-by: Or Gerlitz +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h +index 2a8268e..ebbe244 100644 +--- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h ++++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h +@@ -453,7 +453,7 @@ struct mlx4_en_port_stats { + unsigned long rx_chksum_none; + unsigned long rx_chksum_complete; + unsigned long tx_chksum_offload; +-#define NUM_PORT_STATS 9 ++#define NUM_PORT_STATS 10 + }; + + struct mlx4_en_perf_stats { +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0026-net-mlx5_core-Fix-a-bug-in-alloc_token.patch b/linux-next-cherry-picks/0026-net-mlx5_core-Fix-a-bug-in-alloc_token.patch new file mode 100644 index 0000000..f0f9ec0 --- /dev/null +++ b/linux-next-cherry-picks/0026-net-mlx5_core-Fix-a-bug-in-alloc_token.patch @@ -0,0 +1,34 @@ +From 4cbdd27c9c3abf87d6fe88cdd749218193ed3e12 Mon Sep 17 00:00:00 2001 +From: Achiad Shochat +Date: Thu, 2 Apr 2015 17:07:28 +0300 +Subject: [PATCH] net/mlx5_core: Fix a bug in alloc_token + +In alloc_token(), the token '1' would be allocated twice consecutively. + +Signed-off-by: Achiad Shochat +Signed-off-by: Saeed Mahameed +Signed-off-by: Eli Cohen +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c +index 0d86269..697d538 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c +@@ -125,7 +125,10 @@ static u8 alloc_token(struct mlx5_cmd *cmd) + u8 token; + + spin_lock(&cmd->token_lock); +- token = cmd->token++ % 255 + 1; ++ cmd->token++; ++ if (cmd->token == 0) ++ cmd->token++; ++ token = cmd->token; + spin_unlock(&cmd->token_lock); + + return token; +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0027-net-mlx4_core-Fix-error-message-deprecation-for-Conn.patch b/linux-next-cherry-picks/0027-net-mlx4_core-Fix-error-message-deprecation-for-Conn.patch new file mode 100644 index 0000000..cebebaf --- /dev/null +++ b/linux-next-cherry-picks/0027-net-mlx4_core-Fix-error-message-deprecation-for-Conn.patch @@ -0,0 +1,35 @@ +From fde913e25496761a4e2a4c81230c913aba6289a2 Mon Sep 17 00:00:00 2001 +From: Jack Morgenstein +Date: Sun, 5 Apr 2015 17:50:48 +0300 +Subject: [PATCH] net/mlx4_core: Fix error message deprecation for ConnectX-2 + cards + +Commit 1daa4303b4ca ("net/mlx4_core: Deprecate error message at +ConnectX-2 cards startup to debug") did the deprecation only for port 1 +of the card. Need to deprecate for port 2 as well. + +Fixes: 1daa4303b4ca ("net/mlx4_core: Deprecate error message at ConnectX-2 cards startup to debug") +Signed-off-by: Jack Morgenstein +Signed-off-by: Amir Vadai +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mellanox/mlx4/cmd.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c +index 3350721..546ca42 100644 +--- a/drivers/net/ethernet/mellanox/mlx4/cmd.c ++++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c +@@ -724,7 +724,8 @@ static int mlx4_cmd_wait(struct mlx4_dev *dev, u64 in_param, u64 *out_param, + * on the host, we deprecate the error message for this + * specific command/input_mod/opcode_mod/fw-status to be debug. + */ +- if (op == MLX4_CMD_SET_PORT && in_modifier == 1 && ++ if (op == MLX4_CMD_SET_PORT && ++ (in_modifier == 1 || in_modifier == 2) && + op_modifier == 0 && context->fw_status == CMD_STAT_BAD_SIZE) + mlx4_dbg(dev, "command 0x%x failed: fw status = 0x%x\n", + op, context->fw_status); +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0028-mlx4-Fix-tx-ring-affinity_mask-creation.patch b/linux-next-cherry-picks/0028-mlx4-Fix-tx-ring-affinity_mask-creation.patch new file mode 100644 index 0000000..f9dc2e2 --- /dev/null +++ b/linux-next-cherry-picks/0028-mlx4-Fix-tx-ring-affinity_mask-creation.patch @@ -0,0 +1,48 @@ +From 42eab005a5dd5d7ea2b0328aecc4d6cc0c23c9c2 Mon Sep 17 00:00:00 2001 +From: Benjamin Poirier +Date: Tue, 28 Apr 2015 14:49:29 -0700 +Subject: [PATCH] mlx4: Fix tx ring affinity_mask creation + +By default, the number of tx queues is limited by the number of online cpus +in mlx4_en_get_profile(). However, this limit no longer holds after the +ethtool .set_channels method has been called. In that situation, the driver +may access invalid bits of certain cpumask variables when queue_index >= +nr_cpu_ids. + +Signed-off-by: Benjamin Poirier +Acked-by: Ido Shamay +Fixes: d03a68f ("net/mlx4_en: Configure the XPS queue mapping on driver load") +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mellanox/mlx4/en_tx.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c +index 1783705..f7bf312 100644 +--- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c ++++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c +@@ -143,8 +143,10 @@ int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv, + ring->hwtstamp_tx_type = priv->hwtstamp_config.tx_type; + ring->queue_index = queue_index; + +- if (queue_index < priv->num_tx_rings_p_up && cpu_online(queue_index)) +- cpumask_set_cpu(queue_index, &ring->affinity_mask); ++ if (queue_index < priv->num_tx_rings_p_up) ++ cpumask_set_cpu_local_first(queue_index, ++ priv->mdev->dev->numa_node, ++ &ring->affinity_mask); + + *pring = ring; + return 0; +@@ -213,7 +215,7 @@ int mlx4_en_activate_tx_ring(struct mlx4_en_priv *priv, + + err = mlx4_qp_to_ready(mdev->dev, &ring->wqres.mtt, &ring->context, + &ring->qp, &ring->qp_state); +- if (!user_prio && cpu_online(ring->queue_index)) ++ if (!cpumask_empty(&ring->affinity_mask)) + netif_set_xps_queue(priv->dev, &ring->affinity_mask, + ring->queue_index); + +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0029-mlx4_en-Use-correct-loop-cursor-in-error-path.patch b/linux-next-cherry-picks/0029-mlx4_en-Use-correct-loop-cursor-in-error-path.patch new file mode 100644 index 0000000..e7d4976 --- /dev/null +++ b/linux-next-cherry-picks/0029-mlx4_en-Use-correct-loop-cursor-in-error-path.patch @@ -0,0 +1,29 @@ +From f94813f3c1d02090cc02dcfcbed339897830acb8 Mon Sep 17 00:00:00 2001 +From: Benjamin Poirier +Date: Wed, 29 Apr 2015 15:59:35 -0700 +Subject: [PATCH] mlx4_en: Use correct loop cursor in error path. + +Signed-off-by: Benjamin Poirier +Fixes: 9e311e7 ("net/mlx4_en: Use affinity hint") +Acked-by: Amir Vadai +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +index 0f1afc0..bf173d7 100644 +--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c ++++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +@@ -1721,7 +1721,7 @@ mac_err: + cq_err: + while (rx_index--) { + mlx4_en_deactivate_cq(priv, priv->rx_cq[rx_index]); +- mlx4_en_free_affinity_hint(priv, i); ++ mlx4_en_free_affinity_hint(priv, rx_index); + } + for (i = 0; i < priv->rx_ring_num; i++) + mlx4_en_deactivate_rx_ring(priv, priv->rx_ring[i]); +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0030-mlx5-don-t-duplicate-kvfree.patch b/linux-next-cherry-picks/0030-mlx5-don-t-duplicate-kvfree.patch new file mode 100644 index 0000000..d4801ae --- /dev/null +++ b/linux-next-cherry-picks/0030-mlx5-don-t-duplicate-kvfree.patch @@ -0,0 +1,77 @@ +From 479163f4608214d18bc3266ab6e4b578897a3052 Mon Sep 17 00:00:00 2001 +From: Al Viro +Date: Thu, 20 Nov 2014 08:13:57 +0000 +Subject: [PATCH] mlx5: don't duplicate kvfree() + +Signed-off-by: Al Viro +Acked-by: Eli Cohen +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mellanox/mlx5/core/eq.c | 4 ++-- + drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c | 4 ++-- + drivers/net/ethernet/mellanox/mlx5/core/port.c | 4 ++-- + 3 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eq.c b/drivers/net/ethernet/mellanox/mlx5/core/eq.c +index ad2c96a..dfd3ad0 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/eq.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/eq.c +@@ -390,7 +390,7 @@ int mlx5_create_map_eq(struct mlx5_core_dev *dev, struct mlx5_eq *eq, u8 vecidx, + */ + eq_update_ci(eq, 1); + +- mlx5_vfree(in); ++ kvfree(in); + return 0; + + err_irq: +@@ -400,7 +400,7 @@ err_eq: + mlx5_cmd_destroy_eq(dev, eq->eqn); + + err_in: +- mlx5_vfree(in); ++ kvfree(in); + + err_buf: + mlx5_buf_free(dev, &eq->buf); +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c b/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c +index d476918..4fdaae9 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c +@@ -349,7 +349,7 @@ out_4k: + for (i--; i >= 0; i--) + free_4k(dev, be64_to_cpu(in->pas[i])); + out_free: +- mlx5_vfree(in); ++ kvfree(in); + return err; + } + +@@ -400,7 +400,7 @@ static int reclaim_pages(struct mlx5_core_dev *dev, u32 func_id, int npages, + } + + out_free: +- mlx5_vfree(out); ++ kvfree(out); + return err; + } + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/port.c b/drivers/net/ethernet/mellanox/mlx5/core/port.c +index 3139658..72c2d00 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/port.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/port.c +@@ -68,9 +68,9 @@ int mlx5_core_access_reg(struct mlx5_core_dev *dev, void *data_in, + memcpy(data_out, out->data, size_out); + + ex2: +- mlx5_vfree(out); ++ kvfree(out); + ex1: +- mlx5_vfree(in); ++ kvfree(in); + return err; + } + EXPORT_SYMBOL_GPL(mlx5_core_access_reg); +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0031-net-mlx5_core-Fix-min-vectors-value-in-mlx5_enable_m.patch b/linux-next-cherry-picks/0031-net-mlx5_core-Fix-min-vectors-value-in-mlx5_enable_m.patch new file mode 100644 index 0000000..29fd74a --- /dev/null +++ b/linux-next-cherry-picks/0031-net-mlx5_core-Fix-min-vectors-value-in-mlx5_enable_m.patch @@ -0,0 +1,31 @@ +From 3a9e161a59b29b3aa2f39446b26622867322bf2b Mon Sep 17 00:00:00 2001 +From: Eli Cohen +Date: Tue, 2 Dec 2014 12:26:12 +0200 +Subject: [PATCH] net/mlx5_core: Fix min vectors value in + mlx5_enable_msix + +mlx5 requires at least one interrupt vector for completions so fix the minvec +argument to pci_enable_msix_range() accordingly. + +Signed-off-by: Eli Cohen +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mellanox/mlx5/core/main.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c +index 4e3c27e..c9d4a02 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/main.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c +@@ -226,7 +226,7 @@ static int mlx5_enable_msix(struct mlx5_core_dev *dev) + table->msix_arr[i].entry = i; + + nvec = pci_enable_msix_range(dev->pdev, table->msix_arr, +- MLX5_EQ_VEC_COMP_BASE, nvec); ++ MLX5_EQ_VEC_COMP_BASE + 1, nvec); + if (nvec < 0) + return nvec; + +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0032-net-mlx5_core-Fix-command-queue-size-enforcement.patch b/linux-next-cherry-picks/0032-net-mlx5_core-Fix-command-queue-size-enforcement.patch new file mode 100644 index 0000000..0deb54c --- /dev/null +++ b/linux-next-cherry-picks/0032-net-mlx5_core-Fix-command-queue-size-enforcement.patch @@ -0,0 +1,30 @@ +From 2d446d18aa09f16aef9e34774c4fcbc8a84a923e Mon Sep 17 00:00:00 2001 +From: Eli Cohen +Date: Tue, 2 Dec 2014 12:26:13 +0200 +Subject: [PATCH] net/mlx5_core: Fix command queue size enforcement + +Command queue descriptor page size is 4KB and not the page size used by the +kernel. + +Signed-off-by: Eli Cohen +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c +index 368c6c5..a285305 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c +@@ -1363,7 +1363,7 @@ int mlx5_cmd_init(struct mlx5_core_dev *dev) + goto err_map; + } + +- if (cmd->log_sz + cmd->log_stride > PAGE_SHIFT) { ++ if (cmd->log_sz + cmd->log_stride > MLX5_ADAPTER_PAGE_SHIFT) { + dev_err(&dev->pdev->dev, "command queue size overflow\n"); + err = -EINVAL; + goto err_map; +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0033-net-mlx5_core-Clear-outbox-of-dealloc-uar.patch b/linux-next-cherry-picks/0033-net-mlx5_core-Clear-outbox-of-dealloc-uar.patch new file mode 100644 index 0000000..7b2d6a7 --- /dev/null +++ b/linux-next-cherry-picks/0033-net-mlx5_core-Clear-outbox-of-dealloc-uar.patch @@ -0,0 +1,29 @@ +From 6b60d5e221ce11f6b247136bd221dbd952fe931e Mon Sep 17 00:00:00 2001 +From: Majd Dibbiny +Date: Tue, 2 Dec 2014 12:26:16 +0200 +Subject: [PATCH] net/mlx5_core: Clear outbox of dealloc uar + +The outbox should be cleared before executing the command. + +Signed-off-by: Majd Dibbiny +Signed-off-by: Eli Cohen +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mellanox/mlx5/core/uar.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/uar.c b/drivers/net/ethernet/mellanox/mlx5/core/uar.c +index 0a6348c..06801d6 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/uar.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/uar.c +@@ -96,6 +96,7 @@ int mlx5_cmd_free_uar(struct mlx5_core_dev *dev, u32 uarn) + int err; + + memset(&in, 0, sizeof(in)); ++ memset(&out, 0, sizeof(out)); + in.hdr.opcode = cpu_to_be16(MLX5_CMD_OP_DEALLOC_UAR); + in.uarn = cpu_to_be32(uarn); + err = mlx5_cmd_exec(dev, &in, sizeof(in), &out, sizeof(out)); +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0034-net-mlx5_core-Add-more-supported-devices.patch b/linux-next-cherry-picks/0034-net-mlx5_core-Add-more-supported-devices.patch new file mode 100644 index 0000000..d77f4b4 --- /dev/null +++ b/linux-next-cherry-picks/0034-net-mlx5_core-Add-more-supported-devices.patch @@ -0,0 +1,35 @@ +From 28c167fa8f8ea1850e6053bffb8ee30c1ac4411a Mon Sep 17 00:00:00 2001 +From: Eli Cohen +Date: Tue, 2 Dec 2014 12:26:17 +0200 +Subject: [PATCH] net/mlx5_core: Add more supported devices + +Add ConnectX-4LX to the list of supported devices as well as their virtual +functions. + +Signed-off-by: Eli Cohen +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mellanox/mlx5/core/main.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c +index c9d4a02..3f45256 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/main.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c +@@ -903,8 +903,12 @@ static void remove_one(struct pci_dev *pdev) + } + + static const struct pci_device_id mlx5_core_pci_table[] = { +- { PCI_VDEVICE(MELLANOX, 4113) }, /* MT4113 Connect-IB */ ++ { PCI_VDEVICE(MELLANOX, 4113) }, /* Connect-IB */ ++ { PCI_VDEVICE(MELLANOX, 4114) }, /* Connect-IB VF */ + { PCI_VDEVICE(MELLANOX, 4115) }, /* ConnectX-4 */ ++ { PCI_VDEVICE(MELLANOX, 4116) }, /* ConnectX-4 VF */ ++ { PCI_VDEVICE(MELLANOX, 4117) }, /* ConnectX-4LX */ ++ { PCI_VDEVICE(MELLANOX, 4118) }, /* ConnectX-4LX VF */ + { 0, } + }; + +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0035-mlx5-avoid-build-warnings-on-32-bit.patch b/linux-next-cherry-picks/0035-mlx5-avoid-build-warnings-on-32-bit.patch new file mode 100644 index 0000000..24a4fee --- /dev/null +++ b/linux-next-cherry-picks/0035-mlx5-avoid-build-warnings-on-32-bit.patch @@ -0,0 +1,50 @@ +From 065bd8c28ba37d04c9a5b732173c1508954b1f58 Mon Sep 17 00:00:00 2001 +From: Arnd Bergmann +Date: Tue, 13 Jan 2015 17:08:06 +0100 +Subject: [PATCH] mlx5: avoid build warnings on 32-bit + +The mlx5 driver passes a string pointer in through a 'u64' variable, +which on 32-bit machines causes a build warning: + +drivers/net/ethernet/mellanox/mlx5/core/debugfs.c: In function 'qp_read_field': +drivers/net/ethernet/mellanox/mlx5/core/debugfs.c:303:11: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] + +The code is in fact safe, so we can shut up the warning by adding +extra type casts. + +Signed-off-by: Arnd Bergmann +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mellanox/mlx5/core/debugfs.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c b/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c +index 10e1f1a..4878025 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c +@@ -300,11 +300,11 @@ static u64 qp_read_field(struct mlx5_core_dev *dev, struct mlx5_core_qp *qp, + param = qp->pid; + break; + case QP_STATE: +- param = (u64)mlx5_qp_state_str(be32_to_cpu(ctx->flags) >> 28); ++ param = (unsigned long)mlx5_qp_state_str(be32_to_cpu(ctx->flags) >> 28); + *is_str = 1; + break; + case QP_XPORT: +- param = (u64)mlx5_qp_type_str((be32_to_cpu(ctx->flags) >> 16) & 0xff); ++ param = (unsigned long)mlx5_qp_type_str((be32_to_cpu(ctx->flags) >> 16) & 0xff); + *is_str = 1; + break; + case QP_MTU: +@@ -464,7 +464,7 @@ static ssize_t dbg_read(struct file *filp, char __user *buf, size_t count, + + + if (is_str) +- ret = snprintf(tbuf, sizeof(tbuf), "%s\n", (const char *)field); ++ ret = snprintf(tbuf, sizeof(tbuf), "%s\n", (const char *)(unsigned long)field); + else + ret = snprintf(tbuf, sizeof(tbuf), "0x%llx\n", field); + +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0036-net-mlx5_core-Move-to-use-hex-PCI-device-IDs.patch b/linux-next-cherry-picks/0036-net-mlx5_core-Move-to-use-hex-PCI-device-IDs.patch new file mode 100644 index 0000000..34ff776 --- /dev/null +++ b/linux-next-cherry-picks/0036-net-mlx5_core-Move-to-use-hex-PCI-device-IDs.patch @@ -0,0 +1,40 @@ +From 1c755cc5be5023c9523d558de0c507316efa6c62 Mon Sep 17 00:00:00 2001 +From: Or Gerlitz +Date: Tue, 3 Feb 2015 17:57:18 +0200 +Subject: [PATCH] net/mlx5_core: Move to use hex PCI device IDs + +Align the IDs in the code with the modinfo, lspci -n, etc tools outputs. + +Signed-off-by: Or Gerlitz +Signed-off-by: Amir Vadai +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mellanox/mlx5/core/main.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c +index 3f45256..d665193 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/main.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c +@@ -903,12 +903,12 @@ static void remove_one(struct pci_dev *pdev) + } + + static const struct pci_device_id mlx5_core_pci_table[] = { +- { PCI_VDEVICE(MELLANOX, 4113) }, /* Connect-IB */ +- { PCI_VDEVICE(MELLANOX, 4114) }, /* Connect-IB VF */ +- { PCI_VDEVICE(MELLANOX, 4115) }, /* ConnectX-4 */ +- { PCI_VDEVICE(MELLANOX, 4116) }, /* ConnectX-4 VF */ +- { PCI_VDEVICE(MELLANOX, 4117) }, /* ConnectX-4LX */ +- { PCI_VDEVICE(MELLANOX, 4118) }, /* ConnectX-4LX VF */ ++ { PCI_VDEVICE(MELLANOX, 0x1011) }, /* Connect-IB */ ++ { PCI_VDEVICE(MELLANOX, 0x1012) }, /* Connect-IB VF */ ++ { PCI_VDEVICE(MELLANOX, 0x1013) }, /* ConnectX-4 */ ++ { PCI_VDEVICE(MELLANOX, 0x1014) }, /* ConnectX-4 VF */ ++ { PCI_VDEVICE(MELLANOX, 0x1015) }, /* ConnectX-4LX */ ++ { PCI_VDEVICE(MELLANOX, 0x1016) }, /* ConnectX-4LX VF */ + { 0, } + }; + +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0037-net-Mellanox-Delete-unnecessary-checks-before-the-fu.patch b/linux-next-cherry-picks/0037-net-Mellanox-Delete-unnecessary-checks-before-the-fu.patch new file mode 100644 index 0000000..09520cb --- /dev/null +++ b/linux-next-cherry-picks/0037-net-Mellanox-Delete-unnecessary-checks-before-the-fu.patch @@ -0,0 +1,34 @@ +From 1d966d03a37f7f58abf12e87203d03f96950cfd0 Mon Sep 17 00:00:00 2001 +From: Markus Elfring +Date: Mon, 9 Feb 2015 11:10:41 +0100 +Subject: [PATCH] net: Mellanox: Delete unnecessary checks before the + function call "vunmap" + +The vunmap() function performs also input parameter validation. +Thus the test around the call is not needed. + +This issue was detected by using the Coccinelle software. + +Signed-off-by: Markus Elfring +Acked-by: Eli Cohen +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mellanox/mlx5/core/alloc.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/alloc.c b/drivers/net/ethernet/mellanox/mlx5/core/alloc.c +index 56779c1..201ca6d 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/alloc.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/alloc.c +@@ -121,7 +121,7 @@ void mlx5_buf_free(struct mlx5_core_dev *dev, struct mlx5_buf *buf) + dma_free_coherent(&dev->pdev->dev, buf->size, buf->direct.buf, + buf->direct.map); + else { +- if (BITS_PER_LONG == 64 && buf->direct.buf) ++ if (BITS_PER_LONG == 64) + vunmap(buf->direct.buf); + + for (i = 0; i < buf->nbufs; i++) +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0038-net-mlx5_core-Fix-configuration-of-log_uar_page_sz.patch b/linux-next-cherry-picks/0038-net-mlx5_core-Fix-configuration-of-log_uar_page_sz.patch new file mode 100644 index 0000000..c331aa1 --- /dev/null +++ b/linux-next-cherry-picks/0038-net-mlx5_core-Fix-configuration-of-log_uar_page_sz.patch @@ -0,0 +1,30 @@ +From de61390cb3e03186f85997fe08a11dcb9f7a01a3 Mon Sep 17 00:00:00 2001 +From: Eli Cohen +Date: Wed, 11 Feb 2015 16:40:38 +0200 +Subject: [PATCH] net/mlx5_core: Fix configuration of log_uar_page_sz + +The current code failed to configure the page size for architectures with page +size different than 4K - PPC for example. + +Signed-off-by: Carol L Soto +Signed-off-by: Eli Cohen +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mellanox/mlx5/core/main.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c +index d665193..5394a84 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/main.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c +@@ -291,6 +291,7 @@ static void copy_rw_fields(void *to, struct mlx5_caps *from) + MLX5_SET(cmd_hca_cap, to, log_max_ra_req_dc, from->gen.log_max_ra_req_dc); + MLX5_SET(cmd_hca_cap, to, log_max_ra_res_dc, from->gen.log_max_ra_res_dc); + MLX5_SET(cmd_hca_cap, to, pkey_table_size, to_fw_pkey_sz(from->gen.pkey_table_size)); ++ MLX5_SET(cmd_hca_cap, to, log_uar_page_sz, PAGE_SHIFT - 12); + v64 = from->gen.flags & MLX5_CAP_BITS_RW_MASK; + *flags_off = cpu_to_be64(v64); + } +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0039-net-mlx5_core-don-t-export-static-symbol.patch b/linux-next-cherry-picks/0039-net-mlx5_core-don-t-export-static-symbol.patch new file mode 100644 index 0000000..3912a58 --- /dev/null +++ b/linux-next-cherry-picks/0039-net-mlx5_core-don-t-export-static-symbol.patch @@ -0,0 +1,45 @@ +From 6b9f53bc102d4e61b73c13f661de4a1c358768c1 Mon Sep 17 00:00:00 2001 +From: Julia Lawall +Date: Wed, 11 Mar 2015 17:56:25 +0100 +Subject: [PATCH] net/mlx5_core: don't export static symbol + +The semantic patch that fixes this problem is as follows: +(http://coccinelle.lip6.fr/) + +// +@r@ +type T; +identifier f; +@@ + +static T f (...) { ... } + +@@ +identifier r.f; +declarer name EXPORT_SYMBOL; +@@ + +-EXPORT_SYMBOL(f); +// + +Signed-off-by: Julia Lawall +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mellanox/mlx5/core/main.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c +index 5394a84..350c629 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/main.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c +@@ -697,7 +697,6 @@ err_dbg: + debugfs_remove(priv->dbg_root); + return err; + } +-EXPORT_SYMBOL(mlx5_dev_init); + + static void mlx5_dev_cleanup(struct mlx5_core_dev *dev) + { +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0040-net-mlx5_core-Avoid-setting-DC-requestor-responder-r.patch b/linux-next-cherry-picks/0040-net-mlx5_core-Avoid-setting-DC-requestor-responder-r.patch new file mode 100644 index 0000000..35c383c --- /dev/null +++ b/linux-next-cherry-picks/0040-net-mlx5_core-Avoid-setting-DC-requestor-responder-r.patch @@ -0,0 +1,30 @@ +From 9ef9baa2acda077f3831f6e7cdf751bc8691f78f Mon Sep 17 00:00:00 2001 +From: Eli Cohen +Date: Thu, 2 Apr 2015 17:07:22 +0300 +Subject: [PATCH] net/mlx5_core: Avoid setting DC requestor/responder + resources + +PRM does not support setting these values so avoid setting them. + +Signed-off-by: Eli Cohen +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mellanox/mlx5/core/main.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c +index 350c629..f29fd55 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/main.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c +@@ -288,8 +288,6 @@ static void copy_rw_fields(void *to, struct mlx5_caps *from) + MLX5_SET(cmd_hca_cap, to, log_max_ra_req_qp, from->gen.log_max_ra_req_qp); + MLX5_SET(cmd_hca_cap, to, log_max_ra_res_qp, from->gen.log_max_ra_res_qp); + MLX5_SET(cmd_hca_cap, to, pkey_table_size, from->gen.pkey_table_size); +- MLX5_SET(cmd_hca_cap, to, log_max_ra_req_dc, from->gen.log_max_ra_req_dc); +- MLX5_SET(cmd_hca_cap, to, log_max_ra_res_dc, from->gen.log_max_ra_res_dc); + MLX5_SET(cmd_hca_cap, to, pkey_table_size, to_fw_pkey_sz(from->gen.pkey_table_size)); + MLX5_SET(cmd_hca_cap, to, log_uar_page_sz, PAGE_SHIFT - 12); + v64 = from->gen.flags & MLX5_CAP_BITS_RW_MASK; +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0041-net-mlx5_core-Clear-doorbell-record-inside-mlx5_db_a.patch b/linux-next-cherry-picks/0041-net-mlx5_core-Clear-doorbell-record-inside-mlx5_db_a.patch new file mode 100644 index 0000000..996fd04 --- /dev/null +++ b/linux-next-cherry-picks/0041-net-mlx5_core-Clear-doorbell-record-inside-mlx5_db_a.patch @@ -0,0 +1,33 @@ +From b812b5441e359adb9bd44108f7f91e5b0ba4a768 Mon Sep 17 00:00:00 2001 +From: Saeed Mahameed +Date: Thu, 2 Apr 2015 17:07:23 +0300 +Subject: [PATCH] net/mlx5_core: Clear doorbell record inside + mlx5_db_alloc() + +Do it in one place instead of every where the function is invoked + +Signed-off-by: Achiad Shochat +Signed-off-by: Saeed Mahameed +Signed-off-by: Eli Cohen +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mellanox/mlx5/core/alloc.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/alloc.c b/drivers/net/ethernet/mellanox/mlx5/core/alloc.c +index 201ca6d..63dd754 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/alloc.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/alloc.c +@@ -171,6 +171,9 @@ static int mlx5_alloc_db_from_pgdir(struct mlx5_db_pgdir *pgdir, + db->db = pgdir->db_page + offset / sizeof(*pgdir->db_page); + db->dma = pgdir->db_dma + offset; + ++ db->db[0] = 0; ++ db->db[1] = 0; ++ + return 0; + } + +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0042-net-mlx5_core-Use-the-right-inbox-struct-in-destroy-.patch b/linux-next-cherry-picks/0042-net-mlx5_core-Use-the-right-inbox-struct-in-destroy-.patch new file mode 100644 index 0000000..0bd907d --- /dev/null +++ b/linux-next-cherry-picks/0042-net-mlx5_core-Use-the-right-inbox-struct-in-destroy-.patch @@ -0,0 +1,32 @@ +From 60722c2ba02be052140998bc80ed77d74e3c03df Mon Sep 17 00:00:00 2001 +From: Achiad Shochat +Date: Thu, 2 Apr 2015 17:07:24 +0300 +Subject: [PATCH] net/mlx5_core: Use the right inbox struct in destroy + mkey command + +struct mlx5_query_mkey_mbox_in rather than mlx5_destroy_mkey_mbox_in + +Signed-off-by: Achiad Shochat +Signed-off-by: Saeed Mahameed +Signed-off-by: Eli Cohen +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mellanox/mlx5/core/mr.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/mr.c b/drivers/net/ethernet/mellanox/mlx5/core/mr.c +index 184c361..1a9b751 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/mr.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/mr.c +@@ -141,7 +141,7 @@ EXPORT_SYMBOL(mlx5_core_destroy_mkey); + int mlx5_core_query_mkey(struct mlx5_core_dev *dev, struct mlx5_core_mr *mr, + struct mlx5_query_mkey_mbox_out *out, int outlen) + { +- struct mlx5_destroy_mkey_mbox_in in; ++ struct mlx5_query_mkey_mbox_in in; + int err; + + memset(&in, 0, sizeof(in)); +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0043-net-mlx5_core-Avoid-copying-outbox-in-aysnc-command-.patch b/linux-next-cherry-picks/0043-net-mlx5_core-Avoid-copying-outbox-in-aysnc-command-.patch new file mode 100644 index 0000000..4eb71f3 --- /dev/null +++ b/linux-next-cherry-picks/0043-net-mlx5_core-Avoid-copying-outbox-in-aysnc-command-.patch @@ -0,0 +1,35 @@ +From 05e4ecd1dc8b085a9010f20dcb5409b25488480a Mon Sep 17 00:00:00 2001 +From: Eli Cohen +Date: Thu, 2 Apr 2015 17:07:26 +0300 +Subject: [PATCH] net/mlx5_core: Avoid copying outbox in aysnc command + completion + +Avoid copying to the output buffer in cmd_exec since this is done after the +command is completed. Failure to do this may cause cases where the callback +handler is called before the copy done by cmd_exec which then overwrites it. + +Reported-by: Tamer Hleihel +Signed-off-by: Eli Cohen +Signed-off-by: Saeed Mahameed +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c +index 43a73d3..290ae87 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c +@@ -1236,7 +1236,8 @@ static int cmd_exec(struct mlx5_core_dev *dev, void *in, int in_size, void *out, + goto out_out; + } + +- err = mlx5_copy_from_msg(out, outb, out_size); ++ if (!callback) ++ err = mlx5_copy_from_msg(out, outb, out_size); + + out_out: + if (!callback) +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0044-net-mlx5_core-Avoid-usage-command-work-entry-after-w.patch b/linux-next-cherry-picks/0044-net-mlx5_core-Avoid-usage-command-work-entry-after-w.patch new file mode 100644 index 0000000..1a19f03 --- /dev/null +++ b/linux-next-cherry-picks/0044-net-mlx5_core-Avoid-usage-command-work-entry-after-w.patch @@ -0,0 +1,37 @@ +From 21db507439ec3a76a9587f2ad50ad3e4d13f4440 Mon Sep 17 00:00:00 2001 +From: Ira Gusinsky +Date: Thu, 2 Apr 2015 17:07:27 +0300 +Subject: [PATCH] net/mlx5_core: Avoid usage command work entry after + writing command doorbell + +Avoid usage of command work entry in cmd_work_handler since it can be released +by mlx5_cmd_invoke before the work handler returns to running. + +Signed-off-by: Ira Gusinsky +Signed-off-by: Saeed Mahameed +Signed-off-by: Eli Cohen +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c +index 290ae87..0d86269 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c +@@ -515,10 +515,11 @@ static void cmd_work_handler(struct work_struct *work) + ent->ts1 = ktime_get_ns(); + + /* ring doorbell after the descriptor is valid */ ++ mlx5_core_dbg(dev, "writing 0x%x to command doorbell\n", 1 << ent->idx); + wmb(); + iowrite32be(1 << ent->idx, &dev->iseg->cmd_dbell); +- mlx5_core_dbg(dev, "write 0x%x to command doorbell\n", 1 << ent->idx); + mmiowb(); ++ /* if not in polling don't use ent after this point */ + if (cmd->mode == CMD_MODE_POLLING) { + poll_timeout(ent); + /* make sure we read the descriptor after ownership is SW */ +-- +1.8.3.1 + diff --git a/linux-next-cherry-picks/0045-mlx5-wrong-page-mask-if-CONFIG_ARCH_DMA_ADDR_T_64BIT.patch b/linux-next-cherry-picks/0045-mlx5-wrong-page-mask-if-CONFIG_ARCH_DMA_ADDR_T_64BIT.patch new file mode 100644 index 0000000..a3bdbb6 --- /dev/null +++ b/linux-next-cherry-picks/0045-mlx5-wrong-page-mask-if-CONFIG_ARCH_DMA_ADDR_T_64BIT.patch @@ -0,0 +1,81 @@ +From 59d2d18cc4e9ba30b370db18d0e02d792699da96 Mon Sep 17 00:00:00 2001 +From: Honggang LI +Date: Wed, 15 Apr 2015 16:36:15 +0800 +Subject: [PATCH] mlx5: wrong page mask if CONFIG_ARCH_DMA_ADDR_T_64BIT + enabled for 32Bit architectures + +If CONFIG_ARCH_DMA_ADDR_T_64BIT enabled for x86 systems and physical +memory is more than 4GB, dma_map_page may return a valid memory +address which greater than 0xffffffff. As a result, the mlx5 device page +allocator RB tree will be initialized with valid addresses greater than +0xfffffff. + +However, (addr & PAGE_MASK) set the high four bytes to zeros. So, it's +impossible for the function, free_4k, to release the pages whose +addresses greater than 4GB. Memory leaks. And mlx5_ib module can't +release the pages when user try to remove the module, as a result, +system hang. + +[root@rdma05 root]# dmesg | grep addr | head +addr = 3fe384000 +addr & PAGE_MASK = fe384000 +[root@rdma05 root]# rmmod mlx5_ib <---- hang on + +---------------------- cosnole log ----------------- +mlx5_ib 0000:04:00.0: irq 138 for MSI/MSI-X + alloc irq_desc for 139 on node -1 + alloc kstat_irqs on node -1 +mlx5_ib 0000:04:00.0: irq 139 for MSI/MSI-X +0000:04:00.0:free_4k:221:(pid 1519): page not found +0000:04:00.0:free_4k:221:(pid 1519): page not found +0000:04:00.0:free_4k:221:(pid 1519): page not found +0000:04:00.0:free_4k:221:(pid 1519): page not found +---------------------- cosnole log ----------------- + +Fixes: bf0bf77f6519 ('mlx5: Support communicating arbitrary host page size to firmware') +Signed-off-by: Honggang Li +Signed-off-by: Doug Ledford +--- + drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c b/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c +index df22383..8a64542 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c +@@ -211,26 +211,28 @@ static int alloc_4k(struct mlx5_core_dev *dev, u64 *addr) + return 0; + } + ++#define MLX5_U64_4K_PAGE_MASK ((~(u64)0U) << PAGE_SHIFT) ++ + static void free_4k(struct mlx5_core_dev *dev, u64 addr) + { + struct fw_page *fwp; + int n; + +- fwp = find_fw_page(dev, addr & PAGE_MASK); ++ fwp = find_fw_page(dev, addr & MLX5_U64_4K_PAGE_MASK); + if (!fwp) { + mlx5_core_warn(dev, "page not found\n"); + return; + } + +- n = (addr & ~PAGE_MASK) >> MLX5_ADAPTER_PAGE_SHIFT; ++ n = (addr & ~MLX5_U64_4K_PAGE_MASK) >> MLX5_ADAPTER_PAGE_SHIFT; + fwp->free_count++; + set_bit(n, &fwp->bitmask); + if (fwp->free_count == MLX5_NUM_4K_IN_PAGE) { + rb_erase(&fwp->rb_node, &dev->priv.page_root); + if (fwp->free_count != 1) + list_del(&fwp->list); +- dma_unmap_page(&dev->pdev->dev, addr & PAGE_MASK, PAGE_SIZE, +- DMA_BIDIRECTIONAL); ++ dma_unmap_page(&dev->pdev->dev, addr & MLX5_U64_4K_PAGE_MASK, ++ PAGE_SIZE, DMA_BIDIRECTIONAL); + __free_page(fwp->page); + kfree(fwp); + } else if (fwp->free_count == 1) { +-- +1.8.3.1 +