* [PATCH] test: add additional tests for thash library
@ 2023-06-28 19:12 Vladimir Medvedkin
2023-06-29 12:59 ` David Marchand
2023-06-30 17:09 ` [PATCH v2 1/2] hash: fix reading unaligned bits implementation Vladimir Medvedkin
0 siblings, 2 replies; 7+ messages in thread
From: Vladimir Medvedkin @ 2023-06-28 19:12 UTC (permalink / raw)
To: dev; +Cc: konstantin.v.ananyev
Adds tests comparing the results of applying the output
of rte_thash_get_complement() to the tuple with the result
of calling rte_thash_adjust_tuple().
Suggested-by: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
Signed-off-by: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
Signed-off-by: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
---
app/test/test_thash.c | 132 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 132 insertions(+)
diff --git a/app/test/test_thash.c b/app/test/test_thash.c
index 62ba4a9528..53d9611e18 100644
--- a/app/test/test_thash.c
+++ b/app/test/test_thash.c
@@ -804,6 +804,137 @@ test_adjust_tuple(void)
return TEST_SUCCESS;
}
+static uint32_t
+calc_tuple_hash(const uint8_t tuple[TUPLE_SZ], const uint8_t *key)
+{
+ uint32_t i, hash;
+ uint32_t tmp[TUPLE_SZ / sizeof(uint32_t)];
+
+ for (i = 0; i < RTE_DIM(tmp); i++)
+ tmp[i] = rte_be_to_cpu_32(
+ *(const uint32_t *)&tuple[i * sizeof(uint32_t)]);
+
+ hash = rte_softrss(tmp, RTE_DIM(tmp), key);
+ return hash;
+}
+
+static int
+check_adj_tuple(const uint8_t tuple[TUPLE_SZ], const uint8_t *key,
+ uint32_t dhv, uint32_t ohv, uint32_t adjust, uint32_t reta_sz,
+ const char *prefix)
+{
+ uint32_t hash, hashlsb;
+
+ hash = calc_tuple_hash(tuple, key);
+ hashlsb = hash & HASH_MSK(reta_sz);
+
+ printf("%s(%s) for tuple:\n", __func__, prefix);
+ rte_memdump(stdout, NULL, tuple, TUPLE_SZ);
+ printf("\treta_sz: %u,\n"
+ "\torig hash: %#x,\n"
+ "\tdesired: %#x,\n"
+ "\tadjust: %#x,\n"
+ "\tactual: %#x,\n",
+ reta_sz, ohv, dhv, adjust, hashlsb);
+
+ if (dhv == hashlsb) {
+ printf("\t***Succeeded\n");
+ return 0;
+ }
+
+ printf("\t***Failed\n");
+ return -1;
+}
+
+static int
+test_adjust_tuple_mb(uint32_t reta_sz, uint32_t bofs)
+{
+ struct rte_thash_ctx *ctx;
+ struct rte_thash_subtuple_helper *h;
+ const int key_len = 40;
+ const uint8_t *new_key;
+ uint8_t orig_tuple[TUPLE_SZ];
+ uint8_t tuple_1[TUPLE_SZ];
+ uint8_t tuple_2[TUPLE_SZ];
+ uint32_t orig_hash;
+ int rc, ret;
+ uint32_t adj_bits;
+ unsigned int random = rte_rand();
+ unsigned int desired_value = random & HASH_MSK(reta_sz);
+
+ const uint32_t h_offset = offsetof(union rte_thash_tuple, v4.dport) * CHAR_BIT;
+ const uint32_t h_size = sizeof(uint16_t) * CHAR_BIT - bofs;
+
+ printf("===%s(reta_sz=%u,bofs=%u)===\n", __func__, reta_sz, bofs);
+
+ memset(orig_tuple, 0xab, sizeof(orig_tuple));
+
+ ctx = rte_thash_init_ctx("test", key_len, reta_sz, NULL, 0);
+ RTE_TEST_ASSERT(ctx != NULL, "can not create thash ctx\n");
+
+ ret = rte_thash_add_helper(ctx, "test", h_size, h_offset);
+ RTE_TEST_ASSERT(ret == 0, "can not add helper, ret %d\n", ret);
+
+ new_key = rte_thash_get_key(ctx);
+
+ h = rte_thash_get_helper(ctx, "test");
+
+ orig_hash = calc_tuple_hash(orig_tuple, new_key);
+
+ adj_bits = rte_thash_get_complement(h, orig_hash, desired_value);
+
+ /* use method #1, update tuple manually */
+ memcpy(tuple_1, orig_tuple, sizeof(tuple_1));
+ {
+ uint16_t nv, ov, *p;
+
+ p = (uint16_t *)(tuple_1 + h_offset / CHAR_BIT);
+ ov = p[0];
+ nv = ov ^ rte_cpu_to_be_16(adj_bits << bofs);
+ printf("%s#%d: ov=%#hx, nv=%#hx, adj=%#x;\n",
+ __func__, __LINE__, ov, nv, adj_bits);
+ p[0] = nv;
+ }
+
+ rc = check_adj_tuple(tuple_1, new_key, desired_value, orig_hash,
+ adj_bits, reta_sz, "method #1");
+ if (h_offset % CHAR_BIT == 0)
+ ret |= rc;
+
+ /* use method #2, use library function to adjust tuple */
+ memcpy(tuple_2, orig_tuple, sizeof(tuple_2));
+
+ rte_thash_adjust_tuple(ctx, h, tuple_2, sizeof(tuple_2),
+ desired_value, 1, NULL, NULL);
+ ret |= check_adj_tuple(tuple_2, new_key, desired_value, orig_hash,
+ adj_bits, reta_sz, "method #2");
+
+ rte_thash_free_ctx(ctx);
+
+ ret |= memcmp(tuple_1, tuple_2, sizeof(tuple_1));
+
+ printf("%s EXIT=======\n", __func__);
+ return ret;
+}
+
+static int
+test_adjust_tuple_mult_reta(void)
+{
+ uint32_t i, j, np, nt;
+
+ nt = 0, np = 0;
+ for (i = 0; i < CHAR_BIT; i++) {
+ for (j = 6; j <= RTE_THASH_RETA_SZ_MAX - i; j++) {
+ np += (test_adjust_tuple_mb(j, i) == 0);
+ nt++;
+ }
+ }
+
+ printf("%s: tests executed: %u, test passed: %u\n", __func__, nt, np);
+ RTE_TEST_ASSERT(nt == np, "%u subtests failed", nt - np);
+ return TEST_SUCCESS;
+}
+
static struct unit_test_suite thash_tests = {
.suite_name = "thash autotest",
.setup = NULL,
@@ -824,6 +955,7 @@ static struct unit_test_suite thash_tests = {
TEST_CASE(test_predictable_rss_min_seq),
TEST_CASE(test_predictable_rss_multirange),
TEST_CASE(test_adjust_tuple),
+ TEST_CASE(test_adjust_tuple_mult_reta),
TEST_CASES_END()
}
};
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH] test: add additional tests for thash library
2023-06-28 19:12 [PATCH] test: add additional tests for thash library Vladimir Medvedkin
@ 2023-06-29 12:59 ` David Marchand
2023-06-29 13:17 ` Medvedkin, Vladimir
2023-06-30 17:09 ` [PATCH v2 1/2] hash: fix reading unaligned bits implementation Vladimir Medvedkin
1 sibling, 1 reply; 7+ messages in thread
From: David Marchand @ 2023-06-29 12:59 UTC (permalink / raw)
To: Vladimir Medvedkin; +Cc: dev, konstantin.v.ananyev
On Wed, Jun 28, 2023 at 9:12 PM Vladimir Medvedkin
<vladimir.medvedkin@intel.com> wrote:
>
> Adds tests comparing the results of applying the output
> of rte_thash_get_complement() to the tuple with the result
> of calling rte_thash_adjust_tuple().
>
> Suggested-by: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
> Signed-off-by: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
> Signed-off-by: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
CI reports a failure on this new test, is it linked to the fix you
sent separately?
https://patchwork.dpdk.org/project/dpdk/patch/20230628191208.78701-1-vladimir.medvedkin@intel.com/
--
David Marchand
^ permalink raw reply [flat|nested] 7+ messages in thread
* RE: [PATCH] test: add additional tests for thash library
2023-06-29 12:59 ` David Marchand
@ 2023-06-29 13:17 ` Medvedkin, Vladimir
2023-06-29 13:47 ` David Marchand
0 siblings, 1 reply; 7+ messages in thread
From: Medvedkin, Vladimir @ 2023-06-29 13:17 UTC (permalink / raw)
To: David Marchand; +Cc: dev@dpdk.org, konstantin.v.ananyev@yandex.ru
Hi David,
Yes, I sent them separately because the bugfix in mentioned patch should be backported unlike adding a new test.
-----Original Message-----
From: David Marchand <david.marchand@redhat.com>
Sent: Thursday, June 29, 2023 2:00 PM
To: Medvedkin, Vladimir <vladimir.medvedkin@intel.com>
Cc: dev@dpdk.org; konstantin.v.ananyev@yandex.ru
Subject: Re: [PATCH] test: add additional tests for thash library
On Wed, Jun 28, 2023 at 9:12 PM Vladimir Medvedkin <vladimir.medvedkin@intel.com> wrote:
>
> Adds tests comparing the results of applying the output of
> rte_thash_get_complement() to the tuple with the result of calling
> rte_thash_adjust_tuple().
>
> Suggested-by: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
> Signed-off-by: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
> Signed-off-by: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
CI reports a failure on this new test, is it linked to the fix you sent separately?
https://patchwork.dpdk.org/project/dpdk/patch/20230628191208.78701-1-vladimir.medvedkin@intel.com/
--
David Marchand
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] test: add additional tests for thash library
2023-06-29 13:17 ` Medvedkin, Vladimir
@ 2023-06-29 13:47 ` David Marchand
0 siblings, 0 replies; 7+ messages in thread
From: David Marchand @ 2023-06-29 13:47 UTC (permalink / raw)
To: Medvedkin, Vladimir; +Cc: dev@dpdk.org, konstantin.v.ananyev@yandex.ru
On Thu, Jun 29, 2023 at 3:44 PM Medvedkin, Vladimir
<vladimir.medvedkin@intel.com> wrote:
>
> Hi David,
>
> Yes, I sent them separately because the bugfix in mentioned patch should be backported unlike adding a new test.
Well, having the two patches in a single series won't prevent us from
only backporting the fix, and the CI will still be happy.
Please resend.
Thanks.
--
David Marchand
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 1/2] hash: fix reading unaligned bits implementation
2023-06-28 19:12 [PATCH] test: add additional tests for thash library Vladimir Medvedkin
2023-06-29 12:59 ` David Marchand
@ 2023-06-30 17:09 ` Vladimir Medvedkin
2023-06-30 17:09 ` [PATCH v2 2/2] test: add additional tests for thash library Vladimir Medvedkin
2023-07-06 14:49 ` [PATCH v2 1/2] hash: fix reading unaligned bits implementation Thomas Monjalon
1 sibling, 2 replies; 7+ messages in thread
From: Vladimir Medvedkin @ 2023-06-30 17:09 UTC (permalink / raw)
To: dev; +Cc: konstantin.v.ananyev, stable
Fixes: 28ebff11c2dc ("hash: add predictable RSS")
Cc: stable@dpdk.org
Acked-by: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
Tested-by: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
Signed-off-by: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
---
lib/hash/rte_thash.c | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/lib/hash/rte_thash.c b/lib/hash/rte_thash.c
index 0249883b8d..2228af576b 100644
--- a/lib/hash/rte_thash.c
+++ b/lib/hash/rte_thash.c
@@ -670,7 +670,7 @@ rte_thash_get_gfni_matrices(struct rte_thash_ctx *ctx)
}
static inline uint8_t
-read_unaligned_byte(uint8_t *ptr, unsigned int len, unsigned int offset)
+read_unaligned_byte(uint8_t *ptr, unsigned int offset)
{
uint8_t ret = 0;
@@ -681,13 +681,14 @@ read_unaligned_byte(uint8_t *ptr, unsigned int len, unsigned int offset)
(CHAR_BIT - (offset % CHAR_BIT));
}
- return ret >> (CHAR_BIT - len);
+ return ret;
}
static inline uint32_t
read_unaligned_bits(uint8_t *ptr, int len, int offset)
{
uint32_t ret = 0;
+ int shift;
len = RTE_MAX(len, 0);
len = RTE_MIN(len, (int)(sizeof(uint32_t) * CHAR_BIT));
@@ -695,13 +696,14 @@ read_unaligned_bits(uint8_t *ptr, int len, int offset)
while (len > 0) {
ret <<= CHAR_BIT;
- ret |= read_unaligned_byte(ptr, RTE_MIN(len, CHAR_BIT),
- offset);
+ ret |= read_unaligned_byte(ptr, offset);
offset += CHAR_BIT;
len -= CHAR_BIT;
}
- return ret;
+ shift = (len == 0) ? 0 :
+ (CHAR_BIT - ((len + CHAR_BIT) % CHAR_BIT));
+ return ret >> shift;
}
/* returns mask for len bits with given offset inside byte */
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v2 2/2] test: add additional tests for thash library
2023-06-30 17:09 ` [PATCH v2 1/2] hash: fix reading unaligned bits implementation Vladimir Medvedkin
@ 2023-06-30 17:09 ` Vladimir Medvedkin
2023-07-06 14:49 ` [PATCH v2 1/2] hash: fix reading unaligned bits implementation Thomas Monjalon
1 sibling, 0 replies; 7+ messages in thread
From: Vladimir Medvedkin @ 2023-06-30 17:09 UTC (permalink / raw)
To: dev; +Cc: konstantin.v.ananyev
Adds tests comparing the results of applying the output
of rte_thash_get_complement() to the tuple with the result
of calling rte_thash_adjust_tuple().
Suggested-by: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
Signed-off-by: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
Signed-off-by: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
---
app/test/test_thash.c | 132 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 132 insertions(+)
diff --git a/app/test/test_thash.c b/app/test/test_thash.c
index 62ba4a9528..53d9611e18 100644
--- a/app/test/test_thash.c
+++ b/app/test/test_thash.c
@@ -804,6 +804,137 @@ test_adjust_tuple(void)
return TEST_SUCCESS;
}
+static uint32_t
+calc_tuple_hash(const uint8_t tuple[TUPLE_SZ], const uint8_t *key)
+{
+ uint32_t i, hash;
+ uint32_t tmp[TUPLE_SZ / sizeof(uint32_t)];
+
+ for (i = 0; i < RTE_DIM(tmp); i++)
+ tmp[i] = rte_be_to_cpu_32(
+ *(const uint32_t *)&tuple[i * sizeof(uint32_t)]);
+
+ hash = rte_softrss(tmp, RTE_DIM(tmp), key);
+ return hash;
+}
+
+static int
+check_adj_tuple(const uint8_t tuple[TUPLE_SZ], const uint8_t *key,
+ uint32_t dhv, uint32_t ohv, uint32_t adjust, uint32_t reta_sz,
+ const char *prefix)
+{
+ uint32_t hash, hashlsb;
+
+ hash = calc_tuple_hash(tuple, key);
+ hashlsb = hash & HASH_MSK(reta_sz);
+
+ printf("%s(%s) for tuple:\n", __func__, prefix);
+ rte_memdump(stdout, NULL, tuple, TUPLE_SZ);
+ printf("\treta_sz: %u,\n"
+ "\torig hash: %#x,\n"
+ "\tdesired: %#x,\n"
+ "\tadjust: %#x,\n"
+ "\tactual: %#x,\n",
+ reta_sz, ohv, dhv, adjust, hashlsb);
+
+ if (dhv == hashlsb) {
+ printf("\t***Succeeded\n");
+ return 0;
+ }
+
+ printf("\t***Failed\n");
+ return -1;
+}
+
+static int
+test_adjust_tuple_mb(uint32_t reta_sz, uint32_t bofs)
+{
+ struct rte_thash_ctx *ctx;
+ struct rte_thash_subtuple_helper *h;
+ const int key_len = 40;
+ const uint8_t *new_key;
+ uint8_t orig_tuple[TUPLE_SZ];
+ uint8_t tuple_1[TUPLE_SZ];
+ uint8_t tuple_2[TUPLE_SZ];
+ uint32_t orig_hash;
+ int rc, ret;
+ uint32_t adj_bits;
+ unsigned int random = rte_rand();
+ unsigned int desired_value = random & HASH_MSK(reta_sz);
+
+ const uint32_t h_offset = offsetof(union rte_thash_tuple, v4.dport) * CHAR_BIT;
+ const uint32_t h_size = sizeof(uint16_t) * CHAR_BIT - bofs;
+
+ printf("===%s(reta_sz=%u,bofs=%u)===\n", __func__, reta_sz, bofs);
+
+ memset(orig_tuple, 0xab, sizeof(orig_tuple));
+
+ ctx = rte_thash_init_ctx("test", key_len, reta_sz, NULL, 0);
+ RTE_TEST_ASSERT(ctx != NULL, "can not create thash ctx\n");
+
+ ret = rte_thash_add_helper(ctx, "test", h_size, h_offset);
+ RTE_TEST_ASSERT(ret == 0, "can not add helper, ret %d\n", ret);
+
+ new_key = rte_thash_get_key(ctx);
+
+ h = rte_thash_get_helper(ctx, "test");
+
+ orig_hash = calc_tuple_hash(orig_tuple, new_key);
+
+ adj_bits = rte_thash_get_complement(h, orig_hash, desired_value);
+
+ /* use method #1, update tuple manually */
+ memcpy(tuple_1, orig_tuple, sizeof(tuple_1));
+ {
+ uint16_t nv, ov, *p;
+
+ p = (uint16_t *)(tuple_1 + h_offset / CHAR_BIT);
+ ov = p[0];
+ nv = ov ^ rte_cpu_to_be_16(adj_bits << bofs);
+ printf("%s#%d: ov=%#hx, nv=%#hx, adj=%#x;\n",
+ __func__, __LINE__, ov, nv, adj_bits);
+ p[0] = nv;
+ }
+
+ rc = check_adj_tuple(tuple_1, new_key, desired_value, orig_hash,
+ adj_bits, reta_sz, "method #1");
+ if (h_offset % CHAR_BIT == 0)
+ ret |= rc;
+
+ /* use method #2, use library function to adjust tuple */
+ memcpy(tuple_2, orig_tuple, sizeof(tuple_2));
+
+ rte_thash_adjust_tuple(ctx, h, tuple_2, sizeof(tuple_2),
+ desired_value, 1, NULL, NULL);
+ ret |= check_adj_tuple(tuple_2, new_key, desired_value, orig_hash,
+ adj_bits, reta_sz, "method #2");
+
+ rte_thash_free_ctx(ctx);
+
+ ret |= memcmp(tuple_1, tuple_2, sizeof(tuple_1));
+
+ printf("%s EXIT=======\n", __func__);
+ return ret;
+}
+
+static int
+test_adjust_tuple_mult_reta(void)
+{
+ uint32_t i, j, np, nt;
+
+ nt = 0, np = 0;
+ for (i = 0; i < CHAR_BIT; i++) {
+ for (j = 6; j <= RTE_THASH_RETA_SZ_MAX - i; j++) {
+ np += (test_adjust_tuple_mb(j, i) == 0);
+ nt++;
+ }
+ }
+
+ printf("%s: tests executed: %u, test passed: %u\n", __func__, nt, np);
+ RTE_TEST_ASSERT(nt == np, "%u subtests failed", nt - np);
+ return TEST_SUCCESS;
+}
+
static struct unit_test_suite thash_tests = {
.suite_name = "thash autotest",
.setup = NULL,
@@ -824,6 +955,7 @@ static struct unit_test_suite thash_tests = {
TEST_CASE(test_predictable_rss_min_seq),
TEST_CASE(test_predictable_rss_multirange),
TEST_CASE(test_adjust_tuple),
+ TEST_CASE(test_adjust_tuple_mult_reta),
TEST_CASES_END()
}
};
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2 1/2] hash: fix reading unaligned bits implementation
2023-06-30 17:09 ` [PATCH v2 1/2] hash: fix reading unaligned bits implementation Vladimir Medvedkin
2023-06-30 17:09 ` [PATCH v2 2/2] test: add additional tests for thash library Vladimir Medvedkin
@ 2023-07-06 14:49 ` Thomas Monjalon
1 sibling, 0 replies; 7+ messages in thread
From: Thomas Monjalon @ 2023-07-06 14:49 UTC (permalink / raw)
To: Vladimir Medvedkin
Cc: dev, konstantin.v.ananyev, stable, david.marchand, john.mcnamara
30/06/2023 19:09, Vladimir Medvedkin:
> Fixes: 28ebff11c2dc ("hash: add predictable RSS")
> Cc: stable@dpdk.org
>
> Acked-by: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
> Tested-by: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
> Signed-off-by: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
I've just merged another patch from you where the explanation is useless.
Here there is no explanation at all.
The tags are in the wrong order, and there is a checkpatch warning.
I apply this series, considering they are not big issues in this case,
but please consider this is the very last time.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2023-07-06 14:49 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-06-28 19:12 [PATCH] test: add additional tests for thash library Vladimir Medvedkin
2023-06-29 12:59 ` David Marchand
2023-06-29 13:17 ` Medvedkin, Vladimir
2023-06-29 13:47 ` David Marchand
2023-06-30 17:09 ` [PATCH v2 1/2] hash: fix reading unaligned bits implementation Vladimir Medvedkin
2023-06-30 17:09 ` [PATCH v2 2/2] test: add additional tests for thash library Vladimir Medvedkin
2023-07-06 14:49 ` [PATCH v2 1/2] hash: fix reading unaligned bits implementation Thomas Monjalon
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.