Has anyone seen performance data comparing rte_hash (perhaps with r/w locks) versus URCU hash?
On Mon, Apr 23, 2018 at 4:50 PM, Stephen Hemminger < step...@networkplumber.org> wrote: > On Mon, 23 Apr 2018 12:40:41 -0700 > Brijesh Singh <brijesh.s.si...@gmail.com> wrote: > > > A gentle reminder, > > > > I am curious to know if/how rte_hash is thread safe for lookups.It is > > not obvious to me how following code is thread safe: > > > > _rte_hash_lookup_with_hash(const struct rte_hash *h, const void *key, > > > > hash_sig_t sig, void **data) > > > > { > > > > > > > > … > > > > if (rte_hash_cmp_eq(key, k->key, h) == 0) { > > > > if (data != NULL) > > > > *data = k->pdata; > > > > } > > > > a key could be deleted and another key inserted in its slot while the > > lookup is happening. For example, in the following sequence of events: > > The slot has Key1,V1 > > Lookup Thread T1 compares the input key to Key1 and it matches. The > > thread gets context switched out > > Thread T2 deletes Key1. > > Thread T2 inserts Key2 with value V2. > > T1 reads the data from the slot and returns V2. This is incorrect. > > > > > > Regards, > > Brijesh > > > > On Wed, Apr 11, 2018 at 9:12 PM, Brijesh Singh > > <brijesh.s.si...@gmail.com> wrote: > > > Hello, > > > > > > I want to use DPDK's rte_hash library to keep track of tcp flows. The > > > lookups will be done by multiple threads but inserts will be done only > > > on one thread. > > > > > > As per the documentation rte_hash library has thread safe lookups. Key > > > /data inserts should be done on single thread, since those operations > > > are not thread safe. Is this documentation still correct? > > > > > > The lookup code compares the key and returns the data if the key > > > matches, this doesn't look like thread safe. Am I missing something? > > > > > > _rte_hash_lookup_with_hash(const struct rte_hash *h, const void *key, > > > > > > hash_sig_t sig, void **data) > > > > > > { > > > > > > > > > > > > … > > > > > > if (rte_hash_cmp_eq(key, k->key, h) == 0) { > > > > > > if (data != NULL) > > > > > > *data = k->pdata; > > > > > > } > > > > > > Regards, > > > Brijesh > > The best way to handle this is to do some kind of Read Copy Update. > Unfortunately, this is not possible in scope of DPDK since it requires > cooperation from application threads. > > If you need thread safe hash table, my recommendation would be to > skip the DPDK hash library and use userspace RCU instead: > http://liburcu.org/ > > Note: URCU is LGPL versus BSD licensed. But then any non trivial > Linux application needs to use LGPL libraries already. >