> -----Original Message-----
> From: Neil Horman <nhor...@tuxdriver.com>
> Sent: Friday, April 17, 2020 10:38
> To: Wang, Haiyue <haiyue.w...@intel.com>
> Cc: dev@dpdk.org; Jerin Jacob Kollanukkaran <jer...@marvell.com>; Richardson, 
> Bruce
> <bruce.richard...@intel.com>; Thomas Monjalon <tho...@monjalon.net>; David 
> Marchand
> <david.march...@redhat.com>; Yigit, Ferruh <ferruh.yi...@intel.com>
> Subject: Re: [dpdk-dev] [PATCH v2 01/10] Add __rte_internal tag for functions 
> and version target
> 
> On Fri, Apr 17, 2020 at 02:04:30AM +0000, Wang, Haiyue wrote:
> > Hi Neil,
> >
> > > -----Original Message-----
> > > From: dev <dev-boun...@dpdk.org> On Behalf Of Neil Horman
> > > Sent: Thursday, June 13, 2019 22:24
> > > To: dev@dpdk.org
> > > Cc: Neil Horman <nhor...@tuxdriver.com>; Jerin Jacob Kollanukkaran 
> > > <jer...@marvell.com>;
> Richardson,
> > > Bruce <bruce.richard...@intel.com>; Thomas Monjalon <tho...@monjalon.net>
> > > Subject: [dpdk-dev] [PATCH v2 01/10] Add __rte_internal tag for functions 
> > > and version target
> > >
> > > This tag is meant to be used on function prototypes to identify
> > > functions that are only meant to be used by internal DPDK libraries
> > > (i.e. libraries that are built while building the SDK itself, as
> > > identified by the defining of the BUILDING_RTE_SDK macro).  When that
> > > flag is not set, it will resolve to an error function attribute, causing
> > > build breakage for any compilation unit attempting to build it
> > >
> > > Validate the use of this tag in much the same way we validate
> > > __rte_experimental.  By adding an INTERNAL version to library map files,
> > > we can exempt internal-only functions from ABI checking, and handle them
> > > to ensure that symbols we wish to only be for internal use between dpdk
> > > libraries are properly tagged with __rte_experimental
> > >
> > > Note this patch updates the check-experimental-syms.sh script, which
> > > normally only check the EXPERIMENTAL section to also check the INTERNAL
> > > section now.  As such its been renamed to the now more appropriate
> > > check-special-syms.sh
> > >
> > > Signed-off-by: Neil Horman <nhor...@tuxdriver.com>
> > > CC: Jerin Jacob Kollanukkaran <jer...@marvell.com>
> > > CC: Bruce Richardson <bruce.richard...@intel.com>
> > > CC: Thomas Monjalon <tho...@monjalon.net>
> > > ---
> > >  ...rimental-syms.sh => check-special-syms.sh} | 24 ++++++++++++++++++-
> > >  lib/librte_eal/common/include/rte_compat.h    | 12 ++++++++++
> > >  mk/internal/rte.compile-pre.mk                |  6 ++---
> > >  mk/target/generic/rte.vars.mk                 |  2 +-
> > >  4 files changed, 39 insertions(+), 5 deletions(-)
> > >  rename buildtools/{check-experimental-syms.sh => check-special-syms.sh} 
> > > (53%)
> > >
> > ....
> >
> > > diff --git a/lib/librte_eal/common/include/rte_compat.h
> b/lib/librte_eal/common/include/rte_compat.h
> > > index 92ff28faf..739e8485c 100644
> > > --- a/lib/librte_eal/common/include/rte_compat.h
> > > +++ b/lib/librte_eal/common/include/rte_compat.h
> > > @@ -89,4 +89,16 @@ __attribute__((section(".text.experimental")))
> > >
> > >  #endif
> > >
> > > +/*
> > > + * __rte_internal tags mark functions as internal only, If specified in 
> > > public
> > > + * header files, this tag will resolve to an error directive, preventing
> > > + * external applications from attempting to make calls to functions not 
> > > meant
> > > + * for consumption outside the dpdk library
> > > + */
> > > +#ifdef BUILDING_RTE_SDK
> > > +#define __rte_internal __attribute__((section(".text.internal")))
> > > +#else
> > > +#define __rte_internal __attribute__((error("This function cannot be 
> > > used outside of the core
> DPDK
> > > library"), \
> > > + section(".text.internal")))
> > > +#endif
> > >  #endif /* _RTE_COMPAT_H_ */
> >
> > Since struct definition is also a kind of ABI (am I right ? ;-) ), like:
> >
> Yes, thats correct, which is why I've advocated for making structs
> opaque as part of the abi, but I suppose thats not where we are. :)
> 

Make sense, normally structs can't live alone without function API. A little
paranoid for type only ABI checking. ;-) And this definition is good for ABI
checking as we did it for EXPERIMENTAL.

Thanks!
Haiyue

> > drivers/bus/pci/rte_bus_pci.h
> > struct rte_pci_device {
> >     ...
> >     struct rte_intr_handle vfio_req_intr_handle;
> >                             /**< Handler of VFIO request interrupt */
> > } __rte_internal;
> >
> > Then will capture the errors anyway by using one of __rte_internal 
> > definition.
> >     error: 'section' attribute does not apply to types [-Werror=attributes]
> >     error: 'error' attribute does not apply to types
> >
> As it is currently written, the __rte_internal macro is only written to
> work on functions.  If you don't want a struct to be part of the ABI, we
> would need to either:
> 
> a) make a simmilar macro (say __rte_internal_data) which uses a simmilar
> gcc attibute to catch external usage.
> 
> or
> 
> b) just move the strucute definition to a location that isn't exposed as
> part of the external ABI
> 
> Neil
> 
> > > 2.20.1
> >
> >

Reply via email to