From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 10E10A04DD; Tue, 20 Oct 2020 11:27:48 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id E56A7E22F; Tue, 20 Oct 2020 11:14:52 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id A8763C814 for ; Tue, 20 Oct 2020 11:14:10 +0200 (CEST) Received: from mx1-us1.ppe-hosted.com (unknown [10.7.65.64]) by dispatch1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 3708760071 for ; Tue, 20 Oct 2020 09:14:09 +0000 (UTC) Received: from us4-mdac16-68.ut7.mdlocal (unknown [10.7.64.187]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 360E02009B for ; Tue, 20 Oct 2020 09:14:09 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from mx1-us1.ppe-hosted.com (unknown [10.7.66.34]) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 8CF5A22004F for ; Tue, 20 Oct 2020 09:14:08 +0000 (UTC) Received: from webmail.solarflare.com (uk.solarflare.com [193.34.186.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 43F49600053 for ; Tue, 20 Oct 2020 09:14:08 +0000 (UTC) Received: from ukex01.SolarFlarecom.com (10.17.10.4) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 20 Oct 2020 10:13:59 +0100 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 20 Oct 2020 10:13:59 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id 09K9Dxub028371; Tue, 20 Oct 2020 10:13:59 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 9D2171613BE; Tue, 20 Oct 2020 10:13:59 +0100 (BST) From: Andrew Rybchenko To: CC: Ivan Malov Date: Tue, 20 Oct 2020 10:12:55 +0100 Message-ID: <1603185222-14831-16-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1603185222-14831-1-git-send-email-arybchenko@solarflare.com> References: <1603183709-23420-1-git-send-email-arybchenko@solarflare.com> <1603185222-14831-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 Content-Type: text/plain X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.6.1012-25736.003 X-TM-AS-Result: No-0.462400-8.000000-10 X-TMASE-MatchedRID: s4SlA1o/QeqvddsITeyYIA9rVnOZ7Na29l9p8mNlkgn5BgEebZ/Id92I 5lCpZsGnSU+/BVsfN4xsu9NQ2X6vHgXjSpVHn22DqJSK+HSPY+/pVMb1xnESMgaYevV4zG3ZUx7 kGWSmvLut2gtuWr1LmjUt9JuWj4xHqj01FlWBadoaPMGCcVm9DhQEj9RZgbsWqPGqHIPGZiNcLC J/KjH2+fENLDkevvRYfVkdlGqLoLaEQeXrAUW/pxIRh9wkXSlFuoYFb0nRiqPSqRSAHh9TUIk+J GTs+SgTuW0lBjgUk+f0RAJjMpMwivq1PT1fWLFicaD+wPaBYtYOROc6V2b9xpsoi2XrUn/Jn6Kd MrRsL14qtq5d3cxkNaIBjL0CQ2REDbLtTFChLUp7UmoA+n8lk5o7vPKPqgVvEZT73Il4h6p2Haz DE/4ydD3gQ4Z8FpQbGHhbAlQ4GxxU/9hXOAmyk1Lp4hUUe2ehOKBkFAm8GOUPoO5ncI6OuehbQ2 QpmASdyky8P5TYMPI= X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--0.462400-8.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.6.1012-25736.003 X-MDID: 1603185249-CNKlHjyNFw10 X-PPE-DISP: 1603185249;CNKlHjyNFw10 Subject: [dpdk-dev] [PATCH v2 15/62] net/sfc: add actions parsing stub to MAE backend X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Ivan Malov If parsing a flow results in an action set specification identical to an already existing one, duplication will be avoided by reusing the list entry of the latter. Using an attach helper and a reference counter is meant to serve the said purpose. Signed-off-by: Ivan Malov Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- drivers/net/sfc/sfc_flow.c | 8 ++- drivers/net/sfc/sfc_flow.h | 2 + drivers/net/sfc/sfc_mae.c | 133 +++++++++++++++++++++++++++++++++++++ drivers/net/sfc/sfc_mae.h | 15 +++++ 4 files changed, 157 insertions(+), 1 deletion(-) diff --git a/drivers/net/sfc/sfc_flow.c b/drivers/net/sfc/sfc_flow.c index f69dd6ac5d..f4d53bf770 100644 --- a/drivers/net/sfc/sfc_flow.c +++ b/drivers/net/sfc/sfc_flow.c @@ -1201,6 +1201,7 @@ sfc_flow_parse_attr(struct sfc_adapter *sa, spec->type = SFC_FLOW_SPEC_MAE; spec_mae->priority = attr->priority; spec_mae->match_spec = NULL; + spec_mae->action_set = NULL; } return 0; @@ -2428,7 +2429,7 @@ sfc_flow_parse_rte_to_filter(struct rte_eth_dev *dev, static int sfc_flow_parse_rte_to_mae(struct rte_eth_dev *dev, const struct rte_flow_item pattern[], - __rte_unused const struct rte_flow_action actions[], + const struct rte_flow_action actions[], struct rte_flow *flow, struct rte_flow_error *error) { @@ -2441,6 +2442,11 @@ sfc_flow_parse_rte_to_mae(struct rte_eth_dev *dev, if (rc != 0) return rc; + rc = sfc_mae_rule_parse_actions(sa, actions, &spec_mae->action_set, + error); + if (rc != 0) + return rc; + return 0; } diff --git a/drivers/net/sfc/sfc_flow.h b/drivers/net/sfc/sfc_flow.h index 164e9f9a9a..7d15f47e60 100644 --- a/drivers/net/sfc/sfc_flow.h +++ b/drivers/net/sfc/sfc_flow.h @@ -65,6 +65,8 @@ struct sfc_flow_spec_mae { unsigned int priority; /* EFX match specification */ efx_mae_match_spec_t *match_spec; + /* Action set registry entry */ + struct sfc_mae_action_set *action_set; }; /* Flow specification */ diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c index 42200c3f7e..de2c6b26e4 100644 --- a/drivers/net/sfc/sfc_mae.c +++ b/drivers/net/sfc/sfc_mae.c @@ -43,6 +43,7 @@ sfc_mae_attach(struct sfc_adapter *sa) mae->status = SFC_MAE_STATUS_SUPPORTED; mae->nb_action_rule_prios_max = limits.eml_max_n_action_prios; + TAILQ_INIT(&mae->action_sets); sfc_log_init(sa, "done"); @@ -76,6 +77,68 @@ sfc_mae_detach(struct sfc_adapter *sa) sfc_log_init(sa, "done"); } +static struct sfc_mae_action_set * +sfc_mae_action_set_attach(struct sfc_adapter *sa, + const efx_mae_actions_t *spec) +{ + struct sfc_mae_action_set *action_set; + struct sfc_mae *mae = &sa->mae; + + SFC_ASSERT(sfc_adapter_is_locked(sa)); + + TAILQ_FOREACH(action_set, &mae->action_sets, entries) { + if (efx_mae_action_set_specs_equal(action_set->spec, spec)) { + ++(action_set->refcnt); + return action_set; + } + } + + return NULL; +} + +static int +sfc_mae_action_set_add(struct sfc_adapter *sa, + efx_mae_actions_t *spec, + struct sfc_mae_action_set **action_setp) +{ + struct sfc_mae_action_set *action_set; + struct sfc_mae *mae = &sa->mae; + + SFC_ASSERT(sfc_adapter_is_locked(sa)); + + action_set = rte_zmalloc("sfc_mae_action_set", sizeof(*action_set), 0); + if (action_set == NULL) + return ENOMEM; + + action_set->refcnt = 1; + action_set->spec = spec; + + TAILQ_INSERT_TAIL(&mae->action_sets, action_set, entries); + + *action_setp = action_set; + + return 0; +} + +static void +sfc_mae_action_set_del(struct sfc_adapter *sa, + struct sfc_mae_action_set *action_set) +{ + struct sfc_mae *mae = &sa->mae; + + SFC_ASSERT(sfc_adapter_is_locked(sa)); + SFC_ASSERT(action_set->refcnt != 0); + + --(action_set->refcnt); + + if (action_set->refcnt != 0) + return; + + efx_mae_action_set_spec_fini(sa->nic, action_set->spec); + TAILQ_REMOVE(&mae->action_sets, action_set, entries); + rte_free(action_set); +} + void sfc_mae_flow_cleanup(struct sfc_adapter *sa, struct rte_flow *flow) @@ -93,6 +156,9 @@ sfc_mae_flow_cleanup(struct sfc_adapter *sa, spec_mae = &spec->mae; + if (spec_mae->action_set != NULL) + sfc_mae_action_set_del(sa, spec_mae->action_set); + if (spec_mae->match_spec != NULL) efx_mae_match_spec_fini(sa->nic, spec_mae->match_spec); } @@ -149,6 +215,73 @@ sfc_mae_rule_parse_pattern(struct sfc_adapter *sa, return rc; } +static int +sfc_mae_rule_parse_action(const struct rte_flow_action *action, + __rte_unused efx_mae_actions_t *spec, + struct rte_flow_error *error) +{ + switch (action->type) { + default: + return rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_ACTION, NULL, + "Unsupported action"); + } + + return 0; +} + +int +sfc_mae_rule_parse_actions(struct sfc_adapter *sa, + const struct rte_flow_action actions[], + struct sfc_mae_action_set **action_setp, + struct rte_flow_error *error) +{ + const struct rte_flow_action *action; + efx_mae_actions_t *spec; + int rc; + + if (actions == NULL) { + return rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ACTION_NUM, NULL, + "NULL actions"); + } + + rc = efx_mae_action_set_spec_init(sa->nic, &spec); + if (rc != 0) + goto fail_action_set_spec_init; + + for (action = actions; + action->type != RTE_FLOW_ACTION_TYPE_END; ++action) { + rc = sfc_mae_rule_parse_action(action, spec, error); + if (rc != 0) + goto fail_rule_parse_action; + } + + *action_setp = sfc_mae_action_set_attach(sa, spec); + if (*action_setp != NULL) { + efx_mae_action_set_spec_fini(sa->nic, spec); + return 0; + } + + rc = sfc_mae_action_set_add(sa, spec, action_setp); + if (rc != 0) + goto fail_action_set_add; + + return 0; + +fail_action_set_add: +fail_rule_parse_action: + efx_mae_action_set_spec_fini(sa->nic, spec); + +fail_action_set_spec_init: + if (rc > 0) { + rc = rte_flow_error_set(error, rc, + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, + NULL, "Failed to process the action"); + } + return rc; +} + static bool sfc_mae_rules_class_cmp(struct sfc_adapter *sa, const efx_mae_match_spec_t *left, diff --git a/drivers/net/sfc/sfc_mae.h b/drivers/net/sfc/sfc_mae.h index 4c5bc4c6ce..5727962a0b 100644 --- a/drivers/net/sfc/sfc_mae.h +++ b/drivers/net/sfc/sfc_mae.h @@ -18,6 +18,15 @@ extern "C" { #endif +/** Action set registry entry */ +struct sfc_mae_action_set { + TAILQ_ENTRY(sfc_mae_action_set) entries; + unsigned int refcnt; + efx_mae_actions_t *spec; +}; + +TAILQ_HEAD(sfc_mae_action_sets, sfc_mae_action_set); + /** Options for MAE support status */ enum sfc_mae_status { SFC_MAE_STATUS_UNKNOWN = 0, @@ -30,6 +39,8 @@ struct sfc_mae { enum sfc_mae_status status; /** Priority level limit for MAE action rules */ unsigned int nb_action_rule_prios_max; + /** Action set registry */ + struct sfc_mae_action_sets action_sets; }; struct sfc_adapter; @@ -46,6 +57,10 @@ int sfc_mae_rule_parse_pattern(struct sfc_adapter *sa, const struct rte_flow_item pattern[], struct sfc_flow_spec_mae *spec, struct rte_flow_error *error); +int sfc_mae_rule_parse_actions(struct sfc_adapter *sa, + const struct rte_flow_action actions[], + struct sfc_mae_action_set **action_setp, + struct rte_flow_error *error); sfc_flow_verify_cb_t sfc_mae_flow_verify; #ifdef __cplusplus -- 2.17.1