From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from sesbmg23.ericsson.net (sesbmg23.ericsson.net [193.180.251.37]) by dpdk.org (Postfix) with ESMTP id 50D262BAE for ; Mon, 4 Jul 2016 15:55:57 +0200 (CEST) X-AuditID: c1b4fb25-f79f26d00000327e-a0-577a6aec7c65 Received: from ESESSHC004.ericsson.se (Unknown_Domain [153.88.183.30]) by sesbmg23.ericsson.net (Symantec Mail Security) with SMTP id 90.57.12926.CEA6A775; Mon, 4 Jul 2016 15:55:57 +0200 (CEST) Received: from [159.107.45.156] (153.88.183.153) by smtp.internal.ericsson.com (153.88.183.32) with Microsoft SMTP Server id 14.3.294.0; Mon, 4 Jul 2016 15:55:56 +0200 To: References: <87ffa89f-1f89-4c27-14c0-c4a97eb74a60@ericsson.com> From: Yari Adan Petralanda Message-ID: Date: Mon, 4 Jul 2016 15:55:56 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Icedove/45.1.0 MIME-Version: 1.0 In-Reply-To: <87ffa89f-1f89-4c27-14c0-c4a97eb74a60@ericsson.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrOLMWRmVeSWpSXmKPExsUyM2K7nO7brKpwg3/vGC3efdrO5MDo8WvB UtYAxigum5TUnMyy1CJ9uwSujJ0L+pkKLmtXbJ65lqWB8YJSFyMnh4SAicTm7odsELaYxIV7 68FsIYEjjBKvOkS7GLmA7NWMEl/mPGMESQgLxEjcPfOJHcQWERCSWPrxMjtEg71Ef/ddFhCb TcBOYn3XZLBBvEDxfW/mgvWyCKhIPDhwhBXEFhUIkdh2swGqRlDi5MwnYL2cAg4SX9csZ+pi 5OBgFtCUWL9LHyTMLCAvsf3tHGaQsJCAnsTq364TGAVmIWmehdAwC0nDAkbmVYyixanFSbnp RsZ6qUWZycXF+Xl6eaklmxiBwXdwy2/VHYyX3zgeYhTgYFTi4X3QVRkuxJpYVlyZe4hRgoNZ SYQ3Pb0qXIg3JbGyKrUoP76oNCe1+BCjNAeLkjiv/0vFcCGB9MSS1OzU1ILUIpgsEwenVAOj RvBJC44zDbnRsxU31wqEziz/nLtUxGpG0t5r9mUGez6EvJ57ovzXcgnut8eVDBXi2pdcDRG7 sChz5/Kn0zTsGxxd/OfuMRKa/Xrfkb2fLaKdXH903U06elpkTdnX005V6sdM7tQu3WyR1fW0 dZ/tI3Vhp/1tTalfDl3NL3tbHT1/r7xEXbC+EktxRqKhFnNRcSIAfCzaqToCAAA= Subject: Re: [dpdk-dev] [PATCH v3] hash: new function to retrieve a key given its position X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 04 Jul 2016 13:55:57 -0000 Sorry, didn't mentioned the changes introduced in v3: *) solves some tabs for whitespaces issues *) references the right DPDK version *) reduces the size of the rte_hash_create() argument in the unit tests Thanks!! On 07/04/2016 10:59 AM, Yari Adan Petralanda wrote: > The function rte_hash_get_key_with_position is added in this patch. > As the position returned when adding a key is frequently used as an > offset into an array of user data, this function performs the operation > of retrieving a key given this offset. > > A possible use case would be to delete a key from the hash table when > its entry in the array of data has certain value. For instance, the key > could be a flow 5-tuple, and the value stored in the array a time > stamp. > > Signed-off-by: Juan Antonio Montesinos > Signed-off-by: Yari Adan Petralanda > --- > app/test/test_hash.c | 42 ++++++++++++++++++++++++++++++++++++ > lib/librte_hash/rte_cuckoo_hash.c | 20 +++++++++++++++++ > lib/librte_hash/rte_hash.h | 18 ++++++++++++++++ > lib/librte_hash/rte_hash_version.map | 7 ++++++ > 4 files changed, 87 insertions(+) > > diff --git a/app/test/test_hash.c b/app/test/test_hash.c > index 7e41725..29abcd9 100644 > --- a/app/test/test_hash.c > +++ b/app/test/test_hash.c > @@ -421,6 +421,46 @@ static int test_add_update_delete(void) > } > > /* > + * Sequence of operations for retrieving a key with its position > + * > + * - create table > + * - add key > + * - get the key with its position: hit > + * - delete key > + * - try to get the deleted key: miss > + * > + */ > +static int test_hash_get_key_with_position(void) > +{ > + struct rte_hash *handle = NULL; > + int pos, expectedPos, result; > + void *key; > + > + ut_params.name = "hash_get_key_w_pos"; > + handle = rte_hash_create(&ut_params); > + RETURN_IF_ERROR(handle == NULL, "hash creation failed"); > + > + pos = rte_hash_add_key(handle, &keys[0]); > + print_key_info("Add", &keys[0], pos); > + RETURN_IF_ERROR(pos < 0, "failed to add key (pos0=%d)", pos); > + expectedPos = pos; > + > + result = rte_hash_get_key_with_position(handle, pos, &key); > + RETURN_IF_ERROR(result != 0, "error retrieving a key"); > + > + pos = rte_hash_del_key(handle, &keys[0]); > + print_key_info("Del", &keys[0], pos); > + RETURN_IF_ERROR(pos != expectedPos, > + "failed to delete key (pos0=%d)", pos); > + > + result = rte_hash_get_key_with_position(handle, pos, &key); > + RETURN_IF_ERROR(result != -ENOENT, "non valid key retrieved"); > + > + rte_hash_free(handle); > + return 0; > +} > + > +/* > * Sequence of operations for find existing hash table > * > * - create table > @@ -1442,6 +1482,8 @@ test_hash(void) > return -1; > if (test_hash_add_delete_jhash_3word() < 0) > return -1; > + if (test_hash_get_key_with_position() < 0) > + return -1; > if (test_hash_find_existing() < 0) > return -1; > if (test_add_update_delete() < 0) > diff --git a/lib/librte_hash/rte_cuckoo_hash.c b/lib/librte_hash/rte_cuckoo_hash.c > index 7b7d1f8..a3c9091 100644 > --- a/lib/librte_hash/rte_cuckoo_hash.c > +++ b/lib/librte_hash/rte_cuckoo_hash.c > @@ -973,6 +973,26 @@ rte_hash_del_key(const struct rte_hash *h, const void *key) > return __rte_hash_del_key_with_hash(h, key, rte_hash_hash(h, key)); > } > > +int > +rte_hash_get_key_with_position(const struct rte_hash *h, const int32_t position, > + void **key) > +{ > + RETURN_IF_TRUE(((h == NULL) || (key == NULL)), -EINVAL); > + > + struct rte_hash_key *k, *keys = h->key_store; > + k = (struct rte_hash_key *) ((char *) keys + (position + 1) * > + h->key_entry_size); > + *key = k->key; > + > + if (position != > + __rte_hash_lookup_with_hash(h, *key, rte_hash_hash(h, *key), > + NULL)) { > + return -ENOENT; > + } > + > + return 0; > +} > + > /* Lookup bulk stage 0: Prefetch input key */ > static inline void > lookup_stage0(unsigned *idx, uint64_t *lookup_mask, > diff --git a/lib/librte_hash/rte_hash.h b/lib/librte_hash/rte_hash.h > index 724315a..78af365 100644 > --- a/lib/librte_hash/rte_hash.h > +++ b/lib/librte_hash/rte_hash.h > @@ -268,6 +268,24 @@ rte_hash_del_key(const struct rte_hash *h, const void *key); > int32_t > rte_hash_del_key_with_hash(const struct rte_hash *h, const void *key, hash_sig_t sig); > > +/** > + * Find a key in the hash table given the position. > + * This operation is multi-thread safe. > + * > + * @param h > + * Hash table to get the key from. > + * @param position > + * Position returned when the key was inserted. > + * @param key > + * Output containing a pointer to the key > + * @return > + * - 0 if retrieved successfully > + * - EINVAL if the parameters are invalid. > + * - ENOENT if no valid key is found in the given position. > + */ > +int > +rte_hash_get_key_with_position(const struct rte_hash *h, const int32_t position, > + void **key); > > /** > * Find a key-value pair in the hash table. > diff --git a/lib/librte_hash/rte_hash_version.map b/lib/librte_hash/rte_hash_version.map > index 4f25436..4237995 100644 > --- a/lib/librte_hash/rte_hash_version.map > +++ b/lib/librte_hash/rte_hash_version.map > @@ -38,3 +38,10 @@ DPDK_2.2 { > rte_hash_set_cmp_func; > > } DPDK_2.1; > + > +DPDK_16.07 { > + global: > + > + rte_hash_get_key_with_position; > + > +}; DPDK_2.2 >