netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [pull request][net-next 00/15] Mellanox mlx5 updates and cleanups 2017-06-16
@ 2017-06-15 21:42 Saeed Mahameed
  2017-06-15 21:42 ` [net-next 01/15] net/mlx5: Update eqe_type_str() event names Saeed Mahameed
                   ` (15 more replies)
  0 siblings, 16 replies; 21+ messages in thread
From: Saeed Mahameed @ 2017-06-15 21:42 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Saeed Mahameed

Hi Dave,

This series provides updates and cleanups to mlx5 driver.

For more details please see tag log below.

Please pull and let me know if there's any problem.
*This series doesn't introduce any conflict with the ongoing net
pull request.

Thanks,
Saeed.

---

The following changes since commit 3715c47bcda8bb56f7e2be27276282a2d0d48c09:

  Merge branch 'r8152-support-new-chips' (2017-06-15 14:31:56 -0400)

are available in the git repository at:

  git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux.git tags/mlx5-updates-2017-06-16

for you to fetch changes up to 8812c24d28f4972c4f2b9998bf30b1f2a1b62adf:

  net/mlx5: Add fast unload support in shutdown flow (2017-06-16 00:19:44 +0300)

----------------------------------------------------------------
mlx5-updates-2017-06-16

This series provide some updates and cleanups for mlx5 core and netdevice
driver.

>From Eli Cohen, add a missing event string.
>From Or Gerlitz, some checkpatch cleanups.
>From Moni, Disalbe HW level LAG when SRIOV is enabled.
>From Tariq, A code reuse cleanup in aRFS flow.
>From Itay Aveksis, Typo fix.
>From Gal Pressman, ethtool statistics updates and "update stats" deferred work optimizations.
>From Majd Dibbiny, Fast unload support on kernel shutdown.

----------------------------------------------------------------
Eli Cohen (1):
      net/mlx5: Update eqe_type_str() event names

Gal Pressman (4):
      net/mlx5e: Rename physical symbol errors counter
      net/mlx5e: Reduce number of heap allocated buffers for update stats
      net/mlx5e: Move and optimize query out of buffer function
      net/mlx5e: Optimize update stats work

Itay Aveksis (1):
      net/mlx5e: Fix typo in warning if CQ moderation is not supported

Majd Dibbiny (2):
      net/mlx5: Expose command polling interface
      net/mlx5: Add fast unload support in shutdown flow

Moni Shoua (1):
      net/mlx5: Undo LAG upon request to create virtual functions

Or Gerlitz (5):
      net/mlx5: Fix some spelling mistakes
      net/mlx5: Avoid using multiple blank lines
      net/mlx5: Avoid blank lines before/after closing/opening braces
      net/mlx5: Align to match opening parenthesis
      net/mlx5: Avoid space after casting

Tariq Toukan (1):
      net/mlx5e: Use function to map aRFS into traffic type

 drivers/infiniband/hw/mlx5/main.c                  |  2 +-
 drivers/net/ethernet/mellanox/mlx5/core/alloc.c    |  1 -
 drivers/net/ethernet/mellanox/mlx5/core/cmd.c      | 36 +++++++----
 drivers/net/ethernet/mellanox/mlx5/core/debugfs.c  |  3 -
 drivers/net/ethernet/mellanox/mlx5/core/en.h       |  2 +-
 drivers/net/ethernet/mellanox/mlx5/core/en_arfs.c  | 21 +++----
 .../net/ethernet/mellanox/mlx5/core/en_common.c    |  1 -
 .../net/ethernet/mellanox/mlx5/core/en_ethtool.c   |  2 +-
 drivers/net/ethernet/mellanox/mlx5/core/en_fs.c    |  1 -
 drivers/net/ethernet/mellanox/mlx5/core/en_main.c  | 52 ++++++++--------
 drivers/net/ethernet/mellanox/mlx5/core/en_rep.c   |  1 -
 drivers/net/ethernet/mellanox/mlx5/core/en_stats.h |  2 +-
 drivers/net/ethernet/mellanox/mlx5/core/en_tx.c    |  2 +-
 drivers/net/ethernet/mellanox/mlx5/core/eq.c       |  6 +-
 drivers/net/ethernet/mellanox/mlx5/core/eswitch.c  |  1 -
 .../ethernet/mellanox/mlx5/core/eswitch_offloads.c |  4 +-
 drivers/net/ethernet/mellanox/mlx5/core/fs_core.c  |  2 +-
 drivers/net/ethernet/mellanox/mlx5/core/fw.c       | 28 +++++++++
 drivers/net/ethernet/mellanox/mlx5/core/health.c   |  4 +-
 drivers/net/ethernet/mellanox/mlx5/core/lag.c      | 71 +++++++++++++++++++---
 drivers/net/ethernet/mellanox/mlx5/core/main.c     | 43 ++++++++++---
 .../net/ethernet/mellanox/mlx5/core/mlx5_core.h    |  6 +-
 .../net/ethernet/mellanox/mlx5/core/pagealloc.c    |  1 -
 drivers/net/ethernet/mellanox/mlx5/core/qp.c       | 21 -------
 drivers/net/ethernet/mellanox/mlx5/core/sriov.c    | 15 +++--
 include/linux/mlx5/driver.h                        |  3 +
 include/linux/mlx5/mlx5_ifc.h                      | 18 ++++--
 include/linux/mlx5/qp.h                            |  2 -
 28 files changed, 227 insertions(+), 124 deletions(-)

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [net-next 01/15] net/mlx5: Update eqe_type_str() event names
  2017-06-15 21:42 [pull request][net-next 00/15] Mellanox mlx5 updates and cleanups 2017-06-16 Saeed Mahameed
@ 2017-06-15 21:42 ` Saeed Mahameed
  2017-06-15 23:49   ` Joe Perches
  2017-06-15 21:42 ` [net-next 02/15] net/mlx5: Fix some spelling mistakes Saeed Mahameed
                   ` (14 subsequent siblings)
  15 siblings, 1 reply; 21+ messages in thread
From: Saeed Mahameed @ 2017-06-15 21:42 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Eli Cohen, Saeed Mahameed

From: Eli Cohen <eli@mellanox.com>

Add missing NIC_VPORT_CHANGE event.

Signed-off-by: Eli Cohen <eli@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx5/core/eq.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eq.c b/drivers/net/ethernet/mellanox/mlx5/core/eq.c
index 0ed8e90ba54f..23048247d827 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eq.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eq.c
@@ -157,6 +157,8 @@ static const char *eqe_type_str(u8 type)
 		return "MLX5_EVENT_TYPE_PAGE_FAULT";
 	case MLX5_EVENT_TYPE_PPS_EVENT:
 		return "MLX5_EVENT_TYPE_PPS_EVENT";
+	case MLX5_EVENT_TYPE_NIC_VPORT_CHANGE:
+		return "MLX5_EVENT_TYPE_NIC_VPORT_CHANGE";
 	case MLX5_EVENT_TYPE_FPGA_ERROR:
 		return "MLX5_EVENT_TYPE_FPGA_ERROR";
 	default:
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [net-next 02/15] net/mlx5: Fix some spelling mistakes
  2017-06-15 21:42 [pull request][net-next 00/15] Mellanox mlx5 updates and cleanups 2017-06-16 Saeed Mahameed
  2017-06-15 21:42 ` [net-next 01/15] net/mlx5: Update eqe_type_str() event names Saeed Mahameed
@ 2017-06-15 21:42 ` Saeed Mahameed
  2017-06-15 21:42 ` [net-next 03/15] net/mlx5: Avoid using multiple blank lines Saeed Mahameed
                   ` (13 subsequent siblings)
  15 siblings, 0 replies; 21+ messages in thread
From: Saeed Mahameed @ 2017-06-15 21:42 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Or Gerlitz, Saeed Mahameed

From: Or Gerlitz <ogerlitz@mellanox.com>

Fixed few places where endianness was misspelled and
one spot whwere output was:

CHECK: 'endianess' may be misspelled - perhaps 'endianness'?
CHECK: 'ouput' may be misspelled - perhaps 'output'?

Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
---
 drivers/infiniband/hw/mlx5/main.c              |  2 +-
 drivers/net/ethernet/mellanox/mlx5/core/cmd.c  |  2 +-
 drivers/net/ethernet/mellanox/mlx5/core/main.c | 10 +++++-----
 include/linux/mlx5/mlx5_ifc.h                  |  4 ++--
 4 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
index 852a6a75db98..2ab505d1e8e3 100644
--- a/drivers/infiniband/hw/mlx5/main.c
+++ b/drivers/infiniband/hw/mlx5/main.c
@@ -439,7 +439,7 @@ static void get_atomic_caps(struct mlx5_ib_dev *dev,
 	u8 atomic_operations = MLX5_CAP_ATOMIC(dev->mdev, atomic_operations);
 	u8 atomic_size_qp = MLX5_CAP_ATOMIC(dev->mdev, atomic_size_qp);
 	u8 atomic_req_8B_endianness_mode =
-		MLX5_CAP_ATOMIC(dev->mdev, atomic_req_8B_endianess_mode);
+		MLX5_CAP_ATOMIC(dev->mdev, atomic_req_8B_endianness_mode);
 
 	/* Check if HW supports 8 bytes standard atomic operations and capable
 	 * of host endianness respond
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
index 10d282841f5b..46efaab9da46 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
@@ -874,7 +874,7 @@ static const char *deliv_status_to_str(u8 status)
 	case MLX5_CMD_DELIVERY_STAT_IN_LENGTH_ERR:
 		return "command input length error";
 	case MLX5_CMD_DELIVERY_STAT_OUT_LENGTH_ERR:
-		return "command ouput length error";
+		return "command output length error";
 	case MLX5_CMD_DELIVERY_STAT_RES_FLD_NOT_CLR_ERR:
 		return "reserved fields not cleared";
 	case MLX5_CMD_DELIVERY_STAT_CMD_DESCR_ERR:
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c
index dc890944c4ea..3319968ed789 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c
@@ -356,7 +356,7 @@ static void mlx5_disable_msix(struct mlx5_core_dev *dev)
 	kfree(priv->msix_arr);
 }
 
-struct mlx5_reg_host_endianess {
+struct mlx5_reg_host_endianness {
 	u8	he;
 	u8      rsvd[15];
 };
@@ -475,7 +475,7 @@ static int handle_hca_cap_atomic(struct mlx5_core_dev *dev)
 
 	req_endianness =
 		MLX5_CAP_ATOMIC(dev,
-				supported_atomic_req_8B_endianess_mode_1);
+				supported_atomic_req_8B_endianness_mode_1);
 
 	if (req_endianness != MLX5_ATOMIC_REQ_MODE_HOST_ENDIANNESS)
 		return 0;
@@ -487,7 +487,7 @@ static int handle_hca_cap_atomic(struct mlx5_core_dev *dev)
 	set_hca_cap = MLX5_ADDR_OF(set_hca_cap_in, set_ctx, capability);
 
 	/* Set requestor to host endianness */
-	MLX5_SET(atomic_caps, set_hca_cap, atomic_req_8B_endianess_mode,
+	MLX5_SET(atomic_caps, set_hca_cap, atomic_req_8B_endianness_mode,
 		 MLX5_ATOMIC_REQ_MODE_HOST_ENDIANNESS);
 
 	err = set_caps(dev, set_ctx, set_sz, MLX5_SET_HCA_CAP_OP_MOD_ATOMIC);
@@ -562,8 +562,8 @@ static int handle_hca_cap(struct mlx5_core_dev *dev)
 
 static int set_hca_ctrl(struct mlx5_core_dev *dev)
 {
-	struct mlx5_reg_host_endianess he_in;
-	struct mlx5_reg_host_endianess he_out;
+	struct mlx5_reg_host_endianness he_in;
+	struct mlx5_reg_host_endianness he_out;
 	int err;
 
 	if (!mlx5_core_is_pf(dev))
diff --git a/include/linux/mlx5/mlx5_ifc.h b/include/linux/mlx5/mlx5_ifc.h
index 32b044e953d2..1fd144662491 100644
--- a/include/linux/mlx5/mlx5_ifc.h
+++ b/include/linux/mlx5/mlx5_ifc.h
@@ -661,9 +661,9 @@ enum {
 struct mlx5_ifc_atomic_caps_bits {
 	u8         reserved_at_0[0x40];
 
-	u8         atomic_req_8B_endianess_mode[0x2];
+	u8         atomic_req_8B_endianness_mode[0x2];
 	u8         reserved_at_42[0x4];
-	u8         supported_atomic_req_8B_endianess_mode_1[0x1];
+	u8         supported_atomic_req_8B_endianness_mode_1[0x1];
 
 	u8         reserved_at_47[0x19];
 
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [net-next 03/15] net/mlx5: Avoid using multiple blank lines
  2017-06-15 21:42 [pull request][net-next 00/15] Mellanox mlx5 updates and cleanups 2017-06-16 Saeed Mahameed
  2017-06-15 21:42 ` [net-next 01/15] net/mlx5: Update eqe_type_str() event names Saeed Mahameed
  2017-06-15 21:42 ` [net-next 02/15] net/mlx5: Fix some spelling mistakes Saeed Mahameed
@ 2017-06-15 21:42 ` Saeed Mahameed
  2017-06-15 21:42 ` [net-next 04/15] net/mlx5: Avoid blank lines before/after closing/opening braces Saeed Mahameed
                   ` (12 subsequent siblings)
  15 siblings, 0 replies; 21+ messages in thread
From: Saeed Mahameed @ 2017-06-15 21:42 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Or Gerlitz, Saeed Mahameed

From: Or Gerlitz <ogerlitz@mellanox.com>

Fixed bunch of this checkpatch complaint:

 CHECK: Please don't use multiple blank lines

Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx5/core/alloc.c     | 1 -
 drivers/net/ethernet/mellanox/mlx5/core/cmd.c       | 2 --
 drivers/net/ethernet/mellanox/mlx5/core/debugfs.c   | 3 ---
 drivers/net/ethernet/mellanox/mlx5/core/en_common.c | 1 -
 drivers/net/ethernet/mellanox/mlx5/core/en_fs.c     | 1 -
 drivers/net/ethernet/mellanox/mlx5/core/eq.c        | 2 --
 drivers/net/ethernet/mellanox/mlx5/core/lag.c       | 2 --
 drivers/net/ethernet/mellanox/mlx5/core/main.c      | 1 -
 drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c | 1 -
 drivers/net/ethernet/mellanox/mlx5/core/qp.c        | 1 -
 10 files changed, 15 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/alloc.c b/drivers/net/ethernet/mellanox/mlx5/core/alloc.c
index 66bd213f35ce..3c95f7f53802 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/alloc.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/alloc.c
@@ -274,7 +274,6 @@ void mlx5_db_free(struct mlx5_core_dev *dev, struct mlx5_db *db)
 }
 EXPORT_SYMBOL_GPL(mlx5_db_free);
 
-
 void mlx5_fill_page_array(struct mlx5_buf *buf, __be64 *pas)
 {
 	u64 addr;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
index 46efaab9da46..e283095b69c3 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
@@ -217,7 +217,6 @@ static void free_cmd(struct mlx5_cmd_work_ent *ent)
 	kfree(ent);
 }
 
-
 static int verify_signature(struct mlx5_cmd_work_ent *ent)
 {
 	struct mlx5_cmd_mailbox *next = ent->out->next;
@@ -1001,7 +1000,6 @@ static ssize_t dbg_write(struct file *filp, const char __user *buf,
 	return err ? err : count;
 }
 
-
 static const struct file_operations fops = {
 	.owner	= THIS_MODULE,
 	.open	= simple_open,
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c b/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c
index de40b6cfee95..7ecadb501743 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/debugfs.c
@@ -168,7 +168,6 @@ static ssize_t average_read(struct file *filp, char __user *buf, size_t count,
 	return ret;
 }
 
-
 static ssize_t average_write(struct file *filp, const char __user *buf,
 			     size_t count, loff_t *pos)
 {
@@ -466,7 +465,6 @@ static ssize_t dbg_read(struct file *filp, char __user *buf, size_t count,
 		return -EINVAL;
 	}
 
-
 	if (is_str)
 		ret = snprintf(tbuf, sizeof(tbuf), "%s\n", (const char *)(unsigned long)field);
 	else
@@ -562,7 +560,6 @@ void mlx5_debug_qp_remove(struct mlx5_core_dev *dev, struct mlx5_core_qp *qp)
 		rem_res_tree(qp->dbg);
 }
 
-
 int mlx5_debug_eq_add(struct mlx5_core_dev *dev, struct mlx5_eq *eq)
 {
 	int err;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_common.c b/drivers/net/ethernet/mellanox/mlx5/core/en_common.c
index 46e56ec4c26f..ece3fb147e3e 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_common.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_common.c
@@ -145,7 +145,6 @@ int mlx5e_refresh_tirs(struct mlx5e_priv *priv, bool enable_uc_lb)
 	int inlen;
 	void *in;
 
-
 	inlen = MLX5_ST_SZ_BYTES(modify_tir_in);
 	in = kvzalloc(inlen, GFP_KERNEL);
 	if (!in)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_fs.c b/drivers/net/ethernet/mellanox/mlx5/core/en_fs.c
index 7acc4fba7ece..dfccb5305e9c 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_fs.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_fs.c
@@ -170,7 +170,6 @@ static int __mlx5e_add_vlan_rule(struct mlx5e_priv *priv,
 
 	spec->match_criteria_enable = MLX5_MATCH_OUTER_HEADERS;
 
-
 	switch (rule_type) {
 	case MLX5E_VLAN_RULE_TYPE_UNTAGGED:
 		rule_p = &priv->fs.vlan.untagged_rule;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eq.c b/drivers/net/ethernet/mellanox/mlx5/core/eq.c
index 23048247d827..43b279b01e07 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eq.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eq.c
@@ -677,7 +677,6 @@ int mlx5_eq_init(struct mlx5_core_dev *dev)
 	return err;
 }
 
-
 void mlx5_eq_cleanup(struct mlx5_core_dev *dev)
 {
 	mlx5_eq_debugfs_cleanup(dev);
@@ -689,7 +688,6 @@ int mlx5_start_eqs(struct mlx5_core_dev *dev)
 	u64 async_event_mask = MLX5_ASYNC_EVENT_MASK;
 	int err;
 
-
 	if (MLX5_CAP_GEN(dev, port_type) == MLX5_CAP_PORT_TYPE_ETH &&
 	    MLX5_CAP_GEN(dev, vport_group_manager) &&
 	    mlx5_core_is_pf(dev))
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/lag.c b/drivers/net/ethernet/mellanox/mlx5/core/lag.c
index b5d5519542e8..b6993c4e4823 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/lag.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/lag.c
@@ -467,7 +467,6 @@ static void mlx5_lag_dev_remove_pf(struct mlx5_lag *ldev,
 	mutex_unlock(&lag_mutex);
 }
 
-
 /* Must be called with intf_mutex held */
 void mlx5_lag_add(struct mlx5_core_dev *dev, struct net_device *netdev)
 {
@@ -586,4 +585,3 @@ bool mlx5_lag_intf_add(struct mlx5_interface *intf, struct mlx5_priv *priv)
 	/* If bonded, we do not add an IB device for PF1. */
 	return false;
 }
-
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c
index 3319968ed789..39e7e523a0dd 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c
@@ -361,7 +361,6 @@ struct mlx5_reg_host_endianness {
 	u8      rsvd[15];
 };
 
-
 #define CAP_MASK(pos, size) ((u64)((1 << (size)) - 1) << (pos))
 
 enum {
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c b/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c
index efcded7ca27a..e36d3e3675f9 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c
@@ -403,7 +403,6 @@ static int reclaim_pages(struct mlx5_core_dev *dev, u32 func_id, int npages,
 	for (i = 0; i < num_claimed; i++)
 		free_4k(dev, MLX5_GET64(manage_pages_out, out, pas[i]));
 
-
 	if (nclaimed)
 		*nclaimed = num_claimed;
 
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/qp.c b/drivers/net/ethernet/mellanox/mlx5/core/qp.c
index 573a6b27fed8..da0f18f93616 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/qp.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/qp.c
@@ -30,7 +30,6 @@
  * SOFTWARE.
  */
 
-
 #include <linux/gfp.h>
 #include <linux/export.h>
 #include <linux/mlx5/cmd.h>
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [net-next 04/15] net/mlx5: Avoid blank lines before/after closing/opening braces
  2017-06-15 21:42 [pull request][net-next 00/15] Mellanox mlx5 updates and cleanups 2017-06-16 Saeed Mahameed
                   ` (2 preceding siblings ...)
  2017-06-15 21:42 ` [net-next 03/15] net/mlx5: Avoid using multiple blank lines Saeed Mahameed
@ 2017-06-15 21:42 ` Saeed Mahameed
  2017-06-15 21:42 ` [net-next 05/15] net/mlx5: Align to match opening parenthesis Saeed Mahameed
                   ` (11 subsequent siblings)
  15 siblings, 0 replies; 21+ messages in thread
From: Saeed Mahameed @ 2017-06-15 21:42 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Or Gerlitz, Saeed Mahameed

From: Or Gerlitz <ogerlitz@mellanox.com>

Fixed checkpatch complaints on that:

 CHECK: Blank lines aren't necessary before a close brace '}'
 CHECK: Blank lines aren't necessary after an open brace '{'

and one on missing blank line..

Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 1 -
 drivers/net/ethernet/mellanox/mlx5/core/en_rep.c  | 1 -
 drivers/net/ethernet/mellanox/mlx5/core/eswitch.c | 1 -
 drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 2 +-
 4 files changed, 1 insertion(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
index 5afec0f4a658..c803a533ec3c 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
@@ -3067,7 +3067,6 @@ mlx5e_get_stats(struct net_device *dev, struct rtnl_link_stats64 *stats)
 	 */
 	stats->multicast =
 		VPORT_COUNTER_GET(vstats, received_eth_multicast.packets);
-
 }
 
 static void mlx5e_set_rx_mode(struct net_device *dev)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
index 70c2b8d020bd..01798e1ab667 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
@@ -1019,7 +1019,6 @@ mlx5e_vport_rep_load(struct mlx5_eswitch *esw, struct mlx5_eswitch_rep *rep)
 	mlx5e_destroy_netdev(netdev_priv(netdev));
 	kfree(rpriv);
 	return err;
-
 }
 
 static void
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
index 37927156f258..89bfda419efe 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
@@ -1217,7 +1217,6 @@ static int esw_vport_ingress_config(struct mlx5_eswitch *esw,
 			       "vport[%d] configure ingress rules failed, illegal mac with spoofchk\n",
 			       vport->vport);
 		return -EPERM;
-
 	}
 
 	esw_vport_cleanup_ingress_rules(esw, vport);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
index 6380c2db355a..e8690fe46bf2 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
@@ -104,6 +104,7 @@ struct node_caps {
 	size_t	arr_sz;
 	long	*caps;
 };
+
 static struct init_tree_node {
 	enum fs_node_type	type;
 	struct init_tree_node *children;
@@ -1858,7 +1859,6 @@ static int create_anchor_flow_table(struct mlx5_flow_steering *steering)
 
 static int init_root_ns(struct mlx5_flow_steering *steering)
 {
-
 	steering->root_ns = create_root_ns(steering, FS_FT_NIC_RX);
 	if (!steering->root_ns)
 		goto cleanup;
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [net-next 05/15] net/mlx5: Align to match opening parenthesis
  2017-06-15 21:42 [pull request][net-next 00/15] Mellanox mlx5 updates and cleanups 2017-06-16 Saeed Mahameed
                   ` (3 preceding siblings ...)
  2017-06-15 21:42 ` [net-next 04/15] net/mlx5: Avoid blank lines before/after closing/opening braces Saeed Mahameed
@ 2017-06-15 21:42 ` Saeed Mahameed
  2017-06-15 21:42 ` [net-next 06/15] net/mlx5: Avoid space after casting Saeed Mahameed
                   ` (10 subsequent siblings)
  15 siblings, 0 replies; 21+ messages in thread
From: Saeed Mahameed @ 2017-06-15 21:42 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Or Gerlitz, Saeed Mahameed

From: Or Gerlitz <ogerlitz@mellanox.com>

Fixed checkpatch complaints of the form:

 CHECK: Alignment should match open parenthesis

Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx5/core/cmd.c              | 2 +-
 drivers/net/ethernet/mellanox/mlx5/core/en_main.c          | 5 +++--
 drivers/net/ethernet/mellanox/mlx5/core/en_tx.c            | 2 +-
 drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c | 2 +-
 4 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
index e283095b69c3..c1d8b0bcde75 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
@@ -1151,7 +1151,7 @@ static struct mlx5_cmd_msg *mlx5_alloc_cmd_msg(struct mlx5_core_dev *dev,
 }
 
 static void mlx5_free_cmd_msg(struct mlx5_core_dev *dev,
-				  struct mlx5_cmd_msg *msg)
+			      struct mlx5_cmd_msg *msg)
 {
 	struct mlx5_cmd_mailbox *head = msg->next;
 	struct mlx5_cmd_mailbox *next;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
index c803a533ec3c..9dad80f32314 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
@@ -124,7 +124,8 @@ static void mlx5e_update_carrier(struct mlx5e_priv *priv)
 	u8 port_state;
 
 	port_state = mlx5_query_vport_state(mdev,
-		MLX5_QUERY_VPORT_STATE_IN_OP_MOD_VNIC_VPORT, 0);
+					    MLX5_QUERY_VPORT_STATE_IN_OP_MOD_VNIC_VPORT,
+					    0);
 
 	if (port_state == VPORT_STATE_UP) {
 		netdev_info(priv->netdev, "Link up\n");
@@ -3850,7 +3851,7 @@ void mlx5e_build_nic_params(struct mlx5_core_dev *mdev,
 	/* set CQE compression */
 	params->rx_cqe_compress_def = false;
 	if (MLX5_CAP_GEN(mdev, cqe_compression) &&
-	     MLX5_CAP_GEN(mdev, vport_group_manager))
+	    MLX5_CAP_GEN(mdev, vport_group_manager))
 		params->rx_cqe_compress_def = cqe_compress_heuristic(link_speed, pci_bw);
 
 	MLX5E_SET_PFLAG(params, MLX5E_PFLAG_RX_CQE_COMPRESS, params->rx_cqe_compress_def);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
index ab3bb026ff9e..ef3e1918d8cc 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
@@ -245,7 +245,7 @@ mlx5e_txwqe_build_dsegs(struct mlx5e_txqsq *sq, struct sk_buff *skb,
 		int fsz = skb_frag_size(frag);
 
 		dma_addr = skb_frag_dma_map(sq->pdev, frag, 0, fsz,
-				     DMA_TO_DEVICE);
+					    DMA_TO_DEVICE);
 		if (unlikely(dma_mapping_error(sq->pdev, dma_addr)))
 			return -ENOMEM;
 
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
index 3795943ef2d1..877395f34e89 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
@@ -691,7 +691,7 @@ mlx5_eswitch_create_vport_rx_rule(struct mlx5_eswitch *esw, int vport, u32 tirn)
 
 	flow_act.action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
 	flow_rule = mlx5_add_flow_rules(esw->offloads.ft_offloads, spec,
-				       &flow_act, &dest, 1);
+					&flow_act, &dest, 1);
 	if (IS_ERR(flow_rule)) {
 		esw_warn(esw->dev, "fs offloads: Failed to add vport rx rule err %ld\n", PTR_ERR(flow_rule));
 		goto out;
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [net-next 06/15] net/mlx5: Avoid space after casting
  2017-06-15 21:42 [pull request][net-next 00/15] Mellanox mlx5 updates and cleanups 2017-06-16 Saeed Mahameed
                   ` (4 preceding siblings ...)
  2017-06-15 21:42 ` [net-next 05/15] net/mlx5: Align to match opening parenthesis Saeed Mahameed
@ 2017-06-15 21:42 ` Saeed Mahameed
  2017-06-15 21:42 ` [net-next 07/15] net/mlx5: Undo LAG upon request to create virtual functions Saeed Mahameed
                   ` (9 subsequent siblings)
  15 siblings, 0 replies; 21+ messages in thread
From: Saeed Mahameed @ 2017-06-15 21:42 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Or Gerlitz, Saeed Mahameed

From: Or Gerlitz <ogerlitz@mellanox.com>

Fix checkpatch complaints on that:

 CHECK: No space is necessary after a cast

Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx5/core/eq.c               | 2 +-
 drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eq.c b/drivers/net/ethernet/mellanox/mlx5/core/eq.c
index 43b279b01e07..af51a5d2b912 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eq.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eq.c
@@ -191,7 +191,7 @@ static void eq_update_ci(struct mlx5_eq *eq, int arm)
 {
 	__be32 __iomem *addr = eq->doorbell + (arm ? 0 : 2);
 	u32 val = (eq->cons_index & 0xffffff) | (eq->eqn << 24);
-	__raw_writel((__force u32) cpu_to_be32(val), addr);
+	__raw_writel((__force u32)cpu_to_be32(val), addr);
 	/* We still want ordering, just not swabbing, so add a barrier */
 	mb();
 }
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
index 877395f34e89..b8030b5707a5 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
@@ -1093,7 +1093,7 @@ int mlx5_devlink_eswitch_encap_mode_set(struct devlink *devlink, u8 encap)
 	if (err) {
 		esw_warn(esw->dev, "Failed re-creating fast FDB table, err %d\n", err);
 		esw->offloads.encap = !encap;
-		(void) esw_create_offloads_fast_fdb_table(esw);
+		(void)esw_create_offloads_fast_fdb_table(esw);
 	}
 	return err;
 }
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [net-next 07/15] net/mlx5: Undo LAG upon request to create virtual functions
  2017-06-15 21:42 [pull request][net-next 00/15] Mellanox mlx5 updates and cleanups 2017-06-16 Saeed Mahameed
                   ` (5 preceding siblings ...)
  2017-06-15 21:42 ` [net-next 06/15] net/mlx5: Avoid space after casting Saeed Mahameed
@ 2017-06-15 21:42 ` Saeed Mahameed
  2017-06-15 21:42 ` [net-next 08/15] net/mlx5e: Use function to map aRFS into traffic type Saeed Mahameed
                   ` (8 subsequent siblings)
  15 siblings, 0 replies; 21+ messages in thread
From: Saeed Mahameed @ 2017-06-15 21:42 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Moni Shoua, Saeed Mahameed

From: Moni Shoua <monis@mellanox.com>

LAG cannot work if virtual functions are present. Therefore, if LAG is
configured, the attempt to create virtual functions will fail. This gives
precedence to LAG over SRIOV which is not the desired behavior as users
might want to use the bonding/teaming driver also want to work with SRIOV.
In that case we don't want to force an order of actions, first create
virtual functions and only than configure a bonding/teaming net device.
To fix, if LAG is configured during a request to create virtual
functions, remove it and continue.

We ignore ENODEV when trying to forbid lag. This makes sense
because "No such device" means that lag is forbidden anyway.

Signed-off-by: Moni Shoua <monis@mellanox.com>
Reviewed-by: Aviv Heller <avivh@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx5/core/lag.c      | 69 +++++++++++++++++++---
 .../net/ethernet/mellanox/mlx5/core/mlx5_core.h    |  3 +
 drivers/net/ethernet/mellanox/mlx5/core/sriov.c    | 15 +++--
 3 files changed, 74 insertions(+), 13 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/lag.c b/drivers/net/ethernet/mellanox/mlx5/core/lag.c
index b6993c4e4823..a3a836bdcfd2 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/lag.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/lag.c
@@ -61,6 +61,11 @@ struct mlx5_lag {
 	struct lag_tracker        tracker;
 	struct delayed_work       bond_work;
 	struct notifier_block     nb;
+
+	/* Admin state. Allow lag only if allowed is true
+	 * even if network conditions for lag were met
+	 */
+	bool                      allowed;
 };
 
 /* General purpose, use for short periods of time.
@@ -214,6 +219,7 @@ static void mlx5_do_bond(struct mlx5_lag *ldev)
 	struct lag_tracker tracker;
 	u8 v2p_port1, v2p_port2;
 	int i, err;
+	bool do_bond;
 
 	if (!dev0 || !dev1)
 		return;
@@ -222,13 +228,9 @@ static void mlx5_do_bond(struct mlx5_lag *ldev)
 	tracker = ldev->tracker;
 	mutex_unlock(&lag_mutex);
 
-	if (tracker.is_bonded && !mlx5_lag_is_bonded(ldev)) {
-		if (mlx5_sriov_is_enabled(dev0) ||
-		    mlx5_sriov_is_enabled(dev1)) {
-			mlx5_core_warn(dev0, "LAG is not supported with SRIOV");
-			return;
-		}
+	do_bond = tracker.is_bonded && ldev->allowed;
 
+	if (do_bond && !mlx5_lag_is_bonded(ldev)) {
 		for (i = 0; i < MLX5_MAX_PORTS; i++)
 			mlx5_remove_dev_by_protocol(ldev->pf[i].dev,
 						    MLX5_INTERFACE_PROTOCOL_IB);
@@ -237,7 +239,7 @@ static void mlx5_do_bond(struct mlx5_lag *ldev)
 
 		mlx5_add_dev_by_protocol(dev0, MLX5_INTERFACE_PROTOCOL_IB);
 		mlx5_nic_vport_enable_roce(dev1);
-	} else if (tracker.is_bonded && mlx5_lag_is_bonded(ldev)) {
+	} else if (do_bond && mlx5_lag_is_bonded(ldev)) {
 		mlx5_infer_tx_affinity_mapping(&tracker, &v2p_port1,
 					       &v2p_port2);
 
@@ -252,7 +254,7 @@ static void mlx5_do_bond(struct mlx5_lag *ldev)
 					      "Failed to modify LAG (%d)\n",
 					      err);
 		}
-	} else if (!tracker.is_bonded && mlx5_lag_is_bonded(ldev)) {
+	} else if (!do_bond && mlx5_lag_is_bonded(ldev)) {
 		mlx5_remove_dev_by_protocol(dev0, MLX5_INTERFACE_PROTOCOL_IB);
 		mlx5_nic_vport_disable_roce(dev1);
 
@@ -411,6 +413,15 @@ static int mlx5_lag_netdev_event(struct notifier_block *this,
 	return NOTIFY_DONE;
 }
 
+static bool mlx5_lag_check_prereq(struct mlx5_lag *ldev)
+{
+	if ((ldev->pf[0].dev && mlx5_sriov_is_enabled(ldev->pf[0].dev)) ||
+	    (ldev->pf[1].dev && mlx5_sriov_is_enabled(ldev->pf[1].dev)))
+		return false;
+	else
+		return true;
+}
+
 static struct mlx5_lag *mlx5_lag_dev_alloc(void)
 {
 	struct mlx5_lag *ldev;
@@ -420,6 +431,7 @@ static struct mlx5_lag *mlx5_lag_dev_alloc(void)
 		return NULL;
 
 	INIT_DELAYED_WORK(&ldev->bond_work, mlx5_do_bond_work);
+	ldev->allowed = mlx5_lag_check_prereq(ldev);
 
 	return ldev;
 }
@@ -444,7 +456,9 @@ static void mlx5_lag_dev_add_pf(struct mlx5_lag *ldev,
 	ldev->tracker.netdev_state[fn].link_up = 0;
 	ldev->tracker.netdev_state[fn].tx_enabled = 0;
 
+	ldev->allowed = mlx5_lag_check_prereq(ldev);
 	dev->priv.lag = ldev;
+
 	mutex_unlock(&lag_mutex);
 }
 
@@ -464,6 +478,7 @@ static void mlx5_lag_dev_remove_pf(struct mlx5_lag *ldev,
 	memset(&ldev->pf[i], 0, sizeof(*ldev->pf));
 
 	dev->priv.lag = NULL;
+	ldev->allowed = mlx5_lag_check_prereq(ldev);
 	mutex_unlock(&lag_mutex);
 }
 
@@ -542,6 +557,44 @@ bool mlx5_lag_is_active(struct mlx5_core_dev *dev)
 }
 EXPORT_SYMBOL(mlx5_lag_is_active);
 
+static int mlx5_lag_set_state(struct mlx5_core_dev *dev, bool allow)
+{
+	struct mlx5_lag *ldev;
+	int ret = 0;
+	bool lag_active;
+
+	mlx5_dev_list_lock();
+
+	ldev = mlx5_lag_dev_get(dev);
+	if (!ldev) {
+		ret = -ENODEV;
+		goto unlock;
+	}
+	lag_active = mlx5_lag_is_bonded(ldev);
+	if (!mlx5_lag_check_prereq(ldev) && allow) {
+		ret = -EINVAL;
+		goto unlock;
+	}
+	if (ldev->allowed == allow)
+		goto unlock;
+	ldev->allowed = allow;
+	if ((lag_active && !allow) || allow)
+		mlx5_do_bond(ldev);
+unlock:
+	mlx5_dev_list_unlock();
+	return ret;
+}
+
+int mlx5_lag_forbid(struct mlx5_core_dev *dev)
+{
+	return mlx5_lag_set_state(dev, false);
+}
+
+int mlx5_lag_allow(struct mlx5_core_dev *dev)
+{
+	return mlx5_lag_set_state(dev, true);
+}
+
 struct net_device *mlx5_lag_get_roce_netdev(struct mlx5_core_dev *dev)
 {
 	struct net_device *ndev = NULL;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h b/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h
index cf69b42278df..1fd279c0338d 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h
@@ -167,4 +167,7 @@ static inline int mlx5_lag_is_lacp_owner(struct mlx5_core_dev *dev)
 		    MLX5_CAP_GEN(dev, lag_master);
 }
 
+int mlx5_lag_allow(struct mlx5_core_dev *dev);
+int mlx5_lag_forbid(struct mlx5_core_dev *dev);
+
 #endif /* __MLX5_CORE_H__ */
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/sriov.c b/drivers/net/ethernet/mellanox/mlx5/core/sriov.c
index e08627785590..bcdf7779c48d 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/sriov.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/sriov.c
@@ -175,15 +175,20 @@ int mlx5_core_sriov_configure(struct pci_dev *pdev, int num_vfs)
 	if (!mlx5_core_is_pf(dev))
 		return -EPERM;
 
-	if (num_vfs && mlx5_lag_is_active(dev)) {
-		mlx5_core_warn(dev, "can't turn sriov on while LAG is active");
-		return -EINVAL;
+	if (num_vfs) {
+		int ret;
+
+		ret = mlx5_lag_forbid(dev);
+		if (ret && (ret != -ENODEV))
+			return ret;
 	}
 
-	if (num_vfs)
+	if (num_vfs) {
 		err = mlx5_sriov_enable(pdev, num_vfs);
-	else
+	} else {
 		mlx5_sriov_disable(pdev);
+		mlx5_lag_allow(dev);
+	}
 
 	return err ? err : num_vfs;
 }
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [net-next 08/15] net/mlx5e: Use function to map aRFS into traffic type
  2017-06-15 21:42 [pull request][net-next 00/15] Mellanox mlx5 updates and cleanups 2017-06-16 Saeed Mahameed
                   ` (6 preceding siblings ...)
  2017-06-15 21:42 ` [net-next 07/15] net/mlx5: Undo LAG upon request to create virtual functions Saeed Mahameed
@ 2017-06-15 21:42 ` Saeed Mahameed
  2017-06-15 21:42 ` [net-next 09/15] net/mlx5e: Fix typo in warning if CQ moderation is not supported Saeed Mahameed
                   ` (7 subsequent siblings)
  15 siblings, 0 replies; 21+ messages in thread
From: Saeed Mahameed @ 2017-06-15 21:42 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Tariq Toukan, Saeed Mahameed

From: Tariq Toukan <tariqt@mellanox.com>

For a better code reuse and readability, use the existing
function arfs_get_tt() to map arfs_type into mlx5e_traffic_types,
instead of duplicating the switch-case logic.

Signed-off-by: Tariq Toukan <tariqt@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx5/core/en_arfs.c | 21 +++++++--------------
 1 file changed, 7 insertions(+), 14 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_arfs.c b/drivers/net/ethernet/mellanox/mlx5/core/en_arfs.c
index f4017c06ddd2..12d3ced61114 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_arfs.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_arfs.c
@@ -178,6 +178,7 @@ static int arfs_add_default_rule(struct mlx5e_priv *priv,
 	struct mlx5_flow_destination dest;
 	MLX5_DECLARE_FLOW_ACT(flow_act);
 	struct mlx5_flow_spec *spec;
+	enum mlx5e_traffic_types tt;
 	int err = 0;
 
 	spec = kvzalloc(sizeof(*spec), GFP_KERNEL);
@@ -187,24 +188,16 @@ static int arfs_add_default_rule(struct mlx5e_priv *priv,
 	}
 
 	dest.type = MLX5_FLOW_DESTINATION_TYPE_TIR;
-	switch (type) {
-	case ARFS_IPV4_TCP:
-		dest.tir_num = tir[MLX5E_TT_IPV4_TCP].tirn;
-		break;
-	case ARFS_IPV4_UDP:
-		dest.tir_num = tir[MLX5E_TT_IPV4_UDP].tirn;
-		break;
-	case ARFS_IPV6_TCP:
-		dest.tir_num = tir[MLX5E_TT_IPV6_TCP].tirn;
-		break;
-	case ARFS_IPV6_UDP:
-		dest.tir_num = tir[MLX5E_TT_IPV6_UDP].tirn;
-		break;
-	default:
+	tt = arfs_get_tt(type);
+	if (tt == -EINVAL) {
+		netdev_err(priv->netdev, "%s: bad arfs_type: %d\n",
+			   __func__, type);
 		err = -EINVAL;
 		goto out;
 	}
 
+	dest.tir_num = tir[tt].tirn;
+
 	arfs_t->default_rule = mlx5_add_flow_rules(arfs_t->ft.t, spec,
 						   &flow_act,
 						   &dest, 1);
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [net-next 09/15] net/mlx5e: Fix typo in warning if CQ moderation is not supported
  2017-06-15 21:42 [pull request][net-next 00/15] Mellanox mlx5 updates and cleanups 2017-06-16 Saeed Mahameed
                   ` (7 preceding siblings ...)
  2017-06-15 21:42 ` [net-next 08/15] net/mlx5e: Use function to map aRFS into traffic type Saeed Mahameed
@ 2017-06-15 21:42 ` Saeed Mahameed
  2017-06-15 21:42 ` [net-next 10/15] net/mlx5e: Rename physical symbol errors counter Saeed Mahameed
                   ` (6 subsequent siblings)
  15 siblings, 0 replies; 21+ messages in thread
From: Saeed Mahameed @ 2017-06-15 21:42 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Itay Aveksis, Saeed Mahameed

From: Itay Aveksis <itayav@mellanox.com>

Signed-off-by: Itay Aveksis <itayav@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
index 9dad80f32314..51f686d737cb 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
@@ -3718,7 +3718,7 @@ static int mlx5e_check_required_hca_cap(struct mlx5_core_dev *mdev)
 	if (!MLX5_CAP_ETH(mdev, self_lb_en_modifiable))
 		mlx5_core_warn(mdev, "Self loop back prevention is not supported\n");
 	if (!MLX5_CAP_GEN(mdev, cq_moderation))
-		mlx5_core_warn(mdev, "CQ modiration is not supported\n");
+		mlx5_core_warn(mdev, "CQ moderation is not supported\n");
 
 	return 0;
 }
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [net-next 10/15] net/mlx5e: Rename physical symbol errors counter
  2017-06-15 21:42 [pull request][net-next 00/15] Mellanox mlx5 updates and cleanups 2017-06-16 Saeed Mahameed
                   ` (8 preceding siblings ...)
  2017-06-15 21:42 ` [net-next 09/15] net/mlx5e: Fix typo in warning if CQ moderation is not supported Saeed Mahameed
@ 2017-06-15 21:42 ` Saeed Mahameed
  2017-06-15 21:42 ` [net-next 11/15] net/mlx5e: Reduce number of heap allocated buffers for update stats Saeed Mahameed
                   ` (5 subsequent siblings)
  15 siblings, 0 replies; 21+ messages in thread
From: Saeed Mahameed @ 2017-06-15 21:42 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Gal Pressman, Saeed Mahameed, kernel-team

From: Gal Pressman <galp@mellanox.com>

Rename rx_symbol_errors_phy to rx_pcs_symbol_err_phy, in order to
prevent confusion with rx_symbol_err_phy counter.

rx_pcs_symbol_err_phy counter counts the number of symbol errors that
were detected on the PCS (regardless of traffic) and weren't
corrected by FEC correction algorithm or that FEC algorithm was
not active on this interface.

rx_symbol_err_phy refers to errors on packet level (physical error
during a packet receive).

Fixes: 5db0a4f64c04 ("net/mlx5e: Expose physical layer statistical...")
Signed-off-by: Gal Pressman <galp@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
Cc: kernel-team@fb.com
---
 drivers/net/ethernet/mellanox/mlx5/core/en_stats.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h
index f81c3aa60b46..fda247587ff6 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h
@@ -268,7 +268,7 @@ static const struct counter_desc pport_2819_stats_desc[] = {
 };
 
 static const struct counter_desc pport_phy_statistical_stats_desc[] = {
-	{ "rx_symbol_errors_phy", PPORT_PHY_STATISTICAL_OFF(phy_symbol_errors) },
+	{ "rx_pcs_symbol_err_phy", PPORT_PHY_STATISTICAL_OFF(phy_symbol_errors) },
 	{ "rx_corrected_bits_phy", PPORT_PHY_STATISTICAL_OFF(phy_corrected_bits) },
 };
 
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [net-next 11/15] net/mlx5e: Reduce number of heap allocated buffers for update stats
  2017-06-15 21:42 [pull request][net-next 00/15] Mellanox mlx5 updates and cleanups 2017-06-16 Saeed Mahameed
                   ` (9 preceding siblings ...)
  2017-06-15 21:42 ` [net-next 10/15] net/mlx5e: Rename physical symbol errors counter Saeed Mahameed
@ 2017-06-15 21:42 ` Saeed Mahameed
  2017-06-20 12:36   ` David Laight
  2017-06-15 21:42 ` [net-next 12/15] net/mlx5e: Move and optimize query out of buffer function Saeed Mahameed
                   ` (4 subsequent siblings)
  15 siblings, 1 reply; 21+ messages in thread
From: Saeed Mahameed @ 2017-06-15 21:42 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Gal Pressman, Saeed Mahameed, kernel-team

From: Gal Pressman <galp@mellanox.com>

Allocating buffers on the heap every 200ms is something we should avoid,
let's use buffers located on the stack instead.

Signed-off-by: Gal Pressman <galp@mellanox.com>
Reviewed-by: Eran Ben Elisha <eranbe@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
Cc: kernel-team@fb.com
---
 drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 16 ++--------------
 1 file changed, 2 insertions(+), 14 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
index 51f686d737cb..50184021624e 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
@@ -248,14 +248,10 @@ static void mlx5e_update_pport_counters(struct mlx5e_priv *priv)
 {
 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
 	struct mlx5_core_dev *mdev = priv->mdev;
+	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
 	int prio;
 	void *out;
-	u32 *in;
-
-	in = kvzalloc(sz, GFP_KERNEL);
-	if (!in)
-		return;
 
 	MLX5_SET(ppcnt_reg, in, local_port, 1);
 
@@ -288,8 +284,6 @@ static void mlx5e_update_pport_counters(struct mlx5e_priv *priv)
 		mlx5_core_access_reg(mdev, in, sz, out, sz,
 				     MLX5_REG_PPCNT, 0, 0);
 	}
-
-	kvfree(in);
 }
 
 static void mlx5e_update_q_counter(struct mlx5e_priv *priv)
@@ -307,22 +301,16 @@ static void mlx5e_update_pcie_counters(struct mlx5e_priv *priv)
 {
 	struct mlx5e_pcie_stats *pcie_stats = &priv->stats.pcie;
 	struct mlx5_core_dev *mdev = priv->mdev;
+	u32 in[MLX5_ST_SZ_DW(mpcnt_reg)] = {0};
 	int sz = MLX5_ST_SZ_BYTES(mpcnt_reg);
 	void *out;
-	u32 *in;
 
 	if (!MLX5_CAP_MCAM_FEATURE(mdev, pcie_performance_group))
 		return;
 
-	in = kvzalloc(sz, GFP_KERNEL);
-	if (!in)
-		return;
-
 	out = pcie_stats->pcie_perf_counters;
 	MLX5_SET(mpcnt_reg, in, grp, MLX5_PCIE_PERFORMANCE_COUNTERS_GROUP);
 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_MPCNT, 0, 0);
-
-	kvfree(in);
 }
 
 void mlx5e_update_stats(struct mlx5e_priv *priv)
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [net-next 12/15] net/mlx5e: Move and optimize query out of buffer function
  2017-06-15 21:42 [pull request][net-next 00/15] Mellanox mlx5 updates and cleanups 2017-06-16 Saeed Mahameed
                   ` (10 preceding siblings ...)
  2017-06-15 21:42 ` [net-next 11/15] net/mlx5e: Reduce number of heap allocated buffers for update stats Saeed Mahameed
@ 2017-06-15 21:42 ` Saeed Mahameed
  2017-06-15 21:42 ` [net-next 13/15] net/mlx5e: Optimize update stats work Saeed Mahameed
                   ` (3 subsequent siblings)
  15 siblings, 0 replies; 21+ messages in thread
From: Saeed Mahameed @ 2017-06-15 21:42 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Gal Pressman, Saeed Mahameed, kernel-team

From: Gal Pressman <galp@mellanox.com>

Move "query queue counter out of buffer" helper function out of
qp.c to en_main.c, since mlx5e netdev driver is the only one to use it.

Also allocate the output buffer on the stack instead of the heap, to reduce
number of heap allocs on update_stats work.

Signed-off-by: Gal Pressman <galp@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
Cc: kernel-team@fb.com
---
 drivers/net/ethernet/mellanox/mlx5/core/en_main.c |  9 +++++++--
 drivers/net/ethernet/mellanox/mlx5/core/qp.c      | 20 --------------------
 include/linux/mlx5/qp.h                           |  2 --
 3 files changed, 7 insertions(+), 24 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
index 50184021624e..8bb0241df069 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
@@ -289,12 +289,17 @@ static void mlx5e_update_pport_counters(struct mlx5e_priv *priv)
 static void mlx5e_update_q_counter(struct mlx5e_priv *priv)
 {
 	struct mlx5e_qcounter_stats *qcnt = &priv->stats.qcnt;
+	u32 out[MLX5_ST_SZ_DW(query_q_counter_out)];
+	int err;
 
 	if (!priv->q_counter)
 		return;
 
-	mlx5_core_query_out_of_buffer(priv->mdev, priv->q_counter,
-				      &qcnt->rx_out_of_buffer);
+	err = mlx5_core_query_q_counter(priv->mdev, priv->q_counter, 0, out, sizeof(out));
+	if (err)
+		return;
+
+	qcnt->rx_out_of_buffer = MLX5_GET(query_q_counter_out, out, out_of_buffer);
 }
 
 static void mlx5e_update_pcie_counters(struct mlx5e_priv *priv)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/qp.c b/drivers/net/ethernet/mellanox/mlx5/core/qp.c
index da0f18f93616..340f281c9801 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/qp.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/qp.c
@@ -518,23 +518,3 @@ int mlx5_core_query_q_counter(struct mlx5_core_dev *dev, u16 counter_id,
 	return mlx5_cmd_exec(dev, in, sizeof(in), out, out_size);
 }
 EXPORT_SYMBOL_GPL(mlx5_core_query_q_counter);
-
-int mlx5_core_query_out_of_buffer(struct mlx5_core_dev *dev, u16 counter_id,
-				  u32 *out_of_buffer)
-{
-	int outlen = MLX5_ST_SZ_BYTES(query_q_counter_out);
-	void *out;
-	int err;
-
-	out = kvzalloc(outlen, GFP_KERNEL);
-	if (!out)
-		return -ENOMEM;
-
-	err = mlx5_core_query_q_counter(dev, counter_id, 0, out, outlen);
-	if (!err)
-		*out_of_buffer = MLX5_GET(query_q_counter_out, out,
-					  out_of_buffer);
-
-	kfree(out);
-	return err;
-}
diff --git a/include/linux/mlx5/qp.h b/include/linux/mlx5/qp.h
index bef80d0a0e30..1f637f4d1265 100644
--- a/include/linux/mlx5/qp.h
+++ b/include/linux/mlx5/qp.h
@@ -569,8 +569,6 @@ int mlx5_core_alloc_q_counter(struct mlx5_core_dev *dev, u16 *counter_id);
 int mlx5_core_dealloc_q_counter(struct mlx5_core_dev *dev, u16 counter_id);
 int mlx5_core_query_q_counter(struct mlx5_core_dev *dev, u16 counter_id,
 			      int reset, void *out, int out_size);
-int mlx5_core_query_out_of_buffer(struct mlx5_core_dev *dev, u16 counter_id,
-				  u32 *out_of_buffer);
 
 static inline const char *mlx5_qp_type_str(int type)
 {
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [net-next 13/15] net/mlx5e: Optimize update stats work
  2017-06-15 21:42 [pull request][net-next 00/15] Mellanox mlx5 updates and cleanups 2017-06-16 Saeed Mahameed
                   ` (11 preceding siblings ...)
  2017-06-15 21:42 ` [net-next 12/15] net/mlx5e: Move and optimize query out of buffer function Saeed Mahameed
@ 2017-06-15 21:42 ` Saeed Mahameed
  2017-06-15 21:42 ` [net-next 14/15] net/mlx5: Expose command polling interface Saeed Mahameed
                   ` (2 subsequent siblings)
  15 siblings, 0 replies; 21+ messages in thread
From: Saeed Mahameed @ 2017-06-15 21:42 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Gal Pressman, Saeed Mahameed, kernel-team

From: Gal Pressman <galp@mellanox.com>

Unlike ethtool stats, get_stats ndo provides information cached by
update stats work that is running in the background without updating
them explicitly.
We cannot update all counters inside the ndo because some
updates require firmware commands that cannot be performed under a
spinlock.

update_stats work does not need to update ALL counters, since only
some of them are needed by ndo_get_stats.
This patch will allow for a minimal run of update_stats using an extra
parameter which will update necessary counters only and cut 13
firmware commands in each iteration of the work.

Work duration previous to this patch: ~4200us.
Work duration after this patch: ~700us (17% of the original time).

Signed-off-by: Gal Pressman <galp@mellanox.com>
Reviewed-by: Eran Ben Elisha <eranbe@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
Cc: kernel-team@fb.com
---
 drivers/net/ethernet/mellanox/mlx5/core/en.h         |  2 +-
 drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c |  2 +-
 drivers/net/ethernet/mellanox/mlx5/core/en_main.c    | 19 ++++++++++++++-----
 3 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h
index a0516b0a5273..8094e78292de 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h
@@ -822,7 +822,7 @@ void mlx5e_rx_am(struct mlx5e_rq *rq);
 void mlx5e_rx_am_work(struct work_struct *work);
 struct mlx5e_cq_moder mlx5e_am_get_def_profile(u8 rx_cq_period_mode);
 
-void mlx5e_update_stats(struct mlx5e_priv *priv);
+void mlx5e_update_stats(struct mlx5e_priv *priv, bool full);
 
 int mlx5e_create_flow_steering(struct mlx5e_priv *priv);
 void mlx5e_destroy_flow_steering(struct mlx5e_priv *priv);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
index b4514f247402..216752070391 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
@@ -311,7 +311,7 @@ static void mlx5e_get_ethtool_stats(struct net_device *dev,
 
 	mutex_lock(&priv->state_lock);
 	if (test_bit(MLX5E_STATE_OPENED, &priv->state))
-		mlx5e_update_stats(priv);
+		mlx5e_update_stats(priv, true);
 	channels = &priv->channels;
 	mutex_unlock(&priv->state_lock);
 
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
index 8bb0241df069..2e9a4187a533 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
@@ -244,7 +244,7 @@ static void mlx5e_update_vport_counters(struct mlx5e_priv *priv)
 	mlx5_cmd_exec(mdev, in, sizeof(in), out, outlen);
 }
 
-static void mlx5e_update_pport_counters(struct mlx5e_priv *priv)
+static void mlx5e_update_pport_counters(struct mlx5e_priv *priv, bool full)
 {
 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
 	struct mlx5_core_dev *mdev = priv->mdev;
@@ -259,6 +259,9 @@ static void mlx5e_update_pport_counters(struct mlx5e_priv *priv)
 	MLX5_SET(ppcnt_reg, in, grp, MLX5_IEEE_802_3_COUNTERS_GROUP);
 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
 
+	if (!full)
+		return;
+
 	out = pstats->RFC_2863_counters;
 	MLX5_SET(ppcnt_reg, in, grp, MLX5_RFC_2863_COUNTERS_GROUP);
 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
@@ -318,15 +321,21 @@ static void mlx5e_update_pcie_counters(struct mlx5e_priv *priv)
 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_MPCNT, 0, 0);
 }
 
-void mlx5e_update_stats(struct mlx5e_priv *priv)
+void mlx5e_update_stats(struct mlx5e_priv *priv, bool full)
 {
-	mlx5e_update_pcie_counters(priv);
-	mlx5e_update_pport_counters(priv);
+	if (full)
+		mlx5e_update_pcie_counters(priv);
+	mlx5e_update_pport_counters(priv, full);
 	mlx5e_update_vport_counters(priv);
 	mlx5e_update_q_counter(priv);
 	mlx5e_update_sw_counters(priv);
 }
 
+static void mlx5e_update_ndo_stats(struct mlx5e_priv *priv)
+{
+	mlx5e_update_stats(priv, false);
+}
+
 void mlx5e_update_stats_work(struct work_struct *work)
 {
 	struct delayed_work *dwork = to_delayed_work(work);
@@ -4195,7 +4204,7 @@ static const struct mlx5e_profile mlx5e_nic_profile = {
 	.cleanup_tx	   = mlx5e_cleanup_nic_tx,
 	.enable		   = mlx5e_nic_enable,
 	.disable	   = mlx5e_nic_disable,
-	.update_stats	   = mlx5e_update_stats,
+	.update_stats	   = mlx5e_update_ndo_stats,
 	.max_nch	   = mlx5e_get_max_num_channels,
 	.rx_handlers.handle_rx_cqe       = mlx5e_handle_rx_cqe,
 	.rx_handlers.handle_rx_cqe_mpwqe = mlx5e_handle_rx_cqe_mpwrq,
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [net-next 14/15] net/mlx5: Expose command polling interface
  2017-06-15 21:42 [pull request][net-next 00/15] Mellanox mlx5 updates and cleanups 2017-06-16 Saeed Mahameed
                   ` (12 preceding siblings ...)
  2017-06-15 21:42 ` [net-next 13/15] net/mlx5e: Optimize update stats work Saeed Mahameed
@ 2017-06-15 21:42 ` Saeed Mahameed
  2017-06-15 21:42 ` [net-next 15/15] net/mlx5: Add fast unload support in shutdown flow Saeed Mahameed
  2017-06-16 19:25 ` [pull request][net-next 00/15] Mellanox mlx5 updates and cleanups 2017-06-16 David Miller
  15 siblings, 0 replies; 21+ messages in thread
From: Saeed Mahameed @ 2017-06-15 21:42 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Majd Dibbiny, Maor Gottlieb, Saeed Mahameed

From: Majd Dibbiny <majd@mellanox.com>

Add a new interface for commands execution that allows the
caller to wait for the command's completion in a busy-wait
loop (polling mode).

This is useful if we want to execute a command in a polling mode
while the driver is working in events mode for the rest of
the commands.
This interface will be used in the downstream patches.

Signed-off-by: Majd Dibbiny <majd@mellanox.com>
Signed-off-by: Maor Gottlieb <maorg@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 30 ++++++++++++++++++++-------
 include/linux/mlx5/driver.h                   |  3 +++
 2 files changed, 26 insertions(+), 7 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
index c1d8b0bcde75..4d5bd01f1ebb 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
@@ -785,6 +785,8 @@ static void cmd_work_handler(struct work_struct *work)
 	struct mlx5_cmd_layout *lay;
 	struct semaphore *sem;
 	unsigned long flags;
+	bool poll_cmd = ent->polling;
+
 
 	sem = ent->page_queue ? &cmd->pages_sem : &cmd->sem;
 	down(sem);
@@ -845,7 +847,7 @@ static void cmd_work_handler(struct work_struct *work)
 	iowrite32be(1 << ent->idx, &dev->iseg->cmd_dbell);
 	mmiowb();
 	/* if not in polling don't use ent after this point */
-	if (cmd->mode == CMD_MODE_POLLING) {
+	if (cmd->mode == CMD_MODE_POLLING || poll_cmd) {
 		poll_timeout(ent);
 		/* make sure we read the descriptor after ownership is SW */
 		rmb();
@@ -889,7 +891,7 @@ static int wait_func(struct mlx5_core_dev *dev, struct mlx5_cmd_work_ent *ent)
 	struct mlx5_cmd *cmd = &dev->cmd;
 	int err;
 
-	if (cmd->mode == CMD_MODE_POLLING) {
+	if (cmd->mode == CMD_MODE_POLLING || ent->polling) {
 		wait_for_completion(&ent->done);
 	} else if (!wait_for_completion_timeout(&ent->done, timeout)) {
 		ent->ret = -ETIMEDOUT;
@@ -917,7 +919,7 @@ static int mlx5_cmd_invoke(struct mlx5_core_dev *dev, struct mlx5_cmd_msg *in,
 			   struct mlx5_cmd_msg *out, void *uout, int uout_size,
 			   mlx5_cmd_cbk_t callback,
 			   void *context, int page_queue, u8 *status,
-			   u8 token)
+			   u8 token, bool force_polling)
 {
 	struct mlx5_cmd *cmd = &dev->cmd;
 	struct mlx5_cmd_work_ent *ent;
@@ -935,6 +937,7 @@ static int mlx5_cmd_invoke(struct mlx5_core_dev *dev, struct mlx5_cmd_msg *in,
 		return PTR_ERR(ent);
 
 	ent->token = token;
+	ent->polling = force_polling;
 
 	if (!callback)
 		init_completion(&ent->done);
@@ -1535,7 +1538,8 @@ static int is_manage_pages(void *in)
 }
 
 static int cmd_exec(struct mlx5_core_dev *dev, void *in, int in_size, void *out,
-		    int out_size, mlx5_cmd_cbk_t callback, void *context)
+		    int out_size, mlx5_cmd_cbk_t callback, void *context,
+		    bool force_polling)
 {
 	struct mlx5_cmd_msg *inb;
 	struct mlx5_cmd_msg *outb;
@@ -1580,7 +1584,7 @@ static int cmd_exec(struct mlx5_core_dev *dev, void *in, int in_size, void *out,
 	}
 
 	err = mlx5_cmd_invoke(dev, inb, outb, out, out_size, callback, context,
-			      pages_queue, &status, token);
+			      pages_queue, &status, token, force_polling);
 	if (err)
 		goto out_out;
 
@@ -1608,7 +1612,7 @@ int mlx5_cmd_exec(struct mlx5_core_dev *dev, void *in, int in_size, void *out,
 {
 	int err;
 
-	err = cmd_exec(dev, in, in_size, out, out_size, NULL, NULL);
+	err = cmd_exec(dev, in, in_size, out, out_size, NULL, NULL, false);
 	return err ? : mlx5_cmd_check(dev, in, out);
 }
 EXPORT_SYMBOL(mlx5_cmd_exec);
@@ -1617,10 +1621,22 @@ int mlx5_cmd_exec_cb(struct mlx5_core_dev *dev, void *in, int in_size,
 		     void *out, int out_size, mlx5_cmd_cbk_t callback,
 		     void *context)
 {
-	return cmd_exec(dev, in, in_size, out, out_size, callback, context);
+	return cmd_exec(dev, in, in_size, out, out_size, callback, context,
+			false);
 }
 EXPORT_SYMBOL(mlx5_cmd_exec_cb);
 
+int mlx5_cmd_exec_polling(struct mlx5_core_dev *dev, void *in, int in_size,
+			  void *out, int out_size)
+{
+	int err;
+
+	err = cmd_exec(dev, in, in_size, out, out_size, NULL, NULL, true);
+
+	return err ? : mlx5_cmd_check(dev, in, out);
+}
+EXPORT_SYMBOL(mlx5_cmd_exec_polling);
+
 static void destroy_msg_cache(struct mlx5_core_dev *dev)
 {
 	struct cmd_msg_cache *ch;
diff --git a/include/linux/mlx5/driver.h b/include/linux/mlx5/driver.h
index 6ea2f5734e37..bf15e87da8fa 100644
--- a/include/linux/mlx5/driver.h
+++ b/include/linux/mlx5/driver.h
@@ -817,6 +817,7 @@ struct mlx5_cmd_work_ent {
 	u64			ts1;
 	u64			ts2;
 	u16			op;
+	bool			polling;
 };
 
 struct mlx5_pas {
@@ -915,6 +916,8 @@ int mlx5_cmd_exec(struct mlx5_core_dev *dev, void *in, int in_size, void *out,
 int mlx5_cmd_exec_cb(struct mlx5_core_dev *dev, void *in, int in_size,
 		     void *out, int out_size, mlx5_cmd_cbk_t callback,
 		     void *context);
+int mlx5_cmd_exec_polling(struct mlx5_core_dev *dev, void *in, int in_size,
+			  void *out, int out_size);
 void mlx5_cmd_mbox_status(void *out, u8 *status, u32 *syndrome);
 
 int mlx5_core_get_caps(struct mlx5_core_dev *dev, enum mlx5_cap_type cap_type);
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [net-next 15/15] net/mlx5: Add fast unload support in shutdown flow
  2017-06-15 21:42 [pull request][net-next 00/15] Mellanox mlx5 updates and cleanups 2017-06-16 Saeed Mahameed
                   ` (13 preceding siblings ...)
  2017-06-15 21:42 ` [net-next 14/15] net/mlx5: Expose command polling interface Saeed Mahameed
@ 2017-06-15 21:42 ` Saeed Mahameed
  2017-06-16 19:25 ` [pull request][net-next 00/15] Mellanox mlx5 updates and cleanups 2017-06-16 David Miller
  15 siblings, 0 replies; 21+ messages in thread
From: Saeed Mahameed @ 2017-06-15 21:42 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, Majd Dibbiny, Maor Gottlieb, Saeed Mahameed

From: Majd Dibbiny <majd@mellanox.com>

Adding a support to flush all HW resources with one FW command and
skip all the heavy unload flows of the driver on kernel shutdown.
There's no need to free all the SW context since a new fresh kernel
will be loaded afterwards.

Regarding the FW resources, they should be closed, otherwise we will
have leakage in the FW. To accelerate this flow, we execute one command
in the beginning that tells the FW that the driver isn't going to close
any of the FW resources and asks the FW to clean up everything.
Once the commands complete, it's safe to close the PCI resources and
finish the routine.

Signed-off-by: Majd Dibbiny <majd@mellanox.com>
Signed-off-by: Maor Gottlieb <maorg@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx5/core/fw.c       | 28 +++++++++++++++++++
 drivers/net/ethernet/mellanox/mlx5/core/health.c   |  4 +--
 drivers/net/ethernet/mellanox/mlx5/core/main.c     | 32 ++++++++++++++++++++--
 .../net/ethernet/mellanox/mlx5/core/mlx5_core.h    |  3 +-
 include/linux/mlx5/mlx5_ifc.h                      | 14 ++++++++--
 5 files changed, 73 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fw.c b/drivers/net/ethernet/mellanox/mlx5/core/fw.c
index 1bc14d0fded8..e9489e8d08bb 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fw.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fw.c
@@ -195,3 +195,31 @@ int mlx5_cmd_teardown_hca(struct mlx5_core_dev *dev)
 	MLX5_SET(teardown_hca_in, in, opcode, MLX5_CMD_OP_TEARDOWN_HCA);
 	return mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
 }
+
+int mlx5_cmd_force_teardown_hca(struct mlx5_core_dev *dev)
+{
+	u32 out[MLX5_ST_SZ_DW(teardown_hca_out)] = {0};
+	u32 in[MLX5_ST_SZ_DW(teardown_hca_in)] = {0};
+	int force_state;
+	int ret;
+
+	if (!MLX5_CAP_GEN(dev, force_teardown)) {
+		mlx5_core_dbg(dev, "force teardown is not supported in the firmware\n");
+		return -EOPNOTSUPP;
+	}
+
+	MLX5_SET(teardown_hca_in, in, opcode, MLX5_CMD_OP_TEARDOWN_HCA);
+	MLX5_SET(teardown_hca_in, in, profile, MLX5_TEARDOWN_HCA_IN_PROFILE_FORCE_CLOSE);
+
+	ret = mlx5_cmd_exec_polling(dev, in, sizeof(in), out, sizeof(out));
+	if (ret)
+		return ret;
+
+	force_state = MLX5_GET(teardown_hca_out, out, force_state);
+	if (force_state == MLX5_TEARDOWN_HCA_OUT_FORCE_STATE_FAIL) {
+		mlx5_core_err(dev, "teardown with force mode failed\n");
+		return -EIO;
+	}
+
+	return 0;
+}
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/health.c b/drivers/net/ethernet/mellanox/mlx5/core/health.c
index c6679b21884e..0648a659b21d 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/health.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/health.c
@@ -111,14 +111,14 @@ static int in_fatal(struct mlx5_core_dev *dev)
 	return 0;
 }
 
-void mlx5_enter_error_state(struct mlx5_core_dev *dev)
+void mlx5_enter_error_state(struct mlx5_core_dev *dev, bool force)
 {
 	mutex_lock(&dev->intf_state_mutex);
 	if (dev->state == MLX5_DEVICE_STATE_INTERNAL_ERROR)
 		goto unlock;
 
 	mlx5_core_err(dev, "start\n");
-	if (pci_channel_offline(dev->pdev) || in_fatal(dev)) {
+	if (pci_channel_offline(dev->pdev) || in_fatal(dev) || force) {
 		dev->state = MLX5_DEVICE_STATE_INTERNAL_ERROR;
 		trigger_cmd_completions(dev);
 	}
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c
index 39e7e523a0dd..715eeab59999 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c
@@ -1418,7 +1418,7 @@ static pci_ers_result_t mlx5_pci_err_detected(struct pci_dev *pdev,
 
 	dev_info(&pdev->dev, "%s was called\n", __func__);
 
-	mlx5_enter_error_state(dev);
+	mlx5_enter_error_state(dev, false);
 	mlx5_unload_one(dev, priv, false);
 	/* In case of kernel call drain the health wq */
 	if (state) {
@@ -1505,15 +1505,43 @@ static const struct pci_error_handlers mlx5_err_handler = {
 	.resume		= mlx5_pci_resume
 };
 
+static int mlx5_try_fast_unload(struct mlx5_core_dev *dev)
+{
+	int ret;
+
+	if (!MLX5_CAP_GEN(dev, force_teardown)) {
+		mlx5_core_dbg(dev, "force teardown is not supported in the firmware\n");
+		return -EOPNOTSUPP;
+	}
+
+	if (dev->state == MLX5_DEVICE_STATE_INTERNAL_ERROR) {
+		mlx5_core_dbg(dev, "Device in internal error state, giving up\n");
+		return -EAGAIN;
+	}
+
+	ret = mlx5_cmd_force_teardown_hca(dev);
+	if (ret) {
+		mlx5_core_dbg(dev, "Firmware couldn't do fast unload error: %d\n", ret);
+		return ret;
+	}
+
+	mlx5_enter_error_state(dev, true);
+
+	return 0;
+}
+
 static void shutdown(struct pci_dev *pdev)
 {
 	struct mlx5_core_dev *dev  = pci_get_drvdata(pdev);
 	struct mlx5_priv *priv = &dev->priv;
+	int err;
 
 	dev_info(&pdev->dev, "Shutdown was called\n");
 	/* Notify mlx5 clients that the kernel is being shut down */
 	set_bit(MLX5_INTERFACE_STATE_SHUTDOWN, &dev->intf_state);
-	mlx5_unload_one(dev, priv, false);
+	err = mlx5_try_fast_unload(dev);
+	if (err)
+		mlx5_unload_one(dev, priv, false);
 	mlx5_pci_disable_device(dev);
 }
 
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h b/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h
index 1fd279c0338d..5ccdf43e58a6 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h
@@ -83,12 +83,13 @@ int mlx5_query_hca_caps(struct mlx5_core_dev *dev);
 int mlx5_query_board_id(struct mlx5_core_dev *dev);
 int mlx5_cmd_init_hca(struct mlx5_core_dev *dev);
 int mlx5_cmd_teardown_hca(struct mlx5_core_dev *dev);
+int mlx5_cmd_force_teardown_hca(struct mlx5_core_dev *dev);
 void mlx5_core_event(struct mlx5_core_dev *dev, enum mlx5_dev_event event,
 		     unsigned long param);
 void mlx5_core_page_fault(struct mlx5_core_dev *dev,
 			  struct mlx5_pagefault *pfault);
 void mlx5_port_module_event(struct mlx5_core_dev *dev, struct mlx5_eqe *eqe);
-void mlx5_enter_error_state(struct mlx5_core_dev *dev);
+void mlx5_enter_error_state(struct mlx5_core_dev *dev, bool force);
 void mlx5_disable_device(struct mlx5_core_dev *dev);
 void mlx5_recover_device(struct mlx5_core_dev *dev);
 int mlx5_sriov_init(struct mlx5_core_dev *dev);
diff --git a/include/linux/mlx5/mlx5_ifc.h b/include/linux/mlx5/mlx5_ifc.h
index 1fd144662491..e86ef880a149 100644
--- a/include/linux/mlx5/mlx5_ifc.h
+++ b/include/linux/mlx5/mlx5_ifc.h
@@ -801,7 +801,8 @@ struct mlx5_ifc_cmd_hca_cap_bits {
 	u8         max_indirection[0x8];
 	u8         fixed_buffer_size[0x1];
 	u8         log_max_mrw_sz[0x7];
-	u8         reserved_at_110[0x2];
+	u8         force_teardown[0x1];
+	u8         reserved_at_111[0x1];
 	u8         log_max_bsf_list_size[0x6];
 	u8         umr_extended_translation_offset[0x1];
 	u8         null_mkey[0x1];
@@ -3094,18 +3095,25 @@ struct mlx5_ifc_tsar_element_bits {
 	u8         reserved_at_10[0x10];
 };
 
+enum {
+	MLX5_TEARDOWN_HCA_OUT_FORCE_STATE_SUCCESS = 0x0,
+	MLX5_TEARDOWN_HCA_OUT_FORCE_STATE_FAIL = 0x1,
+};
+
 struct mlx5_ifc_teardown_hca_out_bits {
 	u8         status[0x8];
 	u8         reserved_at_8[0x18];
 
 	u8         syndrome[0x20];
 
-	u8         reserved_at_40[0x40];
+	u8         reserved_at_40[0x3f];
+
+	u8         force_state[0x1];
 };
 
 enum {
 	MLX5_TEARDOWN_HCA_IN_PROFILE_GRACEFUL_CLOSE  = 0x0,
-	MLX5_TEARDOWN_HCA_IN_PROFILE_PANIC_CLOSE     = 0x1,
+	MLX5_TEARDOWN_HCA_IN_PROFILE_FORCE_CLOSE     = 0x1,
 };
 
 struct mlx5_ifc_teardown_hca_in_bits {
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: [net-next 01/15] net/mlx5: Update eqe_type_str() event names
  2017-06-15 21:42 ` [net-next 01/15] net/mlx5: Update eqe_type_str() event names Saeed Mahameed
@ 2017-06-15 23:49   ` Joe Perches
  2017-06-21  8:56     ` Saeed Mahameed
  0 siblings, 1 reply; 21+ messages in thread
From: Joe Perches @ 2017-06-15 23:49 UTC (permalink / raw)
  To: Saeed Mahameed, David S. Miller; +Cc: netdev, Eli Cohen

On Fri, 2017-06-16 at 00:42 +0300, Saeed Mahameed wrote:
> From: Eli Cohen <eli@mellanox.com>
> 
> Add missing NIC_VPORT_CHANGE event.
> 
> Signed-off-by: Eli Cohen <eli@mellanox.com>
> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
> ---
>  drivers/net/ethernet/mellanox/mlx5/core/eq.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eq.c b/drivers/net/ethernet/mellanox/mlx5/core/eq.c
> index 0ed8e90ba54f..23048247d827 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/eq.c
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/eq.c
> @@ -157,6 +157,8 @@ static const char *eqe_type_str(u8 type)
>  		return "MLX5_EVENT_TYPE_PAGE_FAULT";
>  	case MLX5_EVENT_TYPE_PPS_EVENT:
>  		return "MLX5_EVENT_TYPE_PPS_EVENT";
> +	case MLX5_EVENT_TYPE_NIC_VPORT_CHANGE:
> +		return "MLX5_EVENT_TYPE_NIC_VPORT_CHANGE";
>  	case MLX5_EVENT_TYPE_FPGA_ERROR:
>  		return "MLX5_EVENT_TYPE_FPGA_ERROR";
>  	default:

Maybe one day convert this to use a macro
to reduce the case/string duplication.

Maybe what ath9k uses:
---
 drivers/net/ethernet/mellanox/mlx5/core/eq.c | 74 ++++++++++------------------
 1 file changed, 26 insertions(+), 48 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eq.c b/drivers/net/ethernet/mellanox/mlx5/core/eq.c
index 0ed8e90ba54f..3e79de07c3ee 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eq.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eq.c
@@ -110,55 +110,33 @@ static struct mlx5_eqe *next_eqe_sw(struct mlx5_eq *eq)
 
 static const char *eqe_type_str(u8 type)
 {
+#define case_rtn_string(val) case val: return #val
 	switch (type) {
-	case MLX5_EVENT_TYPE_COMP:
-		return "MLX5_EVENT_TYPE_COMP";
-	case MLX5_EVENT_TYPE_PATH_MIG:
-		return "MLX5_EVENT_TYPE_PATH_MIG";
-	case MLX5_EVENT_TYPE_COMM_EST:
-		return "MLX5_EVENT_TYPE_COMM_EST";
-	case MLX5_EVENT_TYPE_SQ_DRAINED:
-		return "MLX5_EVENT_TYPE_SQ_DRAINED";
-	case MLX5_EVENT_TYPE_SRQ_LAST_WQE:
-		return "MLX5_EVENT_TYPE_SRQ_LAST_WQE";
-	case MLX5_EVENT_TYPE_SRQ_RQ_LIMIT:
-		return "MLX5_EVENT_TYPE_SRQ_RQ_LIMIT";
-	case MLX5_EVENT_TYPE_CQ_ERROR:
-		return "MLX5_EVENT_TYPE_CQ_ERROR";
-	case MLX5_EVENT_TYPE_WQ_CATAS_ERROR:
-		return "MLX5_EVENT_TYPE_WQ_CATAS_ERROR";
-	case MLX5_EVENT_TYPE_PATH_MIG_FAILED:
-		return "MLX5_EVENT_TYPE_PATH_MIG_FAILED";
-	case MLX5_EVENT_TYPE_WQ_INVAL_REQ_ERROR:
-		return "MLX5_EVENT_TYPE_WQ_INVAL_REQ_ERROR";
-	case MLX5_EVENT_TYPE_WQ_ACCESS_ERROR:
-		return "MLX5_EVENT_TYPE_WQ_ACCESS_ERROR";
-	case MLX5_EVENT_TYPE_SRQ_CATAS_ERROR:
-		return "MLX5_EVENT_TYPE_SRQ_CATAS_ERROR";
-	case MLX5_EVENT_TYPE_INTERNAL_ERROR:
-		return "MLX5_EVENT_TYPE_INTERNAL_ERROR";
-	case MLX5_EVENT_TYPE_PORT_CHANGE:
-		return "MLX5_EVENT_TYPE_PORT_CHANGE";
-	case MLX5_EVENT_TYPE_GPIO_EVENT:
-		return "MLX5_EVENT_TYPE_GPIO_EVENT";
-	case MLX5_EVENT_TYPE_PORT_MODULE_EVENT:
-		return "MLX5_EVENT_TYPE_PORT_MODULE_EVENT";
-	case MLX5_EVENT_TYPE_REMOTE_CONFIG:
-		return "MLX5_EVENT_TYPE_REMOTE_CONFIG";
-	case MLX5_EVENT_TYPE_DB_BF_CONGESTION:
-		return "MLX5_EVENT_TYPE_DB_BF_CONGESTION";
-	case MLX5_EVENT_TYPE_STALL_EVENT:
-		return "MLX5_EVENT_TYPE_STALL_EVENT";
-	case MLX5_EVENT_TYPE_CMD:
-		return "MLX5_EVENT_TYPE_CMD";
-	case MLX5_EVENT_TYPE_PAGE_REQUEST:
-		return "MLX5_EVENT_TYPE_PAGE_REQUEST";
-	case MLX5_EVENT_TYPE_PAGE_FAULT:
-		return "MLX5_EVENT_TYPE_PAGE_FAULT";
-	case MLX5_EVENT_TYPE_PPS_EVENT:
-		return "MLX5_EVENT_TYPE_PPS_EVENT";
-	case MLX5_EVENT_TYPE_FPGA_ERROR:
-		return "MLX5_EVENT_TYPE_FPGA_ERROR";
+	case_rtn_string(MLX5_EVENT_TYPE_COMP);
+	case_rtn_string(MLX5_EVENT_TYPE_PATH_MIG);
+	case_rtn_string(MLX5_EVENT_TYPE_COMM_EST);
+	case_rtn_string(MLX5_EVENT_TYPE_SQ_DRAINED);
+	case_rtn_string(MLX5_EVENT_TYPE_SRQ_LAST_WQE);
+	case_rtn_string(MLX5_EVENT_TYPE_SRQ_RQ_LIMIT);
+	case_rtn_string(MLX5_EVENT_TYPE_CQ_ERROR);
+	case_rtn_string(MLX5_EVENT_TYPE_WQ_CATAS_ERROR);
+	case_rtn_string(MLX5_EVENT_TYPE_PATH_MIG_FAILED);
+	case_rtn_string(MLX5_EVENT_TYPE_WQ_INVAL_REQ_ERROR);
+	case_rtn_string(MLX5_EVENT_TYPE_WQ_ACCESS_ERROR);
+	case_rtn_string(MLX5_EVENT_TYPE_SRQ_CATAS_ERROR);
+	case_rtn_string(MLX5_EVENT_TYPE_INTERNAL_ERROR);
+	case_rtn_string(MLX5_EVENT_TYPE_PORT_CHANGE);
+	case_rtn_string(MLX5_EVENT_TYPE_GPIO_EVENT);
+	case_rtn_string(MLX5_EVENT_TYPE_PORT_MODULE_EVENT);
+	case_rtn_string(MLX5_EVENT_TYPE_REMOTE_CONFIG);
+	case_rtn_string(MLX5_EVENT_TYPE_DB_BF_CONGESTION);
+	case_rtn_string(MLX5_EVENT_TYPE_STALL_EVENT);
+	case_rtn_string(MLX5_EVENT_TYPE_CMD);
+	case_rtn_string(MLX5_EVENT_TYPE_PAGE_REQUEST);
+	case_rtn_string(MLX5_EVENT_TYPE_PAGE_FAULT);
+	case_rtn_string(MLX5_EVENT_TYPE_PPS_EVENT);
+	case_rtn_string(MLX5_EVENT_TYPE_FPGA_ERROR);
+	case_rtn_string(MLX5_EVENT_TYPE_NIC_VPORT_CHANGE);
 	default:
 		return "Unrecognized event";
 	}

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: [pull request][net-next 00/15] Mellanox mlx5 updates and cleanups 2017-06-16
  2017-06-15 21:42 [pull request][net-next 00/15] Mellanox mlx5 updates and cleanups 2017-06-16 Saeed Mahameed
                   ` (14 preceding siblings ...)
  2017-06-15 21:42 ` [net-next 15/15] net/mlx5: Add fast unload support in shutdown flow Saeed Mahameed
@ 2017-06-16 19:25 ` David Miller
  15 siblings, 0 replies; 21+ messages in thread
From: David Miller @ 2017-06-16 19:25 UTC (permalink / raw)
  To: saeedm; +Cc: netdev

From: Saeed Mahameed <saeedm@mellanox.com>
Date: Fri, 16 Jun 2017 00:42:37 +0300

> This series provides updates and cleanups to mlx5 driver.
> 
> For more details please see tag log below.
> 
> Please pull and let me know if there's any problem.
> *This series doesn't introduce any conflict with the ongoing net
> pull request.

Pulled, thank you.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* RE: [net-next 11/15] net/mlx5e: Reduce number of heap allocated buffers for update stats
  2017-06-15 21:42 ` [net-next 11/15] net/mlx5e: Reduce number of heap allocated buffers for update stats Saeed Mahameed
@ 2017-06-20 12:36   ` David Laight
  2017-06-21  8:12     ` Gal Pressman
  0 siblings, 1 reply; 21+ messages in thread
From: David Laight @ 2017-06-20 12:36 UTC (permalink / raw)
  To: 'Saeed Mahameed', David S. Miller
  Cc: netdev, Gal Pressman, kernel-team

From: Saeed Mahameed
> Sent: 15 June 2017 22:43
> Allocating buffers on the heap every 200ms is something we should avoid,
> let's use buffers located on the stack instead.
...
> +	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};

How big is that?

Allocating large on-stack buffers is even worse.

One kzalloc() every 200ms isn't going to be noticeable.

	David

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [net-next 11/15] net/mlx5e: Reduce number of heap allocated buffers for update stats
  2017-06-20 12:36   ` David Laight
@ 2017-06-21  8:12     ` Gal Pressman
  0 siblings, 0 replies; 21+ messages in thread
From: Gal Pressman @ 2017-06-21  8:12 UTC (permalink / raw)
  To: David Laight, 'Saeed Mahameed', David S. Miller
  Cc: netdev, kernel-team


>> +	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
> How big is that?
>
> Allocating large on-stack buffers is even worse.
Both PPCNT and MPCNT registers are 252 bytes.
I don't see a problem allocating them on the stack.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [net-next 01/15] net/mlx5: Update eqe_type_str() event names
  2017-06-15 23:49   ` Joe Perches
@ 2017-06-21  8:56     ` Saeed Mahameed
  0 siblings, 0 replies; 21+ messages in thread
From: Saeed Mahameed @ 2017-06-21  8:56 UTC (permalink / raw)
  To: Joe Perches, David S. Miller; +Cc: netdev, Eli Cohen



On 6/16/2017 2:49 AM, Joe Perches wrote:
> On Fri, 2017-06-16 at 00:42 +0300, Saeed Mahameed wrote:
>> From: Eli Cohen <eli@mellanox.com>
>>
>> Add missing NIC_VPORT_CHANGE event.
>>
>> Signed-off-by: Eli Cohen <eli@mellanox.com>
>> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
>> ---
>>  drivers/net/ethernet/mellanox/mlx5/core/eq.c | 2 ++
>>  1 file changed, 2 insertions(+)
>>
>> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eq.c b/drivers/net/ethernet/mellanox/mlx5/core/eq.c
>> index 0ed8e90ba54f..23048247d827 100644
>> --- a/drivers/net/ethernet/mellanox/mlx5/core/eq.c
>> +++ b/drivers/net/ethernet/mellanox/mlx5/core/eq.c
>> @@ -157,6 +157,8 @@ static const char *eqe_type_str(u8 type)
>>  		return "MLX5_EVENT_TYPE_PAGE_FAULT";
>>  	case MLX5_EVENT_TYPE_PPS_EVENT:
>>  		return "MLX5_EVENT_TYPE_PPS_EVENT";
>> +	case MLX5_EVENT_TYPE_NIC_VPORT_CHANGE:
>> +		return "MLX5_EVENT_TYPE_NIC_VPORT_CHANGE";
>>  	case MLX5_EVENT_TYPE_FPGA_ERROR:
>>  		return "MLX5_EVENT_TYPE_FPGA_ERROR";
>>  	default:
>
> Maybe one day convert this to use a macro
> to reduce the case/string duplication.
>
> Maybe what ath9k uses:
> ---
>  drivers/net/ethernet/mellanox/mlx5/core/eq.c | 74 ++++++++++------------------
>  1 file changed, 26 insertions(+), 48 deletions(-)
>
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eq.c b/drivers/net/ethernet/mellanox/mlx5/core/eq.c
> index 0ed8e90ba54f..3e79de07c3ee 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/eq.c
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/eq.c
> @@ -110,55 +110,33 @@ static struct mlx5_eqe *next_eqe_sw(struct mlx5_eq *eq)
>
>  static const char *eqe_type_str(u8 type)
>  {
> +#define case_rtn_string(val) case val: return #val
>  	switch (type) {
> -	case MLX5_EVENT_TYPE_COMP:
> -		return "MLX5_EVENT_TYPE_COMP";
> -	case MLX5_EVENT_TYPE_PATH_MIG:
> -		return "MLX5_EVENT_TYPE_PATH_MIG";
> -	case MLX5_EVENT_TYPE_COMM_EST:
> -		return "MLX5_EVENT_TYPE_COMM_EST";
> -	case MLX5_EVENT_TYPE_SQ_DRAINED:
> -		return "MLX5_EVENT_TYPE_SQ_DRAINED";
> -	case MLX5_EVENT_TYPE_SRQ_LAST_WQE:
> -		return "MLX5_EVENT_TYPE_SRQ_LAST_WQE";
> -	case MLX5_EVENT_TYPE_SRQ_RQ_LIMIT:
> -		return "MLX5_EVENT_TYPE_SRQ_RQ_LIMIT";
> -	case MLX5_EVENT_TYPE_CQ_ERROR:
> -		return "MLX5_EVENT_TYPE_CQ_ERROR";
> -	case MLX5_EVENT_TYPE_WQ_CATAS_ERROR:
> -		return "MLX5_EVENT_TYPE_WQ_CATAS_ERROR";
> -	case MLX5_EVENT_TYPE_PATH_MIG_FAILED:
> -		return "MLX5_EVENT_TYPE_PATH_MIG_FAILED";
> -	case MLX5_EVENT_TYPE_WQ_INVAL_REQ_ERROR:
> -		return "MLX5_EVENT_TYPE_WQ_INVAL_REQ_ERROR";
> -	case MLX5_EVENT_TYPE_WQ_ACCESS_ERROR:
> -		return "MLX5_EVENT_TYPE_WQ_ACCESS_ERROR";
> -	case MLX5_EVENT_TYPE_SRQ_CATAS_ERROR:
> -		return "MLX5_EVENT_TYPE_SRQ_CATAS_ERROR";
> -	case MLX5_EVENT_TYPE_INTERNAL_ERROR:
> -		return "MLX5_EVENT_TYPE_INTERNAL_ERROR";
> -	case MLX5_EVENT_TYPE_PORT_CHANGE:
> -		return "MLX5_EVENT_TYPE_PORT_CHANGE";
> -	case MLX5_EVENT_TYPE_GPIO_EVENT:
> -		return "MLX5_EVENT_TYPE_GPIO_EVENT";
> -	case MLX5_EVENT_TYPE_PORT_MODULE_EVENT:
> -		return "MLX5_EVENT_TYPE_PORT_MODULE_EVENT";
> -	case MLX5_EVENT_TYPE_REMOTE_CONFIG:
> -		return "MLX5_EVENT_TYPE_REMOTE_CONFIG";
> -	case MLX5_EVENT_TYPE_DB_BF_CONGESTION:
> -		return "MLX5_EVENT_TYPE_DB_BF_CONGESTION";
> -	case MLX5_EVENT_TYPE_STALL_EVENT:
> -		return "MLX5_EVENT_TYPE_STALL_EVENT";
> -	case MLX5_EVENT_TYPE_CMD:
> -		return "MLX5_EVENT_TYPE_CMD";
> -	case MLX5_EVENT_TYPE_PAGE_REQUEST:
> -		return "MLX5_EVENT_TYPE_PAGE_REQUEST";
> -	case MLX5_EVENT_TYPE_PAGE_FAULT:
> -		return "MLX5_EVENT_TYPE_PAGE_FAULT";
> -	case MLX5_EVENT_TYPE_PPS_EVENT:
> -		return "MLX5_EVENT_TYPE_PPS_EVENT";
> -	case MLX5_EVENT_TYPE_FPGA_ERROR:
> -		return "MLX5_EVENT_TYPE_FPGA_ERROR";
> +	case_rtn_string(MLX5_EVENT_TYPE_COMP);
> +	case_rtn_string(MLX5_EVENT_TYPE_PATH_MIG);
> +	case_rtn_string(MLX5_EVENT_TYPE_COMM_EST);
> +	case_rtn_string(MLX5_EVENT_TYPE_SQ_DRAINED);
> +	case_rtn_string(MLX5_EVENT_TYPE_SRQ_LAST_WQE);
> +	case_rtn_string(MLX5_EVENT_TYPE_SRQ_RQ_LIMIT);
> +	case_rtn_string(MLX5_EVENT_TYPE_CQ_ERROR);
> +	case_rtn_string(MLX5_EVENT_TYPE_WQ_CATAS_ERROR);
> +	case_rtn_string(MLX5_EVENT_TYPE_PATH_MIG_FAILED);
> +	case_rtn_string(MLX5_EVENT_TYPE_WQ_INVAL_REQ_ERROR);
> +	case_rtn_string(MLX5_EVENT_TYPE_WQ_ACCESS_ERROR);
> +	case_rtn_string(MLX5_EVENT_TYPE_SRQ_CATAS_ERROR);
> +	case_rtn_string(MLX5_EVENT_TYPE_INTERNAL_ERROR);
> +	case_rtn_string(MLX5_EVENT_TYPE_PORT_CHANGE);
> +	case_rtn_string(MLX5_EVENT_TYPE_GPIO_EVENT);
> +	case_rtn_string(MLX5_EVENT_TYPE_PORT_MODULE_EVENT);
> +	case_rtn_string(MLX5_EVENT_TYPE_REMOTE_CONFIG);
> +	case_rtn_string(MLX5_EVENT_TYPE_DB_BF_CONGESTION);
> +	case_rtn_string(MLX5_EVENT_TYPE_STALL_EVENT);
> +	case_rtn_string(MLX5_EVENT_TYPE_CMD);
> +	case_rtn_string(MLX5_EVENT_TYPE_PAGE_REQUEST);
> +	case_rtn_string(MLX5_EVENT_TYPE_PAGE_FAULT);
> +	case_rtn_string(MLX5_EVENT_TYPE_PPS_EVENT);
> +	case_rtn_string(MLX5_EVENT_TYPE_FPGA_ERROR);
> +	case_rtn_string(MLX5_EVENT_TYPE_NIC_VPORT_CHANGE);

Good Idea,

Will do it.

Thanks Joe.

^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2017-06-21  8:56 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-06-15 21:42 [pull request][net-next 00/15] Mellanox mlx5 updates and cleanups 2017-06-16 Saeed Mahameed
2017-06-15 21:42 ` [net-next 01/15] net/mlx5: Update eqe_type_str() event names Saeed Mahameed
2017-06-15 23:49   ` Joe Perches
2017-06-21  8:56     ` Saeed Mahameed
2017-06-15 21:42 ` [net-next 02/15] net/mlx5: Fix some spelling mistakes Saeed Mahameed
2017-06-15 21:42 ` [net-next 03/15] net/mlx5: Avoid using multiple blank lines Saeed Mahameed
2017-06-15 21:42 ` [net-next 04/15] net/mlx5: Avoid blank lines before/after closing/opening braces Saeed Mahameed
2017-06-15 21:42 ` [net-next 05/15] net/mlx5: Align to match opening parenthesis Saeed Mahameed
2017-06-15 21:42 ` [net-next 06/15] net/mlx5: Avoid space after casting Saeed Mahameed
2017-06-15 21:42 ` [net-next 07/15] net/mlx5: Undo LAG upon request to create virtual functions Saeed Mahameed
2017-06-15 21:42 ` [net-next 08/15] net/mlx5e: Use function to map aRFS into traffic type Saeed Mahameed
2017-06-15 21:42 ` [net-next 09/15] net/mlx5e: Fix typo in warning if CQ moderation is not supported Saeed Mahameed
2017-06-15 21:42 ` [net-next 10/15] net/mlx5e: Rename physical symbol errors counter Saeed Mahameed
2017-06-15 21:42 ` [net-next 11/15] net/mlx5e: Reduce number of heap allocated buffers for update stats Saeed Mahameed
2017-06-20 12:36   ` David Laight
2017-06-21  8:12     ` Gal Pressman
2017-06-15 21:42 ` [net-next 12/15] net/mlx5e: Move and optimize query out of buffer function Saeed Mahameed
2017-06-15 21:42 ` [net-next 13/15] net/mlx5e: Optimize update stats work Saeed Mahameed
2017-06-15 21:42 ` [net-next 14/15] net/mlx5: Expose command polling interface Saeed Mahameed
2017-06-15 21:42 ` [net-next 15/15] net/mlx5: Add fast unload support in shutdown flow Saeed Mahameed
2017-06-16 19:25 ` [pull request][net-next 00/15] Mellanox mlx5 updates and cleanups 2017-06-16 David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).