From patchwork Wed Apr 17 16:08:06 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yoan Picchi X-Patchwork-Id: 139453 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 80A6143E94; Wed, 17 Apr 2024 18:08:49 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 9817740E96; Wed, 17 Apr 2024 18:08:34 +0200 (CEST) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mails.dpdk.org (Postfix) with ESMTP id A787840E78 for ; Wed, 17 Apr 2024 18:08:29 +0200 (CEST) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 01E11339; Wed, 17 Apr 2024 09:08:57 -0700 (PDT) Received: from octeon10-1.usa.Arm.com (unknown [10.118.91.161]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id DEC393F792; Wed, 17 Apr 2024 09:08:28 -0700 (PDT) From: Yoan Picchi To: Yipeng Wang , Sameh Gobriel , Bruce Richardson , Vladimir Medvedkin Cc: dev@dpdk.org, nd@arm.com, Yoan Picchi , Harjot Singh , Ruifeng Wang , Nathan Brown Subject: [PATCH v8 3/4] test/hash: check bulk lookup of keys after collision Date: Wed, 17 Apr 2024 16:08:06 +0000 Message-Id: <20240417160807.1249480-4-yoan.picchi@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240417160807.1249480-1-yoan.picchi@arm.com> References: <20231020165159.1649282-1-yoan.picchi@arm.com> <20240417160807.1249480-1-yoan.picchi@arm.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 This patch adds unit test for rte_hash_lookup_bulk(). It also update the test_full_bucket test to the current number of entries in a hash bucket. Signed-off-by: Yoan Picchi Signed-off-by: Harjot Singh Reviewed-by: Ruifeng Wang Reviewed-by: Nathan Brown --- app/test/test_hash.c | 99 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 76 insertions(+), 23 deletions(-) diff --git a/app/test/test_hash.c b/app/test/test_hash.c index d586878a22..4f871b3499 100644 --- a/app/test/test_hash.c +++ b/app/test/test_hash.c @@ -95,7 +95,7 @@ static uint32_t pseudo_hash(__rte_unused const void *keys, __rte_unused uint32_t key_len, __rte_unused uint32_t init_val) { - return 3; + return 3 | (3 << 16); } RTE_LOG_REGISTER(hash_logtype_test, test.hash, INFO); @@ -115,8 +115,10 @@ static void print_key_info(const char *msg, const struct flow_key *key, rte_log(RTE_LOG_DEBUG, hash_logtype_test, " @ pos %d\n", pos); } +#define KEY_PER_BUCKET 8 + /* Keys used by unit test functions */ -static struct flow_key keys[5] = { { +static struct flow_key keys[KEY_PER_BUCKET+1] = { { .ip_src = RTE_IPV4(0x03, 0x02, 0x01, 0x00), .ip_dst = RTE_IPV4(0x07, 0x06, 0x05, 0x04), .port_src = 0x0908, @@ -146,6 +148,30 @@ static struct flow_key keys[5] = { { .port_src = 0x4948, .port_dst = 0x4b4a, .proto = 0x4c, +}, { + .ip_src = RTE_IPV4(0x53, 0x52, 0x51, 0x50), + .ip_dst = RTE_IPV4(0x57, 0x56, 0x55, 0x54), + .port_src = 0x5958, + .port_dst = 0x5b5a, + .proto = 0x5c, +}, { + .ip_src = RTE_IPV4(0x63, 0x62, 0x61, 0x60), + .ip_dst = RTE_IPV4(0x67, 0x66, 0x65, 0x64), + .port_src = 0x6968, + .port_dst = 0x6b6a, + .proto = 0x6c, +}, { + .ip_src = RTE_IPV4(0x73, 0x72, 0x71, 0x70), + .ip_dst = RTE_IPV4(0x77, 0x76, 0x75, 0x74), + .port_src = 0x7978, + .port_dst = 0x7b7a, + .proto = 0x7c, +}, { + .ip_src = RTE_IPV4(0x83, 0x82, 0x81, 0x80), + .ip_dst = RTE_IPV4(0x87, 0x86, 0x85, 0x84), + .port_src = 0x8988, + .port_dst = 0x8b8a, + .proto = 0x8c, } }; /* Parameters used for hash table in unit test functions. Name set later. */ @@ -783,13 +809,15 @@ static int test_five_keys(void) /* * Add keys to the same bucket until bucket full. - * - add 5 keys to the same bucket (hash created with 4 keys per bucket): - * first 4 successful, 5th successful, pushing existing item in bucket - * - lookup the 5 keys: 5 hits - * - add the 5 keys again: 5 OK - * - lookup the 5 keys: 5 hits (updated data) - * - delete the 5 keys: 5 OK - * - lookup the 5 keys: 5 misses + * - add 9 keys to the same bucket (hash created with 8 keys per bucket): + * first 8 successful, 9th successful, pushing existing item in bucket + * - lookup the 9 keys: 9 hits + * - bulk lookup for all the 9 keys: 9 hits + * - add the 9 keys again: 9 OK + * - lookup the 9 keys: 9 hits (updated data) + * - delete the 9 keys: 9 OK + * - lookup the 9 keys: 9 misses + * - bulk lookup for all the 9 keys: 9 misses */ static int test_full_bucket(void) { @@ -801,16 +829,17 @@ static int test_full_bucket(void) .hash_func_init_val = 0, .socket_id = 0, }; + const void *key_array[KEY_PER_BUCKET+1] = {0}; struct rte_hash *handle; - int pos[5]; - int expected_pos[5]; + int pos[KEY_PER_BUCKET+1]; + int expected_pos[KEY_PER_BUCKET+1]; unsigned i; - + int ret; handle = rte_hash_create(¶ms_pseudo_hash); RETURN_IF_ERROR(handle == NULL, "hash creation failed"); /* Fill bucket */ - for (i = 0; i < 4; i++) { + for (i = 0; i < KEY_PER_BUCKET; i++) { pos[i] = rte_hash_add_key(handle, &keys[i]); print_key_info("Add", &keys[i], pos[i]); RETURN_IF_ERROR(pos[i] < 0, @@ -821,22 +850,36 @@ static int test_full_bucket(void) * This should work and will push one of the items * in the bucket because it is full */ - pos[4] = rte_hash_add_key(handle, &keys[4]); - print_key_info("Add", &keys[4], pos[4]); - RETURN_IF_ERROR(pos[4] < 0, - "failed to add key (pos[4]=%d)", pos[4]); - expected_pos[4] = pos[4]; + pos[KEY_PER_BUCKET] = rte_hash_add_key(handle, &keys[KEY_PER_BUCKET]); + print_key_info("Add", &keys[KEY_PER_BUCKET], pos[KEY_PER_BUCKET]); + RETURN_IF_ERROR(pos[KEY_PER_BUCKET] < 0, + "failed to add key (pos[%d]=%d)", KEY_PER_BUCKET, pos[KEY_PER_BUCKET]); + expected_pos[KEY_PER_BUCKET] = pos[KEY_PER_BUCKET]; /* Lookup */ - for (i = 0; i < 5; i++) { + for (i = 0; i < KEY_PER_BUCKET+1; i++) { pos[i] = rte_hash_lookup(handle, &keys[i]); print_key_info("Lkp", &keys[i], pos[i]); RETURN_IF_ERROR(pos[i] != expected_pos[i], "failed to find key (pos[%u]=%d)", i, pos[i]); } + for (i = 0; i < KEY_PER_BUCKET+1; i++) + key_array[i] = &keys[i]; + + /*Bulk lookup after add with same hash*/ + ret = rte_hash_lookup_bulk(handle, key_array, KEY_PER_BUCKET+1, (int32_t *)pos); + RETURN_IF_ERROR(ret, "rte_hash_lookup_bulk returned an error: %d\n", ret); + for (i = 0; i < KEY_PER_BUCKET+1; i++) { + print_key_info("Blk_Lkp", key_array[i], pos[i]); + RETURN_IF_ERROR(pos[i] != expected_pos[i], + "failed to find key (pos[%u]=%d)", i, pos[i]); + } + + + /* Add - update */ - for (i = 0; i < 5; i++) { + for (i = 0; i < KEY_PER_BUCKET+1; i++) { pos[i] = rte_hash_add_key(handle, &keys[i]); print_key_info("Add", &keys[i], pos[i]); RETURN_IF_ERROR(pos[i] != expected_pos[i], @@ -844,7 +887,7 @@ static int test_full_bucket(void) } /* Lookup */ - for (i = 0; i < 5; i++) { + for (i = 0; i < KEY_PER_BUCKET+1; i++) { pos[i] = rte_hash_lookup(handle, &keys[i]); print_key_info("Lkp", &keys[i], pos[i]); RETURN_IF_ERROR(pos[i] != expected_pos[i], @@ -869,7 +912,7 @@ static int test_full_bucket(void) RETURN_IF_ERROR(pos[1] < 0, "failed to add key (pos[1]=%d)", pos[1]); /* Delete */ - for (i = 0; i < 5; i++) { + for (i = 0; i < KEY_PER_BUCKET+1; i++) { pos[i] = rte_hash_del_key(handle, &keys[i]); print_key_info("Del", &keys[i], pos[i]); RETURN_IF_ERROR(pos[i] != expected_pos[i], @@ -877,13 +920,23 @@ static int test_full_bucket(void) } /* Lookup */ - for (i = 0; i < 5; i++) { + for (i = 0; i < KEY_PER_BUCKET+1; i++) { pos[i] = rte_hash_lookup(handle, &keys[i]); print_key_info("Lkp", &keys[i], pos[i]); RETURN_IF_ERROR(pos[i] != -ENOENT, "fail: found non-existent key (pos[%u]=%d)", i, pos[i]); } + /* Bulk Lookup on empty table*/ + ret = rte_hash_lookup_bulk(handle, &key_array[0], KEY_PER_BUCKET+1, (int32_t *)pos); + RETURN_IF_ERROR(ret, "rte_hash_lookup_bulk returned an error: %d\n", ret); + for (i = 0; i < KEY_PER_BUCKET+1; i++) { + print_key_info("Blk_Lkp", key_array[i], pos[i]); + RETURN_IF_ERROR(pos[i] != -ENOENT, + "failed to find key (pos[%u]=%d)", i, pos[i]); + } + + rte_hash_free(handle); /* Cover the NULL case. */