From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 42F7B43B57; Tue, 20 Feb 2024 19:59:11 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id CADE4402A7; Tue, 20 Feb 2024 19:59:10 +0100 (CET) Received: from mail-ot1-f50.google.com (mail-ot1-f50.google.com [209.85.210.50]) by mails.dpdk.org (Postfix) with ESMTP id F0DA340289 for ; Tue, 20 Feb 2024 19:59:09 +0100 (CET) Received: by mail-ot1-f50.google.com with SMTP id 46e09a7af769-6e445b4f80bso2094431a34.0 for ; Tue, 20 Feb 2024 10:59:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1708455549; x=1709060349; darn=dpdk.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=zFgxXztjHRXaDJvppeWcXtxLWJxv0yLykkKZjqVvlQ0=; b=Sm8piTwTh7PAHgCmJtRxv/BVAurEVPpH3209po2DLzxK64qLo+g6mMQYpx31Wix3l6 GdpwwvFXHOaznvo31a9bu1rKgXS2w080gmcXcfHemJlXlxpY6yJN0n4SrIzSqr8gICuh p+2d56dOJXqhTe0x9MeUb1uiAJNQoXefgnfJotNLPmilCIDWocv9zK+Kic/X9g9IEuuV QAdhuHz9umeTOYVuO3ctTIkU4zmETtibWpBlV9KO/Te8T6ZZo3/fx4dkKleLWSccsoJa NSlfPmmlyhyNWRFKSyjA6c4JOPYEFRQj6KcRrvm/rQ7y6nq1TxUgucCtpc1LdEI9nbve M5/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708455549; x=1709060349; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=zFgxXztjHRXaDJvppeWcXtxLWJxv0yLykkKZjqVvlQ0=; b=fv/E/Jsx6LGXLIMKb5dy63+GQaLVwoSC9MPQ3qRhJmps6m7GCL5uXyaXPCuar8R5UO 6QBy6mULpk/2rUMDZgOLXJ8+Df2i+b9PwcTX/DvQjR6N2rIuBa5jgF+xouWMX8azsb+n kByXw3oRTKBpHHhNTzvl6va7jEwXum+zDEz7VHNK2NzoVf5zIa8l6N8C6O056PCua0S/ fsjwOLVyW6MQ7Yk1tKgPH4cITkU3hRLsw+RQnIRC3Yayp3L5wCR5WMv6vgHoSEzfHuFE pHYTot6GvrZZxmzm74qsC0tKRXgaRhr6gpgcXgIxfwf24pCJ+fDCT8MfET6h1HD8IEjc xnZg== X-Forwarded-Encrypted: i=1; AJvYcCVSBxq0LRXINFlg99yFYGs/BUF6PbB6neb/KdS2FcvbRNbXRet5F/BfJkSz7jz0qD12UXBxds8W77hBL6U= X-Gm-Message-State: AOJu0YwDFYEbXHFzeeoTHV+bRhBfeayRyc4snakIaVaw2ySybnvFKzqW /VYlLsMcB8SFw8MIlI5PdMrMn0GP55SEh0ksjQuXUat/ogYnCLKt+vw1Wj2ijVZhp2UhCfc5rpW NoC0QRbDMCTLxkdZWJY0yxoreCaE= X-Google-Smtp-Source: AGHT+IGcO36Bn4r/f7ccopLBxK7cKn70yuToo2uwGnd2rYOayFaP8pDy2FzhJtta2YRyeY6d++Y0jCfQkUpmPLLhJgg= X-Received: by 2002:a05:6870:659f:b0:21e:dd7a:2d3e with SMTP id fp31-20020a056870659f00b0021edd7a2d3emr7199192oab.22.1708455547798; Tue, 20 Feb 2024 10:59:07 -0800 (PST) MIME-Version: 1.0 References: <20240207153340.34146-1-aomeryamac@gmail.com> <4CC50196-1F8F-40E2-8280-261783FDCFC8@arm.com> In-Reply-To: <4CC50196-1F8F-40E2-8280-261783FDCFC8@arm.com> From: =?UTF-8?B?QWJkdWxsYWggw5ZtZXIgWWFtYcOn?= Date: Tue, 20 Feb 2024 21:58:57 +0300 Message-ID: Subject: Re: [PATCH] lib/hash,lib/rcu: feature hidden key count in hash To: Honnappa Nagarahalli Cc: "Medvedkin, Vladimir" , "dev@dpdk.org" , Yipeng Wang , Sameh Gobriel , Bruce Richardson , "thomas@monjalon.net" , nd Content-Type: multipart/alternative; boundary="0000000000000a8c1a0611d4ce10" X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org --0000000000000a8c1a0611d4ce10 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable I appreciate that you gave me suggestions and comments. I will make changes according to all your recommendations, but before that, I want to make everyone's minds clear. Then, I will apply modifications. On Tue, Feb 20, 2024 at 2:35=E2=80=AFAM Honnappa Nagarahalli < Honnappa.Nagarahalli@arm.com> wrote: > > > > On Feb 19, 2024, at 3:28=E2=80=AFPM, Abdullah =C3=96mer Yama=C3=A7 > wrote: > > > > Hello, > > > > Let me explain a use case; > > > > I have a hash table whose key value is IP addresses, and data (let's sa= y > the username of the IP) is related to the IP address. The key point is > matching these data with flows. Flows are dynamic, and this hash table is > dynamic, as well; both can change anytime. For example, when a flow start= s, > we look up the hash table with the corresponding IP and retrieve the > username. We need to hold this username until the flow terminates, althou= gh > we removed this IP key from the hash table (multithread). That's why we > have RCU and defer queue is necessary for high performance. In my > application, I need to know the number of IP-username entries. These > numbers can be calculated by rte_hash_count - defer queue size. > The entries in the defer queue are not reclaimed (there is a probability > that all of them can be reclaimed) and hence they are not available for > allocation. So, rte_hash_count - defer queue size might not give you the > correct number you are expecting. > > Currently, there is no API in hash library that forces a reclaim. Does it > makes sense to have an API that just does the reclaim (and returns the > number of entries pending in the defer queue)? A call to rte_hash_count > should provide the exact count you are looking for. You are right; no API in the hash library forces a reclaim. In my application, I periodically call rte_count to retrieve hash size, and this data is shown in my GUI. So that means I need to call regularly reclaim. I am trying to figure out which is better, calling reclaim or retrieving the defer queue size. Any comment about this? > > > > I think if you need a non-blocking and multithreaded hash table, an > RCU-enabled hash table is necessary. Also, this API is necessary if you > need to get the actual matchable size. > > > > > > > > > > > > On Mon, Feb 19, 2024 at 8:36=E2=80=AFPM Medvedkin, Vladimir < > vladimir.medvedkin@intel.com> wrote: > > Hi Abdullah, > > > > Could you please tell more about use cases where this API may be useful= ? > > > > >a new API to get the hidden key count in the hash table if the rcu qsb= r > is enabled > > > > Here in commit message and down below in doxygen comments, I think this > > statement should be more specific because rcu can be created with > > RTE_HASH_QSBR_MODE_SYNC mode i.e. without defer queue. > > > > Also, new API must be reflected in release notes > > > > On 07/02/2024 15:33, Abdullah =C3=96mer Yama=C3=A7 wrote: > > > This patch introduce a new API to get the hidden key count in the has= h > > > table if the rcu qsbr is enabled. When using rte_hash_count with rcu > > > qsbr enabled, it will return the number of elements that are not in t= he > > > free queue. Unless rte_rcu_qsbr_dq_reclaim is called, the number of > > > elements in the defer queue will not be counted and freed. Therefore = I > > > added a new API to get the number of hidden (defer queue) elements > > > in the hash table. Then the user can calculate the total number of > > > elements that are available in the hash table. > > > > > > Signed-off-by: Abdullah =C3=96mer Yama=C3=A7 > > > > > > --- > > > Cc: Honnappa Nagarahalli > > > Cc: Yipeng Wang > > > Cc: Sameh Gobriel > > > Cc: Bruce Richardson > > > Cc: Vladimir Medvedkin > > > --- > > > lib/hash/rte_cuckoo_hash.c | 9 +++++++++ > > > lib/hash/rte_hash.h | 13 +++++++++++++ > > > lib/hash/version.map | 1 + > > > lib/rcu/rte_rcu_qsbr.c | 8 ++++++++ > > > lib/rcu/rte_rcu_qsbr.h | 11 +++++++++++ > > > lib/rcu/version.map | 1 + > > > 6 files changed, 43 insertions(+) > > > > > > diff --git a/lib/hash/rte_cuckoo_hash.c b/lib/hash/rte_cuckoo_hash.c > > > index 70456754c4..3553f3efc7 100644 > > > --- a/lib/hash/rte_cuckoo_hash.c > > > +++ b/lib/hash/rte_cuckoo_hash.c > > > @@ -555,6 +555,15 @@ rte_hash_max_key_id(const struct rte_hash *h) > > > return h->entries; > > > } > > > > > > +int32_t > > > +rte_hash_dq_count(const struct rte_hash *h) > > > +{ > > > + if (h->dq =3D=3D NULL) > > input arguments must be checked since this is a public API, the same is > > true for rte_rcu_qsbr_dq_count() > > > + return -EINVAL; > > why not just return 0? > > > + > > > + return rte_rcu_qsbr_dq_count(h->dq); > > > +} > > > + > > > int32_t > > > rte_hash_count(const struct rte_hash *h) > > > { > > > diff --git a/lib/hash/rte_hash.h b/lib/hash/rte_hash.h > > > index 7ecc021111..8ea97e297d 100644 > > > --- a/lib/hash/rte_hash.h > > > +++ b/lib/hash/rte_hash.h > > > @@ -193,6 +193,19 @@ rte_hash_free(struct rte_hash *h); > > > void > > > rte_hash_reset(struct rte_hash *h); > > > > > > + > > > +/** > > > + * Return the number of records in the defer queue of the hash table > > > + * if RCU is enabled. > > > + * @param h > > > + * Hash table to query from > > > + * @return > > > + * - -EINVAL if parameters are invalid > > > + * - A value indicating how many records were inserted in the tabl= e. > > did you mean how many records are kept in defer queue? > > > + */ > > > +int32_t > > > +rte_hash_dq_count(const struct rte_hash *h); > > > + > > > /** > > > * Return the number of keys in the hash table > > > * @param h > > > diff --git a/lib/hash/version.map b/lib/hash/version.map > > > index 6b2afebf6b..7f7b158cf1 100644 > > > --- a/lib/hash/version.map > > > +++ b/lib/hash/version.map > > > @@ -9,6 +9,7 @@ DPDK_24 { > > > rte_hash_add_key_with_hash; > > > rte_hash_add_key_with_hash_data; > > > rte_hash_count; > > > + rte_hash_dq_count; > > new API must introduced as an experimental API. The same is true for > > rte_rcu_qsbr_dq_count() > > > rte_hash_crc32_alg; > > > rte_hash_crc_set_alg; > > > rte_hash_create; > > > diff --git a/lib/rcu/rte_rcu_qsbr.c b/lib/rcu/rte_rcu_qsbr.c > > > index bd0b83be0c..89f8da4c4c 100644 > > > --- a/lib/rcu/rte_rcu_qsbr.c > > > +++ b/lib/rcu/rte_rcu_qsbr.c > > > @@ -450,6 +450,14 @@ rte_rcu_qsbr_dq_reclaim(struct rte_rcu_qsbr_dq > *dq, unsigned int n, > > > return 0; > > > } > > > > > > +/** > > > + * Return the number of entries in a defer queue. > > > + */ > > > +unsigned int rte_rcu_qsbr_dq_count(struct rte_rcu_qsbr_dq *dq) > > > +{ > Please validate dq here. > > > > + return rte_ring_count(dq->r); > > > +} > > > + > > > /* Delete a defer queue. */ > > > int > > > rte_rcu_qsbr_dq_delete(struct rte_rcu_qsbr_dq *dq) > > > diff --git a/lib/rcu/rte_rcu_qsbr.h b/lib/rcu/rte_rcu_qsbr.h > > > index 23c9f89805..ed5a590edd 100644 > > > --- a/lib/rcu/rte_rcu_qsbr.h > > > +++ b/lib/rcu/rte_rcu_qsbr.h > > > @@ -794,6 +794,17 @@ int > > > rte_rcu_qsbr_dq_reclaim(struct rte_rcu_qsbr_dq *dq, unsigned int n, > > > unsigned int *freed, unsigned int *pending, unsigned int > *available); > > > > > > +/** > > > + * Return the number of entries in a defer queue. > > > + * > > > + * @param dq > > > + * Defer queue. > > > + * @return > > > + * The number of entries in the defer queue. > > > + */ > > > +unsigned int > > > +rte_rcu_qsbr_dq_count(struct rte_rcu_qsbr_dq *dq); > Agree on the need for this API in RCU > > > > + > > > /** > > > * Delete a defer queue. > > > * > > > diff --git a/lib/rcu/version.map b/lib/rcu/version.map > > > index 982ffd59d9..f410ab41e7 100644 > > > --- a/lib/rcu/version.map > > > +++ b/lib/rcu/version.map > > > @@ -5,6 +5,7 @@ DPDK_24 { > > > rte_rcu_qsbr_dq_create; > > > rte_rcu_qsbr_dq_delete; > > > rte_rcu_qsbr_dq_enqueue; > > > + rte_rcu_qsbr_dq_count; > > > rte_rcu_qsbr_dq_reclaim; > > > rte_rcu_qsbr_dump; > > > rte_rcu_qsbr_get_memsize; > > > > -- > > Regards, > > Vladimir > > > > --0000000000000a8c1a0611d4ce10 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
I appreciate=C2=A0that you gave me suggestions and co= mments. I will make changes according to all your recommendations, but befo= re that, I want to make everyone's minds clear. Then, I will apply modi= fications.=C2=A0

On Tue, Feb 20, 2024 at 2:35=E2=80=AFAM Honnappa Nagarahall= i <Honnappa.Nagarahalli@= arm.com> wrote:


> On Feb 19, 2024, at 3:28=E2=80=AFPM, Abdullah =C3=96mer Yama=C3=A7 <= ;aomeryamac@gmail= .com> wrote:
>
> Hello,
>
> Let me explain a use case;
>
> I have a hash table whose key value is IP addresses, and data (let'= ;s say the username of the IP) is related to the IP address. The key point = is matching these data with flows. Flows are dynamic, and this hash table i= s dynamic, as well; both can change anytime. For example, when a flow start= s, we look up the hash table with the corresponding IP and retrieve the use= rname. We need to hold this username until the flow terminates, although we= removed this IP key from the hash table (multithread). That's why we h= ave RCU and defer queue is necessary for high performance. In my applicatio= n, I need to know the number of IP-username entries. These numbers can be c= alculated by rte_hash_count - defer queue size.
The entries in the defer queue are not reclaimed (there is a probability th= at all of them can be reclaimed) and hence they are not available for alloc= ation. So, rte_hash_count - defer queue size might not give you the correct= number you are expecting.

Currently, there is no API in hash library that forces a reclaim. Does it m= akes sense to have an API that just does the reclaim (and returns the numbe= r of entries pending in the defer queue)? A call to rte_hash_count should p= rovide the exact count you are looking for.
You are right;= no API in the hash library forces a reclaim. In my application, I periodic= ally call rte_count to retrieve hash size, and this data is shown in my GUI= . So that means I need to call regularly reclaim. I am trying to figure out= which is better, calling reclaim or retrieving the defer queue=C2=A0size. = Any comment about this?
>
> I think if you need a non-blocking and multithreaded hash table, an RC= U-enabled hash table is necessary. Also, this API is necessary if you need = to get the actual matchable size.
>
>
>
>
>
> On Mon, Feb 19, 2024 at 8:36=E2=80=AFPM Medvedkin, Vladimir <vladimir.medved= kin@intel.com> wrote:
> Hi Abdullah,
>
> Could you please tell more about use cases where this API may be usefu= l?
>
> >a new API to get the hidden key count in the hash table if the rcu= qsbr is enabled
>
> Here in commit message and down below in doxygen comments, I think thi= s
> statement should be more specific because rcu can be created with
> RTE_HASH_QSBR_MODE_SYNC mode i.e. without defer queue.
>
> Also, new API must be reflected in release notes
>
> On 07/02/2024 15:33, Abdullah =C3=96mer Yama=C3=A7 wrote:
> > This patch introduce a new API to get the hidden key count in the= hash
> > table if the rcu qsbr is enabled. When using rte_hash_count with = rcu
> > qsbr enabled, it will return the number of elements that are not = in the
> > free queue. Unless rte_rcu_qsbr_dq_reclaim is called, the number = of
> > elements in the defer queue will not be counted and freed. Theref= ore I
> > added a new API to get the number of hidden (defer queue) element= s
> > in the hash table. Then the user can calculate the total number o= f
> > elements that are available in the hash table.
> >
> > Signed-off-by: Abdullah =C3=96mer Yama=C3=A7 <aomeryamac@gmail.com>
> >
> > ---
> > Cc: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
> > Cc: Yipeng Wang <yipeng1.wang@intel.com>
> > Cc: Sameh Gobriel <sameh.gobriel@intel.com>
> > Cc: Bruce Richardson <bruce.richardson@intel.com>
> > Cc: Vladimir Medvedkin <vladimir.medvedkin@intel.com>
> > ---
> >=C2=A0 =C2=A0lib/hash/rte_cuckoo_hash.c |=C2=A0 9 +++++++++
> >=C2=A0 =C2=A0lib/hash/rte_hash.h=C2=A0 =C2=A0 =C2=A0 =C2=A0 | 13 += ++++++++++++
> >=C2=A0 =C2=A0lib/hash/version.map=C2=A0 =C2=A0 =C2=A0 =C2=A0|=C2= =A0 1 +
> >=C2=A0 =C2=A0lib/rcu/rte_rcu_qsbr.c=C2=A0 =C2=A0 =C2=A0|=C2=A0 8 += +++++++
> >=C2=A0 =C2=A0lib/rcu/rte_rcu_qsbr.h=C2=A0 =C2=A0 =C2=A0| 11 ++++++= +++++
> >=C2=A0 =C2=A0lib/rcu/version.map=C2=A0 =C2=A0 =C2=A0 =C2=A0 |=C2= =A0 1 +
> >=C2=A0 =C2=A06 files changed, 43 insertions(+)
> >
> > diff --git a/lib/hash/rte_cuckoo_hash.c b/lib/hash/rte_cuckoo_has= h.c
> > index 70456754c4..3553f3efc7 100644
> > --- a/lib/hash/rte_cuckoo_hash.c
> > +++ b/lib/hash/rte_cuckoo_hash.c
> > @@ -555,6 +555,15 @@ rte_hash_max_key_id(const struct rte_hash *h= )
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return h-&g= t;entries;
> >=C2=A0 =C2=A0}
> >=C2=A0 =C2=A0
> > +int32_t
> > +rte_hash_dq_count(const struct rte_hash *h)
> > +{
> > +=C2=A0 =C2=A0 =C2=A0if (h->dq =3D=3D NULL)
> input arguments must be checked since this is a public API, the same i= s
> true for rte_rcu_qsbr_dq_count()
> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return -EINVAL;<= br> > why not just return 0?
> > +
> > +=C2=A0 =C2=A0 =C2=A0return rte_rcu_qsbr_dq_count(h->dq);
> > +}
> > +
> >=C2=A0 =C2=A0int32_t
> >=C2=A0 =C2=A0rte_hash_count(const struct rte_hash *h)
> >=C2=A0 =C2=A0{
> > diff --git a/lib/hash/rte_hash.h b/lib/hash/rte_hash.h
> > index 7ecc021111..8ea97e297d 100644
> > --- a/lib/hash/rte_hash.h
> > +++ b/lib/hash/rte_hash.h
> > @@ -193,6 +193,19 @@ rte_hash_free(struct rte_hash *h);
> >=C2=A0 =C2=A0void
> >=C2=A0 =C2=A0rte_hash_reset(struct rte_hash *h);
> >=C2=A0 =C2=A0
> > +
> > +/**
> > + * Return the number of records in the defer queue of the hash t= able
> > + * if RCU is enabled.
> > + * @param h
> > + *=C2=A0 Hash table to query from
> > + * @return
> > + *=C2=A0 =C2=A0- -EINVAL if parameters are invalid
> > + *=C2=A0 =C2=A0- A value indicating how many records were insert= ed in the table.
> did you mean how many records are kept in defer queue?
> > + */
> > +int32_t
> > +rte_hash_dq_count(const struct rte_hash *h);
> > +
> >=C2=A0 =C2=A0/**
> >=C2=A0 =C2=A0 * Return the number of keys in the hash table
> >=C2=A0 =C2=A0 * @param h
> > diff --git a/lib/hash/version.map b/lib/hash/version.map
> > index 6b2afebf6b..7f7b158cf1 100644
> > --- a/lib/hash/version.map
> > +++ b/lib/hash/version.map
> > @@ -9,6 +9,7 @@ DPDK_24 {
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0rte_hash_add_key_with_hash;
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0rte_hash_add_key_with_hash_data;
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0rte_hash_count;
> > +=C2=A0 =C2=A0 =C2=A0rte_hash_dq_count;
> new API must introduced as an experimental API. The same is true for <= br> > rte_rcu_qsbr_dq_count()
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0rte_hash_crc32_alg;
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0rte_hash_crc_set_alg;
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0rte_hash_create;
> > diff --git a/lib/rcu/rte_rcu_qsbr.c b/lib/rcu/rte_rcu_qsbr.c
> > index bd0b83be0c..89f8da4c4c 100644
> > --- a/lib/rcu/rte_rcu_qsbr.c
> > +++ b/lib/rcu/rte_rcu_qsbr.c
> > @@ -450,6 +450,14 @@ rte_rcu_qsbr_dq_reclaim(struct rte_rcu_qsbr_= dq *dq, unsigned int n,
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0return 0;
> >=C2=A0 =C2=A0}
> >=C2=A0 =C2=A0
> > +/**
> > + * Return the number of entries in a defer queue.
> > + */
> > +unsigned int rte_rcu_qsbr_dq_count(struct rte_rcu_qsbr_dq *dq) > > +{
Please validate dq here.

> > +=C2=A0 =C2=A0 =C2=A0return rte_ring_count(dq->r);
> > +}
> > +
> >=C2=A0 =C2=A0/* Delete a defer queue. */
> >=C2=A0 =C2=A0int
> >=C2=A0 =C2=A0rte_rcu_qsbr_dq_delete(struct rte_rcu_qsbr_dq *dq) > > diff --git a/lib/rcu/rte_rcu_qsbr.h b/lib/rcu/rte_rcu_qsbr.h
> > index 23c9f89805..ed5a590edd 100644
> > --- a/lib/rcu/rte_rcu_qsbr.h
> > +++ b/lib/rcu/rte_rcu_qsbr.h
> > @@ -794,6 +794,17 @@ int
> >=C2=A0 =C2=A0rte_rcu_qsbr_dq_reclaim(struct rte_rcu_qsbr_dq *dq, u= nsigned int n,
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0unsigned int *freed, unsigned int *pend= ing, unsigned int *available);
> >=C2=A0 =C2=A0
> > +/**
> > + * Return the number of entries in a defer queue.
> > + *
> > + * @param dq
> > + *=C2=A0 =C2=A0Defer queue.
> > + * @return
> > + *=C2=A0 =C2=A0The number of entries in the defer queue.
> > + */
> > +unsigned int
> > +rte_rcu_qsbr_dq_count(struct rte_rcu_qsbr_dq *dq);
Agree on the need for this API in RCU

> > +
> >=C2=A0 =C2=A0/**
> >=C2=A0 =C2=A0 * Delete a defer queue.
> >=C2=A0 =C2=A0 *
> > diff --git a/lib/rcu/version.map b/lib/rcu/version.map
> > index 982ffd59d9..f410ab41e7 100644
> > --- a/lib/rcu/version.map
> > +++ b/lib/rcu/version.map
> > @@ -5,6 +5,7 @@ DPDK_24 {
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0rte_rcu_qsbr_dq_create;
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0rte_rcu_qsbr_dq_delete;
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0rte_rcu_qsbr_dq_enqueue;
> > +=C2=A0 =C2=A0 =C2=A0rte_rcu_qsbr_dq_count;
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0rte_rcu_qsbr_dq_reclaim;
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0rte_rcu_qsbr_dump;
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0rte_rcu_qsbr_get_memsize;
>
> --
> Regards,
> Vladimir
>

--0000000000000a8c1a0611d4ce10--