On Wed, Apr 15, 2020 at 06:24:19PM +0100, Trahe, Fiona wrote:
> Hi Ray/Bruce/Thomas,
> 
Hi Fiona,

answers as best I can give are inline below.

> We've been trying to make sense of the versioning scheme - but as the docs 
> describe and give examples
>  of a 2-number scheme and the code has a 3-number scheme it's pretty 
> confusing.
> If you can help me fill out the following table this may help:
> 
> VERSION | ABI_VERSION | LIBABIVER| stable soname | lib filename           | 
> new section with ABI break in map file
> 19.11.0       |    20.0           |    1             | stable.so.20.0  | 
> stable.so.20.0.0   |
> 20.02.0-rc0|    20.1           |     1             | n/a
> 20.02.0       |    20.0.1         |    0.1          | stable.so.20.0  | 
> stable.so.20.0.1  |
> 20.05.0       |    20.0.2         |    0.1         | stable.so.20.0  | 
> stable.so.20.0.2   | 20.0.2           (or 21? use impending stable 
> ABI_VERSION?)
> 20.08.0       |    20.0.3         |    0.1         | stable.so.20.0  | 
> stable.so.20.0.3   |
> 20.11.0       |    21                |    0.1         | stable.so.21     | 
> stable.so.21.0      |          (Can we move back to a 2 number ABI_VERSION at 
> this stage? )
> 21.02.0       |    21.1             |   0.1          | stable.so.21     | 
> stable.so.21.1      |
> 
> Note, first 2 ABI_VERSIONS above were mistakes, soname needs to be same as 
> 19.11 to avoid ABI breakage, so it was changed to 3-part number, with first 2 
> used in soname.
> 
> Questions:
> 1. For this year, is major a 2-part num 20.0 (and there will never be a 
> 20.1,20.2, etc) and minor is the 3rd number?

Yes, for this year only.

> 2. Can we move back to a 2-number scheme in 20.11?

That is the plan, yes.

> 3. What uses lib filename? (This is described in config/meson.build) Guessing 
> stable soname is name on which apps depend, and is a sym link, pointing to 
> lib filename?

In general, yes.

> 4. What does LIBABIVER have to do with this ?  it was 1, changed to 0.1 in 
> 20.2

Not sure about this one, what it refers to.

> 5a. If in 20.05 we add a version of a fn which breaks ABI 20.0, what should 
> the name of the original function be? fn_v20, or fn_v20.0

In technical terms it really doesn't matter, it's just a name that will be
looked up in a table. I don't think we strictly enforce the naming, so
whatever is clearest is best. I'd suggest the former.

> Or does it even matter, i.e. is the middle param to this macro arbitrary and 
> just needs to match the fn name, e.g. if fn name was fn_vxyz could macro be:
> VERSION_SYMBOL(fn, _vxyz, 20.0);

Yes.

>  5b. what should the name of the new fn be? fn_v2002 or fn_v21? Does it need 
> to correspond to the new section in .map? If v2002, doesn't that imply it's 
> compatible with 20.0 ABI
> So shouldn't the new section be DPDK_21 and the new fn be fn_v21.
> 6. Assume we go with DPDK_21 and fn_v21. An app built against 20.05 has a 
> dependency on fn_v21 (because of the BIND_DEFAULT) but on otherfn_v20.0 of 
> all other fns?
> If fn_v21 is changed again in 20.08, is there any expectation that the app 
> built against 20.05 must work against the 20.08 fn of the same name?
> i.e. is compatibility required on fn changes across minor nonstable releases? 
> If not then jumping ahead to v21 seems the simplest option.
> And the "final" fn_v21 in 20.11 is the one that "sticks" and belongs to the 
> new ABI which then must remain stable til 21.11

For functions that are part of the stable ABI, each change requires a new
version, since there is an expectation that 20.05 builds will also work
with 20.08.

Regards,
/Bruce

> 
> 
> > -----Original Message-----
> > From: Trahe, Fiona <fiona.tr...@intel.com>
> > Sent: Tuesday, April 14, 2020 7:27 PM
> > To: Ray Kinsella <m...@ashroe.eu>; dev@dpdk.org
> > Cc: Trahe, Fiona <fiona.tr...@intel.com>; Kusztal, ArkadiuszX 
> > <arkadiuszx.kusz...@intel.com>
> > Subject: RE: [dpdk-dev] [PATCH] cryptodev: version rte_cryptodev_info_get 
> > function
> >
> > Hi Ray,
> >
> > We're going to need hep to understand the numbering.
> > The examples here 
> > http://doc.dpdk.org/guides/contributing/abi_versioning.html#major-abi-versions
> > show only major numbers in the .map file.
> > Whereas the map files all have major.minor.
> >
> > The example shows that to add a new version of an existing fn one should 
> > use the next major number,
> > "When an ABI change is made between major ABI versions to a given library, 
> > a new section is added to
> >  that library’s version map describing the impending new ABI version"
> > so
> >  - Old fn becomes fn_v20()
> >  - VERSION_SYMBOL(fn, _v20, 20); - maps node 20 to fn_v20() for dynamic 
> > linking
> >  - New fn becomes fn_v21()
> >  - BIND_DEFAULT_SYMBOL(fn, _v21, 21); - maps new builds to fn_v21 for 
> > dynamic linking and makes
> > fn_v21 default
> >  - MAP_STATIC_SYMBOL(fn_proto, fn_v21); - for static linking
> > And the map file should have:
> >
> > DPDK_21 {
> > global:
> > rte_cryptodev_info_get;
> > } DPDK_20;
> >
> > When the ABI version moves to node 21 in DPDK20.11, the _v20 symbols can be 
> > removed.
> >
> > You suggest using DPDK_20.0.2 and _v2002
> > Can you explain why?
> > In 20.0.2 - which number is minor?
> > And why 3 numbers?
> >
> > Regards,
> > Fiona
> >
> >
> > > -----Original Message-----
> > > From: dev <dev-boun...@dpdk.org> On Behalf Of Ray Kinsella
> > > Sent: Tuesday, April 14, 2020 2:54 PM
> > > To: dev@dpdk.org
> > > Subject: Re: [dpdk-dev] [PATCH] cryptodev: version rte_cryptodev_info_get 
> > > function
> > >
> > >
> > >
> > > On 18/03/2020 20:41, Arek Kusztal wrote:
> > > > This patch adds versioned function rte_cryptodev_info_get.
> > > > Node 20.05 function works the same way it was working before.
> > > > Node 20.0 function strips capability added in 20.05 release
> > > > to prevent some issues with ABI policy. To do that new capability
> > > > array is allocated per device and returned to user instead of the
> > > > original array passed by PMD.
> > > >
> > > > Signed-off-by: Arek Kusztal <arkadiuszx.kusz...@intel.com>
> > > > ---
> > > >  lib/librte_cryptodev/rte_cryptodev.c           | 97 
> > > > +++++++++++++++++++++++++-
> > > >  lib/librte_cryptodev/rte_cryptodev.h           | 12 +++-
> > > >  lib/librte_cryptodev/rte_cryptodev_version.map |  7 ++
> > > >  3 files changed, 113 insertions(+), 3 deletions(-)
> > > >
> > > > diff --git a/lib/librte_cryptodev/rte_cryptodev.c 
> > > > b/lib/librte_cryptodev/rte_cryptodev.c
> > > > index 6d1d0e9..2d030ba 100644
> > > > --- a/lib/librte_cryptodev/rte_cryptodev.c
> > > > +++ b/lib/librte_cryptodev/rte_cryptodev.c
> > > > @@ -41,6 +41,9 @@
> > > >  #include "rte_cryptodev.h"
> > > >  #include "rte_cryptodev_pmd.h"
> > > >
> > > > +#include <rte_compat.h>
> > > > +#include <rte_function_versioning.h>
> > > > +
> > > >  static uint8_t nb_drivers;
> > > >
> > > >  static struct rte_cryptodev rte_crypto_devices[RTE_CRYPTO_MAX_DEVS];
> > > > @@ -56,6 +59,13 @@ static struct rte_cryptodev_global cryptodev_globals 
> > > > = {
> > > >  /* spinlock for crypto device callbacks */
> > > >  static rte_spinlock_t rte_cryptodev_cb_lock = RTE_SPINLOCK_INITIALIZER;
> > > >
> > > > +static const struct rte_cryptodev_capabilities
> > > > +cryptodev_undefined_capabilities[] = {
> > > > +RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
> > > > +};
> > > > +
> > > > +struct rte_cryptodev_capabilities 
> > > > *capability_copies[RTE_CRYPTO_MAX_DEVS];
> > > > +uint8_t is_capability_checked[RTE_CRYPTO_MAX_DEVS];
> > > >
> > > >  /**
> > > >   * The user application callback description.
> > > > @@ -999,6 +1009,13 @@ rte_cryptodev_close(uint8_t dev_id)
> > > >  RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_close, -ENOTSUP);
> > > >  retval = (*dev->dev_ops->dev_close)(dev);
> > > >
> > > > +
> > > > +if (capability_copies[dev_id]) {
> > > > +free(capability_copies[dev_id]);
> > > > +capability_copies[dev_id] = NULL;
> > > > +}
> > > > +is_capability_checked[dev_id] = 0;
> > > > +
> > > >  if (retval < 0)
> > > >  return retval;
> > > >
> > > > @@ -1111,11 +1128,12 @@ rte_cryptodev_stats_reset(uint8_t dev_id)
> > > >  (*dev->dev_ops->stats_reset)(dev);
> > > >  }
> > > >
> > > > -
> > > >  void
> > > > -rte_cryptodev_info_get(uint8_t dev_id, struct rte_cryptodev_info 
> > > > *dev_info)
> > > > +rte_cryptodev_info_get_v20(uint8_t dev_id, struct rte_cryptodev_info 
> > > > *dev_info)
> > > >  {
> > > >  struct rte_cryptodev *dev;
> > > > +const struct rte_cryptodev_capabilities *capability;
> > > > +uint8_t counter = 0;
> > > >
> > > >  if (!rte_cryptodev_pmd_is_valid_dev(dev_id)) {
> > > >  CDEV_LOG_ERR("Invalid dev_id=%d", dev_id);
> > > > @@ -1129,10 +1147,85 @@ rte_cryptodev_info_get(uint8_t dev_id, struct 
> > > > rte_cryptodev_info
> > > *dev_info)
> > > >  RTE_FUNC_PTR_OR_RET(*dev->dev_ops->dev_infos_get);
> > > >  (*dev->dev_ops->dev_infos_get)(dev, dev_info);
> > > >
> > > > +if (capability_copies[dev_id] == NULL) {
> > > > +if (!is_capability_checked[dev_id]) {
> > > > +uint8_t found_invalid_capa = 0;
> > > > +
> > > > +for (capability = dev_info->capabilities;
> > > > +capability->op != RTE_CRYPTO_OP_TYPE_UNDEFINED;
> > > > +++capability, ++counter) {
> > > > +if (capability->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
> > > > +capability->sym.xform_type ==
> > > > +RTE_CRYPTO_SYM_XFORM_AEAD
> > > > +&& capability->sym.aead.algo >=
> > > > +RTE_CRYPTO_AEAD_CHACHA20_POLY1305) {
> > > > +found_invalid_capa = 1;
> > > > +counter--;
> > > > +}
> > > > +}
> > > > +is_capability_checked[dev_id] = 1;
> > > > +if (found_invalid_capa) {
> > > > +capability_copies[dev_id] = malloc(counter *
> > > > +sizeof(struct rte_cryptodev_capabilities));
> > > > +if (capability_copies[dev_id] == NULL) {
> > > > + /*
> > > > +  * error case - no memory to store the trimmed list,
> > > > +  * so have to return an empty list
> > > > +  */
> > > > +dev_info->capabilities =
> > > > +cryptodev_undefined_capabilities;
> > > > +is_capability_checked[dev_id] = 0;
> > > > +} else {
> > > > +counter = 0;
> > > > +for (capability = dev_info->capabilities;
> > > > +capability->op !=
> > > > +RTE_CRYPTO_OP_TYPE_UNDEFINED;
> > > > +capability++) {
> > > > +if (!(capability->op ==
> > > > +RTE_CRYPTO_OP_TYPE_SYMMETRIC
> > > > +&& capability->sym.xform_type ==
> > > > +RTE_CRYPTO_SYM_XFORM_AEAD
> > > > +&& capability->sym.aead.algo >=
> > > > +
> > > RTE_CRYPTO_AEAD_CHACHA20_POLY1305)) {
> > > > +capability_copies[dev_id][counter++] =
> > > > +*capability;
> > > > +}
> > > > +}
> > > > +dev_info->capabilities =
> > > > +capability_copies[dev_id];
> > > > +}
> > > > +}
> > > > +}
> > > > +} else
> > > > +dev_info->capabilities = capability_copies[dev_id];
> > > > +
> > > >  dev_info->driver_name = dev->device->driver->name;
> > > >  dev_info->device = dev->device;
> > > >  }
> > > > +VERSION_SYMBOL(rte_cryptodev_info_get, _v20, 20.0);
> > > > +
> > > > +void
> > > > +rte_cryptodev_info_get_v2005(uint8_t dev_id, struct rte_cryptodev_info 
> > > > *dev_info)
> > >
> > > should be rte_cryptodev_info_get_v2002
> > >
> > > > +{
> > > > +struct rte_cryptodev *dev;
> > > >
> > > > +if (!rte_cryptodev_pmd_is_valid_dev(dev_id)) {
> > > > +CDEV_LOG_ERR("Invalid dev_id=%d", dev_id);
> > > > +return;
> > > > +}
> > > > +
> > > > +dev = &rte_crypto_devices[dev_id];
> > > > +
> > > > +memset(dev_info, 0, sizeof(struct rte_cryptodev_info));
> > > > +
> > > > +RTE_FUNC_PTR_OR_RET(*dev->dev_ops->dev_infos_get);
> > > > +(*dev->dev_ops->dev_infos_get)(dev, dev_info);
> > > > +
> > > > +dev_info->driver_name = dev->device->driver->name;
> > > > +dev_info->device = dev->device;
> > > > +}
> > > > +MAP_STATIC_SYMBOL(void rte_cryptodev_info_get(uint8_t dev_id,
> > > > +struct rte_cryptodev_info *dev_info), rte_cryptodev_info_get_v2005);
> > >
> > > should be rte_cryptodev_info_get_v2002
> > >
> > > >
> > > >  int
> > > >  rte_cryptodev_callback_register(uint8_t dev_id,
> > > > diff --git a/lib/librte_cryptodev/rte_cryptodev.h 
> > > > b/lib/librte_cryptodev/rte_cryptodev.h
> > > > index 437b8a9..06ce2f2 100644
> > > > --- a/lib/librte_cryptodev/rte_cryptodev.h
> > > > +++ b/lib/librte_cryptodev/rte_cryptodev.h
> > > > @@ -24,6 +24,9 @@ extern "C" {
> > > >  #include <rte_common.h>
> > > >  #include <rte_config.h>
> > > >
> > > > +#include <rte_compat.h>
> > > > +#include <rte_function_versioning.h>
> > > > +
> > > >  extern const char **rte_cyptodev_names;
> > > >
> > > >  /* Logging Macros */
> > > > @@ -758,7 +761,14 @@ rte_cryptodev_stats_reset(uint8_t dev_id);
> > > >   * the last valid element has it's op field set to
> > > >   * RTE_CRYPTO_OP_TYPE_UNDEFINED.
> > > >   */
> > > > -extern void
> > > > +void
> > > > +rte_cryptodev_info_get_v20(uint8_t dev_id, struct rte_cryptodev_info 
> > > > *dev_info);
> > > > +
> > > > +void
> > > > +rte_cryptodev_info_get_v2005(uint8_t dev_id, struct rte_cryptodev_info 
> > > > *dev_info);
> > > > +BIND_DEFAULT_SYMBOL(rte_cryptodev_info_get, _v2005, 20.05);
> > > > +
> > > > +void
> > > >  rte_cryptodev_info_get(uint8_t dev_id, struct rte_cryptodev_info 
> > > > *dev_info);
> > > do we still need this forward declaration?
> > >
> > > >
> > > >
> > > > diff --git a/lib/librte_cryptodev/rte_cryptodev_version.map
> > > b/lib/librte_cryptodev/rte_cryptodev_version.map
> > > > index 6e41b4b..d6c945a 100644
> > > > --- a/lib/librte_cryptodev/rte_cryptodev_version.map
> > > > +++ b/lib/librte_cryptodev/rte_cryptodev_version.map
> > > > @@ -58,6 +58,13 @@ DPDK_20.0 {
> > > >  local: *;
> > > >  };
> > > >
> > > > +
> > > > +DPDK_20.05 {
> > >
> > > should be DPDK_20.0.2
> > >
> > > > +global:
> > > > +rte_cryptodev_info_get;
> > > > +} DPDK_20.0;
> > > > +
> > > > +
> > > >  EXPERIMENTAL {
> > > >  global:
> > > >
> > > >

Reply via email to