]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
net/mlx5: Refactor mlx5_esw_query_functions for modularity
authorParav Pandit <parav@mellanox.com>
Fri, 7 Jun 2019 12:16:58 +0000 (07:16 -0500)
committerSaeed Mahameed <saeedm@mellanox.com>
Wed, 3 Jul 2019 19:50:42 +0000 (12:50 -0700)
Functions change event output data size changes when functions other
than VFs will be enabled in HCA CAP.
With current API, multiple callers needs to align, calculate accurate
size of the output data depending on number on non VF functions enabled
in the device.
Instead of duplicating such math at multiple places, refactor
mlx5_esw_query_functions() to return raw output allocated by itself.

Caller must free the allocated memory using kvfree() as described in the
function comment section.
This hides calcuation within mlx5_esw_query_functions() and provides
simpler API.

Signed-off-by: Parav Pandit <parav@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
drivers/net/ethernet/mellanox/mlx5/core/sriov.c

index 9137a8390216d744f1756f34b4c6a5788153ab10..62954265b57c6b7e3790c830d2c454c4aabd088d 100644 (file)
@@ -1715,14 +1715,34 @@ static int eswitch_vport_event(struct notifier_block *nb,
        return NOTIFY_OK;
 }
 
-int mlx5_esw_query_functions(struct mlx5_core_dev *dev, u32 *out, int outlen)
+/**
+ * mlx5_esw_query_functions - Returns raw output about functions state
+ * @dev:       Pointer to device to query
+ *
+ * mlx5_esw_query_functions() allocates and returns functions changed
+ * raw output memory pointer from device on success. Otherwise returns ERR_PTR.
+ * Caller must free the memory using kvfree() when valid pointer is returned.
+ */
+const u32 *mlx5_esw_query_functions(struct mlx5_core_dev *dev)
 {
+       int outlen = MLX5_ST_SZ_BYTES(query_esw_functions_out);
        u32 in[MLX5_ST_SZ_DW(query_esw_functions_in)] = {};
+       u32 *out;
+       int err;
+
+       out = kvzalloc(outlen, GFP_KERNEL);
+       if (!out)
+               return ERR_PTR(-ENOMEM);
 
        MLX5_SET(query_esw_functions_in, in, opcode,
                 MLX5_CMD_OP_QUERY_ESW_FUNCTIONS);
 
-       return mlx5_cmd_exec(dev, in, sizeof(in), out, outlen);
+       err = mlx5_cmd_exec(dev, in, sizeof(in), out, outlen);
+       if (!err)
+               return out;
+
+       kvfree(out);
+       return ERR_PTR(err);
 }
 
 static void mlx5_eswitch_event_handlers_register(struct mlx5_eswitch *esw)
@@ -2527,8 +2547,7 @@ bool mlx5_esw_multipath_prereq(struct mlx5_core_dev *dev0,
 
 void mlx5_eswitch_update_num_of_vfs(struct mlx5_eswitch *esw, const int num_vfs)
 {
-       u32 out[MLX5_ST_SZ_DW(query_esw_functions_out)] = {};
-       int err;
+       const u32 *out;
 
        WARN_ON_ONCE(esw->mode != MLX5_ESWITCH_NONE);
 
@@ -2537,8 +2556,11 @@ void mlx5_eswitch_update_num_of_vfs(struct mlx5_eswitch *esw, const int num_vfs)
                return;
        }
 
-       err = mlx5_esw_query_functions(esw->dev, out, sizeof(out));
-       if (!err)
-               esw->esw_funcs.num_vfs = MLX5_GET(query_esw_functions_out, out,
-                                                 host_params_context.host_num_of_vfs);
+       out = mlx5_esw_query_functions(esw->dev);
+       if (IS_ERR(out))
+               return;
+
+       esw->esw_funcs.num_vfs = MLX5_GET(query_esw_functions_out, out,
+                                         host_params_context.host_num_of_vfs);
+       kvfree(out);
 }
index f59183440d7f4c76d22f8aaddbf08b51d8f24f51..d2d33a9893bb4e7e86ed9c6f041d70fbb286c58d 100644 (file)
@@ -403,7 +403,7 @@ bool mlx5_esw_lag_prereq(struct mlx5_core_dev *dev0,
 bool mlx5_esw_multipath_prereq(struct mlx5_core_dev *dev0,
                               struct mlx5_core_dev *dev1);
 
-int mlx5_esw_query_functions(struct mlx5_core_dev *dev, u32 *out, int outlen);
+const u32 *mlx5_esw_query_functions(struct mlx5_core_dev *dev);
 
 #define MLX5_DEBUG_ESWITCH_MASK BIT(3)
 
@@ -560,10 +560,9 @@ static inline int  mlx5_eswitch_enable(struct mlx5_eswitch *esw, int mode) { ret
 static inline void mlx5_eswitch_disable(struct mlx5_eswitch *esw) {}
 static inline bool mlx5_esw_lag_prereq(struct mlx5_core_dev *dev0, struct mlx5_core_dev *dev1) { return true; }
 static inline bool mlx5_eswitch_is_funcs_handler(struct mlx5_core_dev *dev) { return false; }
-static inline int
-mlx5_esw_query_functions(struct mlx5_core_dev *dev, u32 *out, int outlen)
+static inline const u32 *mlx5_esw_query_functions(struct mlx5_core_dev *dev)
 {
-       return -EOPNOTSUPP;
+       return ERR_PTR(-EOPNOTSUPP);
 }
 
 static inline void mlx5_eswitch_update_num_of_vfs(struct mlx5_eswitch *esw, const int num_vfs) {}
index 42c0db585561bfe9f1cf10236572300215c4c35b..74ab7bd264ed3b5be1c46a76b9c433ff3cc95d92 100644 (file)
@@ -2075,19 +2075,19 @@ esw_vfs_changed_event_handler(struct mlx5_eswitch *esw, const u32 *out)
 
 static void esw_functions_changed_event_handler(struct work_struct *work)
 {
-       u32 out[MLX5_ST_SZ_DW(query_esw_functions_out)] = {};
        struct mlx5_host_work *host_work;
        struct mlx5_eswitch *esw;
-       int err;
+       const u32 *out;
 
        host_work = container_of(work, struct mlx5_host_work, work);
        esw = host_work->esw;
 
-       err = mlx5_esw_query_functions(esw->dev, out, sizeof(out));
-       if (err)
+       out = mlx5_esw_query_functions(esw->dev);
+       if (IS_ERR(out))
                goto out;
 
        esw_vfs_changed_event_handler(esw, out);
+       kvfree(out);
 out:
        kfree(host_work);
 }
index 547d0be9025e96858ae81ba3e771918c0e6060c5..61fcfd8b39b4a1b0a4292284c94de9e669f0fd16 100644 (file)
@@ -197,22 +197,25 @@ void mlx5_sriov_detach(struct mlx5_core_dev *dev)
 
 static u16 mlx5_get_max_vfs(struct mlx5_core_dev *dev)
 {
-       u32 out[MLX5_ST_SZ_DW(query_esw_functions_out)] = {};
        u16 host_total_vfs;
-       int err;
+       const u32 *out;
 
        if (mlx5_core_is_ecpf_esw_manager(dev)) {
-               err = mlx5_esw_query_functions(dev, out, sizeof(out));
-               host_total_vfs = MLX5_GET(query_esw_functions_out, out,
-                                         host_params_context.host_total_vfs);
+               out = mlx5_esw_query_functions(dev);
 
                /* Old FW doesn't support getting total_vfs from esw func
                 * but supports getting it from pci_sriov.
                 */
-               if (!err && host_total_vfs)
+               if (IS_ERR(out))
+                       goto done;
+               host_total_vfs = MLX5_GET(query_esw_functions_out, out,
+                                         host_params_context.host_total_vfs);
+               kvfree(out);
+               if (host_total_vfs)
                        return host_total_vfs;
        }
 
+done:
        return pci_sriov_get_totalvfs(dev->pdev);
 }