]> Git Repo - linux.git/commitdiff
net/mlx5: fs, allow flow table creation with a UID
authorMark Bloch <[email protected]>
Sun, 3 Jul 2022 20:54:05 +0000 (13:54 -0700)
committerSaeed Mahameed <[email protected]>
Sun, 17 Jul 2022 18:54:14 +0000 (11:54 -0700)
Add UID field to flow table attributes to allow creating flow tables
with a non default (zero) uid.

Signed-off-by: Mark Bloch <[email protected]>
Reviewed-by: Alex Vesker <[email protected]>
Signed-off-by: Saeed Mahameed <[email protected]>
drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c
drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.h
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_cmd.c
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_table.c
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h
drivers/net/ethernet/mellanox/mlx5/core/steering/fs_dr.c
drivers/net/ethernet/mellanox/mlx5/core/steering/mlx5dr.h
include/linux/mlx5/fs.h

index 735dc805dad7dce55faa9fd8a3d243a87c9f88b1..e735e19461bab60ca799cae788fe6d931a406e29 100644 (file)
@@ -50,10 +50,12 @@ static int mlx5_cmd_stub_update_root_ft(struct mlx5_flow_root_namespace *ns,
 
 static int mlx5_cmd_stub_create_flow_table(struct mlx5_flow_root_namespace *ns,
                                           struct mlx5_flow_table *ft,
-                                          unsigned int size,
+                                          struct mlx5_flow_table_attr *ft_attr,
                                           struct mlx5_flow_table *next_ft)
 {
-       ft->max_fte = size ? roundup_pow_of_two(size) : 1;
+       int max_fte = ft_attr->max_fte;
+
+       ft->max_fte = max_fte ? roundup_pow_of_two(max_fte) : 1;
 
        return 0;
 }
@@ -258,7 +260,7 @@ static int mlx5_cmd_update_root_ft(struct mlx5_flow_root_namespace *ns,
 
 static int mlx5_cmd_create_flow_table(struct mlx5_flow_root_namespace *ns,
                                      struct mlx5_flow_table *ft,
-                                     unsigned int size,
+                                     struct mlx5_flow_table_attr *ft_attr,
                                      struct mlx5_flow_table *next_ft)
 {
        int en_encap = !!(ft->flags & MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT);
@@ -267,17 +269,19 @@ static int mlx5_cmd_create_flow_table(struct mlx5_flow_root_namespace *ns,
        u32 out[MLX5_ST_SZ_DW(create_flow_table_out)] = {};
        u32 in[MLX5_ST_SZ_DW(create_flow_table_in)] = {};
        struct mlx5_core_dev *dev = ns->dev;
+       unsigned int size;
        int err;
 
-       if (size != POOL_NEXT_SIZE)
-               size = roundup_pow_of_two(size);
-       size = mlx5_ft_pool_get_avail_sz(dev, ft->type, size);
+       if (ft_attr->max_fte != POOL_NEXT_SIZE)
+               size = roundup_pow_of_two(ft_attr->max_fte);
+       size = mlx5_ft_pool_get_avail_sz(dev, ft->type, ft_attr->max_fte);
        if (!size)
                return -ENOSPC;
 
        MLX5_SET(create_flow_table_in, in, opcode,
                 MLX5_CMD_OP_CREATE_FLOW_TABLE);
 
+       MLX5_SET(create_flow_table_in, in, uid, ft_attr->uid);
        MLX5_SET(create_flow_table_in, in, table_type, ft->type);
        MLX5_SET(create_flow_table_in, in, flow_table_context.level, ft->level);
        MLX5_SET(create_flow_table_in, in, flow_table_context.log_size, size ? ilog2(size) : 0);
index 274004e80f03121be259a991de5d040f01091e9e..8ef4254b9ea126e13a9052d6d36c561a33962898 100644 (file)
@@ -38,7 +38,7 @@
 struct mlx5_flow_cmds {
        int (*create_flow_table)(struct mlx5_flow_root_namespace *ns,
                                 struct mlx5_flow_table *ft,
-                                unsigned int size,
+                                struct mlx5_flow_table_attr *ft_attr,
                                 struct mlx5_flow_table *next_ft);
        int (*destroy_flow_table)(struct mlx5_flow_root_namespace *ns,
                                  struct mlx5_flow_table *ft);
index 1da3dc7c95fa57c3e171aa76632a8dfb462bca6f..35d89edb1bcd68f5695e1f8b5b3589cdf68c799b 100644 (file)
@@ -1155,7 +1155,7 @@ static struct mlx5_flow_table *__mlx5_create_flow_table(struct mlx5_flow_namespa
                              find_next_chained_ft(fs_prio);
        ft->def_miss_action = ns->def_miss_action;
        ft->ns = ns;
-       err = root->cmds->create_flow_table(root, ft, ft_attr->max_fte, next_ft);
+       err = root->cmds->create_flow_table(root, ft, ft_attr, next_ft);
        if (err)
                goto free_ft;
 
index 223c8741b7ae56c4147067c6d6b458c58328ab6b..16d65fe4f654ac7bb035b3afc8ce0fc736470261 100644 (file)
@@ -439,6 +439,7 @@ int mlx5dr_cmd_create_flow_table(struct mlx5_core_dev *mdev,
 
        MLX5_SET(create_flow_table_in, in, opcode, MLX5_CMD_OP_CREATE_FLOW_TABLE);
        MLX5_SET(create_flow_table_in, in, table_type, attr->table_type);
+       MLX5_SET(create_flow_table_in, in, uid, attr->uid);
 
        ft_mdev = MLX5_ADDR_OF(create_flow_table_in, in, flow_table_context);
        MLX5_SET(flow_table_context, ft_mdev, termination_table, attr->term_tbl);
index e5f6412baea92f310d80eca5604ec42400f7f4dd..31d443dd838622fc9d7dd5ea56483d1bd018ea7b 100644 (file)
@@ -214,7 +214,7 @@ static int dr_table_destroy_sw_owned_tbl(struct mlx5dr_table *tbl)
                                             tbl->table_type);
 }
 
-static int dr_table_create_sw_owned_tbl(struct mlx5dr_table *tbl)
+static int dr_table_create_sw_owned_tbl(struct mlx5dr_table *tbl, u16 uid)
 {
        bool en_encap = !!(tbl->flags & MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT);
        bool en_decap = !!(tbl->flags & MLX5_FLOW_TABLE_TUNNEL_EN_DECAP);
@@ -236,6 +236,7 @@ static int dr_table_create_sw_owned_tbl(struct mlx5dr_table *tbl)
        ft_attr.sw_owner = true;
        ft_attr.decap_en = en_decap;
        ft_attr.reformat_en = en_encap;
+       ft_attr.uid = uid;
 
        ret = mlx5dr_cmd_create_flow_table(tbl->dmn->mdev, &ft_attr,
                                           NULL, &tbl->table_id);
@@ -243,7 +244,8 @@ static int dr_table_create_sw_owned_tbl(struct mlx5dr_table *tbl)
        return ret;
 }
 
-struct mlx5dr_table *mlx5dr_table_create(struct mlx5dr_domain *dmn, u32 level, u32 flags)
+struct mlx5dr_table *mlx5dr_table_create(struct mlx5dr_domain *dmn, u32 level,
+                                        u32 flags, u16 uid)
 {
        struct mlx5dr_table *tbl;
        int ret;
@@ -263,7 +265,7 @@ struct mlx5dr_table *mlx5dr_table_create(struct mlx5dr_domain *dmn, u32 level, u
        if (ret)
                goto free_tbl;
 
-       ret = dr_table_create_sw_owned_tbl(tbl);
+       ret = dr_table_create_sw_owned_tbl(tbl, uid);
        if (ret)
                goto uninit_tbl;
 
index 98320e3945adb3028b4ccb9cb379b6b0097ba577..50b0dd4fb4a902288c3ae90c804890f2c432100f 100644 (file)
@@ -1200,6 +1200,7 @@ struct mlx5dr_cmd_query_flow_table_details {
 
 struct mlx5dr_cmd_create_flow_table_attr {
        u32 table_type;
+       u16 uid;
        u64 icm_addr_rx;
        u64 icm_addr_tx;
        u8 level;
index 6a9abba92df6e236112072ee597ff69fb33fb954..c30ed8e18458891e095937492ed472552f65abb7 100644 (file)
@@ -62,7 +62,7 @@ static int set_miss_action(struct mlx5_flow_root_namespace *ns,
 
 static int mlx5_cmd_dr_create_flow_table(struct mlx5_flow_root_namespace *ns,
                                         struct mlx5_flow_table *ft,
-                                        unsigned int size,
+                                        struct mlx5_flow_table_attr *ft_attr,
                                         struct mlx5_flow_table *next_ft)
 {
        struct mlx5dr_table *tbl;
@@ -71,7 +71,7 @@ static int mlx5_cmd_dr_create_flow_table(struct mlx5_flow_root_namespace *ns,
 
        if (mlx5_dr_is_fw_table(ft->flags))
                return mlx5_fs_cmd_get_fw_cmds()->create_flow_table(ns, ft,
-                                                                   size,
+                                                                   ft_attr,
                                                                    next_ft);
        flags = ft->flags;
        /* turn off encap/decap if not supported for sw-str by fw */
@@ -79,7 +79,8 @@ static int mlx5_cmd_dr_create_flow_table(struct mlx5_flow_root_namespace *ns,
                flags = ft->flags & ~(MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT |
                                      MLX5_FLOW_TABLE_TUNNEL_EN_DECAP);
 
-       tbl = mlx5dr_table_create(ns->fs_dr_domain.dr_domain, ft->level, flags);
+       tbl = mlx5dr_table_create(ns->fs_dr_domain.dr_domain, ft->level, flags,
+                                 ft_attr->uid);
        if (!tbl) {
                mlx5_core_err(ns->dev, "Failed creating dr flow_table\n");
                return -EINVAL;
index 7626c85643b1f171d46f11a5b9d7f696fc847dd6..3bb14860b36dcb699a1440849cf6a6b2780aa1a0 100644 (file)
@@ -51,7 +51,8 @@ void mlx5dr_domain_set_peer(struct mlx5dr_domain *dmn,
                            struct mlx5dr_domain *peer_dmn);
 
 struct mlx5dr_table *
-mlx5dr_table_create(struct mlx5dr_domain *domain, u32 level, u32 flags);
+mlx5dr_table_create(struct mlx5dr_domain *domain, u32 level, u32 flags,
+                   u16 uid);
 
 struct mlx5dr_table *
 mlx5dr_table_get_from_fs_ft(struct mlx5_flow_table *ft);
index eee07d416b56933b63f81cef06c6ea90965d6e74..8e73c377da2c698d056a49273427e164f7a10bb1 100644 (file)
@@ -178,6 +178,7 @@ struct mlx5_flow_table_attr {
        int max_fte;
        u32 level;
        u32 flags;
+       u16 uid;
        struct mlx5_flow_table *next_ft;
 
        struct {
This page took 0.099209 seconds and 4 git commands to generate.