From patchwork Thu Aug 18 11:44:47 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cristian Dumitrescu X-Patchwork-Id: 115239 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id AE69DA034C; Thu, 18 Aug 2022 13:45:28 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 3B2DB4281C; Thu, 18 Aug 2022 13:45:08 +0200 (CEST) Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by mails.dpdk.org (Postfix) with ESMTP id AE6A040E2D for ; Thu, 18 Aug 2022 13:45:03 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1660823103; x=1692359103; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=s8gva1JKDeKMaTGLB2kw/MGAVKWPHv3y6h70wsPaC1k=; b=fcaln79UNHgrNF7u1VByKD+uAK02yXK9Jfavh62msCfgIks8drCwn8ld SjrqWfmQMmfSDgz/Wawp0oHXamYtw/0y35AH0jL/7sCRl3vkDm1HWdAGG 4AfuBj58pYclaae4OflDtQ+paW929fwZ/wvfnajB8ubhNko+oZoj3jlgr 5Y5bsUNTtBFDjfXPgt5KlxstxulSOUXI23kUOMBU4Zj+UJX3RgYPLi54M W1xkurNqeFQG3klYcP1MxOwVeK72QjF03Bufn9kk6EOiIdCRf/gBBMP0k petyc97b67R5zC0QiiyHtrRM6tLI/o+w377N02Xo5KMrfacVNu5T302O3 g==; X-IronPort-AV: E=McAfee;i="6500,9779,10442"; a="292735217" X-IronPort-AV: E=Sophos;i="5.93,246,1654585200"; d="scan'208";a="292735217" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Aug 2022 04:44:53 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.93,246,1654585200"; d="scan'208";a="668069717" Received: from silpixa00400573.ir.intel.com (HELO silpixa00400573.ger.corp.intel.com.) ([10.237.223.157]) by fmsmga008.fm.intel.com with ESMTP; 18 Aug 2022 04:44:53 -0700 From: Cristian Dumitrescu To: dev@dpdk.org Cc: "Kamalakannan R ." Subject: [PATCH 4/6] pipeline: configure the hash function for regular tables Date: Thu, 18 Aug 2022 11:44:47 +0000 Message-Id: <20220818114449.1408226-5-cristian.dumitrescu@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220818114449.1408226-1-cristian.dumitrescu@intel.com> References: <20220818114449.1408226-1-cristian.dumitrescu@intel.com> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Make the hash function configurable for the regular pipeline tables. Signed-off-by: Cristian Dumitrescu Signed-off-by: Kamalakannan R. --- lib/pipeline/rte_swx_ctl.c | 1 + lib/pipeline/rte_swx_ctl.h | 3 ++ lib/pipeline/rte_swx_pipeline.c | 10 +++++++ lib/pipeline/rte_swx_pipeline.h | 24 +++++----------- lib/pipeline/rte_swx_pipeline_internal.h | 1 + lib/pipeline/rte_swx_pipeline_spec.c | 35 +++++++++++++++++++++++- lib/pipeline/rte_swx_pipeline_spec.h | 1 + 7 files changed, 57 insertions(+), 18 deletions(-) diff --git a/lib/pipeline/rte_swx_ctl.c b/lib/pipeline/rte_swx_ctl.c index bdbcd8f50a..b6449f5f0c 100644 --- a/lib/pipeline/rte_swx_ctl.c +++ b/lib/pipeline/rte_swx_ctl.c @@ -272,6 +272,7 @@ table_params_get(struct rte_swx_ctl_pipeline *ctl, uint32_t table_id) table->params.key_offset = key_offset; table->params.key_mask0 = key_mask; table->params.action_data_size = action_data_size; + table->params.hash_func = table->info.hash_func; table->params.n_keys_max = table->info.size; table->mf_first = first; diff --git a/lib/pipeline/rte_swx_ctl.h b/lib/pipeline/rte_swx_ctl.h index 63ee479e47..0694df557a 100644 --- a/lib/pipeline/rte_swx_ctl.h +++ b/lib/pipeline/rte_swx_ctl.h @@ -236,6 +236,9 @@ struct rte_swx_ctl_table_info { */ int default_action_is_const; + /** Hash function. */ + rte_swx_hash_func_t hash_func; + /** Table size parameter. */ uint32_t size; }; diff --git a/lib/pipeline/rte_swx_pipeline.c b/lib/pipeline/rte_swx_pipeline.c index 2cac4caa95..e1227cbfcc 100644 --- a/lib/pipeline/rte_swx_pipeline.c +++ b/lib/pipeline/rte_swx_pipeline.c @@ -7986,6 +7986,7 @@ rte_swx_pipeline_table_config(struct rte_swx_pipeline *p, struct table *t = NULL; struct action *default_action; struct header *header = NULL; + struct hash_func *hf = NULL; uint32_t action_data_size_max = 0, i; int status = 0; @@ -8042,6 +8043,12 @@ rte_swx_pipeline_table_config(struct rte_swx_pipeline *p, CHECK((default_action->st && params->default_action_args) || !params->default_action_args, EINVAL); + /* Hash function checks. */ + if (params->hash_func_name) { + hf = hash_func_find(p, params->hash_func_name); + CHECK(hf, EINVAL); + } + /* Table type checks. */ if (recommended_table_type_name) CHECK_NAME(recommended_table_type_name, EINVAL); @@ -8141,6 +8148,7 @@ rte_swx_pipeline_table_config(struct rte_swx_pipeline *p, t->default_action_is_const = params->default_action_is_const; t->action_data_size_max = action_data_size_max; + t->hf = hf; t->size = size; t->id = p->n_tables; @@ -8227,6 +8235,7 @@ table_params_get(struct table *table) params->key_offset = key_offset; params->key_mask0 = key_mask; params->action_data_size = action_data_size; + params->hash_func = table->hf ? table->hf->func : NULL; params->n_keys_max = table->size; return params; @@ -10265,6 +10274,7 @@ rte_swx_ctl_table_info_get(struct rte_swx_pipeline *p, table->n_match_fields = t->n_fields; table->n_actions = t->n_actions; table->default_action_is_const = t->default_action_is_const; + table->hash_func = t->hf ? t->hf->func : NULL; table->size = t->size; return 0; } diff --git a/lib/pipeline/rte_swx_pipeline.h b/lib/pipeline/rte_swx_pipeline.h index 9c629d4118..09c75180f8 100644 --- a/lib/pipeline/rte_swx_pipeline.h +++ b/lib/pipeline/rte_swx_pipeline.h @@ -331,23 +331,6 @@ rte_swx_pipeline_extern_func_register(struct rte_swx_pipeline *p, * Hash function. */ -/** - * Hash function prototype - * - * @param[in] key - * Key to hash. Must be non-NULL. - * @param[in] length - * Key length in bytes. - * @param[in] seed - * Hash seed. - * @return - * Hash value. - */ -typedef uint32_t -(*rte_swx_hash_func_t)(const void *key, - uint32_t length, - uint32_t seed); - /** * Pipeline hash function register * @@ -699,6 +682,13 @@ struct rte_swx_pipeline_table_params { * list. */ int default_action_is_const; + + /** Hash function name. When not set to NULL, it must point to one of + * the hash functions that were registered for the current pipeline. + * Ignored by the table implementation when not needed. When needed but + * NULL, the table implementation will select the hash function to use. + */ + const char *hash_func_name; }; /** diff --git a/lib/pipeline/rte_swx_pipeline_internal.h b/lib/pipeline/rte_swx_pipeline_internal.h index 6d65b635c6..ee579c6656 100644 --- a/lib/pipeline/rte_swx_pipeline_internal.h +++ b/lib/pipeline/rte_swx_pipeline_internal.h @@ -828,6 +828,7 @@ struct table { int *action_is_for_table_entries; int *action_is_for_default_entry; + struct hash_func *hf; uint32_t size; uint32_t id; }; diff --git a/lib/pipeline/rte_swx_pipeline_spec.c b/lib/pipeline/rte_swx_pipeline_spec.c index 1b4183ef55..c0ca7335ff 100644 --- a/lib/pipeline/rte_swx_pipeline_spec.c +++ b/lib/pipeline/rte_swx_pipeline_spec.c @@ -509,7 +509,7 @@ action_block_parse(struct action_spec *s, static void table_spec_free(struct table_spec *s) { - uintptr_t default_action_name, default_action_args; + uintptr_t default_action_name, default_action_args, hash_func_name; uint32_t i; if (!s) @@ -556,6 +556,10 @@ table_spec_free(struct table_spec *s) s->params.default_action_is_const = 0; + hash_func_name = (uintptr_t)s->params.hash_func_name; + free((void *)hash_func_name); + s->params.hash_func_name = NULL; + free(s->recommended_table_type_name); s->recommended_table_type_name = NULL; @@ -935,6 +939,35 @@ table_block_parse(struct table_spec *s, err_line, err_msg); + if (!strcmp(tokens[0], "hash")) { + if (n_tokens != 2) { + if (err_line) + *err_line = n_lines; + if (err_msg) + *err_msg = "Invalid hash statement."; + return -EINVAL; + } + + if (s->params.hash_func_name) { + if (err_line) + *err_line = n_lines; + if (err_msg) + *err_msg = "Duplicate hash statement."; + return -EINVAL; + } + + s->params.hash_func_name = strdup(tokens[1]); + if (!s->params.hash_func_name) { + if (err_line) + *err_line = n_lines; + if (err_msg) + *err_msg = "Memory allocation failed."; + return -ENOMEM; + } + + return 0; + } + if (!strcmp(tokens[0], "instanceof")) { if (n_tokens != 2) { if (err_line) diff --git a/lib/pipeline/rte_swx_pipeline_spec.h b/lib/pipeline/rte_swx_pipeline_spec.h index 62ac4ecfc4..dbe1b40adc 100644 --- a/lib/pipeline/rte_swx_pipeline_spec.h +++ b/lib/pipeline/rte_swx_pipeline_spec.h @@ -88,6 +88,7 @@ struct action_spec { * ... * } * default_action ACTION_NAME args none | ARG0_NAME ARG0_VALUE ... [ const ] + * hash HASH_FUNCTION_NAME * instanceof TABLE_TYPE_NAME * pragma ARGS * size SIZE