DPDK patches and discussions
 help / color / Atom feed
From: "Gavin Hu (Arm Technology China)" <Gavin.Hu@arm.com>
To: Honnappa Nagarahalli <Honnappa.Nagarahalli@arm.com>,
	Morten Brørup <mb@smartsharesystems.com>,
	"Joyce Kong (Arm Technology China)" <Joyce.Kong@arm.com>,
	"dev@dpdk.org" <dev@dpdk.org>
Cc: nd <nd@arm.com>, "thomas@monjalon.net" <thomas@monjalon.net>,
	"jerinj@marvell.com" <jerinj@marvell.com>,
	"ravi1.kumar@amd.com" <ravi1.kumar@amd.com>,
	"xuanziyang2@huawei.com" <xuanziyang2@huawei.com>,
	"cloud.wangxiaoyun@huawei.com" <cloud.wangxiaoyun@huawei.com>,
	"zhouguoyang@huawei.com" <zhouguoyang@huawei.com>,
	"rmody@marvell.com" <rmody@marvell.com>,
	"shshaikh@marvell.com" <shshaikh@marvell.com>,
	Stephen Hemminger <stephen@networkplumber.org>, nd <nd@arm.com>,
	nd <nd@arm.com>
Subject: Re: [dpdk-dev] [PATCH v1 1/5] lib/eal: implement the family of rte bitoperation APIs
Date: Sun, 3 Nov 2019 15:45:24 +0000
Message-ID: <VI1PR08MB53765529473CDC821F5A37E38F7C0@VI1PR08MB5376.eurprd08.prod.outlook.com> (raw)
In-Reply-To: <VE1PR08MB5149DCE6018A70FE6937CBAC98620@VE1PR08MB5149.eurprd08.prod.outlook.com>

Hi Honnappa,
> -----Original Message-----
> From: Honnappa Nagarahalli <Honnappa.Nagarahalli@arm.com>
> Sent: Friday, November 1, 2019 9:48 PM
> To: Gavin Hu (Arm Technology China) <Gavin.Hu@arm.com>; Morten
> Brørup <mb@smartsharesystems.com>; Joyce Kong (Arm Technology China)
> <Joyce.Kong@arm.com>; dev@dpdk.org
> Cc: nd <nd@arm.com>; thomas@monjalon.net; jerinj@marvell.com;
> ravi1.kumar@amd.com; xuanziyang2@huawei.com;
> cloud.wangxiaoyun@huawei.com; zhouguoyang@huawei.com;
> rmody@marvell.com; shshaikh@marvell.com; Stephen Hemminger
> <stephen@networkplumber.org>; Honnappa Nagarahalli
> <Honnappa.Nagarahalli@arm.com>; nd <nd@arm.com>
> Subject: RE: [dpdk-dev] [PATCH v1 1/5] lib/eal: implement the family of rte
> bitoperation APIs
> 
> > >
> > > >
> > > > > -----Original Message-----
> > > > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Joyce Kong
> > > (Arm
> > > > > Technology China)
> > > > > Sent: Wednesday, October 23, 2019 5:08 AM
> > > > >
> > > > > > > > -----Original Message-----
> > > > > > > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Joyce
> > > Kong
> > > > > > > > Sent: Tuesday, October 15, 2019 9:50 AM
> > > > > > > >
> > > > > > > > There are a lot functions of bit operations scattered and
> > > > > duplicated
> > > > > > > > in PMDs, consolidating them into a common API family is
> > > > > necessary.
> > > > > > > > Furthermore, the bit operation is mostly applied to the IO
> > > > > devices,
> > > > > > > > so use __ATOMIC_ACQ_REL to ensure the ordering.
> > > > > > >
> > > > > > > Good initiative.
> > > > > > >
> > > > > > > >
> > > > > > > > Signed-off-by: Joyce Kong <joyce.kong@arm.com>
> > > > > > > > ---
> > > > > > > >  lib/librte_eal/common/Makefile             |  1 +
> > > > > > > >  lib/librte_eal/common/include/rte_bitops.h | 56
> > > > > > > > ++++++++++++++++++++++++++++++
> > > > > > > >  lib/librte_eal/common/meson.build          |  1 +
> > > > > > > >  3 files changed, 58 insertions(+)  create mode 100644
> > > > > > > > lib/librte_eal/common/include/rte_bitops.h
> > > > > > > >
> > > > > > > > diff --git a/lib/librte_eal/common/Makefile
> > > > > > > > b/lib/librte_eal/common/Makefile index a00d4fc..8586ca8
> > > > > > > > 100644
> > > > > > > > --- a/lib/librte_eal/common/Makefile
> > > > > > > > +++ b/lib/librte_eal/common/Makefile
> > > > > > > > @@ -18,6 +18,7 @@ INC += rte_malloc.h rte_keepalive.h
> > > rte_time.h
> > > > > > > > INC
> > > > > > > > += rte_service.h rte_service_component.h  INC +=
> > > > > > > > +rte_bitmap.h
> > > > > > > > rte_vfio.h rte_hypervisor.h rte_test.h  INC +=
> > > > > > > > rte_reciprocal.h rte_fbarray.h rte_uuid.h
> > > > > > > > +INC += rte_bitops.h
> > > > > > > >
> > > > > > > >  GENERIC_INC := rte_atomic.h rte_byteorder.h rte_cycles.h
> > > > > > > > rte_prefetch.h  GENERIC_INC += rte_memcpy.h rte_cpuflags.h
> > > > > > > > diff --git a/lib/librte_eal/common/include/rte_bitops.h
> > > > > > > > b/lib/librte_eal/common/include/rte_bitops.h
> > > > > > > > new file mode 100644
> > > > > > > > index 0000000..4d7c5a3
> > > > > > > > --- /dev/null
> > > > > > > > +++ b/lib/librte_eal/common/include/rte_bitops.h
> > > > > > > > @@ -0,0 +1,56 @@
> > > > > > > > +/* SPDX-License-Identifier: BSD-3-Clause
> > > > > > > > + * Copyright(c) 2019 Arm Corporation  */
> > > > > > > > +
> > > > > > > > +#ifndef _RTE_BITOPS_H_
> > > > > > > > +#define _RTE_BITOPS_H_
> > > > > > > > +
> > > > > > > > +/**
> > > > > > > > + * @file
> > > > > > > > + * Bit Operations
> > > > > > > > + *
> > > > > > > > + * This file defines a generic API for bit operations.
> > > > > > > > + */
> > > > > > > > +
> > > > > > > > +#include <stdint.h>
> > > > > > > > +#include <rte_atomic.h>
> > > > > > > > +
> > > > > > > > +static inline void
> > > > > > > > +rte_set_bit(unsigned int nr, unsigned long *addr) {
> > > > > > > > +__atomic_fetch_or(addr, (1UL << nr), __ATOMIC_ACQ_REL); }
> > > > > > > > +
> > > > > > > > +static inline void
> > > > > > > > +rte_clear_bit(int nr, unsigned long *addr) {
> > > > > > > > +__atomic_fetch_and(addr, ~(1UL << nr),
> > > > __ATOMIC_ACQ_REL); }
> > > > > > > > +
> > > > > > > > +static inline int
> > > > > > > > +rte_test_bit(int nr, unsigned long *addr) { int res;
> > > > > > > > +rte_mb(); res = ((*addr) & (1UL << nr)) != 0; rte_mb();
> > > > > > > > +
> > > > > > > > +return res;
> > > > > > > > +}
> > > > > > >
> > > > > > > Why does rte_test_bit() not use any of the __atomic_xx
> > > > > > > functions
> > > > > instead?
> > > > > > > E.g.:
> > > > > > >
> > > > > > > static inline int
> > > > > > > rte_test_bit(int nr, unsigned long *addr) { return
> > > > > > > __atomic_load_n(addr, __ATOMIC_ACQUIRE); }
> > > > > > >
> > > > > > You re right, it's better to use __atomic_xx here to keep the
> > > > > consistent with
> > > > > > other APIs.
> > > > > >
> > > > > > > > +
> > > > > > > > +static inline int
> > > > > > > > +rte_test_and_set_bit(int nr, unsigned long *addr) {
> > > > > > > > +unsigned long mask = (1UL << nr);
> > > > > > > > +
> > > > > > > > +return __atomic_fetch_or(addr, mask, __ATOMIC_ACQ_REL) &
> > > > > > > mask; }
> > > > > > > > +
> > > > > > > > +static inline int
> > > > > > > > +rte_test_and_clear_bit(int nr, unsigned long *addr) {
> > > > > > > > +unsigned long mask = (1UL << nr);
> > > > > > > > +
> > > > > > > > +return __atomic_fetch_and(addr, ~mask, __ATOMIC_ACQ_REL)
> > > > &
> > > > > > > mask; }
> > > > > > > > +#endif /* _RTE_BITOPS_H_ */
> > > > > > > > diff --git a/lib/librte_eal/common/meson.build
> > > > > > > > b/lib/librte_eal/common/meson.build
> > > > > > > > index 386577c..a277cdf 100644
> > > > > > > > --- a/lib/librte_eal/common/meson.build
> > > > > > > > +++ b/lib/librte_eal/common/meson.build
> > > > > > > > @@ -52,6 +52,7 @@ common_headers = files(
> > > > > > > > 'include/rte_alarm.h',  'include/rte_branch_prediction.h',
> > > > > > > >  'include/rte_bus.h',
> > > > > > > > +'include/rte_bitops.h',
> > > > > > > >  'include/rte_bitmap.h',
> > > > > > > >  'include/rte_class.h',
> > > > > > > >  'include/rte_common.h',
> > > > > > > > --
> > > > > > > > 2.7.4
> > > > > > > >
> > > > > > >
> > > > > > > These functions use unsigned long as the type of their value,
> > > > > > > like they do in the PMDs.
> > > > > > >
> > > > > > > However, a generic bit operations library should preferably
> > > > > > > work
> > > > > with
> > > > > > > multiple types, like the __atomic_xx functions. Or use an well
> > > > > defined
> > > > > > > uint_NN_t type. Or have individually named functions for each
> > > > > > > type
> > > > > size,
> > > > > > e.g.
> > > > > > > rte_set_bit_32() and rte_set_bit_64().
> > > > > > >
> > > > > > Good suggestion! And will do this in next version.
> > > > >
> > > > > The PMDs which use the common API now are all 32bit operation, so
> > > > > change the definition to uint_32_t type instead of individually
> > > > > naming functions for each type size.
> > > >
> > > > Unless you are certain that all current and future I/O devices only
> > > > need 32
> > > bit,
> > > > it should provide variants for different types, like the rte_atomic_xxx
> API.
> > > Why not do these using macros? The __atomic_xxx APIs anyway work
> with
> > > multiple types. Then we do not have to provide variants for all sizes.
> >
> > We really come to the point for the community to give a guideline: how to
> > generalize APIs to support multiple-sized arguments.
> > Looks like macros was disliked by the community, for readability and
> > debuggability reasons.
> IMO, it should not be considered as a blanket ban on using macros. It should
> be considered case by case basis. For ex: I do not see a point in writing the
> same API for 32b/64b/128b especially when the APIs are one liners.
Jerin and Morten have different opinions, they thought the MACRO based scheme only as of the last resort. 
Another argument is the API familiarity(similar to rte io read APIs).
Joyce made a new version and let's see how the community balance the duplication and other considerations. 
/Gavin
> 
> > Besides macros, there are an alternative: _Generic
> > https://gcc.gnu.org/onlinedocs/gccint/GENERIC.html, but it is not
> supported
> > by older gcc(<4.9), this made a hard requirement for gcc/clang.
> >
> > We have to compromise over all these: code duplication, readability and
> > debuggability.
> > /Gavin
> > > >
> > > > There might also be a need to support both big and little endian
> > > > byte
> > > ordering?
> > > > Perhaps the CPU uses a different byte ordering than the I/O device
> > > > being accessed through this API. I don't know; I'm only providing
> > > > half baked
> > > feedback
> > > > on this point.
> > >
> >
> 


  reply index

Thread overview: 107+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-10-15  7:49 [dpdk-dev] [PATCH v1 0/5] implement common rte bit operation APIs in PMDs Joyce Kong
2019-10-15  7:49 ` [dpdk-dev] [PATCH v1 1/5] lib/eal: implement the family of rte bit operation APIs Joyce Kong
2019-10-15 16:53   ` Stephen Hemminger
2019-10-18  9:00     ` Joyce Kong (Arm Technology China)
2019-10-16  7:54   ` Jerin Jacob
2019-10-18  9:02     ` Joyce Kong (Arm Technology China)
2019-10-23  3:12       ` Joyce Kong (Arm Technology China)
2019-10-16 19:05   ` Stephen Hemminger
2019-10-17 13:32   ` [dpdk-dev] [PATCH v1 1/5] lib/eal: implement the family of rte bitoperation APIs Morten Brørup
2019-10-18  8:58     ` Joyce Kong (Arm Technology China)
2019-10-23  3:07       ` Joyce Kong (Arm Technology China)
2019-10-23  7:45         ` Morten Brørup
2019-10-23 17:30           ` Honnappa Nagarahalli
2019-10-24  3:38             ` Gavin Hu (Arm Technology China)
2019-11-01 13:48               ` Honnappa Nagarahalli
2019-11-03 15:45                 ` Gavin Hu (Arm Technology China) [this message]
2019-10-15  7:49 ` [dpdk-dev] [PATCH v1 2/5] net/axgbe: use common rte bit operation APIs instead Joyce Kong
2019-10-15  7:49 ` [dpdk-dev] [PATCH v1 3/5] net/bnx2x: " Joyce Kong
2019-10-15  7:50 ` [dpdk-dev] [PATCH v1 4/5] net/hinic: " Joyce Kong
2019-10-15  7:50 ` [dpdk-dev] [PATCH v1 5/5] net/qede: " Joyce Kong
2019-10-15 16:51 ` [dpdk-dev] [PATCH v1 0/5] implement common rte bit operation APIs in PMDs Stephen Hemminger
2019-10-18  9:01   ` Joyce Kong (Arm Technology China)
2019-10-23  2:54 ` [dpdk-dev] [PATCH v2 0/6] " Joyce Kong
2019-10-25 13:14   ` David Marchand
2019-10-29 16:42   ` Thomas Monjalon
2019-10-30  9:55     ` Gavin Hu (Arm Technology China)
2019-10-30 10:17       ` Thomas Monjalon
2019-10-30 12:32       ` Jerin Jacob
2019-10-30 13:02         ` Morten Brørup
2019-10-31 10:39           ` Gavin Hu (Arm Technology China)
2019-10-23  2:54 ` [dpdk-dev] [PATCH v2 1/6] lib/eal: implement the family of rte bit operation APIs Joyce Kong
2019-10-23  3:09   ` Honnappa Nagarahalli
2019-10-23  4:56   ` Jerin Jacob
2019-10-23  7:46   ` Morten Brørup
2019-10-23  2:54 ` [dpdk-dev] [PATCH v2 2/6] test/iobitops: add io bit operation test case Joyce Kong
2019-10-23  2:54 ` [dpdk-dev] [PATCH v2 3/6] net/axgbe: use common rte bit operation APIs instead Joyce Kong
2019-10-23  3:16   ` Honnappa Nagarahalli
2019-10-23  2:54 ` [dpdk-dev] [PATCH v2 4/6] net/bnx2x: " Joyce Kong
2019-10-23  2:54 ` [dpdk-dev] [PATCH v2 5/6] net/hinic: " Joyce Kong
2019-10-23  2:54 ` [dpdk-dev] [PATCH v2 6/6] net/qede: " Joyce Kong
2019-11-18 10:06 ` [dpdk-dev] [PATCH v3 0/6] implement common rte bit operation APIs in PMDs Joyce Kong
2019-11-18 10:06 ` [dpdk-dev] [PATCH v3 1/6] lib/eal: implement the family of rte bit operation APIs Joyce Kong
2019-11-18 10:52   ` [dpdk-dev] [PATCH v3 1/6] lib/eal: implement the family of rte bitoperation APIs Morten Brørup
2019-11-19  9:22     ` Joyce Kong (Arm Technology China)
2019-11-18 10:06 ` [dpdk-dev] [PATCH v3 2/6] test/bitops: add bit operation test case Joyce Kong
2019-11-18 10:06 ` [dpdk-dev] [PATCH v3 3/6] net/axgbe: use common rte bit operation APIs instead Joyce Kong
2019-11-18 10:06 ` [dpdk-dev] [PATCH v3 4/6] net/bnx2x: " Joyce Kong
2019-11-18 10:06 ` [dpdk-dev] [PATCH v3 5/6] net/qede: " Joyce Kong
2019-11-18 10:06 ` [dpdk-dev] [PATCH v3 6/6] net/hinic: " Joyce Kong
2019-11-20 10:12 ` [dpdk-dev] [PATCH v4 0/6] implement common rte bit operation APIs in PMDs Joyce Kong
2019-11-20 10:12 ` [dpdk-dev] [PATCH v4 1/6] lib/eal: implement the family of rte bit operation APIs Joyce Kong
2019-11-20 13:40   ` [dpdk-dev] [PATCH v4 1/6] lib/eal: implement the family of rte bitoperation APIs Morten Brørup
2019-11-20 10:12 ` [dpdk-dev] [PATCH v4 2/6] test/bitops: add bit operation test case Joyce Kong
2019-11-20 10:12 ` [dpdk-dev] [PATCH v4 3/6] net/axgbe: use common rte bit operation APIs instead Joyce Kong
2019-11-20 10:12 ` [dpdk-dev] [PATCH v4 4/6] net/bnx2x: " Joyce Kong
2019-11-20 10:12 ` [dpdk-dev] [PATCH v4 5/6] net/qede: " Joyce Kong
2019-11-20 10:12 ` [dpdk-dev] [PATCH v4 6/6] net/hinic: " Joyce Kong
2019-11-28  6:44 ` [dpdk-dev] [PATCH v5 0/6] implement common rte bit operation APIs in PMDs Joyce Kong
2019-11-28  6:44 ` [dpdk-dev] [PATCH v5 1/6] lib/eal: implement the family of rte bit operation APIs Joyce Kong
2019-11-28  6:44 ` [dpdk-dev] [PATCH v5 2/6] test/bitops: add bit operation test case Joyce Kong
2019-11-28  6:44 ` [dpdk-dev] [PATCH v5 3/6] net/axgbe: use common rte bit operation APIs instead Joyce Kong
2019-12-02  6:09   ` Gavin Hu (Arm Technology China)
2019-12-02  9:12     ` Thomas Monjalon
2019-12-02  9:24       ` [dpdk-dev] [PATCH v5 3/6] net/axgbe: use common rte bitoperation " Morten Brørup
2019-12-02  9:30         ` Thomas Monjalon
2019-12-02 16:53         ` Stephen Hemminger
2019-12-03  6:52           ` Gavin Hu (Arm Technology China)
2019-11-28  6:44 ` [dpdk-dev] [PATCH v5 4/6] net/bnx2x: use common rte bit operation " Joyce Kong
2019-11-28  6:44 ` [dpdk-dev] [PATCH v5 5/6] net/qede: " Joyce Kong
2019-11-28  6:44 ` [dpdk-dev] [PATCH v5 6/6] net/hinic: " Joyce Kong
2019-12-18  6:00 ` [dpdk-dev] [PATCH v6 0/6] implement common rte bit operation APIs in PMDs Joyce Kong
2019-12-18  6:55   ` Gavin Hu
2020-01-17 13:03   ` David Marchand
2019-12-18  6:00 ` [dpdk-dev] [PATCH v6 1/6] lib/eal: implement the family of rte bit operation APIs Joyce Kong
2019-12-20  6:52   ` Honnappa Nagarahalli
2019-12-21 16:07     ` Honnappa Nagarahalli
2019-12-21 18:07       ` Stephen Hemminger
2019-12-23  5:04         ` Honnappa Nagarahalli
2019-12-23 16:36           ` Stephen Hemminger
2019-12-30  3:02             ` Gavin Hu
2020-01-07  0:44               ` Honnappa Nagarahalli
2020-01-07  1:26                 ` Stephen Hemminger
2020-01-07  4:41                   ` Honnappa Nagarahalli
2020-01-07  0:41             ` Honnappa Nagarahalli
2019-12-21 18:08       ` Stephen Hemminger
2019-12-23  5:45         ` Honnappa Nagarahalli
2019-12-23  8:59       ` Jerin Jacob
2019-12-18  6:00 ` [dpdk-dev] [PATCH v6 2/6] test/bitops: add bit operation test case Joyce Kong
2019-12-18  6:00 ` [dpdk-dev] [PATCH v6 3/6] net/axgbe: use common rte bit operation APIs instead Joyce Kong
2019-12-18  6:00 ` [dpdk-dev] [PATCH v6 4/6] net/bnx2x: " Joyce Kong
2019-12-18  6:00 ` [dpdk-dev] [PATCH v6 5/6] net/qede: " Joyce Kong
2019-12-18  6:00 ` [dpdk-dev] [PATCH v6 6/6] net/hinic: " Joyce Kong
2020-03-09  9:54 ` [dpdk-dev] [PATCH v7 0/6] implement common rte bit operation APIs in PMDs Joyce Kong
2020-03-09  9:54 ` [dpdk-dev] [PATCH v7 1/6] lib/eal: implement the family of PMD bit operation APIs Joyce Kong
2020-03-09 15:50   ` Stephen Hemminger
2020-03-31 22:35   ` Thomas Monjalon
2020-04-01  8:27     ` Gavin Hu
2020-04-01  9:45       ` Thomas Monjalon
2020-04-02  7:20         ` Gavin Hu
2020-04-02  8:07           ` Thomas Monjalon
2020-04-02  8:11             ` Jerin Jacob
2020-04-02  9:02               ` Gavin Hu
2020-03-09  9:54 ` [dpdk-dev] [PATCH v7 2/6] test/pmdbitops: add PMD bit operation test case Joyce Kong
2020-03-09  9:54 ` [dpdk-dev] [PATCH v7 3/6] net/axgbe: use common rte bit operation APIs instead Joyce Kong
2020-03-09  9:54 ` [dpdk-dev] [PATCH v7 4/6] net/bnx2x: " Joyce Kong
2020-03-09  9:54 ` [dpdk-dev] [PATCH v7 5/6] net/qede: " Joyce Kong
2020-03-09  9:54 ` [dpdk-dev] [PATCH v7 6/6] net/hinic: " Joyce Kong

Reply instructions:

You may reply publically 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=VI1PR08MB53765529473CDC821F5A37E38F7C0@VI1PR08MB5376.eurprd08.prod.outlook.com \
    --to=gavin.hu@arm.com \
    --cc=Honnappa.Nagarahalli@arm.com \
    --cc=Joyce.Kong@arm.com \
    --cc=cloud.wangxiaoyun@huawei.com \
    --cc=dev@dpdk.org \
    --cc=jerinj@marvell.com \
    --cc=mb@smartsharesystems.com \
    --cc=nd@arm.com \
    --cc=ravi1.kumar@amd.com \
    --cc=rmody@marvell.com \
    --cc=shshaikh@marvell.com \
    --cc=stephen@networkplumber.org \
    --cc=thomas@monjalon.net \
    --cc=xuanziyang2@huawei.com \
    --cc=zhouguoyang@huawei.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

DPDK patches and discussions

Archives are clonable:
	git clone --mirror http://inbox.dpdk.org/dev/0 dev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 dev dev/ http://inbox.dpdk.org/dev \
		dev@dpdk.org
	public-inbox-index dev


Newsgroup available over NNTP:
	nntp://inbox.dpdk.org/inbox.dpdk.dev


AGPL code for this site: git clone https://public-inbox.org/ public-inbox