From: Viacheslav Galaktionov Date: Fri, 15 Oct 2021 06:49:02 +0000 (+0300) Subject: net/sfc: allow ports without MAE privilege X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=2f577f0ea1a386254ebf124b9db78401fe4bcd48;p=dpdk.git net/sfc: allow ports without MAE privilege Register unprivileged ports in the switch domain registry in order to allow redirecting traffic to them. Differentiate between different levels of MAE support, update all MAE status checks. Signed-off-by: Viacheslav Galaktionov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c index de0fac899f..f5986b610f 100644 --- a/drivers/net/sfc/sfc_ethdev.c +++ b/drivers/net/sfc/sfc_ethdev.c @@ -187,7 +187,8 @@ sfc_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) dev_info->dev_capa = RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP | RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP; - if (mae->status == SFC_MAE_STATUS_SUPPORTED) { + if (mae->status == SFC_MAE_STATUS_SUPPORTED || + mae->status == SFC_MAE_STATUS_ADMIN) { dev_info->switch_info.name = dev->device->driver->name; dev_info->switch_info.domain_id = mae->switch_domain_id; dev_info->switch_info.port_id = mae->switch_port_id; @@ -2241,7 +2242,7 @@ sfc_representor_info_get(struct rte_eth_dev *dev, sfc_adapter_lock(sa); - if (sa->mae.status != SFC_MAE_STATUS_SUPPORTED) { + if (sa->mae.status != SFC_MAE_STATUS_ADMIN) { sfc_adapter_unlock(sa); return -ENOTSUP; } @@ -2687,7 +2688,7 @@ sfc_parse_switch_mode(struct sfc_adapter *sa, bool has_representors) goto fail_kvargs; if (switch_mode == NULL) { - sa->switchdev = encp->enc_mae_supported && + sa->switchdev = encp->enc_mae_admin && (!encp->enc_datapath_cap_evb || has_representors); } else if (strcasecmp(switch_mode, SFC_KVARG_SWITCH_MODE_LEGACY) == 0) { @@ -2822,9 +2823,9 @@ sfc_eth_dev_init(struct rte_eth_dev *dev, void *init_params) if (rc != 0) goto fail_attach; - if (sa->switchdev && sa->mae.status != SFC_MAE_STATUS_SUPPORTED) { + if (sa->switchdev && sa->mae.status != SFC_MAE_STATUS_ADMIN) { sfc_err(sa, - "failed to enable switchdev mode without MAE support"); + "failed to enable switchdev mode without admin MAE privilege"); rc = ENOTSUP; goto fail_switchdev_no_mae; } diff --git a/drivers/net/sfc/sfc_flow.c b/drivers/net/sfc/sfc_flow.c index 81b9923644..d57235f358 100644 --- a/drivers/net/sfc/sfc_flow.c +++ b/drivers/net/sfc/sfc_flow.c @@ -1275,7 +1275,7 @@ sfc_flow_parse_attr(struct sfc_adapter *sa, spec_filter->template.efs_rss_context = EFX_RSS_CONTEXT_DEFAULT; spec_filter->template.efs_priority = EFX_FILTER_PRI_MANUAL; } else { - if (mae->status != SFC_MAE_STATUS_SUPPORTED) { + if (mae->status != SFC_MAE_STATUS_ADMIN) { rte_flow_error_set(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ATTR_TRANSFER, attr, "Transfer is not supported"); diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index 4c5c7b776f..6a1385283b 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -197,23 +197,25 @@ sfc_mae_attach(struct sfc_adapter *sa) return 0; } - sfc_log_init(sa, "init MAE"); - rc = efx_mae_init(sa->nic); - if (rc != 0) - goto fail_mae_init; + if (encp->enc_mae_admin) { + sfc_log_init(sa, "init MAE"); + rc = efx_mae_init(sa->nic); + if (rc != 0) + goto fail_mae_init; - sfc_log_init(sa, "get MAE limits"); - rc = efx_mae_get_limits(sa->nic, &limits); - if (rc != 0) - goto fail_mae_get_limits; + sfc_log_init(sa, "get MAE limits"); + rc = efx_mae_get_limits(sa->nic, &limits); + if (rc != 0) + goto fail_mae_get_limits; - sfc_log_init(sa, "init MAE counter registry"); - rc = sfc_mae_counter_registry_init(&mae->counter_registry, - limits.eml_max_n_counters); - if (rc != 0) { - sfc_err(sa, "failed to init MAE counters registry for %u entries: %s", - limits.eml_max_n_counters, rte_strerror(rc)); - goto fail_counter_registry_init; + sfc_log_init(sa, "init MAE counter registry"); + rc = sfc_mae_counter_registry_init(&mae->counter_registry, + limits.eml_max_n_counters); + if (rc != 0) { + sfc_err(sa, "failed to init MAE counters registry for %u entries: %s", + limits.eml_max_n_counters, rte_strerror(rc)); + goto fail_counter_registry_init; + } } sfc_log_init(sa, "assign entity MPORT"); @@ -238,21 +240,28 @@ sfc_mae_attach(struct sfc_adapter *sa) if (rc != 0) goto fail_mae_assign_switch_port; - sfc_log_init(sa, "allocate encap. header bounce buffer"); - bounce_eh->buf_size = limits.eml_encap_header_size_limit; - bounce_eh->buf = rte_malloc("sfc_mae_bounce_eh", - bounce_eh->buf_size, 0); - if (bounce_eh->buf == NULL) - goto fail_mae_alloc_bounce_eh; - - mae->status = SFC_MAE_STATUS_SUPPORTED; - mae->nb_outer_rule_prios_max = limits.eml_max_n_outer_prios; - mae->nb_action_rule_prios_max = limits.eml_max_n_action_prios; - mae->encap_types_supported = limits.eml_encap_types_supported; + if (encp->enc_mae_admin) { + sfc_log_init(sa, "allocate encap. header bounce buffer"); + bounce_eh->buf_size = limits.eml_encap_header_size_limit; + bounce_eh->buf = rte_malloc("sfc_mae_bounce_eh", + bounce_eh->buf_size, 0); + if (bounce_eh->buf == NULL) + goto fail_mae_alloc_bounce_eh; + + mae->nb_outer_rule_prios_max = limits.eml_max_n_outer_prios; + mae->nb_action_rule_prios_max = limits.eml_max_n_action_prios; + mae->encap_types_supported = limits.eml_encap_types_supported; + } + TAILQ_INIT(&mae->outer_rules); TAILQ_INIT(&mae->encap_headers); TAILQ_INIT(&mae->action_sets); + if (encp->enc_mae_admin) + mae->status = SFC_MAE_STATUS_ADMIN; + else + mae->status = SFC_MAE_STATUS_SUPPORTED; + sfc_log_init(sa, "done"); return 0; @@ -261,11 +270,13 @@ fail_mae_alloc_bounce_eh: fail_mae_assign_switch_port: fail_mae_assign_switch_domain: fail_mae_assign_entity_mport: - sfc_mae_counter_registry_fini(&mae->counter_registry); + if (encp->enc_mae_admin) + sfc_mae_counter_registry_fini(&mae->counter_registry); fail_counter_registry_init: fail_mae_get_limits: - efx_mae_fini(sa->nic); + if (encp->enc_mae_admin) + efx_mae_fini(sa->nic); fail_mae_init: sfc_log_init(sa, "failed %d", rc); @@ -284,7 +295,7 @@ sfc_mae_detach(struct sfc_adapter *sa) mae->nb_action_rule_prios_max = 0; mae->status = SFC_MAE_STATUS_UNKNOWN; - if (status_prev != SFC_MAE_STATUS_SUPPORTED) + if (status_prev != SFC_MAE_STATUS_ADMIN) return; rte_free(mae->bounce_eh.buf); @@ -4036,9 +4047,9 @@ sfc_mae_switchdev_init(struct sfc_adapter *sa) return 0; } - if (mae->status != SFC_MAE_STATUS_SUPPORTED) { + if (mae->status != SFC_MAE_STATUS_ADMIN) { rc = ENOTSUP; - sfc_err(sa, "failed to init switchdev - no MAE support"); + sfc_err(sa, "failed to init switchdev - no admin MAE privilege"); goto fail_no_mae; } diff --git a/drivers/net/sfc/sfc_mae.h b/drivers/net/sfc/sfc_mae.h index 6c1a5bfee7..23dcf1e482 100644 --- a/drivers/net/sfc/sfc_mae.h +++ b/drivers/net/sfc/sfc_mae.h @@ -88,7 +88,8 @@ TAILQ_HEAD(sfc_mae_action_sets, sfc_mae_action_set); enum sfc_mae_status { SFC_MAE_STATUS_UNKNOWN = 0, SFC_MAE_STATUS_UNSUPPORTED, - SFC_MAE_STATUS_SUPPORTED + SFC_MAE_STATUS_SUPPORTED, + SFC_MAE_STATUS_ADMIN, }; /*