All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jerin Jacob <jerin.jacob@caviumnetworks.com>
To: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
Cc: "bruce.richardson@intel.com" <bruce.richardson@intel.com>,
	"pablo.de.lara.guarch@intel.com" <pablo.de.lara.guarch@intel.com>,
	"dev@dpdk.org" <dev@dpdk.org>,
	"hemant.agrawal@nxp.com" <hemant.agrawal@nxp.com>,
	"chaozhu@linux.vnet.ibm.com" <chaozhu@linux.vnet.ibm.com>,
	"yipeng1.wang@intel.com" <yipeng1.wang@intel.com>,
	"dharmik.thakkar@arm.com" <dharmik.thakkar@arm.com>,
	"gavin.hu@arm.com" <gavin.hu@arm.com>, "nd@arm.com" <nd@arm.com>
Subject: Re: [PATCH 3/4] hash: remove memory orderings from rw-lock lookup fns
Date: Sat, 10 Nov 2018 08:51:29 +0000	[thread overview]
Message-ID: <20181110085100.GA14682@jerin> (raw)
In-Reply-To: <20181109163917.16845-4-honnappa.nagarahalli@arm.com>

-----Original Message-----
> Date: Fri, 9 Nov 2018 10:39:16 -0600
> From: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
> To: bruce.richardson@intel.com, pablo.de.lara.guarch@intel.com
> CC: dev@dpdk.org, jerin.jacob@caviumnetworks.com, hemant.agrawal@nxp.com,
>  chaozhu@linux.vnet.ibm.com, yipeng1.wang@intel.com,
>  dharmik.thakkar@arm.com, gavin.hu@arm.com, honnappa.nagarahalli@arm.com,
>  nd@arm.com
> Subject: [PATCH 3/4] hash: remove memory orderings from rw-lock lookup fns
> X-Mailer: git-send-email 2.17.1
> 
> 
> Remove the memory orderings from lookup functions using
> rw-lock.
> This is an intermediate commit meant to ease the
> review process.
> 
> Fixes: e605a1d36 ("hash: add lock-free r/w concurrency")
> Cc: honnappa.nagarahalli@arm.com
> 
> Suggested-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>
> Signed-off-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
> Reviewed-by: Ola Liljedahl <ola.liljedahl@arm.com>
> Reviewed-by: Gavin Hu <gavin.hu@arm.com>
> ---
>  lib/librte_hash/rte_cuckoo_hash.c | 277 +++++++++++-------------------
>  1 file changed, 105 insertions(+), 172 deletions(-)
> 
> diff --git a/lib/librte_hash/rte_cuckoo_hash.c b/lib/librte_hash/rte_cuckoo_hash.c
> index e6b84c6bc..9390dc5e4 100644
> --- a/lib/librte_hash/rte_cuckoo_hash.c
> +++ b/lib/librte_hash/rte_cuckoo_hash.c
> @@ -1135,27 +1135,22 @@ search_one_bucket(const struct rte_hash *h, const void *key, uint16_t sig,
>                         void **data, const struct rte_hash_bucket *bkt)
>  {
>         int i;
> -       uint32_t key_idx;
> -       void *pdata;
>         struct rte_hash_key *k, *keys = h->key_store;
> 
>         for (i = 0; i < RTE_HASH_BUCKET_ENTRIES; i++) {
> -               key_idx = __atomic_load_n(&bkt->key_idx[i],
> -                                         __ATOMIC_ACQUIRE);
> -               if (bkt->sig_current[i] == sig && key_idx != EMPTY_SLOT) {
> +               if (bkt->sig_current[i] == sig &&
> +                               bkt->key_idx[i] != EMPTY_SLOT) {
>                         k = (struct rte_hash_key *) ((char *)keys +
> -                                       key_idx * h->key_entry_size);
> -                       pdata = __atomic_load_n(&k->pdata,
> -                                       __ATOMIC_ACQUIRE);
> +                                       bkt->key_idx[i] * h->key_entry_size);
> 
>                         if (rte_hash_cmp_eq(key, k->key, h) == 0) {
>                                 if (data != NULL)
> -                                       *data = pdata;
> +                                       *data = k->pdata;
>                                 /*
>                                  * Return index where key is stored,
>                                  * subtracting the first dummy index
>                                  */
> -                               return key_idx - 1;
> +                               return bkt->key_idx[i] - 1;
>                         }
>                 }
>         }
> @@ -1201,7 +1196,6 @@ __rte_hash_lookup_with_hash(const struct rte_hash *h, const void *key,
>  {
>         uint32_t prim_bucket_idx, sec_bucket_idx;
>         struct rte_hash_bucket *bkt, *cur_bkt;
> -       uint32_t cnt_b, cnt_a;
>         int ret;
>         uint16_t short_sig;
> 
> @@ -1211,49 +1205,25 @@ __rte_hash_lookup_with_hash(const struct rte_hash *h, const void *key,
> 
>         __hash_rw_reader_lock(h);
> 
> -       do {
> -               /* Load the table change counter before the lookup
> -                * starts. Acquire semantics will make sure that
> -                * loads in search_one_bucket are not hoisted.
> -                */
> -               cnt_b = __atomic_load_n(h->tbl_chng_cnt,
> -                               __ATOMIC_ACQUIRE);
> +       /* Check if key is in primary location */
> +       bkt = &h->buckets[prim_bucket_idx];


In original version, this bkt assignment is before to __hash_rw_reader_lock().
This causing performance issue in lookup 'hit' case.

Following change is fixing it.i.e bringing back to orginal version.

[master]83xx1.2[dpdk]# git diff
diff --git a/lib/librte_hash/rte_cuckoo_hash.c
b/lib/librte_hash/rte_cuckoo_hash.c
index 7e1a9ac96..bc8a55f0f 100644
--- a/lib/librte_hash/rte_cuckoo_hash.c
+++ b/lib/librte_hash/rte_cuckoo_hash.c
@@ -1204,10 +1204,11 @@ __rte_hash_lookup_with_hash_l(const struct
rte_hash *h, const void *key,
        prim_bucket_idx = get_prim_bucket_index(h, sig);
        sec_bucket_idx = get_alt_bucket_index(h, prim_bucket_idx,
short_sig);
 
-       __hash_rw_reader_lock(h);
-
        /* Check if key is in primary location */
        bkt = &h->buckets[prim_bucket_idx];
+
+       __hash_rw_reader_lock(h);
+
        ret = search_one_bucket_l(h, key, short_sig, data, bkt);
        if (ret != -1) {
                __hash_rw_reader_unlock(h);


Could you send the final version that needs to taken into tree.
i.e remove intermediate commits only for review purpose.
I can test it finally with that.

  reply	other threads:[~2018-11-10  8:51 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-09 16:39 [PATCH 0/4] hash: separate lf and rw lock lookup code paths Honnappa Nagarahalli
2018-11-09 16:39 ` [PATCH 1/4] hash: prepare for lock-free and rw-lock separation Honnappa Nagarahalli
2018-11-09 16:39 ` [PATCH 2/4] hash: remove rw-lock calls from lock-free functions Honnappa Nagarahalli
2018-11-09 16:39 ` [PATCH 3/4] hash: remove memory orderings from rw-lock lookup fns Honnappa Nagarahalli
2018-11-10  8:51   ` Jerin Jacob [this message]
2018-11-10 18:58     ` Honnappa Nagarahalli
2018-11-09 16:39 ` [PATCH 4/4] hash: separate lf and rw lock lookup code paths Honnappa Nagarahalli
2018-11-10 18:55 ` [PATCH v2 0/1] " Honnappa Nagarahalli
2018-11-10 18:55   ` [PATCH v2 1/1] " Honnappa Nagarahalli
2018-11-11  7:48     ` Jerin Jacob
2018-11-13 16:37       ` Thomas Monjalon
2018-11-11 21:43     ` Wang, Yipeng1
2018-11-12  4:50       ` Honnappa Nagarahalli

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=20181110085100.GA14682@jerin \
    --to=jerin.jacob@caviumnetworks.com \
    --cc=bruce.richardson@intel.com \
    --cc=chaozhu@linux.vnet.ibm.com \
    --cc=dev@dpdk.org \
    --cc=dharmik.thakkar@arm.com \
    --cc=gavin.hu@arm.com \
    --cc=hemant.agrawal@nxp.com \
    --cc=honnappa.nagarahalli@arm.com \
    --cc=nd@arm.com \
    --cc=pablo.de.lara.guarch@intel.com \
    --cc=yipeng1.wang@intel.com \
    /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 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.