Hi Yipeng, > -----Original Message----- > From: dev [mailto:dev-boun...@dpdk.org] On Behalf Of Yipeng Wang > Sent: Friday, June 8, 2018 11:51 AM > To: De Lara Guarch, Pablo <pablo.de.lara.gua...@intel.com> > Cc: dev@dpdk.org; Wang, Yipeng1 <yipeng1.w...@intel.com>; Mcnamara, > John <john.mcnam...@intel.com>; Richardson, Bruce > <bruce.richard...@intel.com>; honnappa.nagaraha...@arm.com; > vgu...@caviumnetworks.com; brijesh.s.si...@gmail.com > Subject: [dpdk-dev] [PATCH v1 1/3] hash: add read and write concurrency > support > > The existing implementation of librte_hash does not support read-write > concurrency. This commit implements read-write safety using rte_rwlock and > rte_rwlock TM version if hardware transactional memory is available. > > Both multi-writer and read-write concurrency is protected by rte_rwlock now. > The x86 specific header file is removed since the x86 specific RTM function > is not > called directly by rte hash now.
Sorry for the late review. Could you split this patch to make it easier to review? I suggest first refactor the code adding and using the API search_one_bucket, search_and_update and search_and_remove, and then add the rest of the patch. Since you are removing rte_cuckoo_hash_x86.h, you need to remove it from meson.build file too. More comments below. Thanks, Pablo > > Signed-off-by: Yipeng Wang <yipeng1.w...@intel.com> > --- > lib/librte_hash/rte_cuckoo_hash.c | 627 > +++++++++++++++++++++------------- > lib/librte_hash/rte_cuckoo_hash.h | 16 +- > lib/librte_hash/rte_cuckoo_hash_x86.h | 164 --------- > lib/librte_hash/rte_hash.h | 3 + > 4 files changed, 390 insertions(+), 420 deletions(-) delete mode 100644 > lib/librte_hash/rte_cuckoo_hash_x86.h > > diff --git a/lib/librte_hash/rte_cuckoo_hash.c > b/lib/librte_hash/rte_cuckoo_hash.c > index a07543a..a5bb4d4 100644 > --- a/lib/librte_hash/rte_cuckoo_hash.c > +++ b/lib/librte_hash/rte_cuckoo_hash.c ... > + if (h->multi_writer_support) { > + h->readwrite_lock = rte_malloc(NULL, sizeof(rte_rwlock_t), > LCORE_CACHE_SIZE); Check if malloc was successful, if not go to err_unlock. > - rte_spinlock_init(h->multiwriter_lock); > - } > - } else > - h->add_key = ADD_KEY_SINGLEWRITER; > + rte_rwlock_init(h->readwrite_lock); > + } > ... > +static inline int32_t > +__rte_hash_del_key_with_hash(const struct rte_hash *h, const void *key, > + hash_sig_t sig) > +{ > + int32_t bucket_idx; Shouldn't this be "uint32_t"? > + hash_sig_t alt_hash; > + struct rte_hash_bucket *bkt; > + int32_t ret_val; > + > + bucket_idx = sig & h->bucket_bitmask; ... > > diff --git a/lib/librte_hash/rte_cuckoo_hash.h > b/lib/librte_hash/rte_cuckoo_hash.h > index 7a54e55..40b6be0 100644 > --- a/lib/librte_hash/rte_cuckoo_hash.h > +++ b/lib/librte_hash/rte_cuckoo_hash.h ... > > uint32_t key_len __rte_cache_aligned; > /**< Length of hash key. */ > + uint8_t hw_trans_mem_support; > + uint8_t multi_writer_support; Add comments for these two fields.