net/mlx5: Pass flow steering objects to fs_cmd
authorMaor Gottlieb <maorg@mellanox.com>
Mon, 29 Apr 2019 18:14:10 +0000 (18:14 +0000)
committerSaeed Mahameed <saeedm@mellanox.com>
Mon, 29 Apr 2019 23:55:05 +0000 (16:55 -0700)
Pass the flow steering objects instead of their attributes
to fs_cmd in order to decrease number of arguments and in
addition it will be used to update object fields.
Pass the flow steering root namespace instead of the device
so will have context to the namespace in the fs_cmd layer.

Signed-off-by: Maor Gottlieb <maorg@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/fpga/ipsec.c
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

index 5a22c5874f3bc30789ffe5fade6ebda0d50ee2b3..52c47d3dd5a5432efbe1b1816a86c71cc8cb09cc 100644 (file)
@@ -989,32 +989,33 @@ static enum fs_flow_table_type egress_to_fs_ft(bool egress)
        return egress ? FS_FT_NIC_TX : FS_FT_NIC_RX;
 }
 
-static int fpga_ipsec_fs_create_flow_group(struct mlx5_core_dev *dev,
+static int fpga_ipsec_fs_create_flow_group(struct mlx5_flow_root_namespace *ns,
                                           struct mlx5_flow_table *ft,
                                           u32 *in,
-                                          unsigned int *group_id,
+                                          struct mlx5_flow_group *fg,
                                           bool is_egress)
 {
-       int (*create_flow_group)(struct mlx5_core_dev *dev,
+       int (*create_flow_group)(struct mlx5_flow_root_namespace *ns,
                                 struct mlx5_flow_table *ft, u32 *in,
-                                unsigned int *group_id) =
+                                struct mlx5_flow_group *fg) =
                mlx5_fs_cmd_get_default(egress_to_fs_ft(is_egress))->create_flow_group;
        char *misc_params_c = MLX5_ADDR_OF(create_flow_group_in, in,
                                           match_criteria.misc_parameters);
+       struct mlx5_core_dev *dev = ns->dev;
        u32 saved_outer_esp_spi_mask;
        u8 match_criteria_enable;
        int ret;
 
        if (MLX5_CAP_FLOWTABLE(dev,
                               flow_table_properties_nic_receive.ft_field_support.outer_esp_spi))
-               return create_flow_group(dev, ft, in, group_id);
+               return create_flow_group(ns, ft, in, fg);
 
        match_criteria_enable =
                MLX5_GET(create_flow_group_in, in, match_criteria_enable);
        saved_outer_esp_spi_mask =
                MLX5_GET(fte_match_set_misc, misc_params_c, outer_esp_spi);
        if (!match_criteria_enable || !saved_outer_esp_spi_mask)
-               return create_flow_group(dev, ft, in, group_id);
+               return create_flow_group(ns, ft, in, fg);
 
        MLX5_SET(fte_match_set_misc, misc_params_c, outer_esp_spi, 0);
 
@@ -1023,7 +1024,7 @@ static int fpga_ipsec_fs_create_flow_group(struct mlx5_core_dev *dev,
                MLX5_SET(create_flow_group_in, in, match_criteria_enable,
                         match_criteria_enable & ~MLX5_MATCH_MISC_PARAMETERS);
 
-       ret = create_flow_group(dev, ft, in, group_id);
+       ret = create_flow_group(ns, ft, in, fg);
 
        MLX5_SET(fte_match_set_misc, misc_params_c, outer_esp_spi, saved_outer_esp_spi_mask);
        MLX5_SET(create_flow_group_in, in, match_criteria_enable, match_criteria_enable);
@@ -1031,17 +1032,18 @@ static int fpga_ipsec_fs_create_flow_group(struct mlx5_core_dev *dev,
        return ret;
 }
 
-static int fpga_ipsec_fs_create_fte(struct mlx5_core_dev *dev,
+static int fpga_ipsec_fs_create_fte(struct mlx5_flow_root_namespace *ns,
                                    struct mlx5_flow_table *ft,
                                    struct mlx5_flow_group *fg,
                                    struct fs_fte *fte,
                                    bool is_egress)
 {
-       int (*create_fte)(struct mlx5_core_dev *dev,
+       int (*create_fte)(struct mlx5_flow_root_namespace *ns,
                          struct mlx5_flow_table *ft,
                          struct mlx5_flow_group *fg,
                          struct fs_fte *fte) =
                mlx5_fs_cmd_get_default(egress_to_fs_ft(is_egress))->create_fte;
+       struct mlx5_core_dev *dev = ns->dev;
        struct mlx5_fpga_device *fdev = dev->fpga;
        struct mlx5_fpga_ipsec *fipsec = fdev->ipsec;
        struct mlx5_fpga_ipsec_rule *rule;
@@ -1053,7 +1055,7 @@ static int fpga_ipsec_fs_create_fte(struct mlx5_core_dev *dev,
            !(fte->action.action &
              (MLX5_FLOW_CONTEXT_ACTION_ENCRYPT |
               MLX5_FLOW_CONTEXT_ACTION_DECRYPT)))
-               return create_fte(dev, ft, fg, fte);
+               return create_fte(ns, ft, fg, fte);
 
        rule = kzalloc(sizeof(*rule), GFP_KERNEL);
        if (!rule)
@@ -1070,7 +1072,7 @@ static int fpga_ipsec_fs_create_fte(struct mlx5_core_dev *dev,
        WARN_ON(rule_insert(fipsec, rule));
 
        modify_spec_mailbox(dev, fte, &mbox_mod);
-       ret = create_fte(dev, ft, fg, fte);
+       ret = create_fte(ns, ft, fg, fte);
        restore_spec_mailbox(fte, &mbox_mod);
        if (ret) {
                _rule_delete(fipsec, rule);
@@ -1081,19 +1083,20 @@ static int fpga_ipsec_fs_create_fte(struct mlx5_core_dev *dev,
        return ret;
 }
 
-static int fpga_ipsec_fs_update_fte(struct mlx5_core_dev *dev,
+static int fpga_ipsec_fs_update_fte(struct mlx5_flow_root_namespace *ns,
                                    struct mlx5_flow_table *ft,
-                                   unsigned int group_id,
+                                   struct mlx5_flow_group *fg,
                                    int modify_mask,
                                    struct fs_fte *fte,
                                    bool is_egress)
 {
-       int (*update_fte)(struct mlx5_core_dev *dev,
+       int (*update_fte)(struct mlx5_flow_root_namespace *ns,
                          struct mlx5_flow_table *ft,
-                         unsigned int group_id,
+                         struct mlx5_flow_group *fg,
                          int modify_mask,
                          struct fs_fte *fte) =
                mlx5_fs_cmd_get_default(egress_to_fs_ft(is_egress))->update_fte;
+       struct mlx5_core_dev *dev = ns->dev;
        bool is_esp = fte->action.esp_id;
        struct mailbox_mod mbox_mod;
        int ret;
@@ -1102,24 +1105,25 @@ static int fpga_ipsec_fs_update_fte(struct mlx5_core_dev *dev,
            !(fte->action.action &
              (MLX5_FLOW_CONTEXT_ACTION_ENCRYPT |
               MLX5_FLOW_CONTEXT_ACTION_DECRYPT)))
-               return update_fte(dev, ft, group_id, modify_mask, fte);
+               return update_fte(ns, ft, fg, modify_mask, fte);
 
        modify_spec_mailbox(dev, fte, &mbox_mod);
-       ret = update_fte(dev, ft, group_id, modify_mask, fte);
+       ret = update_fte(ns, ft, fg, modify_mask, fte);
        restore_spec_mailbox(fte, &mbox_mod);
 
        return ret;
 }
 
-static int fpga_ipsec_fs_delete_fte(struct mlx5_core_dev *dev,
+static int fpga_ipsec_fs_delete_fte(struct mlx5_flow_root_namespace *ns,
                                    struct mlx5_flow_table *ft,
                                    struct fs_fte *fte,
                                    bool is_egress)
 {
-       int (*delete_fte)(struct mlx5_core_dev *dev,
+       int (*delete_fte)(struct mlx5_flow_root_namespace *ns,
                          struct mlx5_flow_table *ft,
                          struct fs_fte *fte) =
                mlx5_fs_cmd_get_default(egress_to_fs_ft(is_egress))->delete_fte;
+       struct mlx5_core_dev *dev = ns->dev;
        struct mlx5_fpga_device *fdev = dev->fpga;
        struct mlx5_fpga_ipsec *fipsec = fdev->ipsec;
        struct mlx5_fpga_ipsec_rule *rule;
@@ -1131,7 +1135,7 @@ static int fpga_ipsec_fs_delete_fte(struct mlx5_core_dev *dev,
            !(fte->action.action &
              (MLX5_FLOW_CONTEXT_ACTION_ENCRYPT |
               MLX5_FLOW_CONTEXT_ACTION_DECRYPT)))
-               return delete_fte(dev, ft, fte);
+               return delete_fte(ns, ft, fte);
 
        rule = rule_search(fipsec, fte);
        if (!rule)
@@ -1141,84 +1145,84 @@ static int fpga_ipsec_fs_delete_fte(struct mlx5_core_dev *dev,
        rule_delete(fipsec, rule);
 
        modify_spec_mailbox(dev, fte, &mbox_mod);
-       ret = delete_fte(dev, ft, fte);
+       ret = delete_fte(ns, ft, fte);
        restore_spec_mailbox(fte, &mbox_mod);
 
        return ret;
 }
 
 static int
-mlx5_fpga_ipsec_fs_create_flow_group_egress(struct mlx5_core_dev *dev,
+mlx5_fpga_ipsec_fs_create_flow_group_egress(struct mlx5_flow_root_namespace *ns,
                                            struct mlx5_flow_table *ft,
                                            u32 *in,
-                                           unsigned int *group_id)
+                                           struct mlx5_flow_group *fg)
 {
-       return fpga_ipsec_fs_create_flow_group(dev, ft, in, group_id, true);
+       return fpga_ipsec_fs_create_flow_group(ns, ft, in, fg, true);
 }
 
 static int
-mlx5_fpga_ipsec_fs_create_fte_egress(struct mlx5_core_dev *dev,
+mlx5_fpga_ipsec_fs_create_fte_egress(struct mlx5_flow_root_namespace *ns,
                                     struct mlx5_flow_table *ft,
                                     struct mlx5_flow_group *fg,
                                     struct fs_fte *fte)
 {
-       return fpga_ipsec_fs_create_fte(dev, ft, fg, fte, true);
+       return fpga_ipsec_fs_create_fte(ns, ft, fg, fte, true);
 }
 
 static int
-mlx5_fpga_ipsec_fs_update_fte_egress(struct mlx5_core_dev *dev,
+mlx5_fpga_ipsec_fs_update_fte_egress(struct mlx5_flow_root_namespace *ns,
                                     struct mlx5_flow_table *ft,
-                                    unsigned int group_id,
+                                    struct mlx5_flow_group *fg,
                                     int modify_mask,
                                     struct fs_fte *fte)
 {
-       return fpga_ipsec_fs_update_fte(dev, ft, group_id, modify_mask, fte,
+       return fpga_ipsec_fs_update_fte(ns, ft, fg, modify_mask, fte,
                                        true);
 }
 
 static int
-mlx5_fpga_ipsec_fs_delete_fte_egress(struct mlx5_core_dev *dev,
+mlx5_fpga_ipsec_fs_delete_fte_egress(struct mlx5_flow_root_namespace *ns,
                                     struct mlx5_flow_table *ft,
                                     struct fs_fte *fte)
 {
-       return fpga_ipsec_fs_delete_fte(dev, ft, fte, true);
+       return fpga_ipsec_fs_delete_fte(ns, ft, fte, true);
 }
 
 static int
-mlx5_fpga_ipsec_fs_create_flow_group_ingress(struct mlx5_core_dev *dev,
+mlx5_fpga_ipsec_fs_create_flow_group_ingress(struct mlx5_flow_root_namespace *ns,
                                             struct mlx5_flow_table *ft,
                                             u32 *in,
-                                            unsigned int *group_id)
+                                            struct mlx5_flow_group *fg)
 {
-       return fpga_ipsec_fs_create_flow_group(dev, ft, in, group_id, false);
+       return fpga_ipsec_fs_create_flow_group(ns, ft, in, fg, false);
 }
 
 static int
-mlx5_fpga_ipsec_fs_create_fte_ingress(struct mlx5_core_dev *dev,
+mlx5_fpga_ipsec_fs_create_fte_ingress(struct mlx5_flow_root_namespace *ns,
                                      struct mlx5_flow_table *ft,
                                      struct mlx5_flow_group *fg,
                                      struct fs_fte *fte)
 {
-       return fpga_ipsec_fs_create_fte(dev, ft, fg, fte, false);
+       return fpga_ipsec_fs_create_fte(ns, ft, fg, fte, false);
 }
 
 static int
-mlx5_fpga_ipsec_fs_update_fte_ingress(struct mlx5_core_dev *dev,
+mlx5_fpga_ipsec_fs_update_fte_ingress(struct mlx5_flow_root_namespace *ns,
                                      struct mlx5_flow_table *ft,
-                                     unsigned int group_id,
+                                     struct mlx5_flow_group *fg,
                                      int modify_mask,
                                      struct fs_fte *fte)
 {
-       return fpga_ipsec_fs_update_fte(dev, ft, group_id, modify_mask, fte,
+       return fpga_ipsec_fs_update_fte(ns, ft, fg, modify_mask, fte,
                                        false);
 }
 
 static int
-mlx5_fpga_ipsec_fs_delete_fte_ingress(struct mlx5_core_dev *dev,
+mlx5_fpga_ipsec_fs_delete_fte_ingress(struct mlx5_flow_root_namespace *ns,
                                      struct mlx5_flow_table *ft,
                                      struct fs_fte *fte)
 {
-       return fpga_ipsec_fs_delete_fte(dev, ft, fte, false);
+       return fpga_ipsec_fs_delete_fte(ns, ft, fte, false);
 }
 
 static struct mlx5_flow_cmds fpga_ipsec_ingress;
index c44ccb67c4a36777b3d87ca00ba1fc6027689c85..e89555da485eee40e026ae52e16e5b849e17376b 100644 (file)
@@ -39,7 +39,7 @@
 #include "mlx5_core.h"
 #include "eswitch.h"
 
-static int mlx5_cmd_stub_update_root_ft(struct mlx5_core_dev *dev,
+static int mlx5_cmd_stub_update_root_ft(struct mlx5_flow_root_namespace *ns,
                                        struct mlx5_flow_table *ft,
                                        u32 underlay_qpn,
                                        bool disconnect)
@@ -47,47 +47,43 @@ static int mlx5_cmd_stub_update_root_ft(struct mlx5_core_dev *dev,
        return 0;
 }
 
-static int mlx5_cmd_stub_create_flow_table(struct mlx5_core_dev *dev,
-                                          u16 vport,
-                                          enum fs_flow_table_op_mod op_mod,
-                                          enum fs_flow_table_type type,
-                                          unsigned int level,
+static int mlx5_cmd_stub_create_flow_table(struct mlx5_flow_root_namespace *ns,
+                                          struct mlx5_flow_table *ft,
                                           unsigned int log_size,
-                                          struct mlx5_flow_table *next_ft,
-                                          unsigned int *table_id, u32 flags)
+                                          struct mlx5_flow_table *next_ft)
 {
        return 0;
 }
 
-static int mlx5_cmd_stub_destroy_flow_table(struct mlx5_core_dev *dev,
+static int mlx5_cmd_stub_destroy_flow_table(struct mlx5_flow_root_namespace *ns,
                                            struct mlx5_flow_table *ft)
 {
        return 0;
 }
 
-static int mlx5_cmd_stub_modify_flow_table(struct mlx5_core_dev *dev,
+static int mlx5_cmd_stub_modify_flow_table(struct mlx5_flow_root_namespace *ns,
                                           struct mlx5_flow_table *ft,
                                           struct mlx5_flow_table *next_ft)
 {
        return 0;
 }
 
-static int mlx5_cmd_stub_create_flow_group(struct mlx5_core_dev *dev,
+static int mlx5_cmd_stub_create_flow_group(struct mlx5_flow_root_namespace *ns,
                                           struct mlx5_flow_table *ft,
                                           u32 *in,
-                                          unsigned int *group_id)
+                                          struct mlx5_flow_group *fg)
 {
        return 0;
 }
 
-static int mlx5_cmd_stub_destroy_flow_group(struct mlx5_core_dev *dev,
+static int mlx5_cmd_stub_destroy_flow_group(struct mlx5_flow_root_namespace *ns,
                                            struct mlx5_flow_table *ft,
-                                           unsigned int group_id)
+                                           struct mlx5_flow_group *fg)
 {
        return 0;
 }
 
-static int mlx5_cmd_stub_create_fte(struct mlx5_core_dev *dev,
+static int mlx5_cmd_stub_create_fte(struct mlx5_flow_root_namespace *ns,
                                    struct mlx5_flow_table *ft,
                                    struct mlx5_flow_group *group,
                                    struct fs_fte *fte)
@@ -95,28 +91,29 @@ static int mlx5_cmd_stub_create_fte(struct mlx5_core_dev *dev,
        return 0;
 }
 
-static int mlx5_cmd_stub_update_fte(struct mlx5_core_dev *dev,
+static int mlx5_cmd_stub_update_fte(struct mlx5_flow_root_namespace *ns,
                                    struct mlx5_flow_table *ft,
-                                   unsigned int group_id,
+                                   struct mlx5_flow_group *group,
                                    int modify_mask,
                                    struct fs_fte *fte)
 {
        return -EOPNOTSUPP;
 }
 
-static int mlx5_cmd_stub_delete_fte(struct mlx5_core_dev *dev,
+static int mlx5_cmd_stub_delete_fte(struct mlx5_flow_root_namespace *ns,
                                    struct mlx5_flow_table *ft,
                                    struct fs_fte *fte)
 {
        return 0;
 }
 
-static int mlx5_cmd_update_root_ft(struct mlx5_core_dev *dev,
+static int mlx5_cmd_update_root_ft(struct mlx5_flow_root_namespace *ns,
                                   struct mlx5_flow_table *ft, u32 underlay_qpn,
                                   bool disconnect)
 {
        u32 in[MLX5_ST_SZ_DW(set_flow_table_root_in)]   = {0};
        u32 out[MLX5_ST_SZ_DW(set_flow_table_root_out)] = {0};
+       struct mlx5_core_dev *dev = ns->dev;
 
        if ((MLX5_CAP_GEN(dev, port_type) == MLX5_CAP_PORT_TYPE_IB) &&
            underlay_qpn == 0)
@@ -143,29 +140,26 @@ static int mlx5_cmd_update_root_ft(struct mlx5_core_dev *dev,
        return mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
 }
 
-static int mlx5_cmd_create_flow_table(struct mlx5_core_dev *dev,
-                                     u16 vport,
-                                     enum fs_flow_table_op_mod op_mod,
-                                     enum fs_flow_table_type type,
-                                     unsigned int level,
+static int mlx5_cmd_create_flow_table(struct mlx5_flow_root_namespace *ns,
+                                     struct mlx5_flow_table *ft,
                                      unsigned int log_size,
-                                     struct mlx5_flow_table *next_ft,
-                                     unsigned int *table_id, u32 flags)
+                                     struct mlx5_flow_table *next_ft)
 {
-       int en_encap = !!(flags & MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT);
-       int en_decap = !!(flags & MLX5_FLOW_TABLE_TUNNEL_EN_DECAP);
+       int en_encap = !!(ft->flags & MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT);
+       int en_decap = !!(ft->flags & MLX5_FLOW_TABLE_TUNNEL_EN_DECAP);
        u32 out[MLX5_ST_SZ_DW(create_flow_table_out)] = {0};
        u32 in[MLX5_ST_SZ_DW(create_flow_table_in)]   = {0};
+       struct mlx5_core_dev *dev = ns->dev;
        int err;
 
        MLX5_SET(create_flow_table_in, in, opcode,
                 MLX5_CMD_OP_CREATE_FLOW_TABLE);
 
-       MLX5_SET(create_flow_table_in, in, table_type, type);
-       MLX5_SET(create_flow_table_in, in, flow_table_context.level, level);
+       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, log_size);
-       if (vport) {
-               MLX5_SET(create_flow_table_in, in, vport_number, vport);
+       if (ft->vport) {
+               MLX5_SET(create_flow_table_in, in, vport_number, ft->vport);
                MLX5_SET(create_flow_table_in, in, other_vport, 1);
        }
 
@@ -174,7 +168,7 @@ static int mlx5_cmd_create_flow_table(struct mlx5_core_dev *dev,
        MLX5_SET(create_flow_table_in, in, flow_table_context.reformat_en,
                 en_encap);
 
-       switch (op_mod) {
+       switch (ft->op_mod) {
        case FS_FT_OP_MOD_NORMAL:
                if (next_ft) {
                        MLX5_SET(create_flow_table_in, in,
@@ -195,16 +189,17 @@ static int mlx5_cmd_create_flow_table(struct mlx5_core_dev *dev,
 
        err = mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
        if (!err)
-               *table_id = MLX5_GET(create_flow_table_out, out,
-                                    table_id);
+               ft->id = MLX5_GET(create_flow_table_out, out,
+                                 table_id);
        return err;
 }
 
-static int mlx5_cmd_destroy_flow_table(struct mlx5_core_dev *dev,
+static int mlx5_cmd_destroy_flow_table(struct mlx5_flow_root_namespace *ns,
                                       struct mlx5_flow_table *ft)
 {
        u32 in[MLX5_ST_SZ_DW(destroy_flow_table_in)]   = {0};
        u32 out[MLX5_ST_SZ_DW(destroy_flow_table_out)] = {0};
+       struct mlx5_core_dev *dev = ns->dev;
 
        MLX5_SET(destroy_flow_table_in, in, opcode,
                 MLX5_CMD_OP_DESTROY_FLOW_TABLE);
@@ -218,12 +213,13 @@ static int mlx5_cmd_destroy_flow_table(struct mlx5_core_dev *dev,
        return mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
 }
 
-static int mlx5_cmd_modify_flow_table(struct mlx5_core_dev *dev,
+static int mlx5_cmd_modify_flow_table(struct mlx5_flow_root_namespace *ns,
                                      struct mlx5_flow_table *ft,
                                      struct mlx5_flow_table *next_ft)
 {
        u32 in[MLX5_ST_SZ_DW(modify_flow_table_in)]   = {0};
        u32 out[MLX5_ST_SZ_DW(modify_flow_table_out)] = {0};
+       struct mlx5_core_dev *dev = ns->dev;
 
        MLX5_SET(modify_flow_table_in, in, opcode,
                 MLX5_CMD_OP_MODIFY_FLOW_TABLE);
@@ -263,13 +259,14 @@ static int mlx5_cmd_modify_flow_table(struct mlx5_core_dev *dev,
        return mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
 }
 
-static int mlx5_cmd_create_flow_group(struct mlx5_core_dev *dev,
+static int mlx5_cmd_create_flow_group(struct mlx5_flow_root_namespace *ns,
                                      struct mlx5_flow_table *ft,
                                      u32 *in,
-                                     unsigned int *group_id)
+                                     struct mlx5_flow_group *fg)
 {
        u32 out[MLX5_ST_SZ_DW(create_flow_group_out)] = {0};
        int inlen = MLX5_ST_SZ_BYTES(create_flow_group_in);
+       struct mlx5_core_dev *dev = ns->dev;
        int err;
 
        MLX5_SET(create_flow_group_in, in, opcode,
@@ -283,23 +280,24 @@ static int mlx5_cmd_create_flow_group(struct mlx5_core_dev *dev,
 
        err = mlx5_cmd_exec(dev, in, inlen, out, sizeof(out));
        if (!err)
-               *group_id = MLX5_GET(create_flow_group_out, out,
-                                    group_id);
+               fg->id = MLX5_GET(create_flow_group_out, out,
+                                 group_id);
        return err;
 }
 
-static int mlx5_cmd_destroy_flow_group(struct mlx5_core_dev *dev,
+static int mlx5_cmd_destroy_flow_group(struct mlx5_flow_root_namespace *ns,
                                       struct mlx5_flow_table *ft,
-                                      unsigned int group_id)
+                                      struct mlx5_flow_group *fg)
 {
        u32 out[MLX5_ST_SZ_DW(destroy_flow_group_out)] = {0};
        u32 in[MLX5_ST_SZ_DW(destroy_flow_group_in)]   = {0};
+       struct mlx5_core_dev *dev = ns->dev;
 
        MLX5_SET(destroy_flow_group_in, in, opcode,
                 MLX5_CMD_OP_DESTROY_FLOW_GROUP);
        MLX5_SET(destroy_flow_group_in, in, table_type, ft->type);
        MLX5_SET(destroy_flow_group_in, in, table_id, ft->id);
-       MLX5_SET(destroy_flow_group_in, in, group_id, group_id);
+       MLX5_SET(destroy_flow_group_in, in, group_id, fg->id);
        if (ft->vport) {
                MLX5_SET(destroy_flow_group_in, in, vport_number, ft->vport);
                MLX5_SET(destroy_flow_group_in, in, other_vport, 1);
@@ -505,23 +503,25 @@ err_out:
        return err;
 }
 
-static int mlx5_cmd_create_fte(struct mlx5_core_dev *dev,
+static int mlx5_cmd_create_fte(struct mlx5_flow_root_namespace *ns,
                               struct mlx5_flow_table *ft,
                               struct mlx5_flow_group *group,
                               struct fs_fte *fte)
 {
+       struct mlx5_core_dev *dev = ns->dev;
        unsigned int group_id = group->id;
 
        return mlx5_cmd_set_fte(dev, 0, 0, ft, group_id, fte);
 }
 
-static int mlx5_cmd_update_fte(struct mlx5_core_dev *dev,
+static int mlx5_cmd_update_fte(struct mlx5_flow_root_namespace *ns,
                               struct mlx5_flow_table *ft,
-                              unsigned int group_id,
+                              struct mlx5_flow_group *fg,
                               int modify_mask,
                               struct fs_fte *fte)
 {
        int opmod;
+       struct mlx5_core_dev *dev = ns->dev;
        int atomic_mod_cap = MLX5_CAP_FLOWTABLE(dev,
                                                flow_table_properties_nic_receive.
                                                flow_modify_en);
@@ -529,15 +529,16 @@ static int mlx5_cmd_update_fte(struct mlx5_core_dev *dev,
                return -EOPNOTSUPP;
        opmod = 1;
 
-       return  mlx5_cmd_set_fte(dev, opmod, modify_mask, ft, group_id, fte);
+       return  mlx5_cmd_set_fte(dev, opmod, modify_mask, ft, fg->id, fte);
 }
 
-static int mlx5_cmd_delete_fte(struct mlx5_core_dev *dev,
+static int mlx5_cmd_delete_fte(struct mlx5_flow_root_namespace *ns,
                               struct mlx5_flow_table *ft,
                               struct fs_fte *fte)
 {
        u32 out[MLX5_ST_SZ_DW(delete_fte_out)] = {0};
        u32 in[MLX5_ST_SZ_DW(delete_fte_in)]   = {0};
+       struct mlx5_core_dev *dev = ns->dev;
 
        MLX5_SET(delete_fte_in, in, opcode, MLX5_CMD_OP_DELETE_FLOW_TABLE_ENTRY);
        MLX5_SET(delete_fte_in, in, table_type, ft->type);
index 6228ba7bfa1a90fc2cafed3a13128e83391c903c..e340f9af2f5a7525393a56a82062d6990f180361 100644 (file)
 #include "fs_core.h"
 
 struct mlx5_flow_cmds {
-       int (*create_flow_table)(struct mlx5_core_dev *dev,
-                                u16 vport,
-                                enum fs_flow_table_op_mod op_mod,
-                                enum fs_flow_table_type type,
-                                unsigned int level, unsigned int log_size,
-                                struct mlx5_flow_table *next_ft,
-                                unsigned int *table_id, u32 flags);
-       int (*destroy_flow_table)(struct mlx5_core_dev *dev,
+       int (*create_flow_table)(struct mlx5_flow_root_namespace *ns,
+                                struct mlx5_flow_table *ft,
+                                unsigned int log_size,
+                                struct mlx5_flow_table *next_ft);
+       int (*destroy_flow_table)(struct mlx5_flow_root_namespace *ns,
                                  struct mlx5_flow_table *ft);
 
-       int (*modify_flow_table)(struct mlx5_core_dev *dev,
+       int (*modify_flow_table)(struct mlx5_flow_root_namespace *ns,
                                 struct mlx5_flow_table *ft,
                                 struct mlx5_flow_table *next_ft);
 
-       int (*create_flow_group)(struct mlx5_core_dev *dev,
+       int (*create_flow_group)(struct mlx5_flow_root_namespace *ns,
                                 struct mlx5_flow_table *ft,
                                 u32 *in,
-                                unsigned int *group_id);
+                                struct mlx5_flow_group *fg);
 
-       int (*destroy_flow_group)(struct mlx5_core_dev *dev,
+       int (*destroy_flow_group)(struct mlx5_flow_root_namespace *ns,
                                  struct mlx5_flow_table *ft,
-                                 unsigned int group_id);
+                                 struct mlx5_flow_group *fg);
 
-       int (*create_fte)(struct mlx5_core_dev *dev,
+       int (*create_fte)(struct mlx5_flow_root_namespace *ns,
                          struct mlx5_flow_table *ft,
                          struct mlx5_flow_group *fg,
                          struct fs_fte *fte);
 
-       int (*update_fte)(struct mlx5_core_dev *dev,
+       int (*update_fte)(struct mlx5_flow_root_namespace *ns,
                          struct mlx5_flow_table *ft,
-                         unsigned int group_id,
+                         struct mlx5_flow_group *fg,
                          int modify_mask,
                          struct fs_fte *fte);
 
-       int (*delete_fte)(struct mlx5_core_dev *dev,
+       int (*delete_fte)(struct mlx5_flow_root_namespace *ns,
                          struct mlx5_flow_table *ft,
                          struct fs_fte *fte);
 
-       int (*update_root_ft)(struct mlx5_core_dev *dev,
+       int (*update_root_ft)(struct mlx5_flow_root_namespace *ns,
                              struct mlx5_flow_table *ft,
                              u32 underlay_qpn,
                              bool disconnect);
index 9fcef7e3b86d205c1b4977063e2795cddfba533e..6024df82173469c3290ec756a2cc394c949e15e3 100644 (file)
@@ -403,7 +403,7 @@ static void del_hw_flow_table(struct fs_node *node)
        trace_mlx5_fs_del_ft(ft);
 
        if (node->active) {
-               err = root->cmds->destroy_flow_table(dev, ft);
+               err = root->cmds->destroy_flow_table(root, ft);
                if (err)
                        mlx5_core_warn(dev, "flow steering can't destroy ft\n");
        }
@@ -435,7 +435,7 @@ static void modify_fte(struct fs_fte *fte)
        dev = get_dev(&fte->node);
 
        root = find_root(&ft->node);
-       err = root->cmds->update_fte(dev, ft, fg->id, fte->modify_mask, fte);
+       err = root->cmds->update_fte(root, ft, fg, fte->modify_mask, fte);
        if (err)
                mlx5_core_warn(dev,
                               "%s can't del rule fg id=%d fte_index=%d\n",
@@ -492,7 +492,7 @@ static void del_hw_fte(struct fs_node *node)
        dev = get_dev(&ft->node);
        root = find_root(&ft->node);
        if (node->active) {
-               err = root->cmds->delete_fte(dev, ft, fte);
+               err = root->cmds->delete_fte(root, ft, fte);
                if (err)
                        mlx5_core_warn(dev,
                                       "flow steering can't delete fte in index %d of flow group id %d\n",
@@ -532,7 +532,7 @@ static void del_hw_flow_group(struct fs_node *node)
        trace_mlx5_fs_del_fg(fg);
 
        root = find_root(&ft->node);
-       if (fg->node.active && root->cmds->destroy_flow_group(dev, ft, fg->id))
+       if (fg->node.active && root->cmds->destroy_flow_group(root, ft, fg))
                mlx5_core_warn(dev, "flow steering can't destroy fg %d of ft %d\n",
                               fg->id, ft->id);
 }
@@ -783,7 +783,7 @@ static int connect_fts_in_prio(struct mlx5_core_dev *dev,
 
        fs_for_each_ft(iter, prio) {
                i++;
-               err = root->cmds->modify_flow_table(dev, iter, ft);
+               err = root->cmds->modify_flow_table(root, iter, ft);
                if (err) {
                        mlx5_core_warn(dev, "Failed to modify flow table %d\n",
                                       iter->id);
@@ -831,11 +831,11 @@ static int update_root_ft_create(struct mlx5_flow_table *ft, struct fs_prio
        if (list_empty(&root->underlay_qpns)) {
                /* Don't set any QPN (zero) in case QPN list is empty */
                qpn = 0;
-               err = root->cmds->update_root_ft(root->dev, ft, qpn, false);
+               err = root->cmds->update_root_ft(root, ft, qpn, false);
        } else {
                list_for_each_entry(uqp, &root->underlay_qpns, list) {
                        qpn = uqp->qpn;
-                       err = root->cmds->update_root_ft(root->dev, ft,
+                       err = root->cmds->update_root_ft(root, ft,
                                                         qpn, false);
                        if (err)
                                break;
@@ -871,7 +871,7 @@ static int _mlx5_modify_rule_destination(struct mlx5_flow_rule *rule,
 
        memcpy(&rule->dest_attr, dest, sizeof(*dest));
        root = find_root(&ft->node);
-       err = root->cmds->update_fte(get_dev(&ft->node), ft, fg->id,
+       err = root->cmds->update_fte(root, ft, fg,
                                     modify_mask, fte);
        up_write_ref_node(&fte->node, false);
 
@@ -1013,9 +1013,7 @@ static struct mlx5_flow_table *__mlx5_create_flow_table(struct mlx5_flow_namespa
        tree_init_node(&ft->node, del_hw_flow_table, del_sw_flow_table);
        log_table_sz = ft->max_fte ? ilog2(ft->max_fte) : 0;
        next_ft = find_next_chained_ft(fs_prio);
-       err = root->cmds->create_flow_table(root->dev, ft->vport, ft->op_mod,
-                                           ft->type, ft->level, log_table_sz,
-                                           next_ft, &ft->id, ft->flags);
+       err = root->cmds->create_flow_table(root, ft, log_table_sz, next_ft);
        if (err)
                goto free_ft;
 
@@ -1032,7 +1030,7 @@ static struct mlx5_flow_table *__mlx5_create_flow_table(struct mlx5_flow_namespa
        trace_mlx5_fs_add_ft(ft);
        return ft;
 destroy_ft:
-       root->cmds->destroy_flow_table(root->dev, ft);
+       root->cmds->destroy_flow_table(root, ft);
 free_ft:
        kfree(ft);
 unlock_root:
@@ -1114,7 +1112,6 @@ struct mlx5_flow_group *mlx5_create_flow_group(struct mlx5_flow_table *ft,
                                   start_flow_index);
        int end_index = MLX5_GET(create_flow_group_in, fg_in,
                                 end_flow_index);
-       struct mlx5_core_dev *dev = get_dev(&ft->node);
        struct mlx5_flow_group *fg;
        int err;
 
@@ -1129,7 +1126,7 @@ struct mlx5_flow_group *mlx5_create_flow_group(struct mlx5_flow_table *ft,
        if (IS_ERR(fg))
                return fg;
 
-       err = root->cmds->create_flow_group(dev, ft, fg_in, &fg->id);
+       err = root->cmds->create_flow_group(root, ft, fg_in, fg);
        if (err) {
                tree_put_node(&fg->node, false);
                return ERR_PTR(err);
@@ -1269,11 +1266,9 @@ add_rule_fte(struct fs_fte *fte,
        fs_get_obj(ft, fg->node.parent);
        root = find_root(&fg->node);
        if (!(fte->status & FS_FTE_STATUS_EXISTING))
-               err = root->cmds->create_fte(get_dev(&ft->node),
-                                            ft, fg, fte);
+               err = root->cmds->create_fte(root, ft, fg, fte);
        else
-               err = root->cmds->update_fte(get_dev(&ft->node), ft, fg->id,
-                                                    modify_mask, fte);
+               err = root->cmds->update_fte(root, ft, fg, modify_mask, fte);
        if (err)
                goto free_handle;
 
@@ -1339,7 +1334,6 @@ static int create_auto_flow_group(struct mlx5_flow_table *ft,
                                  struct mlx5_flow_group *fg)
 {
        struct mlx5_flow_root_namespace *root = find_root(&ft->node);
-       struct mlx5_core_dev *dev = get_dev(&ft->node);
        int inlen = MLX5_ST_SZ_BYTES(create_flow_group_in);
        void *match_criteria_addr;
        u8 src_esw_owner_mask_on;
@@ -1369,7 +1363,7 @@ static int create_auto_flow_group(struct mlx5_flow_table *ft,
        memcpy(match_criteria_addr, fg->mask.match_criteria,
               sizeof(fg->mask.match_criteria));
 
-       err = root->cmds->create_flow_group(dev, ft, in, &fg->id);
+       err = root->cmds->create_flow_group(root, ft, in, fg);
        if (!err) {
                fg->node.active = true;
                trace_mlx5_fs_add_fg(fg);
@@ -1941,12 +1935,12 @@ static int update_root_ft_destroy(struct mlx5_flow_table *ft)
        if (list_empty(&root->underlay_qpns)) {
                /* Don't set any QPN (zero) in case QPN list is empty */
                qpn = 0;
-               err = root->cmds->update_root_ft(root->dev, new_root_ft,
+               err = root->cmds->update_root_ft(root, new_root_ft,
                                                 qpn, false);
        } else {
                list_for_each_entry(uqp, &root->underlay_qpns, list) {
                        qpn = uqp->qpn;
-                       err = root->cmds->update_root_ft(root->dev,
+                       err = root->cmds->update_root_ft(root,
                                                         new_root_ft, qpn,
                                                         false);
                        if (err)
@@ -2762,7 +2756,7 @@ int mlx5_fs_add_rx_underlay_qpn(struct mlx5_core_dev *dev, u32 underlay_qpn)
                goto update_ft_fail;
        }
 
-       err = root->cmds->update_root_ft(dev, root->root_ft, underlay_qpn,
+       err = root->cmds->update_root_ft(root, root->root_ft, underlay_qpn,
                                         false);
        if (err) {
                mlx5_core_warn(dev, "Failed adding underlay QPN (%u) to root FT err(%d)\n",
@@ -2806,7 +2800,7 @@ int mlx5_fs_remove_rx_underlay_qpn(struct mlx5_core_dev *dev, u32 underlay_qpn)
                goto out;
        }
 
-       err = root->cmds->update_root_ft(dev, root->root_ft, underlay_qpn,
+       err = root->cmds->update_root_ft(root, root->root_ft, underlay_qpn,
                                         true);
        if (err)
                mlx5_core_warn(dev, "Failed removing underlay QPN (%u) from root FT err(%d)\n",