From: Dan Carpenter <dan.carpenter@oracle.com>
To: leon@kernel.org
Cc: linux-rdma@vger.kernel.org
Subject: [bug report] RDMA/mlx5: Drop crypto flow steering API
Date: Tue, 12 Apr 2022 10:10:08 +0300 [thread overview]
Message-ID: <20220412071008.GA3732@kili> (raw)
Hello Leon Romanovsky,
The patch de8bdb476908: "RDMA/mlx5: Drop crypto flow steering API"
from Apr 6, 2022, leads to the following Smatch static checker
warning:
drivers/infiniband/hw/mlx5/fs.c:1126 _create_flow_rule()
warn: duplicate check 'is_egress' (previous on line 1098)
drivers/infiniband/hw/mlx5/fs.c
1030 static struct mlx5_ib_flow_handler *_create_flow_rule(struct mlx5_ib_dev *dev,
1031 struct mlx5_ib_flow_prio *ft_prio,
1032 const struct ib_flow_attr *flow_attr,
1033 struct mlx5_flow_destination *dst,
1034 u32 underlay_qpn,
1035 struct mlx5_ib_create_flow *ucmd)
1036 {
1037 struct mlx5_flow_table *ft = ft_prio->flow_table;
1038 struct mlx5_ib_flow_handler *handler;
1039 struct mlx5_flow_act flow_act = {};
1040 struct mlx5_flow_spec *spec;
1041 struct mlx5_flow_destination dest_arr[2] = {};
1042 struct mlx5_flow_destination *rule_dst = dest_arr;
1043 const void *ib_flow = (const void *)flow_attr + sizeof(*flow_attr);
1044 unsigned int spec_index;
1045 u32 prev_type = 0;
1046 int err = 0;
1047 int dest_num = 0;
1048 bool is_egress = flow_attr->flags & IB_FLOW_ATTR_FLAGS_EGRESS;
1049
1050 if (!is_valid_attr(dev->mdev, flow_attr))
1051 return ERR_PTR(-EINVAL);
1052
1053 if (dev->is_rep && is_egress)
1054 return ERR_PTR(-EINVAL);
1055
1056 spec = kvzalloc(sizeof(*spec), GFP_KERNEL);
1057 handler = kzalloc(sizeof(*handler), GFP_KERNEL);
1058 if (!handler || !spec) {
1059 err = -ENOMEM;
1060 goto free;
1061 }
1062
1063 INIT_LIST_HEAD(&handler->list);
1064
1065 for (spec_index = 0; spec_index < flow_attr->num_of_specs; spec_index++) {
1066 err = parse_flow_attr(dev->mdev, spec,
1067 ib_flow, flow_attr, &flow_act,
1068 prev_type);
1069 if (err < 0)
1070 goto free;
1071
1072 prev_type = ((union ib_flow_spec *)ib_flow)->type;
1073 ib_flow += ((union ib_flow_spec *)ib_flow)->size;
1074 }
1075
1076 if (dst && !(flow_act.action & MLX5_FLOW_CONTEXT_ACTION_DROP)) {
1077 memcpy(&dest_arr[0], dst, sizeof(*dst));
1078 dest_num++;
1079 }
1080
1081 if (!flow_is_multicast_only(flow_attr))
1082 set_underlay_qp(dev, spec, underlay_qpn);
1083
1084 if (dev->is_rep && flow_attr->type != IB_FLOW_ATTR_SNIFFER) {
1085 struct mlx5_eswitch_rep *rep;
1086
1087 rep = dev->port[flow_attr->port - 1].rep;
1088 if (!rep) {
1089 err = -EINVAL;
1090 goto free;
1091 }
1092
1093 mlx5_ib_set_rule_source_port(dev, spec, rep);
1094 }
1095
1096 spec->match_criteria_enable = get_match_criteria_enable(spec->match_criteria);
1097
1098 if (is_egress) {
1099 err = -EINVAL;
1100 goto free;
The patch changed this check so we always return -EINVAL.
1101 }
1102
1103 if (flow_act.action & MLX5_FLOW_CONTEXT_ACTION_COUNT) {
1104 struct mlx5_ib_mcounters *mcounters;
1105
1106 err = mlx5_ib_flow_counters_set_data(flow_act.counters, ucmd);
1107 if (err)
1108 goto free;
1109
1110 mcounters = to_mcounters(flow_act.counters);
1111 handler->ibcounters = flow_act.counters;
1112 dest_arr[dest_num].type =
1113 MLX5_FLOW_DESTINATION_TYPE_COUNTER;
1114 dest_arr[dest_num].counter_id =
1115 mlx5_fc_id(mcounters->hw_cntrs_hndl);
1116 dest_num++;
1117 }
1118
1119 if (flow_act.action & MLX5_FLOW_CONTEXT_ACTION_DROP) {
1120 if (!dest_num)
1121 rule_dst = NULL;
1122 } else {
1123 if (flow_attr->flags & IB_FLOW_ATTR_FLAGS_DONT_TRAP)
1124 flow_act.action |=
1125 MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_PRIO;
--> 1126 if (is_egress)
^^^^^^^^^
No need to check
1127 flow_act.action |= MLX5_FLOW_CONTEXT_ACTION_ALLOW;
1128 else if (dest_num)
1129 flow_act.action |= MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
1130 }
1131
1132 if ((spec->flow_context.flags & FLOW_CONTEXT_HAS_TAG) &&
1133 (flow_attr->type == IB_FLOW_ATTR_ALL_DEFAULT ||
1134 flow_attr->type == IB_FLOW_ATTR_MC_DEFAULT)) {
1135 mlx5_ib_warn(dev, "Flow tag %u and attribute type %x isn't allowed in leftovers\n",
1136 spec->flow_context.flow_tag, flow_attr->type);
1137 err = -EINVAL;
1138 goto free;
1139 }
1140 handler->rule = mlx5_add_flow_rules(ft, spec,
1141 &flow_act,
1142 rule_dst, dest_num);
1143
1144 if (IS_ERR(handler->rule)) {
1145 err = PTR_ERR(handler->rule);
1146 goto free;
1147 }
1148
1149 ft_prio->refcount++;
1150 handler->prio = ft_prio;
1151 handler->dev = dev;
1152
1153 ft_prio->flow_table = ft;
1154 free:
1155 if (err && handler) {
1156 mlx5_ib_counters_clear_description(handler->ibcounters);
1157 kfree(handler);
1158 }
1159 kvfree(spec);
1160 return err ? ERR_PTR(err) : handler;
1161 }
regards,
dan carpenter
reply other threads:[~2022-04-12 9:58 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220412071008.GA3732@kili \
--to=dan.carpenter@oracle.com \
--cc=leon@kernel.org \
--cc=linux-rdma@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox