From: Dan Carpenter <dan.carpenter@linaro.org>
To: oe-kbuild@lists.linux.dev, Edward Cree <ecree.xilinx@gmail.com>
Cc: lkp@intel.com, oe-kbuild-all@lists.linux.dev,
linux-kernel@vger.kernel.org,
Simon Horman <simon.horman@corigine.com>
Subject: drivers/net/ethernet/sfc/tc.c:450 efx_tc_flower_replace() warn: missing unwind goto?
Date: Sat, 20 May 2023 11:32:03 +0300 [thread overview]
Message-ID: <cbbbf576-6788-4049-b1e8-a05862f62cc2@kili.mountain> (raw)
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: d3f704310cc7e04e89d178ea080a2e74dae9db67
commit: b7f5e17b3bb96165979f55f2821190a77f984d0e sfc: handle enc keys in efx_tc_flower_parse_match()
config: ia64-randconfig-m041-20230514
compiler: ia64-linux-gcc (GCC) 12.1.0
If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <error27@gmail.com>
| Closes: https://lore.kernel.org/r/202305200745.xmIlkqjH-lkp@intel.com/
smatch warnings:
drivers/net/ethernet/sfc/tc.c:450 efx_tc_flower_replace() warn: missing unwind goto?
vim +450 drivers/net/ethernet/sfc/tc.c
d902e1a737d44e Edward Cree 2022-09-26 382 static int efx_tc_flower_replace(struct efx_nic *efx,
d902e1a737d44e Edward Cree 2022-09-26 383 struct net_device *net_dev,
d902e1a737d44e Edward Cree 2022-09-26 384 struct flow_cls_offload *tc,
d902e1a737d44e Edward Cree 2022-09-26 385 struct efx_rep *efv)
d902e1a737d44e Edward Cree 2022-09-26 386 {
d902e1a737d44e Edward Cree 2022-09-26 387 struct flow_rule *fr = flow_cls_offload_flow_rule(tc);
d902e1a737d44e Edward Cree 2022-09-26 388 struct netlink_ext_ack *extack = tc->common.extack;
d902e1a737d44e Edward Cree 2022-09-26 389 struct efx_tc_flow_rule *rule = NULL, *old;
d902e1a737d44e Edward Cree 2022-09-26 390 struct efx_tc_action_set *act = NULL;
d902e1a737d44e Edward Cree 2022-09-26 391 const struct flow_action_entry *fa;
d902e1a737d44e Edward Cree 2022-09-26 392 struct efx_rep *from_efv, *to_efv;
d902e1a737d44e Edward Cree 2022-09-26 393 struct efx_tc_match match;
d902e1a737d44e Edward Cree 2022-09-26 394 s64 rc;
d902e1a737d44e Edward Cree 2022-09-26 395 int i;
d902e1a737d44e Edward Cree 2022-09-26 396
d902e1a737d44e Edward Cree 2022-09-26 397 if (!tc_can_offload_extack(efx->net_dev, extack))
d902e1a737d44e Edward Cree 2022-09-26 398 return -EOPNOTSUPP;
d902e1a737d44e Edward Cree 2022-09-26 399 if (WARN_ON(!efx->tc))
d902e1a737d44e Edward Cree 2022-09-26 400 return -ENETDOWN;
d902e1a737d44e Edward Cree 2022-09-26 401 if (WARN_ON(!efx->tc->up))
d902e1a737d44e Edward Cree 2022-09-26 402 return -ENETDOWN;
d902e1a737d44e Edward Cree 2022-09-26 403
d902e1a737d44e Edward Cree 2022-09-26 404 from_efv = efx_tc_flower_lookup_efv(efx, net_dev);
d902e1a737d44e Edward Cree 2022-09-26 405 if (IS_ERR(from_efv)) {
d902e1a737d44e Edward Cree 2022-09-26 406 /* Might be a tunnel decap rule from an indirect block.
d902e1a737d44e Edward Cree 2022-09-26 407 * Support for those not implemented yet.
d902e1a737d44e Edward Cree 2022-09-26 408 */
d902e1a737d44e Edward Cree 2022-09-26 409 return -EOPNOTSUPP;
d902e1a737d44e Edward Cree 2022-09-26 410 }
d902e1a737d44e Edward Cree 2022-09-26 411
d902e1a737d44e Edward Cree 2022-09-26 412 if (efv != from_efv) {
d902e1a737d44e Edward Cree 2022-09-26 413 /* can't happen */
ad1c80d5f777b8 Edward Cree 2022-10-18 414 NL_SET_ERR_MSG_FMT_MOD(extack, "for %s efv is %snull but from_efv is %snull (can't happen)",
d902e1a737d44e Edward Cree 2022-09-26 415 netdev_name(net_dev), efv ? "non-" : "",
d902e1a737d44e Edward Cree 2022-09-26 416 from_efv ? "non-" : "");
d902e1a737d44e Edward Cree 2022-09-26 417 return -EINVAL;
d902e1a737d44e Edward Cree 2022-09-26 418 }
d902e1a737d44e Edward Cree 2022-09-26 419
d902e1a737d44e Edward Cree 2022-09-26 420 /* Parse match */
d902e1a737d44e Edward Cree 2022-09-26 421 memset(&match, 0, sizeof(match));
d902e1a737d44e Edward Cree 2022-09-26 422 rc = efx_tc_flower_external_mport(efx, from_efv);
d902e1a737d44e Edward Cree 2022-09-26 423 if (rc < 0) {
ad1c80d5f777b8 Edward Cree 2022-10-18 424 NL_SET_ERR_MSG_MOD(extack, "Failed to identify ingress m-port");
d902e1a737d44e Edward Cree 2022-09-26 425 return rc;
d902e1a737d44e Edward Cree 2022-09-26 426 }
d902e1a737d44e Edward Cree 2022-09-26 427 match.value.ingress_port = rc;
d902e1a737d44e Edward Cree 2022-09-26 428 match.mask.ingress_port = ~0;
d902e1a737d44e Edward Cree 2022-09-26 429 rc = efx_tc_flower_parse_match(efx, fr, &match, extack);
d902e1a737d44e Edward Cree 2022-09-26 430 if (rc)
d902e1a737d44e Edward Cree 2022-09-26 431 return rc;
b7f5e17b3bb961 Edward Cree 2023-03-27 432 if (efx_tc_match_is_encap(&match.mask)) {
b7f5e17b3bb961 Edward Cree 2023-03-27 433 NL_SET_ERR_MSG_MOD(extack, "Ingress enc_key matches not supported");
b7f5e17b3bb961 Edward Cree 2023-03-27 434 rc = -EOPNOTSUPP;
b7f5e17b3bb961 Edward Cree 2023-03-27 435 goto release;
This goto confuses Smatch. It could be converted to a direct return.
b7f5e17b3bb961 Edward Cree 2023-03-27 436 }
d902e1a737d44e Edward Cree 2022-09-26 437
d902e1a737d44e Edward Cree 2022-09-26 438 if (tc->common.chain_index) {
ad1c80d5f777b8 Edward Cree 2022-10-18 439 NL_SET_ERR_MSG_MOD(extack, "No support for nonzero chain_index");
d902e1a737d44e Edward Cree 2022-09-26 440 return -EOPNOTSUPP;
d902e1a737d44e Edward Cree 2022-09-26 441 }
d902e1a737d44e Edward Cree 2022-09-26 442 match.mask.recirc_id = 0xff;
d902e1a737d44e Edward Cree 2022-09-26 443
d902e1a737d44e Edward Cree 2022-09-26 444 rc = efx_mae_match_check_caps(efx, &match.mask, extack);
d902e1a737d44e Edward Cree 2022-09-26 445 if (rc)
d902e1a737d44e Edward Cree 2022-09-26 446 return rc;
d902e1a737d44e Edward Cree 2022-09-26 447
d902e1a737d44e Edward Cree 2022-09-26 448 rule = kzalloc(sizeof(*rule), GFP_USER);
d902e1a737d44e Edward Cree 2022-09-26 449 if (!rule)
d902e1a737d44e Edward Cree 2022-09-26 @450 return -ENOMEM;
d902e1a737d44e Edward Cree 2022-09-26 451 INIT_LIST_HEAD(&rule->acts.list);
d902e1a737d44e Edward Cree 2022-09-26 452 rule->cookie = tc->cookie;
d902e1a737d44e Edward Cree 2022-09-26 453 old = rhashtable_lookup_get_insert_fast(&efx->tc->match_action_ht,
d902e1a737d44e Edward Cree 2022-09-26 454 &rule->linkage,
d902e1a737d44e Edward Cree 2022-09-26 455 efx_tc_match_action_ht_params);
d902e1a737d44e Edward Cree 2022-09-26 456 if (old) {
d902e1a737d44e Edward Cree 2022-09-26 457 netif_dbg(efx, drv, efx->net_dev,
d902e1a737d44e Edward Cree 2022-09-26 458 "Already offloaded rule (cookie %lx)\n", tc->cookie);
d902e1a737d44e Edward Cree 2022-09-26 459 rc = -EEXIST;
d902e1a737d44e Edward Cree 2022-09-26 460 NL_SET_ERR_MSG_MOD(extack, "Rule already offloaded");
d902e1a737d44e Edward Cree 2022-09-26 461 goto release;
It looks like this error path is problematic because it will remove the
existing rule from the list. Better to just do:
if (old) {
netif_dbg(...);
NL_SET_ERR_MSG_MOD(extack, "Rule already offloaded");
kfree(rule);
return -EEXIST;
}
d902e1a737d44e Edward Cree 2022-09-26 462 }
d902e1a737d44e Edward Cree 2022-09-26 463
d902e1a737d44e Edward Cree 2022-09-26 464 /* Parse actions */
d902e1a737d44e Edward Cree 2022-09-26 465 act = kzalloc(sizeof(*act), GFP_USER);
d902e1a737d44e Edward Cree 2022-09-26 466 if (!act) {
d902e1a737d44e Edward Cree 2022-09-26 467 rc = -ENOMEM;
d902e1a737d44e Edward Cree 2022-09-26 468 goto release;
d902e1a737d44e Edward Cree 2022-09-26 469 }
d902e1a737d44e Edward Cree 2022-09-26 470
edd025ca088719 Edward Cree 2023-03-27 471 /**
edd025ca088719 Edward Cree 2023-03-27 472 * DOC: TC action translation
edd025ca088719 Edward Cree 2023-03-27 473 *
edd025ca088719 Edward Cree 2023-03-27 474 * Actions in TC are sequential and cumulative, with delivery actions
edd025ca088719 Edward Cree 2023-03-27 475 * potentially anywhere in the order. The EF100 MAE, however, takes
edd025ca088719 Edward Cree 2023-03-27 476 * an 'action set list' consisting of 'action sets', each of which is
edd025ca088719 Edward Cree 2023-03-27 477 * applied to the _original_ packet, and consists of a set of optional
edd025ca088719 Edward Cree 2023-03-27 478 * actions in a fixed order with delivery at the end.
edd025ca088719 Edward Cree 2023-03-27 479 * To translate between these two models, we maintain a 'cursor', @act,
edd025ca088719 Edward Cree 2023-03-27 480 * which describes the cumulative effect of all the packet-mutating
edd025ca088719 Edward Cree 2023-03-27 481 * actions encountered so far; on handling a delivery (mirred or drop)
edd025ca088719 Edward Cree 2023-03-27 482 * action, once the action-set has been inserted into hardware, we
edd025ca088719 Edward Cree 2023-03-27 483 * append @act to the action-set list (@rule->acts); if this is a pipe
edd025ca088719 Edward Cree 2023-03-27 484 * action (mirred mirror) we then allocate a new @act with a copy of
edd025ca088719 Edward Cree 2023-03-27 485 * the cursor state _before_ the delivery action, otherwise we set @act
edd025ca088719 Edward Cree 2023-03-27 486 * to %NULL.
edd025ca088719 Edward Cree 2023-03-27 487 * This ensures that every allocated action-set is either attached to
edd025ca088719 Edward Cree 2023-03-27 488 * @rule->acts or pointed to by @act (and never both), and that only
edd025ca088719 Edward Cree 2023-03-27 489 * those action-sets in @rule->acts exist in hardware. Consequently,
edd025ca088719 Edward Cree 2023-03-27 490 * in the failure path, @act only needs to be freed in memory, whereas
edd025ca088719 Edward Cree 2023-03-27 491 * for @rule->acts we remove each action-set from hardware before
edd025ca088719 Edward Cree 2023-03-27 492 * freeing it (efx_tc_free_action_set_list()), even if the action-set
edd025ca088719 Edward Cree 2023-03-27 493 * list itself is not in hardware.
edd025ca088719 Edward Cree 2023-03-27 494 */
d902e1a737d44e Edward Cree 2022-09-26 495 flow_action_for_each(i, fa, &fr->action) {
d902e1a737d44e Edward Cree 2022-09-26 496 struct efx_tc_action_set save;
05ccd8d8a15e6b Edward Cree 2023-03-09 497 u16 tci;
d902e1a737d44e Edward Cree 2022-09-26 498
d902e1a737d44e Edward Cree 2022-09-26 499 if (!act) {
d902e1a737d44e Edward Cree 2022-09-26 500 /* more actions after a non-pipe action */
ad1c80d5f777b8 Edward Cree 2022-10-18 501 NL_SET_ERR_MSG_MOD(extack, "Action follows non-pipe action");
d902e1a737d44e Edward Cree 2022-09-26 502 rc = -EINVAL;
d902e1a737d44e Edward Cree 2022-09-26 503 goto release;
d902e1a737d44e Edward Cree 2022-09-26 504 }
d902e1a737d44e Edward Cree 2022-09-26 505
2e0f1eb05692b4 Edward Cree 2022-11-14 506 if ((fa->id == FLOW_ACTION_REDIRECT ||
2e0f1eb05692b4 Edward Cree 2022-11-14 507 fa->id == FLOW_ACTION_MIRRED ||
2e0f1eb05692b4 Edward Cree 2022-11-14 508 fa->id == FLOW_ACTION_DROP) && fa->hw_stats) {
2e0f1eb05692b4 Edward Cree 2022-11-14 509 struct efx_tc_counter_index *ctr;
2e0f1eb05692b4 Edward Cree 2022-11-14 510
83a187a4eb3a8d Edward Cree 2022-11-14 511 /* Currently the only actions that want stats are
83a187a4eb3a8d Edward Cree 2022-11-14 512 * mirred and gact (ok, shot, trap, goto-chain), which
83a187a4eb3a8d Edward Cree 2022-11-14 513 * means we want stats just before delivery. Also,
83a187a4eb3a8d Edward Cree 2022-11-14 514 * note that tunnel_key set shouldn't change the length
83a187a4eb3a8d Edward Cree 2022-11-14 515 * — it's only the subsequent mirred that does that,
83a187a4eb3a8d Edward Cree 2022-11-14 516 * and the stats are taken _before_ the mirred action
83a187a4eb3a8d Edward Cree 2022-11-14 517 * happens.
83a187a4eb3a8d Edward Cree 2022-11-14 518 */
83a187a4eb3a8d Edward Cree 2022-11-14 519 if (!efx_tc_flower_action_order_ok(act, EFX_TC_AO_COUNT)) {
83a187a4eb3a8d Edward Cree 2022-11-14 520 /* All supported actions that count either steal
83a187a4eb3a8d Edward Cree 2022-11-14 521 * (gact shot, mirred redirect) or clone act
83a187a4eb3a8d Edward Cree 2022-11-14 522 * (mirred mirror), so we should never get two
83a187a4eb3a8d Edward Cree 2022-11-14 523 * count actions on one action_set.
83a187a4eb3a8d Edward Cree 2022-11-14 524 */
83a187a4eb3a8d Edward Cree 2022-11-14 525 NL_SET_ERR_MSG_MOD(extack, "Count-action conflict (can't happen)");
83a187a4eb3a8d Edward Cree 2022-11-14 526 rc = -EOPNOTSUPP;
83a187a4eb3a8d Edward Cree 2022-11-14 527 goto release;
83a187a4eb3a8d Edward Cree 2022-11-14 528 }
83a187a4eb3a8d Edward Cree 2022-11-14 529
2e0f1eb05692b4 Edward Cree 2022-11-14 530 if (!(fa->hw_stats & FLOW_ACTION_HW_STATS_DELAYED)) {
2e0f1eb05692b4 Edward Cree 2022-11-14 531 NL_SET_ERR_MSG_FMT_MOD(extack, "hw_stats_type %u not supported (only 'delayed')",
2e0f1eb05692b4 Edward Cree 2022-11-14 532 fa->hw_stats);
2e0f1eb05692b4 Edward Cree 2022-11-14 533 rc = -EOPNOTSUPP;
2e0f1eb05692b4 Edward Cree 2022-11-14 534 goto release;
2e0f1eb05692b4 Edward Cree 2022-11-14 535 }
2e0f1eb05692b4 Edward Cree 2022-11-14 536
2e0f1eb05692b4 Edward Cree 2022-11-14 537 ctr = efx_tc_flower_get_counter_index(efx, tc->cookie,
2e0f1eb05692b4 Edward Cree 2022-11-14 538 EFX_TC_COUNTER_TYPE_AR);
2e0f1eb05692b4 Edward Cree 2022-11-14 539 if (IS_ERR(ctr)) {
2e0f1eb05692b4 Edward Cree 2022-11-14 540 rc = PTR_ERR(ctr);
2e0f1eb05692b4 Edward Cree 2022-11-14 541 NL_SET_ERR_MSG_MOD(extack, "Failed to obtain a counter");
2e0f1eb05692b4 Edward Cree 2022-11-14 542 goto release;
2e0f1eb05692b4 Edward Cree 2022-11-14 543 }
2e0f1eb05692b4 Edward Cree 2022-11-14 544 act->count = ctr;
2e0f1eb05692b4 Edward Cree 2022-11-14 545 }
2e0f1eb05692b4 Edward Cree 2022-11-14 546
d902e1a737d44e Edward Cree 2022-09-26 547 switch (fa->id) {
d902e1a737d44e Edward Cree 2022-09-26 548 case FLOW_ACTION_DROP:
d902e1a737d44e Edward Cree 2022-09-26 549 rc = efx_mae_alloc_action_set(efx, act);
d902e1a737d44e Edward Cree 2022-09-26 550 if (rc) {
ad1c80d5f777b8 Edward Cree 2022-10-18 551 NL_SET_ERR_MSG_MOD(extack, "Failed to write action set to hw (drop)");
d902e1a737d44e Edward Cree 2022-09-26 552 goto release;
d902e1a737d44e Edward Cree 2022-09-26 553 }
d902e1a737d44e Edward Cree 2022-09-26 554 list_add_tail(&act->list, &rule->acts.list);
d902e1a737d44e Edward Cree 2022-09-26 555 act = NULL; /* end of the line */
d902e1a737d44e Edward Cree 2022-09-26 556 break;
d902e1a737d44e Edward Cree 2022-09-26 557 case FLOW_ACTION_REDIRECT:
d902e1a737d44e Edward Cree 2022-09-26 558 case FLOW_ACTION_MIRRED:
d902e1a737d44e Edward Cree 2022-09-26 559 save = *act;
83a187a4eb3a8d Edward Cree 2022-11-14 560
83a187a4eb3a8d Edward Cree 2022-11-14 561 if (!efx_tc_flower_action_order_ok(act, EFX_TC_AO_DELIVER)) {
83a187a4eb3a8d Edward Cree 2022-11-14 562 /* can't happen */
83a187a4eb3a8d Edward Cree 2022-11-14 563 rc = -EOPNOTSUPP;
83a187a4eb3a8d Edward Cree 2022-11-14 564 NL_SET_ERR_MSG_MOD(extack, "Deliver action violates action order (can't happen)");
83a187a4eb3a8d Edward Cree 2022-11-14 565 goto release;
83a187a4eb3a8d Edward Cree 2022-11-14 566 }
83a187a4eb3a8d Edward Cree 2022-11-14 567
d902e1a737d44e Edward Cree 2022-09-26 568 to_efv = efx_tc_flower_lookup_efv(efx, fa->dev);
d902e1a737d44e Edward Cree 2022-09-26 569 if (IS_ERR(to_efv)) {
ad1c80d5f777b8 Edward Cree 2022-10-18 570 NL_SET_ERR_MSG_MOD(extack, "Mirred egress device not on switch");
d902e1a737d44e Edward Cree 2022-09-26 571 rc = PTR_ERR(to_efv);
d902e1a737d44e Edward Cree 2022-09-26 572 goto release;
d902e1a737d44e Edward Cree 2022-09-26 573 }
d902e1a737d44e Edward Cree 2022-09-26 574 rc = efx_tc_flower_external_mport(efx, to_efv);
d902e1a737d44e Edward Cree 2022-09-26 575 if (rc < 0) {
ad1c80d5f777b8 Edward Cree 2022-10-18 576 NL_SET_ERR_MSG_MOD(extack, "Failed to identify egress m-port");
d902e1a737d44e Edward Cree 2022-09-26 577 goto release;
d902e1a737d44e Edward Cree 2022-09-26 578 }
d902e1a737d44e Edward Cree 2022-09-26 579 act->dest_mport = rc;
d902e1a737d44e Edward Cree 2022-09-26 580 act->deliver = 1;
d902e1a737d44e Edward Cree 2022-09-26 581 rc = efx_mae_alloc_action_set(efx, act);
d902e1a737d44e Edward Cree 2022-09-26 582 if (rc) {
ad1c80d5f777b8 Edward Cree 2022-10-18 583 NL_SET_ERR_MSG_MOD(extack, "Failed to write action set to hw (mirred)");
d902e1a737d44e Edward Cree 2022-09-26 584 goto release;
d902e1a737d44e Edward Cree 2022-09-26 585 }
d902e1a737d44e Edward Cree 2022-09-26 586 list_add_tail(&act->list, &rule->acts.list);
d902e1a737d44e Edward Cree 2022-09-26 587 act = NULL;
d902e1a737d44e Edward Cree 2022-09-26 588 if (fa->id == FLOW_ACTION_REDIRECT)
d902e1a737d44e Edward Cree 2022-09-26 589 break; /* end of the line */
d902e1a737d44e Edward Cree 2022-09-26 590 /* Mirror, so continue on with saved act */
2e0f1eb05692b4 Edward Cree 2022-11-14 591 save.count = NULL;
d902e1a737d44e Edward Cree 2022-09-26 592 act = kzalloc(sizeof(*act), GFP_USER);
d902e1a737d44e Edward Cree 2022-09-26 593 if (!act) {
d902e1a737d44e Edward Cree 2022-09-26 594 rc = -ENOMEM;
d902e1a737d44e Edward Cree 2022-09-26 595 goto release;
d902e1a737d44e Edward Cree 2022-09-26 596 }
d902e1a737d44e Edward Cree 2022-09-26 597 *act = save;
d902e1a737d44e Edward Cree 2022-09-26 598 break;
05ccd8d8a15e6b Edward Cree 2023-03-09 599 case FLOW_ACTION_VLAN_POP:
05ccd8d8a15e6b Edward Cree 2023-03-09 600 if (act->vlan_push) {
05ccd8d8a15e6b Edward Cree 2023-03-09 601 act->vlan_push--;
05ccd8d8a15e6b Edward Cree 2023-03-09 602 } else if (efx_tc_flower_action_order_ok(act, EFX_TC_AO_VLAN_POP)) {
05ccd8d8a15e6b Edward Cree 2023-03-09 603 act->vlan_pop++;
05ccd8d8a15e6b Edward Cree 2023-03-09 604 } else {
05ccd8d8a15e6b Edward Cree 2023-03-09 605 NL_SET_ERR_MSG_MOD(extack,
05ccd8d8a15e6b Edward Cree 2023-03-09 606 "More than two VLAN pops, or action order violated");
05ccd8d8a15e6b Edward Cree 2023-03-09 607 rc = -EINVAL;
05ccd8d8a15e6b Edward Cree 2023-03-09 608 goto release;
05ccd8d8a15e6b Edward Cree 2023-03-09 609 }
05ccd8d8a15e6b Edward Cree 2023-03-09 610 break;
05ccd8d8a15e6b Edward Cree 2023-03-09 611 case FLOW_ACTION_VLAN_PUSH:
05ccd8d8a15e6b Edward Cree 2023-03-09 612 if (!efx_tc_flower_action_order_ok(act, EFX_TC_AO_VLAN_PUSH)) {
05ccd8d8a15e6b Edward Cree 2023-03-09 613 rc = -EINVAL;
05ccd8d8a15e6b Edward Cree 2023-03-09 614 NL_SET_ERR_MSG_MOD(extack,
05ccd8d8a15e6b Edward Cree 2023-03-09 615 "More than two VLAN pushes, or action order violated");
05ccd8d8a15e6b Edward Cree 2023-03-09 616 goto release;
05ccd8d8a15e6b Edward Cree 2023-03-09 617 }
05ccd8d8a15e6b Edward Cree 2023-03-09 618 tci = fa->vlan.vid & VLAN_VID_MASK;
05ccd8d8a15e6b Edward Cree 2023-03-09 619 tci |= fa->vlan.prio << VLAN_PRIO_SHIFT;
05ccd8d8a15e6b Edward Cree 2023-03-09 620 act->vlan_tci[act->vlan_push] = cpu_to_be16(tci);
05ccd8d8a15e6b Edward Cree 2023-03-09 621 act->vlan_proto[act->vlan_push] = fa->vlan.proto;
05ccd8d8a15e6b Edward Cree 2023-03-09 622 act->vlan_push++;
05ccd8d8a15e6b Edward Cree 2023-03-09 623 break;
d902e1a737d44e Edward Cree 2022-09-26 624 default:
ad1c80d5f777b8 Edward Cree 2022-10-18 625 NL_SET_ERR_MSG_FMT_MOD(extack, "Unhandled action %u",
ad1c80d5f777b8 Edward Cree 2022-10-18 626 fa->id);
d902e1a737d44e Edward Cree 2022-09-26 627 rc = -EOPNOTSUPP;
d902e1a737d44e Edward Cree 2022-09-26 628 goto release;
d902e1a737d44e Edward Cree 2022-09-26 629 }
d902e1a737d44e Edward Cree 2022-09-26 630 }
d902e1a737d44e Edward Cree 2022-09-26 631
d902e1a737d44e Edward Cree 2022-09-26 632 if (act) {
d902e1a737d44e Edward Cree 2022-09-26 633 /* Not shot/redirected, so deliver to default dest */
d902e1a737d44e Edward Cree 2022-09-26 634 if (from_efv == EFX_EFV_PF)
d902e1a737d44e Edward Cree 2022-09-26 635 /* Rule applies to traffic from the wire,
d902e1a737d44e Edward Cree 2022-09-26 636 * and default dest is thus the PF
d902e1a737d44e Edward Cree 2022-09-26 637 */
d902e1a737d44e Edward Cree 2022-09-26 638 efx_mae_mport_uplink(efx, &act->dest_mport);
d902e1a737d44e Edward Cree 2022-09-26 639 else
d902e1a737d44e Edward Cree 2022-09-26 640 /* Representor, so rule applies to traffic from
d902e1a737d44e Edward Cree 2022-09-26 641 * representee, and default dest is thus the rep.
d902e1a737d44e Edward Cree 2022-09-26 642 * All reps use the same mport for delivery
d902e1a737d44e Edward Cree 2022-09-26 643 */
d902e1a737d44e Edward Cree 2022-09-26 644 efx_mae_mport_mport(efx, efx->tc->reps_mport_id,
d902e1a737d44e Edward Cree 2022-09-26 645 &act->dest_mport);
d902e1a737d44e Edward Cree 2022-09-26 646 act->deliver = 1;
d902e1a737d44e Edward Cree 2022-09-26 647 rc = efx_mae_alloc_action_set(efx, act);
d902e1a737d44e Edward Cree 2022-09-26 648 if (rc) {
ad1c80d5f777b8 Edward Cree 2022-10-18 649 NL_SET_ERR_MSG_MOD(extack, "Failed to write action set to hw (deliver)");
d902e1a737d44e Edward Cree 2022-09-26 650 goto release;
d902e1a737d44e Edward Cree 2022-09-26 651 }
d902e1a737d44e Edward Cree 2022-09-26 652 list_add_tail(&act->list, &rule->acts.list);
d902e1a737d44e Edward Cree 2022-09-26 653 act = NULL; /* Prevent double-free in error path */
d902e1a737d44e Edward Cree 2022-09-26 654 }
d902e1a737d44e Edward Cree 2022-09-26 655
d902e1a737d44e Edward Cree 2022-09-26 656 netif_dbg(efx, drv, efx->net_dev,
d902e1a737d44e Edward Cree 2022-09-26 657 "Successfully parsed filter (cookie %lx)\n",
d902e1a737d44e Edward Cree 2022-09-26 658 tc->cookie);
d902e1a737d44e Edward Cree 2022-09-26 659
d902e1a737d44e Edward Cree 2022-09-26 660 rule->match = match;
d902e1a737d44e Edward Cree 2022-09-26 661
d902e1a737d44e Edward Cree 2022-09-26 662 rc = efx_mae_alloc_action_set_list(efx, &rule->acts);
d902e1a737d44e Edward Cree 2022-09-26 663 if (rc) {
ad1c80d5f777b8 Edward Cree 2022-10-18 664 NL_SET_ERR_MSG_MOD(extack, "Failed to write action set list to hw");
d902e1a737d44e Edward Cree 2022-09-26 665 goto release;
d902e1a737d44e Edward Cree 2022-09-26 666 }
d902e1a737d44e Edward Cree 2022-09-26 667 rc = efx_mae_insert_rule(efx, &rule->match, EFX_TC_PRIO_TC,
d902e1a737d44e Edward Cree 2022-09-26 668 rule->acts.fw_id, &rule->fw_id);
d902e1a737d44e Edward Cree 2022-09-26 669 if (rc) {
ad1c80d5f777b8 Edward Cree 2022-10-18 670 NL_SET_ERR_MSG_MOD(extack, "Failed to insert rule in hw");
d902e1a737d44e Edward Cree 2022-09-26 671 goto release_acts;
d902e1a737d44e Edward Cree 2022-09-26 672 }
d902e1a737d44e Edward Cree 2022-09-26 673 return 0;
d902e1a737d44e Edward Cree 2022-09-26 674
d902e1a737d44e Edward Cree 2022-09-26 675 release_acts:
d902e1a737d44e Edward Cree 2022-09-26 676 efx_mae_free_action_set_list(efx, &rule->acts);
d902e1a737d44e Edward Cree 2022-09-26 677 release:
d902e1a737d44e Edward Cree 2022-09-26 678 /* We failed to insert the rule, so free up any entries we created in
d902e1a737d44e Edward Cree 2022-09-26 679 * subsidiary tables.
d902e1a737d44e Edward Cree 2022-09-26 680 */
d902e1a737d44e Edward Cree 2022-09-26 681 if (act)
d902e1a737d44e Edward Cree 2022-09-26 682 efx_tc_free_action_set(efx, act, false);
d902e1a737d44e Edward Cree 2022-09-26 683 if (rule) {
d902e1a737d44e Edward Cree 2022-09-26 684 rhashtable_remove_fast(&efx->tc->match_action_ht,
d902e1a737d44e Edward Cree 2022-09-26 685 &rule->linkage,
d902e1a737d44e Edward Cree 2022-09-26 686 efx_tc_match_action_ht_params);
d902e1a737d44e Edward Cree 2022-09-26 687 efx_tc_free_action_set_list(efx, &rule->acts, false);
d902e1a737d44e Edward Cree 2022-09-26 688 }
d902e1a737d44e Edward Cree 2022-09-26 689 kfree(rule);
d902e1a737d44e Edward Cree 2022-09-26 690 return rc;
d902e1a737d44e Edward Cree 2022-09-26 691 }
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
next reply other threads:[~2023-05-20 8:32 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-20 8:32 Dan Carpenter [this message]
2023-05-30 18:26 ` drivers/net/ethernet/sfc/tc.c:450 efx_tc_flower_replace() warn: missing unwind goto? Edward Cree
2023-05-31 8:11 ` Dan Carpenter
-- strict thread matches above, loose matches on Subject: below --
2023-05-19 23:53 kernel test robot
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=cbbbf576-6788-4049-b1e8-a05862f62cc2@kili.mountain \
--to=dan.carpenter@linaro.org \
--cc=ecree.xilinx@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=lkp@intel.com \
--cc=oe-kbuild-all@lists.linux.dev \
--cc=oe-kbuild@lists.linux.dev \
--cc=simon.horman@corigine.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.