DPDK patches and discussions
 help / color / mirror / Atom feed
From: venkatesh bs <venki.bsv@gmail.com>
To: Stephen Hemminger <stephen@networkplumber.org>
Cc: dev@dpdk.org
Subject: Re: Question regarding rte_hash_hash and rte_hash_add_key_with_hash_data
Date: Mon, 16 Jun 2025 21:40:59 +0530	[thread overview]
Message-ID: <CAM3UhOijhc+EiAxTCgRZsYva9+aTqo_ZTYNf_YpMzyDBM4f4oQ@mail.gmail.com> (raw)
In-Reply-To: <CAM3UhOiMvRu59dMko6RPkWdW4=dyUcetCgLPbOrwUiQxPSXudg@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 4532 bytes --]

Hi @Stephen Hemminger <stephen@networkplumber.org> ,

We debugged further on this issue ..

We see that position and entry_size(position * key_entry_size) crosses
above int32_t it overflows and it will corrupt random index of hash table.

in Nut shell hash table is only supporting upto 2topower32 size entries on
the table.

Below mentioned snapshot of the code change.

Thanks,
Venkatesh.


struct rte_hash_key *k, *keys = h->key_store;
Add comment63Plus  - k = (struct rte_hash_key *) ((char *) keys + (position
+ 1) *
Add comment64Plus  - h->key_entry_size);
Add comment65Plus  + k = (struct rte_hash_key *) ((char *) keys +
(uint64_t) (position + 1) *
Add comment66Plus  + (uint64_t) h->key_entry_size);
Add comment67Plus   *key = k->key;
Add comment68

On Tue, Jun 10, 2025 at 12:19 PM venkatesh bs <venki.bsv@gmail.com> wrote:

> Hi @Stephen Hemminger <stephen@networkplumber.org> ,
>
> Thanks for the reply , please find the details below.
>
> DPDK version : 20.11.6
>
> #define LOADBAL_HASH_ENTRIES_MAX (1024*1024*36)
> #define LOADBAL_HASH_TABLE_SIZE_MULTIPLIER 2
>
> hashSizeMultiplier = LOADBAL_HASH_TABLE_SIZE_MULTIPLIER;
>
>   struct rte_hash_parameters loadbal_hash_params = {
>                   .name = NULL,
>                   .entries = LOADBAL_HASH_ENTRIES_MAX * hashSizeMultiplier,
>                   .key_len = sizeof(flow_key_t),
>                   .hash_func = app_hash_crc(internally it calls
> rte_hash_crc_4byte for v4/v6)
>                   .hash_func_init_val = 0,
>               };
>
> First, what is the return value, which error?
> we captured only the return value, and will check what  error it is
> returning.
>
> IPv4 Load-Bal Flow hash table:
>     numInsertions:          998214247
>     numInsertionsFailures:  4252
>     numRemovals:            997197485
>     numRemovalFailures:     214902
>     numObjects:             1016762
>     NumBuckets:             75497472
>     TableCapacity:          75497472
>     LoadFactor:             1%
>     NumLookupSuccess:       389165605
>     NumLookupFails:         2704814006
>     Failure Analysis:
>       TableFull(>=95%):    0
>       HighLoad(75-95%):    0
>       MediumLoad(50-75%):  0
>       LowLoad(<50%):       4252
>
> We are try to analyze the code and find out the details,
> Initially there will be no issues, insertion starts failing after 24 HRS
> or so.
>
> Thanks,
> Venkatesh.
>
>
> On Sun, Jun 8, 2025 at 9:17 PM Stephen Hemminger <
> stephen@networkplumber.org> wrote:
>
>> On Sun, 8 Jun 2025 00:36:02 +0530
>> venkatesh bs <venki.bsv@gmail.com> wrote:
>>
>> > Hi @dpdk community,
>> >
>> > In my application, I am using the dpdk hash table as below.
>> >
>> > 1. calculate the hash value.
>> > 2. using this signature add the key and data into  a table.
>> > 3. lock is used in the 2nd call (add).
>> >
>> > Below is the code sniffer for the same.
>> > ==================================================================
>> >      hash_sig_t sig = rte_hash_hash(hash_tablele, (void *) &new_key);
>> >
>> >      pthread_mutex_lock(&lock);
>> >       int32_t ret = rte_hash_add_key_with_hash_data(hash_table,
>> >                           (void *)&new_key,
>> >                            sig,
>> >                            info);
>> >
>> > if (ret < 0)
>> > {
>> >          pthread_mutex_unlock(lock);
>> >          return TOS_E_FAIL;
>> > }
>> > pthread_mutex_unlock(lock);
>> >
>> > return OK..
>> > ==================================================================
>> >
>> > My application is having a lot of threads and when run with heavy load
>> , I
>> > am getting a lot of insertion failure, i felt the reason could be
>> > calculating and adding the has value in 2 api's as opposed to
>> > rte_hash_add() that is safe under a lock..
>> >
>> >
>> > Please let me know your thoughts.
>>
>> Which architecture and DPDK version?
>> What flags did you use during hash creation?
>>
>> As always with open source, the first thing to do is look at the source
>> and see what is really happening, rather than just relying on the
>> documentation.
>>
>> I assume you are using the default hash function which is CRC.
>>
>> First what is the return value, which error?
>> It might just be key collisions. How big is the table and how many
>> inserts?
>>
>> Also, the current DPDK hash flags with better locking and RCU.
>> This would be faster than simple pthread mutex.
>>
>>

[-- Attachment #2: Type: text/html, Size: 16905 bytes --]

      reply	other threads:[~2025-06-17 11:56 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-06-07 19:06 venkatesh bs
2025-06-08 15:47 ` Stephen Hemminger
2025-06-10  6:49   ` venkatesh bs
2025-06-16 16:10     ` venkatesh bs [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAM3UhOijhc+EiAxTCgRZsYva9+aTqo_ZTYNf_YpMzyDBM4f4oQ@mail.gmail.com \
    --to=venki.bsv@gmail.com \
    --cc=dev@dpdk.org \
    --cc=stephen@networkplumber.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).