diff options
author | Or Gerlitz <ogerlitz@mellanox.com> | 2016-06-09 17:07:35 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-06-10 01:06:26 -0400 |
commit | 3f42ac6648723e906c1c10edc0c523aff29963cc (patch) | |
tree | d90a8909a9294f829523e63764c9caf29b1839cf /drivers/net/ethernet | |
parent | 3fe3d819d5015d56d0d7289ae16db5e612640c5b (diff) |
net/mlx5: E-Switch, Use the correct error check on returned pointers
The mlx5 flow-steering API (mlx5_create_flow_table/group/rule) never
returns null pointer on error. Even if it was doing that, checking
for IS_ERR_OR_NULL(p) and then returning PTR_ERR(p) would have cause
bugs, since PTR_ERR(NULL) --> success, crash.
To make things more robust and protect against related future bugs,
convert all IS_ERR_OR_NULL checks on returned values to IS_ERR.
Fixes: 5742df0f7dbe ('net/mlx5: E-Switch, Introduce VST vport ingress/egress ACLs')
Fixes: 86d722ad2c3b ('net/mlx5: Use flow steering infrastructure for mlx5_en')
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Reported-by: Ilya Lesokhin <ilyal@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet')
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/eswitch.c | 34 |
1 files changed, 17 insertions, 17 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c index 537479641c8e..a350af221d15 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c | |||
@@ -383,7 +383,7 @@ __esw_fdb_set_vport_rule(struct mlx5_eswitch *esw, u32 vport, bool rx_rule, | |||
383 | match_v, | 383 | match_v, |
384 | MLX5_FLOW_CONTEXT_ACTION_FWD_DEST, | 384 | MLX5_FLOW_CONTEXT_ACTION_FWD_DEST, |
385 | 0, &dest); | 385 | 0, &dest); |
386 | if (IS_ERR_OR_NULL(flow_rule)) { | 386 | if (IS_ERR(flow_rule)) { |
387 | pr_warn( | 387 | pr_warn( |
388 | "FDB: Failed to add flow rule: dmac_v(%pM) dmac_c(%pM) -> vport(%d), err(%ld)\n", | 388 | "FDB: Failed to add flow rule: dmac_v(%pM) dmac_c(%pM) -> vport(%d), err(%ld)\n", |
389 | dmac_v, dmac_c, vport, PTR_ERR(flow_rule)); | 389 | dmac_v, dmac_c, vport, PTR_ERR(flow_rule)); |
@@ -457,7 +457,7 @@ static int esw_create_fdb_table(struct mlx5_eswitch *esw, int nvports) | |||
457 | 457 | ||
458 | table_size = BIT(MLX5_CAP_ESW_FLOWTABLE_FDB(dev, log_max_ft_size)); | 458 | table_size = BIT(MLX5_CAP_ESW_FLOWTABLE_FDB(dev, log_max_ft_size)); |
459 | fdb = mlx5_create_flow_table(root_ns, 0, table_size, 0); | 459 | fdb = mlx5_create_flow_table(root_ns, 0, table_size, 0); |
460 | if (IS_ERR_OR_NULL(fdb)) { | 460 | if (IS_ERR(fdb)) { |
461 | err = PTR_ERR(fdb); | 461 | err = PTR_ERR(fdb); |
462 | esw_warn(dev, "Failed to create FDB Table err %d\n", err); | 462 | esw_warn(dev, "Failed to create FDB Table err %d\n", err); |
463 | goto out; | 463 | goto out; |
@@ -474,7 +474,7 @@ static int esw_create_fdb_table(struct mlx5_eswitch *esw, int nvports) | |||
474 | MLX5_SET(create_flow_group_in, flow_group_in, end_flow_index, table_size - 3); | 474 | MLX5_SET(create_flow_group_in, flow_group_in, end_flow_index, table_size - 3); |
475 | eth_broadcast_addr(dmac); | 475 | eth_broadcast_addr(dmac); |
476 | g = mlx5_create_flow_group(fdb, flow_group_in); | 476 | g = mlx5_create_flow_group(fdb, flow_group_in); |
477 | if (IS_ERR_OR_NULL(g)) { | 477 | if (IS_ERR(g)) { |
478 | err = PTR_ERR(g); | 478 | err = PTR_ERR(g); |
479 | esw_warn(dev, "Failed to create flow group err(%d)\n", err); | 479 | esw_warn(dev, "Failed to create flow group err(%d)\n", err); |
480 | goto out; | 480 | goto out; |
@@ -489,7 +489,7 @@ static int esw_create_fdb_table(struct mlx5_eswitch *esw, int nvports) | |||
489 | eth_zero_addr(dmac); | 489 | eth_zero_addr(dmac); |
490 | dmac[0] = 0x01; | 490 | dmac[0] = 0x01; |
491 | g = mlx5_create_flow_group(fdb, flow_group_in); | 491 | g = mlx5_create_flow_group(fdb, flow_group_in); |
492 | if (IS_ERR_OR_NULL(g)) { | 492 | if (IS_ERR(g)) { |
493 | err = PTR_ERR(g); | 493 | err = PTR_ERR(g); |
494 | esw_warn(dev, "Failed to create allmulti flow group err(%d)\n", err); | 494 | esw_warn(dev, "Failed to create allmulti flow group err(%d)\n", err); |
495 | goto out; | 495 | goto out; |
@@ -506,7 +506,7 @@ static int esw_create_fdb_table(struct mlx5_eswitch *esw, int nvports) | |||
506 | MLX5_SET(create_flow_group_in, flow_group_in, start_flow_index, table_size - 1); | 506 | MLX5_SET(create_flow_group_in, flow_group_in, start_flow_index, table_size - 1); |
507 | MLX5_SET(create_flow_group_in, flow_group_in, end_flow_index, table_size - 1); | 507 | MLX5_SET(create_flow_group_in, flow_group_in, end_flow_index, table_size - 1); |
508 | g = mlx5_create_flow_group(fdb, flow_group_in); | 508 | g = mlx5_create_flow_group(fdb, flow_group_in); |
509 | if (IS_ERR_OR_NULL(g)) { | 509 | if (IS_ERR(g)) { |
510 | err = PTR_ERR(g); | 510 | err = PTR_ERR(g); |
511 | esw_warn(dev, "Failed to create promisc flow group err(%d)\n", err); | 511 | esw_warn(dev, "Failed to create promisc flow group err(%d)\n", err); |
512 | goto out; | 512 | goto out; |
@@ -1060,7 +1060,7 @@ static void esw_vport_enable_egress_acl(struct mlx5_eswitch *esw, | |||
1060 | return; | 1060 | return; |
1061 | 1061 | ||
1062 | acl = mlx5_create_vport_flow_table(root_ns, 0, table_size, 0, vport->vport); | 1062 | acl = mlx5_create_vport_flow_table(root_ns, 0, table_size, 0, vport->vport); |
1063 | if (IS_ERR_OR_NULL(acl)) { | 1063 | if (IS_ERR(acl)) { |
1064 | err = PTR_ERR(acl); | 1064 | err = PTR_ERR(acl); |
1065 | esw_warn(dev, "Failed to create E-Switch vport[%d] egress flow Table, err(%d)\n", | 1065 | esw_warn(dev, "Failed to create E-Switch vport[%d] egress flow Table, err(%d)\n", |
1066 | vport->vport, err); | 1066 | vport->vport, err); |
@@ -1075,7 +1075,7 @@ static void esw_vport_enable_egress_acl(struct mlx5_eswitch *esw, | |||
1075 | MLX5_SET(create_flow_group_in, flow_group_in, end_flow_index, 0); | 1075 | MLX5_SET(create_flow_group_in, flow_group_in, end_flow_index, 0); |
1076 | 1076 | ||
1077 | vlan_grp = mlx5_create_flow_group(acl, flow_group_in); | 1077 | vlan_grp = mlx5_create_flow_group(acl, flow_group_in); |
1078 | if (IS_ERR_OR_NULL(vlan_grp)) { | 1078 | if (IS_ERR(vlan_grp)) { |
1079 | err = PTR_ERR(vlan_grp); | 1079 | err = PTR_ERR(vlan_grp); |
1080 | esw_warn(dev, "Failed to create E-Switch vport[%d] egress allowed vlans flow group, err(%d)\n", | 1080 | esw_warn(dev, "Failed to create E-Switch vport[%d] egress allowed vlans flow group, err(%d)\n", |
1081 | vport->vport, err); | 1081 | vport->vport, err); |
@@ -1086,7 +1086,7 @@ static void esw_vport_enable_egress_acl(struct mlx5_eswitch *esw, | |||
1086 | MLX5_SET(create_flow_group_in, flow_group_in, start_flow_index, 1); | 1086 | MLX5_SET(create_flow_group_in, flow_group_in, start_flow_index, 1); |
1087 | MLX5_SET(create_flow_group_in, flow_group_in, end_flow_index, 1); | 1087 | MLX5_SET(create_flow_group_in, flow_group_in, end_flow_index, 1); |
1088 | drop_grp = mlx5_create_flow_group(acl, flow_group_in); | 1088 | drop_grp = mlx5_create_flow_group(acl, flow_group_in); |
1089 | if (IS_ERR_OR_NULL(drop_grp)) { | 1089 | if (IS_ERR(drop_grp)) { |
1090 | err = PTR_ERR(drop_grp); | 1090 | err = PTR_ERR(drop_grp); |
1091 | esw_warn(dev, "Failed to create E-Switch vport[%d] egress drop flow group, err(%d)\n", | 1091 | esw_warn(dev, "Failed to create E-Switch vport[%d] egress drop flow group, err(%d)\n", |
1092 | vport->vport, err); | 1092 | vport->vport, err); |
@@ -1174,7 +1174,7 @@ static void esw_vport_enable_ingress_acl(struct mlx5_eswitch *esw, | |||
1174 | return; | 1174 | return; |
1175 | 1175 | ||
1176 | acl = mlx5_create_vport_flow_table(root_ns, 0, table_size, 0, vport->vport); | 1176 | acl = mlx5_create_vport_flow_table(root_ns, 0, table_size, 0, vport->vport); |
1177 | if (IS_ERR_OR_NULL(acl)) { | 1177 | if (IS_ERR(acl)) { |
1178 | err = PTR_ERR(acl); | 1178 | err = PTR_ERR(acl); |
1179 | esw_warn(dev, "Failed to create E-Switch vport[%d] ingress flow Table, err(%d)\n", | 1179 | esw_warn(dev, "Failed to create E-Switch vport[%d] ingress flow Table, err(%d)\n", |
1180 | vport->vport, err); | 1180 | vport->vport, err); |
@@ -1192,7 +1192,7 @@ static void esw_vport_enable_ingress_acl(struct mlx5_eswitch *esw, | |||
1192 | MLX5_SET(create_flow_group_in, flow_group_in, end_flow_index, 0); | 1192 | MLX5_SET(create_flow_group_in, flow_group_in, end_flow_index, 0); |
1193 | 1193 | ||
1194 | g = mlx5_create_flow_group(acl, flow_group_in); | 1194 | g = mlx5_create_flow_group(acl, flow_group_in); |
1195 | if (IS_ERR_OR_NULL(g)) { | 1195 | if (IS_ERR(g)) { |
1196 | err = PTR_ERR(g); | 1196 | err = PTR_ERR(g); |
1197 | esw_warn(dev, "Failed to create E-Switch vport[%d] ingress untagged spoofchk flow group, err(%d)\n", | 1197 | esw_warn(dev, "Failed to create E-Switch vport[%d] ingress untagged spoofchk flow group, err(%d)\n", |
1198 | vport->vport, err); | 1198 | vport->vport, err); |
@@ -1207,7 +1207,7 @@ static void esw_vport_enable_ingress_acl(struct mlx5_eswitch *esw, | |||
1207 | MLX5_SET(create_flow_group_in, flow_group_in, end_flow_index, 1); | 1207 | MLX5_SET(create_flow_group_in, flow_group_in, end_flow_index, 1); |
1208 | 1208 | ||
1209 | g = mlx5_create_flow_group(acl, flow_group_in); | 1209 | g = mlx5_create_flow_group(acl, flow_group_in); |
1210 | if (IS_ERR_OR_NULL(g)) { | 1210 | if (IS_ERR(g)) { |
1211 | err = PTR_ERR(g); | 1211 | err = PTR_ERR(g); |
1212 | esw_warn(dev, "Failed to create E-Switch vport[%d] ingress untagged flow group, err(%d)\n", | 1212 | esw_warn(dev, "Failed to create E-Switch vport[%d] ingress untagged flow group, err(%d)\n", |
1213 | vport->vport, err); | 1213 | vport->vport, err); |
@@ -1223,7 +1223,7 @@ static void esw_vport_enable_ingress_acl(struct mlx5_eswitch *esw, | |||
1223 | MLX5_SET(create_flow_group_in, flow_group_in, end_flow_index, 2); | 1223 | MLX5_SET(create_flow_group_in, flow_group_in, end_flow_index, 2); |
1224 | 1224 | ||
1225 | g = mlx5_create_flow_group(acl, flow_group_in); | 1225 | g = mlx5_create_flow_group(acl, flow_group_in); |
1226 | if (IS_ERR_OR_NULL(g)) { | 1226 | if (IS_ERR(g)) { |
1227 | err = PTR_ERR(g); | 1227 | err = PTR_ERR(g); |
1228 | esw_warn(dev, "Failed to create E-Switch vport[%d] ingress spoofchk flow group, err(%d)\n", | 1228 | esw_warn(dev, "Failed to create E-Switch vport[%d] ingress spoofchk flow group, err(%d)\n", |
1229 | vport->vport, err); | 1229 | vport->vport, err); |
@@ -1236,7 +1236,7 @@ static void esw_vport_enable_ingress_acl(struct mlx5_eswitch *esw, | |||
1236 | MLX5_SET(create_flow_group_in, flow_group_in, end_flow_index, 3); | 1236 | MLX5_SET(create_flow_group_in, flow_group_in, end_flow_index, 3); |
1237 | 1237 | ||
1238 | g = mlx5_create_flow_group(acl, flow_group_in); | 1238 | g = mlx5_create_flow_group(acl, flow_group_in); |
1239 | if (IS_ERR_OR_NULL(g)) { | 1239 | if (IS_ERR(g)) { |
1240 | err = PTR_ERR(g); | 1240 | err = PTR_ERR(g); |
1241 | esw_warn(dev, "Failed to create E-Switch vport[%d] ingress drop flow group, err(%d)\n", | 1241 | esw_warn(dev, "Failed to create E-Switch vport[%d] ingress drop flow group, err(%d)\n", |
1242 | vport->vport, err); | 1242 | vport->vport, err); |
@@ -1363,7 +1363,7 @@ static int esw_vport_ingress_config(struct mlx5_eswitch *esw, | |||
1363 | match_v, | 1363 | match_v, |
1364 | MLX5_FLOW_CONTEXT_ACTION_ALLOW, | 1364 | MLX5_FLOW_CONTEXT_ACTION_ALLOW, |
1365 | 0, NULL); | 1365 | 0, NULL); |
1366 | if (IS_ERR_OR_NULL(vport->ingress.allow_rule)) { | 1366 | if (IS_ERR(vport->ingress.allow_rule)) { |
1367 | err = PTR_ERR(vport->ingress.allow_rule); | 1367 | err = PTR_ERR(vport->ingress.allow_rule); |
1368 | pr_warn("vport[%d] configure ingress allow rule, err(%d)\n", | 1368 | pr_warn("vport[%d] configure ingress allow rule, err(%d)\n", |
1369 | vport->vport, err); | 1369 | vport->vport, err); |
@@ -1380,7 +1380,7 @@ static int esw_vport_ingress_config(struct mlx5_eswitch *esw, | |||
1380 | match_v, | 1380 | match_v, |
1381 | MLX5_FLOW_CONTEXT_ACTION_DROP, | 1381 | MLX5_FLOW_CONTEXT_ACTION_DROP, |
1382 | 0, NULL); | 1382 | 0, NULL); |
1383 | if (IS_ERR_OR_NULL(vport->ingress.drop_rule)) { | 1383 | if (IS_ERR(vport->ingress.drop_rule)) { |
1384 | err = PTR_ERR(vport->ingress.drop_rule); | 1384 | err = PTR_ERR(vport->ingress.drop_rule); |
1385 | pr_warn("vport[%d] configure ingress drop rule, err(%d)\n", | 1385 | pr_warn("vport[%d] configure ingress drop rule, err(%d)\n", |
1386 | vport->vport, err); | 1386 | vport->vport, err); |
@@ -1439,7 +1439,7 @@ static int esw_vport_egress_config(struct mlx5_eswitch *esw, | |||
1439 | match_v, | 1439 | match_v, |
1440 | MLX5_FLOW_CONTEXT_ACTION_ALLOW, | 1440 | MLX5_FLOW_CONTEXT_ACTION_ALLOW, |
1441 | 0, NULL); | 1441 | 0, NULL); |
1442 | if (IS_ERR_OR_NULL(vport->egress.allowed_vlan)) { | 1442 | if (IS_ERR(vport->egress.allowed_vlan)) { |
1443 | err = PTR_ERR(vport->egress.allowed_vlan); | 1443 | err = PTR_ERR(vport->egress.allowed_vlan); |
1444 | pr_warn("vport[%d] configure egress allowed vlan rule failed, err(%d)\n", | 1444 | pr_warn("vport[%d] configure egress allowed vlan rule failed, err(%d)\n", |
1445 | vport->vport, err); | 1445 | vport->vport, err); |
@@ -1457,7 +1457,7 @@ static int esw_vport_egress_config(struct mlx5_eswitch *esw, | |||
1457 | match_v, | 1457 | match_v, |
1458 | MLX5_FLOW_CONTEXT_ACTION_DROP, | 1458 | MLX5_FLOW_CONTEXT_ACTION_DROP, |
1459 | 0, NULL); | 1459 | 0, NULL); |
1460 | if (IS_ERR_OR_NULL(vport->egress.drop_rule)) { | 1460 | if (IS_ERR(vport->egress.drop_rule)) { |
1461 | err = PTR_ERR(vport->egress.drop_rule); | 1461 | err = PTR_ERR(vport->egress.drop_rule); |
1462 | pr_warn("vport[%d] configure egress drop rule failed, err(%d)\n", | 1462 | pr_warn("vport[%d] configure egress drop rule failed, err(%d)\n", |
1463 | vport->vport, err); | 1463 | vport->vport, err); |