diff options
Diffstat (limited to 'drivers/infiniband/hw/mlx4/main.c')
-rw-r--r-- | drivers/infiniband/hw/mlx4/main.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c index bda5994ceb68..8b72cf392b34 100644 --- a/drivers/infiniband/hw/mlx4/main.c +++ b/drivers/infiniband/hw/mlx4/main.c | |||
@@ -1173,18 +1173,24 @@ static struct ib_flow *mlx4_ib_create_flow(struct ib_qp *qp, | |||
1173 | err = __mlx4_ib_create_flow(qp, flow_attr, domain, type[i], | 1173 | err = __mlx4_ib_create_flow(qp, flow_attr, domain, type[i], |
1174 | &mflow->reg_id[i]); | 1174 | &mflow->reg_id[i]); |
1175 | if (err) | 1175 | if (err) |
1176 | goto err_free; | 1176 | goto err_create_flow; |
1177 | i++; | 1177 | i++; |
1178 | } | 1178 | } |
1179 | 1179 | ||
1180 | if (i < ARRAY_SIZE(type) && flow_attr->type == IB_FLOW_ATTR_NORMAL) { | 1180 | if (i < ARRAY_SIZE(type) && flow_attr->type == IB_FLOW_ATTR_NORMAL) { |
1181 | err = mlx4_ib_tunnel_steer_add(qp, flow_attr, &mflow->reg_id[i]); | 1181 | err = mlx4_ib_tunnel_steer_add(qp, flow_attr, &mflow->reg_id[i]); |
1182 | if (err) | 1182 | if (err) |
1183 | goto err_free; | 1183 | goto err_create_flow; |
1184 | i++; | ||
1184 | } | 1185 | } |
1185 | 1186 | ||
1186 | return &mflow->ibflow; | 1187 | return &mflow->ibflow; |
1187 | 1188 | ||
1189 | err_create_flow: | ||
1190 | while (i) { | ||
1191 | (void)__mlx4_ib_destroy_flow(to_mdev(qp->device)->dev, mflow->reg_id[i]); | ||
1192 | i--; | ||
1193 | } | ||
1188 | err_free: | 1194 | err_free: |
1189 | kfree(mflow); | 1195 | kfree(mflow); |
1190 | return ERR_PTR(err); | 1196 | return ERR_PTR(err); |