DPDK patches and discussions
 help / color / mirror / Atom feed
Search results ordered by [date|relevance]  view[summary|nested|Atom feed]
thread overview below | download: 
* Re: [dpdk-dev] [PATCH 0/8] Improve build process
  2015-02-23 14:58  0%                                         ` Gonzalez Monroy, Sergio
@ 2015-02-23 18:23  0%                                           ` Neil Horman
  0 siblings, 0 replies; 200+ results
From: Neil Horman @ 2015-02-23 18:23 UTC (permalink / raw)
  To: Gonzalez Monroy, Sergio; +Cc: dev

On Mon, Feb 23, 2015 at 02:58:30PM +0000, Gonzalez Monroy, Sergio wrote:
> On 23/02/2015 13:52, Neil Horman wrote:
> >On Mon, Feb 23, 2015 at 10:25:01AM +0000, Gonzalez Monroy, Sergio wrote:
> >>On 22/02/2015 23:37, Neil Horman wrote:
> >>>On Fri, Feb 20, 2015 at 02:31:36PM +0000, Gonzalez Monroy, Sergio wrote:
> >>>>On 13/02/2015 12:51, Neil Horman wrote:
> >>>>>On Fri, Feb 13, 2015 at 11:08:02AM +0000, Gonzalez Monroy, Sergio wrote:
> >>>>>>On 13/02/2015 10:14, Panu Matilainen wrote:
> >>>>>>>On 02/12/2015 05:52 PM, Neil Horman wrote:
> >>>>>>>>On Thu, Feb 12, 2015 at 04:07:50PM +0200, Panu Matilainen wrote:
> >>>>>>>>>On 02/12/2015 02:23 PM, Neil Horman wrote:
> >>>>>>>[...snip...]
> >>>>>>>>>>>>>So I just realized that I was not having into account a possible
> >>>>>>>>>>>>>scenario, where
> >>>>>>>>>>>>>we have an app built with static dpdk libs then loading a dso
> >>>>>>>>>>>>>with -d
> >>>>>>>>>>>>>option.
> >>>>>>>>>>>>>
> >>>>>>>>>>>>>In such case, because the pmd would have DT_NEEDED entries,
> >>>>>>>>>>>>>dlopen will
> >>>>>>>>>>>>>fail.
> >>>>>>>>>>>>>So to enable such scenario we would need to build PMDs without
> >>>>>>>>>>>>>DT_NEEDED
> >>>>>>>>>>>>>entries.
> >>>>>>>>>>>>Hmm, for that to be a problem you'd need to have the PMD built
> >>>>>>>>>>>>against
> >>>>>>>>>>>>shared dpdk libs and while the application is built against
> >>>>>>>>>>>>static dpdk
> >>>>>>>>>>>>libs. I dont think that's a supportable scenario in any case.
> >>>>>>>>>>>>
> >>>>>>>>>>>>Or is there some other scenario that I'm not seeing?
> >>>>>>>>>>>>
> >>>>>>>>>>>>    - Panu -
> >>>>>>>>>>>>
> >>>>>>>>>>>I agree with you. I suppose it comes down to, do we want to
> >>>>>>>>>>>support such
> >>>>>>>>>>>scenario?
> >>>>>>>>>>>
> >>>>>>>>>>> From what I can see, it seems that we do currently support such
> >>>>>>>>>>>scenario by
> >>>>>>>>>>>building dpdk apps against all static dpdk libs using
> >>>>>>>>>>>--whole-archive (all
> >>>>>>>>>>>libs and not only PMDs).
> >>>>>>>>>>>http://dpdk.org/browse/dpdk/commit/?id=20afd76a504155e947c770783ef5023e87136ad8
> >>>>>>>>>>>
> >>>>>>>>>>>
> >>>>>>>>>>>Am I misunderstanding this?
> >>>>>>>>>>>
> >>>>>>>>>>Shoot, you're right, I missed the static build aspect to this.  Yes,
> >>>>>>>>>>if we do the following:
> >>>>>>>>>>
> >>>>>>>>>>1) Build the DPDK as a static library
> >>>>>>>>>>2) Link an application against (1)
> >>>>>>>>>>3) Use the dlopen mechanism to load a PMD built as a DSO
> >>>>>>>>>>
> >>>>>>>>>>Then the DT_NEEDED entries in the DSO will go unsatisfied, because
> >>>>>>>>>>the shared
> >>>>>>>>>>objects on which it (the PMD) depends will not exist in the file
> >>>>>>>>>>system.
> >>>>>>>>>I think its even more twisty:
> >>>>>>>>>
> >>>>>>>>>1) Build the DPDK as a static library
> >>>>>>>>>2) Link an application against (1)
> >>>>>>>>>3) Do another build of DPDK as a shared library
> >>>>>>>>>4) In app 2), use the dlopen mechanism to load a PMD built as a part
> >>>>>>>>>of or
> >>>>>>>>>against 3)
> >>>>>>>>>
> >>>>>>>>>Somehow I doubt this would work very well.
> >>>>>>>>>
> >>>>>>>>Ideally it should, presuming the ABI is preserved between (1) and (3),
> >>>>>>>>though I
> >>>>>>>>agree, up until recently, that was an assumption that was unreliable.
> >>>>>>>Versioning is a big and important step towards reliability but there are
> >>>>>>>more issues to solve. This of course getting pretty far from the original
> >>>>>>>topic, but at least one such issue is that there are some cases where a
> >>>>>>>config value affects what are apparently public structs (rte_mbuf wrt
> >>>>>>>RTE_MBUF_REFCNT for example), which really is a no-go.
> >>>>>>>
> >>>>>>Agree, the RTE_MBUF_REFCNT is something that needs to be dealt with asap.
> >>>>>>I'll look into it.
> >>>>>>
> >>>>>>>>>>I think the problem is a little bit orthogonal to the libdpdk_core
> >>>>>>>>>>problem you
> >>>>>>>>>>were initially addressing.  That is to say, this problem of
> >>>>>>>>>>dlopen-ed PMD's
> >>>>>>>>>>exists regardless of weather you build the DPDK as part of a static
> >>>>>>>>>>or dynamic
> >>>>>>>>>>library.  The problems just happen to intersect in their
> >>>>>>>>>>manipulation of the
> >>>>>>>>>>DT_NEEDED entries.
> >>>>>>>>>>
> >>>>>>>>>>Ok, so, given the above, I would say your approach is likely
> >>>>>>>>>>correct, just
> >>>>>>>>>>prevent DT_NEEDED entries from getting added to PMD's. Doing so will
> >>>>>>>>>>sidestep
> >>>>>>>>>>loading issue for libraries that may not exist in the filesystem,
> >>>>>>>>>>but thats ok,
> >>>>>>>>>>because by all rights, the symbols codified in those needed
> >>>>>>>>>>libraries should
> >>>>>>>>>>already be present in the running application (either made available
> >>>>>>>>>>by the
> >>>>>>>>>>application having statically linked them, or having the linker load
> >>>>>>>>>>them from
> >>>>>>>>>>the proper libraries at run time).
> >>>>>>>>>My 5c is that I'd much rather see the common case (all static or all
> >>>>>>>>>shared)
> >>>>>>>>>be simple and reliable, which in case of DSOs includes no lying
> >>>>>>>>>(whether by
> >>>>>>>>>omission or otherwise) about DT_NEEDED, ever. That way the issue is
> >>>>>>>>>dealt
> >>>>>>>>>once where it belongs. If somebody wants to go down the rabbit hole of
> >>>>>>>>>mixed
> >>>>>>>>>shared + static linkage, let them dig the hole by themselves :)
> >>>>>>>>>
> >>>>>>>>This is a fair point.  Can DT_NEEDED sections be stripped via tools like
> >>>>>>>>objcopy
> >>>>>>>>after the build is complete?  If so, end users can hack this corner case
> >>>>>>>>to work
> >>>>>>>>as needed.
> >>>>>>>Patchelf (http://nixos.org/patchelf.html) appears to support that, but
> >>>>>>>given that source is available it'd be easier to just modify the makefiles
> >>>>>>>if that's really needed.
> >>>>>>>
> >>>>>>I think we agree on the issue.
> >>>>>>
> >>>>>>So I'll be sending a patch to add DT_NEEDED entries to all libraries and
> >>>>>>PMDs. The only exception would be librte_eal, which would not have proper
> >>>>>>NEEDED entries.
> >>>>>>Do we bother adding a linker script for librte_eal that would include
> >>>>>>dependent libraries?
> >>>>>>
> >>>>>I say yes to the linker script, but will happily bow to an alternate consensus
> >>>>>Neil
> >>>>>
> >>>>So the case we want to solve is the following circular dependencies:
> >>>>eal             -> mempool, malloc
> >>>>mempool -> eal , malloc, ring
> >>>>malloc      -> eal
> >>>>ring           -> eal, malloc
> >>>>
> >>>>We cannot write/create the proposed (below) linker script at least until we
> >>>>have built mempool and malloc.
> >>>>INPUT ( -lrte_eal.so -lrte_mempool -lrte_malloc )
> >>>>
> >>>Not sure I understand why you have a build time dependency on this.  Link time
> >>>perhaps, but not build time.  Or am I reading too much into your use of the term
> >>>'built' above?
> >>I meant 'built' as compiled + linked. Am I misusing the term?
> >No, you're not (though I misused the term link time above, I meant to say load
> >time).  So you're saying that when you build shared libraries, you get linker
> >errors indicating that, during the build, you're missing symbols, is that
> >correct?  I guess I'm confused because I don't see how thats not happening for
> >everyone, right now.  In other words, I'm not sure what about your changes is
> >giving rise to that problem.
> >
> >>>>Few ways I have thought about implementing this (not particularly fond of
> >>>>any of them) :
> >>>>  - Have the linker script file in the repo (scripts/ ?) in a fixed location
> >>>>and just copy it to $(RTE_OUTPUT)/lib/ once all libs have finished building.
> >>>>  - Generate the file on build time from a defined make variable once all
> >>>>libs have finished
> >>>>
> >>>I'm still not sure I understand.  Why does this dependency exist at build time?
> >>>The dependency between malloc and eal shouldn't be a problem during the build,
> >>>as symbols from each other should just remain undefined, and get resolved at
> >>>load time.
> >>Is that not the way it is currently implemented?
> >>I get the impression that we are talking about different goals (correct me
> >>if it is not the case)
> >>
> >We may well be, I'm not sure yet.
> >
> >>I thought that the agreed solution was to:
> >>1) NOT to create/generate a 'core' library
> >>2) Add DT_NEEDED entries for all libraries (except eal which is the first
> >>library we link)
> >>3) Use linker script for eal
> >>
> >Ok, we're definately on the same page, as thats what I thought the goal was as
> >well.
> >
> >>Given the previously mentioned circular dependencies between eal, mempool,
> >>malloc and ring:
> >>- eal would not be linked against other libraries (no NEEDED entries)
> >>- malloc is linked against eal (previously built), so malloc would have a
> >>NEEDED entry for eal.
> >>
> >>In that scenario, if the linker script is setup/created after we build eal,
> >>then when we try to link malloc
> >>against eal, the linker will pull mempool and malloc too (because we
> >>included them in the linker script).
> >>Therefore, the link fails as none of those libraries (malloc and mempool)
> >>have been built yet.
> >>
> >Ah, I see now, I wasn't thinking about the extra requirements that DT_NEEDED
> >entries placed on the build conditions.
> >
> >I see now, apologies for being dense previously.  Given what you indicate I
> >would say that the solution here is to link the libraries against individual
> >other specific libraries, not the core library that you generate as a linker
> >script.  That way you avoid the circular dependency, and the core library just
> >becomes a convienience for application developers looking to link to a single
> >library.
> >
> I'm not sure I quite understand your suggestion.
> 
> Could you roughly describe steps for building eal, malloc and mempool libs ?
> For example, something like this?
> 1) build eal, which creates librte_eal.so.1
> 2) write linker script for librte_eal.so
> 3) build malloc against eal (-lrte_eal )
> etc

Hm, so I spent a bit of time looking at this, and your right, I thought this was
really just a artifact of the introduction of --as-needed to the build to force
DT_NEEDED entries, and my suggestion was that you simply not link the libraries
that were causing the circular dependency.  I had assumed that the link
directives included -lrte_malloc -lrte_mempool for the eal library, but they
weren't really needed, so you could remove them and it would work out.

Unfortunately that turns out to not be the case.  librte_eal does explicitly use
calls in librte_malloc, and vice versa.  The current use of -no-as-needed in the
build system (which I was previously unaware of), is a hack to avoid having to
address that problem.

That throws a monkey wrench into this plan.  I would see 3 ways forward:

1) Fix the problem - That is to say, remove the use of --no-as-needed from the
build, and address the circular dependencies that arise.  This could/will mean
actually merging libraries with circular dependencies into a single library, as
they should be so that they can completely resolve all of the symbols they use
at link time

2) Ignore the problem.  If we just keep the lack of DT_NEEDED entries in place,
I think the problem goes away, and we can continue on.

I think option 1 is likely the more correct approach, as removing DT_NEEDED to
avoid a circuar depenency is a hack, but it may not be the most pragmatic
approach.  just living without DT_NEEDED entries and documenting link time needs
will certainly be faster, and might be the better course of action, especially
if we provide a 'core' pseudo library/linker script that embodies that action
for the end user.

Neil


> I suppose that another way to go about this, instead of creating the linker
> script that pulls
> dependent libraries, is to always link (using --no-as-needed in case gcc
> adds it by default)
> against these libraries (eal, mempool, malloc, and ring) with necessary doc
> about how to build apps.
> 
> Sergio
> >Neil
> >
> >>Was your suggestion to leave all of these libraries (eal, mempool, malloc,
> >>ring) without NEEDED entries?
> >>
> >No, you can add NEEDED entries there, they will just be for the individual
> >libraries, not the core linker script library.
> >
> >Best
> >Neil
> >
> >>Regards,
> >>Sergio
> >>>What is the error you are getting?
> >>>
> >>>Best
> >>>Neil
> >>>
> >>>>Thoughts? any other approached is more than welcome!
> >>>>
> >>>>Sergio
> >>>>
> >>>>PS: Thinking again on the core library and the issue of having multiple
> >>>>version.map files, we could have a core_version.map instead instead of
> >>>>multiple files per core library (eal, mempool, etc)
> >>>>
> >>>>
> >>
> >>
> 
> 
> 

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v5 1/6] ethdev: add rx interrupt enable/disable functions
  2015-02-23 16:55  3% [dpdk-dev] [PATCH v5 0/6] " Zhou Danny
@ 2015-02-23 16:55  3% ` Zhou Danny
  0 siblings, 0 replies; 200+ results
From: Zhou Danny @ 2015-02-23 16:55 UTC (permalink / raw)
  To: dev

v5 changes
- Rebase the patchset onto the HEAD

v4 changes
- Export interrupt enable/disable functions for shared libraries
- Put new functions at the end of eth_dev_ops to avoid breaking ABI

v3 changes
- Add return value for interrupt enable/disable functions

Add two dev_ops functions to enable and disable rx queue interrupts

Signed-off-by: Danny Zhou <danny.zhou@intel.com>
Tested-by: Yong Liu <yong.liu@intel.com>
---
 lib/librte_ether/rte_ethdev.c          | 43 +++++++++++++++++++++++++
 lib/librte_ether/rte_ethdev.h          | 59 ++++++++++++++++++++++++++++++++++
 lib/librte_ether/rte_ether_version.map |  2 ++
 3 files changed, 104 insertions(+)

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 27bbb0b..eaf29de 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -2830,6 +2830,49 @@ _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
 	}
 	rte_spinlock_unlock(&rte_eth_dev_cb_lock);
 }
+
+int
+rte_eth_dev_rx_queue_intr_enable(uint8_t port_id,
+				uint16_t queue_id)
+{
+	struct rte_eth_dev *dev;
+
+	if (port_id >= nb_ports) {
+		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
+		return (-ENODEV);
+	}
+
+	dev = &rte_eth_devices[port_id];
+	if (dev == NULL) {
+		PMD_DEBUG_TRACE("Invalid port device\n");
+		return (-ENODEV);
+	}
+
+	FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_intr_enable, -ENOTSUP);
+	return (*dev->dev_ops->rx_queue_intr_enable)(dev, queue_id);
+}
+
+int
+rte_eth_dev_rx_queue_intr_disable(uint8_t port_id,
+				uint16_t queue_id)
+{
+	struct rte_eth_dev *dev;
+
+	if (port_id >= nb_ports) {
+		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
+		return (-ENODEV);
+	}
+
+	dev = &rte_eth_devices[port_id];
+	if (dev == NULL) {
+		PMD_DEBUG_TRACE("Invalid port device\n");
+		return (-ENODEV);
+	}
+
+	FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_intr_disable, -ENOTSUP);
+	return (*dev->dev_ops->rx_queue_intr_disable)(dev, queue_id);
+}
+
 #ifdef RTE_NIC_BYPASS
 int rte_eth_dev_bypass_init(uint8_t port_id)
 {
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 4acd595..7aa6c81 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -823,6 +823,8 @@ struct rte_eth_fdir {
 struct rte_intr_conf {
 	/** enable/disable lsc interrupt. 0 (default) - disable, 1 enable */
 	uint16_t lsc;
+	/** enable/disable rxq interrupt. 0 (default) - disable, 1 enable */
+	uint16_t rxq;
 };
 
 /**
@@ -1028,6 +1030,14 @@ typedef int (*eth_tx_queue_setup_t)(struct rte_eth_dev *dev,
 				    const struct rte_eth_txconf *tx_conf);
 /**< @internal Setup a transmit queue of an Ethernet device. */
 
+typedef int (*eth_rx_enable_intr_t)(struct rte_eth_dev *dev,
+				    uint16_t rx_queue_id);
+/**< @internal Enable interrupt of a receive queue of an Ethernet device. */
+
+typedef int (*eth_rx_disable_intr_t)(struct rte_eth_dev *dev,
+				    uint16_t rx_queue_id);
+/**< @internal Disable interrupt of a receive queue of an Ethernet device. */
+
 typedef void (*eth_queue_release_t)(void *queue);
 /**< @internal Release memory resources allocated by given RX/TX queue. */
 
@@ -1379,6 +1389,10 @@ struct eth_dev_ops {
 	/** Get current RSS hash configuration. */
 	rss_hash_conf_get_t rss_hash_conf_get;
 	eth_filter_ctrl_t              filter_ctrl;          /**< common filter control*/
+
+	/** Enable/disable Rx queue interrupt. */
+	eth_rx_enable_intr_t       rx_queue_intr_enable; /**< Enable Rx queue interrupt. */
+	eth_rx_disable_intr_t      rx_queue_intr_disable; /**< Disable Rx queue interrupt.*/
 };
 
 /**
@@ -2672,6 +2686,51 @@ void _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
 				enum rte_eth_event_type event);
 
 /**
+ * When there is no rx packet coming in Rx Queue for a long time, we can
+ * sleep lcore related to RX Queue for power saving, and enable rx interrupt
+ * to be triggered when rx packect arrives.
+ *
+ * The rte_eth_dev_rx_queue_intr_enable() function enables rx queue
+ * interrupt on specific rx queue of a port.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param queue_id
+ *   The index of the receive queue from which to retrieve input packets.
+ *   The value must be in the range [0, nb_rx_queue - 1] previously supplied
+ *   to rte_eth_dev_configure().
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if underlying hardware OR driver doesn't support
+ *     that operation.
+ *   - (-ENODEV) if *port_id* invalid.
+ */
+int rte_eth_dev_rx_queue_intr_enable(uint8_t port_id,
+				uint16_t queue_id);
+
+/**
+ * When lcore wakes up from rx interrupt indicating packet coming, disable rx
+ * interrupt and returns to polling mode.
+ *
+ * The rte_eth_dev_rx_queue_intr_disable() function disables rx queue
+ * interrupt on specific rx queue of a port.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param queue_id
+ *   The index of the receive queue from which to retrieve input packets.
+ *   The value must be in the range [0, nb_rx_queue - 1] previously supplied
+ *   to rte_eth_dev_configure().
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if underlying hardware OR driver doesn't support
+ *     that operation.
+ *   - (-ENODEV) if *port_id* invalid.
+ */
+int rte_eth_dev_rx_queue_intr_disable(uint8_t port_id,
+				uint16_t queue_id);
+
+/**
  * Turn on the LED on the Ethernet device.
  * This function turns on the LED on the Ethernet device.
  *
diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map
index f66fd2d..6fef09e 100644
--- a/lib/librte_ether/rte_ether_version.map
+++ b/lib/librte_ether/rte_ether_version.map
@@ -42,6 +42,8 @@ DPDK_2.0 {
 	rte_eth_dev_rss_hash_update;
 	rte_eth_dev_rss_reta_query;
 	rte_eth_dev_rss_reta_update;
+	rte_eth_dev_rx_queue_intr_disable;
+	rte_eth_dev_rx_queue_intr_enable;
 	rte_eth_dev_rx_queue_start;
 	rte_eth_dev_rx_queue_stop;
 	rte_eth_dev_set_link_down;
-- 
1.8.1.4

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v5 0/6] Interrupt mode PMD
@ 2015-02-23 16:55  3% Zhou Danny
  2015-02-23 16:55  3% ` [dpdk-dev] [PATCH v5 1/6] ethdev: add rx interrupt enable/disable functions Zhou Danny
  0 siblings, 1 reply; 200+ results
From: Zhou Danny @ 2015-02-23 16:55 UTC (permalink / raw)
  To: dev

v5 changes
- Rebase the patchset onto the HEAD
- Isolate ethdev from EAL for new-added wait-for-rx interrupt function
- Export wait-for-rx interrupt function for shared libraries
- Split-off a new patch file for changed struct rte_intr_handle that
other patches depend on, to avoid breaking git bisect
- Change sample applicaiton to accomodate EAL function spec change
accordingly

v4 changes
- Export interrupt enable/disable functions for shared libraries
- Adjust position of new-added structure fields and functions to
avoid breaking ABI
 
v3 changes
- Add return value for interrupt enable/disable functions
- Move spinlok from PMD to L3fwd-power
- Remove unnecessary variables in e1000_mac_info
- Fix miscelleous review comments
 
v2 changes
- Fix compilation issue in Makefile for missed header file.
- Consolidate internal and community review comments of v1 patch set.
 
The patch series introduce low-latency one-shot rx interrupt into DPDK with
polling and interrupt mode switch control example.
 
DPDK userspace interrupt notification and handling mechanism is based on UIO
with below limitation:
1) It is designed to handle LSC interrupt only with inefficient suspended
pthread wakeup procedure (e.g. UIO wakes up LSC interrupt handling thread
which then wakes up DPDK polling thread). In this way, it introduces
non-deterministic wakeup latency for DPDK polling thread as well as packet
latency if it is used to handle Rx interrupt.
2) UIO only supports a single interrupt vector which has to been shared by
LSC interrupt and interrupts assigned to dedicated rx queues.
 
This patchset includes below features:
1) Enable one-shot rx queue interrupt in ixgbe PMD(PF & VF) and igb PMD(PF only).
2) Build on top of the VFIO mechanism instead of UIO, so it could support
up to 64 interrupt vectors for rx queue interrupts.
3) Have 1 DPDK polling thread handle per Rx queue interrupt with a dedicated
VFIO eventfd, which eliminates non-deterministic pthread wakeup latency in
user space.
4) Demonstrate interrupts control APIs and userspace NAIP-like polling/interrupt
switch algorithms in L3fwd-power example.

Known limitations:
1) It does not work for UIO due to a single interrupt eventfd shared by LSC
and rx queue interrupt handlers causes a mess.
2) LSC interrupt is not supported by VF driver, so it is by default disabled
in L3fwd-power now. Feel free to turn in on if you want to support both LSC
and rx queue interrupts on a PF.

Danny Zhou (6):
  ethdev: add rx interrupt enable/disable functions
  eal: add rx queue interrupt FDs to intr handle struct
  ixgbe: enable rx queue interrupts for both PF and VF
  igb: enable rx queue interrupts for PF
  eal: add per rx queue interrupt handling based on VFIO
  l3fwd-power: enable one-shot rx interrupt and polling/interrupt mode  
      switch

 examples/l3fwd-power/main.c                        | 155 ++++++---
 lib/librte_eal/bsdapp/eal/rte_eal_version.map      |   1 +
 lib/librte_eal/common/include/rte_eal.h            |   1 +
 lib/librte_eal/common/include/rte_interrupts.h     |  12 +
 lib/librte_eal/linuxapp/eal/eal_interrupts.c       | 191 ++++++++---
 lib/librte_eal/linuxapp/eal/eal_pci_vfio.c         |  12 +-
 .../linuxapp/eal/include/exec-env/rte_interrupts.h |   4 +
 lib/librte_eal/linuxapp/eal/rte_eal_version.map    |   1 +
 lib/librte_ether/rte_ethdev.c                      |  43 +++
 lib/librte_ether/rte_ethdev.h                      |  59 ++++
 lib/librte_ether/rte_ether_version.map             |   2 +
 lib/librte_pmd_e1000/e1000_ethdev.h                |   3 +
 lib/librte_pmd_e1000/igb_ethdev.c                  | 228 +++++++++++--
 lib/librte_pmd_ixgbe/ixgbe_ethdev.c                | 365 ++++++++++++++++++++-
 lib/librte_pmd_ixgbe/ixgbe_ethdev.h                |   7 +
 15 files changed, 970 insertions(+), 114 deletions(-)

-- 
1.8.1.4

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH 0/8] Improve build process
  2015-02-23 13:52  0%                                       ` Neil Horman
@ 2015-02-23 14:58  0%                                         ` Gonzalez Monroy, Sergio
  2015-02-23 18:23  0%                                           ` Neil Horman
  0 siblings, 1 reply; 200+ results
From: Gonzalez Monroy, Sergio @ 2015-02-23 14:58 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

On 23/02/2015 13:52, Neil Horman wrote:
> On Mon, Feb 23, 2015 at 10:25:01AM +0000, Gonzalez Monroy, Sergio wrote:
>> On 22/02/2015 23:37, Neil Horman wrote:
>>> On Fri, Feb 20, 2015 at 02:31:36PM +0000, Gonzalez Monroy, Sergio wrote:
>>>> On 13/02/2015 12:51, Neil Horman wrote:
>>>>> On Fri, Feb 13, 2015 at 11:08:02AM +0000, Gonzalez Monroy, Sergio wrote:
>>>>>> On 13/02/2015 10:14, Panu Matilainen wrote:
>>>>>>> On 02/12/2015 05:52 PM, Neil Horman wrote:
>>>>>>>> On Thu, Feb 12, 2015 at 04:07:50PM +0200, Panu Matilainen wrote:
>>>>>>>>> On 02/12/2015 02:23 PM, Neil Horman wrote:
>>>>>>> [...snip...]
>>>>>>>>>>>>> So I just realized that I was not having into account a possible
>>>>>>>>>>>>> scenario, where
>>>>>>>>>>>>> we have an app built with static dpdk libs then loading a dso
>>>>>>>>>>>>> with -d
>>>>>>>>>>>>> option.
>>>>>>>>>>>>>
>>>>>>>>>>>>> In such case, because the pmd would have DT_NEEDED entries,
>>>>>>>>>>>>> dlopen will
>>>>>>>>>>>>> fail.
>>>>>>>>>>>>> So to enable such scenario we would need to build PMDs without
>>>>>>>>>>>>> DT_NEEDED
>>>>>>>>>>>>> entries.
>>>>>>>>>>>> Hmm, for that to be a problem you'd need to have the PMD built
>>>>>>>>>>>> against
>>>>>>>>>>>> shared dpdk libs and while the application is built against
>>>>>>>>>>>> static dpdk
>>>>>>>>>>>> libs. I dont think that's a supportable scenario in any case.
>>>>>>>>>>>>
>>>>>>>>>>>> Or is there some other scenario that I'm not seeing?
>>>>>>>>>>>>
>>>>>>>>>>>>     - Panu -
>>>>>>>>>>>>
>>>>>>>>>>> I agree with you. I suppose it comes down to, do we want to
>>>>>>>>>>> support such
>>>>>>>>>>> scenario?
>>>>>>>>>>>
>>>>>>>>>>>  From what I can see, it seems that we do currently support such
>>>>>>>>>>> scenario by
>>>>>>>>>>> building dpdk apps against all static dpdk libs using
>>>>>>>>>>> --whole-archive (all
>>>>>>>>>>> libs and not only PMDs).
>>>>>>>>>>> http://dpdk.org/browse/dpdk/commit/?id=20afd76a504155e947c770783ef5023e87136ad8
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Am I misunderstanding this?
>>>>>>>>>>>
>>>>>>>>>> Shoot, you're right, I missed the static build aspect to this.  Yes,
>>>>>>>>>> if we do the following:
>>>>>>>>>>
>>>>>>>>>> 1) Build the DPDK as a static library
>>>>>>>>>> 2) Link an application against (1)
>>>>>>>>>> 3) Use the dlopen mechanism to load a PMD built as a DSO
>>>>>>>>>>
>>>>>>>>>> Then the DT_NEEDED entries in the DSO will go unsatisfied, because
>>>>>>>>>> the shared
>>>>>>>>>> objects on which it (the PMD) depends will not exist in the file
>>>>>>>>>> system.
>>>>>>>>> I think its even more twisty:
>>>>>>>>>
>>>>>>>>> 1) Build the DPDK as a static library
>>>>>>>>> 2) Link an application against (1)
>>>>>>>>> 3) Do another build of DPDK as a shared library
>>>>>>>>> 4) In app 2), use the dlopen mechanism to load a PMD built as a part
>>>>>>>>> of or
>>>>>>>>> against 3)
>>>>>>>>>
>>>>>>>>> Somehow I doubt this would work very well.
>>>>>>>>>
>>>>>>>> Ideally it should, presuming the ABI is preserved between (1) and (3),
>>>>>>>> though I
>>>>>>>> agree, up until recently, that was an assumption that was unreliable.
>>>>>>> Versioning is a big and important step towards reliability but there are
>>>>>>> more issues to solve. This of course getting pretty far from the original
>>>>>>> topic, but at least one such issue is that there are some cases where a
>>>>>>> config value affects what are apparently public structs (rte_mbuf wrt
>>>>>>> RTE_MBUF_REFCNT for example), which really is a no-go.
>>>>>>>
>>>>>> Agree, the RTE_MBUF_REFCNT is something that needs to be dealt with asap.
>>>>>> I'll look into it.
>>>>>>
>>>>>>>>>> I think the problem is a little bit orthogonal to the libdpdk_core
>>>>>>>>>> problem you
>>>>>>>>>> were initially addressing.  That is to say, this problem of
>>>>>>>>>> dlopen-ed PMD's
>>>>>>>>>> exists regardless of weather you build the DPDK as part of a static
>>>>>>>>>> or dynamic
>>>>>>>>>> library.  The problems just happen to intersect in their
>>>>>>>>>> manipulation of the
>>>>>>>>>> DT_NEEDED entries.
>>>>>>>>>>
>>>>>>>>>> Ok, so, given the above, I would say your approach is likely
>>>>>>>>>> correct, just
>>>>>>>>>> prevent DT_NEEDED entries from getting added to PMD's. Doing so will
>>>>>>>>>> sidestep
>>>>>>>>>> loading issue for libraries that may not exist in the filesystem,
>>>>>>>>>> but thats ok,
>>>>>>>>>> because by all rights, the symbols codified in those needed
>>>>>>>>>> libraries should
>>>>>>>>>> already be present in the running application (either made available
>>>>>>>>>> by the
>>>>>>>>>> application having statically linked them, or having the linker load
>>>>>>>>>> them from
>>>>>>>>>> the proper libraries at run time).
>>>>>>>>> My 5c is that I'd much rather see the common case (all static or all
>>>>>>>>> shared)
>>>>>>>>> be simple and reliable, which in case of DSOs includes no lying
>>>>>>>>> (whether by
>>>>>>>>> omission or otherwise) about DT_NEEDED, ever. That way the issue is
>>>>>>>>> dealt
>>>>>>>>> once where it belongs. If somebody wants to go down the rabbit hole of
>>>>>>>>> mixed
>>>>>>>>> shared + static linkage, let them dig the hole by themselves :)
>>>>>>>>>
>>>>>>>> This is a fair point.  Can DT_NEEDED sections be stripped via tools like
>>>>>>>> objcopy
>>>>>>>> after the build is complete?  If so, end users can hack this corner case
>>>>>>>> to work
>>>>>>>> as needed.
>>>>>>> Patchelf (http://nixos.org/patchelf.html) appears to support that, but
>>>>>>> given that source is available it'd be easier to just modify the makefiles
>>>>>>> if that's really needed.
>>>>>>>
>>>>>> I think we agree on the issue.
>>>>>>
>>>>>> So I'll be sending a patch to add DT_NEEDED entries to all libraries and
>>>>>> PMDs. The only exception would be librte_eal, which would not have proper
>>>>>> NEEDED entries.
>>>>>> Do we bother adding a linker script for librte_eal that would include
>>>>>> dependent libraries?
>>>>>>
>>>>> I say yes to the linker script, but will happily bow to an alternate consensus
>>>>> Neil
>>>>>
>>>> So the case we want to solve is the following circular dependencies:
>>>> eal             -> mempool, malloc
>>>> mempool -> eal , malloc, ring
>>>> malloc      -> eal
>>>> ring           -> eal, malloc
>>>>
>>>> We cannot write/create the proposed (below) linker script at least until we
>>>> have built mempool and malloc.
>>>> INPUT ( -lrte_eal.so -lrte_mempool -lrte_malloc )
>>>>
>>> Not sure I understand why you have a build time dependency on this.  Link time
>>> perhaps, but not build time.  Or am I reading too much into your use of the term
>>> 'built' above?
>> I meant 'built' as compiled + linked. Am I misusing the term?
> No, you're not (though I misused the term link time above, I meant to say load
> time).  So you're saying that when you build shared libraries, you get linker
> errors indicating that, during the build, you're missing symbols, is that
> correct?  I guess I'm confused because I don't see how thats not happening for
> everyone, right now.  In other words, I'm not sure what about your changes is
> giving rise to that problem.
>
>>>> Few ways I have thought about implementing this (not particularly fond of
>>>> any of them) :
>>>>   - Have the linker script file in the repo (scripts/ ?) in a fixed location
>>>> and just copy it to $(RTE_OUTPUT)/lib/ once all libs have finished building.
>>>>   - Generate the file on build time from a defined make variable once all
>>>> libs have finished
>>>>
>>> I'm still not sure I understand.  Why does this dependency exist at build time?
>>> The dependency between malloc and eal shouldn't be a problem during the build,
>>> as symbols from each other should just remain undefined, and get resolved at
>>> load time.
>> Is that not the way it is currently implemented?
>> I get the impression that we are talking about different goals (correct me
>> if it is not the case)
>>
> We may well be, I'm not sure yet.
>
>> I thought that the agreed solution was to:
>> 1) NOT to create/generate a 'core' library
>> 2) Add DT_NEEDED entries for all libraries (except eal which is the first
>> library we link)
>> 3) Use linker script for eal
>>
> Ok, we're definately on the same page, as thats what I thought the goal was as
> well.
>
>> Given the previously mentioned circular dependencies between eal, mempool,
>> malloc and ring:
>> - eal would not be linked against other libraries (no NEEDED entries)
>> - malloc is linked against eal (previously built), so malloc would have a
>> NEEDED entry for eal.
>>
>> In that scenario, if the linker script is setup/created after we build eal,
>> then when we try to link malloc
>> against eal, the linker will pull mempool and malloc too (because we
>> included them in the linker script).
>> Therefore, the link fails as none of those libraries (malloc and mempool)
>> have been built yet.
>>
> Ah, I see now, I wasn't thinking about the extra requirements that DT_NEEDED
> entries placed on the build conditions.
>
> I see now, apologies for being dense previously.  Given what you indicate I
> would say that the solution here is to link the libraries against individual
> other specific libraries, not the core library that you generate as a linker
> script.  That way you avoid the circular dependency, and the core library just
> becomes a convienience for application developers looking to link to a single
> library.
>
I'm not sure I quite understand your suggestion.

Could you roughly describe steps for building eal, malloc and mempool libs ?
For example, something like this?
1) build eal, which creates librte_eal.so.1
2) write linker script for librte_eal.so
3) build malloc against eal (-lrte_eal )
etc

I suppose that another way to go about this, instead of creating the 
linker script that pulls
dependent libraries, is to always link (using --no-as-needed in case gcc 
adds it by default)
against these libraries (eal, mempool, malloc, and ring) with necessary 
doc about how to build apps.

Sergio
> Neil
>
>> Was your suggestion to leave all of these libraries (eal, mempool, malloc,
>> ring) without NEEDED entries?
>>
> No, you can add NEEDED entries there, they will just be for the individual
> libraries, not the core linker script library.
>
> Best
> Neil
>
>> Regards,
>> Sergio
>>> What is the error you are getting?
>>>
>>> Best
>>> Neil
>>>
>>>> Thoughts? any other approached is more than welcome!
>>>>
>>>> Sergio
>>>>
>>>> PS: Thinking again on the core library and the issue of having multiple
>>>> version.map files, we could have a core_version.map instead instead of
>>>> multiple files per core library (eal, mempool, etc)
>>>>
>>>>
>>
>>

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 0/8] Improve build process
  2015-02-23 10:25  0%                                     ` Gonzalez Monroy, Sergio
@ 2015-02-23 13:52  0%                                       ` Neil Horman
  2015-02-23 14:58  0%                                         ` Gonzalez Monroy, Sergio
  0 siblings, 1 reply; 200+ results
From: Neil Horman @ 2015-02-23 13:52 UTC (permalink / raw)
  To: Gonzalez Monroy, Sergio; +Cc: dev

On Mon, Feb 23, 2015 at 10:25:01AM +0000, Gonzalez Monroy, Sergio wrote:
> On 22/02/2015 23:37, Neil Horman wrote:
> >On Fri, Feb 20, 2015 at 02:31:36PM +0000, Gonzalez Monroy, Sergio wrote:
> >>On 13/02/2015 12:51, Neil Horman wrote:
> >>>On Fri, Feb 13, 2015 at 11:08:02AM +0000, Gonzalez Monroy, Sergio wrote:
> >>>>On 13/02/2015 10:14, Panu Matilainen wrote:
> >>>>>On 02/12/2015 05:52 PM, Neil Horman wrote:
> >>>>>>On Thu, Feb 12, 2015 at 04:07:50PM +0200, Panu Matilainen wrote:
> >>>>>>>On 02/12/2015 02:23 PM, Neil Horman wrote:
> >>>>>[...snip...]
> >>>>>>>>>>>So I just realized that I was not having into account a possible
> >>>>>>>>>>>scenario, where
> >>>>>>>>>>>we have an app built with static dpdk libs then loading a dso
> >>>>>>>>>>>with -d
> >>>>>>>>>>>option.
> >>>>>>>>>>>
> >>>>>>>>>>>In such case, because the pmd would have DT_NEEDED entries,
> >>>>>>>>>>>dlopen will
> >>>>>>>>>>>fail.
> >>>>>>>>>>>So to enable such scenario we would need to build PMDs without
> >>>>>>>>>>>DT_NEEDED
> >>>>>>>>>>>entries.
> >>>>>>>>>>Hmm, for that to be a problem you'd need to have the PMD built
> >>>>>>>>>>against
> >>>>>>>>>>shared dpdk libs and while the application is built against
> >>>>>>>>>>static dpdk
> >>>>>>>>>>libs. I dont think that's a supportable scenario in any case.
> >>>>>>>>>>
> >>>>>>>>>>Or is there some other scenario that I'm not seeing?
> >>>>>>>>>>
> >>>>>>>>>>    - Panu -
> >>>>>>>>>>
> >>>>>>>>>I agree with you. I suppose it comes down to, do we want to
> >>>>>>>>>support such
> >>>>>>>>>scenario?
> >>>>>>>>>
> >>>>>>>>> From what I can see, it seems that we do currently support such
> >>>>>>>>>scenario by
> >>>>>>>>>building dpdk apps against all static dpdk libs using
> >>>>>>>>>--whole-archive (all
> >>>>>>>>>libs and not only PMDs).
> >>>>>>>>>http://dpdk.org/browse/dpdk/commit/?id=20afd76a504155e947c770783ef5023e87136ad8
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>>Am I misunderstanding this?
> >>>>>>>>>
> >>>>>>>>Shoot, you're right, I missed the static build aspect to this.  Yes,
> >>>>>>>>if we do the following:
> >>>>>>>>
> >>>>>>>>1) Build the DPDK as a static library
> >>>>>>>>2) Link an application against (1)
> >>>>>>>>3) Use the dlopen mechanism to load a PMD built as a DSO
> >>>>>>>>
> >>>>>>>>Then the DT_NEEDED entries in the DSO will go unsatisfied, because
> >>>>>>>>the shared
> >>>>>>>>objects on which it (the PMD) depends will not exist in the file
> >>>>>>>>system.
> >>>>>>>I think its even more twisty:
> >>>>>>>
> >>>>>>>1) Build the DPDK as a static library
> >>>>>>>2) Link an application against (1)
> >>>>>>>3) Do another build of DPDK as a shared library
> >>>>>>>4) In app 2), use the dlopen mechanism to load a PMD built as a part
> >>>>>>>of or
> >>>>>>>against 3)
> >>>>>>>
> >>>>>>>Somehow I doubt this would work very well.
> >>>>>>>
> >>>>>>Ideally it should, presuming the ABI is preserved between (1) and (3),
> >>>>>>though I
> >>>>>>agree, up until recently, that was an assumption that was unreliable.
> >>>>>Versioning is a big and important step towards reliability but there are
> >>>>>more issues to solve. This of course getting pretty far from the original
> >>>>>topic, but at least one such issue is that there are some cases where a
> >>>>>config value affects what are apparently public structs (rte_mbuf wrt
> >>>>>RTE_MBUF_REFCNT for example), which really is a no-go.
> >>>>>
> >>>>Agree, the RTE_MBUF_REFCNT is something that needs to be dealt with asap.
> >>>>I'll look into it.
> >>>>
> >>>>>>>>I think the problem is a little bit orthogonal to the libdpdk_core
> >>>>>>>>problem you
> >>>>>>>>were initially addressing.  That is to say, this problem of
> >>>>>>>>dlopen-ed PMD's
> >>>>>>>>exists regardless of weather you build the DPDK as part of a static
> >>>>>>>>or dynamic
> >>>>>>>>library.  The problems just happen to intersect in their
> >>>>>>>>manipulation of the
> >>>>>>>>DT_NEEDED entries.
> >>>>>>>>
> >>>>>>>>Ok, so, given the above, I would say your approach is likely
> >>>>>>>>correct, just
> >>>>>>>>prevent DT_NEEDED entries from getting added to PMD's. Doing so will
> >>>>>>>>sidestep
> >>>>>>>>loading issue for libraries that may not exist in the filesystem,
> >>>>>>>>but thats ok,
> >>>>>>>>because by all rights, the symbols codified in those needed
> >>>>>>>>libraries should
> >>>>>>>>already be present in the running application (either made available
> >>>>>>>>by the
> >>>>>>>>application having statically linked them, or having the linker load
> >>>>>>>>them from
> >>>>>>>>the proper libraries at run time).
> >>>>>>>My 5c is that I'd much rather see the common case (all static or all
> >>>>>>>shared)
> >>>>>>>be simple and reliable, which in case of DSOs includes no lying
> >>>>>>>(whether by
> >>>>>>>omission or otherwise) about DT_NEEDED, ever. That way the issue is
> >>>>>>>dealt
> >>>>>>>once where it belongs. If somebody wants to go down the rabbit hole of
> >>>>>>>mixed
> >>>>>>>shared + static linkage, let them dig the hole by themselves :)
> >>>>>>>
> >>>>>>This is a fair point.  Can DT_NEEDED sections be stripped via tools like
> >>>>>>objcopy
> >>>>>>after the build is complete?  If so, end users can hack this corner case
> >>>>>>to work
> >>>>>>as needed.
> >>>>>Patchelf (http://nixos.org/patchelf.html) appears to support that, but
> >>>>>given that source is available it'd be easier to just modify the makefiles
> >>>>>if that's really needed.
> >>>>>
> >>>>I think we agree on the issue.
> >>>>
> >>>>So I'll be sending a patch to add DT_NEEDED entries to all libraries and
> >>>>PMDs. The only exception would be librte_eal, which would not have proper
> >>>>NEEDED entries.
> >>>>Do we bother adding a linker script for librte_eal that would include
> >>>>dependent libraries?
> >>>>
> >>>I say yes to the linker script, but will happily bow to an alternate consensus
> >>>Neil
> >>>
> >>So the case we want to solve is the following circular dependencies:
> >>eal             -> mempool, malloc
> >>mempool -> eal , malloc, ring
> >>malloc      -> eal
> >>ring           -> eal, malloc
> >>
> >>We cannot write/create the proposed (below) linker script at least until we
> >>have built mempool and malloc.
> >>INPUT ( -lrte_eal.so -lrte_mempool -lrte_malloc )
> >>
> >Not sure I understand why you have a build time dependency on this.  Link time
> >perhaps, but not build time.  Or am I reading too much into your use of the term
> >'built' above?
> I meant 'built' as compiled + linked. Am I misusing the term?
No, you're not (though I misused the term link time above, I meant to say load
time).  So you're saying that when you build shared libraries, you get linker
errors indicating that, during the build, you're missing symbols, is that
correct?  I guess I'm confused because I don't see how thats not happening for
everyone, right now.  In other words, I'm not sure what about your changes is
giving rise to that problem.

> >>Few ways I have thought about implementing this (not particularly fond of
> >>any of them) :
> >>  - Have the linker script file in the repo (scripts/ ?) in a fixed location
> >>and just copy it to $(RTE_OUTPUT)/lib/ once all libs have finished building.
> >>  - Generate the file on build time from a defined make variable once all
> >>libs have finished
> >>
> >I'm still not sure I understand.  Why does this dependency exist at build time?
> >The dependency between malloc and eal shouldn't be a problem during the build,
> >as symbols from each other should just remain undefined, and get resolved at
> >load time.
> Is that not the way it is currently implemented?
> I get the impression that we are talking about different goals (correct me
> if it is not the case)
> 
We may well be, I'm not sure yet.

> I thought that the agreed solution was to:
> 1) NOT to create/generate a 'core' library
> 2) Add DT_NEEDED entries for all libraries (except eal which is the first
> library we link)
> 3) Use linker script for eal
> 
Ok, we're definately on the same page, as thats what I thought the goal was as
well.

> Given the previously mentioned circular dependencies between eal, mempool,
> malloc and ring:
> - eal would not be linked against other libraries (no NEEDED entries)
> - malloc is linked against eal (previously built), so malloc would have a
> NEEDED entry for eal.
> 
> In that scenario, if the linker script is setup/created after we build eal,
> then when we try to link malloc
> against eal, the linker will pull mempool and malloc too (because we
> included them in the linker script).
> Therefore, the link fails as none of those libraries (malloc and mempool)
> have been built yet.
> 
Ah, I see now, I wasn't thinking about the extra requirements that DT_NEEDED
entries placed on the build conditions.

I see now, apologies for being dense previously.  Given what you indicate I
would say that the solution here is to link the libraries against individual
other specific libraries, not the core library that you generate as a linker
script.  That way you avoid the circular dependency, and the core library just
becomes a convienience for application developers looking to link to a single
library.

Neil

> Was your suggestion to leave all of these libraries (eal, mempool, malloc,
> ring) without NEEDED entries?
> 
No, you can add NEEDED entries there, they will just be for the individual
libraries, not the core linker script library.

Best
Neil

> Regards,
> Sergio
> >What is the error you are getting?
> >
> >Best
> >Neil
> >
> >>Thoughts? any other approached is more than welcome!
> >>
> >>Sergio
> >>
> >>PS: Thinking again on the core library and the issue of having multiple
> >>version.map files, we could have a core_version.map instead instead of
> >>multiple files per core library (eal, mempool, etc)
> >>
> >>
> 
> 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 0/8] Improve build process
  2015-02-22 23:37  0%                                   ` Neil Horman
@ 2015-02-23 10:25  0%                                     ` Gonzalez Monroy, Sergio
  2015-02-23 13:52  0%                                       ` Neil Horman
  0 siblings, 1 reply; 200+ results
From: Gonzalez Monroy, Sergio @ 2015-02-23 10:25 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

On 22/02/2015 23:37, Neil Horman wrote:
> On Fri, Feb 20, 2015 at 02:31:36PM +0000, Gonzalez Monroy, Sergio wrote:
>> On 13/02/2015 12:51, Neil Horman wrote:
>>> On Fri, Feb 13, 2015 at 11:08:02AM +0000, Gonzalez Monroy, Sergio wrote:
>>>> On 13/02/2015 10:14, Panu Matilainen wrote:
>>>>> On 02/12/2015 05:52 PM, Neil Horman wrote:
>>>>>> On Thu, Feb 12, 2015 at 04:07:50PM +0200, Panu Matilainen wrote:
>>>>>>> On 02/12/2015 02:23 PM, Neil Horman wrote:
>>>>> [...snip...]
>>>>>>>>>>> So I just realized that I was not having into account a possible
>>>>>>>>>>> scenario, where
>>>>>>>>>>> we have an app built with static dpdk libs then loading a dso
>>>>>>>>>>> with -d
>>>>>>>>>>> option.
>>>>>>>>>>>
>>>>>>>>>>> In such case, because the pmd would have DT_NEEDED entries,
>>>>>>>>>>> dlopen will
>>>>>>>>>>> fail.
>>>>>>>>>>> So to enable such scenario we would need to build PMDs without
>>>>>>>>>>> DT_NEEDED
>>>>>>>>>>> entries.
>>>>>>>>>> Hmm, for that to be a problem you'd need to have the PMD built
>>>>>>>>>> against
>>>>>>>>>> shared dpdk libs and while the application is built against
>>>>>>>>>> static dpdk
>>>>>>>>>> libs. I dont think that's a supportable scenario in any case.
>>>>>>>>>>
>>>>>>>>>> Or is there some other scenario that I'm not seeing?
>>>>>>>>>>
>>>>>>>>>>     - Panu -
>>>>>>>>>>
>>>>>>>>> I agree with you. I suppose it comes down to, do we want to
>>>>>>>>> support such
>>>>>>>>> scenario?
>>>>>>>>>
>>>>>>>>>  From what I can see, it seems that we do currently support such
>>>>>>>>> scenario by
>>>>>>>>> building dpdk apps against all static dpdk libs using
>>>>>>>>> --whole-archive (all
>>>>>>>>> libs and not only PMDs).
>>>>>>>>> http://dpdk.org/browse/dpdk/commit/?id=20afd76a504155e947c770783ef5023e87136ad8
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Am I misunderstanding this?
>>>>>>>>>
>>>>>>>> Shoot, you're right, I missed the static build aspect to this.  Yes,
>>>>>>>> if we do the following:
>>>>>>>>
>>>>>>>> 1) Build the DPDK as a static library
>>>>>>>> 2) Link an application against (1)
>>>>>>>> 3) Use the dlopen mechanism to load a PMD built as a DSO
>>>>>>>>
>>>>>>>> Then the DT_NEEDED entries in the DSO will go unsatisfied, because
>>>>>>>> the shared
>>>>>>>> objects on which it (the PMD) depends will not exist in the file
>>>>>>>> system.
>>>>>>> I think its even more twisty:
>>>>>>>
>>>>>>> 1) Build the DPDK as a static library
>>>>>>> 2) Link an application against (1)
>>>>>>> 3) Do another build of DPDK as a shared library
>>>>>>> 4) In app 2), use the dlopen mechanism to load a PMD built as a part
>>>>>>> of or
>>>>>>> against 3)
>>>>>>>
>>>>>>> Somehow I doubt this would work very well.
>>>>>>>
>>>>>> Ideally it should, presuming the ABI is preserved between (1) and (3),
>>>>>> though I
>>>>>> agree, up until recently, that was an assumption that was unreliable.
>>>>> Versioning is a big and important step towards reliability but there are
>>>>> more issues to solve. This of course getting pretty far from the original
>>>>> topic, but at least one such issue is that there are some cases where a
>>>>> config value affects what are apparently public structs (rte_mbuf wrt
>>>>> RTE_MBUF_REFCNT for example), which really is a no-go.
>>>>>
>>>> Agree, the RTE_MBUF_REFCNT is something that needs to be dealt with asap.
>>>> I'll look into it.
>>>>
>>>>>>>> I think the problem is a little bit orthogonal to the libdpdk_core
>>>>>>>> problem you
>>>>>>>> were initially addressing.  That is to say, this problem of
>>>>>>>> dlopen-ed PMD's
>>>>>>>> exists regardless of weather you build the DPDK as part of a static
>>>>>>>> or dynamic
>>>>>>>> library.  The problems just happen to intersect in their
>>>>>>>> manipulation of the
>>>>>>>> DT_NEEDED entries.
>>>>>>>>
>>>>>>>> Ok, so, given the above, I would say your approach is likely
>>>>>>>> correct, just
>>>>>>>> prevent DT_NEEDED entries from getting added to PMD's. Doing so will
>>>>>>>> sidestep
>>>>>>>> loading issue for libraries that may not exist in the filesystem,
>>>>>>>> but thats ok,
>>>>>>>> because by all rights, the symbols codified in those needed
>>>>>>>> libraries should
>>>>>>>> already be present in the running application (either made available
>>>>>>>> by the
>>>>>>>> application having statically linked them, or having the linker load
>>>>>>>> them from
>>>>>>>> the proper libraries at run time).
>>>>>>> My 5c is that I'd much rather see the common case (all static or all
>>>>>>> shared)
>>>>>>> be simple and reliable, which in case of DSOs includes no lying
>>>>>>> (whether by
>>>>>>> omission or otherwise) about DT_NEEDED, ever. That way the issue is
>>>>>>> dealt
>>>>>>> once where it belongs. If somebody wants to go down the rabbit hole of
>>>>>>> mixed
>>>>>>> shared + static linkage, let them dig the hole by themselves :)
>>>>>>>
>>>>>> This is a fair point.  Can DT_NEEDED sections be stripped via tools like
>>>>>> objcopy
>>>>>> after the build is complete?  If so, end users can hack this corner case
>>>>>> to work
>>>>>> as needed.
>>>>> Patchelf (http://nixos.org/patchelf.html) appears to support that, but
>>>>> given that source is available it'd be easier to just modify the makefiles
>>>>> if that's really needed.
>>>>>
>>>> I think we agree on the issue.
>>>>
>>>> So I'll be sending a patch to add DT_NEEDED entries to all libraries and
>>>> PMDs. The only exception would be librte_eal, which would not have proper
>>>> NEEDED entries.
>>>> Do we bother adding a linker script for librte_eal that would include
>>>> dependent libraries?
>>>>
>>> I say yes to the linker script, but will happily bow to an alternate consensus
>>> Neil
>>>
>> So the case we want to solve is the following circular dependencies:
>> eal             -> mempool, malloc
>> mempool -> eal , malloc, ring
>> malloc      -> eal
>> ring           -> eal, malloc
>>
>> We cannot write/create the proposed (below) linker script at least until we
>> have built mempool and malloc.
>> INPUT ( -lrte_eal.so -lrte_mempool -lrte_malloc )
>>
> Not sure I understand why you have a build time dependency on this.  Link time
> perhaps, but not build time.  Or am I reading too much into your use of the term
> 'built' above?
I meant 'built' as compiled + linked. Am I misusing the term?
>> Few ways I have thought about implementing this (not particularly fond of
>> any of them) :
>>   - Have the linker script file in the repo (scripts/ ?) in a fixed location
>> and just copy it to $(RTE_OUTPUT)/lib/ once all libs have finished building.
>>   - Generate the file on build time from a defined make variable once all
>> libs have finished
>>
> I'm still not sure I understand.  Why does this dependency exist at build time?
> The dependency between malloc and eal shouldn't be a problem during the build,
> as symbols from each other should just remain undefined, and get resolved at
> load time.
Is that not the way it is currently implemented?
I get the impression that we are talking about different goals (correct 
me if it is not the case)

I thought that the agreed solution was to:
1) NOT to create/generate a 'core' library
2) Add DT_NEEDED entries for all libraries (except eal which is the 
first library we link)
3) Use linker script for eal

Given the previously mentioned circular dependencies between eal, 
mempool, malloc and ring:
- eal would not be linked against other libraries (no NEEDED entries)
- malloc is linked against eal (previously built), so malloc would have 
a NEEDED entry for eal.

In that scenario, if the linker script is setup/created after we build 
eal, then when we try to link malloc
against eal, the linker will pull mempool and malloc too (because we 
included them in the linker script).
Therefore, the link fails as none of those libraries (malloc and 
mempool) have been built yet.

Was your suggestion to leave all of these libraries (eal, mempool, 
malloc, ring) without NEEDED entries?

Regards,
Sergio
> What is the error you are getting?
>
> Best
> Neil
>
>> Thoughts? any other approached is more than welcome!
>>
>> Sergio
>>
>> PS: Thinking again on the core library and the issue of having multiple
>> version.map files, we could have a core_version.map instead instead of
>> multiple files per core library (eal, mempool, etc)
>>
>>

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 0/8] Improve build process
  2015-02-20 14:31  0%                                 ` Gonzalez Monroy, Sergio
@ 2015-02-22 23:37  0%                                   ` Neil Horman
  2015-02-23 10:25  0%                                     ` Gonzalez Monroy, Sergio
  0 siblings, 1 reply; 200+ results
From: Neil Horman @ 2015-02-22 23:37 UTC (permalink / raw)
  To: Gonzalez Monroy, Sergio; +Cc: dev

On Fri, Feb 20, 2015 at 02:31:36PM +0000, Gonzalez Monroy, Sergio wrote:
> On 13/02/2015 12:51, Neil Horman wrote:
> >On Fri, Feb 13, 2015 at 11:08:02AM +0000, Gonzalez Monroy, Sergio wrote:
> >>On 13/02/2015 10:14, Panu Matilainen wrote:
> >>>On 02/12/2015 05:52 PM, Neil Horman wrote:
> >>>>On Thu, Feb 12, 2015 at 04:07:50PM +0200, Panu Matilainen wrote:
> >>>>>On 02/12/2015 02:23 PM, Neil Horman wrote:
> >>>[...snip...]
> >>>>>>>>>So I just realized that I was not having into account a possible
> >>>>>>>>>scenario, where
> >>>>>>>>>we have an app built with static dpdk libs then loading a dso
> >>>>>>>>>with -d
> >>>>>>>>>option.
> >>>>>>>>>
> >>>>>>>>>In such case, because the pmd would have DT_NEEDED entries,
> >>>>>>>>>dlopen will
> >>>>>>>>>fail.
> >>>>>>>>>So to enable such scenario we would need to build PMDs without
> >>>>>>>>>DT_NEEDED
> >>>>>>>>>entries.
> >>>>>>>>Hmm, for that to be a problem you'd need to have the PMD built
> >>>>>>>>against
> >>>>>>>>shared dpdk libs and while the application is built against
> >>>>>>>>static dpdk
> >>>>>>>>libs. I dont think that's a supportable scenario in any case.
> >>>>>>>>
> >>>>>>>>Or is there some other scenario that I'm not seeing?
> >>>>>>>>
> >>>>>>>>    - Panu -
> >>>>>>>>
> >>>>>>>I agree with you. I suppose it comes down to, do we want to
> >>>>>>>support such
> >>>>>>>scenario?
> >>>>>>>
> >>>>>>> From what I can see, it seems that we do currently support such
> >>>>>>>scenario by
> >>>>>>>building dpdk apps against all static dpdk libs using
> >>>>>>>--whole-archive (all
> >>>>>>>libs and not only PMDs).
> >>>>>>>http://dpdk.org/browse/dpdk/commit/?id=20afd76a504155e947c770783ef5023e87136ad8
> >>>>>>>
> >>>>>>>
> >>>>>>>Am I misunderstanding this?
> >>>>>>>
> >>>>>>Shoot, you're right, I missed the static build aspect to this.  Yes,
> >>>>>>if we do the following:
> >>>>>>
> >>>>>>1) Build the DPDK as a static library
> >>>>>>2) Link an application against (1)
> >>>>>>3) Use the dlopen mechanism to load a PMD built as a DSO
> >>>>>>
> >>>>>>Then the DT_NEEDED entries in the DSO will go unsatisfied, because
> >>>>>>the shared
> >>>>>>objects on which it (the PMD) depends will not exist in the file
> >>>>>>system.
> >>>>>I think its even more twisty:
> >>>>>
> >>>>>1) Build the DPDK as a static library
> >>>>>2) Link an application against (1)
> >>>>>3) Do another build of DPDK as a shared library
> >>>>>4) In app 2), use the dlopen mechanism to load a PMD built as a part
> >>>>>of or
> >>>>>against 3)
> >>>>>
> >>>>>Somehow I doubt this would work very well.
> >>>>>
> >>>>Ideally it should, presuming the ABI is preserved between (1) and (3),
> >>>>though I
> >>>>agree, up until recently, that was an assumption that was unreliable.
> >>>Versioning is a big and important step towards reliability but there are
> >>>more issues to solve. This of course getting pretty far from the original
> >>>topic, but at least one such issue is that there are some cases where a
> >>>config value affects what are apparently public structs (rte_mbuf wrt
> >>>RTE_MBUF_REFCNT for example), which really is a no-go.
> >>>
> >>Agree, the RTE_MBUF_REFCNT is something that needs to be dealt with asap.
> >>I'll look into it.
> >>
> >>>>>>I think the problem is a little bit orthogonal to the libdpdk_core
> >>>>>>problem you
> >>>>>>were initially addressing.  That is to say, this problem of
> >>>>>>dlopen-ed PMD's
> >>>>>>exists regardless of weather you build the DPDK as part of a static
> >>>>>>or dynamic
> >>>>>>library.  The problems just happen to intersect in their
> >>>>>>manipulation of the
> >>>>>>DT_NEEDED entries.
> >>>>>>
> >>>>>>Ok, so, given the above, I would say your approach is likely
> >>>>>>correct, just
> >>>>>>prevent DT_NEEDED entries from getting added to PMD's. Doing so will
> >>>>>>sidestep
> >>>>>>loading issue for libraries that may not exist in the filesystem,
> >>>>>>but thats ok,
> >>>>>>because by all rights, the symbols codified in those needed
> >>>>>>libraries should
> >>>>>>already be present in the running application (either made available
> >>>>>>by the
> >>>>>>application having statically linked them, or having the linker load
> >>>>>>them from
> >>>>>>the proper libraries at run time).
> >>>>>My 5c is that I'd much rather see the common case (all static or all
> >>>>>shared)
> >>>>>be simple and reliable, which in case of DSOs includes no lying
> >>>>>(whether by
> >>>>>omission or otherwise) about DT_NEEDED, ever. That way the issue is
> >>>>>dealt
> >>>>>once where it belongs. If somebody wants to go down the rabbit hole of
> >>>>>mixed
> >>>>>shared + static linkage, let them dig the hole by themselves :)
> >>>>>
> >>>>This is a fair point.  Can DT_NEEDED sections be stripped via tools like
> >>>>objcopy
> >>>>after the build is complete?  If so, end users can hack this corner case
> >>>>to work
> >>>>as needed.
> >>>Patchelf (http://nixos.org/patchelf.html) appears to support that, but
> >>>given that source is available it'd be easier to just modify the makefiles
> >>>if that's really needed.
> >>>
> >>I think we agree on the issue.
> >>
> >>So I'll be sending a patch to add DT_NEEDED entries to all libraries and
> >>PMDs. The only exception would be librte_eal, which would not have proper
> >>NEEDED entries.
> >>Do we bother adding a linker script for librte_eal that would include
> >>dependent libraries?
> >>
> >I say yes to the linker script, but will happily bow to an alternate consensus
> >Neil
> >
> So the case we want to solve is the following circular dependencies:
> eal             -> mempool, malloc
> mempool -> eal , malloc, ring
> malloc      -> eal
> ring           -> eal, malloc
> 
> We cannot write/create the proposed (below) linker script at least until we
> have built mempool and malloc.
> INPUT ( -lrte_eal.so -lrte_mempool -lrte_malloc )
> 
Not sure I understand why you have a build time dependency on this.  Link time
perhaps, but not build time.  Or am I reading too much into your use of the term
'built' above?

> Few ways I have thought about implementing this (not particularly fond of
> any of them) :
>  - Have the linker script file in the repo (scripts/ ?) in a fixed location
> and just copy it to $(RTE_OUTPUT)/lib/ once all libs have finished building.
>  - Generate the file on build time from a defined make variable once all
> libs have finished
> 
I'm still not sure I understand.  Why does this dependency exist at build time?
The dependency between malloc and eal shouldn't be a problem during the build,
as symbols from each other should just remain undefined, and get resolved at
load time.

What is the error you are getting?

Best
Neil

> Thoughts? any other approached is more than welcome!
> 
> Sergio
> 
> PS: Thinking again on the core library and the issue of having multiple
> version.map files, we could have a core_version.map instead instead of
> multiple files per core library (eal, mempool, etc)
> 
> 

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v5 0/3] DPDK ethdev callback support
  2015-02-18 17:42  4% ` [dpdk-dev] [PATCH v3 0/3] " John McNamara
  2015-02-19 17:56  4%   ` [dpdk-dev] [PATCH v4 " John McNamara
@ 2015-02-20 17:03  4%   ` John McNamara
  1 sibling, 0 replies; 200+ results
From: John McNamara @ 2015-02-20 17:03 UTC (permalink / raw)
  To: dev

This patchset is for a small optional addition to the ethdev library,
to add support for callbacks at the RX and TX stages. This allows
packet processing to be done on packets before they get returned
to applications using rte_eth_rx_burst call.

See the RFC cover letter for the use cases:

    http://dpdk.org/ml/archives/dev/2014-December/010491.html

For this version we spent some time investigating Stephen Hemminger's
suggestion of using the userspace RCU (read-copy-update) library for
SMP safety:

   http://urcu.so/

The default liburcu (which defaulted to liburcu-mb) requires the least
interaction from the end user but showed a 25% drop in packet throughput
in the callback sample app.

The liburcu-qsbr (quiescent state) variant showed a 1% drop in packet
throughput in the callback sample app. However it requires registered
RCU threads in the program to periodically announce quiescent states.
This makes it more difficult to implement for end user applications.

For this release we will document that adding and removing callbacks
is not thread safe.

Note: Sample application documentation to follow in a patch update.

Version 5 changes:
    * Turn the callback feature on by default.
    * Simplify #define name.

Version 4 changes:
    * Make the callback feature a compile time option.

Version 3 changes:
    * Removed unnecessary header file from example folder
      (which included baremetal reference).
    * Renamed the interrupt, RX and TX callbacks to make their function
      clearer (using the names suggested in the mailing list comments).
    * Squashed ABI version update into the commit it relates to.
    * Fixed various checkpatch warnings.

Version 2 changes:
    * Added ABI versioning.
    * Doxygen clarifications.

Version 1 changes:
    * Added callback removal functions.
    * Minor fixes.


Richardson, Bruce (3):
  ethdev: rename callbacks field to link_intr_cbs
  ethdev: add optional rxtx callback support
  examples: example showing use of callbacks.

 MAINTAINERS                            |    4 +
 app/test/virtual_pmd.c                 |    2 +-
 config/common_bsdapp                   |    1 +
 config/common_linuxapp                 |    1 +
 examples/Makefile                      |    1 +
 examples/rxtx_callbacks/Makefile       |   57 ++++++++
 examples/rxtx_callbacks/main.c         |  228 ++++++++++++++++++++++++++++++++
 lib/librte_ether/rte_ethdev.c          |  204 +++++++++++++++++++++++++++--
 lib/librte_ether/rte_ethdev.h          |  204 ++++++++++++++++++++++++++++-
 lib/librte_ether/rte_ether_version.map |    4 +
 lib/librte_pmd_bond/rte_eth_bond_api.c |    2 +-
 lib/librte_pmd_ring/rte_eth_ring.c     |    2 +-
 12 files changed, 696 insertions(+), 14 deletions(-)
 create mode 100644 examples/rxtx_callbacks/Makefile
 create mode 100644 examples/rxtx_callbacks/main.c

-- 
1.7.4.1

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH 0/8] Improve build process
  2015-02-13 12:51  0%                               ` Neil Horman
@ 2015-02-20 14:31  0%                                 ` Gonzalez Monroy, Sergio
  2015-02-22 23:37  0%                                   ` Neil Horman
  0 siblings, 1 reply; 200+ results
From: Gonzalez Monroy, Sergio @ 2015-02-20 14:31 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

On 13/02/2015 12:51, Neil Horman wrote:
> On Fri, Feb 13, 2015 at 11:08:02AM +0000, Gonzalez Monroy, Sergio wrote:
>> On 13/02/2015 10:14, Panu Matilainen wrote:
>>> On 02/12/2015 05:52 PM, Neil Horman wrote:
>>>> On Thu, Feb 12, 2015 at 04:07:50PM +0200, Panu Matilainen wrote:
>>>>> On 02/12/2015 02:23 PM, Neil Horman wrote:
>>> [...snip...]
>>>>>>>>> So I just realized that I was not having into account a possible
>>>>>>>>> scenario, where
>>>>>>>>> we have an app built with static dpdk libs then loading a dso
>>>>>>>>> with -d
>>>>>>>>> option.
>>>>>>>>>
>>>>>>>>> In such case, because the pmd would have DT_NEEDED entries,
>>>>>>>>> dlopen will
>>>>>>>>> fail.
>>>>>>>>> So to enable such scenario we would need to build PMDs without
>>>>>>>>> DT_NEEDED
>>>>>>>>> entries.
>>>>>>>> Hmm, for that to be a problem you'd need to have the PMD built
>>>>>>>> against
>>>>>>>> shared dpdk libs and while the application is built against
>>>>>>>> static dpdk
>>>>>>>> libs. I dont think that's a supportable scenario in any case.
>>>>>>>>
>>>>>>>> Or is there some other scenario that I'm not seeing?
>>>>>>>>
>>>>>>>>     - Panu -
>>>>>>>>
>>>>>>> I agree with you. I suppose it comes down to, do we want to
>>>>>>> support such
>>>>>>> scenario?
>>>>>>>
>>>>>>>  From what I can see, it seems that we do currently support such
>>>>>>> scenario by
>>>>>>> building dpdk apps against all static dpdk libs using
>>>>>>> --whole-archive (all
>>>>>>> libs and not only PMDs).
>>>>>>> http://dpdk.org/browse/dpdk/commit/?id=20afd76a504155e947c770783ef5023e87136ad8
>>>>>>>
>>>>>>>
>>>>>>> Am I misunderstanding this?
>>>>>>>
>>>>>> Shoot, you're right, I missed the static build aspect to this.  Yes,
>>>>>> if we do the following:
>>>>>>
>>>>>> 1) Build the DPDK as a static library
>>>>>> 2) Link an application against (1)
>>>>>> 3) Use the dlopen mechanism to load a PMD built as a DSO
>>>>>>
>>>>>> Then the DT_NEEDED entries in the DSO will go unsatisfied, because
>>>>>> the shared
>>>>>> objects on which it (the PMD) depends will not exist in the file
>>>>>> system.
>>>>> I think its even more twisty:
>>>>>
>>>>> 1) Build the DPDK as a static library
>>>>> 2) Link an application against (1)
>>>>> 3) Do another build of DPDK as a shared library
>>>>> 4) In app 2), use the dlopen mechanism to load a PMD built as a part
>>>>> of or
>>>>> against 3)
>>>>>
>>>>> Somehow I doubt this would work very well.
>>>>>
>>>> Ideally it should, presuming the ABI is preserved between (1) and (3),
>>>> though I
>>>> agree, up until recently, that was an assumption that was unreliable.
>>> Versioning is a big and important step towards reliability but there are
>>> more issues to solve. This of course getting pretty far from the original
>>> topic, but at least one such issue is that there are some cases where a
>>> config value affects what are apparently public structs (rte_mbuf wrt
>>> RTE_MBUF_REFCNT for example), which really is a no-go.
>>>
>> Agree, the RTE_MBUF_REFCNT is something that needs to be dealt with asap.
>> I'll look into it.
>>
>>>>>> I think the problem is a little bit orthogonal to the libdpdk_core
>>>>>> problem you
>>>>>> were initially addressing.  That is to say, this problem of
>>>>>> dlopen-ed PMD's
>>>>>> exists regardless of weather you build the DPDK as part of a static
>>>>>> or dynamic
>>>>>> library.  The problems just happen to intersect in their
>>>>>> manipulation of the
>>>>>> DT_NEEDED entries.
>>>>>>
>>>>>> Ok, so, given the above, I would say your approach is likely
>>>>>> correct, just
>>>>>> prevent DT_NEEDED entries from getting added to PMD's. Doing so will
>>>>>> sidestep
>>>>>> loading issue for libraries that may not exist in the filesystem,
>>>>>> but thats ok,
>>>>>> because by all rights, the symbols codified in those needed
>>>>>> libraries should
>>>>>> already be present in the running application (either made available
>>>>>> by the
>>>>>> application having statically linked them, or having the linker load
>>>>>> them from
>>>>>> the proper libraries at run time).
>>>>> My 5c is that I'd much rather see the common case (all static or all
>>>>> shared)
>>>>> be simple and reliable, which in case of DSOs includes no lying
>>>>> (whether by
>>>>> omission or otherwise) about DT_NEEDED, ever. That way the issue is
>>>>> dealt
>>>>> once where it belongs. If somebody wants to go down the rabbit hole of
>>>>> mixed
>>>>> shared + static linkage, let them dig the hole by themselves :)
>>>>>
>>>> This is a fair point.  Can DT_NEEDED sections be stripped via tools like
>>>> objcopy
>>>> after the build is complete?  If so, end users can hack this corner case
>>>> to work
>>>> as needed.
>>> Patchelf (http://nixos.org/patchelf.html) appears to support that, but
>>> given that source is available it'd be easier to just modify the makefiles
>>> if that's really needed.
>>>
>> I think we agree on the issue.
>>
>> So I'll be sending a patch to add DT_NEEDED entries to all libraries and
>> PMDs. The only exception would be librte_eal, which would not have proper
>> NEEDED entries.
>> Do we bother adding a linker script for librte_eal that would include
>> dependent libraries?
>>
> I say yes to the linker script, but will happily bow to an alternate consensus
> Neil
>
So the case we want to solve is the following circular dependencies:
eal             -> mempool, malloc
mempool -> eal , malloc, ring
malloc      -> eal
ring           -> eal, malloc

We cannot write/create the proposed (below) linker script at least until 
we have built mempool and malloc.
INPUT ( -lrte_eal.so -lrte_mempool -lrte_malloc )

Few ways I have thought about implementing this (not particularly fond 
of any of them) :
  - Have the linker script file in the repo (scripts/ ?) in a fixed 
location and just copy it to $(RTE_OUTPUT)/lib/ once all libs have 
finished building.
  - Generate the file on build time from a defined make variable once 
all libs have finished

Thoughts? any other approached is more than welcome!

Sergio

PS: Thinking again on the core library and the issue of having multiple 
version.map files, we could have a core_version.map instead instead of 
multiple files per core library (eal, mempool, etc)

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v4 0/5] Interrupt mode PMD
  2015-02-19 13:48  3% [dpdk-dev] [PATCH v4 0/5] Interrupt mode PMD Zhou Danny
  2015-02-19 13:48  3% ` [dpdk-dev] [PATCH v4 1/5] ethdev: add rx interrupt enable/disable functions Zhou Danny
@ 2015-02-20  8:50  0% ` Gonzalez Monroy, Sergio
  1 sibling, 0 replies; 200+ results
From: Gonzalez Monroy, Sergio @ 2015-02-20  8:50 UTC (permalink / raw)
  To: Zhou Danny, dev

On 19/02/2015 13:48, Zhou Danny wrote:
> v4 changes
> - Export interrupt enable/disable functions for shared libraries
> - Adjust position of new-added structure fields and functions to
> avoid breaking ABI
>
> v3 changes
> - Add return value for interrupt enable/disable functions
> - Move spinlok from PMD to L3fwd-power
> - Remove unnecessary variables in e1000_mac_info
> - Fix miscelleous review comments
>   
> v2 changes
> - Fix compilation issue in Makefile for missed header file.
> - Consolidate internal and community review comments of v1 patch set.
>   
> The patch series introduce low-latency one-shot rx interrupt into DPDK with
> polling and interrupt mode switch control example.
>   
> DPDK userspace interrupt notification and handling mechanism is based on UIO
> with below limitation:
> 1) It is designed to handle LSC interrupt only with inefficient suspended
> pthread wakeup procedure (e.g. UIO wakes up LSC interrupt handling thread
> which then wakes up DPDK polling thread). In this way, it introduces
> non-deterministic wakeup latency for DPDK polling thread as well as packet
> latency if it is used to handle Rx interrupt.
> 2) UIO only supports a single interrupt vector which has to been shared by
> LSC interrupt and interrupts assigned to dedicated rx queues.
>   
> This patchset includes below features:
> 1) Enable one-shot rx queue interrupt in ixgbe PMD(PF & VF) and igb PMD(PF only).
> 2) Build on top of the VFIO mechanism instead of UIO, so it could support
> up to 64 interrupt vectors for rx queue interrupts.
> 3) Have 1 DPDK polling thread handle per Rx queue interrupt with a dedicated
> VFIO eventfd, which eliminates non-deterministic pthread wakeup latency in
> user space.
> 4) Demonstrate interrupts control APIs and userspace NAIP-like polling/interrupt
> switch algorithms in L3fwd-power example.
>   
> Known limitations:
> 1) It does not work for UIO due to a single interrupt eventfd shared by LSC
> and rx queue interrupt handlers causes a mess.
> 2) LSC interrupt is not supported by VF driver, so it is by default disabled
> in L3fwd-power now. Feel free to turn in on if you want to support both LSC
> and rx queue interrupts on a PF.
>
> Danny Zhou (5):
>    ethdev: add rx interrupt enable/disable functions
>    ixgbe: enable rx queue interrupts for both PF and VF
>    igb: enable rx queue interrupts for PF
>    eal: add per rx queue interrupt handling based on VFIO
>    l3fwd-power: enable one-shot rx interrupt and polling/interrupt mode
>        switch
>
>   examples/l3fwd-power/main.c                        | 153 ++++++---
>   lib/librte_eal/common/include/rte_eal.h            |  12 +
>   lib/librte_eal/linuxapp/eal/Makefile               |   1 +
>   lib/librte_eal/linuxapp/eal/eal_interrupts.c       | 190 ++++++++---
>   lib/librte_eal/linuxapp/eal/eal_pci_vfio.c         |  12 +-
>   .../linuxapp/eal/include/exec-env/rte_interrupts.h |   4 +
>   lib/librte_ether/rte_ethdev.c                      |  43 +++
>   lib/librte_ether/rte_ethdev.h                      |  59 ++++
>   lib/librte_ether/rte_ether_version.map             |   2 +
>   lib/librte_pmd_e1000/e1000_ethdev.h                |   3 +
>   lib/librte_pmd_e1000/igb_ethdev.c                  | 228 +++++++++++--
>   lib/librte_pmd_ixgbe/ixgbe_ethdev.c                | 365 ++++++++++++++++++++-
>   lib/librte_pmd_ixgbe/ixgbe_ethdev.h                |   6 +
>   13 files changed, 964 insertions(+), 114 deletions(-)
>
Series
Acked-by: Sergio Gonzalez Monroy <sergio.gonzalez.monroy@intel.com>

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v4 0/3] DPDK ethdev callback support
  2015-02-18 17:42  4% ` [dpdk-dev] [PATCH v3 0/3] " John McNamara
@ 2015-02-19 17:56  4%   ` John McNamara
  2015-02-20 17:03  4%   ` [dpdk-dev] [PATCH v5 " John McNamara
  1 sibling, 0 replies; 200+ results
From: John McNamara @ 2015-02-19 17:56 UTC (permalink / raw)
  To: dev

This patchset is for a small optional addition to the ethdev library,
to add support for callbacks at the RX and TX stages. This allows
packet processing to be done on packets before they get returned
to applications using rte_eth_rx_burst call.

See the RFC cover letter for the use cases:

    http://dpdk.org/ml/archives/dev/2014-December/010491.html

For this version we spent some time investigating Stephen Hemminger's
suggestion of using the userspace RCU (read-copy-update) library for
SMP safety:

   http://urcu.so/

The default liburcu (which defaulted to liburcu-mb) requires the least
interaction from the end user but showed a 25% drop in packet throughput
in the callback sample app.

The liburcu-qsbr (quiescent state) variant showed a 1% drop in packet
throughput in the callback sample app. However it requires registered
RCU threads in the program to periodically announce quiescent states.
This makes it more difficult to implement for end user applications.

For this release we will document that adding and removing callbacks
is not thread safe.

Note: Sample application documentation to follow in a patch update.


Version 4 changes:
    * Make the callback feature a compile time option.

Version 3 changes:
    * Removed unnecessary header file from example folder
      (which included baremetal reference).
    * Renamed the interrupt, RX and TX callbacks to make their function
      clearer (using the names suggested in the mailing list comments).
    * Squashed ABI version update into the commit it relates to.
    * Fixed various checkpatch warnings.

Version 2 changes:
    * Added ABI versioning.
    * Doxygen clarifications.

Version 1 changes:
    * Added callback removal functions.
    * Minor fixes.


Richardson, Bruce (3):
  ethdev: rename callbacks field to link_intr_cbs
  ethdev: add optional rxtx callback support
  examples: example showing use of callbacks.

 MAINTAINERS                            |    4 +
 app/test/virtual_pmd.c                 |    2 +-
 config/common_bsdapp                   |    1 +
 config/common_linuxapp                 |    1 +
 examples/Makefile                      |    1 +
 examples/rxtx_callbacks/Makefile       |   57 ++++++++
 examples/rxtx_callbacks/main.c         |  228 ++++++++++++++++++++++++++++++++
 lib/librte_ether/rte_ethdev.c          |  204 +++++++++++++++++++++++++++--
 lib/librte_ether/rte_ethdev.h          |  204 ++++++++++++++++++++++++++++-
 lib/librte_ether/rte_ether_version.map |    4 +
 lib/librte_pmd_bond/rte_eth_bond_api.c |    2 +-
 lib/librte_pmd_ring/rte_eth_ring.c     |    2 +-
 12 files changed, 696 insertions(+), 14 deletions(-)
 create mode 100644 examples/rxtx_callbacks/Makefile
 create mode 100644 examples/rxtx_callbacks/main.c

-- 
1.7.4.1

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v4 1/5] ethdev: add rx interrupt enable/disable functions
  2015-02-19 13:48  3% [dpdk-dev] [PATCH v4 0/5] Interrupt mode PMD Zhou Danny
@ 2015-02-19 13:48  3% ` Zhou Danny
  2015-02-20  8:50  0% ` [dpdk-dev] [PATCH v4 0/5] Interrupt mode PMD Gonzalez Monroy, Sergio
  1 sibling, 0 replies; 200+ results
From: Zhou Danny @ 2015-02-19 13:48 UTC (permalink / raw)
  To: dev

v4 changes
- Export interrupt enable/disable functions for shared libraries
- Put new functions at the end of eth_dev_ops to avoid breaking ABI

v3 changes
- Add return value for interrupt enable/disable functions

Add two dev_ops functions to enable and disable rx queue interrupts

Signed-off-by: Danny Zhou <danny.zhou@intel.com>
Tested-by: Yong Liu <yong.liu@intel.com>
---
 lib/librte_ether/rte_ethdev.c          | 43 +++++++++++++++++++++++++
 lib/librte_ether/rte_ethdev.h          | 59 ++++++++++++++++++++++++++++++++++
 lib/librte_ether/rte_ether_version.map |  2 ++
 3 files changed, 104 insertions(+)

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index ea3a1fb..d27469a 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -2825,6 +2825,49 @@ _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
 	}
 	rte_spinlock_unlock(&rte_eth_dev_cb_lock);
 }
+
+int
+rte_eth_dev_rx_queue_intr_enable(uint8_t port_id,
+				uint16_t queue_id)
+{
+	struct rte_eth_dev *dev;
+
+	if (port_id >= nb_ports) {
+		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
+		return (-ENODEV);
+	}
+
+	dev = &rte_eth_devices[port_id];
+	if (dev == NULL) {
+		PMD_DEBUG_TRACE("Invalid port device\n");
+		return (-ENODEV);
+	}
+
+	FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_intr_enable, -ENOTSUP);
+	return (*dev->dev_ops->rx_queue_intr_enable)(dev, queue_id);
+}
+
+int
+rte_eth_dev_rx_queue_intr_disable(uint8_t port_id,
+				uint16_t queue_id)
+{
+	struct rte_eth_dev *dev;
+
+	if (port_id >= nb_ports) {
+		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
+		return (-ENODEV);
+	}
+
+	dev = &rte_eth_devices[port_id];
+	if (dev == NULL) {
+		PMD_DEBUG_TRACE("Invalid port device\n");
+		return (-ENODEV);
+	}
+
+	FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_intr_disable, -ENOTSUP);
+	return (*dev->dev_ops->rx_queue_intr_disable)(dev, queue_id);
+}
+
 #ifdef RTE_NIC_BYPASS
 int rte_eth_dev_bypass_init(uint8_t port_id)
 {
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 84160c3..43035c2 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -848,6 +848,8 @@ struct rte_eth_fdir {
 struct rte_intr_conf {
 	/** enable/disable lsc interrupt. 0 (default) - disable, 1 enable */
 	uint16_t lsc;
+	/** enable/disable rxq interrupt. 0 (default) - disable, 1 enable */
+	uint16_t rxq;
 };
 
 /**
@@ -1109,6 +1111,14 @@ typedef int (*eth_tx_queue_setup_t)(struct rte_eth_dev *dev,
 				    const struct rte_eth_txconf *tx_conf);
 /**< @internal Setup a transmit queue of an Ethernet device. */
 
+typedef int (*eth_rx_enable_intr_t)(struct rte_eth_dev *dev,
+				    uint16_t rx_queue_id);
+/**< @internal Enable interrupt of a receive queue of an Ethernet device. */
+
+typedef int (*eth_rx_disable_intr_t)(struct rte_eth_dev *dev,
+				    uint16_t rx_queue_id);
+/**< @internal Disable interrupt of a receive queue of an Ethernet device. */
+
 typedef void (*eth_queue_release_t)(void *queue);
 /**< @internal Release memory resources allocated by given RX/TX queue. */
 
@@ -1520,6 +1530,10 @@ struct eth_dev_ops {
 	eth_remove_flex_filter_t       remove_flex_filter;   /**< remove flex filter. */
 	eth_get_flex_filter_t          get_flex_filter;      /**< get flex filter. */
 	eth_filter_ctrl_t              filter_ctrl;          /**< common filter control*/
+
+	/** Enable/disable Rx queue interrupt. */
+	eth_rx_enable_intr_t       rx_queue_intr_enable; /**< Enable Rx queue interrupt. */
+	eth_rx_disable_intr_t      rx_queue_intr_disable; /**< Disable Rx queue interrupt.*/
 };
 
 /**
@@ -2811,6 +2825,51 @@ void _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
 				enum rte_eth_event_type event);
 
 /**
+ * When there is no rx packet coming in Rx Queue for a long time, we can
+ * sleep lcore related to RX Queue for power saving, and enable rx interrupt
+ * to be triggered when rx packect arrives.
+ *
+ * The rte_eth_dev_rx_queue_intr_enable() function enables rx queue
+ * interrupt on specific rx queue of a port.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param queue_id
+ *   The index of the receive queue from which to retrieve input packets.
+ *   The value must be in the range [0, nb_rx_queue - 1] previously supplied
+ *   to rte_eth_dev_configure().
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if underlying hardware OR driver doesn't support
+ *     that operation.
+ *   - (-ENODEV) if *port_id* invalid.
+ */
+int rte_eth_dev_rx_queue_intr_enable(uint8_t port_id,
+				uint16_t queue_id);
+
+/**
+ * When lcore wakes up from rx interrupt indicating packet coming, disable rx
+ * interrupt and returns to polling mode.
+ *
+ * The rte_eth_dev_rx_queue_intr_disable() function disables rx queue
+ * interrupt on specific rx queue of a port.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param queue_id
+ *   The index of the receive queue from which to retrieve input packets.
+ *   The value must be in the range [0, nb_rx_queue - 1] previously supplied
+ *   to rte_eth_dev_configure().
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if underlying hardware OR driver doesn't support
+ *     that operation.
+ *   - (-ENODEV) if *port_id* invalid.
+ */
+int rte_eth_dev_rx_queue_intr_disable(uint8_t port_id,
+				uint16_t queue_id);
+
+/**
  * Turn on the LED on the Ethernet device.
  * This function turns on the LED on the Ethernet device.
  *
diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map
index 7316530..1e7af6e 100644
--- a/lib/librte_ether/rte_ether_version.map
+++ b/lib/librte_ether/rte_ether_version.map
@@ -57,6 +57,8 @@ DPDK_2.0 {
 	rte_eth_dev_rss_hash_update;
 	rte_eth_dev_rss_reta_query;
 	rte_eth_dev_rss_reta_update;
+	rte_eth_dev_rx_queue_intr_disable;
+	rte_eth_dev_rx_queue_intr_enable;
 	rte_eth_dev_rx_queue_start;
 	rte_eth_dev_rx_queue_stop;
 	rte_eth_dev_set_link_down;
-- 
1.8.1.4

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v4 0/5] Interrupt mode PMD
@ 2015-02-19 13:48  3% Zhou Danny
  2015-02-19 13:48  3% ` [dpdk-dev] [PATCH v4 1/5] ethdev: add rx interrupt enable/disable functions Zhou Danny
  2015-02-20  8:50  0% ` [dpdk-dev] [PATCH v4 0/5] Interrupt mode PMD Gonzalez Monroy, Sergio
  0 siblings, 2 replies; 200+ results
From: Zhou Danny @ 2015-02-19 13:48 UTC (permalink / raw)
  To: dev

v4 changes
- Export interrupt enable/disable functions for shared libraries
- Adjust position of new-added structure fields and functions to
avoid breaking ABI

v3 changes
- Add return value for interrupt enable/disable functions
- Move spinlok from PMD to L3fwd-power
- Remove unnecessary variables in e1000_mac_info
- Fix miscelleous review comments
 
v2 changes
- Fix compilation issue in Makefile for missed header file.
- Consolidate internal and community review comments of v1 patch set.
 
The patch series introduce low-latency one-shot rx interrupt into DPDK with
polling and interrupt mode switch control example.
 
DPDK userspace interrupt notification and handling mechanism is based on UIO
with below limitation:
1) It is designed to handle LSC interrupt only with inefficient suspended
pthread wakeup procedure (e.g. UIO wakes up LSC interrupt handling thread
which then wakes up DPDK polling thread). In this way, it introduces
non-deterministic wakeup latency for DPDK polling thread as well as packet
latency if it is used to handle Rx interrupt.
2) UIO only supports a single interrupt vector which has to been shared by
LSC interrupt and interrupts assigned to dedicated rx queues.
 
This patchset includes below features:
1) Enable one-shot rx queue interrupt in ixgbe PMD(PF & VF) and igb PMD(PF only).
2) Build on top of the VFIO mechanism instead of UIO, so it could support
up to 64 interrupt vectors for rx queue interrupts.
3) Have 1 DPDK polling thread handle per Rx queue interrupt with a dedicated
VFIO eventfd, which eliminates non-deterministic pthread wakeup latency in
user space.
4) Demonstrate interrupts control APIs and userspace NAIP-like polling/interrupt
switch algorithms in L3fwd-power example.
 
Known limitations:
1) It does not work for UIO due to a single interrupt eventfd shared by LSC
and rx queue interrupt handlers causes a mess.
2) LSC interrupt is not supported by VF driver, so it is by default disabled
in L3fwd-power now. Feel free to turn in on if you want to support both LSC
and rx queue interrupts on a PF.

Danny Zhou (5):
  ethdev: add rx interrupt enable/disable functions
  ixgbe: enable rx queue interrupts for both PF and VF
  igb: enable rx queue interrupts for PF
  eal: add per rx queue interrupt handling based on VFIO
  l3fwd-power: enable one-shot rx interrupt and polling/interrupt mode  
      switch

 examples/l3fwd-power/main.c                        | 153 ++++++---
 lib/librte_eal/common/include/rte_eal.h            |  12 +
 lib/librte_eal/linuxapp/eal/Makefile               |   1 +
 lib/librte_eal/linuxapp/eal/eal_interrupts.c       | 190 ++++++++---
 lib/librte_eal/linuxapp/eal/eal_pci_vfio.c         |  12 +-
 .../linuxapp/eal/include/exec-env/rte_interrupts.h |   4 +
 lib/librte_ether/rte_ethdev.c                      |  43 +++
 lib/librte_ether/rte_ethdev.h                      |  59 ++++
 lib/librte_ether/rte_ether_version.map             |   2 +
 lib/librte_pmd_e1000/e1000_ethdev.h                |   3 +
 lib/librte_pmd_e1000/igb_ethdev.c                  | 228 +++++++++++--
 lib/librte_pmd_ixgbe/ixgbe_ethdev.c                | 365 ++++++++++++++++++++-
 lib/librte_pmd_ixgbe/ixgbe_ethdev.h                |   6 +
 13 files changed, 964 insertions(+), 114 deletions(-)

-- 
1.8.1.4

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v3 4/5] eal: add per rx queue interrupt handling based on VFIO
  2015-02-19  8:10  3%     ` Zhou, Danny
@ 2015-02-19 13:04  3%       ` Neil Horman
  0 siblings, 0 replies; 200+ results
From: Neil Horman @ 2015-02-19 13:04 UTC (permalink / raw)
  To: Zhou, Danny; +Cc: dev

On Thu, Feb 19, 2015 at 08:10:47AM +0000, Zhou, Danny wrote:
> 
> 
> > -----Original Message-----
> > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > Sent: Tuesday, February 17, 2015 11:59 PM
> > To: Zhou, Danny
> > Cc: dev@dpdk.org
> > Subject: Re: [dpdk-dev] [PATCH v3 4/5] eal: add per rx queue interrupt handling based on VFIO
> > 
> > On Tue, Feb 17, 2015 at 09:47:18PM +0800, Zhou Danny wrote:
> > > v3 changes:
> > > - Fix review comments
> > >
> > > v2 changes:
> > > - Fix compilation issue for a missed header file
> > > - Bug fix: free unreleased resources on the exception path before return
> > > - Consolidate coding style related review comments
> > >
> > > This patch does below:
> > > - Create multiple VFIO eventfd for rx queues.
> > > - Handle per rx queue interrupt.
> > > - Eliminate unnecessary suspended DPDK polling thread wakeup mechanism
> > > for rx interrupt by allowing polling thread epoll_wait rx queue
> > > interrupt notification.
> > >
> > > Signed-off-by: Danny Zhou <danny.zhou@intel.com>
> > > Tested-by: Yong Liu <yong.liu@intel.com>
> > > ---
> > >  lib/librte_eal/common/include/rte_eal.h            |  12 ++
> > >  lib/librte_eal/linuxapp/eal/Makefile               |   1 +
> > >  lib/librte_eal/linuxapp/eal/eal_interrupts.c       | 190 ++++++++++++++++-----
> > >  lib/librte_eal/linuxapp/eal/eal_pci_vfio.c         |  12 +-
> > >  .../linuxapp/eal/include/exec-env/rte_interrupts.h |   4 +
> > >  5 files changed, 175 insertions(+), 44 deletions(-)
> > >
> > > diff --git a/lib/librte_eal/common/include/rte_eal.h b/lib/librte_eal/common/include/rte_eal.h
> > > index f4ecd2e..d81331f 100644
> > > --- a/lib/librte_eal/common/include/rte_eal.h
> > > +++ b/lib/librte_eal/common/include/rte_eal.h
> > > @@ -150,6 +150,18 @@ int rte_eal_iopl_init(void);
> > >   *   - On failure, a negative error value.
> > >   */
> > >  int rte_eal_init(int argc, char **argv);
> > > +
> > > +/**
> > > + * @param port_id
> > > + *   the port id
> > > + * @param queue_id
> > > + *   the queue id
> > > + * @return
> > > + *   - On success, return 0
> > > + *   - On failure, returns -1.
> > > + */
> > > +int rte_eal_wait_rx_intr(uint8_t port_id, uint8_t queue_id);
> > > +
> > >  /**
> > >   * Usage function typedef used by the application usage function.
> > >   *
> > > diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
> > > index e117cec..c593dfa 100644
> > > --- a/lib/librte_eal/linuxapp/eal/Makefile
> > > +++ b/lib/librte_eal/linuxapp/eal/Makefile
> > > @@ -43,6 +43,7 @@ CFLAGS += -I$(SRCDIR)/include
> > >  CFLAGS += -I$(RTE_SDK)/lib/librte_eal/common
> > >  CFLAGS += -I$(RTE_SDK)/lib/librte_eal/common/include
> > >  CFLAGS += -I$(RTE_SDK)/lib/librte_ring
> > > +CFLAGS += -I$(RTE_SDK)/lib/librte_mbuf
> > >  CFLAGS += -I$(RTE_SDK)/lib/librte_mempool
> > >  CFLAGS += -I$(RTE_SDK)/lib/librte_malloc
> > >  CFLAGS += -I$(RTE_SDK)/lib/librte_ether
> > > diff --git a/lib/librte_eal/linuxapp/eal/eal_interrupts.c b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
> > > index dc2668a..97215ad 100644
> > > --- a/lib/librte_eal/linuxapp/eal/eal_interrupts.c
> > > +++ b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
> > > @@ -64,6 +64,7 @@
> > >  #include <rte_malloc.h>
> > >  #include <rte_errno.h>
> > >  #include <rte_spinlock.h>
> > > +#include <rte_ethdev.h>
> > >
> > >  #include "eal_private.h"
> > >  #include "eal_vfio.h"
> > > @@ -127,6 +128,9 @@ static pthread_t intr_thread;
> > >  #ifdef VFIO_PRESENT
> > >
> > >  #define IRQ_SET_BUF_LEN  (sizeof(struct vfio_irq_set) + sizeof(int))
> > > +/* irq set buffer length for queue interrupts and LSC interrupt */
> > > +#define MSIX_IRQ_SET_BUF_LEN (sizeof(struct vfio_irq_set) + \
> > > +				sizeof(int) * (VFIO_MAX_QUEUE_ID + 1))
> > >
> > >  /* enable legacy (INTx) interrupts */
> > >  static int
> > > @@ -218,10 +222,10 @@ vfio_disable_intx(struct rte_intr_handle *intr_handle) {
> > >  	return 0;
> > >  }
> > >
> > > -/* enable MSI-X interrupts */
> > > +/* enable MSI interrupts */
> > >  static int
> > >  vfio_enable_msi(struct rte_intr_handle *intr_handle) {
> > > -	int len, ret;
> > > +	int len, ret, max_intr;
> > >  	char irq_set_buf[IRQ_SET_BUF_LEN];
> > >  	struct vfio_irq_set *irq_set;
> > >  	int *fd_ptr;
> > > @@ -230,12 +234,19 @@ vfio_enable_msi(struct rte_intr_handle *intr_handle) {
> > >
> > >  	irq_set = (struct vfio_irq_set *) irq_set_buf;
> > >  	irq_set->argsz = len;
> > > -	irq_set->count = 1;
> > > +	if ((!intr_handle->max_intr) ||
> > > +		(intr_handle->max_intr > VFIO_MAX_QUEUE_ID))
> > > +		max_intr = VFIO_MAX_QUEUE_ID + 1;
> > > +	else
> > > +		max_intr = intr_handle->max_intr;
> > > +
> > > +	irq_set->count = max_intr;
> > >  	irq_set->flags = VFIO_IRQ_SET_DATA_EVENTFD | VFIO_IRQ_SET_ACTION_TRIGGER;
> > >  	irq_set->index = VFIO_PCI_MSI_IRQ_INDEX;
> > >  	irq_set->start = 0;
> > >  	fd_ptr = (int *) &irq_set->data;
> > > -	*fd_ptr = intr_handle->fd;
> > > +	memcpy(fd_ptr, intr_handle->queue_fd, sizeof(intr_handle->queue_fd));
> > > +	fd_ptr[max_intr - 1] = intr_handle->fd;
> > >
> > >  	ret = ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, irq_set);
> > >
> > > @@ -244,27 +255,10 @@ vfio_enable_msi(struct rte_intr_handle *intr_handle) {
> > >  						intr_handle->fd);
> > >  		return -1;
> > >  	}
> > > -
> > > -	/* manually trigger interrupt to enable it */
> > > -	memset(irq_set, 0, len);
> > > -	len = sizeof(struct vfio_irq_set);
> > > -	irq_set->argsz = len;
> > > -	irq_set->count = 1;
> > > -	irq_set->flags = VFIO_IRQ_SET_DATA_NONE | VFIO_IRQ_SET_ACTION_TRIGGER;
> > > -	irq_set->index = VFIO_PCI_MSI_IRQ_INDEX;
> > > -	irq_set->start = 0;
> > > -
> > > -	ret = ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, irq_set);
> > > -
> > > -	if (ret) {
> > > -		RTE_LOG(ERR, EAL, "Error triggering MSI interrupts for fd %d\n",
> > > -						intr_handle->fd);
> > > -		return -1;
> > > -	}
> > >  	return 0;
> > >  }
> > >
> > > -/* disable MSI-X interrupts */
> > > +/* disable MSI interrupts */
> > >  static int
> > >  vfio_disable_msi(struct rte_intr_handle *intr_handle) {
> > >  	struct vfio_irq_set *irq_set;
> > > @@ -292,8 +286,8 @@ vfio_disable_msi(struct rte_intr_handle *intr_handle) {
> > >  /* enable MSI-X interrupts */
> > >  static int
> > >  vfio_enable_msix(struct rte_intr_handle *intr_handle) {
> > > -	int len, ret;
> > > -	char irq_set_buf[IRQ_SET_BUF_LEN];
> > > +	int len, ret, max_intr;
> > > +	char irq_set_buf[MSIX_IRQ_SET_BUF_LEN];
> > >  	struct vfio_irq_set *irq_set;
> > >  	int *fd_ptr;
> > >
> > > @@ -301,12 +295,19 @@ vfio_enable_msix(struct rte_intr_handle *intr_handle) {
> > >
> > >  	irq_set = (struct vfio_irq_set *) irq_set_buf;
> > >  	irq_set->argsz = len;
> > > -	irq_set->count = 1;
> > > +	if ((!intr_handle->max_intr) ||
> > > +		(intr_handle->max_intr > VFIO_MAX_QUEUE_ID))
> > > +		max_intr = VFIO_MAX_QUEUE_ID + 1;
> > > +	else
> > > +		max_intr = intr_handle->max_intr;
> > > +
> > > +	irq_set->count = max_intr;
> > >  	irq_set->flags = VFIO_IRQ_SET_DATA_EVENTFD | VFIO_IRQ_SET_ACTION_TRIGGER;
> > >  	irq_set->index = VFIO_PCI_MSIX_IRQ_INDEX;
> > >  	irq_set->start = 0;
> > >  	fd_ptr = (int *) &irq_set->data;
> > > -	*fd_ptr = intr_handle->fd;
> > > +	memcpy(fd_ptr, intr_handle->queue_fd, sizeof(intr_handle->queue_fd));
> > > +	fd_ptr[max_intr - 1] = intr_handle->fd;
> > >
> > >  	ret = ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, irq_set);
> > >
> > > @@ -316,22 +317,6 @@ vfio_enable_msix(struct rte_intr_handle *intr_handle) {
> > >  		return -1;
> > >  	}
> > >
> > > -	/* manually trigger interrupt to enable it */
> > > -	memset(irq_set, 0, len);
> > > -	len = sizeof(struct vfio_irq_set);
> > > -	irq_set->argsz = len;
> > > -	irq_set->count = 1;
> > > -	irq_set->flags = VFIO_IRQ_SET_DATA_NONE | VFIO_IRQ_SET_ACTION_TRIGGER;
> > > -	irq_set->index = VFIO_PCI_MSIX_IRQ_INDEX;
> > > -	irq_set->start = 0;
> > > -
> > > -	ret = ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, irq_set);
> > > -
> > > -	if (ret) {
> > > -		RTE_LOG(ERR, EAL, "Error triggering MSI-X interrupts for fd %d\n",
> > > -						intr_handle->fd);
> > > -		return -1;
> > > -	}
> > >  	return 0;
> > >  }
> > >
> > > @@ -339,7 +324,7 @@ vfio_enable_msix(struct rte_intr_handle *intr_handle) {
> > >  static int
> > >  vfio_disable_msix(struct rte_intr_handle *intr_handle) {
> > >  	struct vfio_irq_set *irq_set;
> > > -	char irq_set_buf[IRQ_SET_BUF_LEN];
> > > +	char irq_set_buf[MSIX_IRQ_SET_BUF_LEN];
> > >  	int len, ret;
> > >
> > >  	len = sizeof(struct vfio_irq_set);
> > > @@ -824,3 +809,122 @@ rte_eal_intr_init(void)
> > >  	return -ret;
> > >  }
> > >
> > > +static void
> > > +eal_intr_process_rx_interrupts(uint8_t port_id,
> > > +			struct epoll_event *events, int nfds)
> > > +{
> > > +	int n, bytes_read;
> > > +	union rte_intr_read_buffer buf;
> > > +	struct rte_intr_handle intr_handle =
> > > +				rte_eth_devices[port_id].pci_dev->intr_handle;
> > > +
> > > +	for (n = 0; n < nfds; n++) {
> > > +		/* set the length to be read for different handle type */
> > > +		switch (intr_handle.type) {
> > > +		case RTE_INTR_HANDLE_UIO:
> > > +			bytes_read = sizeof(buf.uio_intr_count);
> > > +			break;
> > > +		case RTE_INTR_HANDLE_ALARM:
> > > +			bytes_read = sizeof(buf.timerfd_num);
> > > +			break;
> > > +#ifdef VFIO_PRESENT
> > > +		case RTE_INTR_HANDLE_VFIO_MSIX:
> > > +		case RTE_INTR_HANDLE_VFIO_MSI:
> > > +		case RTE_INTR_HANDLE_VFIO_LEGACY:
> > > +			bytes_read = sizeof(buf.vfio_intr_count);
> > > +			break;
> > > +#endif
> > > +		default:
> > > +			bytes_read = 1;
> > > +			break;
> > > +		}
> > > +
> > > +		/**
> > > +		* read out to clear the ready-to-be-read flag
> > > +		* for epoll_wait.
> > > +		*/
> > > +		bytes_read = read(events[n].data.fd, &buf, bytes_read);
> > > +		if (bytes_read < 0)
> > > +			RTE_LOG(ERR, EAL, "Error reading from file "
> > > +				"descriptor %d: %s\n", events[n].data.fd,
> > > +							strerror(errno));
> > > +		else if (bytes_read == 0)
> > > +			RTE_LOG(ERR, EAL, "Read nothing from file "
> > > +				"descriptor %d\n", events[n].data.fd);
> > > +	}
> > > +}
> > > +
> > > +static void
> > > +eal_intr_handle_rx_interrupts(uint8_t port_id, int pfd, unsigned totalfds)
> > > +{
> > > +	struct epoll_event events[totalfds];
> > > +	int nfds = 0;
> > > +
> > > +	do {
> > > +		nfds = epoll_wait(pfd, events, totalfds,
> > > +				EAL_INTR_EPOLL_WAIT_FOREVER);
> > > +		/* epoll_wait fail */
> > > +		if (nfds < 0) {
> > > +			RTE_LOG(ERR, EAL,
> > > +				"epoll_wait returns with fail\n");
> > > +			return;
> > > +		}
> > > +	} while (nfds == 0);
> > > +
> > > +	/* epoll_wait has at least one fd ready to read */
> > > +	eal_intr_process_rx_interrupts(port_id, events, nfds);
> > > +}
> > > +
> > > +int
> > > +rte_eal_wait_rx_intr(uint8_t port_id, uint8_t queue_id)
> > > +{
> > > +	struct rte_intr_handle intr_handle =
> > > +				rte_eth_devices[port_id].pci_dev->intr_handle;
> > > +	struct epoll_event ev;
> > > +	unsigned numfds = 0;
> > > +
> > > +	/* create epoll fd */
> > > +	int pfd = epoll_create(1);
> > > +	if (pfd < 0) {
> > > +		RTE_LOG(ERR, EAL, "Cannot create epoll instance\n");
> > > +		return -1;
> > > +	}
> > > +
> > > +	rte_spinlock_lock(&intr_lock);
> > > +
> > > +	ev.events = EPOLLIN | EPOLLPRI;
> > > +	switch (intr_handle.type) {
> > > +	case RTE_INTR_HANDLE_UIO:
> > > +		ev.data.fd = intr_handle.fd;
> > > +		break;
> > > +#ifdef VFIO_PRESENT
> > > +	case RTE_INTR_HANDLE_VFIO_MSIX:
> > > +	case RTE_INTR_HANDLE_VFIO_MSI:
> > > +	case RTE_INTR_HANDLE_VFIO_LEGACY:
> > > +		ev.data.fd = intr_handle.queue_fd[queue_id];
> > > +		break;
> > > +#endif
> > > +	default:
> > > +		rte_spinlock_unlock(&intr_lock);
> > > +		close(pfd);
> > > +		return -1;
> > > +	}
> > > +
> > > +	if (epoll_ctl(pfd, EPOLL_CTL_ADD, ev.data.fd, &ev) < 0) {
> > > +		RTE_LOG(ERR, EAL, "Error adding fd %d epoll_ctl, %s\n",
> > > +			intr_handle.queue_fd[queue_id], strerror(errno));
> > > +	} else
> > > +		numfds++;
> > > +
> > > +	rte_spinlock_unlock(&intr_lock);
> > > +	/* serve the interrupt */
> > > +	eal_intr_handle_rx_interrupts(port_id, pfd, numfds);
> > > +
> > > +	/**
> > > +	* when we return, we need to rebuild the
> > > +	* list of fds to monitor.
> > > +	*/
> > > +	close(pfd);
> > > +
> > > +	return 0;
> > > +}
> > > diff --git a/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c b/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c
> > > index 20e0977..0e5fa76 100644
> > > --- a/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c
> > > +++ b/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c
> > > @@ -283,11 +283,21 @@ pci_vfio_setup_interrupts(struct rte_pci_device *dev, int vfio_dev_fd)
> > >
> > >  		dev->intr_handle.fd = fd;
> > >  		dev->intr_handle.vfio_dev_fd = vfio_dev_fd;
> > > -
> > >  		switch (i) {
> > >  		case VFIO_PCI_MSIX_IRQ_INDEX:
> > >  			internal_config.vfio_intr_mode = RTE_INTR_MODE_MSIX;
> > >  			dev->intr_handle.type = RTE_INTR_HANDLE_VFIO_MSIX;
> > > +			for (i = 0; i < VFIO_MAX_QUEUE_ID; i++) {
> > > +				fd = eventfd(0, 0);
> > > +				if (fd < 0) {
> > > +					RTE_LOG(ERR, EAL,
> > > +					"cannot setup eventfd,"
> > > +					"error %i (%s)\n",
> > > +					errno, strerror(errno));
> > > +					return -1;
> > > +				}
> > > +				dev->intr_handle.queue_fd[i] = fd;
> > > +			}
> > >  			break;
> > >  		case VFIO_PCI_MSI_IRQ_INDEX:
> > >  			internal_config.vfio_intr_mode = RTE_INTR_MODE_MSI;
> > > diff --git a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_interrupts.h
> > b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_interrupts.h
> > > index 23eafd9..c6982cf 100644
> > > --- a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_interrupts.h
> > > +++ b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_interrupts.h
> > > @@ -38,6 +38,8 @@
> > >  #ifndef _RTE_LINUXAPP_INTERRUPTS_H_
> > >  #define _RTE_LINUXAPP_INTERRUPTS_H_
> > >
> > > +#define VFIO_MAX_QUEUE_ID 32
> > > +
> > >  enum rte_intr_handle_type {
> > >  	RTE_INTR_HANDLE_UNKNOWN = 0,
> > >  	RTE_INTR_HANDLE_UIO,      /**< uio device handle */
> > > @@ -52,6 +54,8 @@ enum rte_intr_handle_type {
> > >  struct rte_intr_handle {
> > >  	int vfio_dev_fd;                 /**< VFIO device file descriptor */
> > >  	int fd;                          /**< file descriptor */
> > > +	int max_intr;                    /**< max interrupt requested */
> > > +	int queue_fd[VFIO_MAX_QUEUE_ID]; /**< rx and tx queue interrupt file descriptor */
> > This is used outside of this library, you need to move these new fields to the
> > end of the structure.
> > 
> > neil
> 
> Alright, I will move them to the end in V4 patch. 
> 
> Neil, do you have any simple writeup on guideline about how to add APIs and new fields to existing 
> structure in order to make sure new stuff does not break ABI? It might help all the developers to avoid
> making similar mistakes in the future.
> 
Not as such, but the ABI document in the release notes gives some examples.  We
can certainly start one if you like, though many of them are situationally
specific. 


> > 
> > >  	enum rte_intr_handle_type type;  /**< handle type */
> > >  };
> > >
> > > --
> > > 1.8.1.4
> > >
> > >
> 

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v3 1/5] ethdev: add rx interrupt enable/disable functions
  2015-02-19  7:58  3%     ` Zhou, Danny
@ 2015-02-19 13:02  3%       ` Neil Horman
  0 siblings, 0 replies; 200+ results
From: Neil Horman @ 2015-02-19 13:02 UTC (permalink / raw)
  To: Zhou, Danny; +Cc: dev

On Thu, Feb 19, 2015 at 07:58:38AM +0000, Zhou, Danny wrote:
> 
> 
> > -----Original Message-----
> > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > Sent: Tuesday, February 17, 2015 11:55 PM
> > To: Zhou, Danny
> > Cc: dev@dpdk.org
> > Subject: Re: [dpdk-dev] [PATCH v3 1/5] ethdev: add rx interrupt enable/disable functions
> > 
> > On Tue, Feb 17, 2015 at 09:47:15PM +0800, Zhou Danny wrote:
> > > v3 changes
> > > - Add return value for interrupt enable/disable functions
> > >
> > > Add two dev_ops functions to enable and disable rx queue interrupts
> > >
> > > Signed-off-by: Danny Zhou <danny.zhou@intel.com>
> > > Tested-by: Yong Liu <yong.liu@intel.com>
> > > ---
> > >  lib/librte_ether/rte_ethdev.c | 43 ++++++++++++++++++++++++++++++++
> > >  lib/librte_ether/rte_ethdev.h | 57 +++++++++++++++++++++++++++++++++++++++++++
> > >  2 files changed, 100 insertions(+)
> > >
> > > diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
> > > index ea3a1fb..d27469a 100644
> > > --- a/lib/librte_ether/rte_ethdev.c
> > > +++ b/lib/librte_ether/rte_ethdev.c
> > > @@ -2825,6 +2825,49 @@ _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
> > >  	}
> > >  	rte_spinlock_unlock(&rte_eth_dev_cb_lock);
> > >  }
> > > +
> > > +int
> > > +rte_eth_dev_rx_queue_intr_enable(uint8_t port_id,
> > > +				uint16_t queue_id)
> > > +{
> > > +	struct rte_eth_dev *dev;
> > > +
> > > +	if (port_id >= nb_ports) {
> > > +		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
> > > +		return (-ENODEV);
> > > +	}
> > > +
> > > +	dev = &rte_eth_devices[port_id];
> > > +	if (dev == NULL) {
> > > +		PMD_DEBUG_TRACE("Invalid port device\n");
> > > +		return (-ENODEV);
> > > +	}
> > > +
> > > +	FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_intr_enable, -ENOTSUP);
> > > +	return (*dev->dev_ops->rx_queue_intr_enable)(dev, queue_id);
> > > +}
> > > +
> > > +int
> > > +rte_eth_dev_rx_queue_intr_disable(uint8_t port_id,
> > > +				uint16_t queue_id)
> > > +{
> > > +	struct rte_eth_dev *dev;
> > > +
> > > +	if (port_id >= nb_ports) {
> > > +		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
> > > +		return (-ENODEV);
> > > +	}
> > > +
> > > +	dev = &rte_eth_devices[port_id];
> > > +	if (dev == NULL) {
> > > +		PMD_DEBUG_TRACE("Invalid port device\n");
> > > +		return (-ENODEV);
> > > +	}
> > > +
> > > +	FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_intr_disable, -ENOTSUP);
> > > +	return (*dev->dev_ops->rx_queue_intr_disable)(dev, queue_id);
> > > +}
> > > +
> > >  #ifdef RTE_NIC_BYPASS
> > >  int rte_eth_dev_bypass_init(uint8_t port_id)
> > >  {
> > > diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
> > > index 84160c3..0f320a9 100644
> > > --- a/lib/librte_ether/rte_ethdev.h
> > > +++ b/lib/librte_ether/rte_ethdev.h
> > > @@ -848,6 +848,8 @@ struct rte_eth_fdir {
> > >  struct rte_intr_conf {
> > >  	/** enable/disable lsc interrupt. 0 (default) - disable, 1 enable */
> > >  	uint16_t lsc;
> > > +	/** enable/disable rxq interrupt. 0 (default) - disable, 1 enable */
> > > +	uint16_t rxq;
> > >  };
> > >
> > >  /**
> > > @@ -1109,6 +1111,14 @@ typedef int (*eth_tx_queue_setup_t)(struct rte_eth_dev *dev,
> > >  				    const struct rte_eth_txconf *tx_conf);
> > >  /**< @internal Setup a transmit queue of an Ethernet device. */
> > >
> > > +typedef int (*eth_rx_enable_intr_t)(struct rte_eth_dev *dev,
> > > +				    uint16_t rx_queue_id);
> > > +/**< @internal Enable interrupt of a receive queue of an Ethernet device. */
> > > +
> > > +typedef int (*eth_rx_disable_intr_t)(struct rte_eth_dev *dev,
> > > +				    uint16_t rx_queue_id);
> > > +/**< @internal Disable interrupt of a receive queue of an Ethernet device. */
> > > +
> > >  typedef void (*eth_queue_release_t)(void *queue);
> > >  /**< @internal Release memory resources allocated by given RX/TX queue. */
> > >
> > > @@ -1445,6 +1455,8 @@ struct eth_dev_ops {
> > >  	eth_queue_start_t          tx_queue_start;/**< Start TX for a queue.*/
> > >  	eth_queue_stop_t           tx_queue_stop;/**< Stop TX for a queue.*/
> > >  	eth_rx_queue_setup_t       rx_queue_setup;/**< Set up device RX queue.*/
> > > +	eth_rx_enable_intr_t       rx_queue_intr_enable; /**< Enable Rx queue interrupt. */
> > > +	eth_rx_disable_intr_t      rx_queue_intr_disable; /**< Disable Rx queue interrupt.*/
> > Put these at the end of eth_dev_ops if you want to avoid breaking ABI
> 
> I purposely add those two APIs at current position to ensure all rxq related APIs are declared together
> in eth_dev_ops. Anyway, moving them to the end is ok to me for the reason of ABI, though the code looks
> a little bit ugly.
> 
Right, pretty isn't a reason to break ABI as noted in the release notes doc

Neil

> > 
> > >  	eth_queue_release_t        rx_queue_release;/**< Release RX queue.*/
> > >  	eth_rx_queue_count_t       rx_queue_count; /**< Get Rx queue count. */
> > >  	eth_rx_descriptor_done_t   rx_descriptor_done;  /**< Check rxd DD bit */
> > > @@ -2811,6 +2823,51 @@ void _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
> > >  				enum rte_eth_event_type event);
> > >
> > >  /**
> > > + * When there is no rx packet coming in Rx Queue for a long time, we can
> > > + * sleep lcore related to RX Queue for power saving, and enable rx interrupt
> > > + * to be triggered when rx packect arrives.
> > > + *
> > > + * The rte_eth_dev_rx_queue_intr_enable() function enables rx queue
> > > + * interrupt on specific rx queue of a port.
> > > + *
> > > + * @param port_id
> > > + *   The port identifier of the Ethernet device.
> > > + * @param queue_id
> > > + *   The index of the receive queue from which to retrieve input packets.
> > > + *   The value must be in the range [0, nb_rx_queue - 1] previously supplied
> > > + *   to rte_eth_dev_configure().
> > > + * @return
> > > + *   - (0) if successful.
> > > + *   - (-ENOTSUP) if underlying hardware OR driver doesn't support
> > > + *     that operation.
> > > + *   - (-ENODEV) if *port_id* invalid.
> > > + */
> > > +int rte_eth_dev_rx_queue_intr_enable(uint8_t port_id,
> > > +				uint16_t queue_id);
> > > +
> > > +/**
> > > + * When lcore wakes up from rx interrupt indicating packet coming, disable rx
> > > + * interrupt and returns to polling mode.
> > > + *
> > > + * The rte_eth_dev_rx_queue_intr_disable() function disables rx queue
> > > + * interrupt on specific rx queue of a port.
> > > + *
> > > + * @param port_id
> > > + *   The port identifier of the Ethernet device.
> > > + * @param queue_id
> > > + *   The index of the receive queue from which to retrieve input packets.
> > > + *   The value must be in the range [0, nb_rx_queue - 1] previously supplied
> > > + *   to rte_eth_dev_configure().
> > > + * @return
> > > + *   - (0) if successful.
> > > + *   - (-ENOTSUP) if underlying hardware OR driver doesn't support
> > > + *     that operation.
> > > + *   - (-ENODEV) if *port_id* invalid.
> > > + */
> > > +int rte_eth_dev_rx_queue_intr_disable(uint8_t port_id,
> > > +				uint16_t queue_id);
> > > +
> > > +/**
> > >   * Turn on the LED on the Ethernet device.
> > >   * This function turns on the LED on the Ethernet device.
> > >   *
> > > --
> > > 1.8.1.4
> > >
> > >
> 

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v3 4/5] eal: add per rx queue interrupt handling based on VFIO
  @ 2015-02-19  8:10  3%     ` Zhou, Danny
  2015-02-19 13:04  3%       ` Neil Horman
  0 siblings, 1 reply; 200+ results
From: Zhou, Danny @ 2015-02-19  8:10 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev



> -----Original Message-----
> From: Neil Horman [mailto:nhorman@tuxdriver.com]
> Sent: Tuesday, February 17, 2015 11:59 PM
> To: Zhou, Danny
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v3 4/5] eal: add per rx queue interrupt handling based on VFIO
> 
> On Tue, Feb 17, 2015 at 09:47:18PM +0800, Zhou Danny wrote:
> > v3 changes:
> > - Fix review comments
> >
> > v2 changes:
> > - Fix compilation issue for a missed header file
> > - Bug fix: free unreleased resources on the exception path before return
> > - Consolidate coding style related review comments
> >
> > This patch does below:
> > - Create multiple VFIO eventfd for rx queues.
> > - Handle per rx queue interrupt.
> > - Eliminate unnecessary suspended DPDK polling thread wakeup mechanism
> > for rx interrupt by allowing polling thread epoll_wait rx queue
> > interrupt notification.
> >
> > Signed-off-by: Danny Zhou <danny.zhou@intel.com>
> > Tested-by: Yong Liu <yong.liu@intel.com>
> > ---
> >  lib/librte_eal/common/include/rte_eal.h            |  12 ++
> >  lib/librte_eal/linuxapp/eal/Makefile               |   1 +
> >  lib/librte_eal/linuxapp/eal/eal_interrupts.c       | 190 ++++++++++++++++-----
> >  lib/librte_eal/linuxapp/eal/eal_pci_vfio.c         |  12 +-
> >  .../linuxapp/eal/include/exec-env/rte_interrupts.h |   4 +
> >  5 files changed, 175 insertions(+), 44 deletions(-)
> >
> > diff --git a/lib/librte_eal/common/include/rte_eal.h b/lib/librte_eal/common/include/rte_eal.h
> > index f4ecd2e..d81331f 100644
> > --- a/lib/librte_eal/common/include/rte_eal.h
> > +++ b/lib/librte_eal/common/include/rte_eal.h
> > @@ -150,6 +150,18 @@ int rte_eal_iopl_init(void);
> >   *   - On failure, a negative error value.
> >   */
> >  int rte_eal_init(int argc, char **argv);
> > +
> > +/**
> > + * @param port_id
> > + *   the port id
> > + * @param queue_id
> > + *   the queue id
> > + * @return
> > + *   - On success, return 0
> > + *   - On failure, returns -1.
> > + */
> > +int rte_eal_wait_rx_intr(uint8_t port_id, uint8_t queue_id);
> > +
> >  /**
> >   * Usage function typedef used by the application usage function.
> >   *
> > diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
> > index e117cec..c593dfa 100644
> > --- a/lib/librte_eal/linuxapp/eal/Makefile
> > +++ b/lib/librte_eal/linuxapp/eal/Makefile
> > @@ -43,6 +43,7 @@ CFLAGS += -I$(SRCDIR)/include
> >  CFLAGS += -I$(RTE_SDK)/lib/librte_eal/common
> >  CFLAGS += -I$(RTE_SDK)/lib/librte_eal/common/include
> >  CFLAGS += -I$(RTE_SDK)/lib/librte_ring
> > +CFLAGS += -I$(RTE_SDK)/lib/librte_mbuf
> >  CFLAGS += -I$(RTE_SDK)/lib/librte_mempool
> >  CFLAGS += -I$(RTE_SDK)/lib/librte_malloc
> >  CFLAGS += -I$(RTE_SDK)/lib/librte_ether
> > diff --git a/lib/librte_eal/linuxapp/eal/eal_interrupts.c b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
> > index dc2668a..97215ad 100644
> > --- a/lib/librte_eal/linuxapp/eal/eal_interrupts.c
> > +++ b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
> > @@ -64,6 +64,7 @@
> >  #include <rte_malloc.h>
> >  #include <rte_errno.h>
> >  #include <rte_spinlock.h>
> > +#include <rte_ethdev.h>
> >
> >  #include "eal_private.h"
> >  #include "eal_vfio.h"
> > @@ -127,6 +128,9 @@ static pthread_t intr_thread;
> >  #ifdef VFIO_PRESENT
> >
> >  #define IRQ_SET_BUF_LEN  (sizeof(struct vfio_irq_set) + sizeof(int))
> > +/* irq set buffer length for queue interrupts and LSC interrupt */
> > +#define MSIX_IRQ_SET_BUF_LEN (sizeof(struct vfio_irq_set) + \
> > +				sizeof(int) * (VFIO_MAX_QUEUE_ID + 1))
> >
> >  /* enable legacy (INTx) interrupts */
> >  static int
> > @@ -218,10 +222,10 @@ vfio_disable_intx(struct rte_intr_handle *intr_handle) {
> >  	return 0;
> >  }
> >
> > -/* enable MSI-X interrupts */
> > +/* enable MSI interrupts */
> >  static int
> >  vfio_enable_msi(struct rte_intr_handle *intr_handle) {
> > -	int len, ret;
> > +	int len, ret, max_intr;
> >  	char irq_set_buf[IRQ_SET_BUF_LEN];
> >  	struct vfio_irq_set *irq_set;
> >  	int *fd_ptr;
> > @@ -230,12 +234,19 @@ vfio_enable_msi(struct rte_intr_handle *intr_handle) {
> >
> >  	irq_set = (struct vfio_irq_set *) irq_set_buf;
> >  	irq_set->argsz = len;
> > -	irq_set->count = 1;
> > +	if ((!intr_handle->max_intr) ||
> > +		(intr_handle->max_intr > VFIO_MAX_QUEUE_ID))
> > +		max_intr = VFIO_MAX_QUEUE_ID + 1;
> > +	else
> > +		max_intr = intr_handle->max_intr;
> > +
> > +	irq_set->count = max_intr;
> >  	irq_set->flags = VFIO_IRQ_SET_DATA_EVENTFD | VFIO_IRQ_SET_ACTION_TRIGGER;
> >  	irq_set->index = VFIO_PCI_MSI_IRQ_INDEX;
> >  	irq_set->start = 0;
> >  	fd_ptr = (int *) &irq_set->data;
> > -	*fd_ptr = intr_handle->fd;
> > +	memcpy(fd_ptr, intr_handle->queue_fd, sizeof(intr_handle->queue_fd));
> > +	fd_ptr[max_intr - 1] = intr_handle->fd;
> >
> >  	ret = ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, irq_set);
> >
> > @@ -244,27 +255,10 @@ vfio_enable_msi(struct rte_intr_handle *intr_handle) {
> >  						intr_handle->fd);
> >  		return -1;
> >  	}
> > -
> > -	/* manually trigger interrupt to enable it */
> > -	memset(irq_set, 0, len);
> > -	len = sizeof(struct vfio_irq_set);
> > -	irq_set->argsz = len;
> > -	irq_set->count = 1;
> > -	irq_set->flags = VFIO_IRQ_SET_DATA_NONE | VFIO_IRQ_SET_ACTION_TRIGGER;
> > -	irq_set->index = VFIO_PCI_MSI_IRQ_INDEX;
> > -	irq_set->start = 0;
> > -
> > -	ret = ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, irq_set);
> > -
> > -	if (ret) {
> > -		RTE_LOG(ERR, EAL, "Error triggering MSI interrupts for fd %d\n",
> > -						intr_handle->fd);
> > -		return -1;
> > -	}
> >  	return 0;
> >  }
> >
> > -/* disable MSI-X interrupts */
> > +/* disable MSI interrupts */
> >  static int
> >  vfio_disable_msi(struct rte_intr_handle *intr_handle) {
> >  	struct vfio_irq_set *irq_set;
> > @@ -292,8 +286,8 @@ vfio_disable_msi(struct rte_intr_handle *intr_handle) {
> >  /* enable MSI-X interrupts */
> >  static int
> >  vfio_enable_msix(struct rte_intr_handle *intr_handle) {
> > -	int len, ret;
> > -	char irq_set_buf[IRQ_SET_BUF_LEN];
> > +	int len, ret, max_intr;
> > +	char irq_set_buf[MSIX_IRQ_SET_BUF_LEN];
> >  	struct vfio_irq_set *irq_set;
> >  	int *fd_ptr;
> >
> > @@ -301,12 +295,19 @@ vfio_enable_msix(struct rte_intr_handle *intr_handle) {
> >
> >  	irq_set = (struct vfio_irq_set *) irq_set_buf;
> >  	irq_set->argsz = len;
> > -	irq_set->count = 1;
> > +	if ((!intr_handle->max_intr) ||
> > +		(intr_handle->max_intr > VFIO_MAX_QUEUE_ID))
> > +		max_intr = VFIO_MAX_QUEUE_ID + 1;
> > +	else
> > +		max_intr = intr_handle->max_intr;
> > +
> > +	irq_set->count = max_intr;
> >  	irq_set->flags = VFIO_IRQ_SET_DATA_EVENTFD | VFIO_IRQ_SET_ACTION_TRIGGER;
> >  	irq_set->index = VFIO_PCI_MSIX_IRQ_INDEX;
> >  	irq_set->start = 0;
> >  	fd_ptr = (int *) &irq_set->data;
> > -	*fd_ptr = intr_handle->fd;
> > +	memcpy(fd_ptr, intr_handle->queue_fd, sizeof(intr_handle->queue_fd));
> > +	fd_ptr[max_intr - 1] = intr_handle->fd;
> >
> >  	ret = ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, irq_set);
> >
> > @@ -316,22 +317,6 @@ vfio_enable_msix(struct rte_intr_handle *intr_handle) {
> >  		return -1;
> >  	}
> >
> > -	/* manually trigger interrupt to enable it */
> > -	memset(irq_set, 0, len);
> > -	len = sizeof(struct vfio_irq_set);
> > -	irq_set->argsz = len;
> > -	irq_set->count = 1;
> > -	irq_set->flags = VFIO_IRQ_SET_DATA_NONE | VFIO_IRQ_SET_ACTION_TRIGGER;
> > -	irq_set->index = VFIO_PCI_MSIX_IRQ_INDEX;
> > -	irq_set->start = 0;
> > -
> > -	ret = ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, irq_set);
> > -
> > -	if (ret) {
> > -		RTE_LOG(ERR, EAL, "Error triggering MSI-X interrupts for fd %d\n",
> > -						intr_handle->fd);
> > -		return -1;
> > -	}
> >  	return 0;
> >  }
> >
> > @@ -339,7 +324,7 @@ vfio_enable_msix(struct rte_intr_handle *intr_handle) {
> >  static int
> >  vfio_disable_msix(struct rte_intr_handle *intr_handle) {
> >  	struct vfio_irq_set *irq_set;
> > -	char irq_set_buf[IRQ_SET_BUF_LEN];
> > +	char irq_set_buf[MSIX_IRQ_SET_BUF_LEN];
> >  	int len, ret;
> >
> >  	len = sizeof(struct vfio_irq_set);
> > @@ -824,3 +809,122 @@ rte_eal_intr_init(void)
> >  	return -ret;
> >  }
> >
> > +static void
> > +eal_intr_process_rx_interrupts(uint8_t port_id,
> > +			struct epoll_event *events, int nfds)
> > +{
> > +	int n, bytes_read;
> > +	union rte_intr_read_buffer buf;
> > +	struct rte_intr_handle intr_handle =
> > +				rte_eth_devices[port_id].pci_dev->intr_handle;
> > +
> > +	for (n = 0; n < nfds; n++) {
> > +		/* set the length to be read for different handle type */
> > +		switch (intr_handle.type) {
> > +		case RTE_INTR_HANDLE_UIO:
> > +			bytes_read = sizeof(buf.uio_intr_count);
> > +			break;
> > +		case RTE_INTR_HANDLE_ALARM:
> > +			bytes_read = sizeof(buf.timerfd_num);
> > +			break;
> > +#ifdef VFIO_PRESENT
> > +		case RTE_INTR_HANDLE_VFIO_MSIX:
> > +		case RTE_INTR_HANDLE_VFIO_MSI:
> > +		case RTE_INTR_HANDLE_VFIO_LEGACY:
> > +			bytes_read = sizeof(buf.vfio_intr_count);
> > +			break;
> > +#endif
> > +		default:
> > +			bytes_read = 1;
> > +			break;
> > +		}
> > +
> > +		/**
> > +		* read out to clear the ready-to-be-read flag
> > +		* for epoll_wait.
> > +		*/
> > +		bytes_read = read(events[n].data.fd, &buf, bytes_read);
> > +		if (bytes_read < 0)
> > +			RTE_LOG(ERR, EAL, "Error reading from file "
> > +				"descriptor %d: %s\n", events[n].data.fd,
> > +							strerror(errno));
> > +		else if (bytes_read == 0)
> > +			RTE_LOG(ERR, EAL, "Read nothing from file "
> > +				"descriptor %d\n", events[n].data.fd);
> > +	}
> > +}
> > +
> > +static void
> > +eal_intr_handle_rx_interrupts(uint8_t port_id, int pfd, unsigned totalfds)
> > +{
> > +	struct epoll_event events[totalfds];
> > +	int nfds = 0;
> > +
> > +	do {
> > +		nfds = epoll_wait(pfd, events, totalfds,
> > +				EAL_INTR_EPOLL_WAIT_FOREVER);
> > +		/* epoll_wait fail */
> > +		if (nfds < 0) {
> > +			RTE_LOG(ERR, EAL,
> > +				"epoll_wait returns with fail\n");
> > +			return;
> > +		}
> > +	} while (nfds == 0);
> > +
> > +	/* epoll_wait has at least one fd ready to read */
> > +	eal_intr_process_rx_interrupts(port_id, events, nfds);
> > +}
> > +
> > +int
> > +rte_eal_wait_rx_intr(uint8_t port_id, uint8_t queue_id)
> > +{
> > +	struct rte_intr_handle intr_handle =
> > +				rte_eth_devices[port_id].pci_dev->intr_handle;
> > +	struct epoll_event ev;
> > +	unsigned numfds = 0;
> > +
> > +	/* create epoll fd */
> > +	int pfd = epoll_create(1);
> > +	if (pfd < 0) {
> > +		RTE_LOG(ERR, EAL, "Cannot create epoll instance\n");
> > +		return -1;
> > +	}
> > +
> > +	rte_spinlock_lock(&intr_lock);
> > +
> > +	ev.events = EPOLLIN | EPOLLPRI;
> > +	switch (intr_handle.type) {
> > +	case RTE_INTR_HANDLE_UIO:
> > +		ev.data.fd = intr_handle.fd;
> > +		break;
> > +#ifdef VFIO_PRESENT
> > +	case RTE_INTR_HANDLE_VFIO_MSIX:
> > +	case RTE_INTR_HANDLE_VFIO_MSI:
> > +	case RTE_INTR_HANDLE_VFIO_LEGACY:
> > +		ev.data.fd = intr_handle.queue_fd[queue_id];
> > +		break;
> > +#endif
> > +	default:
> > +		rte_spinlock_unlock(&intr_lock);
> > +		close(pfd);
> > +		return -1;
> > +	}
> > +
> > +	if (epoll_ctl(pfd, EPOLL_CTL_ADD, ev.data.fd, &ev) < 0) {
> > +		RTE_LOG(ERR, EAL, "Error adding fd %d epoll_ctl, %s\n",
> > +			intr_handle.queue_fd[queue_id], strerror(errno));
> > +	} else
> > +		numfds++;
> > +
> > +	rte_spinlock_unlock(&intr_lock);
> > +	/* serve the interrupt */
> > +	eal_intr_handle_rx_interrupts(port_id, pfd, numfds);
> > +
> > +	/**
> > +	* when we return, we need to rebuild the
> > +	* list of fds to monitor.
> > +	*/
> > +	close(pfd);
> > +
> > +	return 0;
> > +}
> > diff --git a/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c b/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c
> > index 20e0977..0e5fa76 100644
> > --- a/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c
> > +++ b/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c
> > @@ -283,11 +283,21 @@ pci_vfio_setup_interrupts(struct rte_pci_device *dev, int vfio_dev_fd)
> >
> >  		dev->intr_handle.fd = fd;
> >  		dev->intr_handle.vfio_dev_fd = vfio_dev_fd;
> > -
> >  		switch (i) {
> >  		case VFIO_PCI_MSIX_IRQ_INDEX:
> >  			internal_config.vfio_intr_mode = RTE_INTR_MODE_MSIX;
> >  			dev->intr_handle.type = RTE_INTR_HANDLE_VFIO_MSIX;
> > +			for (i = 0; i < VFIO_MAX_QUEUE_ID; i++) {
> > +				fd = eventfd(0, 0);
> > +				if (fd < 0) {
> > +					RTE_LOG(ERR, EAL,
> > +					"cannot setup eventfd,"
> > +					"error %i (%s)\n",
> > +					errno, strerror(errno));
> > +					return -1;
> > +				}
> > +				dev->intr_handle.queue_fd[i] = fd;
> > +			}
> >  			break;
> >  		case VFIO_PCI_MSI_IRQ_INDEX:
> >  			internal_config.vfio_intr_mode = RTE_INTR_MODE_MSI;
> > diff --git a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_interrupts.h
> b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_interrupts.h
> > index 23eafd9..c6982cf 100644
> > --- a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_interrupts.h
> > +++ b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_interrupts.h
> > @@ -38,6 +38,8 @@
> >  #ifndef _RTE_LINUXAPP_INTERRUPTS_H_
> >  #define _RTE_LINUXAPP_INTERRUPTS_H_
> >
> > +#define VFIO_MAX_QUEUE_ID 32
> > +
> >  enum rte_intr_handle_type {
> >  	RTE_INTR_HANDLE_UNKNOWN = 0,
> >  	RTE_INTR_HANDLE_UIO,      /**< uio device handle */
> > @@ -52,6 +54,8 @@ enum rte_intr_handle_type {
> >  struct rte_intr_handle {
> >  	int vfio_dev_fd;                 /**< VFIO device file descriptor */
> >  	int fd;                          /**< file descriptor */
> > +	int max_intr;                    /**< max interrupt requested */
> > +	int queue_fd[VFIO_MAX_QUEUE_ID]; /**< rx and tx queue interrupt file descriptor */
> This is used outside of this library, you need to move these new fields to the
> end of the structure.
> 
> neil

Alright, I will move them to the end in V4 patch. 

Neil, do you have any simple writeup on guideline about how to add APIs and new fields to existing 
structure in order to make sure new stuff does not break ABI? It might help all the developers to avoid
making similar mistakes in the future.

> 
> >  	enum rte_intr_handle_type type;  /**< handle type */
> >  };
> >
> > --
> > 1.8.1.4
> >
> >

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v3 1/5] ethdev: add rx interrupt enable/disable functions
  2015-02-17 15:54  3%   ` Neil Horman
@ 2015-02-19  7:58  3%     ` Zhou, Danny
  2015-02-19 13:02  3%       ` Neil Horman
  0 siblings, 1 reply; 200+ results
From: Zhou, Danny @ 2015-02-19  7:58 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev



> -----Original Message-----
> From: Neil Horman [mailto:nhorman@tuxdriver.com]
> Sent: Tuesday, February 17, 2015 11:55 PM
> To: Zhou, Danny
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v3 1/5] ethdev: add rx interrupt enable/disable functions
> 
> On Tue, Feb 17, 2015 at 09:47:15PM +0800, Zhou Danny wrote:
> > v3 changes
> > - Add return value for interrupt enable/disable functions
> >
> > Add two dev_ops functions to enable and disable rx queue interrupts
> >
> > Signed-off-by: Danny Zhou <danny.zhou@intel.com>
> > Tested-by: Yong Liu <yong.liu@intel.com>
> > ---
> >  lib/librte_ether/rte_ethdev.c | 43 ++++++++++++++++++++++++++++++++
> >  lib/librte_ether/rte_ethdev.h | 57 +++++++++++++++++++++++++++++++++++++++++++
> >  2 files changed, 100 insertions(+)
> >
> > diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
> > index ea3a1fb..d27469a 100644
> > --- a/lib/librte_ether/rte_ethdev.c
> > +++ b/lib/librte_ether/rte_ethdev.c
> > @@ -2825,6 +2825,49 @@ _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
> >  	}
> >  	rte_spinlock_unlock(&rte_eth_dev_cb_lock);
> >  }
> > +
> > +int
> > +rte_eth_dev_rx_queue_intr_enable(uint8_t port_id,
> > +				uint16_t queue_id)
> > +{
> > +	struct rte_eth_dev *dev;
> > +
> > +	if (port_id >= nb_ports) {
> > +		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
> > +		return (-ENODEV);
> > +	}
> > +
> > +	dev = &rte_eth_devices[port_id];
> > +	if (dev == NULL) {
> > +		PMD_DEBUG_TRACE("Invalid port device\n");
> > +		return (-ENODEV);
> > +	}
> > +
> > +	FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_intr_enable, -ENOTSUP);
> > +	return (*dev->dev_ops->rx_queue_intr_enable)(dev, queue_id);
> > +}
> > +
> > +int
> > +rte_eth_dev_rx_queue_intr_disable(uint8_t port_id,
> > +				uint16_t queue_id)
> > +{
> > +	struct rte_eth_dev *dev;
> > +
> > +	if (port_id >= nb_ports) {
> > +		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
> > +		return (-ENODEV);
> > +	}
> > +
> > +	dev = &rte_eth_devices[port_id];
> > +	if (dev == NULL) {
> > +		PMD_DEBUG_TRACE("Invalid port device\n");
> > +		return (-ENODEV);
> > +	}
> > +
> > +	FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_intr_disable, -ENOTSUP);
> > +	return (*dev->dev_ops->rx_queue_intr_disable)(dev, queue_id);
> > +}
> > +
> >  #ifdef RTE_NIC_BYPASS
> >  int rte_eth_dev_bypass_init(uint8_t port_id)
> >  {
> > diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
> > index 84160c3..0f320a9 100644
> > --- a/lib/librte_ether/rte_ethdev.h
> > +++ b/lib/librte_ether/rte_ethdev.h
> > @@ -848,6 +848,8 @@ struct rte_eth_fdir {
> >  struct rte_intr_conf {
> >  	/** enable/disable lsc interrupt. 0 (default) - disable, 1 enable */
> >  	uint16_t lsc;
> > +	/** enable/disable rxq interrupt. 0 (default) - disable, 1 enable */
> > +	uint16_t rxq;
> >  };
> >
> >  /**
> > @@ -1109,6 +1111,14 @@ typedef int (*eth_tx_queue_setup_t)(struct rte_eth_dev *dev,
> >  				    const struct rte_eth_txconf *tx_conf);
> >  /**< @internal Setup a transmit queue of an Ethernet device. */
> >
> > +typedef int (*eth_rx_enable_intr_t)(struct rte_eth_dev *dev,
> > +				    uint16_t rx_queue_id);
> > +/**< @internal Enable interrupt of a receive queue of an Ethernet device. */
> > +
> > +typedef int (*eth_rx_disable_intr_t)(struct rte_eth_dev *dev,
> > +				    uint16_t rx_queue_id);
> > +/**< @internal Disable interrupt of a receive queue of an Ethernet device. */
> > +
> >  typedef void (*eth_queue_release_t)(void *queue);
> >  /**< @internal Release memory resources allocated by given RX/TX queue. */
> >
> > @@ -1445,6 +1455,8 @@ struct eth_dev_ops {
> >  	eth_queue_start_t          tx_queue_start;/**< Start TX for a queue.*/
> >  	eth_queue_stop_t           tx_queue_stop;/**< Stop TX for a queue.*/
> >  	eth_rx_queue_setup_t       rx_queue_setup;/**< Set up device RX queue.*/
> > +	eth_rx_enable_intr_t       rx_queue_intr_enable; /**< Enable Rx queue interrupt. */
> > +	eth_rx_disable_intr_t      rx_queue_intr_disable; /**< Disable Rx queue interrupt.*/
> Put these at the end of eth_dev_ops if you want to avoid breaking ABI

I purposely add those two APIs at current position to ensure all rxq related APIs are declared together
in eth_dev_ops. Anyway, moving them to the end is ok to me for the reason of ABI, though the code looks
a little bit ugly.

> 
> >  	eth_queue_release_t        rx_queue_release;/**< Release RX queue.*/
> >  	eth_rx_queue_count_t       rx_queue_count; /**< Get Rx queue count. */
> >  	eth_rx_descriptor_done_t   rx_descriptor_done;  /**< Check rxd DD bit */
> > @@ -2811,6 +2823,51 @@ void _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
> >  				enum rte_eth_event_type event);
> >
> >  /**
> > + * When there is no rx packet coming in Rx Queue for a long time, we can
> > + * sleep lcore related to RX Queue for power saving, and enable rx interrupt
> > + * to be triggered when rx packect arrives.
> > + *
> > + * The rte_eth_dev_rx_queue_intr_enable() function enables rx queue
> > + * interrupt on specific rx queue of a port.
> > + *
> > + * @param port_id
> > + *   The port identifier of the Ethernet device.
> > + * @param queue_id
> > + *   The index of the receive queue from which to retrieve input packets.
> > + *   The value must be in the range [0, nb_rx_queue - 1] previously supplied
> > + *   to rte_eth_dev_configure().
> > + * @return
> > + *   - (0) if successful.
> > + *   - (-ENOTSUP) if underlying hardware OR driver doesn't support
> > + *     that operation.
> > + *   - (-ENODEV) if *port_id* invalid.
> > + */
> > +int rte_eth_dev_rx_queue_intr_enable(uint8_t port_id,
> > +				uint16_t queue_id);
> > +
> > +/**
> > + * When lcore wakes up from rx interrupt indicating packet coming, disable rx
> > + * interrupt and returns to polling mode.
> > + *
> > + * The rte_eth_dev_rx_queue_intr_disable() function disables rx queue
> > + * interrupt on specific rx queue of a port.
> > + *
> > + * @param port_id
> > + *   The port identifier of the Ethernet device.
> > + * @param queue_id
> > + *   The index of the receive queue from which to retrieve input packets.
> > + *   The value must be in the range [0, nb_rx_queue - 1] previously supplied
> > + *   to rte_eth_dev_configure().
> > + * @return
> > + *   - (0) if successful.
> > + *   - (-ENOTSUP) if underlying hardware OR driver doesn't support
> > + *     that operation.
> > + *   - (-ENODEV) if *port_id* invalid.
> > + */
> > +int rte_eth_dev_rx_queue_intr_disable(uint8_t port_id,
> > +				uint16_t queue_id);
> > +
> > +/**
> >   * Turn on the LED on the Ethernet device.
> >   * This function turns on the LED on the Ethernet device.
> >   *
> > --
> > 1.8.1.4
> >
> >

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v2] doc: Add requirements for x32 ABI
  2015-02-16 16:29  4%   ` De Lara Guarch, Pablo
@ 2015-02-18 19:33  4%     ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-02-18 19:33 UTC (permalink / raw)
  To: Mrzyglod, DanielX T; +Cc: dev

> > This patch add requirements about compiler and distribution support.
> > 
> > v2:
> > spelling fixes
> > 
> > Signed-off-by: Daniel Mrzyglod <danielx.t.mrzyglod@intel.com>
> 
> Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
> 
> Thanks Daniel!

Applied, thanks

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] x32 ABI support, first iteration
  2015-02-12 13:18  4%   ` De Lara Guarch, Pablo
@ 2015-02-18 19:32  4%     ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-02-18 19:32 UTC (permalink / raw)
  To: Daniel Mrzyglod; +Cc: dev

> > > Signed-off-by: Konstantin Ananyev <konstantin.ananyev at intel.com>
> > > Signed-off-by: Daniel Mrzyglod <danielx.t.mrzyglod at intel.com>
> > 
> > Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
> 
> Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
> 
> Just add that documentation should be updated for this.

Applied, thanks

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v3 0/3] DPDK ethdev callback support
      2015-02-13 15:39  4% ` [dpdk-dev] [PATCH v2 0/4] " John McNamara
@ 2015-02-18 17:42  4% ` John McNamara
  2015-02-19 17:56  4%   ` [dpdk-dev] [PATCH v4 " John McNamara
  2015-02-20 17:03  4%   ` [dpdk-dev] [PATCH v5 " John McNamara
  2 siblings, 2 replies; 200+ results
From: John McNamara @ 2015-02-18 17:42 UTC (permalink / raw)
  To: dev

This patchset is for a small addition to the ethdev library, to
add in support for callbacks at the RX and TX stages. This allows
packet processing to be done on packets before they get returned
to applications using rte_eth_rx_burst call.

See the RFC cover letter for the use cases:

    http://dpdk.org/ml/archives/dev/2014-December/010491.html

For this version we spent some time investigating Stephen Hemminger's
suggestion of using the userspace RCU (read-copy-update) library for
SMP safety:

   http://urcu.so/

The default liburcu (which defaulted to liburcu-mb) requires the least
interaction from the end user but showed a 25% drop in packet throughput
in the callback sample app.

The liburcu-qsbr (quiescent state) variant showed a 1% drop in packet
throughput in the callback sample app. However it requires registered
RCU threads in the program to periodically announce quiescent states.
This makes it more difficult to implement for end user applications.

For this release we will document that adding and removing callbacks
is not thread safe.

Note: Sample application documentation to follow in a patch update.

Version 3 changes:
    * Removed unnecessary header file from example folder
      (which included baremetal reference).
    * Renamed the interrupt, RX and TX callbacks to make their function
      clearer (using the names suggested in the mailing list comments).
    * Squashed ABI version update into the commit it relates to.
    * Fixed various checkpatch warnings.

Version 2 changes:
    * Added ABI versioning.
    * Doxygen clarifications.

Version 1 changes:
    * Added callback removal functions.
    * Minor fixes.


Richardson, Bruce (3):
  ethdev: Rename callbacks field to link_intr_cbs
  ethdev: Add rxtx callback support
  examples: example showing use of callbacks.

 app/test/virtual_pmd.c                 |    2 +-
 examples/rxtx_callbacks/Makefile       |   57 ++++++++
 examples/rxtx_callbacks/main.c         |  228 ++++++++++++++++++++++++++++++++
 lib/librte_ether/rte_ethdev.c          |  183 ++++++++++++++++++++++++--
 lib/librte_ether/rte_ethdev.h          |  192 ++++++++++++++++++++++++++-
 lib/librte_ether/rte_ether_version.map |    4 +
 lib/librte_pmd_bond/rte_eth_bond_api.c |    2 +-
 7 files changed, 654 insertions(+), 14 deletions(-)
 create mode 100644 examples/rxtx_callbacks/Makefile
 create mode 100644 examples/rxtx_callbacks/main.c

-- 
1.7.4.1

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [RFC PATCH] lib/librte_ethdev: Expand port identifier
  2015-02-18 13:05  0%     ` Wodkowski, PawelX
@ 2015-02-18 14:10  0%       ` Bruce Richardson
  0 siblings, 0 replies; 200+ results
From: Bruce Richardson @ 2015-02-18 14:10 UTC (permalink / raw)
  To: Wodkowski, PawelX; +Cc: dev

On Wed, Feb 18, 2015 at 01:05:10PM +0000, Wodkowski, PawelX wrote:
> > -----Original Message-----
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Bruce Richardson
> > Sent: Wednesday, February 18, 2015 1:32 PM
> > To: Tetsuya Mukawa
> > Cc: dev@dpdk.org
> > Subject: Re: [dpdk-dev] [RFC PATCH] lib/librte_ethdev: Expand port identifier
> > 
> > On Wed, Feb 18, 2015 at 12:30:07PM +0000, Bruce Richardson wrote:
> > > On Wed, Feb 18, 2015 at 08:02:49PM +0900, Tetsuya Mukawa wrote:
> > > > Currently uint8_t is used for port identifier. This patch changes it,
> > > > and use uint16_t as port identifier.
> > > > This patch only changes ethdev library. ABI of the library will be
> > > > kept even after applying it.
> > > >
> > > > Also, this patch involves following fixes.
> > > > - Use "port_id" as variable name instead of "port".
> > > >
> > > >
> > > > Signed-off-by: Tetsuya Mukawa <mukawa@igel.co.jp>
> > > > ---
> > > >  lib/librte_ether/rte_ethdev.c          |  212 +-
> > > >  lib/librte_ether/rte_ethdev_internal.h | 3672
> > ++++++++++++++++++++++++++++++++
> > > >  2 files changed, 3778 insertions(+), 106 deletions(-)
> > > >  create mode 100644 lib/librte_ether/rte_ethdev_internal.h
> > > >
> > > I'm not sure I follow why we need a new header file for this.
> > > Also, thinking about this change, a more fundamental problem is going to be
> > > the mbuf structure, which stores a port id inside it in an 8-bit value.
> > > Upgrading that to a 16-bit value requires some thought, and verification to
> > > ensure any adjustment of fields does not lead to serious performance issues.
> > >
> > > Therefore, I suggest we leave the port id values as 8-bits until such time
> > > as we need greater than 255 port values in a real-world use case.
> > > Out of interest - anyone have a DPDK app where they use >16 port id values? If
> > > so, how high does the port id value get?
> 
> Not real application but simple example of setup:
> 4 Niantic x 2 ports x 64 VF = 512 port id

However, I'd find it hard to see why you would split a single port into 64
within a *single* application, let alone do that with 8 of them :-)

> 
> I don't know what would be the real need/advantage of such setup (bonding?) but 
> you see, in theory it is already insufficient.

Well, in theory any number of ports is insufficient, as you can create thousands
and thousands of pcap or ring ethdevs in an app if you really want. Hence the
question about any actual use cases which use a large number of ports. :-)

/Bruce

> 
> > >
> > > Regards,
> > > /Bruce
> > >
> > 
> > Resending with correct email addr for Neil.
> > 
> > /Bruce

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [RFC PATCH] lib/librte_ethdev: Expand port identifier
  2015-02-18 13:10  0%     ` Marc Sune
@ 2015-02-18 13:49  0%       ` Bruce Richardson
  0 siblings, 0 replies; 200+ results
From: Bruce Richardson @ 2015-02-18 13:49 UTC (permalink / raw)
  To: Marc Sune; +Cc: dev

On Wed, Feb 18, 2015 at 02:10:48PM +0100, Marc Sune wrote:
> 
> On 18/02/15 13:31, Bruce Richardson wrote:
> >On Wed, Feb 18, 2015 at 12:30:07PM +0000, Bruce Richardson wrote:
> >>On Wed, Feb 18, 2015 at 08:02:49PM +0900, Tetsuya Mukawa wrote:
> >>>Currently uint8_t is used for port identifier. This patch changes it,
> >>>and use uint16_t as port identifier.
> >>>This patch only changes ethdev library. ABI of the library will be
> >>>kept even after applying it.
> >>>
> >>>Also, this patch involves following fixes.
> >>>- Use "port_id" as variable name instead of "port".
> >>>
> >>>
> >>>Signed-off-by: Tetsuya Mukawa <mukawa@igel.co.jp>
> >>>---
> >>>  lib/librte_ether/rte_ethdev.c          |  212 +-
> >>>  lib/librte_ether/rte_ethdev_internal.h | 3672 ++++++++++++++++++++++++++++++++
> >>>  2 files changed, 3778 insertions(+), 106 deletions(-)
> >>>  create mode 100644 lib/librte_ether/rte_ethdev_internal.h
> >>>
> >>I'm not sure I follow why we need a new header file for this.
> >>Also, thinking about this change, a more fundamental problem is going to be
> >>the mbuf structure, which stores a port id inside it in an 8-bit value.
> >>Upgrading that to a 16-bit value requires some thought, and verification to
> >>ensure any adjustment of fields does not lead to serious performance issues.
> >>
> >>Therefore, I suggest we leave the port id values as 8-bits until such time
> >>as we need greater than 255 port values in a real-world use case.
> >>Out of interest - anyone have a DPDK app where they use >16 port id values? If
> >>so, how high does the port id value get?
> 
> Just a though on port_id in general; I wouldn't see why other type of ports
> could fall into the same abstraction of using port_ids as we do for PHY
> ports, if eventually we could create a unified API TX/RX routines he same
> regardless of the port (I know KNI deprecated this approach in the past). Of
> course initialization routines should be different for each type of port.
> 
> I see quite a bit of code duplicity, basically in TX/RX routines for PHY
> ports, KNI ports, SHMEM (ring) ports like ivshmem etc.., which are very
> similar, and we put into the shoulders of all users of DPDK to have to do
> the "switch() - case" based on the type of port (which is state that they
> have to store themselves too). This seems to me it could be improved from a
> DPDK user's point of view.
> 
> By no means I am saying lower level APIs should not be exposed (current
> APIs)... There is the need to, since users using one type of ports only
> should be able to by-pass that (small?) extra overhead of this higher level
> APIs.
> 
> If the implementation would eventually would go into this direction, there
> would be more pressure in the port_id identifier; e.g. KNI interfaces and
> other SW like interfaces can be created and destroyed quite frequently (e.g.
> VMs), so more than 8 bits for addressing would probably be needed.
> 
> I know it not helping in the short-term, but let's see if someone thinks
> this makes any sense at all.
> 
> Marc
> 

Yes, this makes complete sense, Marc, and it's something I (and some others 
here in Intel ) have certainly been thinking about - and go on thinking about.
The ability to have multiple objects of different types accessible under a
generic rx_burst/tx_burst interface is a very powerful one. 
[I actually tried something a bit like this before, with
patches to allow a form of type-casting from rings to ethdevs, but it didn't
go further as it was felt to overlap too much with the rings pmd.
http://dpdk.org/ml/archives/dev/2014-May/002505.html ].

Overall, at this point we believe that the ethdev itself is a bit of overkill
for a common API, since it's got a lot of NIC specific baggage in its APIs.
We are thinking that perhaps a "higher-level", more minimal abstraction, which
just has rx_burst or tx_burst functions and not a lot else, might be more
useful, as it can then be "sub-classed" [to use object-oriented terminology]
into device-type specific versions such as ethdev.
At this stage, we're just thinking about what such a thing might look like, and trying
a few things out to see if such an idea is workable. If we think it's something
worth pursuing, we hope to have something to share very soon, to get input
from the whole community to see if it's worth doing for future releases. However,
it appears your thinking closely aligns with what we are thinking, which is good
to see!

Regards,
/Bruce

> >>
> >>Regards,
> >>/Bruce
> >>
> >Resending with correct email addr for Neil.
> >
> >/Bruce
> 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [RFC PATCH] lib/librte_ethdev: Expand port identifier
  2015-02-18 12:31  0%   ` Bruce Richardson
  2015-02-18 13:05  0%     ` Wodkowski, PawelX
@ 2015-02-18 13:10  0%     ` Marc Sune
  2015-02-18 13:49  0%       ` Bruce Richardson
  1 sibling, 1 reply; 200+ results
From: Marc Sune @ 2015-02-18 13:10 UTC (permalink / raw)
  To: dev


On 18/02/15 13:31, Bruce Richardson wrote:
> On Wed, Feb 18, 2015 at 12:30:07PM +0000, Bruce Richardson wrote:
>> On Wed, Feb 18, 2015 at 08:02:49PM +0900, Tetsuya Mukawa wrote:
>>> Currently uint8_t is used for port identifier. This patch changes it,
>>> and use uint16_t as port identifier.
>>> This patch only changes ethdev library. ABI of the library will be
>>> kept even after applying it.
>>>
>>> Also, this patch involves following fixes.
>>> - Use "port_id" as variable name instead of "port".
>>>
>>>
>>> Signed-off-by: Tetsuya Mukawa <mukawa@igel.co.jp>
>>> ---
>>>   lib/librte_ether/rte_ethdev.c          |  212 +-
>>>   lib/librte_ether/rte_ethdev_internal.h | 3672 ++++++++++++++++++++++++++++++++
>>>   2 files changed, 3778 insertions(+), 106 deletions(-)
>>>   create mode 100644 lib/librte_ether/rte_ethdev_internal.h
>>>
>> I'm not sure I follow why we need a new header file for this.
>> Also, thinking about this change, a more fundamental problem is going to be
>> the mbuf structure, which stores a port id inside it in an 8-bit value.
>> Upgrading that to a 16-bit value requires some thought, and verification to
>> ensure any adjustment of fields does not lead to serious performance issues.
>>
>> Therefore, I suggest we leave the port id values as 8-bits until such time
>> as we need greater than 255 port values in a real-world use case.
>> Out of interest - anyone have a DPDK app where they use >16 port id values? If
>> so, how high does the port id value get?

Just a though on port_id in general; I wouldn't see why other type of 
ports could fall into the same abstraction of using port_ids as we do 
for PHY ports, if eventually we could create a unified API TX/RX 
routines he same regardless of the port (I know KNI deprecated this 
approach in the past). Of course initialization routines should be 
different for each type of port.

I see quite a bit of code duplicity, basically in TX/RX routines for PHY 
ports, KNI ports, SHMEM (ring) ports like ivshmem etc.., which are very 
similar, and we put into the shoulders of all users of DPDK to have to 
do the "switch() - case" based on the type of port (which is state that 
they have to store themselves too). This seems to me it could be 
improved from a DPDK user's point of view.

By no means I am saying lower level APIs should not be exposed (current 
APIs)... There is the need to, since users using one type of ports only 
should be able to by-pass that (small?) extra overhead of this higher 
level APIs.

If the implementation would eventually would go into this direction, 
there would be more pressure in the port_id identifier; e.g. KNI 
interfaces and other SW like interfaces can be created and destroyed 
quite frequently (e.g. VMs), so more than 8 bits for addressing would 
probably be needed.

I know it not helping in the short-term, but let's see if someone thinks 
this makes any sense at all.

Marc

>>
>> Regards,
>> /Bruce
>>
> Resending with correct email addr for Neil.
>
> /Bruce

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [RFC PATCH] lib/librte_ethdev: Expand port identifier
  2015-02-18 12:31  0%   ` Bruce Richardson
@ 2015-02-18 13:05  0%     ` Wodkowski, PawelX
  2015-02-18 14:10  0%       ` Bruce Richardson
  2015-02-18 13:10  0%     ` Marc Sune
  1 sibling, 1 reply; 200+ results
From: Wodkowski, PawelX @ 2015-02-18 13:05 UTC (permalink / raw)
  To: Richardson, Bruce, Tetsuya Mukawa; +Cc: dev

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Bruce Richardson
> Sent: Wednesday, February 18, 2015 1:32 PM
> To: Tetsuya Mukawa
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] [RFC PATCH] lib/librte_ethdev: Expand port identifier
> 
> On Wed, Feb 18, 2015 at 12:30:07PM +0000, Bruce Richardson wrote:
> > On Wed, Feb 18, 2015 at 08:02:49PM +0900, Tetsuya Mukawa wrote:
> > > Currently uint8_t is used for port identifier. This patch changes it,
> > > and use uint16_t as port identifier.
> > > This patch only changes ethdev library. ABI of the library will be
> > > kept even after applying it.
> > >
> > > Also, this patch involves following fixes.
> > > - Use "port_id" as variable name instead of "port".
> > >
> > >
> > > Signed-off-by: Tetsuya Mukawa <mukawa@igel.co.jp>
> > > ---
> > >  lib/librte_ether/rte_ethdev.c          |  212 +-
> > >  lib/librte_ether/rte_ethdev_internal.h | 3672
> ++++++++++++++++++++++++++++++++
> > >  2 files changed, 3778 insertions(+), 106 deletions(-)
> > >  create mode 100644 lib/librte_ether/rte_ethdev_internal.h
> > >
> > I'm not sure I follow why we need a new header file for this.
> > Also, thinking about this change, a more fundamental problem is going to be
> > the mbuf structure, which stores a port id inside it in an 8-bit value.
> > Upgrading that to a 16-bit value requires some thought, and verification to
> > ensure any adjustment of fields does not lead to serious performance issues.
> >
> > Therefore, I suggest we leave the port id values as 8-bits until such time
> > as we need greater than 255 port values in a real-world use case.
> > Out of interest - anyone have a DPDK app where they use >16 port id values? If
> > so, how high does the port id value get?

Not real application but simple example of setup:
4 Niantic x 2 ports x 64 VF = 512 port id

I don't know what would be the real need/advantage of such setup (bonding?) but 
you see, in theory it is already insufficient.

> >
> > Regards,
> > /Bruce
> >
> 
> Resending with correct email addr for Neil.
> 
> /Bruce

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v8 03/14] eal/pci, ethdev: Remove assumption that port will not be detached
  2015-02-18 12:33  0%                 ` Iremonger, Bernard
@ 2015-02-18 12:41  0%                   ` Tetsuya Mukawa
  0 siblings, 0 replies; 200+ results
From: Tetsuya Mukawa @ 2015-02-18 12:41 UTC (permalink / raw)
  To: Iremonger, Bernard, Richardson, Bruce, Thomas Monjalon; +Cc: dev

On 2015/02/18 21:33, Iremonger, Bernard wrote:
>
>> -----Original Message-----
>> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Tetsuya Mukawa
>> Sent: Wednesday, February 18, 2015 10:58 AM
>> To: Richardson, Bruce; Thomas Monjalon
>> Cc: dev@dpdk.org; Neil Horman
>> Subject: Re: [dpdk-dev] [PATCH v8 03/14] eal/pci, ethdev: Remove assumption that port will not be
>> detached
>>
>> On 2015/02/18 19:03, Bruce Richardson wrote:
>>> On Wed, Feb 18, 2015 at 10:57:25AM +0100, Thomas Monjalon wrote:
>>>> 2015-02-18 15:10, Tetsuya Mukawa:
>>>>> On 2015/02/18 10:54, Tetsuya Mukawa wrote:
>>>>>> On 2015/02/18 9:31, Thomas Monjalon wrote:
>>>>>>> 2015-02-17 15:14, Tetsuya Mukawa:
>>>>>>>> On 2015/02/17 9:36, Thomas Monjalon wrote:
>>>>>>>>> 2015-02-16 13:14, Tetsuya Mukawa:
>>>>>>>>> Is uint8_t sill a good size for hotpluggable virtual device ids?
>>>>>>>> I am not sure it's enough, but uint8_t is widely used in "rte_ethdev.c"
>>>>>>>> as port id.
>>>>>>>> If someone reports it doesn't enough, I guess it will be the time
>>>>>>>> to write a patch to change all uint_8 in one patch.
>>>>>>> It's a big ABI breakage. So if we feel it's going to be required,
>>>>>>> it's better to do it now in 2.0 release I think.
>>>>>>>
>>>>>>> Any opinion?
>>>>>>>
>>>>>> Hi Thomas,
>>>>>>
>>>>>> I agree with it.
>>>>>> I will add an one more patch to change uint8_t to uint16_t.
>>>>>>
>>>>>> Thanks,
>>>>>> Tetsuya
>>>>>>
>>>>> Hi Thomas,
>>>>>
>>>>> Could I make sure.
>>>>> After changing uint8_t to uint16_t in "rte_ethdev.[ch]", must I also
>>>>> need to change other applications and libraries that call ethdev APIs?
>>>>> If so, I would not finish it by 23rd.
>>>>>
>>>>> I've counted how many lines call ethdev APIs that are related to port_id.
>>>>> Could you please check an attached file?
>>>>> It's over 1200 lines. Probably to fix  one of caller, I will need to
>>>>> check how port_id is used, and fix more related lines. So probably
>>>>> thousands lines may need to be fixed.
>>>>>
>>>>> When is deadline for fixing this changing?
>>>>> Also, if you have a good idea to fix it easier, could you please let
>>>>> me know?
>>>> It was an open question.
>>>> If everybody is fine with 255 ports maximum, let's keep it as is.
>>>>
>>> I think we are probably ok for now (and forseeable future) with 255 max.
>>>
>>> However, if we did change it, I agree that in 2.0 is a very good time to do so.
>>> Since we are expanding the field, rather than shrinking it, I don't
>>> see why we can't just make the change at the ethdev level (and in libs
>>> API) in 2.0 and then in later releases (e.g. 2.1) update the apps and
>>> examples to match. That way the ABI stays the same from 2.0 onwards,
>>> and we don't have a huge amount of churn changing it everywhere late in the 2.0 release cycle.
>> Hi Bruce,
>>
>> Could you please check my RFC patch I will send soon?
>> I wrote the patch like below.
>>
>> 1. Copy header file like below.
>> $ cp lib/librte_ether/rte_ethdev.h lib/librte_ether/rte_ethdev_internal.h
>> 2. Change "rte_ethdev.c" to include "rte_ethdev_internal.h"
>> 3. Change type of port id in "rte_ethdev.c" and "rte_ethdev_internal.h".
>>
>> If the patch is OK, I wll send it with hotplug patches.
>>
>> Thanks,
>> Tetsuya
>>
>>
>>> /Bruce
> Hi Tetsuya,
>
> After this change there will be two header files with a lot of the same information.
> lib/librte_ether/rte_ethdev.h
> lib/librte_ether/rte_ethdev_internal.h
> I don't think this is a good idea for maintenance in the future.
> If 255 is ok for the foreseeable future, why change it now.

Hi Bernard,

I appreciate for your checking.
Agree, it will not be good to have almost same headers.

Thanks,
Tetsuya

> Regards,
>
> Bernard.
>  
>

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v8 03/14] eal/pci, ethdev: Remove assumption that port will not be detached
  2015-02-18 12:23  0%                 ` Bruce Richardson
@ 2015-02-18 12:38  0%                   ` Tetsuya Mukawa
  0 siblings, 0 replies; 200+ results
From: Tetsuya Mukawa @ 2015-02-18 12:38 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: dev, Neil Horman

On 2015/02/18 21:23, Bruce Richardson wrote:
> On Wed, Feb 18, 2015 at 07:58:06PM +0900, Tetsuya Mukawa wrote:
>> On 2015/02/18 19:03, Bruce Richardson wrote:
>>> On Wed, Feb 18, 2015 at 10:57:25AM +0100, Thomas Monjalon wrote:
>>>> 2015-02-18 15:10, Tetsuya Mukawa:
>>>>> On 2015/02/18 10:54, Tetsuya Mukawa wrote:
>>>>>> On 2015/02/18 9:31, Thomas Monjalon wrote:
>>>>>>> 2015-02-17 15:14, Tetsuya Mukawa:
>>>>>>>> On 2015/02/17 9:36, Thomas Monjalon wrote:
>>>>>>>>> 2015-02-16 13:14, Tetsuya Mukawa:
>>>>>>>>> Is uint8_t sill a good size for hotpluggable virtual device ids?
>>>>>>>> I am not sure it's enough, but uint8_t is widely used in "rte_ethdev.c"
>>>>>>>> as port id.
>>>>>>>> If someone reports it doesn't enough, I guess it will be the time to
>>>>>>>> write a patch to change all uint_8 in one patch.
>>>>>>> It's a big ABI breakage. So if we feel it's going to be required,
>>>>>>> it's better to do it now in 2.0 release I think.
>>>>>>>
>>>>>>> Any opinion?
>>>>>>>
>>>>>> Hi Thomas,
>>>>>>
>>>>>> I agree with it.
>>>>>> I will add an one more patch to change uint8_t to uint16_t.
>>>>>>
>>>>>> Thanks,
>>>>>> Tetsuya
>>>>>>
>>>>> Hi Thomas,
>>>>>
>>>>> Could I make sure.
>>>>> After changing uint8_t to uint16_t in "rte_ethdev.[ch]", must I also
>>>>> need to change other applications and libraries that call ethdev APIs?
>>>>> If so, I would not finish it by 23rd.
>>>>>
>>>>> I've counted how many lines call ethdev APIs that are related to port_id.
>>>>> Could you please check an attached file?
>>>>> It's over 1200 lines. Probably to fix  one of caller, I will need to
>>>>> check how port_id is used, and fix more related lines. So probably
>>>>> thousands lines may need to be fixed.
>>>>>
>>>>> When is deadline for fixing this changing?
>>>>> Also, if you have a good idea to fix it easier, could you please let me
>>>>> know?
>>>> It was an open question.
>>>> If everybody is fine with 255 ports maximum, let's keep it as is.
>>>>
>>> I think we are probably ok for now (and forseeable future) with 255 max.
>>>
>>> However, if we did change it, I agree that in 2.0 is a very good time to do so.
>>> Since we are expanding the field, rather than shrinking it, I don't see why we
>>> can't just make the change at the ethdev level (and in libs API) in 2.0 and then in
>>> later releases (e.g. 2.1) update the apps and examples to match. That way the
>>> ABI stays the same from 2.0 onwards, and we don't have a huge amount of churn
>>> changing it everywhere late in the 2.0 release cycle.
>> Hi Bruce,
>>
>> Could you please check my RFC patch I will send soon?
>> I wrote the patch like below.
>>
>> 1. Copy header file like below.
>> $ cp lib/librte_ether/rte_ethdev.h lib/librte_ether/rte_ethdev_internal.h
>> 2. Change "rte_ethdev.c" to include "rte_ethdev_internal.h"
>> 3. Change type of port id in "rte_ethdev.c" and "rte_ethdev_internal.h".
>>
>> If the patch is OK, I wll send it with hotplug patches.
>>
>> Thanks,
>> Tetsuya
>>
>>
> Why the new ethdev internal file? 

I guess some libraries that  include "rte_ethdev.h". To compile these
libraries, I thought such a header was needed.
But, it seems it's not the time to change type of port_id.
I appreciate for your checking.

Tetsuya

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v8 03/14] eal/pci, ethdev: Remove assumption that port will not be detached
  2015-02-18 10:58  0%               ` Tetsuya Mukawa
  2015-02-18 12:23  0%                 ` Bruce Richardson
@ 2015-02-18 12:33  0%                 ` Iremonger, Bernard
  2015-02-18 12:41  0%                   ` Tetsuya Mukawa
  1 sibling, 1 reply; 200+ results
From: Iremonger, Bernard @ 2015-02-18 12:33 UTC (permalink / raw)
  To: Tetsuya Mukawa, Richardson, Bruce, Thomas Monjalon; +Cc: dev, Neil Horman



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Tetsuya Mukawa
> Sent: Wednesday, February 18, 2015 10:58 AM
> To: Richardson, Bruce; Thomas Monjalon
> Cc: dev@dpdk.org; Neil Horman
> Subject: Re: [dpdk-dev] [PATCH v8 03/14] eal/pci, ethdev: Remove assumption that port will not be
> detached
> 
> On 2015/02/18 19:03, Bruce Richardson wrote:
> > On Wed, Feb 18, 2015 at 10:57:25AM +0100, Thomas Monjalon wrote:
> >> 2015-02-18 15:10, Tetsuya Mukawa:
> >>> On 2015/02/18 10:54, Tetsuya Mukawa wrote:
> >>>> On 2015/02/18 9:31, Thomas Monjalon wrote:
> >>>>> 2015-02-17 15:14, Tetsuya Mukawa:
> >>>>>> On 2015/02/17 9:36, Thomas Monjalon wrote:
> >>>>>>> 2015-02-16 13:14, Tetsuya Mukawa:
> >>>>>>> Is uint8_t sill a good size for hotpluggable virtual device ids?
> >>>>>> I am not sure it's enough, but uint8_t is widely used in "rte_ethdev.c"
> >>>>>> as port id.
> >>>>>> If someone reports it doesn't enough, I guess it will be the time
> >>>>>> to write a patch to change all uint_8 in one patch.
> >>>>> It's a big ABI breakage. So if we feel it's going to be required,
> >>>>> it's better to do it now in 2.0 release I think.
> >>>>>
> >>>>> Any opinion?
> >>>>>
> >>>> Hi Thomas,
> >>>>
> >>>> I agree with it.
> >>>> I will add an one more patch to change uint8_t to uint16_t.
> >>>>
> >>>> Thanks,
> >>>> Tetsuya
> >>>>
> >>> Hi Thomas,
> >>>
> >>> Could I make sure.
> >>> After changing uint8_t to uint16_t in "rte_ethdev.[ch]", must I also
> >>> need to change other applications and libraries that call ethdev APIs?
> >>> If so, I would not finish it by 23rd.
> >>>
> >>> I've counted how many lines call ethdev APIs that are related to port_id.
> >>> Could you please check an attached file?
> >>> It's over 1200 lines. Probably to fix  one of caller, I will need to
> >>> check how port_id is used, and fix more related lines. So probably
> >>> thousands lines may need to be fixed.
> >>>
> >>> When is deadline for fixing this changing?
> >>> Also, if you have a good idea to fix it easier, could you please let
> >>> me know?
> >> It was an open question.
> >> If everybody is fine with 255 ports maximum, let's keep it as is.
> >>
> > I think we are probably ok for now (and forseeable future) with 255 max.
> >
> > However, if we did change it, I agree that in 2.0 is a very good time to do so.
> > Since we are expanding the field, rather than shrinking it, I don't
> > see why we can't just make the change at the ethdev level (and in libs
> > API) in 2.0 and then in later releases (e.g. 2.1) update the apps and
> > examples to match. That way the ABI stays the same from 2.0 onwards,
> > and we don't have a huge amount of churn changing it everywhere late in the 2.0 release cycle.
> 
> Hi Bruce,
> 
> Could you please check my RFC patch I will send soon?
> I wrote the patch like below.
> 
> 1. Copy header file like below.
> $ cp lib/librte_ether/rte_ethdev.h lib/librte_ether/rte_ethdev_internal.h
> 2. Change "rte_ethdev.c" to include "rte_ethdev_internal.h"
> 3. Change type of port id in "rte_ethdev.c" and "rte_ethdev_internal.h".
> 
> If the patch is OK, I wll send it with hotplug patches.
> 
> Thanks,
> Tetsuya
> 
> 
> > /Bruce
> 
Hi Tetsuya,

After this change there will be two header files with a lot of the same information.
lib/librte_ether/rte_ethdev.h
lib/librte_ether/rte_ethdev_internal.h
I don't think this is a good idea for maintenance in the future.
If 255 is ok for the foreseeable future, why change it now.

Regards,

Bernard.
 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [RFC PATCH] lib/librte_ethdev: Expand port identifier
  2015-02-18 12:30  0% ` Bruce Richardson
@ 2015-02-18 12:31  0%   ` Bruce Richardson
  2015-02-18 13:05  0%     ` Wodkowski, PawelX
  2015-02-18 13:10  0%     ` Marc Sune
  0 siblings, 2 replies; 200+ results
From: Bruce Richardson @ 2015-02-18 12:31 UTC (permalink / raw)
  To: Tetsuya Mukawa; +Cc: dev

On Wed, Feb 18, 2015 at 12:30:07PM +0000, Bruce Richardson wrote:
> On Wed, Feb 18, 2015 at 08:02:49PM +0900, Tetsuya Mukawa wrote:
> > Currently uint8_t is used for port identifier. This patch changes it,
> > and use uint16_t as port identifier.
> > This patch only changes ethdev library. ABI of the library will be
> > kept even after applying it.
> > 
> > Also, this patch involves following fixes.
> > - Use "port_id" as variable name instead of "port".
> > 
> >
> > Signed-off-by: Tetsuya Mukawa <mukawa@igel.co.jp>
> > ---
> >  lib/librte_ether/rte_ethdev.c          |  212 +-
> >  lib/librte_ether/rte_ethdev_internal.h | 3672 ++++++++++++++++++++++++++++++++
> >  2 files changed, 3778 insertions(+), 106 deletions(-)
> >  create mode 100644 lib/librte_ether/rte_ethdev_internal.h
> > 
> I'm not sure I follow why we need a new header file for this.
> Also, thinking about this change, a more fundamental problem is going to be
> the mbuf structure, which stores a port id inside it in an 8-bit value.
> Upgrading that to a 16-bit value requires some thought, and verification to
> ensure any adjustment of fields does not lead to serious performance issues.
> 
> Therefore, I suggest we leave the port id values as 8-bits until such time
> as we need greater than 255 port values in a real-world use case.
> Out of interest - anyone have a DPDK app where they use >16 port id values? If
> so, how high does the port id value get?
> 
> Regards,
> /Bruce
> 

Resending with correct email addr for Neil.

/Bruce

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [RFC PATCH] lib/librte_ethdev: Expand port identifier
  2015-02-18 11:02  1% [dpdk-dev] [RFC PATCH] lib/librte_ethdev: Expand port identifier Tetsuya Mukawa
@ 2015-02-18 12:30  0% ` Bruce Richardson
  2015-02-18 12:31  0%   ` Bruce Richardson
  0 siblings, 1 reply; 200+ results
From: Bruce Richardson @ 2015-02-18 12:30 UTC (permalink / raw)
  To: Tetsuya Mukawa; +Cc: dev, nhroman

On Wed, Feb 18, 2015 at 08:02:49PM +0900, Tetsuya Mukawa wrote:
> Currently uint8_t is used for port identifier. This patch changes it,
> and use uint16_t as port identifier.
> This patch only changes ethdev library. ABI of the library will be
> kept even after applying it.
> 
> Also, this patch involves following fixes.
> - Use "port_id" as variable name instead of "port".
> 
>
> Signed-off-by: Tetsuya Mukawa <mukawa@igel.co.jp>
> ---
>  lib/librte_ether/rte_ethdev.c          |  212 +-
>  lib/librte_ether/rte_ethdev_internal.h | 3672 ++++++++++++++++++++++++++++++++
>  2 files changed, 3778 insertions(+), 106 deletions(-)
>  create mode 100644 lib/librte_ether/rte_ethdev_internal.h
> 
I'm not sure I follow why we need a new header file for this.
Also, thinking about this change, a more fundamental problem is going to be
the mbuf structure, which stores a port id inside it in an 8-bit value.
Upgrading that to a 16-bit value requires some thought, and verification to
ensure any adjustment of fields does not lead to serious performance issues.

Therefore, I suggest we leave the port id values as 8-bits until such time
as we need greater than 255 port values in a real-world use case.
Out of interest - anyone have a DPDK app where they use >16 port id values? If
so, how high does the port id value get?

Regards,
/Bruce

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v8 03/14] eal/pci, ethdev: Remove assumption that port will not be detached
  2015-02-18 10:58  0%               ` Tetsuya Mukawa
@ 2015-02-18 12:23  0%                 ` Bruce Richardson
  2015-02-18 12:38  0%                   ` Tetsuya Mukawa
  2015-02-18 12:33  0%                 ` Iremonger, Bernard
  1 sibling, 1 reply; 200+ results
From: Bruce Richardson @ 2015-02-18 12:23 UTC (permalink / raw)
  To: Tetsuya Mukawa; +Cc: dev, Neil Horman

On Wed, Feb 18, 2015 at 07:58:06PM +0900, Tetsuya Mukawa wrote:
> On 2015/02/18 19:03, Bruce Richardson wrote:
> > On Wed, Feb 18, 2015 at 10:57:25AM +0100, Thomas Monjalon wrote:
> >> 2015-02-18 15:10, Tetsuya Mukawa:
> >>> On 2015/02/18 10:54, Tetsuya Mukawa wrote:
> >>>> On 2015/02/18 9:31, Thomas Monjalon wrote:
> >>>>> 2015-02-17 15:14, Tetsuya Mukawa:
> >>>>>> On 2015/02/17 9:36, Thomas Monjalon wrote:
> >>>>>>> 2015-02-16 13:14, Tetsuya Mukawa:
> >>>>>>> Is uint8_t sill a good size for hotpluggable virtual device ids?
> >>>>>> I am not sure it's enough, but uint8_t is widely used in "rte_ethdev.c"
> >>>>>> as port id.
> >>>>>> If someone reports it doesn't enough, I guess it will be the time to
> >>>>>> write a patch to change all uint_8 in one patch.
> >>>>> It's a big ABI breakage. So if we feel it's going to be required,
> >>>>> it's better to do it now in 2.0 release I think.
> >>>>>
> >>>>> Any opinion?
> >>>>>
> >>>> Hi Thomas,
> >>>>
> >>>> I agree with it.
> >>>> I will add an one more patch to change uint8_t to uint16_t.
> >>>>
> >>>> Thanks,
> >>>> Tetsuya
> >>>>
> >>> Hi Thomas,
> >>>
> >>> Could I make sure.
> >>> After changing uint8_t to uint16_t in "rte_ethdev.[ch]", must I also
> >>> need to change other applications and libraries that call ethdev APIs?
> >>> If so, I would not finish it by 23rd.
> >>>
> >>> I've counted how many lines call ethdev APIs that are related to port_id.
> >>> Could you please check an attached file?
> >>> It's over 1200 lines. Probably to fix  one of caller, I will need to
> >>> check how port_id is used, and fix more related lines. So probably
> >>> thousands lines may need to be fixed.
> >>>
> >>> When is deadline for fixing this changing?
> >>> Also, if you have a good idea to fix it easier, could you please let me
> >>> know?
> >> It was an open question.
> >> If everybody is fine with 255 ports maximum, let's keep it as is.
> >>
> > I think we are probably ok for now (and forseeable future) with 255 max.
> >
> > However, if we did change it, I agree that in 2.0 is a very good time to do so.
> > Since we are expanding the field, rather than shrinking it, I don't see why we
> > can't just make the change at the ethdev level (and in libs API) in 2.0 and then in
> > later releases (e.g. 2.1) update the apps and examples to match. That way the
> > ABI stays the same from 2.0 onwards, and we don't have a huge amount of churn
> > changing it everywhere late in the 2.0 release cycle.
> 
> Hi Bruce,
> 
> Could you please check my RFC patch I will send soon?
> I wrote the patch like below.
> 
> 1. Copy header file like below.
> $ cp lib/librte_ether/rte_ethdev.h lib/librte_ether/rte_ethdev_internal.h
> 2. Change "rte_ethdev.c" to include "rte_ethdev_internal.h"
> 3. Change type of port id in "rte_ethdev.c" and "rte_ethdev_internal.h".
> 
> If the patch is OK, I wll send it with hotplug patches.
> 
> Thanks,
> Tetsuya
> 
>
Why the new ethdev internal file? 

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [RFC PATCH] lib/librte_ethdev: Expand port identifier
@ 2015-02-18 11:02  1% Tetsuya Mukawa
  2015-02-18 12:30  0% ` Bruce Richardson
  0 siblings, 1 reply; 200+ results
From: Tetsuya Mukawa @ 2015-02-18 11:02 UTC (permalink / raw)
  To: dev, bruce.richardson, thomas.monjalon; +Cc: nhroman

Currently uint8_t is used for port identifier. This patch changes it,
and use uint16_t as port identifier.
This patch only changes ethdev library. ABI of the library will be
kept even after applying it.

Also, this patch involves following fixes.
- Use "port_id" as variable name instead of "port".

Signed-off-by: Tetsuya Mukawa <mukawa@igel.co.jp>
---
 lib/librte_ether/rte_ethdev.c          |  212 +-
 lib/librte_ether/rte_ethdev_internal.h | 3672 ++++++++++++++++++++++++++++++++
 2 files changed, 3778 insertions(+), 106 deletions(-)
 create mode 100644 lib/librte_ether/rte_ethdev_internal.h

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index ea3a1fb..3568e4a 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -68,7 +68,7 @@
 #include <rte_string_fns.h>
 
 #include "rte_ether.h"
-#include "rte_ethdev.h"
+#include "rte_ethdev_internal.h"
 
 #ifdef RTE_LIBRTE_ETHDEV_DEBUG
 #define PMD_DEBUG_TRACE(fmt, args...) do {                        \
@@ -109,7 +109,7 @@
 static const char *MZ_RTE_ETH_DEV_DATA = "rte_eth_dev_data";
 struct rte_eth_dev rte_eth_devices[RTE_MAX_ETHPORTS];
 static struct rte_eth_dev_data *rte_eth_dev_data = NULL;
-static uint8_t nb_ports = 0;
+static uint16_t nb_ports = 0;
 
 /* spinlock for eth device callbacks */
 static rte_spinlock_t rte_eth_dev_cb_lock = RTE_SPINLOCK_INITIALIZER;
@@ -309,14 +309,14 @@ rte_eth_driver_register(struct eth_driver *eth_drv)
 }
 
 int
-rte_eth_dev_socket_id(uint8_t port_id)
+rte_eth_dev_socket_id(uint16_t port_id)
 {
 	if (port_id >= nb_ports)
 		return -1;
 	return rte_eth_devices[port_id].pci_dev->numa_node;
 }
 
-uint8_t
+uint16_t
 rte_eth_dev_count(void)
 {
 	return (nb_ports);
@@ -361,7 +361,7 @@ rte_eth_dev_rx_queue_config(struct rte_eth_dev *dev, uint16_t nb_queues)
 }
 
 int
-rte_eth_dev_rx_queue_start(uint8_t port_id, uint16_t rx_queue_id)
+rte_eth_dev_rx_queue_start(uint16_t port_id, uint16_t rx_queue_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -387,7 +387,7 @@ rte_eth_dev_rx_queue_start(uint8_t port_id, uint16_t rx_queue_id)
 }
 
 int
-rte_eth_dev_rx_queue_stop(uint8_t port_id, uint16_t rx_queue_id)
+rte_eth_dev_rx_queue_stop(uint16_t port_id, uint16_t rx_queue_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -413,7 +413,7 @@ rte_eth_dev_rx_queue_stop(uint8_t port_id, uint16_t rx_queue_id)
 }
 
 int
-rte_eth_dev_tx_queue_start(uint8_t port_id, uint16_t tx_queue_id)
+rte_eth_dev_tx_queue_start(uint16_t port_id, uint16_t tx_queue_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -439,7 +439,7 @@ rte_eth_dev_tx_queue_start(uint8_t port_id, uint16_t tx_queue_id)
 }
 
 int
-rte_eth_dev_tx_queue_stop(uint8_t port_id, uint16_t tx_queue_id)
+rte_eth_dev_tx_queue_stop(uint16_t port_id, uint16_t tx_queue_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -503,7 +503,7 @@ rte_eth_dev_tx_queue_config(struct rte_eth_dev *dev, uint16_t nb_queues)
 }
 
 static int
-rte_eth_dev_check_vf_rss_rxq_num(uint8_t port_id, uint16_t nb_rx_q)
+rte_eth_dev_check_vf_rss_rxq_num(uint16_t port_id, uint16_t nb_rx_q)
 {
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
 	switch (nb_rx_q) {
@@ -528,7 +528,7 @@ rte_eth_dev_check_vf_rss_rxq_num(uint8_t port_id, uint16_t nb_rx_q)
 }
 
 static int
-rte_eth_dev_check_mq_mode(uint8_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
+rte_eth_dev_check_mq_mode(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
 		      const struct rte_eth_conf *dev_conf)
 {
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
@@ -692,7 +692,7 @@ rte_eth_dev_check_mq_mode(uint8_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
 }
 
 int
-rte_eth_dev_configure(uint8_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
+rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
 		      const struct rte_eth_conf *dev_conf)
 {
 	struct rte_eth_dev *dev;
@@ -830,7 +830,7 @@ rte_eth_dev_configure(uint8_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
 }
 
 static void
-rte_eth_dev_config_restore(uint8_t port_id)
+rte_eth_dev_config_restore(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 	struct rte_eth_dev_info dev_info;
@@ -879,7 +879,7 @@ rte_eth_dev_config_restore(uint8_t port_id)
 }
 
 int
-rte_eth_dev_start(uint8_t port_id)
+rte_eth_dev_start(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 	int diag;
@@ -915,7 +915,7 @@ rte_eth_dev_start(uint8_t port_id)
 }
 
 void
-rte_eth_dev_stop(uint8_t port_id)
+rte_eth_dev_stop(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -943,7 +943,7 @@ rte_eth_dev_stop(uint8_t port_id)
 }
 
 int
-rte_eth_dev_set_link_up(uint8_t port_id)
+rte_eth_dev_set_link_up(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -962,7 +962,7 @@ rte_eth_dev_set_link_up(uint8_t port_id)
 }
 
 int
-rte_eth_dev_set_link_down(uint8_t port_id)
+rte_eth_dev_set_link_down(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -981,7 +981,7 @@ rte_eth_dev_set_link_down(uint8_t port_id)
 }
 
 void
-rte_eth_dev_close(uint8_t port_id)
+rte_eth_dev_close(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1002,7 +1002,7 @@ rte_eth_dev_close(uint8_t port_id)
 }
 
 int
-rte_eth_rx_queue_setup(uint8_t port_id, uint16_t rx_queue_id,
+rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
 		       uint16_t nb_rx_desc, unsigned int socket_id,
 		       const struct rte_eth_rxconf *rx_conf,
 		       struct rte_mempool *mp)
@@ -1079,7 +1079,7 @@ rte_eth_rx_queue_setup(uint8_t port_id, uint16_t rx_queue_id,
 }
 
 int
-rte_eth_tx_queue_setup(uint8_t port_id, uint16_t tx_queue_id,
+rte_eth_tx_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
 		       uint16_t nb_tx_desc, unsigned int socket_id,
 		       const struct rte_eth_txconf *tx_conf)
 {
@@ -1119,7 +1119,7 @@ rte_eth_tx_queue_setup(uint8_t port_id, uint16_t tx_queue_id,
 }
 
 void
-rte_eth_promiscuous_enable(uint8_t port_id)
+rte_eth_promiscuous_enable(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1135,7 +1135,7 @@ rte_eth_promiscuous_enable(uint8_t port_id)
 }
 
 void
-rte_eth_promiscuous_disable(uint8_t port_id)
+rte_eth_promiscuous_disable(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1151,7 +1151,7 @@ rte_eth_promiscuous_disable(uint8_t port_id)
 }
 
 int
-rte_eth_promiscuous_get(uint8_t port_id)
+rte_eth_promiscuous_get(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1165,7 +1165,7 @@ rte_eth_promiscuous_get(uint8_t port_id)
 }
 
 void
-rte_eth_allmulticast_enable(uint8_t port_id)
+rte_eth_allmulticast_enable(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1181,7 +1181,7 @@ rte_eth_allmulticast_enable(uint8_t port_id)
 }
 
 void
-rte_eth_allmulticast_disable(uint8_t port_id)
+rte_eth_allmulticast_disable(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1197,7 +1197,7 @@ rte_eth_allmulticast_disable(uint8_t port_id)
 }
 
 int
-rte_eth_allmulticast_get(uint8_t port_id)
+rte_eth_allmulticast_get(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1225,7 +1225,7 @@ rte_eth_dev_atomic_read_link_status(struct rte_eth_dev *dev,
 }
 
 void
-rte_eth_link_get(uint8_t port_id, struct rte_eth_link *eth_link)
+rte_eth_link_get(uint16_t port_id, struct rte_eth_link *eth_link)
 {
 	struct rte_eth_dev *dev;
 
@@ -1245,7 +1245,7 @@ rte_eth_link_get(uint8_t port_id, struct rte_eth_link *eth_link)
 }
 
 void
-rte_eth_link_get_nowait(uint8_t port_id, struct rte_eth_link *eth_link)
+rte_eth_link_get_nowait(uint16_t port_id, struct rte_eth_link *eth_link)
 {
 	struct rte_eth_dev *dev;
 
@@ -1265,7 +1265,7 @@ rte_eth_link_get_nowait(uint8_t port_id, struct rte_eth_link *eth_link)
 }
 
 void
-rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats)
+rte_eth_stats_get(uint16_t port_id, struct rte_eth_stats *stats)
 {
 	struct rte_eth_dev *dev;
 
@@ -1282,7 +1282,7 @@ rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats)
 }
 
 void
-rte_eth_stats_reset(uint8_t port_id)
+rte_eth_stats_reset(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1298,7 +1298,7 @@ rte_eth_stats_reset(uint8_t port_id)
 
 /* retrieve ethdev extended statistics */
 int
-rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstats *xstats,
+rte_eth_xstats_get(uint16_t port_id, struct rte_eth_xstats *xstats,
 	unsigned n)
 {
 	struct rte_eth_stats eth_stats;
@@ -1372,7 +1372,7 @@ rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstats *xstats,
 
 /* reset ethdev extended statistics */
 void
-rte_eth_xstats_reset(uint8_t port_id)
+rte_eth_xstats_reset(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -1393,7 +1393,7 @@ rte_eth_xstats_reset(uint8_t port_id)
 }
 
 static int
-set_queue_stats_mapping(uint8_t port_id, uint16_t queue_id, uint8_t stat_idx,
+set_queue_stats_mapping(uint16_t port_id, uint16_t queue_id, uint8_t stat_idx,
 		uint8_t is_rx)
 {
 	struct rte_eth_dev *dev;
@@ -1411,7 +1411,7 @@ set_queue_stats_mapping(uint8_t port_id, uint16_t queue_id, uint8_t stat_idx,
 
 
 int
-rte_eth_dev_set_tx_queue_stats_mapping(uint8_t port_id, uint16_t tx_queue_id,
+rte_eth_dev_set_tx_queue_stats_mapping(uint16_t port_id, uint16_t tx_queue_id,
 		uint8_t stat_idx)
 {
 	return set_queue_stats_mapping(port_id, tx_queue_id, stat_idx,
@@ -1420,7 +1420,7 @@ rte_eth_dev_set_tx_queue_stats_mapping(uint8_t port_id, uint16_t tx_queue_id,
 
 
 int
-rte_eth_dev_set_rx_queue_stats_mapping(uint8_t port_id, uint16_t rx_queue_id,
+rte_eth_dev_set_rx_queue_stats_mapping(uint16_t port_id, uint16_t rx_queue_id,
 		uint8_t stat_idx)
 {
 	return set_queue_stats_mapping(port_id, rx_queue_id, stat_idx,
@@ -1429,7 +1429,7 @@ rte_eth_dev_set_rx_queue_stats_mapping(uint8_t port_id, uint16_t rx_queue_id,
 
 
 void
-rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info)
+rte_eth_dev_info_get(uint16_t port_id, struct rte_eth_dev_info *dev_info)
 {
 	struct rte_eth_dev *dev;
 
@@ -1449,7 +1449,7 @@ rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info)
 }
 
 void
-rte_eth_macaddr_get(uint8_t port_id, struct ether_addr *mac_addr)
+rte_eth_macaddr_get(uint16_t port_id, struct ether_addr *mac_addr)
 {
 	struct rte_eth_dev *dev;
 
@@ -1463,7 +1463,7 @@ rte_eth_macaddr_get(uint8_t port_id, struct ether_addr *mac_addr)
 
 
 int
-rte_eth_dev_get_mtu(uint8_t port_id, uint16_t *mtu)
+rte_eth_dev_get_mtu(uint16_t port_id, uint16_t *mtu)
 {
 	struct rte_eth_dev *dev;
 
@@ -1478,7 +1478,7 @@ rte_eth_dev_get_mtu(uint8_t port_id, uint16_t *mtu)
 }
 
 int
-rte_eth_dev_set_mtu(uint8_t port_id, uint16_t mtu)
+rte_eth_dev_set_mtu(uint16_t port_id, uint16_t mtu)
 {
 	int ret;
 	struct rte_eth_dev *dev;
@@ -1499,7 +1499,7 @@ rte_eth_dev_set_mtu(uint8_t port_id, uint16_t mtu)
 }
 
 int
-rte_eth_dev_vlan_filter(uint8_t port_id, uint16_t vlan_id, int on)
+rte_eth_dev_vlan_filter(uint16_t port_id, uint16_t vlan_id, int on)
 {
 	struct rte_eth_dev *dev;
 
@@ -1524,7 +1524,7 @@ rte_eth_dev_vlan_filter(uint8_t port_id, uint16_t vlan_id, int on)
 }
 
 int
-rte_eth_dev_set_vlan_strip_on_queue(uint8_t port_id, uint16_t rx_queue_id, int on)
+rte_eth_dev_set_vlan_strip_on_queue(uint16_t port_id, uint16_t rx_queue_id, int on)
 {
 	struct rte_eth_dev *dev;
 
@@ -1546,7 +1546,7 @@ rte_eth_dev_set_vlan_strip_on_queue(uint8_t port_id, uint16_t rx_queue_id, int o
 }
 
 int
-rte_eth_dev_set_vlan_ether_type(uint8_t port_id, uint16_t tpid)
+rte_eth_dev_set_vlan_ether_type(uint16_t port_id, uint16_t tpid)
 {
 	struct rte_eth_dev *dev;
 
@@ -1563,7 +1563,7 @@ rte_eth_dev_set_vlan_ether_type(uint8_t port_id, uint16_t tpid)
 }
 
 int
-rte_eth_dev_set_vlan_offload(uint8_t port_id, int offload_mask)
+rte_eth_dev_set_vlan_offload(uint16_t port_id, int offload_mask)
 {
 	struct rte_eth_dev *dev;
 	int ret = 0;
@@ -1610,7 +1610,7 @@ rte_eth_dev_set_vlan_offload(uint8_t port_id, int offload_mask)
 }
 
 int
-rte_eth_dev_get_vlan_offload(uint8_t port_id)
+rte_eth_dev_get_vlan_offload(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 	int ret = 0;
@@ -1635,7 +1635,7 @@ rte_eth_dev_get_vlan_offload(uint8_t port_id)
 }
 
 int
-rte_eth_dev_set_vlan_pvid(uint8_t port_id, uint16_t pvid, int on)
+rte_eth_dev_set_vlan_pvid(uint16_t port_id, uint16_t pvid, int on)
 {
 	struct rte_eth_dev *dev;
 
@@ -1651,7 +1651,7 @@ rte_eth_dev_set_vlan_pvid(uint8_t port_id, uint16_t pvid, int on)
 }
 
 int
-rte_eth_dev_fdir_add_signature_filter(uint8_t port_id,
+rte_eth_dev_fdir_add_signature_filter(uint16_t port_id,
 				      struct rte_fdir_filter *fdir_filter,
 				      uint8_t queue)
 {
@@ -1685,7 +1685,7 @@ rte_eth_dev_fdir_add_signature_filter(uint8_t port_id,
 }
 
 int
-rte_eth_dev_fdir_update_signature_filter(uint8_t port_id,
+rte_eth_dev_fdir_update_signature_filter(uint16_t port_id,
 					 struct rte_fdir_filter *fdir_filter,
 					 uint8_t queue)
 {
@@ -1720,7 +1720,7 @@ rte_eth_dev_fdir_update_signature_filter(uint8_t port_id,
 }
 
 int
-rte_eth_dev_fdir_remove_signature_filter(uint8_t port_id,
+rte_eth_dev_fdir_remove_signature_filter(uint16_t port_id,
 					 struct rte_fdir_filter *fdir_filter)
 {
 	struct rte_eth_dev *dev;
@@ -1752,7 +1752,7 @@ rte_eth_dev_fdir_remove_signature_filter(uint8_t port_id,
 }
 
 int
-rte_eth_dev_fdir_get_infos(uint8_t port_id, struct rte_eth_fdir *fdir)
+rte_eth_dev_fdir_get_infos(uint16_t port_id, struct rte_eth_fdir *fdir)
 {
 	struct rte_eth_dev *dev;
 
@@ -1774,7 +1774,7 @@ rte_eth_dev_fdir_get_infos(uint8_t port_id, struct rte_eth_fdir *fdir)
 }
 
 int
-rte_eth_dev_fdir_add_perfect_filter(uint8_t port_id,
+rte_eth_dev_fdir_add_perfect_filter(uint16_t port_id,
 				    struct rte_fdir_filter *fdir_filter,
 				    uint16_t soft_id, uint8_t queue,
 				    uint8_t drop)
@@ -1814,7 +1814,7 @@ rte_eth_dev_fdir_add_perfect_filter(uint8_t port_id,
 }
 
 int
-rte_eth_dev_fdir_update_perfect_filter(uint8_t port_id,
+rte_eth_dev_fdir_update_perfect_filter(uint16_t port_id,
 				       struct rte_fdir_filter *fdir_filter,
 				       uint16_t soft_id, uint8_t queue,
 				       uint8_t drop)
@@ -1853,7 +1853,7 @@ rte_eth_dev_fdir_update_perfect_filter(uint8_t port_id,
 }
 
 int
-rte_eth_dev_fdir_remove_perfect_filter(uint8_t port_id,
+rte_eth_dev_fdir_remove_perfect_filter(uint16_t port_id,
 				       struct rte_fdir_filter *fdir_filter,
 				       uint16_t soft_id)
 {
@@ -1891,7 +1891,7 @@ rte_eth_dev_fdir_remove_perfect_filter(uint8_t port_id,
 }
 
 int
-rte_eth_dev_fdir_set_masks(uint8_t port_id, struct rte_fdir_masks *fdir_mask)
+rte_eth_dev_fdir_set_masks(uint16_t port_id, struct rte_fdir_masks *fdir_mask)
 {
 	struct rte_eth_dev *dev;
 
@@ -1911,7 +1911,7 @@ rte_eth_dev_fdir_set_masks(uint8_t port_id, struct rte_fdir_masks *fdir_mask)
 }
 
 int
-rte_eth_dev_flow_ctrl_get(uint8_t port_id, struct rte_eth_fc_conf *fc_conf)
+rte_eth_dev_flow_ctrl_get(uint16_t port_id, struct rte_eth_fc_conf *fc_conf)
 {
 	struct rte_eth_dev *dev;
 
@@ -1927,7 +1927,7 @@ rte_eth_dev_flow_ctrl_get(uint8_t port_id, struct rte_eth_fc_conf *fc_conf)
 }
 
 int
-rte_eth_dev_flow_ctrl_set(uint8_t port_id, struct rte_eth_fc_conf *fc_conf)
+rte_eth_dev_flow_ctrl_set(uint16_t port_id, struct rte_eth_fc_conf *fc_conf)
 {
 	struct rte_eth_dev *dev;
 
@@ -1947,7 +1947,7 @@ rte_eth_dev_flow_ctrl_set(uint8_t port_id, struct rte_eth_fc_conf *fc_conf)
 }
 
 int
-rte_eth_dev_priority_flow_ctrl_set(uint8_t port_id, struct rte_eth_pfc_conf *pfc_conf)
+rte_eth_dev_priority_flow_ctrl_set(uint16_t port_id, struct rte_eth_pfc_conf *pfc_conf)
 {
 	struct rte_eth_dev *dev;
 
@@ -2023,7 +2023,7 @@ rte_eth_check_reta_entry(struct rte_eth_rss_reta_entry64 *reta_conf,
 }
 
 int
-rte_eth_dev_rss_reta_update(uint8_t port_id,
+rte_eth_dev_rss_reta_update(uint16_t port_id,
 			    struct rte_eth_rss_reta_entry64 *reta_conf,
 			    uint16_t reta_size)
 {
@@ -2053,7 +2053,7 @@ rte_eth_dev_rss_reta_update(uint8_t port_id,
 }
 
 int
-rte_eth_dev_rss_reta_query(uint8_t port_id,
+rte_eth_dev_rss_reta_query(uint16_t port_id,
 			   struct rte_eth_rss_reta_entry64 *reta_conf,
 			   uint16_t reta_size)
 {
@@ -2076,7 +2076,7 @@ rte_eth_dev_rss_reta_query(uint8_t port_id,
 }
 
 int
-rte_eth_dev_rss_hash_update(uint8_t port_id, struct rte_eth_rss_conf *rss_conf)
+rte_eth_dev_rss_hash_update(uint16_t port_id, struct rte_eth_rss_conf *rss_conf)
 {
 	struct rte_eth_dev *dev;
 	uint16_t rss_hash_protos;
@@ -2098,7 +2098,7 @@ rte_eth_dev_rss_hash_update(uint8_t port_id, struct rte_eth_rss_conf *rss_conf)
 }
 
 int
-rte_eth_dev_rss_hash_conf_get(uint8_t port_id,
+rte_eth_dev_rss_hash_conf_get(uint16_t port_id,
 			      struct rte_eth_rss_conf *rss_conf)
 {
 	struct rte_eth_dev *dev;
@@ -2113,7 +2113,7 @@ rte_eth_dev_rss_hash_conf_get(uint8_t port_id,
 }
 
 int
-rte_eth_dev_udp_tunnel_add(uint8_t port_id,
+rte_eth_dev_udp_tunnel_add(uint16_t port_id,
 			   struct rte_eth_udp_tunnel *udp_tunnel)
 {
 	struct rte_eth_dev *dev;
@@ -2139,7 +2139,7 @@ rte_eth_dev_udp_tunnel_add(uint8_t port_id,
 }
 
 int
-rte_eth_dev_udp_tunnel_delete(uint8_t port_id,
+rte_eth_dev_udp_tunnel_delete(uint16_t port_id,
 			      struct rte_eth_udp_tunnel *udp_tunnel)
 {
 	struct rte_eth_dev *dev;
@@ -2165,7 +2165,7 @@ rte_eth_dev_udp_tunnel_delete(uint8_t port_id,
 }
 
 int
-rte_eth_led_on(uint8_t port_id)
+rte_eth_led_on(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -2180,7 +2180,7 @@ rte_eth_led_on(uint8_t port_id)
 }
 
 int
-rte_eth_led_off(uint8_t port_id)
+rte_eth_led_off(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -2199,7 +2199,7 @@ rte_eth_led_off(uint8_t port_id)
  * an empty spot.
  */
 static inline int
-get_mac_addr_index(uint8_t port_id, struct ether_addr *addr)
+get_mac_addr_index(uint16_t port_id, struct ether_addr *addr)
 {
 	struct rte_eth_dev_info dev_info;
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
@@ -2217,7 +2217,7 @@ get_mac_addr_index(uint8_t port_id, struct ether_addr *addr)
 static struct ether_addr null_mac_addr = {{0, 0, 0, 0, 0, 0}};
 
 int
-rte_eth_dev_mac_addr_add(uint8_t port_id, struct ether_addr *addr,
+rte_eth_dev_mac_addr_add(uint16_t port_id, struct ether_addr *addr,
 			uint32_t pool)
 {
 	struct rte_eth_dev *dev;
@@ -2270,7 +2270,7 @@ rte_eth_dev_mac_addr_add(uint8_t port_id, struct ether_addr *addr,
 }
 
 int
-rte_eth_dev_mac_addr_remove(uint8_t port_id, struct ether_addr *addr)
+rte_eth_dev_mac_addr_remove(uint16_t port_id, struct ether_addr *addr)
 {
 	struct rte_eth_dev *dev;
 	int index;
@@ -2302,7 +2302,7 @@ rte_eth_dev_mac_addr_remove(uint8_t port_id, struct ether_addr *addr)
 }
 
 int
-rte_eth_dev_set_vf_rxmode(uint8_t port_id,  uint16_t vf,
+rte_eth_dev_set_vf_rxmode(uint16_t port_id,  uint16_t vf,
 				uint16_t rx_mode, uint8_t on)
 {
 	uint16_t num_vfs;
@@ -2338,7 +2338,7 @@ rte_eth_dev_set_vf_rxmode(uint8_t port_id,  uint16_t vf,
  * an empty spot.
  */
 static inline int
-get_hash_mac_addr_index(uint8_t port_id, struct ether_addr *addr)
+get_hash_mac_addr_index(uint16_t port_id, struct ether_addr *addr)
 {
 	struct rte_eth_dev_info dev_info;
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
@@ -2357,7 +2357,7 @@ get_hash_mac_addr_index(uint8_t port_id, struct ether_addr *addr)
 }
 
 int
-rte_eth_dev_uc_hash_table_set(uint8_t port_id, struct ether_addr *addr,
+rte_eth_dev_uc_hash_table_set(uint16_t port_id, struct ether_addr *addr,
 				uint8_t on)
 {
 	int index;
@@ -2413,7 +2413,7 @@ rte_eth_dev_uc_hash_table_set(uint8_t port_id, struct ether_addr *addr,
 }
 
 int
-rte_eth_dev_uc_all_hash_table_set(uint8_t port_id, uint8_t on)
+rte_eth_dev_uc_all_hash_table_set(uint16_t port_id, uint8_t on)
 {
 	struct rte_eth_dev *dev;
 
@@ -2430,7 +2430,7 @@ rte_eth_dev_uc_all_hash_table_set(uint8_t port_id, uint8_t on)
 }
 
 int
-rte_eth_dev_set_vf_rx(uint8_t port_id,uint16_t vf, uint8_t on)
+rte_eth_dev_set_vf_rx(uint16_t port_id,uint16_t vf, uint8_t on)
 {
 	uint16_t num_vfs;
 	struct rte_eth_dev *dev;
@@ -2456,7 +2456,7 @@ rte_eth_dev_set_vf_rx(uint8_t port_id,uint16_t vf, uint8_t on)
 }
 
 int
-rte_eth_dev_set_vf_tx(uint8_t port_id,uint16_t vf, uint8_t on)
+rte_eth_dev_set_vf_tx(uint16_t port_id,uint16_t vf, uint8_t on)
 {
 	uint16_t num_vfs;
 	struct rte_eth_dev *dev;
@@ -2482,7 +2482,7 @@ rte_eth_dev_set_vf_tx(uint8_t port_id,uint16_t vf, uint8_t on)
 }
 
 int
-rte_eth_dev_set_vf_vlan_filter(uint8_t port_id, uint16_t vlan_id,
+rte_eth_dev_set_vf_vlan_filter(uint16_t port_id, uint16_t vlan_id,
 				 uint64_t vf_mask,uint8_t vlan_on)
 {
 	struct rte_eth_dev *dev;
@@ -2511,7 +2511,7 @@ rte_eth_dev_set_vf_vlan_filter(uint8_t port_id, uint16_t vlan_id,
 						vf_mask,vlan_on);
 }
 
-int rte_eth_set_queue_rate_limit(uint8_t port_id, uint16_t queue_idx,
+int rte_eth_set_queue_rate_limit(uint16_t port_id, uint16_t queue_idx,
 					uint16_t tx_rate)
 {
 	struct rte_eth_dev *dev;
@@ -2545,7 +2545,7 @@ int rte_eth_set_queue_rate_limit(uint8_t port_id, uint16_t queue_idx,
 	return (*dev->dev_ops->set_queue_rate_limit)(dev, queue_idx, tx_rate);
 }
 
-int rte_eth_set_vf_rate_limit(uint8_t port_id, uint16_t vf, uint16_t tx_rate,
+int rte_eth_set_vf_rate_limit(uint16_t port_id, uint16_t vf, uint16_t tx_rate,
 				uint64_t q_msk)
 {
 	struct rte_eth_dev *dev;
@@ -2583,7 +2583,7 @@ int rte_eth_set_vf_rate_limit(uint8_t port_id, uint16_t vf, uint16_t tx_rate,
 }
 
 int
-rte_eth_mirror_rule_set(uint8_t port_id,
+rte_eth_mirror_rule_set(uint16_t port_id,
 			struct rte_eth_vmdq_mirror_conf *mirror_conf,
 			uint8_t rule_id, uint8_t on)
 {
@@ -2626,7 +2626,7 @@ rte_eth_mirror_rule_set(uint8_t port_id,
 }
 
 int
-rte_eth_mirror_rule_reset(uint8_t port_id, uint8_t rule_id)
+rte_eth_mirror_rule_reset(uint16_t port_id, uint8_t rule_id)
 {
 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
 
@@ -2650,7 +2650,7 @@ rte_eth_mirror_rule_reset(uint8_t port_id, uint8_t rule_id)
 
 #ifdef RTE_LIBRTE_ETHDEV_DEBUG
 uint16_t
-rte_eth_rx_burst(uint8_t port_id, uint16_t queue_id,
+rte_eth_rx_burst(uint16_t port_id, uint16_t queue_id,
 		 struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 {
 	struct rte_eth_dev *dev;
@@ -2670,7 +2670,7 @@ rte_eth_rx_burst(uint8_t port_id, uint16_t queue_id,
 }
 
 uint16_t
-rte_eth_tx_burst(uint8_t port_id, uint16_t queue_id,
+rte_eth_tx_burst(uint16_t port_id, uint16_t queue_id,
 		 struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
 {
 	struct rte_eth_dev *dev;
@@ -2691,7 +2691,7 @@ rte_eth_tx_burst(uint8_t port_id, uint16_t queue_id,
 }
 
 uint32_t
-rte_eth_rx_queue_count(uint8_t port_id, uint16_t queue_id)
+rte_eth_rx_queue_count(uint16_t port_id, uint16_t queue_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -2705,7 +2705,7 @@ rte_eth_rx_queue_count(uint8_t port_id, uint16_t queue_id)
 }
 
 int
-rte_eth_rx_descriptor_done(uint8_t port_id, uint16_t queue_id, uint16_t offset)
+rte_eth_rx_descriptor_done(uint16_t port_id, uint16_t queue_id, uint16_t offset)
 {
 	struct rte_eth_dev *dev;
 
@@ -2721,7 +2721,7 @@ rte_eth_rx_descriptor_done(uint8_t port_id, uint16_t queue_id, uint16_t offset)
 #endif
 
 int
-rte_eth_dev_callback_register(uint8_t port_id,
+rte_eth_dev_callback_register(uint16_t port_id,
 			enum rte_eth_event_type event,
 			rte_eth_dev_cb_fn cb_fn, void *cb_arg)
 {
@@ -2760,7 +2760,7 @@ rte_eth_dev_callback_register(uint8_t port_id,
 }
 
 int
-rte_eth_dev_callback_unregister(uint8_t port_id,
+rte_eth_dev_callback_unregister(uint16_t port_id,
 			enum rte_eth_event_type event,
 			rte_eth_dev_cb_fn cb_fn, void *cb_arg)
 {
@@ -2826,7 +2826,7 @@ _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
 	rte_spinlock_unlock(&rte_eth_dev_cb_lock);
 }
 #ifdef RTE_NIC_BYPASS
-int rte_eth_dev_bypass_init(uint8_t port_id)
+int rte_eth_dev_bypass_init(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -2846,7 +2846,7 @@ int rte_eth_dev_bypass_init(uint8_t port_id)
 }
 
 int
-rte_eth_dev_bypass_state_show(uint8_t port_id, uint32_t *state)
+rte_eth_dev_bypass_state_show(uint16_t port_id, uint32_t *state)
 {
 	struct rte_eth_dev *dev;
 
@@ -2865,7 +2865,7 @@ rte_eth_dev_bypass_state_show(uint8_t port_id, uint32_t *state)
 }
 
 int
-rte_eth_dev_bypass_state_set(uint8_t port_id, uint32_t *new_state)
+rte_eth_dev_bypass_state_set(uint16_t port_id, uint32_t *new_state)
 {
 	struct rte_eth_dev *dev;
 
@@ -2885,7 +2885,7 @@ rte_eth_dev_bypass_state_set(uint8_t port_id, uint32_t *new_state)
 }
 
 int
-rte_eth_dev_bypass_event_show(uint8_t port_id, uint32_t event, uint32_t *state)
+rte_eth_dev_bypass_event_show(uint16_t port_id, uint32_t event, uint32_t *state)
 {
 	struct rte_eth_dev *dev;
 
@@ -2905,7 +2905,7 @@ rte_eth_dev_bypass_event_show(uint8_t port_id, uint32_t event, uint32_t *state)
 }
 
 int
-rte_eth_dev_bypass_event_store(uint8_t port_id, uint32_t event, uint32_t state)
+rte_eth_dev_bypass_event_store(uint16_t port_id, uint32_t event, uint32_t state)
 {
 	struct rte_eth_dev *dev;
 
@@ -2925,7 +2925,7 @@ rte_eth_dev_bypass_event_store(uint8_t port_id, uint32_t event, uint32_t state)
 }
 
 int
-rte_eth_dev_wd_timeout_store(uint8_t port_id, uint32_t timeout)
+rte_eth_dev_wd_timeout_store(uint16_t port_id, uint32_t timeout)
 {
 	struct rte_eth_dev *dev;
 
@@ -2945,7 +2945,7 @@ rte_eth_dev_wd_timeout_store(uint8_t port_id, uint32_t timeout)
 }
 
 int
-rte_eth_dev_bypass_ver_show(uint8_t port_id, uint32_t *ver)
+rte_eth_dev_bypass_ver_show(uint16_t port_id, uint32_t *ver)
 {
 	struct rte_eth_dev *dev;
 
@@ -2965,7 +2965,7 @@ rte_eth_dev_bypass_ver_show(uint8_t port_id, uint32_t *ver)
 }
 
 int
-rte_eth_dev_bypass_wd_timeout_show(uint8_t port_id, uint32_t *wd_timeout)
+rte_eth_dev_bypass_wd_timeout_show(uint16_t port_id, uint32_t *wd_timeout)
 {
 	struct rte_eth_dev *dev;
 
@@ -2985,7 +2985,7 @@ rte_eth_dev_bypass_wd_timeout_show(uint8_t port_id, uint32_t *wd_timeout)
 }
 
 int
-rte_eth_dev_bypass_wd_reset(uint8_t port_id)
+rte_eth_dev_bypass_wd_reset(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -3006,7 +3006,7 @@ rte_eth_dev_bypass_wd_reset(uint8_t port_id)
 #endif
 
 int
-rte_eth_dev_add_syn_filter(uint8_t port_id,
+rte_eth_dev_add_syn_filter(uint16_t port_id,
 			struct rte_syn_filter *filter, uint16_t rx_queue)
 {
 	struct rte_eth_dev *dev;
@@ -3022,7 +3022,7 @@ rte_eth_dev_add_syn_filter(uint8_t port_id,
 }
 
 int
-rte_eth_dev_remove_syn_filter(uint8_t port_id)
+rte_eth_dev_remove_syn_filter(uint16_t port_id)
 {
 	struct rte_eth_dev *dev;
 
@@ -3037,7 +3037,7 @@ rte_eth_dev_remove_syn_filter(uint8_t port_id)
 }
 
 int
-rte_eth_dev_get_syn_filter(uint8_t port_id,
+rte_eth_dev_get_syn_filter(uint16_t port_id,
 			struct rte_syn_filter *filter, uint16_t *rx_queue)
 {
 	struct rte_eth_dev *dev;
@@ -3056,7 +3056,7 @@ rte_eth_dev_get_syn_filter(uint8_t port_id,
 }
 
 int
-rte_eth_dev_add_2tuple_filter(uint8_t port_id, uint16_t index,
+rte_eth_dev_add_2tuple_filter(uint16_t port_id, uint16_t index,
 			struct rte_2tuple_filter *filter, uint16_t rx_queue)
 {
 	struct rte_eth_dev *dev;
@@ -3079,7 +3079,7 @@ rte_eth_dev_add_2tuple_filter(uint8_t port_id, uint16_t index,
 }
 
 int
-rte_eth_dev_remove_2tuple_filter(uint8_t port_id, uint16_t index)
+rte_eth_dev_remove_2tuple_filter(uint16_t port_id, uint16_t index)
 {
 	struct rte_eth_dev *dev;
 
@@ -3094,7 +3094,7 @@ rte_eth_dev_remove_2tuple_filter(uint8_t port_id, uint16_t index)
 }
 
 int
-rte_eth_dev_get_2tuple_filter(uint8_t port_id, uint16_t index,
+rte_eth_dev_get_2tuple_filter(uint16_t port_id, uint16_t index,
 			struct rte_2tuple_filter *filter, uint16_t *rx_queue)
 {
 	struct rte_eth_dev *dev;
@@ -3113,7 +3113,7 @@ rte_eth_dev_get_2tuple_filter(uint8_t port_id, uint16_t index,
 }
 
 int
-rte_eth_dev_add_5tuple_filter(uint8_t port_id, uint16_t index,
+rte_eth_dev_add_5tuple_filter(uint16_t port_id, uint16_t index,
 			struct rte_5tuple_filter *filter, uint16_t rx_queue)
 {
 	struct rte_eth_dev *dev;
@@ -3137,7 +3137,7 @@ rte_eth_dev_add_5tuple_filter(uint8_t port_id, uint16_t index,
 }
 
 int
-rte_eth_dev_remove_5tuple_filter(uint8_t port_id, uint16_t index)
+rte_eth_dev_remove_5tuple_filter(uint16_t port_id, uint16_t index)
 {
 	struct rte_eth_dev *dev;
 
@@ -3152,7 +3152,7 @@ rte_eth_dev_remove_5tuple_filter(uint8_t port_id, uint16_t index)
 }
 
 int
-rte_eth_dev_get_5tuple_filter(uint8_t port_id, uint16_t index,
+rte_eth_dev_get_5tuple_filter(uint16_t port_id, uint16_t index,
 			struct rte_5tuple_filter *filter, uint16_t *rx_queue)
 {
 	struct rte_eth_dev *dev;
@@ -3172,7 +3172,7 @@ rte_eth_dev_get_5tuple_filter(uint8_t port_id, uint16_t index,
 }
 
 int
-rte_eth_dev_add_flex_filter(uint8_t port_id, uint16_t index,
+rte_eth_dev_add_flex_filter(uint16_t port_id, uint16_t index,
 			struct rte_flex_filter *filter, uint16_t rx_queue)
 {
 	struct rte_eth_dev *dev;
@@ -3188,7 +3188,7 @@ rte_eth_dev_add_flex_filter(uint8_t port_id, uint16_t index,
 }
 
 int
-rte_eth_dev_remove_flex_filter(uint8_t port_id, uint16_t index)
+rte_eth_dev_remove_flex_filter(uint16_t port_id, uint16_t index)
 {
 	struct rte_eth_dev *dev;
 
@@ -3203,7 +3203,7 @@ rte_eth_dev_remove_flex_filter(uint8_t port_id, uint16_t index)
 }
 
 int
-rte_eth_dev_get_flex_filter(uint8_t port_id, uint16_t index,
+rte_eth_dev_get_flex_filter(uint16_t port_id, uint16_t index,
 			struct rte_flex_filter *filter, uint16_t *rx_queue)
 {
 	struct rte_eth_dev *dev;
@@ -3223,7 +3223,7 @@ rte_eth_dev_get_flex_filter(uint8_t port_id, uint16_t index,
 }
 
 int
-rte_eth_dev_filter_supported(uint8_t port_id, enum rte_filter_type filter_type)
+rte_eth_dev_filter_supported(uint16_t port_id, enum rte_filter_type filter_type)
 {
 	struct rte_eth_dev *dev;
 
@@ -3239,7 +3239,7 @@ rte_eth_dev_filter_supported(uint8_t port_id, enum rte_filter_type filter_type)
 }
 
 int
-rte_eth_dev_filter_ctrl(uint8_t port_id, enum rte_filter_type filter_type,
+rte_eth_dev_filter_ctrl(uint16_t port_id, enum rte_filter_type filter_type,
 		       enum rte_filter_op filter_op, void *arg)
 {
 	struct rte_eth_dev *dev;
diff --git a/lib/librte_ether/rte_ethdev_internal.h b/lib/librte_ether/rte_ethdev_internal.h
new file mode 100644
index 0000000..06068ad
--- /dev/null
+++ b/lib/librte_ether/rte_ethdev_internal.h
@@ -0,0 +1,3672 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _RTE_ETHDEV_H_
+#define _RTE_ETHDEV_H_
+
+/**
+ * @file
+ *
+ * RTE Ethernet Device API
+ *
+ * The Ethernet Device API is composed of two parts:
+ *
+ * - The application-oriented Ethernet API that includes functions to setup
+ *   an Ethernet device (configure it, setup its RX and TX queues and start it),
+ *   to get its MAC address, the speed and the status of its physical link,
+ *   to receive and to transmit packets, and so on.
+ *
+ * - The driver-oriented Ethernet API that exports a function allowing
+ *   an Ethernet Poll Mode Driver (PMD) to simultaneously register itself as
+ *   an Ethernet device driver and as a PCI driver for a set of matching PCI
+ *   [Ethernet] devices classes.
+ *
+ * By default, all the functions of the Ethernet Device API exported by a PMD
+ * are lock-free functions which assume to not be invoked in parallel on
+ * different logical cores to work on the same target object.  For instance,
+ * the receive function of a PMD cannot be invoked in parallel on two logical
+ * cores to poll the same RX queue [of the same port]. Of course, this function
+ * can be invoked in parallel by different logical cores on different RX queues.
+ * It is the responsibility of the upper level application to enforce this rule.
+ *
+ * If needed, parallel accesses by multiple logical cores to shared queues
+ * shall be explicitly protected by dedicated inline lock-aware functions
+ * built on top of their corresponding lock-free functions of the PMD API.
+ *
+ * In all functions of the Ethernet API, the Ethernet device is
+ * designated by an integer >= 0 named the device port identifier.
+ *
+ * At the Ethernet driver level, Ethernet devices are represented by a generic
+ * data structure of type *rte_eth_dev*.
+ *
+ * Ethernet devices are dynamically registered during the PCI probing phase
+ * performed at EAL initialization time.
+ * When an Ethernet device is being probed, an *rte_eth_dev* structure and
+ * a new port identifier are allocated for that device. Then, the eth_dev_init()
+ * function supplied by the Ethernet driver matching the probed PCI
+ * device is invoked to properly initialize the device.
+ *
+ * The role of the device init function consists of resetting the hardware,
+ * checking access to Non-volatile Memory (NVM), reading the MAC address
+ * from NVM etc.
+ *
+ * If the device init operation is successful, the correspondence between
+ * the port identifier assigned to the new device and its associated
+ * *rte_eth_dev* structure is effectively registered.
+ * Otherwise, both the *rte_eth_dev* structure and the port identifier are
+ * freed.
+ *
+ * The functions exported by the application Ethernet API to setup a device
+ * designated by its port identifier must be invoked in the following order:
+ *     - rte_eth_dev_configure()
+ *     - rte_eth_tx_queue_setup()
+ *     - rte_eth_rx_queue_setup()
+ *     - rte_eth_dev_start()
+ *
+ * Then, the network application can invoke, in any order, the functions
+ * exported by the Ethernet API to get the MAC address of a given device, to
+ * get the speed and the status of a device physical link, to receive/transmit
+ * [burst of] packets, and so on.
+ *
+ * If the application wants to change the configuration (i.e. call
+ * rte_eth_dev_configure(), rte_eth_tx_queue_setup(), or
+ * rte_eth_rx_queue_setup()), it must call rte_eth_dev_stop() first to stop the
+ * device and then do the reconfiguration before calling rte_eth_dev_start()
+ * again. The tramsit and receive functions should not be invoked when the
+ * device is stopped.
+ *
+ * Please note that some configuration is not stored between calls to
+ * rte_eth_dev_stop()/rte_eth_dev_start(). The following configuration will
+ * be retained:
+ *
+ *     - flow control settings
+ *     - receive mode configuration (promiscuous mode, hardware checksum mode,
+ *       RSS/VMDQ settings etc.)
+ *     - VLAN filtering configuration
+ *     - MAC addresses supplied to MAC address array
+ *     - flow director filtering mode (but not filtering rules)
+ *     - NIC queue statistics mappings
+ *
+ * Any other configuration will not be stored and will need to be re-entered
+ * after a call to rte_eth_dev_start().
+ *
+ * Finally, a network application can close an Ethernet device by invoking the
+ * rte_eth_dev_close() function.
+ *
+ * Each function of the application Ethernet API invokes a specific function
+ * of the PMD that controls the target device designated by its port
+ * identifier.
+ * For this purpose, all device-specific functions of an Ethernet driver are
+ * supplied through a set of pointers contained in a generic structure of type
+ * *eth_dev_ops*.
+ * The address of the *eth_dev_ops* structure is stored in the *rte_eth_dev*
+ * structure by the device init function of the Ethernet driver, which is
+ * invoked during the PCI probing phase, as explained earlier.
+ *
+ * In other words, each function of the Ethernet API simply retrieves the
+ * *rte_eth_dev* structure associated with the device port identifier and
+ * performs an indirect invocation of the corresponding driver function
+ * supplied in the *eth_dev_ops* structure of the *rte_eth_dev* structure.
+ *
+ * For performance reasons, the address of the burst-oriented RX and TX
+ * functions of the Ethernet driver are not contained in the *eth_dev_ops*
+ * structure. Instead, they are directly stored at the beginning of the
+ * *rte_eth_dev* structure to avoid an extra indirect memory access during
+ * their invocation.
+ *
+ * RTE ethernet device drivers do not use interrupts for transmitting or
+ * receiving. Instead, Ethernet drivers export Poll-Mode receive and transmit
+ * functions to applications.
+ * Both receive and transmit functions are packet-burst oriented to minimize
+ * their cost per packet through the following optimizations:
+ *
+ * - Sharing among multiple packets the incompressible cost of the
+ *   invocation of receive/transmit functions.
+ *
+ * - Enabling receive/transmit functions to take advantage of burst-oriented
+ *   hardware features (L1 cache, prefetch instructions, NIC head/tail
+ *   registers) to minimize the number of CPU cycles per packet, for instance,
+ *   by avoiding useless read memory accesses to ring descriptors, or by
+ *   systematically using arrays of pointers that exactly fit L1 cache line
+ *   boundaries and sizes.
+ *
+ * The burst-oriented receive function does not provide any error notification,
+ * to avoid the corresponding overhead. As a hint, the upper-level application
+ * might check the status of the device link once being systematically returned
+ * a 0 value by the receive function of the driver for a given number of tries.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+
+#include <rte_log.h>
+#include <rte_interrupts.h>
+#include <rte_pci.h>
+#include <rte_mbuf.h>
+#include "rte_ether.h"
+#include "rte_eth_ctrl.h"
+
+/**
+ * A structure used to retrieve statistics for an Ethernet port.
+ */
+struct rte_eth_stats {
+	uint64_t ipackets;  /**< Total number of successfully received packets. */
+	uint64_t opackets;  /**< Total number of successfully transmitted packets.*/
+	uint64_t ibytes;    /**< Total number of successfully received bytes. */
+	uint64_t obytes;    /**< Total number of successfully transmitted bytes. */
+	uint64_t imissed;   /**< Total of RX missed packets (e.g full FIFO). */
+	uint64_t ibadcrc;   /**< Total of RX packets with CRC error. */
+	uint64_t ibadlen;   /**< Total of RX packets with bad length. */
+	uint64_t ierrors;   /**< Total number of erroneous received packets. */
+	uint64_t oerrors;   /**< Total number of failed transmitted packets. */
+	uint64_t imcasts;   /**< Total number of multicast received packets. */
+	uint64_t rx_nombuf; /**< Total number of RX mbuf allocation failures. */
+	uint64_t fdirmatch; /**< Total number of RX packets matching a filter. */
+	uint64_t fdirmiss;  /**< Total number of RX packets not matching any filter. */
+	uint64_t tx_pause_xon;  /**< Total nb. of XON pause frame sent. */
+	uint64_t rx_pause_xon;  /**< Total nb. of XON pause frame received. */
+	uint64_t tx_pause_xoff; /**< Total nb. of XOFF pause frame sent. */
+	uint64_t rx_pause_xoff; /**< Total nb. of XOFF pause frame received. */
+	uint64_t q_ipackets[RTE_ETHDEV_QUEUE_STAT_CNTRS];
+	/**< Total number of queue RX packets. */
+	uint64_t q_opackets[RTE_ETHDEV_QUEUE_STAT_CNTRS];
+	/**< Total number of queue TX packets. */
+	uint64_t q_ibytes[RTE_ETHDEV_QUEUE_STAT_CNTRS];
+	/**< Total number of successfully received queue bytes. */
+	uint64_t q_obytes[RTE_ETHDEV_QUEUE_STAT_CNTRS];
+	/**< Total number of successfully transmitted queue bytes. */
+	uint64_t q_errors[RTE_ETHDEV_QUEUE_STAT_CNTRS];
+	/**< Total number of queue packets received that are dropped. */
+	uint64_t ilbpackets;
+	/**< Total number of good packets received from loopback,VF Only */
+	uint64_t olbpackets;
+	/**< Total number of good packets transmitted to loopback,VF Only */
+	uint64_t ilbbytes;
+	/**< Total number of good bytes received from loopback,VF Only */
+	uint64_t olbbytes;
+	/**< Total number of good bytes transmitted to loopback,VF Only */
+};
+
+/**
+ * A structure used to retrieve link-level information of an Ethernet port.
+ */
+struct rte_eth_link {
+	uint16_t link_speed;      /**< ETH_LINK_SPEED_[10, 100, 1000, 10000] */
+	uint16_t link_duplex;     /**< ETH_LINK_[HALF_DUPLEX, FULL_DUPLEX] */
+	uint8_t  link_status : 1; /**< 1 -> link up, 0 -> link down */
+}__attribute__((aligned(8)));     /**< aligned for atomic64 read/write */
+
+#define ETH_LINK_SPEED_AUTONEG  0       /**< Auto-negotiate link speed. */
+#define ETH_LINK_SPEED_10       10      /**< 10 megabits/second. */
+#define ETH_LINK_SPEED_100      100     /**< 100 megabits/second. */
+#define ETH_LINK_SPEED_1000     1000    /**< 1 gigabits/second. */
+#define ETH_LINK_SPEED_10000    10000   /**< 10 gigabits/second. */
+#define ETH_LINK_SPEED_10G      10000   /**< alias of 10 gigabits/second. */
+#define ETH_LINK_SPEED_20G      20000   /**< 20 gigabits/second. */
+#define ETH_LINK_SPEED_40G      40000   /**< 40 gigabits/second. */
+
+#define ETH_LINK_AUTONEG_DUPLEX 0       /**< Auto-negotiate duplex. */
+#define ETH_LINK_HALF_DUPLEX    1       /**< Half-duplex connection. */
+#define ETH_LINK_FULL_DUPLEX    2       /**< Full-duplex connection. */
+
+/**
+ * A structure used to configure the ring threshold registers of an RX/TX
+ * queue for an Ethernet port.
+ */
+struct rte_eth_thresh {
+	uint8_t pthresh; /**< Ring prefetch threshold. */
+	uint8_t hthresh; /**< Ring host threshold. */
+	uint8_t wthresh; /**< Ring writeback threshold. */
+};
+
+/**
+ *  Simple flags are used for rte_eth_conf.rxmode.mq_mode.
+ */
+#define ETH_MQ_RX_RSS_FLAG  0x1
+#define ETH_MQ_RX_DCB_FLAG  0x2
+#define ETH_MQ_RX_VMDQ_FLAG 0x4
+
+/**
+ *  A set of values to identify what method is to be used to route
+ *  packets to multiple queues.
+ */
+enum rte_eth_rx_mq_mode {
+	/** None of DCB,RSS or VMDQ mode */
+	ETH_MQ_RX_NONE = 0,
+
+	/** For RX side, only RSS is on */
+	ETH_MQ_RX_RSS = ETH_MQ_RX_RSS_FLAG,
+	/** For RX side,only DCB is on. */
+	ETH_MQ_RX_DCB = ETH_MQ_RX_DCB_FLAG,
+	/** Both DCB and RSS enable */
+	ETH_MQ_RX_DCB_RSS = ETH_MQ_RX_RSS_FLAG | ETH_MQ_RX_DCB_FLAG,
+
+	/** Only VMDQ, no RSS nor DCB */
+	ETH_MQ_RX_VMDQ_ONLY = ETH_MQ_RX_VMDQ_FLAG,
+	/** RSS mode with VMDQ */
+	ETH_MQ_RX_VMDQ_RSS = ETH_MQ_RX_RSS_FLAG | ETH_MQ_RX_VMDQ_FLAG,
+	/** Use VMDQ+DCB to route traffic to queues */
+	ETH_MQ_RX_VMDQ_DCB = ETH_MQ_RX_VMDQ_FLAG | ETH_MQ_RX_DCB_FLAG,
+	/** Enable both VMDQ and DCB in VMDq */
+	ETH_MQ_RX_VMDQ_DCB_RSS = ETH_MQ_RX_RSS_FLAG | ETH_MQ_RX_DCB_FLAG |
+				 ETH_MQ_RX_VMDQ_FLAG,
+};
+
+/**
+ * for rx mq mode backward compatible
+ */
+#define ETH_RSS                       ETH_MQ_RX_RSS
+#define VMDQ_DCB                      ETH_MQ_RX_VMDQ_DCB
+#define ETH_DCB_RX                    ETH_MQ_RX_DCB
+
+/**
+ * A set of values to identify what method is to be used to transmit
+ * packets using multi-TCs.
+ */
+enum rte_eth_tx_mq_mode {
+	ETH_MQ_TX_NONE    = 0,  /**< It is in neither DCB nor VT mode. */
+	ETH_MQ_TX_DCB,          /**< For TX side,only DCB is on. */
+	ETH_MQ_TX_VMDQ_DCB,	/**< For TX side,both DCB and VT is on. */
+	ETH_MQ_TX_VMDQ_ONLY,    /**< Only VT on, no DCB */
+};
+
+/**
+ * for tx mq mode backward compatible
+ */
+#define ETH_DCB_NONE                ETH_MQ_TX_NONE
+#define ETH_VMDQ_DCB_TX             ETH_MQ_TX_VMDQ_DCB
+#define ETH_DCB_TX                  ETH_MQ_TX_DCB
+
+/**
+ * A structure used to configure the RX features of an Ethernet port.
+ */
+struct rte_eth_rxmode {
+	/** The multi-queue packet distribution mode to be used, e.g. RSS. */
+	enum rte_eth_rx_mq_mode mq_mode;
+	uint32_t max_rx_pkt_len;  /**< Only used if jumbo_frame enabled. */
+	uint16_t split_hdr_size;  /**< hdr buf size (header_split enabled).*/
+	uint8_t header_split : 1, /**< Header Split enable. */
+		hw_ip_checksum   : 1, /**< IP/UDP/TCP checksum offload enable. */
+		hw_vlan_filter   : 1, /**< VLAN filter enable. */
+		hw_vlan_strip    : 1, /**< VLAN strip enable. */
+		hw_vlan_extend   : 1, /**< Extended VLAN enable. */
+		jumbo_frame      : 1, /**< Jumbo Frame Receipt enable. */
+		hw_strip_crc     : 1, /**< Enable CRC stripping by hardware. */
+		enable_scatter   : 1; /**< Enable scatter packets rx handler */
+};
+
+/**
+ * A structure used to configure the Receive Side Scaling (RSS) feature
+ * of an Ethernet port.
+ * If not NULL, the *rss_key* pointer of the *rss_conf* structure points
+ * to an array holding the RSS key to use for hashing specific header
+ * fields of received packets. The length of this array should be indicated
+ * by *rss_key_len* below. Otherwise, a default random hash key is used by
+ * the device driver.
+ *
+ * The *rss_key_len* field of the *rss_conf* structure indicates the length
+ * in bytes of the array pointed by *rss_key*. To be compatible, this length
+ * will be checked in i40e only. Others assume 40 bytes to be used as before.
+ *
+ * The *rss_hf* field of the *rss_conf* structure indicates the different
+ * types of IPv4/IPv6 packets to which the RSS hashing must be applied.
+ * Supplying an *rss_hf* equal to zero disables the RSS feature.
+ */
+struct rte_eth_rss_conf {
+	uint8_t *rss_key;    /**< If not NULL, 40-byte hash key. */
+	uint8_t rss_key_len; /**< hash key length in bytes. */
+	uint64_t rss_hf;     /**< Hash functions to apply - see below. */
+};
+
+/* Supported RSS offloads */
+/* for 1G & 10G */
+#define ETH_RSS_IPV4_SHIFT                    0
+#define ETH_RSS_IPV4_TCP_SHIFT                1
+#define ETH_RSS_IPV6_SHIFT                    2
+#define ETH_RSS_IPV6_EX_SHIFT                 3
+#define ETH_RSS_IPV6_TCP_SHIFT                4
+#define ETH_RSS_IPV6_TCP_EX_SHIFT             5
+#define ETH_RSS_IPV4_UDP_SHIFT                6
+#define ETH_RSS_IPV6_UDP_SHIFT                7
+#define ETH_RSS_IPV6_UDP_EX_SHIFT             8
+/* for 40G only */
+#define ETH_RSS_NONF_IPV4_UDP_SHIFT           31
+#define ETH_RSS_NONF_IPV4_TCP_SHIFT           33
+#define ETH_RSS_NONF_IPV4_SCTP_SHIFT          34
+#define ETH_RSS_NONF_IPV4_OTHER_SHIFT         35
+#define ETH_RSS_FRAG_IPV4_SHIFT               36
+#define ETH_RSS_NONF_IPV6_UDP_SHIFT           41
+#define ETH_RSS_NONF_IPV6_TCP_SHIFT           43
+#define ETH_RSS_NONF_IPV6_SCTP_SHIFT          44
+#define ETH_RSS_NONF_IPV6_OTHER_SHIFT         45
+#define ETH_RSS_FRAG_IPV6_SHIFT               46
+#define ETH_RSS_FCOE_OX_SHIFT                 48
+#define ETH_RSS_FCOE_RX_SHIFT                 49
+#define ETH_RSS_FCOE_OTHER_SHIFT              50
+#define ETH_RSS_L2_PAYLOAD_SHIFT              63
+
+/* for 1G & 10G */
+#define ETH_RSS_IPV4                    (1 << ETH_RSS_IPV4_SHIFT)
+#define ETH_RSS_IPV4_TCP                (1 << ETH_RSS_IPV4_TCP_SHIFT)
+#define ETH_RSS_IPV6                    (1 << ETH_RSS_IPV6_SHIFT)
+#define ETH_RSS_IPV6_EX                 (1 << ETH_RSS_IPV6_EX_SHIFT)
+#define ETH_RSS_IPV6_TCP                (1 << ETH_RSS_IPV6_TCP_SHIFT)
+#define ETH_RSS_IPV6_TCP_EX             (1 << ETH_RSS_IPV6_TCP_EX_SHIFT)
+#define ETH_RSS_IPV4_UDP                (1 << ETH_RSS_IPV4_UDP_SHIFT)
+#define ETH_RSS_IPV6_UDP                (1 << ETH_RSS_IPV6_UDP_SHIFT)
+#define ETH_RSS_IPV6_UDP_EX             (1 << ETH_RSS_IPV6_UDP_EX_SHIFT)
+/* for 40G only */
+#define ETH_RSS_NONF_IPV4_UDP           (1ULL << ETH_RSS_NONF_IPV4_UDP_SHIFT)
+#define ETH_RSS_NONF_IPV4_TCP           (1ULL << ETH_RSS_NONF_IPV4_TCP_SHIFT)
+#define ETH_RSS_NONF_IPV4_SCTP          (1ULL << ETH_RSS_NONF_IPV4_SCTP_SHIFT)
+#define ETH_RSS_NONF_IPV4_OTHER         (1ULL << ETH_RSS_NONF_IPV4_OTHER_SHIFT)
+#define ETH_RSS_FRAG_IPV4               (1ULL << ETH_RSS_FRAG_IPV4_SHIFT)
+#define ETH_RSS_NONF_IPV6_UDP           (1ULL << ETH_RSS_NONF_IPV6_UDP_SHIFT)
+#define ETH_RSS_NONF_IPV6_TCP           (1ULL << ETH_RSS_NONF_IPV6_TCP_SHIFT)
+#define ETH_RSS_NONF_IPV6_SCTP          (1ULL << ETH_RSS_NONF_IPV6_SCTP_SHIFT)
+#define ETH_RSS_NONF_IPV6_OTHER         (1ULL << ETH_RSS_NONF_IPV6_OTHER_SHIFT)
+#define ETH_RSS_FRAG_IPV6               (1ULL << ETH_RSS_FRAG_IPV6_SHIFT)
+/* FCOE relevant should not be used */
+#define ETH_RSS_FCOE_OX                 (1ULL << ETH_RSS_FCOE_OX_SHIFT)
+#define ETH_RSS_FCOE_RX                 (1ULL << ETH_RSS_FCOE_RX_SHIFT)
+#define ETH_RSS_FCOE_OTHER              (1ULL << ETH_RSS_FCOE_OTHER_SHIFT)
+#define ETH_RSS_L2_PAYLOAD              (1ULL << ETH_RSS_L2_PAYLOAD_SHIFT)
+
+#define ETH_RSS_IP ( \
+		ETH_RSS_IPV4 | \
+		ETH_RSS_IPV6 | \
+		ETH_RSS_NONF_IPV4_OTHER | \
+		ETH_RSS_FRAG_IPV4 | \
+		ETH_RSS_NONF_IPV6_OTHER | \
+		ETH_RSS_FRAG_IPV6)
+#define ETH_RSS_UDP ( \
+		ETH_RSS_IPV4 | \
+		ETH_RSS_IPV6 | \
+		ETH_RSS_IPV4_UDP | \
+		ETH_RSS_IPV6_UDP | \
+		ETH_RSS_IPV6_UDP_EX | \
+		ETH_RSS_NONF_IPV4_UDP | \
+		ETH_RSS_NONF_IPV6_UDP)
+/**< Mask of valid RSS hash protocols */
+#define ETH_RSS_PROTO_MASK ( \
+		ETH_RSS_IPV4 | \
+		ETH_RSS_IPV4_TCP | \
+		ETH_RSS_IPV6 | \
+		ETH_RSS_IPV6_EX | \
+		ETH_RSS_IPV6_TCP | \
+		ETH_RSS_IPV6_TCP_EX | \
+		ETH_RSS_IPV4_UDP | \
+		ETH_RSS_IPV6_UDP | \
+		ETH_RSS_IPV6_UDP_EX | \
+		ETH_RSS_NONF_IPV4_UDP | \
+		ETH_RSS_NONF_IPV4_TCP | \
+		ETH_RSS_NONF_IPV4_SCTP | \
+		ETH_RSS_NONF_IPV4_OTHER | \
+		ETH_RSS_FRAG_IPV4 | \
+		ETH_RSS_NONF_IPV6_UDP | \
+		ETH_RSS_NONF_IPV6_TCP | \
+		ETH_RSS_NONF_IPV6_SCTP | \
+		ETH_RSS_NONF_IPV6_OTHER | \
+		ETH_RSS_FRAG_IPV6 | \
+		ETH_RSS_L2_PAYLOAD)
+
+/*
+ * Definitions used for redirection table entry size.
+ * Some RSS RETA sizes may not be supported by some drivers, check the
+ * documentation or the description of relevant functions for more details.
+ */
+#define ETH_RSS_RETA_SIZE_64  64
+#define ETH_RSS_RETA_SIZE_128 128
+#define ETH_RSS_RETA_SIZE_512 512
+#define RTE_RETA_GROUP_SIZE   64
+
+/* Definitions used for VMDQ and DCB functionality */
+#define ETH_VMDQ_MAX_VLAN_FILTERS   64 /**< Maximum nb. of VMDQ vlan filters. */
+#define ETH_DCB_NUM_USER_PRIORITIES 8  /**< Maximum nb. of DCB priorities. */
+#define ETH_VMDQ_DCB_NUM_QUEUES     128 /**< Maximum nb. of VMDQ DCB queues. */
+#define ETH_DCB_NUM_QUEUES          128 /**< Maximum nb. of DCB queues. */
+
+/* DCB capability defines */
+#define ETH_DCB_PG_SUPPORT      0x00000001 /**< Priority Group(ETS) support. */
+#define ETH_DCB_PFC_SUPPORT     0x00000002 /**< Priority Flow Control support. */
+
+/* Definitions used for VLAN Offload functionality */
+#define ETH_VLAN_STRIP_OFFLOAD   0x0001 /**< VLAN Strip  On/Off */
+#define ETH_VLAN_FILTER_OFFLOAD  0x0002 /**< VLAN Filter On/Off */
+#define ETH_VLAN_EXTEND_OFFLOAD  0x0004 /**< VLAN Extend On/Off */
+
+/* Definitions used for mask VLAN setting */
+#define ETH_VLAN_STRIP_MASK   0x0001 /**< VLAN Strip  setting mask */
+#define ETH_VLAN_FILTER_MASK  0x0002 /**< VLAN Filter  setting mask*/
+#define ETH_VLAN_EXTEND_MASK  0x0004 /**< VLAN Extend  setting mask*/
+#define ETH_VLAN_ID_MAX       0x0FFF /**< VLAN ID is in lower 12 bits*/
+
+/* Definitions used for receive MAC address   */
+#define ETH_NUM_RECEIVE_MAC_ADDR  128 /**< Maximum nb. of receive mac addr. */
+
+/* Definitions used for unicast hash  */
+#define ETH_VMDQ_NUM_UC_HASH_ARRAY  128 /**< Maximum nb. of UC hash array. */
+
+/* Definitions used for VMDQ pool rx mode setting */
+#define ETH_VMDQ_ACCEPT_UNTAG   0x0001 /**< accept untagged packets. */
+#define ETH_VMDQ_ACCEPT_HASH_MC 0x0002 /**< accept packets in multicast table . */
+#define ETH_VMDQ_ACCEPT_HASH_UC 0x0004 /**< accept packets in unicast table. */
+#define ETH_VMDQ_ACCEPT_BROADCAST   0x0008 /**< accept broadcast packets. */
+#define ETH_VMDQ_ACCEPT_MULTICAST   0x0010 /**< multicast promiscuous. */
+
+/* Definitions used for VMDQ mirror rules setting */
+#define ETH_VMDQ_NUM_MIRROR_RULE     4 /**< Maximum nb. of mirror rules. . */
+
+#define ETH_VMDQ_POOL_MIRROR    0x0001 /**< Virtual Pool Mirroring. */
+#define ETH_VMDQ_UPLINK_MIRROR  0x0002 /**< Uplink Port Mirroring. */
+#define ETH_VMDQ_DOWNLIN_MIRROR 0x0004 /**< Downlink Port Mirroring. */
+#define ETH_VMDQ_VLAN_MIRROR    0x0008 /**< VLAN Mirroring. */
+
+/**
+ * A structure used to configure VLAN traffic mirror of an Ethernet port.
+ */
+struct rte_eth_vlan_mirror {
+	uint64_t vlan_mask; /**< mask for valid VLAN ID. */
+	uint16_t vlan_id[ETH_VMDQ_MAX_VLAN_FILTERS];
+	/** VLAN ID list for vlan mirror. */
+};
+
+/**
+ * A structure used to configure traffic mirror of an Ethernet port.
+ */
+struct rte_eth_vmdq_mirror_conf {
+	uint8_t rule_type_mask; /**< Mirroring rule type mask we want to set */
+	uint8_t dst_pool; /**< Destination pool for this mirror rule. */
+	uint64_t pool_mask; /**< Bitmap of pool for pool mirroring */
+	struct rte_eth_vlan_mirror vlan; /**< VLAN ID setting for VLAN mirroring */
+};
+
+/**
+ * A structure used to configure 64 entries of Redirection Table of the
+ * Receive Side Scaling (RSS) feature of an Ethernet port. To configure
+ * more than 64 entries supported by hardware, an array of this structure
+ * is needed.
+ */
+struct rte_eth_rss_reta_entry64 {
+	uint64_t mask;
+	/**< Mask bits indicate which entries need to be updated/queried. */
+	uint8_t reta[RTE_RETA_GROUP_SIZE];
+	/**< Group of 64 redirection table entries. */
+};
+
+/**
+ * This enum indicates the possible number of traffic classes
+ * in DCB configratioins
+ */
+enum rte_eth_nb_tcs {
+	ETH_4_TCS = 4, /**< 4 TCs with DCB. */
+	ETH_8_TCS = 8  /**< 8 TCs with DCB. */
+};
+
+/**
+ * This enum indicates the possible number of queue pools
+ * in VMDQ configurations.
+ */
+enum rte_eth_nb_pools {
+	ETH_8_POOLS = 8,    /**< 8 VMDq pools. */
+	ETH_16_POOLS = 16,  /**< 16 VMDq pools. */
+	ETH_32_POOLS = 32,  /**< 32 VMDq pools. */
+	ETH_64_POOLS = 64   /**< 64 VMDq pools. */
+};
+
+/* This structure may be extended in future. */
+struct rte_eth_dcb_rx_conf {
+	enum rte_eth_nb_tcs nb_tcs; /**< Possible DCB TCs, 4 or 8 TCs */
+	uint8_t dcb_queue[ETH_DCB_NUM_USER_PRIORITIES];
+	/**< Possible DCB queue,4 or 8. */
+};
+
+struct rte_eth_vmdq_dcb_tx_conf {
+	enum rte_eth_nb_pools nb_queue_pools; /**< With DCB, 16 or 32 pools. */
+	uint8_t dcb_queue[ETH_DCB_NUM_USER_PRIORITIES];
+	/**< Possible DCB queue,4 or 8. */
+};
+
+struct rte_eth_dcb_tx_conf {
+	enum rte_eth_nb_tcs nb_tcs; /**< Possible DCB TCs, 4 or 8 TCs. */
+	uint8_t dcb_queue[ETH_DCB_NUM_USER_PRIORITIES];
+	/**< Possible DCB queue,4 or 8. */
+};
+
+struct rte_eth_vmdq_tx_conf {
+	enum rte_eth_nb_pools nb_queue_pools; /**< VMDq mode, 64 pools. */
+};
+
+/**
+ * A structure used to configure the VMDQ+DCB feature
+ * of an Ethernet port.
+ *
+ * Using this feature, packets are routed to a pool of queues, based
+ * on the vlan id in the vlan tag, and then to a specific queue within
+ * that pool, using the user priority vlan tag field.
+ *
+ * A default pool may be used, if desired, to route all traffic which
+ * does not match the vlan filter rules.
+ */
+struct rte_eth_vmdq_dcb_conf {
+	enum rte_eth_nb_pools nb_queue_pools; /**< With DCB, 16 or 32 pools */
+	uint8_t enable_default_pool; /**< If non-zero, use a default pool */
+	uint8_t default_pool; /**< The default pool, if applicable */
+	uint8_t nb_pool_maps; /**< We can have up to 64 filters/mappings */
+	struct {
+		uint16_t vlan_id; /**< The vlan id of the received frame */
+		uint64_t pools;   /**< Bitmask of pools for packet rx */
+	} pool_map[ETH_VMDQ_MAX_VLAN_FILTERS]; /**< VMDq vlan pool maps. */
+	uint8_t dcb_queue[ETH_DCB_NUM_USER_PRIORITIES];
+	/**< Selects a queue in a pool */
+};
+
+struct rte_eth_vmdq_rx_conf {
+	enum rte_eth_nb_pools nb_queue_pools; /**< VMDq only mode, 8 or 64 pools */
+	uint8_t enable_default_pool; /**< If non-zero, use a default pool */
+	uint8_t default_pool; /**< The default pool, if applicable */
+	uint8_t enable_loop_back; /**< Enable VT loop back */
+	uint8_t nb_pool_maps; /**< We can have up to 64 filters/mappings */
+	uint32_t rx_mode; /**< Flags from ETH_VMDQ_ACCEPT_* */
+	struct {
+		uint16_t vlan_id; /**< The vlan id of the received frame */
+		uint64_t pools;   /**< Bitmask of pools for packet rx */
+	} pool_map[ETH_VMDQ_MAX_VLAN_FILTERS]; /**< VMDq vlan pool maps. */
+};
+
+/**
+ * A structure used to configure the TX features of an Ethernet port.
+ */
+struct rte_eth_txmode {
+	enum rte_eth_tx_mq_mode mq_mode; /**< TX multi-queues mode. */
+
+	/* For i40e specifically */
+	uint16_t pvid;
+	uint8_t hw_vlan_reject_tagged : 1,
+		/**< If set, reject sending out tagged pkts */
+		hw_vlan_reject_untagged : 1,
+		/**< If set, reject sending out untagged pkts */
+		hw_vlan_insert_pvid : 1;
+		/**< If set, enable port based VLAN insertion */
+};
+
+/**
+ * A structure used to configure an RX ring of an Ethernet port.
+ */
+struct rte_eth_rxconf {
+	struct rte_eth_thresh rx_thresh; /**< RX ring threshold registers. */
+	uint16_t rx_free_thresh; /**< Drives the freeing of RX descriptors. */
+	uint8_t rx_drop_en; /**< Drop packets if no descriptors are available. */
+	uint8_t rx_deferred_start; /**< Do not start queue with rte_eth_dev_start(). */
+};
+
+#define ETH_TXQ_FLAGS_NOMULTSEGS 0x0001 /**< nb_segs=1 for all mbufs */
+#define ETH_TXQ_FLAGS_NOREFCOUNT 0x0002 /**< refcnt can be ignored */
+#define ETH_TXQ_FLAGS_NOMULTMEMP 0x0004 /**< all bufs come from same mempool */
+#define ETH_TXQ_FLAGS_NOVLANOFFL 0x0100 /**< disable VLAN offload */
+#define ETH_TXQ_FLAGS_NOXSUMSCTP 0x0200 /**< disable SCTP checksum offload */
+#define ETH_TXQ_FLAGS_NOXSUMUDP  0x0400 /**< disable UDP checksum offload */
+#define ETH_TXQ_FLAGS_NOXSUMTCP  0x0800 /**< disable TCP checksum offload */
+#define ETH_TXQ_FLAGS_NOOFFLOADS \
+		(ETH_TXQ_FLAGS_NOVLANOFFL | ETH_TXQ_FLAGS_NOXSUMSCTP | \
+		 ETH_TXQ_FLAGS_NOXSUMUDP  | ETH_TXQ_FLAGS_NOXSUMTCP)
+/**
+ * A structure used to configure a TX ring of an Ethernet port.
+ */
+struct rte_eth_txconf {
+	struct rte_eth_thresh tx_thresh; /**< TX ring threshold registers. */
+	uint16_t tx_rs_thresh; /**< Drives the setting of RS bit on TXDs. */
+	uint16_t tx_free_thresh; /**< Drives the freeing of TX buffers. */
+	uint32_t txq_flags; /**< Set flags for the Tx queue */
+	uint8_t tx_deferred_start; /**< Do not start queue with rte_eth_dev_start(). */
+};
+
+/**
+ * This enum indicates the flow control mode
+ */
+enum rte_eth_fc_mode {
+	RTE_FC_NONE = 0, /**< Disable flow control. */
+	RTE_FC_RX_PAUSE, /**< RX pause frame, enable flowctrl on TX side. */
+	RTE_FC_TX_PAUSE, /**< TX pause frame, enable flowctrl on RX side. */
+	RTE_FC_FULL      /**< Enable flow control on both side. */
+};
+
+/**
+ * A structure used to configure Ethernet flow control parameter.
+ * These parameters will be configured into the register of the NIC.
+ * Please refer to the corresponding data sheet for proper value.
+ */
+struct rte_eth_fc_conf {
+	uint32_t high_water;  /**< High threshold value to trigger XOFF */
+	uint32_t low_water;   /**< Low threshold value to trigger XON */
+	uint16_t pause_time;  /**< Pause quota in the Pause frame */
+	uint16_t send_xon;    /**< Is XON frame need be sent */
+	enum rte_eth_fc_mode mode;  /**< Link flow control mode */
+	uint8_t mac_ctrl_frame_fwd; /**< Forward MAC control frames */
+	uint8_t autoneg;      /**< Use Pause autoneg */
+};
+
+/**
+ * A structure used to configure Ethernet priority flow control parameter.
+ * These parameters will be configured into the register of the NIC.
+ * Please refer to the corresponding data sheet for proper value.
+ */
+struct rte_eth_pfc_conf {
+	struct rte_eth_fc_conf fc; /**< General flow control parameter. */
+	uint8_t priority;          /**< VLAN User Priority. */
+};
+
+/**
+ *  Memory space that can be configured to store Flow Director filters
+ *  in the board memory.
+ */
+enum rte_fdir_pballoc_type {
+	RTE_FDIR_PBALLOC_64K = 0,  /**< 64k. */
+	RTE_FDIR_PBALLOC_128K,     /**< 128k. */
+	RTE_FDIR_PBALLOC_256K,     /**< 256k. */
+};
+
+/**
+ *  Select report mode of FDIR hash information in RX descriptors.
+ */
+enum rte_fdir_status_mode {
+	RTE_FDIR_NO_REPORT_STATUS = 0, /**< Never report FDIR hash. */
+	RTE_FDIR_REPORT_STATUS, /**< Only report FDIR hash for matching pkts. */
+	RTE_FDIR_REPORT_STATUS_ALWAYS, /**< Always report FDIR hash. */
+};
+
+/**
+ * A structure used to configure the Flow Director (FDIR) feature
+ * of an Ethernet port.
+ *
+ * If mode is RTE_FDIR_DISABLE, the pballoc value is ignored.
+ */
+struct rte_fdir_conf {
+	enum rte_fdir_mode mode; /**< Flow Director mode. */
+	enum rte_fdir_pballoc_type pballoc; /**< Space for FDIR filters. */
+	enum rte_fdir_status_mode status;  /**< How to report FDIR hash. */
+	/** Offset of flexbytes field in RX packets (in 16-bit word units). */
+	uint8_t flexbytes_offset;
+	/** RX queue of packets matching a "drop" filter in perfect mode. */
+	uint8_t drop_queue;
+	struct rte_eth_fdir_flex_conf flex_conf;
+	/**< Flex payload configuration. */
+};
+
+/**
+ * UDP tunneling configuration.
+ */
+struct rte_eth_udp_tunnel {
+	uint16_t udp_port;
+	uint8_t prot_type;
+};
+
+/**
+ *  Possible l4type of FDIR filters.
+ */
+enum rte_l4type {
+	RTE_FDIR_L4TYPE_NONE = 0,       /**< None. */
+	RTE_FDIR_L4TYPE_UDP,            /**< UDP. */
+	RTE_FDIR_L4TYPE_TCP,            /**< TCP. */
+	RTE_FDIR_L4TYPE_SCTP,           /**< SCTP. */
+};
+
+/**
+ *  Select IPv4 or IPv6 FDIR filters.
+ */
+enum rte_iptype {
+	RTE_FDIR_IPTYPE_IPV4 = 0,     /**< IPv4. */
+	RTE_FDIR_IPTYPE_IPV6 ,        /**< IPv6. */
+};
+
+/**
+ *  A structure used to define a FDIR packet filter.
+ */
+struct rte_fdir_filter {
+	uint16_t flex_bytes; /**< Flex bytes value to match. */
+	uint16_t vlan_id; /**< VLAN ID value to match, 0 otherwise. */
+	uint16_t port_src; /**< Source port to match, 0 otherwise. */
+	uint16_t port_dst; /**< Destination port to match, 0 otherwise. */
+	union {
+		uint32_t ipv4_addr; /**< IPv4 source address to match. */
+		uint32_t ipv6_addr[4]; /**< IPv6 source address to match. */
+	} ip_src; /**< IPv4/IPv6 source address to match (union of above). */
+	union {
+		uint32_t ipv4_addr; /**< IPv4 destination address to match. */
+		uint32_t ipv6_addr[4]; /**< IPv6 destination address to match */
+	} ip_dst; /**< IPv4/IPv6 destination address to match (union of above). */
+	enum rte_l4type l4type; /**< l4type to match: NONE/UDP/TCP/SCTP. */
+	enum rte_iptype iptype; /**< IP packet type to match: IPv4 or IPv6. */
+};
+
+/**
+ *  A structure used to configure FDIR masks that are used by the device
+ *  to match the various fields of RX packet headers.
+ *  @note The only_ip_flow field has the opposite meaning compared to other
+ *  masks!
+ */
+struct rte_fdir_masks {
+	/** When set to 1, packet l4type is \b NOT relevant in filters, and
+	   source and destination port masks must be set to zero. */
+	uint8_t only_ip_flow;
+	/** If set to 1, vlan_id is relevant in filters. */
+	uint8_t vlan_id;
+	/** If set to 1, vlan_prio is relevant in filters. */
+	uint8_t vlan_prio;
+	/** If set to 1, flexbytes is relevant in filters. */
+	uint8_t flexbytes;
+	/** If set to 1, set the IPv6 masks. Otherwise set the IPv4 masks. */
+	uint8_t set_ipv6_mask;
+	/** When set to 1, comparison of destination IPv6 address with IP6AT
+	    registers is meaningful. */
+	uint8_t comp_ipv6_dst;
+	/** Mask of Destination IPv4 Address. All bits set to 1 define the
+	    relevant bits to use in the destination address of an IPv4 packet
+	    when matching it against FDIR filters. */
+	uint32_t dst_ipv4_mask;
+	/** Mask of Source IPv4 Address. All bits set to 1 define
+	    the relevant bits to use in the source address of an IPv4 packet
+	    when matching it against FDIR filters. */
+	uint32_t src_ipv4_mask;
+	/** Mask of Source IPv6 Address. All bits set to 1 define the
+	    relevant BYTES to use in the source address of an IPv6 packet
+	    when matching it against FDIR filters. */
+	uint16_t dst_ipv6_mask;
+	/** Mask of Destination IPv6 Address. All bits set to 1 define the
+	    relevant BYTES to use in the destination address of an IPv6 packet
+	    when matching it against FDIR filters. */
+	uint16_t src_ipv6_mask;
+	/** Mask of Source Port. All bits set to 1 define the relevant
+	    bits to use in the source port of an IP packets when matching it
+	    against FDIR filters. */
+	uint16_t src_port_mask;
+	/** Mask of Destination Port. All bits set to 1 define the relevant
+	    bits to use in the destination port of an IP packet when matching it
+	    against FDIR filters. */
+	uint16_t dst_port_mask;
+};
+
+/**
+ *  A structure used to report the status of the flow director filters in use.
+ */
+struct rte_eth_fdir {
+	/** Number of filters with collision indication. */
+	uint16_t collision;
+	/** Number of free (non programmed) filters. */
+	uint16_t free;
+	/** The Lookup hash value of the added filter that updated the value
+	   of the MAXLEN field */
+	uint16_t maxhash;
+	/** Longest linked list of filters in the table. */
+	uint8_t maxlen;
+	/** Number of added filters. */
+	uint64_t add;
+	/** Number of removed filters. */
+	uint64_t remove;
+	/** Number of failed added filters (no more space in device). */
+	uint64_t f_add;
+	/** Number of failed removed filters. */
+	uint64_t f_remove;
+};
+
+/**
+ * A structure used to enable/disable specific device interrupts.
+ */
+struct rte_intr_conf {
+	/** enable/disable lsc interrupt. 0 (default) - disable, 1 enable */
+	uint16_t lsc;
+};
+
+/**
+ * A structure used to configure an Ethernet port.
+ * Depending upon the RX multi-queue mode, extra advanced
+ * configuration settings may be needed.
+ */
+struct rte_eth_conf {
+	uint16_t link_speed;
+	/**< ETH_LINK_SPEED_10[0|00|000], or 0 for autonegotation */
+	uint16_t link_duplex;
+	/**< ETH_LINK_[HALF_DUPLEX|FULL_DUPLEX], or 0 for autonegotation */
+	struct rte_eth_rxmode rxmode; /**< Port RX configuration. */
+	struct rte_eth_txmode txmode; /**< Port TX configuration. */
+	uint32_t lpbk_mode; /**< Loopback operation mode. By default the value
+			         is 0, meaning the loopback mode is disabled.
+				 Read the datasheet of given ethernet controller
+				 for details. The possible values of this field
+				 are defined in implementation of each driver. */
+	struct {
+		struct rte_eth_rss_conf rss_conf; /**< Port RSS configuration */
+		struct rte_eth_vmdq_dcb_conf vmdq_dcb_conf;
+		/**< Port vmdq+dcb configuration. */
+		struct rte_eth_dcb_rx_conf dcb_rx_conf;
+		/**< Port dcb RX configuration. */
+		struct rte_eth_vmdq_rx_conf vmdq_rx_conf;
+		/**< Port vmdq RX configuration. */
+	} rx_adv_conf; /**< Port RX filtering configuration (union). */
+	union {
+		struct rte_eth_vmdq_dcb_tx_conf vmdq_dcb_tx_conf;
+		/**< Port vmdq+dcb TX configuration. */
+		struct rte_eth_dcb_tx_conf dcb_tx_conf;
+		/**< Port dcb TX configuration. */
+		struct rte_eth_vmdq_tx_conf vmdq_tx_conf;
+		/**< Port vmdq TX configuration. */
+	} tx_adv_conf; /**< Port TX DCB configuration (union). */
+	/** Currently,Priority Flow Control(PFC) are supported,if DCB with PFC
+	    is needed,and the variable must be set ETH_DCB_PFC_SUPPORT. */
+	uint32_t dcb_capability_en;
+	struct rte_fdir_conf fdir_conf; /**< FDIR configuration. */
+	struct rte_intr_conf intr_conf; /**< Interrupt mode configuration. */
+};
+
+/**
+ * A structure used to retrieve the contextual information of
+ * an Ethernet device, such as the controlling driver of the device,
+ * its PCI context, etc...
+ */
+
+/**
+ * RX offload capabilities of a device.
+ */
+#define DEV_RX_OFFLOAD_VLAN_STRIP  0x00000001
+#define DEV_RX_OFFLOAD_IPV4_CKSUM  0x00000002
+#define DEV_RX_OFFLOAD_UDP_CKSUM   0x00000004
+#define DEV_RX_OFFLOAD_TCP_CKSUM   0x00000008
+#define DEV_RX_OFFLOAD_TCP_LRO     0x00000010
+
+/**
+ * TX offload capabilities of a device.
+ */
+#define DEV_TX_OFFLOAD_VLAN_INSERT 0x00000001
+#define DEV_TX_OFFLOAD_IPV4_CKSUM  0x00000002
+#define DEV_TX_OFFLOAD_UDP_CKSUM   0x00000004
+#define DEV_TX_OFFLOAD_TCP_CKSUM   0x00000008
+#define DEV_TX_OFFLOAD_SCTP_CKSUM  0x00000010
+#define DEV_TX_OFFLOAD_TCP_TSO     0x00000020
+#define DEV_TX_OFFLOAD_UDP_TSO     0x00000040
+#define DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM 0x00000080 /**< Used for tunneling packet. */
+
+struct rte_eth_dev_info {
+	struct rte_pci_device *pci_dev; /**< Device PCI information. */
+	const char *driver_name; /**< Device Driver name. */
+	unsigned int if_index; /**< Index to bound host interface, or 0 if none.
+		Use if_indextoname() to translate into an interface name. */
+	uint32_t min_rx_bufsize; /**< Minimum size of RX buffer. */
+	uint32_t max_rx_pktlen; /**< Maximum configurable length of RX pkt. */
+	uint16_t max_rx_queues; /**< Maximum number of RX queues. */
+	uint16_t max_tx_queues; /**< Maximum number of TX queues. */
+	uint32_t max_mac_addrs; /**< Maximum number of MAC addresses. */
+	uint32_t max_hash_mac_addrs;
+	/** Maximum number of hash MAC addresses for MTA and UTA. */
+	uint16_t max_vfs; /**< Maximum number of VFs. */
+	uint16_t max_vmdq_pools; /**< Maximum number of VMDq pools. */
+	uint32_t rx_offload_capa; /**< Device RX offload capabilities. */
+	uint32_t tx_offload_capa; /**< Device TX offload capabilities. */
+	uint16_t reta_size;
+	/**< Device redirection table size, the total number of entries. */
+	struct rte_eth_rxconf default_rxconf; /**< Default RX configuration */
+	struct rte_eth_txconf default_txconf; /**< Default TX configuration */
+	uint16_t vmdq_queue_base; /**< First queue ID for VMDQ pools. */
+	uint16_t vmdq_queue_num;  /**< Queue number for VMDQ pools. */
+	uint16_t vmdq_pool_base;  /**< First ID of VMDQ pools. */
+};
+
+/** Maximum name length for extended statistics counters */
+#define RTE_ETH_XSTATS_NAME_SIZE 64
+
+/**
+ * An Ethernet device extended statistic structure
+ *
+ * This structure is used by ethdev->eth_xstats_get() to provide
+ * statistics that are not provided in the generic rte_eth_stats
+ * structure.
+ */
+struct rte_eth_xstats {
+	char name[RTE_ETH_XSTATS_NAME_SIZE];
+	uint64_t value;
+};
+
+struct rte_eth_dev;
+
+struct rte_eth_dev_callback;
+/** @internal Structure to keep track of registered callbacks */
+TAILQ_HEAD(rte_eth_dev_cb_list, rte_eth_dev_callback);
+
+#define TCP_UGR_FLAG 0x20
+#define TCP_ACK_FLAG 0x10
+#define TCP_PSH_FLAG 0x08
+#define TCP_RST_FLAG 0x04
+#define TCP_SYN_FLAG 0x02
+#define TCP_FIN_FLAG 0x01
+#define TCP_FLAG_ALL 0x3F
+
+/**
+ *  A structure used to define an syn filter.
+ */
+struct rte_syn_filter {
+	uint8_t hig_pri; /**< 1 means higher pri than 2tuple, 5tupe,
+			      and flex filter, 0 means lower pri. */
+};
+
+/**
+ *  A structure used to define a 2tuple filter.
+ */
+struct rte_2tuple_filter {
+	uint16_t dst_port;        /**< big endian. */
+	uint8_t protocol;
+	uint8_t tcp_flags;
+	uint16_t priority;        /**< used when more than one filter matches. */
+	uint8_t dst_port_mask:1,  /**< if mask is 1b, means not compare. */
+		protocol_mask:1;
+};
+
+/**
+ *  A structure used to define a flex filter.
+ */
+struct rte_flex_filter {
+	uint16_t len;
+	uint32_t dwords[32];  /**< flex bytes in big endian. */
+	uint8_t mask[16];     /**< if mask bit is 1b, do not compare
+				   corresponding byte in dwords. */
+	uint8_t priority;
+};
+
+/**
+ *  A structure used to define a 5tuple filter.
+ */
+struct rte_5tuple_filter {
+	uint32_t dst_ip;         /**< destination IP address in big endian. */
+	uint32_t src_ip;         /**< source IP address in big endian. */
+	uint16_t dst_port;       /**< destination port in big endian. */
+	uint16_t src_port;       /**< source Port big endian. */
+	uint8_t protocol;        /**< l4 protocol. */
+	uint8_t tcp_flags;       /**< tcp flags. */
+	uint16_t priority;       /**< seven evels (001b-111b), 111b is highest,
+				      used when more than one filter matches. */
+	uint8_t dst_ip_mask:1,   /**< if mask is 1b, do not compare dst ip. */
+		src_ip_mask:1,   /**< if mask is 1b, do not compare src ip. */
+		dst_port_mask:1, /**< if mask is 1b, do not compare dst port. */
+		src_port_mask:1, /**< if mask is 1b, do not compare src port. */
+		protocol_mask:1; /**< if mask is 1b, do not compare protocol. */
+};
+
+/*
+ * Definitions of all functions exported by an Ethernet driver through the
+ * the generic structure of type *eth_dev_ops* supplied in the *rte_eth_dev*
+ * structure associated with an Ethernet device.
+ */
+
+typedef int  (*eth_dev_configure_t)(struct rte_eth_dev *dev);
+/**< @internal Ethernet device configuration. */
+
+typedef int  (*eth_dev_start_t)(struct rte_eth_dev *dev);
+/**< @internal Function used to start a configured Ethernet device. */
+
+typedef void (*eth_dev_stop_t)(struct rte_eth_dev *dev);
+/**< @internal Function used to stop a configured Ethernet device. */
+
+typedef int  (*eth_dev_set_link_up_t)(struct rte_eth_dev *dev);
+/**< @internal Function used to link up a configured Ethernet device. */
+
+typedef int  (*eth_dev_set_link_down_t)(struct rte_eth_dev *dev);
+/**< @internal Function used to link down a configured Ethernet device. */
+
+typedef void (*eth_dev_close_t)(struct rte_eth_dev *dev);
+/**< @internal Function used to close a configured Ethernet device. */
+
+typedef void (*eth_promiscuous_enable_t)(struct rte_eth_dev *dev);
+/**< @internal Function used to enable the RX promiscuous mode of an Ethernet device. */
+
+typedef void (*eth_promiscuous_disable_t)(struct rte_eth_dev *dev);
+/**< @internal Function used to disable the RX promiscuous mode of an Ethernet device. */
+
+typedef void (*eth_allmulticast_enable_t)(struct rte_eth_dev *dev);
+/**< @internal Enable the receipt of all multicast packets by an Ethernet device. */
+
+typedef void (*eth_allmulticast_disable_t)(struct rte_eth_dev *dev);
+/**< @internal Disable the receipt of all multicast packets by an Ethernet device. */
+
+typedef int (*eth_link_update_t)(struct rte_eth_dev *dev,
+				int wait_to_complete);
+/**< @internal Get link speed, duplex mode and state (up/down) of an Ethernet device. */
+
+typedef void (*eth_stats_get_t)(struct rte_eth_dev *dev,
+				struct rte_eth_stats *igb_stats);
+/**< @internal Get global I/O statistics of an Ethernet device. */
+
+typedef void (*eth_stats_reset_t)(struct rte_eth_dev *dev);
+/**< @internal Reset global I/O statistics of an Ethernet device to 0. */
+
+typedef int (*eth_xstats_get_t)(struct rte_eth_dev *dev,
+	struct rte_eth_xstats *stats, unsigned n);
+/**< @internal Get extended stats of an Ethernet device. */
+
+typedef void (*eth_xstats_reset_t)(struct rte_eth_dev *dev);
+/**< @internal Reset extended stats of an Ethernet device. */
+
+typedef int (*eth_queue_stats_mapping_set_t)(struct rte_eth_dev *dev,
+					     uint16_t queue_id,
+					     uint8_t stat_idx,
+					     uint8_t is_rx);
+/**< @internal Set a queue statistics mapping for a tx/rx queue of an Ethernet device. */
+
+typedef void (*eth_dev_infos_get_t)(struct rte_eth_dev *dev,
+				    struct rte_eth_dev_info *dev_info);
+/**< @internal Get specific informations of an Ethernet device. */
+
+typedef int (*eth_queue_start_t)(struct rte_eth_dev *dev,
+				    uint16_t queue_id);
+/**< @internal Start rx and tx of a queue of an Ethernet device. */
+
+typedef int (*eth_queue_stop_t)(struct rte_eth_dev *dev,
+				    uint16_t queue_id);
+/**< @internal Stop rx and tx of a queue of an Ethernet device. */
+
+typedef int (*eth_rx_queue_setup_t)(struct rte_eth_dev *dev,
+				    uint16_t rx_queue_id,
+				    uint16_t nb_rx_desc,
+				    unsigned int socket_id,
+				    const struct rte_eth_rxconf *rx_conf,
+				    struct rte_mempool *mb_pool);
+/**< @internal Set up a receive queue of an Ethernet device. */
+
+typedef int (*eth_tx_queue_setup_t)(struct rte_eth_dev *dev,
+				    uint16_t tx_queue_id,
+				    uint16_t nb_tx_desc,
+				    unsigned int socket_id,
+				    const struct rte_eth_txconf *tx_conf);
+/**< @internal Setup a transmit queue of an Ethernet device. */
+
+typedef void (*eth_queue_release_t)(void *queue);
+/**< @internal Release memory resources allocated by given RX/TX queue. */
+
+typedef uint32_t (*eth_rx_queue_count_t)(struct rte_eth_dev *dev,
+					 uint16_t rx_queue_id);
+/**< @Get number of available descriptors on a receive queue of an Ethernet device. */
+
+typedef int (*eth_rx_descriptor_done_t)(void *rxq, uint16_t offset);
+/**< @Check DD bit of specific RX descriptor */
+
+typedef int (*mtu_set_t)(struct rte_eth_dev *dev, uint16_t mtu);
+/**< @internal Set MTU. */
+
+typedef int (*vlan_filter_set_t)(struct rte_eth_dev *dev,
+				  uint16_t vlan_id,
+				  int on);
+/**< @internal filtering of a VLAN Tag Identifier by an Ethernet device. */
+
+typedef void (*vlan_tpid_set_t)(struct rte_eth_dev *dev,
+				  uint16_t tpid);
+/**< @internal set the outer VLAN-TPID by an Ethernet device. */
+
+typedef void (*vlan_offload_set_t)(struct rte_eth_dev *dev, int mask);
+/**< @internal set VLAN offload function by an Ethernet device. */
+
+typedef int (*vlan_pvid_set_t)(struct rte_eth_dev *dev,
+			       uint16_t vlan_id,
+			       int on);
+/**< @internal set port based TX VLAN insertion by an Ethernet device. */
+
+typedef void (*vlan_strip_queue_set_t)(struct rte_eth_dev *dev,
+				  uint16_t rx_queue_id,
+				  int on);
+/**< @internal VLAN stripping enable/disable by an queue of Ethernet device. */
+
+typedef uint16_t (*eth_rx_burst_t)(void *rxq,
+				   struct rte_mbuf **rx_pkts,
+				   uint16_t nb_pkts);
+/**< @internal Retrieve input packets from a receive queue of an Ethernet device. */
+
+typedef uint16_t (*eth_tx_burst_t)(void *txq,
+				   struct rte_mbuf **tx_pkts,
+				   uint16_t nb_pkts);
+/**< @internal Send output packets on a transmit queue of an Ethernet device. */
+
+typedef int (*fdir_add_signature_filter_t)(struct rte_eth_dev *dev,
+					   struct rte_fdir_filter *fdir_ftr,
+					   uint8_t rx_queue);
+/**< @internal Setup a new signature filter rule on an Ethernet device */
+
+typedef int (*fdir_update_signature_filter_t)(struct rte_eth_dev *dev,
+					      struct rte_fdir_filter *fdir_ftr,
+					      uint8_t rx_queue);
+/**< @internal Update a signature filter rule on an Ethernet device */
+
+typedef int (*fdir_remove_signature_filter_t)(struct rte_eth_dev *dev,
+					      struct rte_fdir_filter *fdir_ftr);
+/**< @internal Remove a  signature filter rule on an Ethernet device */
+
+typedef void (*fdir_infos_get_t)(struct rte_eth_dev *dev,
+				 struct rte_eth_fdir *fdir);
+/**< @internal Get information about fdir status */
+
+typedef int (*fdir_add_perfect_filter_t)(struct rte_eth_dev *dev,
+					 struct rte_fdir_filter *fdir_ftr,
+					 uint16_t soft_id, uint8_t rx_queue,
+					 uint8_t drop);
+/**< @internal Setup a new perfect filter rule on an Ethernet device */
+
+typedef int (*fdir_update_perfect_filter_t)(struct rte_eth_dev *dev,
+					    struct rte_fdir_filter *fdir_ftr,
+					    uint16_t soft_id, uint8_t rx_queue,
+					    uint8_t drop);
+/**< @internal Update a perfect filter rule on an Ethernet device */
+
+typedef int (*fdir_remove_perfect_filter_t)(struct rte_eth_dev *dev,
+					    struct rte_fdir_filter *fdir_ftr,
+					    uint16_t soft_id);
+/**< @internal Remove a perfect filter rule on an Ethernet device */
+
+typedef int (*fdir_set_masks_t)(struct rte_eth_dev *dev,
+				struct rte_fdir_masks *fdir_masks);
+/**< @internal Setup flow director masks on an Ethernet device */
+
+typedef int (*flow_ctrl_get_t)(struct rte_eth_dev *dev,
+			       struct rte_eth_fc_conf *fc_conf);
+/**< @internal Get current flow control parameter on an Ethernet device */
+
+typedef int (*flow_ctrl_set_t)(struct rte_eth_dev *dev,
+			       struct rte_eth_fc_conf *fc_conf);
+/**< @internal Setup flow control parameter on an Ethernet device */
+
+typedef int (*priority_flow_ctrl_set_t)(struct rte_eth_dev *dev,
+				struct rte_eth_pfc_conf *pfc_conf);
+/**< @internal Setup priority flow control parameter on an Ethernet device */
+
+typedef int (*reta_update_t)(struct rte_eth_dev *dev,
+			     struct rte_eth_rss_reta_entry64 *reta_conf,
+			     uint16_t reta_size);
+/**< @internal Update RSS redirection table on an Ethernet device */
+
+typedef int (*reta_query_t)(struct rte_eth_dev *dev,
+			    struct rte_eth_rss_reta_entry64 *reta_conf,
+			    uint16_t reta_size);
+/**< @internal Query RSS redirection table on an Ethernet device */
+
+typedef int (*rss_hash_update_t)(struct rte_eth_dev *dev,
+				 struct rte_eth_rss_conf *rss_conf);
+/**< @internal Update RSS hash configuration of an Ethernet device */
+
+typedef int (*rss_hash_conf_get_t)(struct rte_eth_dev *dev,
+				   struct rte_eth_rss_conf *rss_conf);
+/**< @internal Get current RSS hash configuration of an Ethernet device */
+
+typedef int (*eth_dev_led_on_t)(struct rte_eth_dev *dev);
+/**< @internal Turn on SW controllable LED on an Ethernet device */
+
+typedef int (*eth_dev_led_off_t)(struct rte_eth_dev *dev);
+/**< @internal Turn off SW controllable LED on an Ethernet device */
+
+typedef void (*eth_mac_addr_remove_t)(struct rte_eth_dev *dev, uint32_t index);
+/**< @internal Remove MAC address from receive address register */
+
+typedef void (*eth_mac_addr_add_t)(struct rte_eth_dev *dev,
+				  struct ether_addr *mac_addr,
+				  uint32_t index,
+				  uint32_t vmdq);
+/**< @internal Set a MAC address into Receive Address Address Register */
+
+typedef int (*eth_uc_hash_table_set_t)(struct rte_eth_dev *dev,
+				  struct ether_addr *mac_addr,
+				  uint8_t on);
+/**< @internal Set a Unicast Hash bitmap */
+
+typedef int (*eth_uc_all_hash_table_set_t)(struct rte_eth_dev *dev,
+				  uint8_t on);
+/**< @internal Set all Unicast Hash bitmap */
+
+typedef int (*eth_set_vf_rx_mode_t)(struct rte_eth_dev *dev,
+				  uint16_t vf,
+				  uint16_t rx_mode,
+				  uint8_t on);
+/**< @internal Set a VF receive mode */
+
+typedef int (*eth_set_vf_rx_t)(struct rte_eth_dev *dev,
+				uint16_t vf,
+				uint8_t on);
+/**< @internal Set a VF receive  mode */
+
+typedef int (*eth_set_vf_tx_t)(struct rte_eth_dev *dev,
+				uint16_t vf,
+				uint8_t on);
+/**< @internal Enable or disable a VF transmit   */
+
+typedef int (*eth_set_vf_vlan_filter_t)(struct rte_eth_dev *dev,
+				  uint16_t vlan,
+				  uint64_t vf_mask,
+				  uint8_t vlan_on);
+/**< @internal Set VF VLAN pool filter */
+
+typedef int (*eth_set_queue_rate_limit_t)(struct rte_eth_dev *dev,
+				uint16_t queue_idx,
+				uint16_t tx_rate);
+/**< @internal Set queue TX rate */
+
+typedef int (*eth_set_vf_rate_limit_t)(struct rte_eth_dev *dev,
+				uint16_t vf,
+				uint16_t tx_rate,
+				uint64_t q_msk);
+/**< @internal Set VF TX rate */
+
+typedef int (*eth_mirror_rule_set_t)(struct rte_eth_dev *dev,
+				  struct rte_eth_vmdq_mirror_conf *mirror_conf,
+				  uint8_t rule_id,
+				  uint8_t on);
+/**< @internal Add a traffic mirroring rule on an Ethernet device */
+
+typedef int (*eth_mirror_rule_reset_t)(struct rte_eth_dev *dev,
+				  uint8_t rule_id);
+/**< @internal Remove a traffic mirroring rule on an Ethernet device */
+
+typedef int (*eth_udp_tunnel_add_t)(struct rte_eth_dev *dev,
+				    struct rte_eth_udp_tunnel *tunnel_udp);
+/**< @internal Add tunneling UDP info */
+
+typedef int (*eth_udp_tunnel_del_t)(struct rte_eth_dev *dev,
+				    struct rte_eth_udp_tunnel *tunnel_udp);
+/**< @internal Delete tunneling UDP info */
+
+
+#ifdef RTE_NIC_BYPASS
+
+enum {
+	RTE_BYPASS_MODE_NONE,
+	RTE_BYPASS_MODE_NORMAL,
+	RTE_BYPASS_MODE_BYPASS,
+	RTE_BYPASS_MODE_ISOLATE,
+	RTE_BYPASS_MODE_NUM,
+};
+
+#define	RTE_BYPASS_MODE_VALID(x)	\
+	((x) > RTE_BYPASS_MODE_NONE && (x) < RTE_BYPASS_MODE_NUM)
+
+enum {
+	RTE_BYPASS_EVENT_NONE,
+	RTE_BYPASS_EVENT_START,
+	RTE_BYPASS_EVENT_OS_ON = RTE_BYPASS_EVENT_START,
+	RTE_BYPASS_EVENT_POWER_ON,
+	RTE_BYPASS_EVENT_OS_OFF,
+	RTE_BYPASS_EVENT_POWER_OFF,
+	RTE_BYPASS_EVENT_TIMEOUT,
+	RTE_BYPASS_EVENT_NUM
+};
+
+#define	RTE_BYPASS_EVENT_VALID(x)	\
+	((x) > RTE_BYPASS_EVENT_NONE && (x) < RTE_BYPASS_MODE_NUM)
+
+enum {
+	RTE_BYPASS_TMT_OFF,     /* timeout disabled. */
+	RTE_BYPASS_TMT_1_5_SEC, /* timeout for 1.5 seconds */
+	RTE_BYPASS_TMT_2_SEC,   /* timeout for 2 seconds */
+	RTE_BYPASS_TMT_3_SEC,   /* timeout for 3 seconds */
+	RTE_BYPASS_TMT_4_SEC,   /* timeout for 4 seconds */
+	RTE_BYPASS_TMT_8_SEC,   /* timeout for 8 seconds */
+	RTE_BYPASS_TMT_16_SEC,  /* timeout for 16 seconds */
+	RTE_BYPASS_TMT_32_SEC,  /* timeout for 32 seconds */
+	RTE_BYPASS_TMT_NUM
+};
+
+#define	RTE_BYPASS_TMT_VALID(x)	\
+	((x) == RTE_BYPASS_TMT_OFF || \
+	((x) > RTE_BYPASS_TMT_OFF && (x) < RTE_BYPASS_TMT_NUM))
+
+typedef void (*bypass_init_t)(struct rte_eth_dev *dev);
+typedef int32_t (*bypass_state_set_t)(struct rte_eth_dev *dev, uint32_t *new_state);
+typedef int32_t (*bypass_state_show_t)(struct rte_eth_dev *dev, uint32_t *state);
+typedef int32_t (*bypass_event_set_t)(struct rte_eth_dev *dev, uint32_t state, uint32_t event);
+typedef int32_t (*bypass_event_show_t)(struct rte_eth_dev *dev, uint32_t event_shift, uint32_t *event);
+typedef int32_t (*bypass_wd_timeout_set_t)(struct rte_eth_dev *dev, uint32_t timeout);
+typedef int32_t (*bypass_wd_timeout_show_t)(struct rte_eth_dev *dev, uint32_t *wd_timeout);
+typedef int32_t (*bypass_ver_show_t)(struct rte_eth_dev *dev, uint32_t *ver);
+typedef int32_t (*bypass_wd_reset_t)(struct rte_eth_dev *dev);
+#endif
+
+typedef int (*eth_add_syn_filter_t)(struct rte_eth_dev *dev,
+			struct rte_syn_filter *filter, uint16_t rx_queue);
+/**< @internal add syn filter rule on an Ethernet device */
+
+typedef int (*eth_remove_syn_filter_t)(struct rte_eth_dev *dev);
+/**< @internal remove syn filter rule on an Ethernet device */
+
+typedef int (*eth_get_syn_filter_t)(struct rte_eth_dev *dev,
+			struct rte_syn_filter *filter, uint16_t *rx_queue);
+/**< @internal Get syn filter rule on an Ethernet device */
+
+typedef int (*eth_add_2tuple_filter_t)(struct rte_eth_dev *dev,
+			uint16_t index, struct rte_2tuple_filter *filter,
+			uint16_t rx_queue);
+/**< @internal Setup a new 2tuple filter rule on an Ethernet device */
+
+typedef int (*eth_remove_2tuple_filter_t)(struct rte_eth_dev *dev,
+			uint16_t index);
+/**< @internal Remove a 2tuple filter rule on an Ethernet device */
+
+typedef int (*eth_get_2tuple_filter_t)(struct rte_eth_dev *dev,
+			uint16_t index, struct rte_2tuple_filter *filter,
+			uint16_t *rx_queue);
+/**< @internal Get a 2tuple filter rule on an Ethernet device */
+
+typedef int (*eth_add_5tuple_filter_t)(struct rte_eth_dev *dev,
+			uint16_t index, struct rte_5tuple_filter *filter,
+			uint16_t rx_queue);
+/**< @internal Setup a new 5tuple filter rule on an Ethernet device */
+
+typedef int (*eth_remove_5tuple_filter_t)(struct rte_eth_dev *dev,
+			uint16_t index);
+/**< @internal Remove a 5tuple filter rule on an Ethernet device */
+
+typedef int (*eth_get_5tuple_filter_t)(struct rte_eth_dev *dev,
+			uint16_t index, struct rte_5tuple_filter *filter,
+			uint16_t *rx_queue);
+/**< @internal Get a 5tuple filter rule on an Ethernet device */
+
+typedef int (*eth_add_flex_filter_t)(struct rte_eth_dev *dev,
+			uint16_t index, struct rte_flex_filter *filter,
+			uint16_t rx_queue);
+/**< @internal Setup a new flex filter rule on an Ethernet device */
+
+typedef int (*eth_remove_flex_filter_t)(struct rte_eth_dev *dev,
+			uint16_t index);
+/**< @internal Remove a flex filter rule on an Ethernet device */
+
+typedef int (*eth_get_flex_filter_t)(struct rte_eth_dev *dev,
+			uint16_t index, struct rte_flex_filter *filter,
+			uint16_t *rx_queue);
+/**< @internal Get a flex filter rule on an Ethernet device */
+
+typedef int (*eth_filter_ctrl_t)(struct rte_eth_dev *dev,
+				 enum rte_filter_type filter_type,
+				 enum rte_filter_op filter_op,
+				 void *arg);
+/**< @internal Take operations to assigned filter type on an Ethernet device */
+
+/**
+ * @internal A structure containing the functions exported by an Ethernet driver.
+ */
+struct eth_dev_ops {
+	eth_dev_configure_t        dev_configure; /**< Configure device. */
+	eth_dev_start_t            dev_start;     /**< Start device. */
+	eth_dev_stop_t             dev_stop;      /**< Stop device. */
+	eth_dev_set_link_up_t      dev_set_link_up;   /**< Device link up. */
+	eth_dev_set_link_down_t    dev_set_link_down; /**< Device link down. */
+	eth_dev_close_t            dev_close;     /**< Close device. */
+	eth_promiscuous_enable_t   promiscuous_enable; /**< Promiscuous ON. */
+	eth_promiscuous_disable_t  promiscuous_disable;/**< Promiscuous OFF. */
+	eth_allmulticast_enable_t  allmulticast_enable;/**< RX multicast ON. */
+	eth_allmulticast_disable_t allmulticast_disable;/**< RX multicast OF. */
+	eth_link_update_t          link_update;   /**< Get device link state. */
+	eth_stats_get_t            stats_get;     /**< Get generic device statistics. */
+	eth_stats_reset_t          stats_reset;   /**< Reset generic device statistics. */
+	eth_xstats_get_t           xstats_get;    /**< Get extended device statistics. */
+	eth_xstats_reset_t         xstats_reset;  /**< Reset extended device statistics. */
+	eth_queue_stats_mapping_set_t queue_stats_mapping_set;
+	/**< Configure per queue stat counter mapping. */
+	eth_dev_infos_get_t        dev_infos_get; /**< Get device info. */
+	mtu_set_t                  mtu_set; /**< Set MTU. */
+	vlan_filter_set_t          vlan_filter_set;  /**< Filter VLAN Setup. */
+	vlan_tpid_set_t            vlan_tpid_set;      /**< Outer VLAN TPID Setup. */
+	vlan_strip_queue_set_t     vlan_strip_queue_set; /**< VLAN Stripping on queue. */
+	vlan_offload_set_t         vlan_offload_set; /**< Set VLAN Offload. */
+	vlan_pvid_set_t            vlan_pvid_set; /**< Set port based TX VLAN insertion */
+	eth_queue_start_t          rx_queue_start;/**< Start RX for a queue.*/
+	eth_queue_stop_t           rx_queue_stop;/**< Stop RX for a queue.*/
+	eth_queue_start_t          tx_queue_start;/**< Start TX for a queue.*/
+	eth_queue_stop_t           tx_queue_stop;/**< Stop TX for a queue.*/
+	eth_rx_queue_setup_t       rx_queue_setup;/**< Set up device RX queue.*/
+	eth_queue_release_t        rx_queue_release;/**< Release RX queue.*/
+	eth_rx_queue_count_t       rx_queue_count; /**< Get Rx queue count. */
+	eth_rx_descriptor_done_t   rx_descriptor_done;  /**< Check rxd DD bit */
+	eth_tx_queue_setup_t       tx_queue_setup;/**< Set up device TX queue.*/
+	eth_queue_release_t        tx_queue_release;/**< Release TX queue.*/
+	eth_dev_led_on_t           dev_led_on;    /**< Turn on LED. */
+	eth_dev_led_off_t          dev_led_off;   /**< Turn off LED. */
+	flow_ctrl_get_t            flow_ctrl_get; /**< Get flow control. */
+	flow_ctrl_set_t            flow_ctrl_set; /**< Setup flow control. */
+	priority_flow_ctrl_set_t   priority_flow_ctrl_set; /**< Setup priority flow control.*/
+	eth_mac_addr_remove_t      mac_addr_remove; /**< Remove MAC address */
+	eth_mac_addr_add_t         mac_addr_add;  /**< Add a MAC address */
+	eth_uc_hash_table_set_t    uc_hash_table_set;  /**< Set Unicast Table Array */
+	eth_uc_all_hash_table_set_t uc_all_hash_table_set;  /**< Set Unicast hash bitmap */
+	eth_mirror_rule_set_t	   mirror_rule_set;  /**< Add a traffic mirror rule.*/
+	eth_mirror_rule_reset_t	   mirror_rule_reset;  /**< reset a traffic mirror rule.*/
+	eth_set_vf_rx_mode_t       set_vf_rx_mode;   /**< Set VF RX mode */
+	eth_set_vf_rx_t            set_vf_rx;  /**< enable/disable a VF receive */
+	eth_set_vf_tx_t            set_vf_tx;  /**< enable/disable a VF transmit */
+	eth_set_vf_vlan_filter_t   set_vf_vlan_filter;  /**< Set VF VLAN filter */
+	eth_udp_tunnel_add_t       udp_tunnel_add;
+	eth_udp_tunnel_del_t       udp_tunnel_del;
+	eth_set_queue_rate_limit_t set_queue_rate_limit;   /**< Set queue rate limit */
+	eth_set_vf_rate_limit_t    set_vf_rate_limit;   /**< Set VF rate limit */
+
+	/** Add a signature filter. */
+	fdir_add_signature_filter_t fdir_add_signature_filter;
+	/** Update a signature filter. */
+	fdir_update_signature_filter_t fdir_update_signature_filter;
+	/** Remove a signature filter. */
+	fdir_remove_signature_filter_t fdir_remove_signature_filter;
+	/** Get information about FDIR status. */
+	fdir_infos_get_t fdir_infos_get;
+	/** Add a perfect filter. */
+	fdir_add_perfect_filter_t fdir_add_perfect_filter;
+	/** Update a perfect filter. */
+	fdir_update_perfect_filter_t fdir_update_perfect_filter;
+	/** Remove a perfect filter. */
+	fdir_remove_perfect_filter_t fdir_remove_perfect_filter;
+	/** Setup masks for FDIR filtering. */
+	fdir_set_masks_t fdir_set_masks;
+	/** Update redirection table. */
+	reta_update_t reta_update;
+	/** Query redirection table. */
+	reta_query_t reta_query;
+  /* bypass control */
+#ifdef RTE_NIC_BYPASS
+  bypass_init_t bypass_init;
+  bypass_state_set_t bypass_state_set;
+  bypass_state_show_t bypass_state_show;
+  bypass_event_set_t bypass_event_set;
+  bypass_event_show_t bypass_event_show;
+  bypass_wd_timeout_set_t bypass_wd_timeout_set;
+  bypass_wd_timeout_show_t bypass_wd_timeout_show;
+  bypass_ver_show_t bypass_ver_show;
+  bypass_wd_reset_t bypass_wd_reset;
+#endif
+
+	/** Configure RSS hash protocols. */
+	rss_hash_update_t rss_hash_update;
+	/** Get current RSS hash configuration. */
+	rss_hash_conf_get_t rss_hash_conf_get;
+	eth_add_syn_filter_t           add_syn_filter;       /**< add syn filter. */
+	eth_remove_syn_filter_t        remove_syn_filter;    /**< remove syn filter. */
+	eth_get_syn_filter_t           get_syn_filter;       /**< get syn filter. */
+	eth_add_2tuple_filter_t        add_2tuple_filter;    /**< add 2tuple filter. */
+	eth_remove_2tuple_filter_t     remove_2tuple_filter; /**< remove 2tuple filter. */
+	eth_get_2tuple_filter_t        get_2tuple_filter;    /**< get 2tuple filter. */
+	eth_add_5tuple_filter_t        add_5tuple_filter;    /**< add 5tuple filter. */
+	eth_remove_5tuple_filter_t     remove_5tuple_filter; /**< remove 5tuple filter. */
+	eth_get_5tuple_filter_t        get_5tuple_filter;    /**< get 5tuple filter. */
+	eth_add_flex_filter_t          add_flex_filter;      /**< add flex filter. */
+	eth_remove_flex_filter_t       remove_flex_filter;   /**< remove flex filter. */
+	eth_get_flex_filter_t          get_flex_filter;      /**< get flex filter. */
+	eth_filter_ctrl_t              filter_ctrl;          /**< common filter control*/
+};
+
+/**
+ * @internal
+ * The generic data structure associated with each ethernet device.
+ *
+ * Pointers to burst-oriented packet receive and transmit functions are
+ * located at the beginning of the structure, along with the pointer to
+ * where all the data elements for the particular device are stored in shared
+ * memory. This split allows the function pointer and driver data to be per-
+ * process, while the actual configuration data for the device is shared.
+ */
+struct rte_eth_dev {
+	eth_rx_burst_t rx_pkt_burst; /**< Pointer to PMD receive function. */
+	eth_tx_burst_t tx_pkt_burst; /**< Pointer to PMD transmit function. */
+	struct rte_eth_dev_data *data;  /**< Pointer to device data */
+	const struct eth_driver *driver;/**< Driver for this device */
+	struct eth_dev_ops *dev_ops;    /**< Functions exported by PMD */
+	struct rte_pci_device *pci_dev; /**< PCI info. supplied by probing */
+	struct rte_eth_dev_cb_list callbacks; /**< User application callbacks */
+};
+
+struct rte_eth_dev_sriov {
+	uint8_t active;               /**< SRIOV is active with 16, 32 or 64 pools */
+	uint8_t nb_q_per_pool;        /**< rx queue number per pool */
+	uint16_t def_vmdq_idx;        /**< Default pool num used for PF */
+	uint16_t def_pool_q_idx;      /**< Default pool queue start reg index */
+};
+#define RTE_ETH_DEV_SRIOV(dev)         ((dev)->data->sriov)
+
+#define RTE_ETH_NAME_MAX_LEN (32)
+
+/**
+ * @internal
+ * The data part, with no function pointers, associated with each ethernet device.
+ *
+ * This structure is safe to place in shared memory to be common among different
+ * processes in a multi-process configuration.
+ */
+struct rte_eth_dev_data {
+	char name[RTE_ETH_NAME_MAX_LEN]; /**< Unique identifier name */
+
+	void **rx_queues; /**< Array of pointers to RX queues. */
+	void **tx_queues; /**< Array of pointers to TX queues. */
+	uint16_t nb_rx_queues; /**< Number of RX queues. */
+	uint16_t nb_tx_queues; /**< Number of TX queues. */
+
+	struct rte_eth_dev_sriov sriov;    /**< SRIOV data */
+
+	void *dev_private;              /**< PMD-specific private data */
+
+	struct rte_eth_link dev_link;
+	/**< Link-level information & status */
+
+	struct rte_eth_conf dev_conf;   /**< Configuration applied to device. */
+	uint16_t mtu;                   /**< Maximum Transmission Unit. */
+
+	uint32_t min_rx_buf_size;
+	/**< Common rx buffer size handled by all queues */
+
+	uint64_t rx_mbuf_alloc_failed; /**< RX ring mbuf allocation failures. */
+	struct ether_addr* mac_addrs;/**< Device Ethernet Link address. */
+	uint64_t mac_pool_sel[ETH_NUM_RECEIVE_MAC_ADDR];
+	/** bitmap array of associating Ethernet MAC addresses to pools */
+	struct ether_addr* hash_mac_addrs;
+	/** Device Ethernet MAC addresses of hash filtering. */
+	uint16_t port_id;           /**< Device [external] port identifier. */
+	uint8_t promiscuous   : 1, /**< RX promiscuous mode ON(1) / OFF(0). */
+		scattered_rx : 1,  /**< RX of scattered packets is ON(1) / OFF(0) */
+		all_multicast : 1, /**< RX all multicast mode ON(1) / OFF(0). */
+		dev_started : 1;   /**< Device state: STARTED(1) / STOPPED(0). */
+};
+
+/**
+ * @internal
+ * The pool of *rte_eth_dev* structures. The size of the pool
+ * is configured at compile-time in the <rte_ethdev.c> file.
+ */
+extern struct rte_eth_dev rte_eth_devices[];
+
+/**
+ * Get the total number of Ethernet devices that have been successfully
+ * initialized by the [matching] Ethernet driver during the PCI probing phase.
+ * All devices whose port identifier is in the range
+ * [0,  rte_eth_dev_count() - 1] can be operated on by network applications.
+ *
+ * @return
+ *   - The total number of usable Ethernet devices.
+ */
+extern uint16_t rte_eth_dev_count(void);
+
+/**
+ * Function for internal use by dummy drivers primarily, e.g. ring-based
+ * driver.
+ * Allocates a new ethdev slot for an ethernet device and returns the pointer
+ * to that slot for the driver to use.
+ *
+ * @param	name	Unique identifier name for each Ethernet device
+ * @return
+ *   - Slot in the rte_dev_devices array for a new device;
+ */
+struct rte_eth_dev *rte_eth_dev_allocate(const char *name);
+
+struct eth_driver;
+/**
+ * @internal
+ * Initialization function of an Ethernet driver invoked for each matching
+ * Ethernet PCI device detected during the PCI probing phase.
+ *
+ * @param eth_drv
+ *   The pointer to the [matching] Ethernet driver structure supplied by
+ *   the PMD when it registered itself.
+ * @param eth_dev
+ *   The *eth_dev* pointer is the address of the *rte_eth_dev* structure
+ *   associated with the matching device and which have been [automatically]
+ *   allocated in the *rte_eth_devices* array.
+ *   The *eth_dev* structure is supplied to the driver initialization function
+ *   with the following fields already initialized:
+ *
+ *   - *pci_dev*: Holds the pointers to the *rte_pci_device* structure which
+ *     contains the generic PCI information of the matching device.
+ *
+ *   - *dev_private*: Holds a pointer to the device private data structure.
+ *
+ *   - *mtu*: Contains the default Ethernet maximum frame length (1500).
+ *
+ *   - *port_id*: Contains the port index of the device (actually the index
+ *     of the *eth_dev* structure in the *rte_eth_devices* array).
+ *
+ * @return
+ *   - 0: Success, the device is properly initialized by the driver.
+ *        In particular, the driver MUST have set up the *dev_ops* pointer
+ *        of the *eth_dev* structure.
+ *   - <0: Error code of the device initialization failure.
+ */
+typedef int (*eth_dev_init_t)(struct eth_driver  *eth_drv,
+			      struct rte_eth_dev *eth_dev);
+
+/**
+ * @internal
+ * The structure associated with a PMD Ethernet driver.
+ *
+ * Each Ethernet driver acts as a PCI driver and is represented by a generic
+ * *eth_driver* structure that holds:
+ *
+ * - An *rte_pci_driver* structure (which must be the first field).
+ *
+ * - The *eth_dev_init* function invoked for each matching PCI device.
+ *
+ * - The size of the private data to allocate for each matching device.
+ */
+struct eth_driver {
+	struct rte_pci_driver pci_drv;    /**< The PMD is also a PCI driver. */
+	eth_dev_init_t eth_dev_init;      /**< Device init function. */
+	unsigned int dev_private_size;    /**< Size of device private data. */
+};
+
+/**
+ * @internal
+ * A function invoked by the initialization function of an Ethernet driver
+ * to simultaneously register itself as a PCI driver and as an Ethernet
+ * Poll Mode Driver (PMD).
+ *
+ * @param eth_drv
+ *   The pointer to the *eth_driver* structure associated with
+ *   the Ethernet driver.
+ */
+extern void rte_eth_driver_register(struct eth_driver *eth_drv);
+
+/**
+ * Configure an Ethernet device.
+ * This function must be invoked first before any other function in the
+ * Ethernet API. This function can also be re-invoked when a device is in the
+ * stopped state.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device to configure.
+ * @param nb_rx_queue
+ *   The number of receive queues to set up for the Ethernet device.
+ * @param nb_tx_queue
+ *   The number of transmit queues to set up for the Ethernet device.
+ * @param eth_conf
+ *   The pointer to the configuration data to be used for the Ethernet device.
+ *   The *rte_eth_conf* structure includes:
+ *     -  the hardware offload features to activate, with dedicated fields for
+ *        each statically configurable offload hardware feature provided by
+ *        Ethernet devices, such as IP checksum or VLAN tag stripping for
+ *        example.
+ *     - the Receive Side Scaling (RSS) configuration when using multiple RX
+ *         queues per port.
+ *
+ *   Embedding all configuration information in a single data structure
+ *   is the more flexible method that allows the addition of new features
+ *   without changing the syntax of the API.
+ * @return
+ *   - 0: Success, device configured.
+ *   - <0: Error code returned by the driver configuration function.
+ */
+extern int rte_eth_dev_configure(uint16_t port_id,
+				 uint16_t nb_rx_queue,
+				 uint16_t nb_tx_queue,
+				 const struct rte_eth_conf *eth_conf);
+
+/**
+ * Allocate and set up a receive queue for an Ethernet device.
+ *
+ * The function allocates a contiguous block of memory for *nb_rx_desc*
+ * receive descriptors from a memory zone associated with *socket_id*
+ * and initializes each receive descriptor with a network buffer allocated
+ * from the memory pool *mb_pool*.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param rx_queue_id
+ *   The index of the receive queue to set up.
+ *   The value must be in the range [0, nb_rx_queue - 1] previously supplied
+ *   to rte_eth_dev_configure().
+ * @param nb_rx_desc
+ *   The number of receive descriptors to allocate for the receive ring.
+ * @param socket_id
+ *   The *socket_id* argument is the socket identifier in case of NUMA.
+ *   The value can be *SOCKET_ID_ANY* if there is no NUMA constraint for
+ *   the DMA memory allocated for the receive descriptors of the ring.
+ * @param rx_conf
+ *   The pointer to the configuration data to be used for the receive queue.
+ *   NULL value is allowed, in which case default RX configuration
+ *   will be used.
+ *   The *rx_conf* structure contains an *rx_thresh* structure with the values
+ *   of the Prefetch, Host, and Write-Back threshold registers of the receive
+ *   ring.
+ * @param mb_pool
+ *   The pointer to the memory pool from which to allocate *rte_mbuf* network
+ *   memory buffers to populate each descriptor of the receive ring.
+ * @return
+ *   - 0: Success, receive queue correctly set up.
+ *   - -EINVAL: The size of network buffers which can be allocated from the
+ *      memory pool does not fit the various buffer sizes allowed by the
+ *      device controller.
+ *   - -ENOMEM: Unable to allocate the receive ring descriptors or to
+ *      allocate network memory buffers from the memory pool when
+ *      initializing receive descriptors.
+ */
+extern int rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
+				  uint16_t nb_rx_desc, unsigned int socket_id,
+				  const struct rte_eth_rxconf *rx_conf,
+				  struct rte_mempool *mb_pool);
+
+/**
+ * Allocate and set up a transmit queue for an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param tx_queue_id
+ *   The index of the transmit queue to set up.
+ *   The value must be in the range [0, nb_tx_queue - 1] previously supplied
+ *   to rte_eth_dev_configure().
+ * @param nb_tx_desc
+ *   The number of transmit descriptors to allocate for the transmit ring.
+ * @param socket_id
+ *   The *socket_id* argument is the socket identifier in case of NUMA.
+ *   Its value can be *SOCKET_ID_ANY* if there is no NUMA constraint for
+ *   the DMA memory allocated for the transmit descriptors of the ring.
+ * @param tx_conf
+ *   The pointer to the configuration data to be used for the transmit queue.
+ *   NULL value is allowed, in which case default RX configuration
+ *   will be used.
+ *   The *tx_conf* structure contains the following data:
+ *   - The *tx_thresh* structure with the values of the Prefetch, Host, and
+ *     Write-Back threshold registers of the transmit ring.
+ *     When setting Write-Back threshold to the value greater then zero,
+ *     *tx_rs_thresh* value should be explicitly set to one.
+ *   - The *tx_free_thresh* value indicates the [minimum] number of network
+ *     buffers that must be pending in the transmit ring to trigger their
+ *     [implicit] freeing by the driver transmit function.
+ *   - The *tx_rs_thresh* value indicates the [minimum] number of transmit
+ *     descriptors that must be pending in the transmit ring before setting the
+ *     RS bit on a descriptor by the driver transmit function.
+ *     The *tx_rs_thresh* value should be less or equal then
+ *     *tx_free_thresh* value, and both of them should be less then
+ *     *nb_tx_desc* - 3.
+ *   - The *txq_flags* member contains flags to pass to the TX queue setup
+ *     function to configure the behavior of the TX queue. This should be set
+ *     to 0 if no special configuration is required.
+ *
+ *     Note that setting *tx_free_thresh* or *tx_rs_thresh* value to 0 forces
+ *     the transmit function to use default values.
+ * @return
+ *   - 0: Success, the transmit queue is correctly set up.
+ *   - -ENOMEM: Unable to allocate the transmit ring descriptors.
+ */
+extern int rte_eth_tx_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
+				  uint16_t nb_tx_desc, unsigned int socket_id,
+				  const struct rte_eth_txconf *tx_conf);
+
+/*
+ * Return the NUMA socket to which an Ethernet device is connected
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device
+ * @return
+ *   The NUMA socket id to which the Ethernet device is connected or
+ *   a default of zero if the socket could not be determined.
+ *   -1 is returned is the port_id value is out of range.
+ */
+extern int rte_eth_dev_socket_id(uint16_t port_id);
+
+/*
+ * Allocate mbuf from mempool, setup the DMA physical address
+ * and then start RX for specified queue of a port. It is used
+ * when rx_deferred_start flag of the specified queue is true.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device
+ * @param rx_queue_id
+ *   The index of the rx queue to update the ring.
+ *   The value must be in the range [0, nb_rx_queue - 1] previously supplied
+ *   to rte_eth_dev_configure().
+ * @return
+ *   - 0: Success, the transmit queue is correctly set up.
+ *   - -EINVAL: The port_id or the queue_id out of range.
+ *   - -ENOTSUP: The function not supported in PMD driver.
+ */
+extern int rte_eth_dev_rx_queue_start(uint16_t port_id, uint16_t rx_queue_id);
+
+/*
+ * Stop specified RX queue of a port
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device
+ * @param rx_queue_id
+ *   The index of the rx queue to update the ring.
+ *   The value must be in the range [0, nb_rx_queue - 1] previously supplied
+ *   to rte_eth_dev_configure().
+ * @return
+ *   - 0: Success, the transmit queue is correctly set up.
+ *   - -EINVAL: The port_id or the queue_id out of range.
+ *   - -ENOTSUP: The function not supported in PMD driver.
+ */
+extern int rte_eth_dev_rx_queue_stop(uint16_t port_id, uint16_t rx_queue_id);
+
+/*
+ * Start TX for specified queue of a port. It is used when tx_deferred_start
+ * flag of the specified queue is true.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device
+ * @param tx_queue_id
+ *   The index of the tx queue to update the ring.
+ *   The value must be in the range [0, nb_tx_queue - 1] previously supplied
+ *   to rte_eth_dev_configure().
+ * @return
+ *   - 0: Success, the transmit queue is correctly set up.
+ *   - -EINVAL: The port_id or the queue_id out of range.
+ *   - -ENOTSUP: The function not supported in PMD driver.
+ */
+extern int rte_eth_dev_tx_queue_start(uint16_t port_id, uint16_t tx_queue_id);
+
+/*
+ * Stop specified TX queue of a port
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device
+ * @param tx_queue_id
+ *   The index of the tx queue to update the ring.
+ *   The value must be in the range [0, nb_tx_queue - 1] previously supplied
+ *   to rte_eth_dev_configure().
+ * @return
+ *   - 0: Success, the transmit queue is correctly set up.
+ *   - -EINVAL: The port_id or the queue_id out of range.
+ *   - -ENOTSUP: The function not supported in PMD driver.
+ */
+extern int rte_eth_dev_tx_queue_stop(uint16_t port_id, uint16_t tx_queue_id);
+
+
+
+/**
+ * Start an Ethernet device.
+ *
+ * The device start step is the last one and consists of setting the configured
+ * offload features and in starting the transmit and the receive units of the
+ * device.
+ * On success, all basic functions exported by the Ethernet API (link status,
+ * receive/transmit, and so on) can be invoked.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @return
+ *   - 0: Success, Ethernet device started.
+ *   - <0: Error code of the driver device start function.
+ */
+extern int rte_eth_dev_start(uint16_t port_id);
+
+/**
+ * Stop an Ethernet device. The device can be restarted with a call to
+ * rte_eth_dev_start()
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ */
+extern void rte_eth_dev_stop(uint16_t port_id);
+
+
+/**
+ * Link up an Ethernet device.
+ *
+ * Set device link up will re-enable the device rx/tx
+ * functionality after it is previously set device linked down.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @return
+ *   - 0: Success, Ethernet device linked up.
+ *   - <0: Error code of the driver device link up function.
+ */
+extern int rte_eth_dev_set_link_up(uint16_t port_id);
+
+/**
+ * Link down an Ethernet device.
+ * The device rx/tx functionality will be disabled if success,
+ * and it can be re-enabled with a call to
+ * rte_eth_dev_set_link_up()
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ */
+extern int rte_eth_dev_set_link_down(uint16_t port_id);
+
+/**
+ * Close an Ethernet device. The device cannot be restarted!
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ */
+extern void rte_eth_dev_close(uint16_t port_id);
+
+/**
+ * Enable receipt in promiscuous mode for an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ */
+extern void rte_eth_promiscuous_enable(uint16_t port_id);
+
+/**
+ * Disable receipt in promiscuous mode for an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ */
+extern void rte_eth_promiscuous_disable(uint16_t port_id);
+
+/**
+ * Return the value of promiscuous mode for an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @return
+ *   - (1) if promiscuous is enabled
+ *   - (0) if promiscuous is disabled.
+ *   - (-1) on error
+ */
+extern int rte_eth_promiscuous_get(uint16_t port_id);
+
+/**
+ * Enable the receipt of any multicast frame by an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ */
+extern void rte_eth_allmulticast_enable(uint16_t port_id);
+
+/**
+ * Disable the receipt of all multicast frames by an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ */
+extern void rte_eth_allmulticast_disable(uint16_t port_id);
+
+/**
+ * Return the value of allmulticast mode for an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @return
+ *   - (1) if allmulticast is enabled
+ *   - (0) if allmulticast is disabled.
+ *   - (-1) on error
+ */
+extern int rte_eth_allmulticast_get(uint16_t port_id);
+
+/**
+ * Retrieve the status (ON/OFF), the speed (in Mbps) and the mode (HALF-DUPLEX
+ * or FULL-DUPLEX) of the physical link of an Ethernet device. It might need
+ * to wait up to 9 seconds in it.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param link
+ *   A pointer to an *rte_eth_link* structure to be filled with
+ *   the status, the speed and the mode of the Ethernet device link.
+ */
+extern void rte_eth_link_get(uint16_t port_id, struct rte_eth_link *link);
+
+/**
+ * Retrieve the status (ON/OFF), the speed (in Mbps) and the mode (HALF-DUPLEX
+ * or FULL-DUPLEX) of the physical link of an Ethernet device. It is a no-wait
+ * version of rte_eth_link_get().
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param link
+ *   A pointer to an *rte_eth_link* structure to be filled with
+ *   the status, the speed and the mode of the Ethernet device link.
+ */
+extern void rte_eth_link_get_nowait(uint16_t port_id,
+				struct rte_eth_link *link);
+
+/**
+ * Retrieve the general I/O statistics of an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param stats
+ *   A pointer to a structure of type *rte_eth_stats* to be filled with
+ *   the values of device counters for the following set of statistics:
+ *   - *ipackets* with the total of successfully received packets.
+ *   - *opackets* with the total of successfully transmitted packets.
+ *   - *ibytes*   with the total of successfully received bytes.
+ *   - *obytes*   with the total of successfully transmitted bytes.
+ *   - *ierrors*  with the total of erroneous received packets.
+ *   - *oerrors*  with the total of failed transmitted packets.
+ */
+extern void rte_eth_stats_get(uint16_t port_id, struct rte_eth_stats *stats);
+
+/**
+ * Reset the general I/O statistics of an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ */
+extern void rte_eth_stats_reset(uint16_t port_id);
+
+/**
+ * Retrieve extended statistics of an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param xstats
+ *   A pointer to a table of structure of type *rte_eth_xstats*
+ *   to be filled with device statistics names and values.
+ *   This parameter can be set to NULL if n is 0.
+ * @param n
+ *   The size of the stats table, which should be large enough to store
+ *   all the statistics of the device.
+ * @return
+ *   - positive value lower or equal to n: success. The return value
+ *     is the number of entries filled in the stats table.
+ *   - positive value higher than n: error, the given statistics table
+ *     is too small. The return value corresponds to the size that should
+ *     be given to succeed. The entries in the table are not valid and
+ *     shall not be used by the caller.
+ *   - negative value on error (invalid port id)
+ */
+extern int rte_eth_xstats_get(uint16_t port_id,
+	struct rte_eth_xstats *xstats, unsigned n);
+
+/**
+ * Reset extended statistics of an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ */
+extern void rte_eth_xstats_reset(uint16_t port_id);
+
+/**
+ *  Set a mapping for the specified transmit queue to the specified per-queue
+ *  statistics counter.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param tx_queue_id
+ *   The index of the transmit queue for which a queue stats mapping is required.
+ *   The value must be in the range [0, nb_tx_queue - 1] previously supplied
+ *   to rte_eth_dev_configure().
+ * @param stat_idx
+ *   The per-queue packet statistics functionality number that the transmit
+ *   queue is to be assigned.
+ *   The value must be in the range [0, RTE_MAX_ETHPORT_QUEUE_STATS_MAPS - 1].
+ * @return
+ *   Zero if successful. Non-zero otherwise.
+ */
+extern int rte_eth_dev_set_tx_queue_stats_mapping(uint16_t port_id,
+						  uint16_t tx_queue_id,
+						  uint8_t stat_idx);
+
+/**
+ *  Set a mapping for the specified receive queue to the specified per-queue
+ *  statistics counter.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param rx_queue_id
+ *   The index of the receive queue for which a queue stats mapping is required.
+ *   The value must be in the range [0, nb_rx_queue - 1] previously supplied
+ *   to rte_eth_dev_configure().
+ * @param stat_idx
+ *   The per-queue packet statistics functionality number that the receive
+ *   queue is to be assigned.
+ *   The value must be in the range [0, RTE_MAX_ETHPORT_QUEUE_STATS_MAPS - 1].
+ * @return
+ *   Zero if successful. Non-zero otherwise.
+ */
+extern int rte_eth_dev_set_rx_queue_stats_mapping(uint16_t port_id,
+						  uint16_t rx_queue_id,
+						  uint8_t stat_idx);
+
+/**
+ * Retrieve the Ethernet address of an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param mac_addr
+ *   A pointer to a structure of type *ether_addr* to be filled with
+ *   the Ethernet address of the Ethernet device.
+ */
+extern void rte_eth_macaddr_get(uint16_t port_id, struct ether_addr *mac_addr);
+
+/**
+ * Retrieve the contextual information of an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param dev_info
+ *   A pointer to a structure of type *rte_eth_dev_info* to be filled with
+ *   the contextual information of the Ethernet device.
+ */
+extern void rte_eth_dev_info_get(uint16_t port_id,
+				 struct rte_eth_dev_info *dev_info);
+
+/**
+ * Retrieve the MTU of an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param mtu
+ *   A pointer to a uint16_t where the retrieved MTU is to be stored.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if *port_id* invalid.
+ */
+extern int rte_eth_dev_get_mtu(uint16_t port_id, uint16_t *mtu);
+
+/**
+ * Change the MTU of an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param mtu
+ *   A uint16_t for the MTU to be applied.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if operation is not supported.
+ *   - (-ENODEV) if *port_id* invalid.
+ *   - (-EINVAL) if *mtu* invalid.
+ */
+extern int rte_eth_dev_set_mtu(uint16_t port_id, uint16_t mtu);
+
+/**
+ * Enable/Disable hardware filtering by an Ethernet device of received
+ * VLAN packets tagged with a given VLAN Tag Identifier.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param vlan_id
+ *   The VLAN Tag Identifier whose filtering must be enabled or disabled.
+ * @param on
+ *   If > 0, enable VLAN filtering of VLAN packets tagged with *vlan_id*.
+ *   Otherwise, disable VLAN filtering of VLAN packets tagged with *vlan_id*.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOSUP) if hardware-assisted VLAN filtering not configured.
+ *   - (-ENODEV) if *port_id* invalid.
+ *   - (-ENOSYS) if VLAN filtering on *port_id* disabled.
+ *   - (-EINVAL) if *vlan_id* > 4095.
+ */
+extern int rte_eth_dev_vlan_filter(uint16_t port_id, uint16_t vlan_id , int on);
+
+/**
+ * Enable/Disable hardware VLAN Strip by a rx queue of an Ethernet device.
+ * 82599/X540/X550 can support VLAN stripping at the rx queue level
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param rx_queue_id
+ *   The index of the receive queue for which a queue stats mapping is required.
+ *   The value must be in the range [0, nb_rx_queue - 1] previously supplied
+ *   to rte_eth_dev_configure().
+ * @param on
+ *   If 1, Enable VLAN Stripping of the receive queue of the Ethernet port.
+ *   If 0, Disable VLAN Stripping of the receive queue of the Ethernet port.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOSUP) if hardware-assisted VLAN stripping not configured.
+ *   - (-ENODEV) if *port_id* invalid.
+ *   - (-EINVAL) if *rx_queue_id* invalid.
+ */
+extern int rte_eth_dev_set_vlan_strip_on_queue(uint16_t port_id,
+		uint16_t rx_queue_id, int on);
+
+/**
+ * Set the Outer VLAN Ether Type by an Ethernet device, it can be inserted to
+ * the VLAN Header. This is a register setup available on some Intel NIC, not
+ * but all, please check the data sheet for availability.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param tag_type
+ *   The Tag Protocol ID
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOSUP) if hardware-assisted VLAN TPID setup is not supported.
+ *   - (-ENODEV) if *port_id* invalid.
+ */
+extern int rte_eth_dev_set_vlan_ether_type(uint16_t port_id, uint16_t tag_type);
+
+/**
+ * Set VLAN offload configuration on an Ethernet device
+ * Enable/Disable Extended VLAN by an Ethernet device, This is a register setup
+ * available on some Intel NIC, not but all, please check the data sheet for
+ * availability.
+ * Enable/Disable VLAN Strip can be done on rx queue for certain NIC, but here
+ * the configuration is applied on the port level.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param offload_mask
+ *   The VLAN Offload bit mask can be mixed use with "OR"
+ *       ETH_VLAN_STRIP_OFFLOAD
+ *       ETH_VLAN_FILTER_OFFLOAD
+ *       ETH_VLAN_EXTEND_OFFLOAD
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOSUP) if hardware-assisted VLAN filtering not configured.
+ *   - (-ENODEV) if *port_id* invalid.
+ */
+extern int rte_eth_dev_set_vlan_offload(uint16_t port_id, int offload_mask);
+
+/**
+ * Read VLAN Offload configuration from an Ethernet device
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @return
+ *   - (>0) if successful. Bit mask to indicate
+ *       ETH_VLAN_STRIP_OFFLOAD
+ *       ETH_VLAN_FILTER_OFFLOAD
+ *       ETH_VLAN_EXTEND_OFFLOAD
+ *   - (-ENODEV) if *port_id* invalid.
+ */
+extern int rte_eth_dev_get_vlan_offload(uint16_t port_id);
+
+/**
+ * Set port based TX VLAN insersion on or off.
+ *
+ * @param port_id
+ *  The port identifier of the Ethernet device.
+ * @param pvid
+ *  Port based TX VLAN identifier togeth with user priority.
+ * @param on
+ *  Turn on or off the port based TX VLAN insertion.
+ *
+ * @return
+ *   - (0) if successful.
+ *   - negative if failed.
+ */
+extern int rte_eth_dev_set_vlan_pvid(uint16_t port_id, uint16_t pvid, int on);
+
+/**
+ *
+ * Retrieve a burst of input packets from a receive queue of an Ethernet
+ * device. The retrieved packets are stored in *rte_mbuf* structures whose
+ * pointers are supplied in the *rx_pkts* array.
+ *
+ * The rte_eth_rx_burst() function loops, parsing the RX ring of the
+ * receive queue, up to *nb_pkts* packets, and for each completed RX
+ * descriptor in the ring, it performs the following operations:
+ *
+ * - Initialize the *rte_mbuf* data structure associated with the
+ *   RX descriptor according to the information provided by the NIC into
+ *   that RX descriptor.
+ *
+ * - Store the *rte_mbuf* data structure into the next entry of the
+ *   *rx_pkts* array.
+ *
+ * - Replenish the RX descriptor with a new *rte_mbuf* buffer
+ *   allocated from the memory pool associated with the receive queue at
+ *   initialization time.
+ *
+ * When retrieving an input packet that was scattered by the controller
+ * into multiple receive descriptors, the rte_eth_rx_burst() function
+ * appends the associated *rte_mbuf* buffers to the first buffer of the
+ * packet.
+ *
+ * The rte_eth_rx_burst() function returns the number of packets
+ * actually retrieved, which is the number of *rte_mbuf* data structures
+ * effectively supplied into the *rx_pkts* array.
+ * A return value equal to *nb_pkts* indicates that the RX queue contained
+ * at least *rx_pkts* packets, and this is likely to signify that other
+ * received packets remain in the input queue. Applications implementing
+ * a "retrieve as much received packets as possible" policy can check this
+ * specific case and keep invoking the rte_eth_rx_burst() function until
+ * a value less than *nb_pkts* is returned.
+ *
+ * This receive method has the following advantages:
+ *
+ * - It allows a run-to-completion network stack engine to retrieve and
+ *   to immediately process received packets in a fast burst-oriented
+ *   approach, avoiding the overhead of unnecessary intermediate packet
+ *   queue/dequeue operations.
+ *
+ * - Conversely, it also allows an asynchronous-oriented processing
+ *   method to retrieve bursts of received packets and to immediately
+ *   queue them for further parallel processing by another logical core,
+ *   for instance. However, instead of having received packets being
+ *   individually queued by the driver, this approach allows the invoker
+ *   of the rte_eth_rx_burst() function to queue a burst of retrieved
+ *   packets at a time and therefore dramatically reduce the cost of
+ *   enqueue/dequeue operations per packet.
+ *
+ * - It allows the rte_eth_rx_burst() function of the driver to take
+ *   advantage of burst-oriented hardware features (CPU cache,
+ *   prefetch instructions, and so on) to minimize the number of CPU
+ *   cycles per packet.
+ *
+ * To summarize, the proposed receive API enables many
+ * burst-oriented optimizations in both synchronous and asynchronous
+ * packet processing environments with no overhead in both cases.
+ *
+ * The rte_eth_rx_burst() function does not provide any error
+ * notification to avoid the corresponding overhead. As a hint, the
+ * upper-level application might check the status of the device link once
+ * being systematically returned a 0 value for a given number of tries.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param queue_id
+ *   The index of the receive queue from which to retrieve input packets.
+ *   The value must be in the range [0, nb_rx_queue - 1] previously supplied
+ *   to rte_eth_dev_configure().
+ * @param rx_pkts
+ *   The address of an array of pointers to *rte_mbuf* structures that
+ *   must be large enough to store *nb_pkts* pointers in it.
+ * @param nb_pkts
+ *   The maximum number of packets to retrieve.
+ * @return
+ *   The number of packets actually retrieved, which is the number
+ *   of pointers to *rte_mbuf* structures effectively supplied to the
+ *   *rx_pkts* array.
+ */
+#ifdef RTE_LIBRTE_ETHDEV_DEBUG
+extern uint16_t rte_eth_rx_burst(uint16_t port_id, uint16_t queue_id,
+				 struct rte_mbuf **rx_pkts, uint16_t nb_pkts);
+#else
+static inline uint16_t
+rte_eth_rx_burst(uint16_t port_id, uint16_t queue_id,
+		 struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
+{
+	struct rte_eth_dev *dev;
+
+	dev = &rte_eth_devices[port_id];
+	return (*dev->rx_pkt_burst)(dev->data->rx_queues[queue_id], rx_pkts, nb_pkts);
+}
+#endif
+
+/**
+ * Get the number of used descriptors in a specific queue
+ *
+ * @param port_id
+ *  The port identifier of the Ethernet device.
+ * @param queue_id
+ *  The queue id on the specific port.
+ * @return
+ *  The number of used descriptors in the specific queue.
+ */
+#ifdef RTE_LIBRTE_ETHDEV_DEBUG
+extern uint32_t rte_eth_rx_queue_count(uint16_t port_id, uint16_t queue_id);
+#else
+static inline uint32_t
+rte_eth_rx_queue_count(uint16_t port_id, uint16_t queue_id)
+{
+        struct rte_eth_dev *dev;
+
+        dev = &rte_eth_devices[port_id];
+        return (*dev->dev_ops->rx_queue_count)(dev, queue_id);
+}
+#endif
+
+/**
+ * Check if the DD bit of the specific RX descriptor in the queue has been set
+ *
+ * @param port_id
+ *  The port identifier of the Ethernet device.
+ * @param queue_id
+ *  The queue id on the specific port.
+ * @offset
+ *  The offset of the descriptor ID from tail.
+ * @return
+ *  - (1) if the specific DD bit is set.
+ *  - (0) if the specific DD bit is not set.
+ *  - (-ENODEV) if *port_id* invalid.
+ */
+#ifdef RTE_LIBRTE_ETHDEV_DEBUG
+extern int rte_eth_rx_descriptor_done(uint16_t port_id,
+				      uint16_t queue_id,
+				      uint16_t offset);
+#else
+static inline int
+rte_eth_rx_descriptor_done(uint16_t port_id, uint16_t queue_id, uint16_t offset)
+{
+	struct rte_eth_dev *dev;
+
+	dev = &rte_eth_devices[port_id];
+	return (*dev->dev_ops->rx_descriptor_done)( \
+		dev->data->rx_queues[queue_id], offset);
+}
+#endif
+
+/**
+ * Send a burst of output packets on a transmit queue of an Ethernet device.
+ *
+ * The rte_eth_tx_burst() function is invoked to transmit output packets
+ * on the output queue *queue_id* of the Ethernet device designated by its
+ * *port_id*.
+ * The *nb_pkts* parameter is the number of packets to send which are
+ * supplied in the *tx_pkts* array of *rte_mbuf* structures.
+ * The rte_eth_tx_burst() function loops, sending *nb_pkts* packets,
+ * up to the number of transmit descriptors available in the TX ring of the
+ * transmit queue.
+ * For each packet to send, the rte_eth_tx_burst() function performs
+ * the following operations:
+ *
+ * - Pick up the next available descriptor in the transmit ring.
+ *
+ * - Free the network buffer previously sent with that descriptor, if any.
+ *
+ * - Initialize the transmit descriptor with the information provided
+ *   in the *rte_mbuf data structure.
+ *
+ * In the case of a segmented packet composed of a list of *rte_mbuf* buffers,
+ * the rte_eth_tx_burst() function uses several transmit descriptors
+ * of the ring.
+ *
+ * The rte_eth_tx_burst() function returns the number of packets it
+ * actually sent. A return value equal to *nb_pkts* means that all packets
+ * have been sent, and this is likely to signify that other output packets
+ * could be immediately transmitted again. Applications that implement a
+ * "send as many packets to transmit as possible" policy can check this
+ * specific case and keep invoking the rte_eth_tx_burst() function until
+ * a value less than *nb_pkts* is returned.
+ *
+ * It is the responsibility of the rte_eth_tx_burst() function to
+ * transparently free the memory buffers of packets previously sent.
+ * This feature is driven by the *tx_free_thresh* value supplied to the
+ * rte_eth_dev_configure() function at device configuration time.
+ * When the number of previously sent packets reached the "minimum transmit
+ * packets to free" threshold, the rte_eth_tx_burst() function must
+ * [attempt to] free the *rte_mbuf*  buffers of those packets whose
+ * transmission was effectively completed.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param queue_id
+ *   The index of the transmit queue through which output packets must be
+ *   sent.
+ *   The value must be in the range [0, nb_tx_queue - 1] previously supplied
+ *   to rte_eth_dev_configure().
+ * @param tx_pkts
+ *   The address of an array of *nb_pkts* pointers to *rte_mbuf* structures
+ *   which contain the output packets.
+ * @param nb_pkts
+ *   The maximum number of packets to transmit.
+ * @return
+ *   The number of output packets actually stored in transmit descriptors of
+ *   the transmit ring. The return value can be less than the value of the
+ *   *tx_pkts* parameter when the transmit ring is full or has been filled up.
+ */
+#ifdef RTE_LIBRTE_ETHDEV_DEBUG
+extern uint16_t rte_eth_tx_burst(uint16_t port_id, uint16_t queue_id,
+				 struct rte_mbuf **tx_pkts, uint16_t nb_pkts);
+#else
+static inline uint16_t
+rte_eth_tx_burst(uint16_t port_id, uint16_t queue_id,
+		 struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
+{
+	struct rte_eth_dev *dev;
+
+	dev = &rte_eth_devices[port_id];
+	return (*dev->tx_pkt_burst)(dev->data->tx_queues[queue_id], tx_pkts, nb_pkts);
+}
+#endif
+
+/**
+ * Setup a new signature filter rule on an Ethernet device
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param fdir_filter
+ *   The pointer to the fdir filter structure describing the signature filter
+ *   rule.
+ *   The *rte_fdir_filter* structure includes the values of the different fields
+ *   to match: source and destination IP addresses, vlan id, flexbytes, source
+ *   and destination ports, and so on.
+ * @param rx_queue
+ *   The index of the RX queue where to store RX packets matching the added
+ *   signature filter defined in fdir_filter.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support flow director mode.
+ *   - (-ENODEV) if *port_id* invalid.
+ *   - (-ENOSYS) if the FDIR mode is not configured in signature mode
+ *               on *port_id*.
+ *   - (-EINVAL) if the fdir_filter information is not correct.
+ */
+int rte_eth_dev_fdir_add_signature_filter(uint16_t port_id,
+					  struct rte_fdir_filter *fdir_filter,
+					  uint8_t rx_queue);
+
+/**
+ * Update a signature filter rule on an Ethernet device.
+ * If the rule doesn't exits, it is created.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param fdir_ftr
+ *   The pointer to the structure describing the signature filter rule.
+ *   The *rte_fdir_filter* structure includes the values of the different fields
+ *   to match: source and destination IP addresses, vlan id, flexbytes, source
+ *   and destination ports, and so on.
+ * @param rx_queue
+ *   The index of the RX queue where to store RX packets matching the added
+ *   signature filter defined in fdir_ftr.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support flow director mode.
+ *   - (-ENODEV) if *port_id* invalid.
+ *   - (-ENOSYS) if the flow director mode is not configured in signature mode
+ *     on *port_id*.
+ *   - (-EINVAL) if the fdir_filter information is not correct.
+ */
+int rte_eth_dev_fdir_update_signature_filter(uint16_t port_id,
+					     struct rte_fdir_filter *fdir_ftr,
+					     uint8_t rx_queue);
+
+/**
+ * Remove a signature filter rule on an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param fdir_ftr
+ *   The pointer to the structure describing the signature filter rule.
+ *   The *rte_fdir_filter* structure includes the values of the different fields
+ *   to match: source and destination IP addresses, vlan id, flexbytes, source
+ *   and destination ports, and so on.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support flow director mode.
+ *   - (-ENODEV) if *port_id* invalid.
+ *   - (-ENOSYS) if the flow director mode is not configured in signature mode
+ *     on *port_id*.
+ *   - (-EINVAL) if the fdir_filter information is not correct.
+ */
+int rte_eth_dev_fdir_remove_signature_filter(uint16_t port_id,
+					     struct rte_fdir_filter *fdir_ftr);
+
+/**
+ * Retrieve the flow director information of an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param fdir
+ *   A pointer to a structure of type *rte_eth_dev_fdir* to be filled with
+ *   the flow director information of the Ethernet device.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support flow director mode.
+ *   - (-ENODEV) if *port_id* invalid.
+ *   - (-ENOSYS) if the flow director mode is not configured on *port_id*.
+ */
+int rte_eth_dev_fdir_get_infos(uint16_t port_id, struct rte_eth_fdir *fdir);
+
+/**
+ * Add a new perfect filter rule on an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param fdir_filter
+ *   The pointer to the structure describing the perfect filter rule.
+ *   The *rte_fdir_filter* structure includes the values of the different fields
+ *   to match: source and destination IP addresses, vlan id, flexbytes, source
+ *   and destination ports, and so on.
+ *   IPv6 are not supported.
+ * @param soft_id
+ *    The 16-bit value supplied in the field hash.fdir.id of mbuf for RX
+ *    packets matching the perfect filter.
+ * @param rx_queue
+ *   The index of the RX queue where to store RX packets matching the added
+ *   perfect filter defined in fdir_filter.
+ * @param drop
+ *    If drop is set to 1, matching RX packets are stored into the RX drop
+ *    queue defined in the rte_fdir_conf.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support flow director mode.
+ *   - (-ENODEV) if *port_id* invalid.
+ *   - (-ENOSYS) if the flow director mode is not configured in perfect mode
+ *               on *port_id*.
+ *   - (-EINVAL) if the fdir_filter information is not correct.
+ */
+int rte_eth_dev_fdir_add_perfect_filter(uint16_t port_id,
+					struct rte_fdir_filter *fdir_filter,
+					uint16_t soft_id, uint8_t rx_queue,
+					uint8_t drop);
+
+/**
+ * Update a perfect filter rule on an Ethernet device.
+ * If the rule doesn't exits, it is created.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param fdir_filter
+ *   The pointer to the structure describing the perfect filter rule.
+ *   The *rte_fdir_filter* structure includes the values of the different fields
+ *   to match: source and destination IP addresses, vlan id, flexbytes, source
+ *   and destination ports, and so on.
+ *   IPv6 are not supported.
+ * @param soft_id
+ *    The 16-bit value supplied in the field hash.fdir.id of mbuf for RX
+ *    packets matching the perfect filter.
+ * @param rx_queue
+ *   The index of the RX queue where to store RX packets matching the added
+ *   perfect filter defined in fdir_filter.
+ * @param drop
+ *    If drop is set to 1, matching RX packets are stored into the RX drop
+ *    queue defined in the rte_fdir_conf.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support flow director mode.
+ *   - (-ENODEV) if *port_id* invalid.
+ *   - (-ENOSYS) if the flow director mode is not configured in perfect mode
+ *      on *port_id*.
+ *   - (-EINVAL) if the fdir_filter information is not correct.
+ */
+int rte_eth_dev_fdir_update_perfect_filter(uint16_t port_id,
+					   struct rte_fdir_filter *fdir_filter,
+					   uint16_t soft_id, uint8_t rx_queue,
+					   uint8_t drop);
+
+/**
+ * Remove a perfect filter rule on an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param fdir_filter
+ *   The pointer to the structure describing the perfect filter rule.
+ *   The *rte_fdir_filter* structure includes the values of the different fields
+ *   to match: source and destination IP addresses, vlan id, flexbytes, source
+ *   and destination ports, and so on.
+ *   IPv6 are not supported.
+ * @param soft_id
+ *    The soft_id value provided when adding/updating the removed filter.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support flow director mode.
+ *   - (-ENODEV) if *port_id* invalid.
+ *   - (-ENOSYS) if the flow director mode is not configured in perfect mode
+ *      on *port_id*.
+ *   - (-EINVAL) if the fdir_filter information is not correct.
+ */
+int rte_eth_dev_fdir_remove_perfect_filter(uint16_t port_id,
+					   struct rte_fdir_filter *fdir_filter,
+					   uint16_t soft_id);
+/**
+ * Configure globally the masks for flow director mode for an Ethernet device.
+ * For example, the device can match packets with only the first 24 bits of
+ * the IPv4 source address.
+ *
+ * The following fields can be masked: IPv4 addresses and L4 port numbers.
+ * The following fields can be either enabled or disabled completely for the
+ * matching functionality: VLAN ID tag; VLAN Priority + CFI bit; Flexible 2-byte
+ * tuple.
+ * IPv6 masks are not supported.
+ *
+ * All filters must comply with the masks previously configured.
+ * For example, with a mask equal to 255.255.255.0 for the source IPv4 address,
+ * all IPv4 filters must be created with a source IPv4 address that fits the
+ * "X.X.X.0" format.
+ *
+ * This function flushes all filters that have been previously added in
+ * the device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param fdir_mask
+ *   The pointer to the fdir mask structure describing relevant headers fields
+ *   and relevant bits to use when matching packets addresses and ports.
+ *   IPv6 masks are not supported.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support flow director mode.
+ *   - (-ENODEV) if *port_id* invalid.
+ *   - (-ENOSYS) if the flow director mode is not configured in perfect
+ *      mode on *port_id*.
+ *   - (-EINVAL) if the fdir_filter information is not correct
+ */
+int rte_eth_dev_fdir_set_masks(uint16_t port_id,
+			       struct rte_fdir_masks *fdir_mask);
+
+/**
+ * The eth device event type for interrupt, and maybe others in the future.
+ */
+enum rte_eth_event_type {
+	RTE_ETH_EVENT_UNKNOWN,  /**< unknown event type */
+	RTE_ETH_EVENT_INTR_LSC, /**< lsc interrupt event */
+	RTE_ETH_EVENT_MAX       /**< max value of this enum */
+};
+
+typedef void (*rte_eth_dev_cb_fn)(uint16_t port_id, \
+		enum rte_eth_event_type event, void *cb_arg);
+/**< user application callback to be registered for interrupts */
+
+
+
+/**
+ * Register a callback function for specific port id.
+ *
+ * @param port_id
+ *  Port id.
+ * @param event
+ *  Event interested.
+ * @param cb_fn
+ *  User supplied callback function to be called.
+ * @param cb_arg
+ *  Pointer to the parameters for the registered callback.
+ *
+ * @return
+ *  - On success, zero.
+ *  - On failure, a negative value.
+ */
+int rte_eth_dev_callback_register(uint16_t port_id,
+			enum rte_eth_event_type event,
+		rte_eth_dev_cb_fn cb_fn, void *cb_arg);
+
+/**
+ * Unregister a callback function for specific port id.
+ *
+ * @param port_id
+ *  Port id.
+ * @param event
+ *  Event interested.
+ * @param cb_fn
+ *  User supplied callback function to be called.
+ * @param cb_arg
+ *  Pointer to the parameters for the registered callback. -1 means to
+ *  remove all for the same callback address and same event.
+ *
+ * @return
+ *  - On success, zero.
+ *  - On failure, a negative value.
+ */
+int rte_eth_dev_callback_unregister(uint16_t port_id,
+			enum rte_eth_event_type event,
+		rte_eth_dev_cb_fn cb_fn, void *cb_arg);
+
+/**
+ * @internal Executes all the user application registered callbacks for
+ * the specific device. It is for DPDK internal user only. User
+ * application should not call it directly.
+ *
+ * @param dev
+ *  Pointer to struct rte_eth_dev.
+ * @param event
+ *  Eth device interrupt event type.
+ *
+ * @return
+ *  void
+ */
+void _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
+				enum rte_eth_event_type event);
+
+/**
+ * Turn on the LED on the Ethernet device.
+ * This function turns on the LED on the Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if underlying hardware OR driver doesn't support
+ *     that operation.
+ *   - (-ENODEV) if *port_id* invalid.
+ */
+int  rte_eth_led_on(uint16_t port_id);
+
+/**
+ * Turn off the LED on the Ethernet device.
+ * This function turns off the LED on the Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if underlying hardware OR driver doesn't support
+ *     that operation.
+ *   - (-ENODEV) if *port_id* invalid.
+ */
+int  rte_eth_led_off(uint16_t port_id);
+
+/**
+ * Get current status of the Ethernet link flow control for Ethernet device
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param fc_conf
+ *   The pointer to the structure where to store the flow control parameters.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support flow control.
+ *   - (-ENODEV)  if *port_id* invalid.
+ */
+int rte_eth_dev_flow_ctrl_get(uint16_t port_id,
+			      struct rte_eth_fc_conf *fc_conf);
+
+/**
+ * Configure the Ethernet link flow control for Ethernet device
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param fc_conf
+ *   The pointer to the structure of the flow control parameters.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support flow control mode.
+ *   - (-ENODEV)  if *port_id* invalid.
+ *   - (-EINVAL)  if bad parameter
+ *   - (-EIO)     if flow control setup failure
+ */
+int rte_eth_dev_flow_ctrl_set(uint16_t port_id,
+			      struct rte_eth_fc_conf *fc_conf);
+
+/**
+ * Configure the Ethernet priority flow control under DCB environment
+ * for Ethernet device.
+ *
+ * @param port_id
+ * The port identifier of the Ethernet device.
+ * @param pfc_conf
+ * The pointer to the structure of the priority flow control parameters.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support priority flow control mode.
+ *   - (-ENODEV)  if *port_id* invalid.
+ *   - (-EINVAL)  if bad parameter
+ *   - (-EIO)     if flow control setup failure
+ */
+int rte_eth_dev_priority_flow_ctrl_set(uint16_t port_id,
+				struct rte_eth_pfc_conf *pfc_conf);
+
+/**
+ * Add a MAC address to an internal array of addresses used to enable whitelist
+ * filtering to accept packets only if the destination MAC address matches.
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param mac_addr
+ *   The MAC address to add.
+ * @param pool
+ *   VMDq pool index to associate address with (if VMDq is enabled). If VMDq is
+ *   not enabled, this should be set to 0.
+ * @return
+ *   - (0) if successfully added or *mac_addr" was already added.
+ *   - (-ENOTSUP) if hardware doesn't support this feature.
+ *   - (-ENODEV) if *port* is invalid.
+ *   - (-ENOSPC) if no more MAC addresses can be added.
+ *   - (-EINVAL) if MAC address is invalid.
+ */
+int rte_eth_dev_mac_addr_add(uint16_t port_id, struct ether_addr *mac_addr,
+				uint32_t pool);
+
+/**
+ * Remove a MAC address from the internal array of addresses.
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param mac_addr
+ *   MAC address to remove.
+ * @return
+ *   - (0) if successful, or *mac_addr* didn't exist.
+ *   - (-ENOTSUP) if hardware doesn't support.
+ *   - (-ENODEV) if *port* invalid.
+ *   - (-EADDRINUSE) if attempting to remove the default MAC address
+ */
+int rte_eth_dev_mac_addr_remove(uint16_t port_id, struct ether_addr *mac_addr);
+
+/**
+ * Update Redirection Table(RETA) of Receive Side Scaling of Ethernet device.
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param reta_conf
+ *   RETA to update.
+ * @param reta_size
+ *   Redirection table size. The table size can be queried by
+ *   rte_eth_dev_info_get().
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support.
+ *   - (-EINVAL) if bad parameter.
+ */
+int rte_eth_dev_rss_reta_update(uint16_t port_id,
+				struct rte_eth_rss_reta_entry64 *reta_conf,
+				uint16_t reta_size);
+
+ /**
+ * Query Redirection Table(RETA) of Receive Side Scaling of Ethernet device.
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param reta_conf
+ *   RETA to query.
+ * @param reta_size
+ *   Redirection table size. The table size can be queried by
+ *   rte_eth_dev_info_get().
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support.
+ *   - (-EINVAL) if bad parameter.
+ */
+int rte_eth_dev_rss_reta_query(uint16_t port_id,
+			       struct rte_eth_rss_reta_entry64 *reta_conf,
+			       uint16_t reta_size);
+
+ /**
+ * Updates unicast hash table for receiving packet with the given destination
+ * MAC address, and the packet is routed to all VFs for which the RX mode is
+ * accept packets that match the unicast hash table.
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param addr
+ *   Unicast MAC address.
+ * @param on
+ *    1 - Set an unicast hash bit for receiving packets with the MAC address.
+ *    0 - Clear an unicast hash bit.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support.
+  *  - (-ENODEV) if *port_id* invalid.
+ *   - (-EINVAL) if bad parameter.
+ */
+int rte_eth_dev_uc_hash_table_set(uint16_t port_id,struct ether_addr *addr,
+					uint8_t on);
+
+ /**
+ * Updates all unicast hash bitmaps for receiving packet with any Unicast
+ * Ethernet MAC addresses,the packet is routed to all VFs for which the RX
+ * mode is accept packets that match the unicast hash table.
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param on
+ *    1 - Set all unicast hash bitmaps for receiving all the Ethernet
+ *         MAC addresses
+ *    0 - Clear all unicast hash bitmaps
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support.
+  *  - (-ENODEV) if *port_id* invalid.
+ *   - (-EINVAL) if bad parameter.
+ */
+int rte_eth_dev_uc_all_hash_table_set(uint16_t port_id,uint8_t on);
+
+ /**
+ * Set RX L2 Filtering mode of a VF of an Ethernet device.
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param vf
+ *   VF id.
+ * @param rx_mode
+ *    The RX mode mask, which  is one or more of  accepting Untagged Packets,
+ *    packets that match the PFUTA table, Broadcast and Multicast Promiscuous.
+ *    ETH_VMDQ_ACCEPT_UNTAG,ETH_VMDQ_ACCEPT_HASH_UC,
+ *    ETH_VMDQ_ACCEPT_BROADCAST and ETH_VMDQ_ACCEPT_MULTICAST will be used
+ *    in rx_mode.
+ * @param on
+ *    1 - Enable a VF RX mode.
+ *    0 - Disable a VF RX mode.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support.
+ *   - (-ENOTSUP) if hardware doesn't support.
+ *   - (-EINVAL) if bad parameter.
+ */
+int rte_eth_dev_set_vf_rxmode(uint16_t port_id, uint16_t vf, uint16_t rx_mode,
+				uint8_t on);
+
+/**
+* Enable or disable a VF traffic transmit of the Ethernet device.
+*
+* @param port
+*   The port identifier of the Ethernet device.
+* @param vf
+*   VF id.
+* @param on
+*    1 - Enable a VF traffic transmit.
+*    0 - Disable a VF traffic transmit.
+* @return
+*   - (0) if successful.
+*   - (-ENODEV) if *port_id* invalid.
+*   - (-ENOTSUP) if hardware doesn't support.
+*   - (-EINVAL) if bad parameter.
+*/
+int
+rte_eth_dev_set_vf_tx(uint16_t port_id,uint16_t vf, uint8_t on);
+
+/**
+* Enable or disable a VF traffic receive of an Ethernet device.
+*
+* @param port
+*   The port identifier of the Ethernet device.
+* @param vf
+*   VF id.
+* @param on
+*    1 - Enable a VF traffic receive.
+*    0 - Disable a VF traffic receive.
+* @return
+*   - (0) if successful.
+*   - (-ENOTSUP) if hardware doesn't support.
+*   - (-ENODEV) if *port_id* invalid.
+*   - (-EINVAL) if bad parameter.
+*/
+int
+rte_eth_dev_set_vf_rx(uint16_t port_id,uint16_t vf, uint8_t on);
+
+/**
+* Enable/Disable hardware VF VLAN filtering by an Ethernet device of
+* received VLAN packets tagged with a given VLAN Tag Identifier.
+*
+* @param port id
+*   The port identifier of the Ethernet device.
+* @param vlan_id
+*   The VLAN Tag Identifier whose filtering must be enabled or disabled.
+* @param vf_mask
+*    Bitmap listing which VFs participate in the VLAN filtering.
+* @param vlan_on
+*    1 - Enable VFs VLAN filtering.
+*    0 - Disable VFs VLAN filtering.
+* @return
+*   - (0) if successful.
+*   - (-ENOTSUP) if hardware doesn't support.
+*   - (-ENODEV) if *port_id* invalid.
+*   - (-EINVAL) if bad parameter.
+*/
+int
+rte_eth_dev_set_vf_vlan_filter(uint16_t port_id, uint16_t vlan_id,
+				uint64_t vf_mask,
+				uint8_t vlan_on);
+
+/**
+ * Set a traffic mirroring rule on an Ethernet device
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param mirror_conf
+ *   The pointer to the traffic mirroring structure describing the mirroring rule.
+ *   The *rte_eth_vm_mirror_conf* structure includes the type of mirroring rule,
+ *   destination pool and the value of rule if enable vlan or pool mirroring.
+ *
+ * @param rule_id
+ *   The index of traffic mirroring rule, we support four separated rules.
+ * @param on
+ *   1 - Enable a mirroring rule.
+ *   0 - Disable a mirroring rule.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support this feature.
+ *   - (-ENODEV) if *port_id* invalid.
+ *   - (-EINVAL) if the mr_conf information is not correct.
+ */
+int rte_eth_mirror_rule_set(uint16_t port_id,
+			struct rte_eth_vmdq_mirror_conf *mirror_conf,
+			uint8_t rule_id,
+			uint8_t on);
+
+/**
+ * Reset a traffic mirroring rule on an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param rule_id
+ *   The index of traffic mirroring rule, we support four separated rules.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support this feature.
+ *   - (-ENODEV) if *port_id* invalid.
+ *   - (-EINVAL) if bad parameter.
+ */
+int rte_eth_mirror_rule_reset(uint16_t port_id,
+					 uint8_t rule_id);
+
+/**
+ * Set the rate limitation for a queue on an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param queue_idx
+ *   The queue id.
+ * @param tx_rate
+ *   The tx rate allocated from the total link speed for this queue.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support this feature.
+ *   - (-ENODEV) if *port_id* invalid.
+ *   - (-EINVAL) if bad parameter.
+ */
+int rte_eth_set_queue_rate_limit(uint16_t port_id, uint16_t queue_idx,
+			uint16_t tx_rate);
+
+/**
+ * Set the rate limitation for a vf on an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param vf
+ *   VF id.
+ * @param tx_rate
+ *   The tx rate allocated from the total link speed for this VF id.
+ * @param q_msk
+ *   The queue mask which need to set the rate.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support this feature.
+ *   - (-ENODEV) if *port_id* invalid.
+ *   - (-EINVAL) if bad parameter.
+ */
+int rte_eth_set_vf_rate_limit(uint16_t port_id, uint16_t vf,
+			uint16_t tx_rate, uint64_t q_msk);
+
+/**
+ * Initialize bypass logic. This function needs to be called before
+ * executing any other bypass API.
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support.
+ *   - (-EINVAL) if bad parameter.
+ */
+int rte_eth_dev_bypass_init(uint16_t port_id);
+
+/**
+ * Return bypass state.
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param state
+ *   The return bypass state.
+ *   - (1) Normal mode
+ *   - (2) Bypass mode
+ *   - (3) Isolate mode
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support.
+ *   - (-EINVAL) if bad parameter.
+ */
+int rte_eth_dev_bypass_state_show(uint16_t port_id, uint32_t *state);
+
+/**
+ * Set bypass state
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param state
+ *   The current bypass state.
+ *   - (1) Normal mode
+ *   - (2) Bypass mode
+ *   - (3) Isolate mode
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support.
+ *   - (-EINVAL) if bad parameter.
+ */
+int rte_eth_dev_bypass_state_set(uint16_t port_id, uint32_t *new_state);
+
+/**
+ * Return bypass state when given event occurs.
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param event
+ *   The bypass event
+ *   - (1) Main power on (power button is pushed)
+ *   - (2) Auxiliary power on (power supply is being plugged)
+ *   - (3) Main power off (system shutdown and power supply is left plugged in)
+ *   - (4) Auxiliary power off (power supply is being unplugged)
+ *   - (5) Display or set the watchdog timer
+ * @param state
+ *   The bypass state when given event occurred.
+ *   - (1) Normal mode
+ *   - (2) Bypass mode
+ *   - (3) Isolate mode
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support.
+ *   - (-EINVAL) if bad parameter.
+ */
+int rte_eth_dev_bypass_event_show(uint16_t port_id, uint32_t event, uint32_t *state);
+
+/**
+ * Set bypass state when given event occurs.
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param event
+ *   The bypass event
+ *   - (1) Main power on (power button is pushed)
+ *   - (2) Auxiliary power on (power supply is being plugged)
+ *   - (3) Main power off (system shutdown and power supply is left plugged in)
+ *   - (4) Auxiliary power off (power supply is being unplugged)
+ *   - (5) Display or set the watchdog timer
+ * @param state
+ *   The assigned state when given event occurs.
+ *   - (1) Normal mode
+ *   - (2) Bypass mode
+ *   - (3) Isolate mode
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support.
+ *   - (-EINVAL) if bad parameter.
+ */
+int rte_eth_dev_bypass_event_store(uint16_t port_id, uint32_t event, uint32_t state);
+
+/**
+ * Set bypass watchdog timeout count.
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param state
+ *   The timeout to be set.
+ *   - (0) 0 seconds (timer is off)
+ *   - (1) 1.5 seconds
+ *   - (2) 2 seconds
+ *   - (3) 3 seconds
+ *   - (4) 4 seconds
+ *   - (5) 8 seconds
+ *   - (6) 16 seconds
+ *   - (7) 32 seconds
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support.
+ *   - (-EINVAL) if bad parameter.
+ */
+int rte_eth_dev_wd_timeout_store(uint16_t port_id, uint32_t timeout);
+
+/**
+ * Get bypass firmware version.
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param ver
+ *   The firmware version
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support.
+ *   - (-EINVAL) if bad parameter.
+ */
+int rte_eth_dev_bypass_ver_show(uint16_t port_id, uint32_t *ver);
+
+/**
+ * Return bypass watchdog timeout in seconds
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @param wd_timeout
+ *   The return watchdog timeout. "0" represents timer expired
+ *   - (0) 0 seconds (timer is off)
+ *   - (1) 1.5 seconds
+ *   - (2) 2 seconds
+ *   - (3) 3 seconds
+ *   - (4) 4 seconds
+ *   - (5) 8 seconds
+ *   - (6) 16 seconds
+ *   - (7) 32 seconds
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support.
+ *   - (-EINVAL) if bad parameter.
+ */
+int rte_eth_dev_bypass_wd_timeout_show(uint16_t port_id, uint32_t *wd_timeout);
+
+/**
+ * Reset bypass watchdog timer
+ *
+ * @param port
+ *   The port identifier of the Ethernet device.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support.
+ *   - (-EINVAL) if bad parameter.
+ */
+int rte_eth_dev_bypass_wd_reset(uint16_t port_id);
+
+ /**
+ * Configuration of Receive Side Scaling hash computation of Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param rss_conf
+ *   The new configuration to use for RSS hash computation on the port.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if port identifier is invalid.
+ *   - (-ENOTSUP) if hardware doesn't support.
+ *   - (-EINVAL) if bad parameter.
+ */
+int rte_eth_dev_rss_hash_update(uint16_t port_id,
+				struct rte_eth_rss_conf *rss_conf);
+
+ /**
+ * Retrieve current configuration of Receive Side Scaling hash computation
+ * of Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param rss_conf
+ *   Where to store the current RSS hash configuration of the Ethernet device.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if port identifier is invalid.
+ *   - (-ENOTSUP) if hardware doesn't support RSS.
+ */
+int
+rte_eth_dev_rss_hash_conf_get(uint16_t port_id,
+			      struct rte_eth_rss_conf *rss_conf);
+
+ /**
+ * Add UDP tunneling port of an Ethernet device for filtering a specific
+ * tunneling packet by UDP port number.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param tunnel_udp
+ *   UDP tunneling configuration.
+ *
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if port identifier is invalid.
+ *   - (-ENOTSUP) if hardware doesn't support tunnel type.
+ */
+int
+rte_eth_dev_udp_tunnel_add(uint16_t port_id,
+			   struct rte_eth_udp_tunnel *tunnel_udp);
+
+ /**
+ * Detete UDP tunneling port configuration of Ethernet device
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param tunnel_udp
+ *   UDP tunneling configuration.
+ *
+ * @return
+ *   - (0) if successful.
+ *   - (-ENODEV) if port identifier is invalid.
+ *   - (-ENOTSUP) if hardware doesn't support tunnel type.
+ */
+int
+rte_eth_dev_udp_tunnel_delete(uint16_t port_id,
+			      struct rte_eth_udp_tunnel *tunnel_udp);
+
+/**
+ * add syn filter
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param rx_queue
+ *   The index of RX queue where to store RX packets matching the syn filter.
+ * @param filter
+ *   The pointer to the structure describing the syn filter rule.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support.
+ *   - (-EINVAL) if bad parameter.
+ */
+int rte_eth_dev_add_syn_filter(uint16_t port_id,
+			struct rte_syn_filter *filter, uint16_t rx_queue);
+
+/**
+ * remove syn filter
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support.
+ *   - (-EINVAL) if bad parameter.
+ */
+int rte_eth_dev_remove_syn_filter(uint16_t port_id);
+
+/**
+ * get syn filter
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param filter
+ *   The pointer to the structure describing the syn filter.
+ * @param rx_queue
+ *   A pointer to get the queue index of syn filter.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support.
+ *   - (-EINVAL) if bad parameter.
+ */
+int rte_eth_dev_get_syn_filter(uint16_t port_id,
+			struct rte_syn_filter *filter, uint16_t *rx_queue);
+
+/**
+ * Add a new 2tuple filter rule on an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param index
+ *   The identifier of 2tuple filter.
+ * @param filter
+ *   The pointer to the structure describing the 2tuple filter rule.
+ *   The *rte_2tuple_filter* structure includes the values of the different
+ *   fields to match: protocol, dst_port and
+ *   tcp_flags if the protocol is tcp type.
+ * @param rx_queue
+ *   The index of the RX queue where to store RX packets matching the added
+ *   2tuple filter.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support 2tuple filter.
+ *   - (-ENODEV) if *port_id* invalid.
+ *   - (-EINVAL) if the filter information is not correct.
+ */
+int rte_eth_dev_add_2tuple_filter(uint16_t port_id, uint16_t index,
+			struct rte_2tuple_filter *filter, uint16_t rx_queue);
+
+/**
+ * remove a 2tuple filter rule on an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param index
+ *   The identifier of 2tuple filter.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support 2tuple filter.
+ *   - (-ENODEV) if *port_id* invalid.
+ *   - (-EINVAL) if the filter information is not correct.
+ */
+int rte_eth_dev_remove_2tuple_filter(uint16_t port_id, uint16_t index);
+
+/**
+ * Get an 2tuple filter rule on an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param index
+ *   The identifier of 2tuple filter.
+ * @param filter
+ *   A pointer to a structure of type *rte_2tuple_filter* to be filled with
+ *   the information of the 2tuple filter.
+ * @param rx_queue
+ *   A pointer to get the queue index.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support 2tuple filter.
+ *   - (-ENODEV) if *port_id* invalid.
+ *   - (-EINVAL) if the filter information is not correct.
+ *   - (-ENOENT) if no enabled filter in this index.
+ */
+int rte_eth_dev_get_2tuple_filter(uint16_t port_id, uint16_t index,
+			struct rte_2tuple_filter *filter, uint16_t *rx_queue);
+
+/**
+ * Add a new 5tuple filter rule on an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param index
+ *   The identifier of 5tuple filter.
+ * @param filter
+ *   The pointer to the structure describing the 5tuple filter rule.
+ *   The *rte_5tuple_filter* structure includes the values of the different
+ *   fields to match: dst src IP, dst src port, protocol and relative masks
+ * @param rx_queue
+ *   The index of the RX queue where to store RX packets matching the added
+ *   5tuple filter.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support 5tuple filter.
+ *   - (-ENODEV) if *port_id* invalid.
+ *   - (-EINVAL) if the filter information is not correct.
+ */
+int rte_eth_dev_add_5tuple_filter(uint16_t port_id, uint16_t index,
+			struct rte_5tuple_filter *filter, uint16_t rx_queue);
+
+/**
+ * remove a 5tuple filter rule on an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param index
+ *   The identifier of 5tuple filter.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support 5tuple filter.
+ *   - (-ENODEV) if *port_id* invalid.
+ *   - (-EINVAL) if the filter information is not correct.
+ */
+int rte_eth_dev_remove_5tuple_filter(uint16_t port_id, uint16_t index);
+
+/**
+ * Get an 5tuple filter rule on an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param index
+ *   The identifier of 5tuple filter.
+ * @param filter
+ *   A pointer to a structure of type *rte_5tuple_filter* to be filled with
+ *   the information of the 5tuple filter.
+ * @param rx_queue
+ *   A pointer to get the queue index.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support 5tuple filter.
+ *   - (-ENODEV) if *port_id* invalid.
+ *   - (-EINVAL) if the filter information is not correct.
+ */
+int rte_eth_dev_get_5tuple_filter(uint16_t port_id, uint16_t index,
+			struct rte_5tuple_filter *filter, uint16_t *rx_queue);
+
+/**
+ * Add a new flex filter rule on an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param index
+ *   The identifier of flex filter.
+ * @param filter
+ *   The pointer to the structure describing the flex filter rule.
+ *   The *rte_flex_filter* structure includes the values of the different fields
+ *   to match: the dwords (first len bytes of packet ) and relative masks.
+ * @param rx_queue
+ *   The index of the RX queue where to store RX packets matching the added
+ *   flex filter.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support flex filter.
+ *   - (-ENODEV) if *port_id* invalid.
+ *   - (-EINVAL) if the filter information is not correct.
+ *   - (-ENOENT) if no enabled filter in this index.
+ */
+int rte_eth_dev_add_flex_filter(uint16_t port_id, uint16_t index,
+			struct rte_flex_filter *filter, uint16_t rx_queue);
+
+/**
+ * remove a flex filter rule on an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param index
+ *   The identifier of flex filter.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support flex filter.
+ *   - (-ENODEV) if *port_id* invalid.
+ *   - (-EINVAL) if the filter information is not correct.
+ */
+int rte_eth_dev_remove_flex_filter(uint16_t port_id, uint16_t index);
+
+/**
+ * Get an flex filter rule on an Ethernet device.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param index
+ *   The identifier of flex filter.
+ * @param filter
+ *   A pointer to a structure of type *rte_flex_filter* to be filled with
+ *   the information of the flex filter.
+ * @param rx_queue
+ *   A pointer to get the queue index.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support flex filter.
+ *   - (-ENODEV) if *port_id* invalid.
+ *   - (-EINVAL) if the filter information is not correct.
+ *   - (-ENOENT) if no enabled filter in this index.
+ */
+int rte_eth_dev_get_flex_filter(uint16_t port_id, uint16_t index,
+			struct rte_flex_filter *filter, uint16_t *rx_queue);
+
+/**
+ * Check whether the filter type is supported on an Ethernet device.
+ * All the supported filter types are defined in 'rte_eth_ctrl.h'.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param filter_type
+ *   Filter type.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support this filter type.
+ *   - (-ENODEV) if *port_id* invalid.
+ */
+int rte_eth_dev_filter_supported(uint16_t port_id, enum rte_filter_type filter_type);
+
+/**
+ * Take operations to assigned filter type on an Ethernet device.
+ * All the supported operations and filter types are defined in 'rte_eth_ctrl.h'.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param filter_type
+ *   Filter type.
+ * @param filter_op
+ *   Type of operation.
+ * @param arg
+ *   A pointer to arguments defined specifically for the operation.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP) if hardware doesn't support.
+ *   - (-ENODEV) if *port_id* invalid.
+ *   - others depends on the specific operations implementation.
+ */
+int rte_eth_dev_filter_ctrl(uint16_t port_id, enum rte_filter_type filter_type,
+			enum rte_filter_op filter_op, void *arg);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RTE_ETHDEV_H_ */
-- 
1.9.1

^ permalink raw reply	[relevance 1%]

* Re: [dpdk-dev] [PATCH v8 03/14] eal/pci, ethdev: Remove assumption that port will not be detached
  2015-02-18 10:03  3%             ` Bruce Richardson
@ 2015-02-18 10:58  0%               ` Tetsuya Mukawa
  2015-02-18 12:23  0%                 ` Bruce Richardson
  2015-02-18 12:33  0%                 ` Iremonger, Bernard
  0 siblings, 2 replies; 200+ results
From: Tetsuya Mukawa @ 2015-02-18 10:58 UTC (permalink / raw)
  To: Bruce Richardson, Thomas Monjalon; +Cc: dev, Neil Horman

On 2015/02/18 19:03, Bruce Richardson wrote:
> On Wed, Feb 18, 2015 at 10:57:25AM +0100, Thomas Monjalon wrote:
>> 2015-02-18 15:10, Tetsuya Mukawa:
>>> On 2015/02/18 10:54, Tetsuya Mukawa wrote:
>>>> On 2015/02/18 9:31, Thomas Monjalon wrote:
>>>>> 2015-02-17 15:14, Tetsuya Mukawa:
>>>>>> On 2015/02/17 9:36, Thomas Monjalon wrote:
>>>>>>> 2015-02-16 13:14, Tetsuya Mukawa:
>>>>>>> Is uint8_t sill a good size for hotpluggable virtual device ids?
>>>>>> I am not sure it's enough, but uint8_t is widely used in "rte_ethdev.c"
>>>>>> as port id.
>>>>>> If someone reports it doesn't enough, I guess it will be the time to
>>>>>> write a patch to change all uint_8 in one patch.
>>>>> It's a big ABI breakage. So if we feel it's going to be required,
>>>>> it's better to do it now in 2.0 release I think.
>>>>>
>>>>> Any opinion?
>>>>>
>>>> Hi Thomas,
>>>>
>>>> I agree with it.
>>>> I will add an one more patch to change uint8_t to uint16_t.
>>>>
>>>> Thanks,
>>>> Tetsuya
>>>>
>>> Hi Thomas,
>>>
>>> Could I make sure.
>>> After changing uint8_t to uint16_t in "rte_ethdev.[ch]", must I also
>>> need to change other applications and libraries that call ethdev APIs?
>>> If so, I would not finish it by 23rd.
>>>
>>> I've counted how many lines call ethdev APIs that are related to port_id.
>>> Could you please check an attached file?
>>> It's over 1200 lines. Probably to fix  one of caller, I will need to
>>> check how port_id is used, and fix more related lines. So probably
>>> thousands lines may need to be fixed.
>>>
>>> When is deadline for fixing this changing?
>>> Also, if you have a good idea to fix it easier, could you please let me
>>> know?
>> It was an open question.
>> If everybody is fine with 255 ports maximum, let's keep it as is.
>>
> I think we are probably ok for now (and forseeable future) with 255 max.
>
> However, if we did change it, I agree that in 2.0 is a very good time to do so.
> Since we are expanding the field, rather than shrinking it, I don't see why we
> can't just make the change at the ethdev level (and in libs API) in 2.0 and then in
> later releases (e.g. 2.1) update the apps and examples to match. That way the
> ABI stays the same from 2.0 onwards, and we don't have a huge amount of churn
> changing it everywhere late in the 2.0 release cycle.

Hi Bruce,

Could you please check my RFC patch I will send soon?
I wrote the patch like below.

1. Copy header file like below.
$ cp lib/librte_ether/rte_ethdev.h lib/librte_ether/rte_ethdev_internal.h
2. Change "rte_ethdev.c" to include "rte_ethdev_internal.h"
3. Change type of port id in "rte_ethdev.c" and "rte_ethdev_internal.h".

If the patch is OK, I wll send it with hotplug patches.

Thanks,
Tetsuya


> /Bruce

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v8 03/14] eal/pci, ethdev: Remove assumption that port will not be detached
  2015-02-18  9:57  0%           ` Thomas Monjalon
@ 2015-02-18 10:03  3%             ` Bruce Richardson
  2015-02-18 10:58  0%               ` Tetsuya Mukawa
  0 siblings, 1 reply; 200+ results
From: Bruce Richardson @ 2015-02-18 10:03 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev, Neil Horman

On Wed, Feb 18, 2015 at 10:57:25AM +0100, Thomas Monjalon wrote:
> 2015-02-18 15:10, Tetsuya Mukawa:
> > On 2015/02/18 10:54, Tetsuya Mukawa wrote:
> > > On 2015/02/18 9:31, Thomas Monjalon wrote:
> > >> 2015-02-17 15:14, Tetsuya Mukawa:
> > >>> On 2015/02/17 9:36, Thomas Monjalon wrote:
> > >>>> 2015-02-16 13:14, Tetsuya Mukawa:
> > >>>> Is uint8_t sill a good size for hotpluggable virtual device ids?
> > >>> I am not sure it's enough, but uint8_t is widely used in "rte_ethdev.c"
> > >>> as port id.
> > >>> If someone reports it doesn't enough, I guess it will be the time to
> > >>> write a patch to change all uint_8 in one patch.
> > >> It's a big ABI breakage. So if we feel it's going to be required,
> > >> it's better to do it now in 2.0 release I think.
> > >>
> > >> Any opinion?
> > >>
> > > Hi Thomas,
> > >
> > > I agree with it.
> > > I will add an one more patch to change uint8_t to uint16_t.
> > >
> > > Thanks,
> > > Tetsuya
> > >
> > 
> > Hi Thomas,
> > 
> > Could I make sure.
> > After changing uint8_t to uint16_t in "rte_ethdev.[ch]", must I also
> > need to change other applications and libraries that call ethdev APIs?
> > If so, I would not finish it by 23rd.
> > 
> > I've counted how many lines call ethdev APIs that are related to port_id.
> > Could you please check an attached file?
> > It's over 1200 lines. Probably to fix  one of caller, I will need to
> > check how port_id is used, and fix more related lines. So probably
> > thousands lines may need to be fixed.
> > 
> > When is deadline for fixing this changing?
> > Also, if you have a good idea to fix it easier, could you please let me
> > know?
> 
> It was an open question.
> If everybody is fine with 255 ports maximum, let's keep it as is.
> 
I think we are probably ok for now (and forseeable future) with 255 max.

However, if we did change it, I agree that in 2.0 is a very good time to do so.
Since we are expanding the field, rather than shrinking it, I don't see why we
can't just make the change at the ethdev level (and in libs API) in 2.0 and then in
later releases (e.g. 2.1) update the apps and examples to match. That way the
ABI stays the same from 2.0 onwards, and we don't have a huge amount of churn
changing it everywhere late in the 2.0 release cycle.

/Bruce

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v8 03/14] eal/pci, ethdev: Remove assumption that port will not be detached
  2015-02-18  6:10  0%         ` Tetsuya Mukawa
  2015-02-18  9:27  0%           ` Iremonger, Bernard
@ 2015-02-18  9:57  0%           ` Thomas Monjalon
  2015-02-18 10:03  3%             ` Bruce Richardson
  1 sibling, 1 reply; 200+ results
From: Thomas Monjalon @ 2015-02-18  9:57 UTC (permalink / raw)
  To: Tetsuya Mukawa; +Cc: dev, Neil Horman

2015-02-18 15:10, Tetsuya Mukawa:
> On 2015/02/18 10:54, Tetsuya Mukawa wrote:
> > On 2015/02/18 9:31, Thomas Monjalon wrote:
> >> 2015-02-17 15:14, Tetsuya Mukawa:
> >>> On 2015/02/17 9:36, Thomas Monjalon wrote:
> >>>> 2015-02-16 13:14, Tetsuya Mukawa:
> >>>> Is uint8_t sill a good size for hotpluggable virtual device ids?
> >>> I am not sure it's enough, but uint8_t is widely used in "rte_ethdev.c"
> >>> as port id.
> >>> If someone reports it doesn't enough, I guess it will be the time to
> >>> write a patch to change all uint_8 in one patch.
> >> It's a big ABI breakage. So if we feel it's going to be required,
> >> it's better to do it now in 2.0 release I think.
> >>
> >> Any opinion?
> >>
> > Hi Thomas,
> >
> > I agree with it.
> > I will add an one more patch to change uint8_t to uint16_t.
> >
> > Thanks,
> > Tetsuya
> >
> 
> Hi Thomas,
> 
> Could I make sure.
> After changing uint8_t to uint16_t in "rte_ethdev.[ch]", must I also
> need to change other applications and libraries that call ethdev APIs?
> If so, I would not finish it by 23rd.
> 
> I've counted how many lines call ethdev APIs that are related to port_id.
> Could you please check an attached file?
> It's over 1200 lines. Probably to fix  one of caller, I will need to
> check how port_id is used, and fix more related lines. So probably
> thousands lines may need to be fixed.
> 
> When is deadline for fixing this changing?
> Also, if you have a good idea to fix it easier, could you please let me
> know?

It was an open question.
If everybody is fine with 255 ports maximum, let's keep it as is.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v8 03/14] eal/pci, ethdev: Remove assumption that port will not be detached
  2015-02-18  6:10  0%         ` Tetsuya Mukawa
@ 2015-02-18  9:27  0%           ` Iremonger, Bernard
  2015-02-18  9:57  0%           ` Thomas Monjalon
  1 sibling, 0 replies; 200+ results
From: Iremonger, Bernard @ 2015-02-18  9:27 UTC (permalink / raw)
  To: Tetsuya Mukawa, Thomas Monjalon; +Cc: dev, Neil Horman



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Tetsuya Mukawa
> Sent: Wednesday, February 18, 2015 6:10 AM
> To: Thomas Monjalon
> Cc: dev@dpdk.org; Neil Horman
> Subject: Re: [dpdk-dev] [PATCH v8 03/14] eal/pci, ethdev: Remove assumption that port will not be
> detached
> 
> On 2015/02/18 10:54, Tetsuya Mukawa wrote:
> > On 2015/02/18 9:31, Thomas Monjalon wrote:
> >> 2015-02-17 15:14, Tetsuya Mukawa:
> >>> On 2015/02/17 9:36, Thomas Monjalon wrote:
> >>>> 2015-02-16 13:14, Tetsuya Mukawa:
> >>>> Is uint8_t sill a good size for hotpluggable virtual device ids?
> >>> I am not sure it's enough, but uint8_t is widely used in "rte_ethdev.c"
> >>> as port id.
> >>> If someone reports it doesn't enough, I guess it will be the time to
> >>> write a patch to change all uint_8 in one patch.
> >> It's a big ABI breakage. So if we feel it's going to be required,
> >> it's better to do it now in 2.0 release I think.
> >>
> >> Any opinion?
> >>
> > Hi Thomas,
> >
> > I agree with it.
> > I will add an one more patch to change uint8_t to uint16_t.
> >
> > Thanks,
> > Tetsuya
> >
> 
> Hi Thomas,
> 
> Could I make sure.
> After changing uint8_t to uint16_t in "rte_ethdev.[ch]", must I also need to change other applications
> and libraries that call ethdev APIs?
> If so, I would not finish it by 23rd.
> 
> I've counted how many lines call ethdev APIs that are related to port_id.
> Could you please check an attached file?
> It's over 1200 lines. Probably to fix  one of caller, I will need to check how port_id is used, and fix more
> related lines. So probably thousands lines may need to be fixed.
> 
> When is deadline for fixing this changing?
> Also, if you have a good idea to fix it easier, could you please let me know?
> 
> Thanks,
> Tetsuya

Hi Tetsuya, Thomas,

As uint8_t is already widely used for port_id, I don't think it should be changed in this patchset.
If it is to be changed to uint16_t it should be done as a separate task (in a new patchset).

Regards,

Bernard.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v8 03/14] eal/pci, ethdev: Remove assumption that port will not be detached
  2015-02-18  1:54  0%       ` Tetsuya Mukawa
@ 2015-02-18  6:10  0%         ` Tetsuya Mukawa
  2015-02-18  9:27  0%           ` Iremonger, Bernard
  2015-02-18  9:57  0%           ` Thomas Monjalon
  0 siblings, 2 replies; 200+ results
From: Tetsuya Mukawa @ 2015-02-18  6:10 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev, Neil Horman

[-- Attachment #1: Type: text/plain, Size: 1446 bytes --]

On 2015/02/18 10:54, Tetsuya Mukawa wrote:
> On 2015/02/18 9:31, Thomas Monjalon wrote:
>> 2015-02-17 15:14, Tetsuya Mukawa:
>>> On 2015/02/17 9:36, Thomas Monjalon wrote:
>>>> 2015-02-16 13:14, Tetsuya Mukawa:
>>>> Is uint8_t sill a good size for hotpluggable virtual device ids?
>>> I am not sure it's enough, but uint8_t is widely used in "rte_ethdev.c"
>>> as port id.
>>> If someone reports it doesn't enough, I guess it will be the time to
>>> write a patch to change all uint_8 in one patch.
>> It's a big ABI breakage. So if we feel it's going to be required,
>> it's better to do it now in 2.0 release I think.
>>
>> Any opinion?
>>
> Hi Thomas,
>
> I agree with it.
> I will add an one more patch to change uint8_t to uint16_t.
>
> Thanks,
> Tetsuya
>

Hi Thomas,

Could I make sure.
After changing uint8_t to uint16_t in "rte_ethdev.[ch]", must I also
need to change other applications and libraries that call ethdev APIs?
If so, I would not finish it by 23rd.

I've counted how many lines call ethdev APIs that are related to port_id.
Could you please check an attached file?
It's over 1200 lines. Probably to fix  one of caller, I will need to
check how port_id is used, and fix more related lines. So probably
thousands lines may need to be fixed.

When is deadline for fixing this changing?
Also, if you have a good idea to fix it easier, could you please let me
know?

Thanks,
Tetsuya


[-- Attachment #2: caller.txt --]
[-- Type: text/plain, Size: 72070 bytes --]

rte_eth_dev_configure	app/test-pipeline/init.c	240
rte_eth_dev_configure	app/test-pmd/testpmd.c	1304
rte_eth_dev_configure	app/test/test_kni.c	523
rte_eth_dev_configure	app/test/test_link_bonding.c	238
rte_eth_dev_configure	app/test/test_link_bonding.c	240
rte_eth_dev_configure	app/test/test_pmd_perf.c	751
rte_eth_dev_configure	app/test/test_pmd_ring.c	67
rte_eth_dev_configure	app/test/test_pmd_ring.c	73
rte_eth_dev_configure	app/test/test_pmd_ring.c	77
rte_eth_dev_configure	app/test/test_pmd_ring.c	81
rte_eth_dev_configure	app/test/test_pmd_ring.c	256
rte_eth_dev_configure	app/test/test_pmd_ring.c	257
rte_eth_dev_configure	examples/distributor/main.c	125
rte_eth_dev_configure	examples/dpdk_qat/main.c	726
rte_eth_dev_configure	examples/exception_path/main.c	433
rte_eth_dev_configure	examples/ip_fragmentation/main.c	890
rte_eth_dev_configure	examples/ip_pipeline/init.c	486
rte_eth_dev_configure	examples/ip_reassembly/main.c	1095
rte_eth_dev_configure	examples/ipv4_multicast/main.c	755
rte_eth_dev_configure	examples/kni/main.c	617
rte_eth_dev_configure	examples/kni/main.c	725
rte_eth_dev_configure	examples/l2fwd-ivshmem/host/host.c	745
rte_eth_dev_configure	examples/l2fwd/main.c	650
rte_eth_dev_configure	examples/l3fwd-acl/main.c	1991
rte_eth_dev_configure	examples/l3fwd-power/main.c	1534
rte_eth_dev_configure	examples/l3fwd-vf/main.c	1013
rte_eth_dev_configure	examples/l3fwd/main.c	2457
rte_eth_dev_configure	examples/link_status_interrupt/main.c	696
rte_eth_dev_configure	examples/link_status_interrupt/main.c	702
rte_eth_dev_configure	examples/load_balancer/init.c	446
rte_eth_dev_configure	examples/multi_process/client_server_mp/mp_server/init.c	144
rte_eth_dev_configure	examples/multi_process/l2fwd_fork/main.c	1121
rte_eth_dev_configure	examples/multi_process/symmetric_mp/main.c	248
rte_eth_dev_configure	examples/netmap_compat/lib/compat_netmap.c	706
rte_eth_dev_configure	examples/qos_meter/main.c	370
rte_eth_dev_configure	examples/qos_meter/main.c	386
rte_eth_dev_configure	examples/qos_sched/init.c	129
rte_eth_dev_configure	examples/quota_watermark/qw/init.c	82
rte_eth_dev_configure	examples/skeleton/basicfwd.c	69
rte_eth_dev_configure	examples/vhost/main.c	442
rte_eth_dev_configure	examples/vhost_xen/main.c	306
rte_eth_dev_configure	examples/vmdq/main.c	254
rte_eth_dev_configure	examples/vmdq_dcb/main.c	177
rte_eth_dev_configure	lib/librte_ether/rte_ethdev.c	728
rte_eth_dev_configure	lib/librte_ether/rte_ethdev.h	91
rte_eth_dev_configure	lib/librte_ether/rte_ethdev.h	102
rte_eth_dev_configure	lib/librte_ether/rte_ethdev.h	1726
rte_eth_dev_configure	lib/librte_ether/rte_ethdev.h	1744
rte_eth_dev_configure	lib/librte_ether/rte_ethdev.h	1783
rte_eth_dev_configure	lib/librte_ether/rte_ethdev.h	1844
rte_eth_dev_configure	lib/librte_ether/rte_ethdev.h	1860
rte_eth_dev_configure	lib/librte_ether/rte_ethdev.h	1877
rte_eth_dev_configure	lib/librte_ether/rte_ethdev.h	1893
rte_eth_dev_configure	lib/librte_ether/rte_ethdev.h	2112
rte_eth_dev_configure	lib/librte_ether/rte_ethdev.h	2133
rte_eth_dev_configure	lib/librte_ether/rte_ethdev.h	2225
rte_eth_dev_configure	lib/librte_ether/rte_ethdev.h	2377
rte_eth_dev_configure	lib/librte_ether/rte_ethdev.h	2492
rte_eth_dev_configure	lib/librte_ether/rte_ethdev.h	2504
rte_eth_dev_configure	lib/librte_pmd_bond/rte_eth_bond_pmd.c	950
rte_eth_rx_queue_setup	app/test-pipeline/init.c	251
rte_eth_rx_queue_setup	app/test-pmd/testpmd.c	1359
rte_eth_rx_queue_setup	app/test-pmd/testpmd.c	1364
rte_eth_rx_queue_setup	app/test/test_kni.c	529
rte_eth_rx_queue_setup	app/test/test_link_bonding.c	243
rte_eth_rx_queue_setup	app/test/test_link_bonding.c	246
rte_eth_rx_queue_setup	app/test/test_pmd_perf.c	772
rte_eth_rx_queue_setup	app/test/test_pmd_perf.c	776
rte_eth_rx_queue_setup	app/test/test_pmd_ring.c	90
rte_eth_rx_queue_setup	app/test/test_pmd_ring.c	99
rte_eth_rx_queue_setup	app/test/test_pmd_ring.c	268
rte_eth_rx_queue_setup	app/test/test_pmd_ring.c	269
rte_eth_rx_queue_setup	examples/distributor/main.c	130
rte_eth_rx_queue_setup	examples/dpdk_qat/main.c	768
rte_eth_rx_queue_setup	examples/dpdk_qat/main.c	773
rte_eth_rx_queue_setup	examples/exception_path/main.c	438
rte_eth_rx_queue_setup	examples/ip_fragmentation/main.c	900
rte_eth_rx_queue_setup	examples/ip_fragmentation/main.c	905
rte_eth_rx_queue_setup	examples/ip_pipeline/init.c	496
rte_eth_rx_queue_setup	examples/ip_reassembly/main.c	1105
rte_eth_rx_queue_setup	examples/ip_reassembly/main.c	1110
rte_eth_rx_queue_setup	examples/ipv4_multicast/main.c	769
rte_eth_rx_queue_setup	examples/kni/main.c	622
rte_eth_rx_queue_setup	examples/l2fwd-ivshmem/host/host.c	754
rte_eth_rx_queue_setup	examples/l2fwd-ivshmem/host/host.c	759
rte_eth_rx_queue_setup	examples/l2fwd/main.c	659
rte_eth_rx_queue_setup	examples/l2fwd/main.c	664
rte_eth_rx_queue_setup	examples/l3fwd-acl/main.c	2060
rte_eth_rx_queue_setup	examples/l3fwd-acl/main.c	2065
rte_eth_rx_queue_setup	examples/l3fwd-power/main.c	1616
rte_eth_rx_queue_setup	examples/l3fwd-power/main.c	1621
rte_eth_rx_queue_setup	examples/l3fwd-vf/main.c	1066
rte_eth_rx_queue_setup	examples/l3fwd-vf/main.c	1070
rte_eth_rx_queue_setup	examples/l3fwd/main.c	2530
rte_eth_rx_queue_setup	examples/l3fwd/main.c	2535
rte_eth_rx_queue_setup	examples/link_status_interrupt/main.c	714
rte_eth_rx_queue_setup	examples/link_status_interrupt/main.c	719
rte_eth_rx_queue_setup	examples/load_balancer/init.c	469
rte_eth_rx_queue_setup	examples/multi_process/client_server_mp/mp_server/init.c	149
rte_eth_rx_queue_setup	examples/multi_process/l2fwd_fork/main.c	1130
rte_eth_rx_queue_setup	examples/multi_process/l2fwd_fork/main.c	1135
rte_eth_rx_queue_setup	examples/multi_process/symmetric_mp/main.c	253
rte_eth_rx_queue_setup	examples/netmap_compat/lib/compat_netmap.c	726
rte_eth_rx_queue_setup	examples/qos_meter/main.c	374
rte_eth_rx_queue_setup	examples/qos_meter/main.c	390
rte_eth_rx_queue_setup	examples/qos_sched/init.c	136
rte_eth_rx_queue_setup	examples/quota_watermark/qw/init.c	88
rte_eth_rx_queue_setup	examples/skeleton/basicfwd.c	74
rte_eth_rx_queue_setup	examples/vhost/main.c	448
rte_eth_rx_queue_setup	examples/vhost_xen/main.c	315
rte_eth_rx_queue_setup	examples/vmdq/main.c	262
rte_eth_rx_queue_setup	examples/vmdq_dcb/main.c	182
rte_eth_rx_queue_setup	lib/librte_ether/rte_ethdev.c	1043
rte_eth_rx_queue_setup	lib/librte_ether/rte_ethdev.h	93
rte_eth_rx_queue_setup	lib/librte_ether/rte_ethdev.h	103
rte_eth_rx_queue_setup	lib/librte_ether/rte_ethdev.h	1770
rte_eth_rx_queue_setup	lib/librte_pmd_bond/rte_eth_bond_pmd.c	964
rte_eth_rx_queue_setup	lib/librte_pmd_bond/rte_eth_bond_pmd.c	970
rte_eth_tx_queue_setup	app/test-pipeline/init.c	263
rte_eth_tx_queue_setup	app/test-pmd/testpmd.c	1323
rte_eth_tx_queue_setup	app/test-pmd/testpmd.c	1327
rte_eth_tx_queue_setup	app/test/test_kni.c	535
rte_eth_tx_queue_setup	app/test/test_link_bonding.c	249
rte_eth_tx_queue_setup	app/test/test_link_bonding.c	251
rte_eth_tx_queue_setup	app/test/test_pmd_perf.c	764
rte_eth_tx_queue_setup	app/test/test_pmd_perf.c	768
rte_eth_tx_queue_setup	app/test/test_pmd_ring.c	86
rte_eth_tx_queue_setup	app/test/test_pmd_ring.c	95
rte_eth_tx_queue_setup	app/test/test_pmd_ring.c	262
rte_eth_tx_queue_setup	app/test/test_pmd_ring.c	263
rte_eth_tx_queue_setup	examples/distributor/main.c	138
rte_eth_tx_queue_setup	examples/dpdk_qat/main.c	742
rte_eth_tx_queue_setup	examples/dpdk_qat/main.c	746
rte_eth_tx_queue_setup	examples/exception_path/main.c	445
rte_eth_tx_queue_setup	examples/ip_fragmentation/main.c	927
rte_eth_tx_queue_setup	examples/ip_fragmentation/main.c	931
rte_eth_tx_queue_setup	examples/ip_pipeline/init.c	508
rte_eth_tx_queue_setup	examples/ip_reassembly/main.c	1134
rte_eth_tx_queue_setup	examples/ip_reassembly/main.c	1137
rte_eth_tx_queue_setup	examples/ipv4_multicast/main.c	774
rte_eth_tx_queue_setup	examples/ipv4_multicast/main.c	789
rte_eth_tx_queue_setup	examples/ipv4_multicast/main.c	792
rte_eth_tx_queue_setup	examples/kni/main.c	628
rte_eth_tx_queue_setup	examples/l2fwd-ivshmem/host/host.c	764
rte_eth_tx_queue_setup	examples/l2fwd-ivshmem/host/host.c	768
rte_eth_tx_queue_setup	examples/l2fwd/main.c	669
rte_eth_tx_queue_setup	examples/l2fwd/main.c	673
rte_eth_tx_queue_setup	examples/l3fwd-acl/main.c	2026
rte_eth_tx_queue_setup	examples/l3fwd-acl/main.c	2030
rte_eth_tx_queue_setup	examples/l3fwd-power/main.c	1568
rte_eth_tx_queue_setup	examples/l3fwd-power/main.c	1572
rte_eth_tx_queue_setup	examples/l3fwd-vf/main.c	1036
rte_eth_tx_queue_setup	examples/l3fwd-vf/main.c	1039
rte_eth_tx_queue_setup	examples/l3fwd/main.c	2498
rte_eth_tx_queue_setup	examples/l3fwd/main.c	2501
rte_eth_tx_queue_setup	examples/link_status_interrupt/main.c	724
rte_eth_tx_queue_setup	examples/link_status_interrupt/main.c	728
rte_eth_tx_queue_setup	examples/load_balancer/init.c	490
rte_eth_tx_queue_setup	examples/multi_process/client_server_mp/mp_server/init.c	156
rte_eth_tx_queue_setup	examples/multi_process/l2fwd_fork/main.c	1140
rte_eth_tx_queue_setup	examples/multi_process/l2fwd_fork/main.c	1144
rte_eth_tx_queue_setup	examples/multi_process/symmetric_mp/main.c	262
rte_eth_tx_queue_setup	examples/netmap_compat/lib/compat_netmap.c	715
rte_eth_tx_queue_setup	examples/qos_meter/main.c	380
rte_eth_tx_queue_setup	examples/qos_meter/main.c	396
rte_eth_tx_queue_setup	examples/qos_sched/init.c	139
rte_eth_tx_queue_setup	examples/qos_sched/init.c	144
rte_eth_tx_queue_setup	examples/qos_sched/init.c	147
rte_eth_tx_queue_setup	examples/quota_watermark/qw/init.c	97
rte_eth_tx_queue_setup	examples/skeleton/basicfwd.c	81
rte_eth_tx_queue_setup	examples/vhost/main.c	456
rte_eth_tx_queue_setup	examples/vhost_xen/main.c	322
rte_eth_tx_queue_setup	examples/vmdq/main.c	273
rte_eth_tx_queue_setup	examples/vmdq_dcb/main.c	191
rte_eth_tx_queue_setup	lib/librte_ether/rte_ethdev.c	1121
rte_eth_tx_queue_setup	lib/librte_ether/rte_ethdev.h	92
rte_eth_tx_queue_setup	lib/librte_ether/rte_ethdev.h	102
rte_eth_tx_queue_setup	lib/librte_ether/rte_ethdev.h	1818
rte_eth_tx_queue_setup	lib/librte_pmd_bond/rte_eth_bond_pmd.c	980
rte_eth_tx_queue_setup	lib/librte_pmd_bond/rte_eth_bond_pmd.c	986
rte_eth_dev_socket_id	app/test-pipeline/init.c	255
rte_eth_dev_socket_id	app/test-pipeline/init.c	267
rte_eth_dev_socket_id	app/test-pmd/testpmd.c	571
rte_eth_dev_socket_id	app/test-pmd/testpmd.c	672
rte_eth_dev_socket_id	app/test/test_link_bonding.c	244
rte_eth_dev_socket_id	app/test/test_link_bonding.c	250
rte_eth_dev_socket_id	app/test/test_pmd_perf.c	735
rte_eth_dev_socket_id	app/test/test_pmd_perf.c	745
rte_eth_dev_socket_id	app/test/test_pmd_perf.c	826
rte_eth_dev_socket_id	examples/distributor/main.c	131
rte_eth_dev_socket_id	examples/distributor/main.c	139
rte_eth_dev_socket_id	examples/distributor/main.c	212
rte_eth_dev_socket_id	examples/distributor/main.c	213
rte_eth_dev_socket_id	examples/distributor/main.c	312
rte_eth_dev_socket_id	examples/distributor/main.c	313
rte_eth_dev_socket_id	examples/exception_path/main.c	438
rte_eth_dev_socket_id	examples/exception_path/main.c	445
rte_eth_dev_socket_id	examples/ip_pipeline/init.c	500
rte_eth_dev_socket_id	examples/ip_pipeline/init.c	512
rte_eth_dev_socket_id	examples/ipv4_multicast/main.c	770
rte_eth_dev_socket_id	examples/kni/main.c	623
rte_eth_dev_socket_id	examples/kni/main.c	629
rte_eth_dev_socket_id	examples/l2fwd-ivshmem/host/host.c	755
rte_eth_dev_socket_id	examples/l2fwd-ivshmem/host/host.c	765
rte_eth_dev_socket_id	examples/l2fwd/main.c	660
rte_eth_dev_socket_id	examples/l2fwd/main.c	670
rte_eth_dev_socket_id	examples/link_status_interrupt/main.c	715
rte_eth_dev_socket_id	examples/link_status_interrupt/main.c	725
rte_eth_dev_socket_id	examples/multi_process/client_server_mp/mp_server/init.c	150
rte_eth_dev_socket_id	examples/multi_process/client_server_mp/mp_server/init.c	157
rte_eth_dev_socket_id	examples/multi_process/l2fwd_fork/main.c	1131
rte_eth_dev_socket_id	examples/multi_process/l2fwd_fork/main.c	1141
rte_eth_dev_socket_id	examples/multi_process/symmetric_mp/main.c	254
rte_eth_dev_socket_id	examples/multi_process/symmetric_mp/main.c	263
rte_eth_dev_socket_id	examples/qos_meter/main.c	375
rte_eth_dev_socket_id	examples/qos_meter/main.c	381
rte_eth_dev_socket_id	examples/qos_meter/main.c	391
rte_eth_dev_socket_id	examples/qos_meter/main.c	397
rte_eth_dev_socket_id	examples/qos_sched/init.c	137
rte_eth_dev_socket_id	examples/qos_sched/init.c	145
rte_eth_dev_socket_id	examples/qos_sched/init.c	343
rte_eth_dev_socket_id	examples/quota_watermark/qw/init.c	89
rte_eth_dev_socket_id	examples/quota_watermark/qw/init.c	98
rte_eth_dev_socket_id	examples/skeleton/basicfwd.c	75
rte_eth_dev_socket_id	examples/skeleton/basicfwd.c	82
rte_eth_dev_socket_id	examples/skeleton/basicfwd.c	115
rte_eth_dev_socket_id	examples/skeleton/basicfwd.c	116
rte_eth_dev_socket_id	examples/vhost/main.c	449
rte_eth_dev_socket_id	examples/vhost/main.c	457
rte_eth_dev_socket_id	examples/vhost_xen/main.c	316
rte_eth_dev_socket_id	examples/vhost_xen/main.c	323
rte_eth_dev_socket_id	examples/vmdq/main.c	263
rte_eth_dev_socket_id	examples/vmdq/main.c	274
rte_eth_dev_socket_id	examples/vmdq_dcb/main.c	183
rte_eth_dev_socket_id	examples/vmdq_dcb/main.c	192
rte_eth_dev_socket_id	lib/librte_ether/rte_ethdev.c	345
rte_eth_dev_socket_id	lib/librte_ether/rte_ethdev.h	1832
rte_eth_dev_socket_id	lib/librte_pmd_bond/rte_eth_bond_pmd.c	966
rte_eth_dev_socket_id	lib/librte_pmd_bond/rte_eth_bond_pmd.c	982
rte_eth_dev_rx_queue_start	app/test-pmd/cmdline.c	1671
rte_eth_dev_rx_queue_start	examples/vhost/main.c	2684
rte_eth_dev_rx_queue_start	lib/librte_ether/rte_ethdev.c	397
rte_eth_dev_rx_queue_start	lib/librte_ether/rte_ethdev.h	1850
rte_eth_dev_rx_queue_stop	app/test-pmd/cmdline.c	1673
rte_eth_dev_rx_queue_stop	examples/vhost/main.c	2377
rte_eth_dev_rx_queue_stop	lib/librte_ether/rte_ethdev.c	423
rte_eth_dev_rx_queue_stop	lib/librte_ether/rte_ethdev.h	1866
rte_eth_dev_tx_queue_start	app/test-pmd/cmdline.c	1675
rte_eth_dev_tx_queue_start	examples/vhost/main.c	2670
rte_eth_dev_tx_queue_start	lib/librte_ether/rte_ethdev.c	449
rte_eth_dev_tx_queue_start	lib/librte_ether/rte_ethdev.h	1883
rte_eth_dev_tx_queue_stop	app/test-pmd/cmdline.c	1677
rte_eth_dev_tx_queue_stop	examples/vhost/main.c	2393
rte_eth_dev_tx_queue_stop	examples/vhost/main.c	2693
rte_eth_dev_tx_queue_stop	lib/librte_ether/rte_ethdev.c	475
rte_eth_dev_tx_queue_stop	lib/librte_ether/rte_ethdev.h	1899
rte_eth_dev_start	app/test-pipeline/init.c	274
rte_eth_dev_start	app/test-pmd/testpmd.c	1386
rte_eth_dev_start	app/test/test_kni.c	541
rte_eth_dev_start	app/test/test_link_bonding.c	254
rte_eth_dev_start	app/test/test_link_bonding.c	255
rte_eth_dev_start	app/test/test_link_bonding.c	619
rte_eth_dev_start	app/test/test_link_bonding.c	808
rte_eth_dev_start	app/test/test_link_bonding.c	1008
rte_eth_dev_start	app/test/test_link_bonding.c	1049
rte_eth_dev_start	app/test/test_link_bonding.c	1140
rte_eth_dev_start	app/test/test_link_bonding.c	1764
rte_eth_dev_start	app/test/test_link_bonding.c	2362
rte_eth_dev_start	app/test/test_link_bonding.c	3264
rte_eth_dev_start	app/test/test_link_bonding.c	3843
rte_eth_dev_start	app/test/test_link_bonding.c	4344
rte_eth_dev_start	app/test/test_pmd_perf.c	781
rte_eth_dev_start	app/test/test_pmd_perf.c	784
rte_eth_dev_start	app/test/test_pmd_ring.c	105
rte_eth_dev_start	app/test/test_pmd_ring.c	109
rte_eth_dev_start	app/test/test_pmd_ring.c	113
rte_eth_dev_start	app/test/test_pmd_ring.c	274
rte_eth_dev_start	app/test/test_pmd_ring.c	275
rte_eth_dev_start	examples/distributor/main.c	145
rte_eth_dev_start	examples/dpdk_qat/main.c	785
rte_eth_dev_start	examples/dpdk_qat/main.c	787
rte_eth_dev_start	examples/exception_path/main.c	451
rte_eth_dev_start	examples/ip_fragmentation/main.c	951
rte_eth_dev_start	examples/ip_fragmentation/main.c	953
rte_eth_dev_start	examples/ip_pipeline/init.c	519
rte_eth_dev_start	examples/ip_reassembly/main.c	1156
rte_eth_dev_start	examples/ip_reassembly/main.c	1158
rte_eth_dev_start	examples/ipv4_multicast/main.c	801
rte_eth_dev_start	examples/ipv4_multicast/main.c	803
rte_eth_dev_start	examples/kni/main.c	634
rte_eth_dev_start	examples/kni/main.c	732
rte_eth_dev_start	examples/kni/main.c	757
rte_eth_dev_start	examples/l2fwd-ivshmem/host/host.c	772
rte_eth_dev_start	examples/l2fwd-ivshmem/host/host.c	774
rte_eth_dev_start	examples/l2fwd/main.c	677
rte_eth_dev_start	examples/l2fwd/main.c	679
rte_eth_dev_start	examples/l3fwd-acl/main.c	2078
rte_eth_dev_start	examples/l3fwd-acl/main.c	2081
rte_eth_dev_start	examples/l3fwd-power/main.c	1634
rte_eth_dev_start	examples/l3fwd-power/main.c	1636
rte_eth_dev_start	examples/l3fwd-vf/main.c	1082
rte_eth_dev_start	examples/l3fwd-vf/main.c	1084
rte_eth_dev_start	examples/l3fwd/main.c	2548
rte_eth_dev_start	examples/l3fwd/main.c	2550
rte_eth_dev_start	examples/link_status_interrupt/main.c	732
rte_eth_dev_start	examples/link_status_interrupt/main.c	734
rte_eth_dev_start	examples/load_balancer/init.c	504
rte_eth_dev_start	examples/multi_process/client_server_mp/mp_server/init.c	164
rte_eth_dev_start	examples/multi_process/l2fwd_fork/main.c	450
rte_eth_dev_start	examples/multi_process/l2fwd_fork/main.c	1148
rte_eth_dev_start	examples/multi_process/l2fwd_fork/main.c	1150
rte_eth_dev_start	examples/multi_process/symmetric_mp/main.c	271
rte_eth_dev_start	examples/netmap_compat/lib/compat_netmap.c	371
rte_eth_dev_start	examples/qos_meter/main.c	402
rte_eth_dev_start	examples/qos_meter/main.c	406
rte_eth_dev_start	examples/qos_sched/init.c	151
rte_eth_dev_start	examples/quota_watermark/qw/init.c	111
rte_eth_dev_start	examples/skeleton/basicfwd.c	87
rte_eth_dev_start	examples/vhost/main.c	464
rte_eth_dev_start	examples/vhost_xen/main.c	330
rte_eth_dev_start	examples/vmdq/main.c	282
rte_eth_dev_start	examples/vmdq_dcb/main.c	198
rte_eth_dev_start	lib/librte_ether/rte_ethdev.c	916
rte_eth_dev_start	lib/librte_ether/rte_ethdev.h	94
rte_eth_dev_start	lib/librte_ether/rte_ethdev.h	104
rte_eth_dev_start	lib/librte_ether/rte_ethdev.h	109
rte_eth_dev_start	lib/librte_ether/rte_ethdev.h	121
rte_eth_dev_start	lib/librte_ether/rte_ethdev.h	633
rte_eth_dev_start	lib/librte_ether/rte_ethdev.h	654
rte_eth_dev_start	lib/librte_ether/rte_ethdev.h	1918
rte_eth_dev_start	lib/librte_ether/rte_ethdev.h	1922
rte_eth_dev_start	lib/librte_pmd_bond/rte_eth_bond_pmd.c	993
rte_eth_dev_start	lib/librte_pmd_bond/rte_eth_bond_pmd.c	995
rte_eth_dev_stop	app/test-pmd/testpmd.c	1446
rte_eth_dev_stop	app/test/test_kni.c	675
rte_eth_dev_stop	app/test/test_link_bonding.c	666
rte_eth_dev_stop	app/test/test_link_bonding.c	696
rte_eth_dev_stop	app/test/test_link_bonding.c	806
rte_eth_dev_stop	app/test/test_link_bonding.c	1048
rte_eth_dev_stop	app/test/test_link_bonding.c	1079
rte_eth_dev_stop	app/test/test_link_bonding.c	1762
rte_eth_dev_stop	app/test/test_link_bonding.c	2360
rte_eth_dev_stop	app/test/test_link_bonding.c	3262
rte_eth_dev_stop	app/test/test_link_bonding.c	3841
rte_eth_dev_stop	app/test/test_link_bonding.c	4342
rte_eth_dev_stop	app/test/test_pmd_perf.c	829
rte_eth_dev_stop	app/test/test_pmd_ring.c	400
rte_eth_dev_stop	app/test/test_pmd_ring.c	401
rte_eth_dev_stop	app/test/test_pmd_ring.c	436
rte_eth_dev_stop	app/test/test_pmd_ring.c	437
rte_eth_dev_stop	app/test/test_pmd_ring.c	438
rte_eth_dev_stop	examples/kni/main.c	713
rte_eth_dev_stop	examples/kni/main.c	756
rte_eth_dev_stop	examples/kni/main.c	759
rte_eth_dev_stop	examples/kni/main.c	839
rte_eth_dev_stop	examples/multi_process/l2fwd_fork/main.c	440
rte_eth_dev_stop	examples/netmap_compat/lib/compat_netmap.c	417
rte_eth_dev_stop	examples/quota_watermark/qw/init.c	80
rte_eth_dev_stop	lib/librte_ether/rte_ethdev.c	953
rte_eth_dev_stop	lib/librte_ether/rte_ethdev.h	103
rte_eth_dev_stop	lib/librte_ether/rte_ethdev.h	109
rte_eth_dev_stop	lib/librte_ether/rte_ethdev.h	1927
rte_eth_dev_stop	lib/librte_pmd_bond/rte_eth_bond_pmd.c	943
rte_eth_dev_set_link_up	app/test-pmd/testpmd.c	1238
rte_eth_dev_set_link_up	lib/librte_ether/rte_ethdev.c	982
rte_eth_dev_set_link_up	lib/librte_ether/rte_ethdev.h	1942
rte_eth_dev_set_link_up	lib/librte_ether/rte_ethdev.h	1948
rte_eth_dev_set_link_down	app/test-pmd/testpmd.c	1245
rte_eth_dev_set_link_down	lib/librte_ether/rte_ethdev.c	1002
rte_eth_dev_set_link_down	lib/librte_ether/rte_ethdev.h	1953
rte_eth_dev_close	app/test-pmd/testpmd.c	1483
rte_eth_dev_close	app/test-pmd/testpmd.c	1528
rte_eth_dev_close	app/test/test_link_bonding.c	4028
rte_eth_dev_close	examples/l3fwd-vf/main.c	694
rte_eth_dev_close	lib/librte_ether/rte_ethdev.c	1022
rte_eth_dev_close	lib/librte_ether/rte_ethdev.h	124
rte_eth_dev_close	lib/librte_ether/rte_ethdev.h	1961
rte_eth_promiscuous_enable	app/test-pipeline/init.c	248
rte_eth_promiscuous_enable	app/test-pmd/cmdline.c	4043
rte_eth_promiscuous_enable	app/test-pmd/cmdline.c	4334
rte_eth_promiscuous_enable	app/test-pmd/cmdline.c	4341
rte_eth_promiscuous_enable	app/test-pmd/testpmd.c	1922
rte_eth_promiscuous_enable	app/test/test_kni.c	546
rte_eth_promiscuous_enable	app/test/test_link_bonding.c	1813
rte_eth_promiscuous_enable	app/test/test_link_bonding.c	2261
rte_eth_promiscuous_enable	app/test/test_link_bonding.c	3172
rte_eth_promiscuous_enable	app/test/test_link_bonding.c	3767
rte_eth_promiscuous_enable	app/test/test_link_bonding.c	4242
rte_eth_promiscuous_enable	app/test/test_pmd_perf.c	788
rte_eth_promiscuous_enable	examples/distributor/main.c	170
rte_eth_promiscuous_enable	examples/dpdk_qat/main.c	808
rte_eth_promiscuous_enable	examples/exception_path/main.c	455
rte_eth_promiscuous_enable	examples/ip_fragmentation/main.c	956
rte_eth_promiscuous_enable	examples/ip_pipeline/init.c	493
rte_eth_promiscuous_enable	examples/ip_reassembly/main.c	1161
rte_eth_promiscuous_enable	examples/kni/main.c	640
rte_eth_promiscuous_enable	examples/l2fwd-ivshmem/host/host.c	779
rte_eth_promiscuous_enable	examples/l2fwd/main.c	684
rte_eth_promiscuous_enable	examples/l3fwd-acl/main.c	2091
rte_eth_promiscuous_enable	examples/l3fwd-power/main.c	1646
rte_eth_promiscuous_enable	examples/l3fwd/main.c	2560
rte_eth_promiscuous_enable	examples/load_balancer/init.c	454
rte_eth_promiscuous_enable	examples/multi_process/client_server_mp/mp_server/init.c	162
rte_eth_promiscuous_enable	examples/multi_process/l2fwd_fork/main.c	1155
rte_eth_promiscuous_enable	examples/multi_process/symmetric_mp/main.c	269
rte_eth_promiscuous_enable	examples/netmap_compat/bridge/bridge.c	302
rte_eth_promiscuous_enable	examples/qos_meter/main.c	410
rte_eth_promiscuous_enable	examples/qos_meter/main.c	412
rte_eth_promiscuous_enable	examples/qos_sched/init.c	168
rte_eth_promiscuous_enable	examples/quota_watermark/qw/init.c	117
rte_eth_promiscuous_enable	examples/skeleton/basicfwd.c	100
rte_eth_promiscuous_enable	examples/vhost/main.c	471
rte_eth_promiscuous_enable	lib/librte_ether/rte_ethdev.c	904
rte_eth_promiscuous_enable	lib/librte_ether/rte_ethdev.c	1162
rte_eth_promiscuous_enable	lib/librte_ether/rte_ethdev.h	1969
rte_eth_promiscuous_enable	lib/librte_pmd_bond/rte_eth_bond_8023ad.c	873
rte_eth_promiscuous_enable	lib/librte_pmd_bond/rte_eth_bond_pmd.c	1417
rte_eth_promiscuous_enable	lib/librte_pmd_bond/rte_eth_bond_pmd.c	1426
rte_eth_promiscuous_disable	app/test-pmd/cmdline.c	4336
rte_eth_promiscuous_disable	app/test-pmd/cmdline.c	4343
rte_eth_promiscuous_disable	app/test/test_link_bonding.c	1828
rte_eth_promiscuous_disable	app/test/test_link_bonding.c	2282
rte_eth_promiscuous_disable	app/test/test_link_bonding.c	3185
rte_eth_promiscuous_disable	app/test/test_link_bonding.c	3781
rte_eth_promiscuous_disable	app/test/test_link_bonding.c	4263
rte_eth_promiscuous_disable	lib/librte_ether/rte_ethdev.c	906
rte_eth_promiscuous_disable	lib/librte_ether/rte_ethdev.c	1179
rte_eth_promiscuous_disable	lib/librte_ether/rte_ethdev.h	1977
rte_eth_promiscuous_disable	lib/librte_pmd_bond/rte_eth_bond_pmd.c	1446
rte_eth_promiscuous_disable	lib/librte_pmd_bond/rte_eth_bond_pmd.c	1455
rte_eth_promiscuous_get	app/test-pmd/config.c	331
rte_eth_promiscuous_get	app/test/test_link_bonding.c	1815
rte_eth_promiscuous_get	app/test/test_link_bonding.c	1821
rte_eth_promiscuous_get	app/test/test_link_bonding.c	1830
rte_eth_promiscuous_get	app/test/test_link_bonding.c	1836
rte_eth_promiscuous_get	app/test/test_link_bonding.c	2263
rte_eth_promiscuous_get	app/test/test_link_bonding.c	2268
rte_eth_promiscuous_get	app/test/test_link_bonding.c	2284
rte_eth_promiscuous_get	app/test/test_link_bonding.c	2289
rte_eth_promiscuous_get	app/test/test_link_bonding.c	3174
rte_eth_promiscuous_get	app/test/test_link_bonding.c	3179
rte_eth_promiscuous_get	app/test/test_link_bonding.c	3187
rte_eth_promiscuous_get	app/test/test_link_bonding.c	3192
rte_eth_promiscuous_get	app/test/test_link_bonding.c	3770
rte_eth_promiscuous_get	app/test/test_link_bonding.c	3775
rte_eth_promiscuous_get	app/test/test_link_bonding.c	3783
rte_eth_promiscuous_get	app/test/test_link_bonding.c	3788
rte_eth_promiscuous_get	app/test/test_link_bonding.c	4244
rte_eth_promiscuous_get	app/test/test_link_bonding.c	4249
rte_eth_promiscuous_get	app/test/test_link_bonding.c	4265
rte_eth_promiscuous_get	app/test/test_link_bonding.c	4271
rte_eth_promiscuous_get	lib/librte_ether/rte_ethdev.c	903
rte_eth_promiscuous_get	lib/librte_ether/rte_ethdev.c	905
rte_eth_promiscuous_get	lib/librte_ether/rte_ethdev.c	1196
rte_eth_promiscuous_get	lib/librte_ether/rte_ethdev.h	1989
rte_eth_allmulticast_enable	app/test-pmd/cmdline.c	4414
rte_eth_allmulticast_enable	app/test-pmd/cmdline.c	4421
rte_eth_allmulticast_enable	lib/librte_ether/rte_ethdev.c	910
rte_eth_allmulticast_enable	lib/librte_ether/rte_ethdev.c	1210
rte_eth_allmulticast_enable	lib/librte_ether/rte_ethdev.h	1997
rte_eth_allmulticast_disable	app/test-pmd/cmdline.c	4416
rte_eth_allmulticast_disable	app/test-pmd/cmdline.c	4423
rte_eth_allmulticast_disable	lib/librte_ether/rte_ethdev.c	912
rte_eth_allmulticast_disable	lib/librte_ether/rte_ethdev.c	1227
rte_eth_allmulticast_disable	lib/librte_ether/rte_ethdev.h	2005
rte_eth_allmulticast_get	app/test-pmd/config.c	333
rte_eth_allmulticast_get	lib/librte_ether/rte_ethdev.c	909
rte_eth_allmulticast_get	lib/librte_ether/rte_ethdev.c	911
rte_eth_allmulticast_get	lib/librte_ether/rte_ethdev.c	1244
rte_eth_allmulticast_get	lib/librte_ether/rte_ethdev.h	2017
rte_eth_link_get	app/test-pipeline/init.c	212
rte_eth_link_get	app/test-pmd/config.c	311
rte_eth_link_get	app/test-pmd/config.c	2134
rte_eth_link_get	app/test-pmd/config.c	2159
rte_eth_link_get	app/test-pmd/testpmd.c	1559
rte_eth_link_get	app/test/test_link_bonding.c	650
rte_eth_link_get	app/test/test_link_bonding.c	668
rte_eth_link_get	app/test/test_pmd_perf.c	179
rte_eth_link_get	app/test/test_pmd_ring.c	118
rte_eth_link_get	app/test/test_pmd_ring.c	119
rte_eth_link_get	app/test/test_pmd_ring.c	120
rte_eth_link_get	examples/distributor/main.c	150
rte_eth_link_get	examples/distributor/main.c	153
rte_eth_link_get	examples/dpdk_qat/main.c	793
rte_eth_link_get	examples/exception_path/main.c	475
rte_eth_link_get	examples/ip_fragmentation/main.c	623
rte_eth_link_get	examples/ip_pipeline/init.c	458
rte_eth_link_get	examples/ip_reassembly/main.c	752
rte_eth_link_get	examples/ipv4_multicast/main.c	631
rte_eth_link_get	examples/kni/main.c	660
rte_eth_link_get	examples/l2fwd-ivshmem/host/host.c	361
rte_eth_link_get	examples/l2fwd/main.c	501
rte_eth_link_get	examples/l3fwd-acl/main.c	1890
rte_eth_link_get	examples/l3fwd-power/main.c	1429
rte_eth_link_get	examples/l3fwd/main.c	2360
rte_eth_link_get	examples/link_status_interrupt/main.c	176
rte_eth_link_get	examples/link_status_interrupt/main.c	528
rte_eth_link_get	examples/link_status_interrupt/main.c	555
rte_eth_link_get	examples/load_balancer/init.c	386
rte_eth_link_get	examples/multi_process/client_server_mp/mp_server/init.c	220
rte_eth_link_get	examples/multi_process/l2fwd_fork/main.c	924
rte_eth_link_get	examples/multi_process/symmetric_mp/main.c	378
rte_eth_link_get	examples/qos_sched/init.c	159
rte_eth_link_get	examples/qos_sched/init.c	247
rte_eth_link_get	lib/librte_ether/rte_ethdev.c	1272
rte_eth_link_get	lib/librte_ether/rte_ethdev.c	1293
rte_eth_link_get	lib/librte_ether/rte_ethdev.h	2030
rte_eth_link_get	lib/librte_ether/rte_ethdev.h	2035
rte_eth_link_get	lib/librte_ether/rte_ethdev.h	2043
rte_eth_link_get	lib/librte_pmd_bond/rte_eth_bond_8023ad.c	758
rte_eth_link_get	lib/librte_pmd_bond/rte_eth_bond_api.c	416
rte_eth_link_get	lib/librte_pmd_bond/rte_eth_bond_pmd.c	425
rte_eth_link_get	lib/librte_pmd_bond/rte_eth_bond_pmd.c	1511
rte_eth_link_get_nowait	app/test-pipeline/init.c	212
rte_eth_link_get_nowait	app/test-pmd/config.c	311
rte_eth_link_get_nowait	app/test-pmd/config.c	2134
rte_eth_link_get_nowait	app/test-pmd/config.c	2159
rte_eth_link_get_nowait	app/test-pmd/testpmd.c	1559
rte_eth_link_get_nowait	app/test/test_pmd_perf.c	179
rte_eth_link_get_nowait	examples/distributor/main.c	150
rte_eth_link_get_nowait	examples/distributor/main.c	153
rte_eth_link_get_nowait	examples/exception_path/main.c	475
rte_eth_link_get_nowait	examples/ip_fragmentation/main.c	623
rte_eth_link_get_nowait	examples/ip_pipeline/init.c	458
rte_eth_link_get_nowait	examples/ip_reassembly/main.c	752
rte_eth_link_get_nowait	examples/ipv4_multicast/main.c	631
rte_eth_link_get_nowait	examples/kni/main.c	660
rte_eth_link_get_nowait	examples/l2fwd-ivshmem/host/host.c	361
rte_eth_link_get_nowait	examples/l2fwd/main.c	501
rte_eth_link_get_nowait	examples/l3fwd-acl/main.c	1890
rte_eth_link_get_nowait	examples/l3fwd-power/main.c	1429
rte_eth_link_get_nowait	examples/l3fwd/main.c	2360
rte_eth_link_get_nowait	examples/link_status_interrupt/main.c	176
rte_eth_link_get_nowait	examples/link_status_interrupt/main.c	528
rte_eth_link_get_nowait	examples/link_status_interrupt/main.c	555
rte_eth_link_get_nowait	examples/load_balancer/init.c	386
rte_eth_link_get_nowait	examples/multi_process/client_server_mp/mp_server/init.c	220
rte_eth_link_get_nowait	examples/multi_process/l2fwd_fork/main.c	924
rte_eth_link_get_nowait	examples/multi_process/symmetric_mp/main.c	378
rte_eth_link_get_nowait	lib/librte_ether/rte_ethdev.c	1293
rte_eth_link_get_nowait	lib/librte_ether/rte_ethdev.h	2043
rte_eth_link_get_nowait	lib/librte_pmd_bond/rte_eth_bond_api.c	416
rte_eth_link_get_nowait	lib/librte_pmd_bond/rte_eth_bond_pmd.c	1511
rte_eth_stats_get	app/test-pmd/config.c	134
rte_eth_stats_get	app/test-pmd/testpmd.c	1052
rte_eth_stats_get	app/test-pmd/testpmd.c	1182
rte_eth_stats_get	app/test/test_link_bonding.c	1397
rte_eth_stats_get	app/test/test_link_bonding.c	1405
rte_eth_stats_get	app/test/test_link_bonding.c	1518
rte_eth_stats_get	app/test/test_link_bonding.c	1532
rte_eth_stats_get	app/test/test_link_bonding.c	1593
rte_eth_stats_get	app/test/test_link_bonding.c	1604
rte_eth_stats_get	app/test/test_link_bonding.c	1679
rte_eth_stats_get	app/test/test_link_bonding.c	1687
rte_eth_stats_get	app/test/test_link_bonding.c	1693
rte_eth_stats_get	app/test/test_link_bonding.c	1699
rte_eth_stats_get	app/test/test_link_bonding.c	1705
rte_eth_stats_get	app/test/test_link_bonding.c	1917
rte_eth_stats_get	app/test/test_link_bonding.c	1923
rte_eth_stats_get	app/test/test_link_bonding.c	1928
rte_eth_stats_get	app/test/test_link_bonding.c	1933
rte_eth_stats_get	app/test/test_link_bonding.c	1938
rte_eth_stats_get	app/test/test_link_bonding.c	1967
rte_eth_stats_get	app/test/test_link_bonding.c	2119
rte_eth_stats_get	app/test/test_link_bonding.c	2129
rte_eth_stats_get	app/test/test_link_bonding.c	2199
rte_eth_stats_get	app/test/test_link_bonding.c	2207
rte_eth_stats_get	app/test/test_link_bonding.c	2222
rte_eth_stats_get	app/test/test_link_bonding.c	2491
rte_eth_stats_get	app/test/test_link_bonding.c	2496
rte_eth_stats_get	app/test/test_link_bonding.c	2501
rte_eth_stats_get	app/test/test_link_bonding.c	2506
rte_eth_stats_get	app/test/test_link_bonding.c	2527
rte_eth_stats_get	app/test/test_link_bonding.c	2532
rte_eth_stats_get	app/test/test_link_bonding.c	2537
rte_eth_stats_get	app/test/test_link_bonding.c	2542
rte_eth_stats_get	app/test/test_link_bonding.c	2547
rte_eth_stats_get	app/test/test_link_bonding.c	2671
rte_eth_stats_get	app/test/test_link_bonding.c	2680
rte_eth_stats_get	app/test/test_link_bonding.c	2686
rte_eth_stats_get	app/test/test_link_bonding.c	2753
rte_eth_stats_get	app/test/test_link_bonding.c	2760
rte_eth_stats_get	app/test/test_link_bonding.c	2766
rte_eth_stats_get	app/test/test_link_bonding.c	2866
rte_eth_stats_get	app/test/test_link_bonding.c	2873
rte_eth_stats_get	app/test/test_link_bonding.c	2879
rte_eth_stats_get	app/test/test_link_bonding.c	3022
rte_eth_stats_get	app/test/test_link_bonding.c	3036
rte_eth_stats_get	app/test/test_link_bonding.c	3050
rte_eth_stats_get	app/test/test_link_bonding.c	3115
rte_eth_stats_get	app/test/test_link_bonding.c	3124
rte_eth_stats_get	app/test/test_link_bonding.c	3130
rte_eth_stats_get	app/test/test_link_bonding.c	3136
rte_eth_stats_get	app/test/test_link_bonding.c	3142
rte_eth_stats_get	app/test/test_link_bonding.c	3382
rte_eth_stats_get	app/test/test_link_bonding.c	3388
rte_eth_stats_get	app/test/test_link_bonding.c	3394
rte_eth_stats_get	app/test/test_link_bonding.c	3418
rte_eth_stats_get	app/test/test_link_bonding.c	3425
rte_eth_stats_get	app/test/test_link_bonding.c	3455
rte_eth_stats_get	app/test/test_link_bonding.c	3517
rte_eth_stats_get	app/test/test_link_bonding.c	3526
rte_eth_stats_get	app/test/test_link_bonding.c	3624
rte_eth_stats_get	app/test/test_link_bonding.c	3635
rte_eth_stats_get	app/test/test_link_bonding.c	3645
rte_eth_stats_get	app/test/test_link_bonding.c	3710
rte_eth_stats_get	app/test/test_link_bonding.c	3719
rte_eth_stats_get	app/test/test_link_bonding.c	3725
rte_eth_stats_get	app/test/test_link_bonding.c	3731
rte_eth_stats_get	app/test/test_link_bonding.c	3737
rte_eth_stats_get	app/test/test_link_bonding.c	3942
rte_eth_stats_get	app/test/test_link_bonding.c	3948
rte_eth_stats_get	app/test/test_link_bonding.c	3953
rte_eth_stats_get	app/test/test_link_bonding.c	3958
rte_eth_stats_get	app/test/test_link_bonding.c	3964
rte_eth_stats_get	app/test/test_link_bonding.c	3986
rte_eth_stats_get	app/test/test_link_bonding.c	4097
rte_eth_stats_get	app/test/test_link_bonding.c	4110
rte_eth_stats_get	app/test/test_link_bonding.c	4184
rte_eth_stats_get	app/test/test_link_bonding.c	4192
rte_eth_stats_get	app/test/test_link_bonding.c	4207
rte_eth_stats_get	app/test/test_link_bonding.c	4475
rte_eth_stats_get	app/test/test_link_bonding.c	4480
rte_eth_stats_get	app/test/test_link_bonding.c	4485
rte_eth_stats_get	app/test/test_link_bonding.c	4490
rte_eth_stats_get	app/test/test_link_bonding.c	4515
rte_eth_stats_get	app/test/test_pmd_perf.c	346
rte_eth_stats_get	app/test/test_pmd_ring.c	165
rte_eth_stats_get	app/test/test_pmd_ring.c	183
rte_eth_stats_get	app/test/test_pmd_ring.c	204
rte_eth_stats_get	app/test/test_pmd_ring.c	223
rte_eth_stats_get	app/test/test_pmd_ring.c	234
rte_eth_stats_get	app/test/test_pmd_ring.c	294
rte_eth_stats_get	app/test/test_pmd_ring.c	295
rte_eth_stats_get	app/test/test_pmd_ring.c	324
rte_eth_stats_get	app/test/test_pmd_ring.c	325
rte_eth_stats_get	app/test/test_pmd_ring.c	354
rte_eth_stats_get	app/test/test_pmd_ring.c	355
rte_eth_stats_get	app/test/test_pmd_ring.c	384
rte_eth_stats_get	app/test/test_pmd_ring.c	385
rte_eth_stats_get	examples/distributor/main.c	390
rte_eth_stats_get	examples/load_balancer/runtime.c	213
rte_eth_stats_get	examples/qos_sched/main.c	188
rte_eth_stats_get	examples/qos_sched/main.c	197
rte_eth_stats_get	lib/librte_ether/rte_ethdev.c	1314
rte_eth_stats_get	lib/librte_ether/rte_ethdev.c	1380
rte_eth_stats_get	lib/librte_ether/rte_ethdev.h	2061
rte_eth_stats_get	lib/librte_pmd_bond/rte_eth_bond_pmd.c	454
rte_eth_stats_get	lib/librte_pmd_bond/rte_eth_bond_pmd.c	1372
rte_eth_stats_reset	app/test-pmd/config.c	208
rte_eth_stats_reset	app/test/test_link_bonding.c	465
rte_eth_stats_reset	app/test/test_link_bonding.c	697
rte_eth_stats_reset	app/test/test_link_bonding.c	1169
rte_eth_stats_reset	app/test/test_link_bonding.c	1619
rte_eth_stats_reset	app/test/test_link_bonding.c	1622
rte_eth_stats_reset	app/test/test_link_bonding.c	1910
rte_eth_stats_reset	app/test/test_link_bonding.c	2239
rte_eth_stats_reset	app/test/test_link_bonding.c	3929
rte_eth_stats_reset	app/test/test_link_bonding.c	4220
rte_eth_stats_reset	app/test/test_pmd_ring.c	201
rte_eth_stats_reset	app/test/test_pmd_ring.c	231
rte_eth_stats_reset	lib/librte_ether/rte_ethdev.c	1332
rte_eth_stats_reset	lib/librte_ether/rte_ethdev.c	1442
rte_eth_stats_reset	lib/librte_ether/rte_ethdev.h	2069
rte_eth_stats_reset	lib/librte_pmd_bond/rte_eth_bond_pmd.c	1398
rte_eth_xstats_get	app/test-pmd/config.c	220
rte_eth_xstats_get	app/test-pmd/config.c	230
rte_eth_xstats_get	lib/librte_ether/rte_ethdev.c	1349
rte_eth_xstats_get	lib/librte_ether/rte_ethdev.h	2092
rte_eth_xstats_reset	app/test-pmd/config.c	244
rte_eth_xstats_reset	lib/librte_ether/rte_ethdev.c	1424
rte_eth_xstats_reset	lib/librte_ether/rte_ethdev.h	2101
rte_eth_dev_set_tx_queue_stats_mapping	app/test-pmd/testpmd.c	1605
rte_eth_dev_set_tx_queue_stats_mapping	lib/librte_ether/rte_ethdev.c	1465
rte_eth_dev_set_tx_queue_stats_mapping	lib/librte_ether/rte_ethdev.h	2120
rte_eth_dev_set_rx_queue_stats_mapping	app/test-pmd/testpmd.c	1628
rte_eth_dev_set_rx_queue_stats_mapping	lib/librte_ether/rte_ethdev.c	1474
rte_eth_dev_set_rx_queue_stats_mapping	lib/librte_ether/rte_ethdev.h	2141
rte_eth_macaddr_get	app/test-pmd/config.c	314
rte_eth_macaddr_get	app/test-pmd/testpmd.c	1401
rte_eth_macaddr_get	app/test-pmd/testpmd.c	1752
rte_eth_macaddr_get	app/test-pmd/testpmd.c	1879
rte_eth_macaddr_get	app/test/test_link_bonding.c	459
rte_eth_macaddr_get	app/test/test_link_bonding.c	816
rte_eth_macaddr_get	app/test/test_link_bonding.c	822
rte_eth_macaddr_get	app/test/test_link_bonding.c	830
rte_eth_macaddr_get	app/test/test_link_bonding.c	896
rte_eth_macaddr_get	app/test/test_link_bonding.c	902
rte_eth_macaddr_get	app/test/test_link_bonding.c	1017
rte_eth_macaddr_get	app/test/test_link_bonding.c	1022
rte_eth_macaddr_get	app/test/test_link_bonding.c	1028
rte_eth_macaddr_get	app/test/test_link_bonding.c	1034
rte_eth_macaddr_get	app/test/test_link_bonding.c	1053
rte_eth_macaddr_get	app/test/test_link_bonding.c	1059
rte_eth_macaddr_get	app/test/test_link_bonding.c	1065
rte_eth_macaddr_get	app/test/test_link_bonding.c	1070
rte_eth_macaddr_get	app/test/test_link_bonding.c	1096
rte_eth_macaddr_get	app/test/test_link_bonding.c	1102
rte_eth_macaddr_get	app/test/test_link_bonding.c	1108
rte_eth_macaddr_get	app/test/test_link_bonding.c	1728
rte_eth_macaddr_get	app/test/test_link_bonding.c	1729
rte_eth_macaddr_get	app/test/test_link_bonding.c	1738
rte_eth_macaddr_get	app/test/test_link_bonding.c	1752
rte_eth_macaddr_get	app/test/test_link_bonding.c	1767
rte_eth_macaddr_get	app/test/test_link_bonding.c	1774
rte_eth_macaddr_get	app/test/test_link_bonding.c	1786
rte_eth_macaddr_get	app/test/test_link_bonding.c	1793
rte_eth_macaddr_get	app/test/test_link_bonding.c	2305
rte_eth_macaddr_get	app/test/test_link_bonding.c	2306
rte_eth_macaddr_get	app/test/test_link_bonding.c	2315
rte_eth_macaddr_get	app/test/test_link_bonding.c	2321
rte_eth_macaddr_get	app/test/test_link_bonding.c	2327
rte_eth_macaddr_get	app/test/test_link_bonding.c	2339
rte_eth_macaddr_get	app/test/test_link_bonding.c	2345
rte_eth_macaddr_get	app/test/test_link_bonding.c	2351
rte_eth_macaddr_get	app/test/test_link_bonding.c	2365
rte_eth_macaddr_get	app/test/test_link_bonding.c	2371
rte_eth_macaddr_get	app/test/test_link_bonding.c	2377
rte_eth_macaddr_get	app/test/test_link_bonding.c	2388
rte_eth_macaddr_get	app/test/test_link_bonding.c	2394
rte_eth_macaddr_get	app/test/test_link_bonding.c	2400
rte_eth_macaddr_get	app/test/test_link_bonding.c	3207
rte_eth_macaddr_get	app/test/test_link_bonding.c	3208
rte_eth_macaddr_get	app/test/test_link_bonding.c	3217
rte_eth_macaddr_get	app/test/test_link_bonding.c	3223
rte_eth_macaddr_get	app/test/test_link_bonding.c	3229
rte_eth_macaddr_get	app/test/test_link_bonding.c	3241
rte_eth_macaddr_get	app/test/test_link_bonding.c	3247
rte_eth_macaddr_get	app/test/test_link_bonding.c	3253
rte_eth_macaddr_get	app/test/test_link_bonding.c	3267
rte_eth_macaddr_get	app/test/test_link_bonding.c	3273
rte_eth_macaddr_get	app/test/test_link_bonding.c	3279
rte_eth_macaddr_get	app/test/test_link_bonding.c	3290
rte_eth_macaddr_get	app/test/test_link_bonding.c	3296
rte_eth_macaddr_get	app/test/test_link_bonding.c	3302
rte_eth_macaddr_get	app/test/test_link_bonding.c	3805
rte_eth_macaddr_get	app/test/test_link_bonding.c	3806
rte_eth_macaddr_get	app/test/test_link_bonding.c	3816
rte_eth_macaddr_get	app/test/test_link_bonding.c	3830
rte_eth_macaddr_get	app/test/test_link_bonding.c	3846
rte_eth_macaddr_get	app/test/test_link_bonding.c	3853
rte_eth_macaddr_get	app/test/test_link_bonding.c	3865
rte_eth_macaddr_get	app/test/test_link_bonding.c	3873
rte_eth_macaddr_get	app/test/test_link_bonding.c	4287
rte_eth_macaddr_get	app/test/test_link_bonding.c	4288
rte_eth_macaddr_get	app/test/test_link_bonding.c	4297
rte_eth_macaddr_get	app/test/test_link_bonding.c	4303
rte_eth_macaddr_get	app/test/test_link_bonding.c	4309
rte_eth_macaddr_get	app/test/test_link_bonding.c	4321
rte_eth_macaddr_get	app/test/test_link_bonding.c	4327
rte_eth_macaddr_get	app/test/test_link_bonding.c	4333
rte_eth_macaddr_get	app/test/test_link_bonding.c	4347
rte_eth_macaddr_get	app/test/test_link_bonding.c	4353
rte_eth_macaddr_get	app/test/test_link_bonding.c	4359
rte_eth_macaddr_get	app/test/test_link_bonding.c	4371
rte_eth_macaddr_get	app/test/test_link_bonding.c	4377
rte_eth_macaddr_get	app/test/test_link_bonding.c	4383
rte_eth_macaddr_get	app/test/test_pmd_perf.c	758
rte_eth_macaddr_get	examples/distributor/main.c	162
rte_eth_macaddr_get	examples/dpdk_qat/main.c	732
rte_eth_macaddr_get	examples/ip_fragmentation/main.c	910
rte_eth_macaddr_get	examples/ip_reassembly/main.c	1115
rte_eth_macaddr_get	examples/ipv4_multicast/main.c	761
rte_eth_macaddr_get	examples/l2fwd-ivshmem/host/host.c	750
rte_eth_macaddr_get	examples/l2fwd-ivshmem/host/host.c	819
rte_eth_macaddr_get	examples/l2fwd/main.c	655
rte_eth_macaddr_get	examples/l3fwd-acl/main.c	1998
rte_eth_macaddr_get	examples/l3fwd-power/main.c	1540
rte_eth_macaddr_get	examples/l3fwd-vf/main.c	1018
rte_eth_macaddr_get	examples/l3fwd/main.c	2463
rte_eth_macaddr_get	examples/link_status_interrupt/main.c	709
rte_eth_macaddr_get	examples/multi_process/client_server_mp/mp_server/main.c	104
rte_eth_macaddr_get	examples/multi_process/l2fwd_fork/main.c	1126
rte_eth_macaddr_get	examples/quota_watermark/qw/main.c	96
rte_eth_macaddr_get	examples/skeleton/basicfwd.c	92
rte_eth_macaddr_get	examples/vhost/main.c	473
rte_eth_macaddr_get	examples/vhost_xen/main.c	334
rte_eth_macaddr_get	examples/vmdq/main.c	288
rte_eth_macaddr_get	examples/vmdq_dcb/main.c	203
rte_eth_macaddr_get	lib/librte_ether/rte_ethdev.c	1504
rte_eth_macaddr_get	lib/librte_ether/rte_ethdev.h	2154
rte_eth_macaddr_get	lib/librte_pmd_bond/rte_eth_bond_8023ad.c	598
rte_eth_macaddr_get	lib/librte_pmd_bond/rte_eth_bond_8023ad.c	759
rte_eth_macaddr_get	lib/librte_pmd_bond/rte_eth_bond_8023ad.c	979
rte_eth_macaddr_get	lib/librte_pmd_bond/rte_eth_bond_8023ad.c	1112
rte_eth_macaddr_get	lib/librte_pmd_bond/rte_eth_bond_pmd.c	124
rte_eth_dev_info_get	app/test-pmd/cmdline.c	1787
rte_eth_dev_info_get	app/test-pmd/cmdline.c	1904
rte_eth_dev_info_get	app/test-pmd/cmdline.c	3032
rte_eth_dev_info_get	app/test-pmd/cmdline.c	3131
rte_eth_dev_info_get	app/test-pmd/config.c	359
rte_eth_dev_info_get	app/test-pmd/config.c	675
rte_eth_dev_info_get	app/test-pmd/testpmd.c	565
rte_eth_dev_info_get	app/test-pmd/testpmd.c	635
rte_eth_dev_info_get	app/test/test_kni.c	389
rte_eth_dev_info_get	app/test/test_kni.c	557
rte_eth_dev_info_get	app/test/test_kni.c	586
rte_eth_dev_info_get	examples/dpdk_qat/main.c	361
rte_eth_dev_info_get	examples/dpdk_qat/main.c	370
rte_eth_dev_info_get	examples/ip_fragmentation/main.c	924
rte_eth_dev_info_get	examples/ip_reassembly/main.c	1130
rte_eth_dev_info_get	examples/ipv4_multicast/main.c	786
rte_eth_dev_info_get	examples/kni/main.c	804
rte_eth_dev_info_get	examples/l2fwd-ivshmem/host/host.c	717
rte_eth_dev_info_get	examples/l2fwd/main.c	603
rte_eth_dev_info_get	examples/l3fwd-acl/main.c	2022
rte_eth_dev_info_get	examples/l3fwd-power/main.c	1564
rte_eth_dev_info_get	examples/l3fwd-vf/main.c	1032
rte_eth_dev_info_get	examples/l3fwd/main.c	2494
rte_eth_dev_info_get	examples/link_status_interrupt/main.c	652
rte_eth_dev_info_get	examples/multi_process/l2fwd_fork/main.c	1064
rte_eth_dev_info_get	examples/multi_process/symmetric_mp/main.c	245
rte_eth_dev_info_get	examples/vhost/main.c	381
rte_eth_dev_info_get	examples/vhost_xen/main.c	287
rte_eth_dev_info_get	examples/vhost_xen/main.c	310
rte_eth_dev_info_get	examples/vmdq/main.c	210
rte_eth_dev_info_get	examples/vmdq/main.c	258
rte_eth_dev_info_get	lib/librte_ether/rte_ethdev.c	877
rte_eth_dev_info_get	lib/librte_ether/rte_ethdev.c	1083
rte_eth_dev_info_get	lib/librte_ether/rte_ethdev.c	1152
rte_eth_dev_info_get	lib/librte_ether/rte_ethdev.c	1483
rte_eth_dev_info_get	lib/librte_ether/rte_ethdev.c	2268
rte_eth_dev_info_get	lib/librte_ether/rte_ethdev.c	2381
rte_eth_dev_info_get	lib/librte_ether/rte_ethdev.c	2409
rte_eth_dev_info_get	lib/librte_ether/rte_ethdev.c	2507
rte_eth_dev_info_get	lib/librte_ether/rte_ethdev.c	2533
rte_eth_dev_info_get	lib/librte_ether/rte_ethdev.c	2590
rte_eth_dev_info_get	lib/librte_ether/rte_ethdev.c	2627
rte_eth_dev_info_get	lib/librte_ether/rte_ethdev.h	2165
rte_eth_dev_info_get	lib/librte_ether/rte_ethdev.h	2941
rte_eth_dev_info_get	lib/librte_ether/rte_ethdev.h	2960
rte_eth_dev_info_get	lib/librte_kni/rte_kni.c	320
rte_eth_dev_info_get	lib/librte_pmd_bond/rte_eth_bond_api.c	357
rte_eth_dev_get_mtu	lib/librte_ether/rte_ethdev.c	1519
rte_eth_dev_get_mtu	lib/librte_ether/rte_ethdev.h	2179
rte_eth_dev_set_mtu	app/test-pmd/config.c	565
rte_eth_dev_set_mtu	lib/librte_ether/rte_ethdev.c	1534
rte_eth_dev_set_mtu	lib/librte_ether/rte_ethdev.h	2194
rte_eth_dev_vlan_filter	app/test-pmd/config.c	1660
rte_eth_dev_vlan_filter	app/test-pmd/config.c	1663
rte_eth_dev_vlan_filter	lib/librte_ether/rte_ethdev.c	1555
rte_eth_dev_vlan_filter	lib/librte_ether/rte_ethdev.h	2214
rte_eth_dev_set_vlan_strip_on_queue	app/test-pmd/config.c	1623
rte_eth_dev_set_vlan_strip_on_queue	examples/vhost/main.c	953
rte_eth_dev_set_vlan_strip_on_queue	examples/vhost_xen/main.c	736
rte_eth_dev_set_vlan_strip_on_queue	lib/librte_ether/rte_ethdev.c	1581
rte_eth_dev_set_vlan_strip_on_queue	lib/librte_ether/rte_ethdev.h	2235
rte_eth_dev_set_vlan_ether_type	app/test-pmd/config.c	1686
rte_eth_dev_set_vlan_ether_type	lib/librte_ether/rte_ethdev.c	1604
rte_eth_dev_set_vlan_ether_type	lib/librte_ether/rte_ethdev.h	2252
rte_eth_dev_set_vlan_offload	app/test-pmd/config.c	1587
rte_eth_dev_set_vlan_offload	app/test-pmd/config.c	1609
rte_eth_dev_set_vlan_offload	app/test-pmd/config.c	1645
rte_eth_dev_set_vlan_offload	lib/librte_ether/rte_ethdev.c	1621
rte_eth_dev_set_vlan_offload	lib/librte_ether/rte_ethdev.h	2274
rte_eth_dev_get_vlan_offload	app/test-pmd/config.c	339
rte_eth_dev_get_vlan_offload	app/test-pmd/config.c	1580
rte_eth_dev_get_vlan_offload	app/test-pmd/config.c	1602
rte_eth_dev_get_vlan_offload	app/test-pmd/config.c	1638
rte_eth_dev_get_vlan_offload	lib/librte_ether/rte_ethdev.c	1668
rte_eth_dev_get_vlan_offload	lib/librte_ether/rte_ethdev.h	2288
rte_eth_dev_set_vlan_pvid	app/test-pmd/config.c	1720
rte_eth_dev_set_vlan_pvid	lib/librte_ether/rte_ethdev.c	1693
rte_eth_dev_set_vlan_pvid	lib/librte_ether/rte_ethdev.h	2304
rte_eth_rx_burst	app/test-pipeline/pipeline_hash.c	439
rte_eth_rx_burst	app/test-pipeline/runtime.c	88
rte_eth_rx_burst	app/test-pmd/csumonly.c	506
rte_eth_rx_burst	app/test-pmd/flowgen.c	158
rte_eth_rx_burst	app/test-pmd/icmpecho.c	313
rte_eth_rx_burst	app/test-pmd/ieee1588fwd.c	540
rte_eth_rx_burst	app/test-pmd/iofwd.c	97
rte_eth_rx_burst	app/test-pmd/macfwd-retry.c	111
rte_eth_rx_burst	app/test-pmd/macfwd.c	102
rte_eth_rx_burst	app/test-pmd/macswap.c	102
rte_eth_rx_burst	app/test-pmd/rxonly.c	110
rte_eth_rx_burst	app/test-pmd/testpmd.c	922
rte_eth_rx_burst	app/test/test_link_bonding.c	1587
rte_eth_rx_burst	app/test/test_link_bonding.c	1672
rte_eth_rx_burst	app/test/test_link_bonding.c	1961
rte_eth_rx_burst	app/test/test_link_bonding.c	1964
rte_eth_rx_burst	app/test/test_link_bonding.c	2193
rte_eth_rx_burst	app/test/test_link_bonding.c	2195
rte_eth_rx_burst	app/test/test_link_bonding.c	2522
rte_eth_rx_burst	app/test/test_link_bonding.c	2524
rte_eth_rx_burst	app/test/test_link_bonding.c	3109
rte_eth_rx_burst	app/test/test_link_bonding.c	3451
rte_eth_rx_burst	app/test/test_link_bonding.c	3704
rte_eth_rx_burst	app/test/test_link_bonding.c	3980
rte_eth_rx_burst	app/test/test_link_bonding.c	3982
rte_eth_rx_burst	app/test/test_link_bonding.c	4177
rte_eth_rx_burst	app/test/test_link_bonding.c	4180
rte_eth_rx_burst	app/test/test_link_bonding.c	4507
rte_eth_rx_burst	app/test/test_link_bonding.c	4509
rte_eth_rx_burst	app/test/test_pmd_perf.c	394
rte_eth_rx_burst	app/test/test_pmd_perf.c	433
rte_eth_rx_burst	app/test/test_pmd_perf.c	470
rte_eth_rx_burst	app/test/test_pmd_perf.c	548
rte_eth_rx_burst	app/test/test_pmd_perf.c	611
rte_eth_rx_burst	app/test/test_pmd_ring.c	142
rte_eth_rx_burst	app/test/test_pmd_ring.c	178
rte_eth_rx_burst	app/test/test_pmd_ring.c	218
rte_eth_rx_burst	app/test/test_pmd_ring.c	289
rte_eth_rx_burst	app/test/test_pmd_ring.c	319
rte_eth_rx_burst	app/test/test_pmd_ring.c	349
rte_eth_rx_burst	app/test/test_pmd_ring.c	379
rte_eth_rx_burst	examples/distributor/main.c	230
rte_eth_rx_burst	examples/dpdk_qat/main.c	193
rte_eth_rx_burst	examples/exception_path/main.c	245
rte_eth_rx_burst	examples/ip_fragmentation/main.c	466
rte_eth_rx_burst	examples/ip_pipeline/pipeline_rx.c	305
rte_eth_rx_burst	examples/ip_reassembly/main.c	511
rte_eth_rx_burst	examples/ipv4_multicast/main.c	465
rte_eth_rx_burst	examples/kni/main.c	257
rte_eth_rx_burst	examples/l2fwd-ivshmem/host/host.c	610
rte_eth_rx_burst	examples/l2fwd/main.c	334
rte_eth_rx_burst	examples/l3fwd-acl/main.c	1454
rte_eth_rx_burst	examples/l3fwd-power/main.c	849
rte_eth_rx_burst	examples/l3fwd-vf/main.c	562
rte_eth_rx_burst	examples/l3fwd/main.c	1470
rte_eth_rx_burst	examples/link_status_interrupt/main.c	353
rte_eth_rx_burst	examples/load_balancer/runtime.c	196
rte_eth_rx_burst	examples/multi_process/client_server_mp/mp_server/main.c	288
rte_eth_rx_burst	examples/multi_process/l2fwd_fork/main.c	718
rte_eth_rx_burst	examples/multi_process/symmetric_mp/main.c	345
rte_eth_rx_burst	examples/netmap_compat/lib/compat_netmap.c	471
rte_eth_rx_burst	examples/qos_meter/main.c	217
rte_eth_rx_burst	examples/qos_sched/app_thread.c	96
rte_eth_rx_burst	examples/quota_watermark/qw/main.c	188
rte_eth_rx_burst	examples/skeleton/basicfwd.c	127
rte_eth_rx_burst	examples/vhost/main.c	981
rte_eth_rx_burst	examples/vhost/main.c	988
rte_eth_rx_burst	examples/vhost/main.c	1274
rte_eth_rx_burst	examples/vhost/main.c	2114
rte_eth_rx_burst	examples/vhost_xen/main.c	765
rte_eth_rx_burst	examples/vhost_xen/main.c	772
rte_eth_rx_burst	examples/vhost_xen/main.c	1065
rte_eth_rx_burst	examples/vmdq/main.c	520
rte_eth_rx_burst	examples/vmdq_dcb/main.c	354
rte_eth_rx_burst	lib/librte_ether/rte_ethdev.c	2715
rte_eth_rx_burst	lib/librte_ether/rte_ethdev.h	2312
rte_eth_rx_burst	lib/librte_ether/rte_ethdev.h	2328
rte_eth_rx_burst	lib/librte_ether/rte_ethdev.h	2332
rte_eth_rx_burst	lib/librte_ether/rte_ethdev.h	2339
rte_eth_rx_burst	lib/librte_ether/rte_ethdev.h	2354
rte_eth_rx_burst	lib/librte_ether/rte_ethdev.h	2358
rte_eth_rx_burst	lib/librte_ether/rte_ethdev.h	2367
rte_eth_rx_burst	lib/librte_ether/rte_ethdev.h	2389
rte_eth_rx_burst	lib/librte_ether/rte_ethdev.h	2393
rte_eth_rx_burst	lib/librte_pmd_bond/rte_eth_bond_pmd.c	78
rte_eth_rx_burst	lib/librte_pmd_bond/rte_eth_bond_pmd.c	100
rte_eth_rx_burst	lib/librte_pmd_bond/rte_eth_bond_pmd.c	136
rte_eth_rx_burst	lib/librte_port/rte_port_ethdev.c	83
rte_eth_rx_queue_count	lib/librte_ether/rte_ethdev.c	2758
rte_eth_rx_queue_count	lib/librte_ether/rte_ethdev.h	2414
rte_eth_rx_queue_count	lib/librte_ether/rte_ethdev.h	2417
rte_eth_rx_descriptor_done	examples/l3fwd-power/main.c	746
rte_eth_rx_descriptor_done	examples/l3fwd-power/main.c	750
rte_eth_rx_descriptor_done	examples/l3fwd-power/main.c	753
rte_eth_rx_descriptor_done	lib/librte_ether/rte_ethdev.c	2773
rte_eth_rx_descriptor_done	lib/librte_ether/rte_ethdev.h	2441
rte_eth_rx_descriptor_done	lib/librte_ether/rte_ethdev.h	2446
rte_eth_tx_burst	app/test-pipeline/runtime.c	166
rte_eth_tx_burst	app/test-pmd/csumonly.c	676
rte_eth_tx_burst	app/test-pmd/flowgen.c	219
rte_eth_tx_burst	app/test-pmd/icmpecho.c	470
rte_eth_tx_burst	app/test-pmd/ieee1588fwd.c	614
rte_eth_tx_burst	app/test-pmd/iofwd.c	106
rte_eth_tx_burst	app/test-pmd/macfwd-retry.c	128
rte_eth_tx_burst	app/test-pmd/macfwd-retry.c	136
rte_eth_tx_burst	app/test-pmd/macfwd.c	126
rte_eth_tx_burst	app/test-pmd/macswap.c	128
rte_eth_tx_burst	app/test-pmd/txonly.c	275
rte_eth_tx_burst	app/test/test_link_bonding.c	1392
rte_eth_tx_burst	app/test/test_link_bonding.c	1420
rte_eth_tx_burst	app/test/test_link_bonding.c	1501
rte_eth_tx_burst	app/test/test_link_bonding.c	1914
rte_eth_tx_burst	app/test/test_link_bonding.c	1915
rte_eth_tx_burst	app/test/test_link_bonding.c	2115
rte_eth_tx_burst	app/test/test_link_bonding.c	2151
rte_eth_tx_burst	app/test/test_link_bonding.c	2487
rte_eth_tx_burst	app/test/test_link_bonding.c	2489
rte_eth_tx_burst	app/test/test_link_bonding.c	2665
rte_eth_tx_burst	app/test/test_link_bonding.c	2700
rte_eth_tx_burst	app/test/test_link_bonding.c	2743
rte_eth_tx_burst	app/test/test_link_bonding.c	2748
rte_eth_tx_burst	app/test/test_link_bonding.c	2780
rte_eth_tx_burst	app/test/test_link_bonding.c	2855
rte_eth_tx_burst	app/test/test_link_bonding.c	2860
rte_eth_tx_burst	app/test/test_link_bonding.c	2893
rte_eth_tx_burst	app/test/test_link_bonding.c	2996
rte_eth_tx_burst	app/test/test_link_bonding.c	3013
rte_eth_tx_burst	app/test/test_link_bonding.c	3373
rte_eth_tx_burst	app/test/test_link_bonding.c	3375
rte_eth_tx_burst	app/test/test_link_bonding.c	3377
rte_eth_tx_burst	app/test/test_link_bonding.c	3379
rte_eth_tx_burst	app/test/test_link_bonding.c	3414
rte_eth_tx_burst	app/test/test_link_bonding.c	3416
rte_eth_tx_burst	app/test/test_link_bonding.c	3510
rte_eth_tx_burst	app/test/test_link_bonding.c	3541
rte_eth_tx_burst	app/test/test_link_bonding.c	3606
rte_eth_tx_burst	app/test/test_link_bonding.c	3938
rte_eth_tx_burst	app/test/test_link_bonding.c	3940
rte_eth_tx_burst	app/test/test_link_bonding.c	4085
rte_eth_tx_burst	app/test/test_link_bonding.c	4132
rte_eth_tx_burst	app/test/test_link_bonding.c	4469
rte_eth_tx_burst	app/test/test_link_bonding.c	4471
rte_eth_tx_burst	app/test/test_pmd_perf.c	402
rte_eth_tx_burst	app/test/test_pmd_perf.c	442
rte_eth_tx_burst	app/test/test_pmd_perf.c	480
rte_eth_tx_burst	app/test/test_pmd_perf.c	525
rte_eth_tx_burst	app/test/test_pmd_perf.c	669
rte_eth_tx_burst	app/test/test_pmd_ring.c	137
rte_eth_tx_burst	app/test/test_pmd_ring.c	174
rte_eth_tx_burst	app/test/test_pmd_ring.c	213
rte_eth_tx_burst	app/test/test_pmd_ring.c	284
rte_eth_tx_burst	app/test/test_pmd_ring.c	314
rte_eth_tx_burst	app/test/test_pmd_ring.c	344
rte_eth_tx_burst	app/test/test_pmd_ring.c	374
rte_eth_tx_burst	examples/distributor/main.c	270
rte_eth_tx_burst	examples/dpdk_qat/main.c	235
rte_eth_tx_burst	examples/dpdk_qat/main.c	270
rte_eth_tx_burst	examples/exception_path/main.c	291
rte_eth_tx_burst	examples/ip_fragmentation/main.c	257
rte_eth_tx_burst	examples/ip_pipeline/pipeline_tx.c	264
rte_eth_tx_burst	examples/ip_reassembly/main.c	297
rte_eth_tx_burst	examples/ipv4_multicast/main.c	212
rte_eth_tx_burst	examples/kni/main.c	299
rte_eth_tx_burst	examples/l2fwd-ivshmem/host/host.c	409
rte_eth_tx_burst	examples/l2fwd/main.c	200
rte_eth_tx_burst	examples/l3fwd-acl/main.c	1310
rte_eth_tx_burst	examples/l3fwd-power/main.c	444
rte_eth_tx_burst	examples/l3fwd-vf/main.c	319
rte_eth_tx_burst	examples/l3fwd/main.c	508
rte_eth_tx_burst	examples/l3fwd/main.c	556
rte_eth_tx_burst	examples/link_status_interrupt/main.c	218
rte_eth_tx_burst	examples/load_balancer/runtime.c	384
rte_eth_tx_burst	examples/load_balancer/runtime.c	432
rte_eth_tx_burst	examples/multi_process/client_server_mp/mp_client/client.c	181
rte_eth_tx_burst	examples/multi_process/l2fwd_fork/main.c	596
rte_eth_tx_burst	examples/multi_process/symmetric_mp/main.c	350
rte_eth_tx_burst	examples/netmap_compat/lib/compat_netmap.c	561
rte_eth_tx_burst	examples/qos_meter/main.c	201
rte_eth_tx_burst	examples/qos_meter/main.c	234
rte_eth_tx_burst	examples/qos_sched/app_thread.c	141
rte_eth_tx_burst	examples/quota_watermark/qw/main.c	110
rte_eth_tx_burst	examples/quota_watermark/qw/main.c	299
rte_eth_tx_burst	examples/skeleton/basicfwd.c	131
rte_eth_tx_burst	examples/vhost/main.c	1170
rte_eth_tx_burst	examples/vhost/main.c	1232
rte_eth_tx_burst	examples/vhost/main.c	1844
rte_eth_tx_burst	examples/vhost/main.c	2050
rte_eth_tx_burst	examples/vhost_xen/main.c	889
rte_eth_tx_burst	examples/vhost_xen/main.c	1025
rte_eth_tx_burst	examples/vmdq/main.c	531
rte_eth_tx_burst	examples/vmdq_dcb/main.c	360
rte_eth_tx_burst	lib/librte_ether/rte_ethdev.c	2736
rte_eth_tx_burst	lib/librte_ether/rte_ethdev.h	2459
rte_eth_tx_burst	lib/librte_ether/rte_ethdev.h	2464
rte_eth_tx_burst	lib/librte_ether/rte_ethdev.h	2467
rte_eth_tx_burst	lib/librte_ether/rte_ethdev.h	2478
rte_eth_tx_burst	lib/librte_ether/rte_ethdev.h	2481
rte_eth_tx_burst	lib/librte_ether/rte_ethdev.h	2486
rte_eth_tx_burst	lib/librte_ether/rte_ethdev.h	2489
rte_eth_tx_burst	lib/librte_ether/rte_ethdev.h	2494
rte_eth_tx_burst	lib/librte_ether/rte_ethdev.h	2516
rte_eth_tx_burst	lib/librte_ether/rte_ethdev.h	2520
rte_eth_tx_burst	lib/librte_pmd_bond/rte_eth_bond_pmd.c	218
rte_eth_tx_burst	lib/librte_pmd_bond/rte_eth_bond_pmd.c	251
rte_eth_tx_burst	lib/librte_pmd_bond/rte_eth_bond_pmd.c	521
rte_eth_tx_burst	lib/librte_pmd_bond/rte_eth_bond_pmd.c	572
rte_eth_tx_burst	lib/librte_pmd_bond/rte_eth_bond_pmd.c	663
rte_eth_tx_burst	lib/librte_pmd_bond/rte_eth_bond_pmd.c	718
rte_eth_tx_burst	lib/librte_port/rte_port_ethdev.c	152
rte_eth_tx_burst	lib/librte_port/rte_port_ethdev.c	232
rte_eth_dev_fdir_add_signature_filter	app/test-pmd/config.c	1784
rte_eth_dev_fdir_add_signature_filter	app/test-pmd/config.c	1789
rte_eth_dev_fdir_add_signature_filter	app/test-pmd/config.c	1824
rte_eth_dev_fdir_add_signature_filter	lib/librte_ether/rte_ethdev.c	1710
rte_eth_dev_fdir_add_signature_filter	lib/librte_ether/rte_ethdev.h	2552
rte_eth_dev_fdir_update_signature_filter	app/test-pmd/config.c	1802
rte_eth_dev_fdir_update_signature_filter	app/test-pmd/config.c	1807
rte_eth_dev_fdir_update_signature_filter	lib/librte_ether/rte_ethdev.c	1744
rte_eth_dev_fdir_update_signature_filter	lib/librte_ether/rte_ethdev.h	2578
rte_eth_dev_fdir_remove_signature_filter	app/test-pmd/config.c	1820
rte_eth_dev_fdir_remove_signature_filter	lib/librte_ether/rte_ethdev.c	1779
rte_eth_dev_fdir_remove_signature_filter	lib/librte_ether/rte_ethdev.h	2600
rte_eth_dev_fdir_get_infos	app/test-pmd/config.c	1896
rte_eth_dev_fdir_get_infos	lib/librte_ether/rte_ethdev.c	1811
rte_eth_dev_fdir_get_infos	lib/librte_ether/rte_ethdev.h	2617
rte_eth_dev_fdir_add_perfect_filter	app/test-pmd/config.c	1966
rte_eth_dev_fdir_add_perfect_filter	app/test-pmd/config.c	1971
rte_eth_dev_fdir_add_perfect_filter	lib/librte_ether/rte_ethdev.c	1833
rte_eth_dev_fdir_add_perfect_filter	lib/librte_ether/rte_ethdev.h	2647
rte_eth_dev_fdir_update_perfect_filter	app/test-pmd/config.c	1984
rte_eth_dev_fdir_update_perfect_filter	app/test-pmd/config.c	1989
rte_eth_dev_fdir_update_perfect_filter	app/test-pmd/config.c	2007
rte_eth_dev_fdir_update_perfect_filter	lib/librte_ether/rte_ethdev.c	1873
rte_eth_dev_fdir_update_perfect_filter	lib/librte_ether/rte_ethdev.h	2681
rte_eth_dev_fdir_remove_perfect_filter	app/test-pmd/config.c	2002
rte_eth_dev_fdir_remove_perfect_filter	lib/librte_ether/rte_ethdev.c	1912
rte_eth_dev_fdir_remove_perfect_filter	lib/librte_ether/rte_ethdev.h	2707
rte_eth_dev_fdir_set_masks	app/test-pmd/config.c	2019
rte_eth_dev_fdir_set_masks	lib/librte_ether/rte_ethdev.c	1950
rte_eth_dev_fdir_set_masks	lib/librte_ether/rte_ethdev.h	2743
rte_eth_dev_callback_register	app/test/test_link_bonding.c	1236
rte_eth_dev_callback_register	app/test/test_link_bonding.c	2036
rte_eth_dev_callback_register	examples/link_status_interrupt/main.c	706
rte_eth_dev_callback_register	lib/librte_ether/rte_ethdev.c	2790
rte_eth_dev_callback_register	lib/librte_ether/rte_ethdev.h	2777
rte_eth_dev_callback_register	lib/librte_pmd_bond/rte_eth_bond_api.c	410
rte_eth_dev_callback_unregister	app/test/test_link_bonding.c	1303
rte_eth_dev_callback_unregister	app/test/test_link_bonding.c	2064
rte_eth_dev_callback_unregister	lib/librte_ether/rte_ethdev.c	2830
rte_eth_dev_callback_unregister	lib/librte_ether/rte_ethdev.h	2798
rte_eth_dev_callback_unregister	lib/librte_pmd_bond/rte_eth_bond_api.c	486
rte_eth_led_on	lib/librte_ether/rte_ethdev.c	2228
rte_eth_led_on	lib/librte_ether/rte_ethdev.h	2830
rte_eth_led_off	lib/librte_ether/rte_ethdev.c	2243
rte_eth_led_off	lib/librte_ether/rte_ethdev.h	2844
rte_eth_dev_flow_ctrl_get	app/test-pmd/cmdline.c	5220
rte_eth_dev_flow_ctrl_get	lib/librte_ether/rte_ethdev.c	1970
rte_eth_dev_flow_ctrl_get	lib/librte_ether/rte_ethdev.h	2858
rte_eth_dev_flow_ctrl_set	app/test-pmd/cmdline.c	5265
rte_eth_dev_flow_ctrl_set	examples/quota_watermark/qw/init.c	105
rte_eth_dev_flow_ctrl_set	lib/librte_ether/rte_ethdev.c	1986
rte_eth_dev_flow_ctrl_set	lib/librte_ether/rte_ethdev.h	2875
rte_eth_dev_priority_flow_ctrl_set	app/test-pmd/cmdline.c	5313
rte_eth_dev_priority_flow_ctrl_set	lib/librte_ether/rte_ethdev.c	2006
rte_eth_dev_priority_flow_ctrl_set	lib/librte_ether/rte_ethdev.h	2893
rte_eth_dev_mac_addr_add	app/test-pmd/cmdline.c	6076
rte_eth_dev_mac_addr_add	app/test-pmd/cmdline.c	6558
rte_eth_dev_mac_addr_add	examples/vhost/main.c	946
rte_eth_dev_mac_addr_add	examples/vhost_xen/main.c	728
rte_eth_dev_mac_addr_add	examples/vmdq/main.c	314
rte_eth_dev_mac_addr_add	lib/librte_ether/rte_ethdev.c	2280
rte_eth_dev_mac_addr_add	lib/librte_ether/rte_ethdev.h	2914
rte_eth_dev_mac_addr_remove	app/test-pmd/cmdline.c	6078
rte_eth_dev_mac_addr_remove	examples/vhost/main.c	974
rte_eth_dev_mac_addr_remove	examples/vhost_xen/main.c	758
rte_eth_dev_mac_addr_remove	lib/librte_ether/rte_ethdev.c	2334
rte_eth_dev_mac_addr_remove	lib/librte_ether/rte_ethdev.h	2930
rte_eth_dev_rss_reta_update	app/test-pmd/cmdline.c	1809
rte_eth_dev_rss_reta_update	lib/librte_ether/rte_ethdev.c	2083
rte_eth_dev_rss_reta_update	lib/librte_ether/rte_ethdev.h	2947
rte_eth_dev_rss_reta_query	app/test-pmd/config.c	807
rte_eth_dev_rss_reta_query	lib/librte_ether/rte_ethdev.c	2113
rte_eth_dev_rss_reta_query	lib/librte_ether/rte_ethdev.h	2966
rte_eth_dev_uc_hash_table_set	app/test-pmd/cmdline.c	6188
rte_eth_dev_uc_hash_table_set	lib/librte_ether/rte_ethdev.c	2422
rte_eth_dev_uc_hash_table_set	lib/librte_ether/rte_ethdev.h	2988
rte_eth_dev_uc_all_hash_table_set	app/test-pmd/cmdline.c	6250
rte_eth_dev_uc_all_hash_table_set	lib/librte_ether/rte_ethdev.c	2478
rte_eth_dev_uc_all_hash_table_set	lib/librte_ether/rte_ethdev.h	3008
rte_eth_dev_set_vf_rxmode	app/test-pmd/cmdline.c	6491
rte_eth_dev_set_vf_rxmode	lib/librte_ether/rte_ethdev.c	2367
rte_eth_dev_set_vf_rxmode	lib/librte_ether/rte_ethdev.h	3032
rte_eth_dev_set_vf_tx	app/test-pmd/config.c	2098
rte_eth_dev_set_vf_tx	app/test-pmd/config.c	2105
rte_eth_dev_set_vf_tx	lib/librte_ether/rte_ethdev.c	2521
rte_eth_dev_set_vf_tx	lib/librte_ether/rte_ethdev.h	3052
rte_eth_dev_set_vf_rx	app/test-pmd/cmdline.c	6491
rte_eth_dev_set_vf_rx	app/test-pmd/config.c	2096
rte_eth_dev_set_vf_rx	app/test-pmd/config.c	2102
rte_eth_dev_set_vf_rx	lib/librte_ether/rte_ethdev.c	2367
rte_eth_dev_set_vf_rx	lib/librte_ether/rte_ethdev.c	2495
rte_eth_dev_set_vf_rx	lib/librte_ether/rte_ethdev.h	3032
rte_eth_dev_set_vf_rx	lib/librte_ether/rte_ethdev.h	3071
rte_eth_dev_set_vf_vlan_filter	app/test-pmd/config.c	2119
rte_eth_dev_set_vf_vlan_filter	app/test-pmd/config.c	2122
rte_eth_dev_set_vf_vlan_filter	lib/librte_ether/rte_ethdev.c	2547
rte_eth_dev_set_vf_vlan_filter	lib/librte_ether/rte_ethdev.h	3093
rte_eth_mirror_rule_set	app/test-pmd/cmdline.c	7094
rte_eth_mirror_rule_set	app/test-pmd/cmdline.c	7097
rte_eth_mirror_rule_set	app/test-pmd/cmdline.c	7182
rte_eth_mirror_rule_set	app/test-pmd/cmdline.c	7185
rte_eth_mirror_rule_set	lib/librte_ether/rte_ethdev.c	2648
rte_eth_mirror_rule_set	lib/librte_ether/rte_ethdev.h	3118
rte_eth_mirror_rule_reset	app/test-pmd/cmdline.c	7246
rte_eth_mirror_rule_reset	lib/librte_ether/rte_ethdev.c	2691
rte_eth_mirror_rule_reset	lib/librte_ether/rte_ethdev.h	3136
rte_eth_set_queue_rate_limit	app/test-pmd/config.c	2140
rte_eth_set_queue_rate_limit	app/test-pmd/config.c	2143
rte_eth_set_queue_rate_limit	lib/librte_ether/rte_ethdev.c	2576
rte_eth_set_queue_rate_limit	lib/librte_ether/rte_ethdev.h	3154
rte_eth_set_vf_rate_limit	app/test-pmd/config.c	2165
rte_eth_set_vf_rate_limit	app/test-pmd/config.c	2168
rte_eth_set_vf_rate_limit	lib/librte_ether/rte_ethdev.c	2610
rte_eth_set_vf_rate_limit	lib/librte_ether/rte_ethdev.h	3174
rte_eth_dev_bypass_init	app/test-pmd/testpmd.c	1756
rte_eth_dev_bypass_init	lib/librte_ether/rte_ethdev.c	2897
rte_eth_dev_bypass_init	lib/librte_ether/rte_ethdev.h	3188
rte_eth_dev_bypass_state_show	app/test-pmd/cmdline.c	3533
rte_eth_dev_bypass_state_show	lib/librte_ether/rte_ethdev.c	2917
rte_eth_dev_bypass_state_show	lib/librte_ether/rte_ethdev.h	3205
rte_eth_dev_bypass_state_set	app/test-pmd/cmdline.c	3293
rte_eth_dev_bypass_state_set	lib/librte_ether/rte_ethdev.c	2936
rte_eth_dev_bypass_state_set	lib/librte_ether/rte_ethdev.h	3222
rte_eth_dev_wd_timeout_store	app/test-pmd/cmdline.c	3379
rte_eth_dev_wd_timeout_store	lib/librte_ether/rte_ethdev.c	2996
rte_eth_dev_wd_timeout_store	lib/librte_ether/rte_ethdev.h	3294
rte_eth_dev_bypass_ver_show	lib/librte_ether/rte_ethdev.c	3016
rte_eth_dev_bypass_ver_show	lib/librte_ether/rte_ethdev.h	3308
rte_eth_dev_bypass_wd_timeout_show	lib/librte_ether/rte_ethdev.c	3036
rte_eth_dev_bypass_wd_timeout_show	lib/librte_ether/rte_ethdev.h	3330
rte_eth_dev_bypass_wd_reset	lib/librte_ether/rte_ethdev.c	3056
rte_eth_dev_bypass_wd_reset	lib/librte_ether/rte_ethdev.h	3342
rte_eth_dev_rss_hash_update	app/test-pmd/cmdline.c	1494
rte_eth_dev_rss_hash_update	app/test-pmd/config.c	898
rte_eth_dev_rss_hash_update	lib/librte_ether/rte_ethdev.c	2136
rte_eth_dev_rss_hash_update	lib/librte_ether/rte_ethdev.h	3357
rte_eth_dev_rss_hash_conf_get	app/test-pmd/config.c	840
rte_eth_dev_rss_hash_conf_get	app/test-pmd/config.c	895
rte_eth_dev_rss_hash_conf_get	lib/librte_ether/rte_ethdev.c	2159
rte_eth_dev_rss_hash_conf_get	lib/librte_ether/rte_ethdev.h	3374
rte_eth_dev_udp_tunnel_add	app/test-pmd/cmdline.c	6977
rte_eth_dev_udp_tunnel_add	lib/librte_ether/rte_ethdev.c	2175
rte_eth_dev_udp_tunnel_add	lib/librte_ether/rte_ethdev.h	3392
rte_eth_dev_udp_tunnel_delete	app/test-pmd/cmdline.c	6979
rte_eth_dev_udp_tunnel_delete	lib/librte_ether/rte_ethdev.c	2201
rte_eth_dev_udp_tunnel_delete	lib/librte_ether/rte_ethdev.h	3409
rte_eth_dev_add_syn_filter	app/test-pmd/cmdline.c	7396
rte_eth_dev_add_syn_filter	lib/librte_ether/rte_ethdev.c	3077
rte_eth_dev_add_syn_filter	lib/librte_ether/rte_ethdev.h	3426
rte_eth_dev_remove_syn_filter	app/test-pmd/cmdline.c	7399
rte_eth_dev_remove_syn_filter	lib/librte_ether/rte_ethdev.c	3093
rte_eth_dev_remove_syn_filter	lib/librte_ether/rte_ethdev.h	3439
rte_eth_dev_get_syn_filter	app/test-pmd/config.c	2181
rte_eth_dev_get_syn_filter	lib/librte_ether/rte_ethdev.c	3108
rte_eth_dev_get_syn_filter	lib/librte_ether/rte_ethdev.h	3455
rte_eth_dev_add_2tuple_filter	app/test-pmd/cmdline.c	7506
rte_eth_dev_add_2tuple_filter	lib/librte_ether/rte_ethdev.c	3127
rte_eth_dev_add_2tuple_filter	lib/librte_ether/rte_ethdev.h	3479
rte_eth_dev_remove_2tuple_filter	app/test-pmd/cmdline.c	7509
rte_eth_dev_remove_2tuple_filter	lib/librte_ether/rte_ethdev.c	3151
rte_eth_dev_remove_2tuple_filter	lib/librte_ether/rte_ethdev.h	3495
rte_eth_dev_get_2tuple_filter	app/test-pmd/config.c	2202
rte_eth_dev_get_2tuple_filter	lib/librte_ether/rte_ethdev.c	3166
rte_eth_dev_get_2tuple_filter	lib/librte_ether/rte_ethdev.h	3516
rte_eth_dev_add_5tuple_filter	app/test-pmd/cmdline.c	7694
rte_eth_dev_add_5tuple_filter	lib/librte_ether/rte_ethdev.c	3185
rte_eth_dev_add_5tuple_filter	lib/librte_ether/rte_ethdev.h	3539
rte_eth_dev_remove_5tuple_filter	app/test-pmd/cmdline.c	7697
rte_eth_dev_remove_5tuple_filter	lib/librte_ether/rte_ethdev.c	3209
rte_eth_dev_remove_5tuple_filter	lib/librte_ether/rte_ethdev.h	3555
rte_eth_dev_get_5tuple_filter	app/test-pmd/config.c	2231
rte_eth_dev_get_5tuple_filter	lib/librte_ether/rte_ethdev.c	3224
rte_eth_dev_get_5tuple_filter	lib/librte_ether/rte_ethdev.h	3575
rte_eth_dev_add_flex_filter	app/test-pmd/cmdline.c	7959
rte_eth_dev_add_flex_filter	app/test-pmd/cmdline.c	7963
rte_eth_dev_add_flex_filter	lib/librte_ether/rte_ethdev.c	3244
rte_eth_dev_add_flex_filter	lib/librte_ether/rte_ethdev.h	3599
rte_eth_dev_remove_flex_filter	app/test-pmd/cmdline.c	7967
rte_eth_dev_remove_flex_filter	lib/librte_ether/rte_ethdev.c	3260
rte_eth_dev_remove_flex_filter	lib/librte_ether/rte_ethdev.h	3615
rte_eth_dev_get_flex_filter	app/test-pmd/config.c	2270
rte_eth_dev_get_flex_filter	lib/librte_ether/rte_ethdev.c	3275
rte_eth_dev_get_flex_filter	lib/librte_ether/rte_ethdev.h	3636
rte_eth_dev_filter_supported	app/test-pmd/cmdline.c	8129
rte_eth_dev_filter_supported	app/test-pmd/cmdline.c	8303
rte_eth_dev_filter_supported	app/test-pmd/cmdline.c	8555
rte_eth_dev_filter_supported	app/test-pmd/cmdline.c	8799
rte_eth_dev_filter_supported	app/test-pmd/cmdline.c	8855
rte_eth_dev_filter_supported	app/test-pmd/cmdline.c	8944
rte_eth_dev_filter_supported	app/test-pmd/cmdline.c	9027
rte_eth_dev_filter_supported	app/test-pmd/config.c	1891
rte_eth_dev_filter_supported	lib/librte_ether/rte_ethdev.c	3295
rte_eth_dev_filter_supported	lib/librte_ether/rte_ethdev.h	3652
rte_eth_dev_filter_ctrl	app/test-pmd/cmdline.c	6333
rte_eth_dev_filter_ctrl	app/test-pmd/cmdline.c	6338
rte_eth_dev_filter_ctrl	app/test-pmd/cmdline.c	6879
rte_eth_dev_filter_ctrl	app/test-pmd/cmdline.c	6884
rte_eth_dev_filter_ctrl	app/test-pmd/cmdline.c	8149
rte_eth_dev_filter_ctrl	app/test-pmd/cmdline.c	8154
rte_eth_dev_filter_ctrl	app/test-pmd/cmdline.c	8383
rte_eth_dev_filter_ctrl	app/test-pmd/cmdline.c	8386
rte_eth_dev_filter_ctrl	app/test-pmd/cmdline.c	8562
rte_eth_dev_filter_ctrl	app/test-pmd/cmdline.c	8808
rte_eth_dev_filter_ctrl	app/test-pmd/cmdline.c	8866
rte_eth_dev_filter_ctrl	app/test-pmd/cmdline.c	8953
rte_eth_dev_filter_ctrl	app/test-pmd/cmdline.c	9052
rte_eth_dev_filter_ctrl	app/test-pmd/config.c	1917
rte_eth_dev_filter_ctrl	app/test-pmd/config.c	1920
rte_eth_dev_filter_ctrl	lib/librte_ether/rte_ethdev.c	3311
rte_eth_dev_filter_ctrl	lib/librte_ether/rte_ethdev.h	3673

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v8 03/14] eal/pci, ethdev: Remove assumption that port will not be detached
  2015-02-18  0:31  3%     ` Thomas Monjalon
@ 2015-02-18  1:54  0%       ` Tetsuya Mukawa
  2015-02-18  6:10  0%         ` Tetsuya Mukawa
  0 siblings, 1 reply; 200+ results
From: Tetsuya Mukawa @ 2015-02-18  1:54 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev, Neil Horman

On 2015/02/18 9:31, Thomas Monjalon wrote:
> 2015-02-17 15:14, Tetsuya Mukawa:
>> On 2015/02/17 9:36, Thomas Monjalon wrote:
>>> 2015-02-16 13:14, Tetsuya Mukawa:
>>> Is uint8_t sill a good size for hotpluggable virtual device ids?
>> I am not sure it's enough, but uint8_t is widely used in "rte_ethdev.c"
>> as port id.
>> If someone reports it doesn't enough, I guess it will be the time to
>> write a patch to change all uint_8 in one patch.
> It's a big ABI breakage. So if we feel it's going to be required,
> it's better to do it now in 2.0 release I think.
>
> Any opinion?
>

Hi Thomas,

I agree with it.
I will add an one more patch to change uint8_t to uint16_t.

Thanks,
Tetsuya

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v8 03/14] eal/pci, ethdev: Remove assumption that port will not be detached
  @ 2015-02-18  0:31  3%     ` Thomas Monjalon
  2015-02-18  1:54  0%       ` Tetsuya Mukawa
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2015-02-18  0:31 UTC (permalink / raw)
  To: Tetsuya Mukawa; +Cc: dev, Neil Horman

2015-02-17 15:14, Tetsuya Mukawa:
> On 2015/02/17 9:36, Thomas Monjalon wrote:
> > 2015-02-16 13:14, Tetsuya Mukawa:
> > Is uint8_t sill a good size for hotpluggable virtual device ids?
> 
> I am not sure it's enough, but uint8_t is widely used in "rte_ethdev.c"
> as port id.
> If someone reports it doesn't enough, I guess it will be the time to
> write a patch to change all uint_8 in one patch.

It's a big ABI breakage. So if we feel it's going to be required,
it's better to do it now in 2.0 release I think.

Any opinion?

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v6 00/16] lib/librte_pmd_fm10k : fm10k pmd driver
  2015-02-17 14:18  4% ` [dpdk-dev] [PATCH v6 00/16] lib/librte_pmd_fm10k : fm10k pmd driver Chen Jing D(Mark)
  2015-02-17 14:18  1%   ` [dpdk-dev] [PATCH v6 03/16] fm10k: register fm10k pmd PF driver Chen Jing D(Mark)
@ 2015-02-18  0:13  0%   ` Thomas Monjalon
  1 sibling, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-02-18  0:13 UTC (permalink / raw)
  To: Chen Jing D(Mark); +Cc: dev

2015-02-17 22:18, Chen Jing D:
> From: "Chen Jing D(Mark)" <jing.d.chen@intel.com>
> 
> The patch set add poll mode driver for the host interface of Intel
> Ethernet Switch FM10000 Series of silicons, which integrate NIC and
> switch functionalities. The patch set include below features:
> 
> 1. Basic RX/TX functions for PF/VF.
> 2. Interrupt handling mechanism for PF/VF.
> 3. per queue start/stop functions for PF/VF.
> 4. Mailbox handling between PF/VF and PF/Switch Manager.
> 5. Receive Side Scaling (RSS) for PF/VF.
> 6. Scatter receive function for PF/VF.
> 7. reta update/query for PF/VF.
> 8. VLAN filter set for PF.
> 9. Link status query for PF/VF.
> 
> Change in v6:
> - Merge ABI patch with fm10k driver regsiter patch.
> - Fix typo.
> - Rework comments.
> - Minor adjustment on commit log.
> - Increase error variable after mbuf allocation failed.
> 
> Change in v5:
> - Add sanity check for mbuf allocation.
> - Add a new patch to claim fm10k driver review
> - Change commit log.
> - Add unlikely in func rx_desc_to_ol_flags to gain performance
> - Add a new patch to add ABI version
> 
> Change in v4:
> - Change commit log to remove improper words.
> 
> Changes in v3:
> - Update base driver.
> - Define several macros to pass base driver compile.
> 
> Changes in v2:
> - Merge 3 patches into 1 to configure fm10k compile environment.
> - Rework on log code to follow style in ixgbe.
> - Rework log message, remove redundant '\n'
> - Update Copyright year from "2014" to "2015"
> - Change base driver directory name from SHARED to base
> - Add more description in log for patch "add PF and VF interrupt"
> - Merge 2 patches into 1 to register fm10k driver
> - Define macro to replace numeric for lower 32-bit mask.
> 
> Chen Jing D(Mark) (1):
>   maintainers: claim for fm10k review
> 
> Jeff Shaw (15):
>   fm10k: add base driver
>   eal: add fm10k device id
>   fm10k: register fm10k pmd PF driver
>   config: change config files to add fm10k into compile
>   fm10k: add reta update/requery functions
>   fm10k: add Rx queue setup/release function
>   fm10k: add Tx queue setup/release function
>   fm10k: add Rx/Tx single queue start/stop function
>   fm10k: add dev start/stop functions
>   fm10k: add receive and tranmit function
>   fm10k: add PF RSS support
>   fm10k: add scatter receive function
>   fm10k: add function to set vlan
>   fm10k: add SRIOV-VF support
>   fm10k: add PF and VF interrupt handling function
> 
>  MAINTAINERS                                     |    4 +
>  config/common_bsdapp                            |   11 +
>  config/common_linuxapp                          |   11 +
>  lib/Makefile                                    |    1 +
>  lib/librte_eal/common/include/rte_pci_dev_ids.h |   22 +
>  lib/librte_pmd_fm10k/Makefile                   |  100 +
>  lib/librte_pmd_fm10k/base/fm10k_api.c           |  341 ++++
>  lib/librte_pmd_fm10k/base/fm10k_api.h           |   61 +
>  lib/librte_pmd_fm10k/base/fm10k_common.c        |  572 ++++++
>  lib/librte_pmd_fm10k/base/fm10k_common.h        |   52 +
>  lib/librte_pmd_fm10k/base/fm10k_mbx.c           | 2185 +++++++++++++++++++++++
>  lib/librte_pmd_fm10k/base/fm10k_mbx.h           |  329 ++++
>  lib/librte_pmd_fm10k/base/fm10k_osdep.h         |  148 ++
>  lib/librte_pmd_fm10k/base/fm10k_pf.c            | 1992 +++++++++++++++++++++
>  lib/librte_pmd_fm10k/base/fm10k_pf.h            |  155 ++
>  lib/librte_pmd_fm10k/base/fm10k_tlv.c           |  914 ++++++++++
>  lib/librte_pmd_fm10k/base/fm10k_tlv.h           |  199 ++
>  lib/librte_pmd_fm10k/base/fm10k_type.h          |  937 ++++++++++
>  lib/librte_pmd_fm10k/base/fm10k_vf.c            |  641 +++++++
>  lib/librte_pmd_fm10k/base/fm10k_vf.h            |   91 +
>  lib/librte_pmd_fm10k/fm10k.h                    |  292 +++
>  lib/librte_pmd_fm10k/fm10k_ethdev.c             | 1867 +++++++++++++++++++
>  lib/librte_pmd_fm10k/fm10k_logs.h               |   78 +
>  lib/librte_pmd_fm10k/fm10k_rxtx.c               |  462 +++++
>  lib/librte_pmd_fm10k/rte_pmd_fm10k_version.map  |    4 +
>  mk/rte.app.mk                                   |    4 +

Pulled from next/dpdk-fm10k, thanks.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v3 1/5] ethdev: add rx interrupt enable/disable functions
  @ 2015-02-17 15:54  3%   ` Neil Horman
  2015-02-19  7:58  3%     ` Zhou, Danny
  0 siblings, 1 reply; 200+ results
From: Neil Horman @ 2015-02-17 15:54 UTC (permalink / raw)
  To: Zhou Danny; +Cc: dev

On Tue, Feb 17, 2015 at 09:47:15PM +0800, Zhou Danny wrote:
> v3 changes
> - Add return value for interrupt enable/disable functions
> 
> Add two dev_ops functions to enable and disable rx queue interrupts
> 
> Signed-off-by: Danny Zhou <danny.zhou@intel.com>
> Tested-by: Yong Liu <yong.liu@intel.com>
> ---
>  lib/librte_ether/rte_ethdev.c | 43 ++++++++++++++++++++++++++++++++
>  lib/librte_ether/rte_ethdev.h | 57 +++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 100 insertions(+)
> 
> diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
> index ea3a1fb..d27469a 100644
> --- a/lib/librte_ether/rte_ethdev.c
> +++ b/lib/librte_ether/rte_ethdev.c
> @@ -2825,6 +2825,49 @@ _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
>  	}
>  	rte_spinlock_unlock(&rte_eth_dev_cb_lock);
>  }
> +
> +int
> +rte_eth_dev_rx_queue_intr_enable(uint8_t port_id,
> +				uint16_t queue_id)
> +{
> +	struct rte_eth_dev *dev;
> +
> +	if (port_id >= nb_ports) {
> +		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
> +		return (-ENODEV);
> +	}
> +
> +	dev = &rte_eth_devices[port_id];
> +	if (dev == NULL) {
> +		PMD_DEBUG_TRACE("Invalid port device\n");
> +		return (-ENODEV);
> +	}
> +
> +	FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_intr_enable, -ENOTSUP);
> +	return (*dev->dev_ops->rx_queue_intr_enable)(dev, queue_id);
> +}
> +
> +int
> +rte_eth_dev_rx_queue_intr_disable(uint8_t port_id,
> +				uint16_t queue_id)
> +{
> +	struct rte_eth_dev *dev;
> +
> +	if (port_id >= nb_ports) {
> +		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
> +		return (-ENODEV);
> +	}
> +
> +	dev = &rte_eth_devices[port_id];
> +	if (dev == NULL) {
> +		PMD_DEBUG_TRACE("Invalid port device\n");
> +		return (-ENODEV);
> +	}
> +
> +	FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_intr_disable, -ENOTSUP);
> +	return (*dev->dev_ops->rx_queue_intr_disable)(dev, queue_id);
> +}
> +
>  #ifdef RTE_NIC_BYPASS
>  int rte_eth_dev_bypass_init(uint8_t port_id)
>  {
> diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
> index 84160c3..0f320a9 100644
> --- a/lib/librte_ether/rte_ethdev.h
> +++ b/lib/librte_ether/rte_ethdev.h
> @@ -848,6 +848,8 @@ struct rte_eth_fdir {
>  struct rte_intr_conf {
>  	/** enable/disable lsc interrupt. 0 (default) - disable, 1 enable */
>  	uint16_t lsc;
> +	/** enable/disable rxq interrupt. 0 (default) - disable, 1 enable */
> +	uint16_t rxq;
>  };
>  
>  /**
> @@ -1109,6 +1111,14 @@ typedef int (*eth_tx_queue_setup_t)(struct rte_eth_dev *dev,
>  				    const struct rte_eth_txconf *tx_conf);
>  /**< @internal Setup a transmit queue of an Ethernet device. */
>  
> +typedef int (*eth_rx_enable_intr_t)(struct rte_eth_dev *dev,
> +				    uint16_t rx_queue_id);
> +/**< @internal Enable interrupt of a receive queue of an Ethernet device. */
> +
> +typedef int (*eth_rx_disable_intr_t)(struct rte_eth_dev *dev,
> +				    uint16_t rx_queue_id);
> +/**< @internal Disable interrupt of a receive queue of an Ethernet device. */
> +
>  typedef void (*eth_queue_release_t)(void *queue);
>  /**< @internal Release memory resources allocated by given RX/TX queue. */
>  
> @@ -1445,6 +1455,8 @@ struct eth_dev_ops {
>  	eth_queue_start_t          tx_queue_start;/**< Start TX for a queue.*/
>  	eth_queue_stop_t           tx_queue_stop;/**< Stop TX for a queue.*/
>  	eth_rx_queue_setup_t       rx_queue_setup;/**< Set up device RX queue.*/
> +	eth_rx_enable_intr_t       rx_queue_intr_enable; /**< Enable Rx queue interrupt. */
> +	eth_rx_disable_intr_t      rx_queue_intr_disable; /**< Disable Rx queue interrupt.*/
Put these at the end of eth_dev_ops if you want to avoid breaking ABI

>  	eth_queue_release_t        rx_queue_release;/**< Release RX queue.*/
>  	eth_rx_queue_count_t       rx_queue_count; /**< Get Rx queue count. */
>  	eth_rx_descriptor_done_t   rx_descriptor_done;  /**< Check rxd DD bit */
> @@ -2811,6 +2823,51 @@ void _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
>  				enum rte_eth_event_type event);
>  
>  /**
> + * When there is no rx packet coming in Rx Queue for a long time, we can
> + * sleep lcore related to RX Queue for power saving, and enable rx interrupt
> + * to be triggered when rx packect arrives.
> + *
> + * The rte_eth_dev_rx_queue_intr_enable() function enables rx queue
> + * interrupt on specific rx queue of a port.
> + *
> + * @param port_id
> + *   The port identifier of the Ethernet device.
> + * @param queue_id
> + *   The index of the receive queue from which to retrieve input packets.
> + *   The value must be in the range [0, nb_rx_queue - 1] previously supplied
> + *   to rte_eth_dev_configure().
> + * @return
> + *   - (0) if successful.
> + *   - (-ENOTSUP) if underlying hardware OR driver doesn't support
> + *     that operation.
> + *   - (-ENODEV) if *port_id* invalid.
> + */
> +int rte_eth_dev_rx_queue_intr_enable(uint8_t port_id,
> +				uint16_t queue_id);
> +
> +/**
> + * When lcore wakes up from rx interrupt indicating packet coming, disable rx
> + * interrupt and returns to polling mode.
> + *
> + * The rte_eth_dev_rx_queue_intr_disable() function disables rx queue
> + * interrupt on specific rx queue of a port.
> + *
> + * @param port_id
> + *   The port identifier of the Ethernet device.
> + * @param queue_id
> + *   The index of the receive queue from which to retrieve input packets.
> + *   The value must be in the range [0, nb_rx_queue - 1] previously supplied
> + *   to rte_eth_dev_configure().
> + * @return
> + *   - (0) if successful.
> + *   - (-ENOTSUP) if underlying hardware OR driver doesn't support
> + *     that operation.
> + *   - (-ENODEV) if *port_id* invalid.
> + */
> +int rte_eth_dev_rx_queue_intr_disable(uint8_t port_id,
> +				uint16_t queue_id);
> +
> +/**
>   * Turn on the LED on the Ethernet device.
>   * This function turns on the LED on the Ethernet device.
>   *
> -- 
> 1.8.1.4
> 
> 

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v6 03/16] fm10k: register fm10k pmd PF driver
  2015-02-17 14:18  4% ` [dpdk-dev] [PATCH v6 00/16] lib/librte_pmd_fm10k : fm10k pmd driver Chen Jing D(Mark)
@ 2015-02-17 14:18  1%   ` Chen Jing D(Mark)
  2015-02-18  0:13  0%   ` [dpdk-dev] [PATCH v6 00/16] lib/librte_pmd_fm10k : fm10k pmd driver Thomas Monjalon
  1 sibling, 0 replies; 200+ results
From: Chen Jing D(Mark) @ 2015-02-17 14:18 UTC (permalink / raw)
  To: dev

From: Jeff Shaw <jeffrey.b.shaw@intel.com>

1. Add init function to scan and initialize fm10k PF device.
2. Add implementation to register fm10k pmd PF driver.
3. Add 3 functions fm10k_dev_configure, fm10k_stats_get and
   fm10k_stats_get.
4. Add fm10k.h to define macros and basic data structure.
5. Add fm10k_logs.h to control log message output.
6. Add Makefile.
7. Add ABI version of librte_pmd_fm10k

Signed-off-by: Jeff Shaw <jeffrey.b.shaw@intel.com>
Signed-off-by: Chen Jing D(Mark) <jing.d.chen@intel.com>
Signed-off-by: Michael Qiu <michael.qiu@intel.com>
---
 lib/librte_pmd_fm10k/Makefile                  |   99 +++++++
 lib/librte_pmd_fm10k/fm10k.h                   |  224 +++++++++++++++
 lib/librte_pmd_fm10k/fm10k_ethdev.c            |  343 ++++++++++++++++++++++++
 lib/librte_pmd_fm10k/fm10k_logs.h              |   78 ++++++
 lib/librte_pmd_fm10k/rte_pmd_fm10k_version.map |    4 +
 5 files changed, 748 insertions(+), 0 deletions(-)
 create mode 100644 lib/librte_pmd_fm10k/Makefile
 create mode 100644 lib/librte_pmd_fm10k/fm10k.h
 create mode 100644 lib/librte_pmd_fm10k/fm10k_ethdev.c
 create mode 100644 lib/librte_pmd_fm10k/fm10k_logs.h
 create mode 100644 lib/librte_pmd_fm10k/rte_pmd_fm10k_version.map

diff --git a/lib/librte_pmd_fm10k/Makefile b/lib/librte_pmd_fm10k/Makefile
new file mode 100644
index 0000000..b24cc67
--- /dev/null
+++ b/lib/librte_pmd_fm10k/Makefile
@@ -0,0 +1,99 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2013-2015 Intel Corporation. All rights reserved.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+#
+# library name
+#
+LIB = librte_pmd_fm10k.a
+
+CFLAGS += -O3
+CFLAGS += $(WERROR_FLAGS)
+
+EXPORT_MAP := rte_pmd_fm10k_version.map
+
+LIBABIVER := 1
+
+ifeq ($(CC), icc)
+#
+# CFLAGS for icc
+#
+CFLAGS_BASE_DRIVER = -wd174 -wd593 -wd869 -wd981 -wd2259
+
+else ifeq ($(CC), clang)
+#
+## CFLAGS for clang
+#
+CFLAGS_BASE_DRIVER = -Wno-unused-parameter -Wno-unused-value
+CFLAGS_BASE_DRIVER += -Wno-strict-aliasing -Wno-format-extra-args
+CFLAGS_BASE_DRIVER += -Wno-unused-variable -Wno-unused-but-set-variable
+CFLAGS_BASE_DRIVER += -Wno-missing-field-initializers
+
+else
+#
+# CFLAGS for gcc
+#
+ifneq ($(shell test $(GCC_MAJOR_VERSION) -le 4 -a $(GCC_MINOR_VERSION) -le 3 && echo 1), 1)
+CFLAGS     += -Wno-deprecated
+endif
+CFLAGS_BASE_DRIVER = -Wno-unused-parameter -Wno-unused-value
+CFLAGS_BASE_DRIVER += -Wno-strict-aliasing -Wno-format-extra-args
+CFLAGS_BASE_DRIVER += -Wno-unused-variable -Wno-unused-but-set-variable
+CFLAGS_BASE_DRIVER += -Wno-missing-field-initializers
+endif
+
+#
+# Add extra flags for base driver source files to disable warnings in them
+#
+BASE_DRIVER_OBJS=$(patsubst %.c,%.o,$(notdir $(wildcard $(RTE_SDK)/lib/librte_pmd_fm10k/base/*.c)))
+$(foreach obj, $(BASE_DRIVER_OBJS), $(eval CFLAGS_$(obj)+=$(CFLAGS_BASE_DRIVER)))
+
+VPATH += $(RTE_SDK)/lib/librte_pmd_fm10k/base
+
+#
+# all source are stored in SRCS-y
+#
+SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_ethdev.c
+
+SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_pf.c
+SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_tlv.c
+SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_common.c
+SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_mbx.c
+SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_vf.c
+SRCS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += fm10k_api.c
+
+# this lib depends upon:
+DEPDIRS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += lib/librte_eal lib/librte_ether
+DEPDIRS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += lib/librte_mempool lib/librte_mbuf
+DEPDIRS-$(CONFIG_RTE_LIBRTE_FM10K_PMD) += lib/librte_net lib/librte_malloc
+
+include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/lib/librte_pmd_fm10k/fm10k.h b/lib/librte_pmd_fm10k/fm10k.h
new file mode 100644
index 0000000..1468040
--- /dev/null
+++ b/lib/librte_pmd_fm10k/fm10k.h
@@ -0,0 +1,224 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2013-2015 Intel Corporation. All rights reserved.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _FM10K_H_
+#define _FM10K_H_
+
+#include <stdint.h>
+#include <rte_mbuf.h>
+#include <rte_mempool.h>
+#include <rte_malloc.h>
+#include <rte_spinlock.h>
+#include "fm10k_logs.h"
+#include "base/fm10k_type.h"
+
+/* descriptor ring base addresses must be aligned to the following */
+#define FM10K_ALIGN_RX_DESC  128
+#define FM10K_ALIGN_TX_DESC  128
+
+/* The maximum packet size that FM10K supports */
+#define FM10K_MAX_PKT_SIZE  (15 * 1024)
+
+/* Minimum size of RX buffer FM10K supported */
+#define FM10K_MIN_RX_BUF_SIZE  256
+
+/* The maximum of SRIOV VFs per port supported */
+#define FM10K_MAX_VF_NUM    64
+
+/* number of descriptors must be a multiple of the following */
+#define FM10K_MULT_RX_DESC  FM10K_REQ_RX_DESCRIPTOR_MULTIPLE
+#define FM10K_MULT_TX_DESC  FM10K_REQ_TX_DESCRIPTOR_MULTIPLE
+
+/* maximum size of descriptor rings */
+#define FM10K_MAX_RX_RING_SZ  (512 * 1024)
+#define FM10K_MAX_TX_RING_SZ  (512 * 1024)
+
+/* minimum and maximum number of descriptors in a ring */
+#define FM10K_MIN_RX_DESC  32
+#define FM10K_MIN_TX_DESC  32
+#define FM10K_MAX_RX_DESC  (FM10K_MAX_RX_RING_SZ / sizeof(union fm10k_rx_desc))
+#define FM10K_MAX_TX_DESC  (FM10K_MAX_TX_RING_SZ / sizeof(struct fm10k_tx_desc))
+
+/*
+ * byte aligment for HW RX data buffer
+ * Datasheet requires RX buffer addresses shall either be 512-byte aligned or
+ * be 8-byte aligned but without crossing host memory pages (4KB alignment
+ * boundaries). Satisfy first option.
+ */
+#define FM10K_RX_DATABUF_ALIGN 512
+
+/*
+ * threshold default, min, max, and divisor constraints
+ * the configured values must satisfy the following:
+ *   MIN <= value <= MAX
+ *   DIV % value == 0
+ */
+#define FM10K_RX_FREE_THRESH_DEFAULT(rxq)  32
+#define FM10K_RX_FREE_THRESH_MIN(rxq)      1
+#define FM10K_RX_FREE_THRESH_MAX(rxq)      ((rxq)->nb_desc - 1)
+#define FM10K_RX_FREE_THRESH_DIV(rxq)      ((rxq)->nb_desc)
+
+#define FM10K_TX_FREE_THRESH_DEFAULT(txq)  32
+#define FM10K_TX_FREE_THRESH_MIN(txq)      1
+#define FM10K_TX_FREE_THRESH_MAX(txq)      ((txq)->nb_desc - 3)
+#define FM10K_TX_FREE_THRESH_DIV(txq)      0
+
+#define FM10K_DEFAULT_RX_PTHRESH      8
+#define FM10K_DEFAULT_RX_HTHRESH      8
+#define FM10K_DEFAULT_RX_WTHRESH      0
+
+#define FM10K_DEFAULT_TX_PTHRESH      32
+#define FM10K_DEFAULT_TX_HTHRESH      0
+#define FM10K_DEFAULT_TX_WTHRESH      0
+
+#define FM10K_TX_RS_THRESH_DEFAULT(txq)    32
+#define FM10K_TX_RS_THRESH_MIN(txq)        1
+#define FM10K_TX_RS_THRESH_MAX(txq)        \
+	RTE_MIN(((txq)->nb_desc - 2), (txq)->free_thresh)
+#define FM10K_TX_RS_THRESH_DIV(txq)        ((txq)->nb_desc)
+
+#define FM10K_VLAN_TAG_SIZE 4
+
+struct fm10k_dev_info {
+	volatile uint32_t enable;
+	volatile uint32_t glort;
+	/* Protect the mailbox to avoid race condition */
+	rte_spinlock_t    mbx_lock;
+};
+
+/*
+ * Structure to store private data for each driver instance.
+ */
+struct fm10k_adapter {
+	struct fm10k_hw             hw;
+	struct fm10k_hw_stats       stats;
+	struct fm10k_dev_info       info;
+};
+
+#define FM10K_DEV_PRIVATE_TO_HW(adapter) \
+	(&((struct fm10k_adapter *)adapter)->hw)
+
+#define FM10K_DEV_PRIVATE_TO_STATS(adapter) \
+	(&((struct fm10k_adapter *)adapter)->stats)
+
+#define FM10K_DEV_PRIVATE_TO_INFO(adapter) \
+	(&((struct fm10k_adapter *)adapter)->info)
+
+#define FM10K_DEV_PRIVATE_TO_MBXLOCK(adapter) \
+	(&(((struct fm10k_adapter *)adapter)->info.mbx_lock))
+
+struct fm10k_rx_queue {
+	struct rte_mempool *mp;
+	struct rte_mbuf **sw_ring;
+	volatile union fm10k_rx_desc *hw_ring;
+	struct rte_mbuf *pkt_first_seg; /**< First segment of current packet. */
+	struct rte_mbuf *pkt_last_seg;  /**< Last segment of current packet. */
+	uint64_t hw_ring_phys_addr;
+	uint16_t next_dd;
+	uint16_t next_alloc;
+	uint16_t next_trigger;
+	uint16_t alloc_thresh;
+	volatile uint32_t *tail_ptr;
+	uint16_t nb_desc;
+	uint16_t queue_id;
+	uint8_t port_id;
+	uint8_t drop_en;
+	uint8_t rx_deferred_start; /**< don't start this queue in dev start. */
+};
+
+/*
+ * a FIFO is used to track which descriptors have their RS bit set for Tx
+ * queues which are configured to allow multiple descriptors per packet
+ */
+struct fifo {
+	uint16_t *list;
+	uint16_t *head;
+	uint16_t *tail;
+	uint16_t *endp;
+};
+
+struct fm10k_tx_queue {
+	struct rte_mbuf **sw_ring;
+	struct fm10k_tx_desc *hw_ring;
+	uint64_t hw_ring_phys_addr;
+	struct fifo rs_tracker;
+	uint16_t last_free;
+	uint16_t next_free;
+	uint16_t nb_free;
+	uint16_t nb_used;
+	uint16_t free_trigger;
+	uint16_t free_thresh;
+	uint16_t rs_thresh;
+	volatile uint32_t *tail_ptr;
+	uint16_t nb_desc;
+	uint8_t port_id;
+	uint8_t tx_deferred_start; /** < don't start this queue in dev start. */
+	uint16_t queue_id;
+};
+
+#define MBUF_DMA_ADDR(mb) \
+	((uint64_t) ((mb)->buf_physaddr + (mb)->data_off))
+
+/* enforce 512B alignment on default Rx DMA addresses */
+#define MBUF_DMA_ADDR_DEFAULT(mb) \
+	((uint64_t) RTE_ALIGN(((mb)->buf_physaddr + RTE_PKTMBUF_HEADROOM), 512))
+
+static inline void fifo_reset(struct fifo *fifo, uint32_t len)
+{
+	fifo->head = fifo->tail = fifo->list;
+	fifo->endp = fifo->list + len;
+}
+
+static inline void fifo_insert(struct fifo *fifo, uint16_t val)
+{
+	*fifo->head = val;
+	if (++fifo->head == fifo->endp)
+		fifo->head = fifo->list;
+}
+
+/* do not worry about list being empty since we only check it once we know
+ * we have used enough descriptors to set the RS bit at least once */
+static inline uint16_t fifo_peek(struct fifo *fifo)
+{
+	return *fifo->tail;
+}
+
+static inline uint16_t fifo_remove(struct fifo *fifo)
+{
+	uint16_t val;
+	val = *fifo->tail;
+	if (++fifo->tail == fifo->endp)
+		fifo->tail = fifo->list;
+	return val;
+}
+#endif
diff --git a/lib/librte_pmd_fm10k/fm10k_ethdev.c b/lib/librte_pmd_fm10k/fm10k_ethdev.c
new file mode 100644
index 0000000..0b75299
--- /dev/null
+++ b/lib/librte_pmd_fm10k/fm10k_ethdev.c
@@ -0,0 +1,343 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2013-2015 Intel Corporation. All rights reserved.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <rte_ethdev.h>
+#include <rte_malloc.h>
+#include <rte_memzone.h>
+#include <rte_string_fns.h>
+#include <rte_dev.h>
+#include <rte_spinlock.h>
+
+#include "fm10k.h"
+#include "base/fm10k_api.h"
+
+/* Default delay to acquire mailbox lock */
+#define FM10K_MBXLOCK_DELAY_US 20
+
+static void
+fm10k_mbx_initlock(struct fm10k_hw *hw)
+{
+	rte_spinlock_init(FM10K_DEV_PRIVATE_TO_MBXLOCK(hw->back));
+}
+
+static void
+fm10k_mbx_lock(struct fm10k_hw *hw)
+{
+	while (!rte_spinlock_trylock(FM10K_DEV_PRIVATE_TO_MBXLOCK(hw->back)))
+		rte_delay_us(FM10K_MBXLOCK_DELAY_US);
+}
+
+static void
+fm10k_mbx_unlock(struct fm10k_hw *hw)
+{
+	rte_spinlock_unlock(FM10K_DEV_PRIVATE_TO_MBXLOCK(hw->back));
+}
+
+static int
+fm10k_dev_configure(struct rte_eth_dev *dev)
+{
+	PMD_INIT_FUNC_TRACE();
+
+	if (dev->data->dev_conf.rxmode.hw_strip_crc == 0)
+		PMD_INIT_LOG(WARNING, "fm10k always strip CRC");
+
+	return 0;
+}
+
+static void
+fm10k_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
+{
+	uint64_t ipackets, opackets, ibytes, obytes;
+	struct fm10k_hw *hw =
+		FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct fm10k_hw_stats *hw_stats =
+		FM10K_DEV_PRIVATE_TO_STATS(dev->data->dev_private);
+	int i;
+
+	PMD_INIT_FUNC_TRACE();
+
+	fm10k_update_hw_stats(hw, hw_stats);
+
+	ipackets = opackets = ibytes = obytes = 0;
+	for (i = 0; (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) &&
+		(i < FM10K_MAX_QUEUES_PF); ++i) {
+		stats->q_ipackets[i] = hw_stats->q[i].rx_packets.count;
+		stats->q_opackets[i] = hw_stats->q[i].tx_packets.count;
+		stats->q_ibytes[i]   = hw_stats->q[i].rx_bytes.count;
+		stats->q_obytes[i]   = hw_stats->q[i].tx_bytes.count;
+		ipackets += stats->q_ipackets[i];
+		opackets += stats->q_opackets[i];
+		ibytes   += stats->q_ibytes[i];
+		obytes   += stats->q_obytes[i];
+	}
+	stats->ipackets = ipackets;
+	stats->opackets = opackets;
+	stats->ibytes = ibytes;
+	stats->obytes = obytes;
+}
+
+static void
+fm10k_stats_reset(struct rte_eth_dev *dev)
+{
+	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct fm10k_hw_stats *hw_stats =
+		FM10K_DEV_PRIVATE_TO_STATS(dev->data->dev_private);
+
+	PMD_INIT_FUNC_TRACE();
+
+	memset(hw_stats, 0, sizeof(*hw_stats));
+	fm10k_rebind_hw_stats(hw, hw_stats);
+}
+
+/* Mailbox message handler in VF */
+static const struct fm10k_msg_data fm10k_msgdata_vf[] = {
+	FM10K_TLV_MSG_TEST_HANDLER(fm10k_tlv_msg_test),
+	FM10K_VF_MSG_MAC_VLAN_HANDLER(fm10k_msg_mac_vlan_vf),
+	FM10K_VF_MSG_LPORT_STATE_HANDLER(fm10k_msg_lport_state_vf),
+	FM10K_TLV_MSG_ERROR_HANDLER(fm10k_tlv_msg_error),
+};
+
+/* Mailbox message handler in PF */
+static const struct fm10k_msg_data fm10k_msgdata_pf[] = {
+	FM10K_PF_MSG_ERR_HANDLER(XCAST_MODES, fm10k_msg_err_pf),
+	FM10K_PF_MSG_ERR_HANDLER(UPDATE_MAC_FWD_RULE, fm10k_msg_err_pf),
+	FM10K_PF_MSG_LPORT_MAP_HANDLER(fm10k_msg_lport_map_pf),
+	FM10K_PF_MSG_ERR_HANDLER(LPORT_CREATE, fm10k_msg_err_pf),
+	FM10K_PF_MSG_ERR_HANDLER(LPORT_DELETE, fm10k_msg_err_pf),
+	FM10K_PF_MSG_UPDATE_PVID_HANDLER(fm10k_msg_update_pvid_pf),
+	FM10K_TLV_MSG_ERROR_HANDLER(fm10k_tlv_msg_error),
+};
+
+static int
+fm10k_setup_mbx_service(struct fm10k_hw *hw)
+{
+	int err;
+
+	/* Initialize mailbox lock */
+	fm10k_mbx_initlock(hw);
+
+	/* Replace default message handler with new ones */
+	if (hw->mac.type == fm10k_mac_pf)
+		err = hw->mbx.ops.register_handlers(&hw->mbx, fm10k_msgdata_pf);
+	else
+		err = hw->mbx.ops.register_handlers(&hw->mbx, fm10k_msgdata_vf);
+
+	if (err) {
+		PMD_INIT_LOG(ERR, "Failed to register mailbox handler.err:%d",
+				err);
+		return err;
+	}
+	/* Connect to SM for PF device or PF for VF device */
+	return hw->mbx.ops.connect(hw, &hw->mbx);
+}
+
+static struct eth_dev_ops fm10k_eth_dev_ops = {
+	.dev_configure		= fm10k_dev_configure,
+	.stats_get		= fm10k_stats_get,
+	.stats_reset		= fm10k_stats_reset,
+};
+
+static int
+eth_fm10k_dev_init(__rte_unused struct eth_driver *eth_drv,
+	struct rte_eth_dev *dev)
+{
+	struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	int diag;
+
+	PMD_INIT_FUNC_TRACE();
+
+	dev->dev_ops = &fm10k_eth_dev_ops;
+
+	/* only initialize in the primary process */
+	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+		return 0;
+
+	/* Vendor and Device ID need to be set before init of shared code */
+	memset(hw, 0, sizeof(*hw));
+	hw->device_id = dev->pci_dev->id.device_id;
+	hw->vendor_id = dev->pci_dev->id.vendor_id;
+	hw->subsystem_device_id = dev->pci_dev->id.subsystem_device_id;
+	hw->subsystem_vendor_id = dev->pci_dev->id.subsystem_vendor_id;
+	hw->revision_id = 0;
+	hw->hw_addr = (void *)dev->pci_dev->mem_resource[0].addr;
+	if (hw->hw_addr == NULL) {
+		PMD_INIT_LOG(ERR, "Bad mem resource."
+			" Try to blacklist unused devices.");
+		return -EIO;
+	}
+
+	/* Store fm10k_adapter pointer */
+	hw->back = dev->data->dev_private;
+
+	/* Initialize the shared code */
+	diag = fm10k_init_shared_code(hw);
+	if (diag != FM10K_SUCCESS) {
+		PMD_INIT_LOG(ERR, "Shared code init failed: %d", diag);
+		return -EIO;
+	}
+
+	/*
+	 * Inialize bus info. Normally we would call fm10k_get_bus_info(), but
+	 * there is no way to get link status without reading BAR4.  Until this
+	 * works, assume we have maximum bandwidth.
+	 * @todo - fix bus info
+	 */
+	hw->bus_caps.speed = fm10k_bus_speed_8000;
+	hw->bus_caps.width = fm10k_bus_width_pcie_x8;
+	hw->bus_caps.payload = fm10k_bus_payload_512;
+	hw->bus.speed = fm10k_bus_speed_8000;
+	hw->bus.width = fm10k_bus_width_pcie_x8;
+	hw->bus.payload = fm10k_bus_payload_256;
+
+	/* Initialize the hw */
+	diag = fm10k_init_hw(hw);
+	if (diag != FM10K_SUCCESS) {
+		PMD_INIT_LOG(ERR, "Hardware init failed: %d", diag);
+		return -EIO;
+	}
+
+	/* Initialize MAC address(es) */
+	dev->data->mac_addrs = rte_zmalloc("fm10k", ETHER_ADDR_LEN, 0);
+	if (dev->data->mac_addrs == NULL) {
+		PMD_INIT_LOG(ERR, "Cannot allocate memory for MAC addresses");
+		return -ENOMEM;
+	}
+
+	diag = fm10k_read_mac_addr(hw);
+	if (diag != FM10K_SUCCESS) {
+		/*
+		 * TODO: remove special handling on VF. Need shared code to
+		 * fix first.
+		 */
+		if (hw->mac.type == fm10k_mac_pf) {
+			PMD_INIT_LOG(ERR, "Read MAC addr failed: %d", diag);
+			return -EIO;
+		} else {
+			/* Generate a random addr */
+			eth_random_addr(hw->mac.addr);
+			memcpy(hw->mac.perm_addr, hw->mac.addr, ETH_ALEN);
+		}
+	}
+
+	ether_addr_copy((const struct ether_addr *)hw->mac.addr,
+			&dev->data->mac_addrs[0]);
+
+	/* Reset the hw statistics */
+	fm10k_stats_reset(dev);
+
+	/* Reset the hw */
+	diag = fm10k_reset_hw(hw);
+	if (diag != FM10K_SUCCESS) {
+		PMD_INIT_LOG(ERR, "Hardware reset failed: %d", diag);
+		return -EIO;
+	}
+
+	/* Setup mailbox service */
+	diag = fm10k_setup_mbx_service(hw);
+	if (diag != FM10K_SUCCESS) {
+		PMD_INIT_LOG(ERR, "Failed to setup mailbox: %d", diag);
+		return -EIO;
+	}
+
+	/*
+	 * Below function will trigger operations on mailbox, acquire lock to
+	 * avoid race condition from interrupt handler. Operations on mailbox
+	 * FIFO will trigger interrupt to PF/SM, in which interrupt handler
+	 * will handle and generate an interrupt to our side. Then,  FIFO in
+	 * mailbox will be touched.
+	 */
+	fm10k_mbx_lock(hw);
+	/* Enable port first */
+	hw->mac.ops.update_lport_state(hw, 0, 0, 1);
+
+	/* Update default vlan */
+	hw->mac.ops.update_vlan(hw, hw->mac.default_vid, 0, true);
+
+	/*
+	 * Add default mac/vlan filter. glort is assigned by SM for PF, while is
+	 * unused for VF. PF will assign correct glort for VF.
+	 */
+	hw->mac.ops.update_uc_addr(hw, hw->mac.dglort_map, hw->mac.addr,
+			      hw->mac.default_vid, 1, 0);
+
+	/* Set unicast mode by default. App can change to other mode in other
+	 * API func.
+	 */
+	hw->mac.ops.update_xcast_mode(hw, hw->mac.dglort_map,
+					FM10K_XCAST_MODE_MULTI);
+
+	fm10k_mbx_unlock(hw);
+
+	return 0;
+}
+
+/*
+ * The set of PCI devices this driver supports. This driver will enable both PF
+ * and SRIOV-VF devices.
+ */
+static struct rte_pci_id pci_id_fm10k_map[] = {
+#define RTE_PCI_DEV_ID_DECL_FM10K(vend, dev) { RTE_PCI_DEVICE(vend, dev) },
+#include "rte_pci_dev_ids.h"
+	{ .vendor_id = 0, /* sentinel */ },
+};
+
+static struct eth_driver rte_pmd_fm10k = {
+	{
+		.name = "rte_pmd_fm10k",
+		.id_table = pci_id_fm10k_map,
+		.drv_flags = RTE_PCI_DRV_NEED_MAPPING,
+	},
+	.eth_dev_init = eth_fm10k_dev_init,
+	.dev_private_size = sizeof(struct fm10k_adapter),
+};
+
+/*
+ * Driver initialization routine.
+ * Invoked once at EAL init time.
+ * Register itself as the [Poll Mode] Driver of PCI FM10K devices.
+ */
+static int
+rte_pmd_fm10k_init(__rte_unused const char *name,
+	__rte_unused const char *params)
+{
+	PMD_INIT_FUNC_TRACE();
+	rte_eth_driver_register(&rte_pmd_fm10k);
+	return 0;
+}
+
+static struct rte_driver rte_fm10k_driver = {
+	.type = PMD_PDEV,
+	.init = rte_pmd_fm10k_init,
+};
+
+PMD_REGISTER_DRIVER(rte_fm10k_driver);
diff --git a/lib/librte_pmd_fm10k/fm10k_logs.h b/lib/librte_pmd_fm10k/fm10k_logs.h
new file mode 100644
index 0000000..febd796
--- /dev/null
+++ b/lib/librte_pmd_fm10k/fm10k_logs.h
@@ -0,0 +1,78 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2013-2015 Intel Corporation. All rights reserved.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _FM10K_LOGS_H_
+#define _FM10K_LOGS_H_
+
+#define PMD_INIT_LOG(level, fmt, args...) \
+	rte_log(RTE_LOG_ ## level, RTE_LOGTYPE_PMD, \
+		"PMD: %s(): " fmt "\n", __func__, ##args)
+
+#ifdef RTE_LIBRTE_FM10K_DEBUG_INIT
+#define PMD_INIT_FUNC_TRACE() PMD_INIT_LOG(DEBUG, " >>")
+#else
+#define PMD_INIT_FUNC_TRACE() do { } while (0)
+#endif
+
+#ifdef RTE_LIBRTE_FM10K_DEBUG_RX
+#define PMD_RX_LOG(level, fmt, args...) \
+	RTE_LOG(level, PMD, "%s(): " fmt "\n", __func__, ## args)
+#else
+#define PMD_RX_LOG(level, fmt, args...) do { } while (0)
+#endif
+
+#ifdef RTE_LIBRTE_FM10K_DEBUG_TX
+#define PMD_TX_LOG(level, fmt, args...) \
+	RTE_LOG(level, PMD, "%s(): " fmt "\n", __func__, ## args)
+#else
+#define PMD_TX_LOG(level, fmt, args...) do { } while (0)
+#endif
+
+#ifdef RTE_LIBRTE_FM10K_DEBUG_TX_FREE
+#define PMD_TX_FREE_LOG(level, fmt, args...) \
+	RTE_LOG(level, PMD, "%s(): " fmt "\n", __func__, ## args)
+#else
+#define PMD_TX_FREE_LOG(level, fmt, args...) do { } while (0)
+#endif
+
+#ifdef RTE_LIBRTE_FM10K_DEBUG_DRIVER
+#define PMD_DRV_LOG_RAW(level, fmt, args...) \
+	RTE_LOG(level, PMD, "%s(): " fmt, __func__, ## args)
+#else
+#define PMD_DRV_LOG_RAW(level, fmt, args...) do { } while (0)
+#endif
+
+#define PMD_DRV_LOG(level, fmt, args...) \
+	PMD_DRV_LOG_RAW(level, fmt "\n", ## args)
+
+#endif /* _FM10K_LOGS_H_ */
diff --git a/lib/librte_pmd_fm10k/rte_pmd_fm10k_version.map b/lib/librte_pmd_fm10k/rte_pmd_fm10k_version.map
new file mode 100644
index 0000000..ef35398
--- /dev/null
+++ b/lib/librte_pmd_fm10k/rte_pmd_fm10k_version.map
@@ -0,0 +1,4 @@
+DPDK_2.0 {
+
+	local: *;
+};
-- 
1.7.7.6

^ permalink raw reply	[relevance 1%]

* [dpdk-dev] [PATCH v6 00/16] lib/librte_pmd_fm10k : fm10k pmd driver
  @ 2015-02-17 14:18  4% ` Chen Jing D(Mark)
  2015-02-17 14:18  1%   ` [dpdk-dev] [PATCH v6 03/16] fm10k: register fm10k pmd PF driver Chen Jing D(Mark)
  2015-02-18  0:13  0%   ` [dpdk-dev] [PATCH v6 00/16] lib/librte_pmd_fm10k : fm10k pmd driver Thomas Monjalon
  0 siblings, 2 replies; 200+ results
From: Chen Jing D(Mark) @ 2015-02-17 14:18 UTC (permalink / raw)
  To: dev

From: "Chen Jing D(Mark)" <jing.d.chen@intel.com>

The patch set add poll mode driver for the host interface of Intel
Ethernet Switch FM10000 Series of silicons, which integrate NIC and
switch functionalities. The patch set include below features:

1. Basic RX/TX functions for PF/VF.
2. Interrupt handling mechanism for PF/VF.
3. per queue start/stop functions for PF/VF.
4. Mailbox handling between PF/VF and PF/Switch Manager.
5. Receive Side Scaling (RSS) for PF/VF.
6. Scatter receive function for PF/VF.
7. reta update/query for PF/VF.
8. VLAN filter set for PF.
9. Link status query for PF/VF.

Change in v6:
- Merge ABI patch with fm10k driver regsiter patch.
- Fix typo.
- Rework comments.
- Minor adjustment on commit log.
- Increase error variable after mbuf allocation failed.

Change in v5:
- Add sanity check for mbuf allocation.
- Add a new patch to claim fm10k driver review
- Change commit log.
- Add unlikely in func rx_desc_to_ol_flags to gain performance
- Add a new patch to add ABI version

Change in v4:
- Change commit log to remove improper words.

Changes in v3:
- Update base driver.
- Define several macros to pass base driver compile.

Changes in v2:
- Merge 3 patches into 1 to configure fm10k compile environment.
- Rework on log code to follow style in ixgbe.
- Rework log message, remove redundant '\n'
- Update Copyright year from "2014" to "2015"
- Change base driver directory name from SHARED to base
- Add more description in log for patch "add PF and VF interrupt"
- Merge 2 patches into 1 to register fm10k driver
- Define macro to replace numeric for lower 32-bit mask.

Chen Jing D(Mark) (1):
  maintainers: claim for fm10k review

Jeff Shaw (15):
  fm10k: add base driver
  eal: add fm10k device id
  fm10k: register fm10k pmd PF driver
  config: change config files to add fm10k into compile
  fm10k: add reta update/requery functions
  fm10k: add Rx queue setup/release function
  fm10k: add Tx queue setup/release function
  fm10k: add Rx/Tx single queue start/stop function
  fm10k: add dev start/stop functions
  fm10k: add receive and tranmit function
  fm10k: add PF RSS support
  fm10k: add scatter receive function
  fm10k: add function to set vlan
  fm10k: add SRIOV-VF support
  fm10k: add PF and VF interrupt handling function

 MAINTAINERS                                     |    4 +
 config/common_bsdapp                            |   11 +
 config/common_linuxapp                          |   11 +
 lib/Makefile                                    |    1 +
 lib/librte_eal/common/include/rte_pci_dev_ids.h |   22 +
 lib/librte_pmd_fm10k/Makefile                   |  100 +
 lib/librte_pmd_fm10k/base/fm10k_api.c           |  341 ++++
 lib/librte_pmd_fm10k/base/fm10k_api.h           |   61 +
 lib/librte_pmd_fm10k/base/fm10k_common.c        |  572 ++++++
 lib/librte_pmd_fm10k/base/fm10k_common.h        |   52 +
 lib/librte_pmd_fm10k/base/fm10k_mbx.c           | 2185 +++++++++++++++++++++++
 lib/librte_pmd_fm10k/base/fm10k_mbx.h           |  329 ++++
 lib/librte_pmd_fm10k/base/fm10k_osdep.h         |  148 ++
 lib/librte_pmd_fm10k/base/fm10k_pf.c            | 1992 +++++++++++++++++++++
 lib/librte_pmd_fm10k/base/fm10k_pf.h            |  155 ++
 lib/librte_pmd_fm10k/base/fm10k_tlv.c           |  914 ++++++++++
 lib/librte_pmd_fm10k/base/fm10k_tlv.h           |  199 ++
 lib/librte_pmd_fm10k/base/fm10k_type.h          |  937 ++++++++++
 lib/librte_pmd_fm10k/base/fm10k_vf.c            |  641 +++++++
 lib/librte_pmd_fm10k/base/fm10k_vf.h            |   91 +
 lib/librte_pmd_fm10k/fm10k.h                    |  292 +++
 lib/librte_pmd_fm10k/fm10k_ethdev.c             | 1867 +++++++++++++++++++
 lib/librte_pmd_fm10k/fm10k_logs.h               |   78 +
 lib/librte_pmd_fm10k/fm10k_rxtx.c               |  462 +++++
 lib/librte_pmd_fm10k/rte_pmd_fm10k_version.map  |    4 +
 mk/rte.app.mk                                   |    4 +
 26 files changed, 11473 insertions(+), 0 deletions(-)
 create mode 100644 lib/librte_pmd_fm10k/Makefile
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_api.c
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_api.h
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_common.c
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_common.h
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_mbx.c
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_mbx.h
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_osdep.h
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_pf.c
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_pf.h
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_tlv.c
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_tlv.h
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_type.h
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_vf.c
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_vf.h
 create mode 100644 lib/librte_pmd_fm10k/fm10k.h
 create mode 100644 lib/librte_pmd_fm10k/fm10k_ethdev.c
 create mode 100644 lib/librte_pmd_fm10k/fm10k_logs.h
 create mode 100644 lib/librte_pmd_fm10k/fm10k_rxtx.c
 create mode 100644 lib/librte_pmd_fm10k/rte_pmd_fm10k_version.map

-- 
1.7.7.6

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v2] doc: Add requirements for x32 ABI
  2015-02-16 16:27 11% ` [dpdk-dev] [PATCH v2] " Daniel Mrzyglod
@ 2015-02-16 16:29  4%   ` De Lara Guarch, Pablo
  2015-02-18 19:33  4%     ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: De Lara Guarch, Pablo @ 2015-02-16 16:29 UTC (permalink / raw)
  To: Mrzyglod, DanielX T, dev



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Daniel Mrzyglod
> Sent: Monday, February 16, 2015 4:27 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v2] doc: Add requirements for x32 ABI
> 
> This patch add requirements about compiler and distribution support.
> 
> v2:
> spelling fixes
> 
> Signed-off-by: Daniel Mrzyglod <danielx.t.mrzyglod@intel.com>
> ---
>  doc/guides/linux_gsg/sys_reqs.rst | 11 +++++++++--
>  1 file changed, 9 insertions(+), 2 deletions(-)
> 
> diff --git a/doc/guides/linux_gsg/sys_reqs.rst
> b/doc/guides/linux_gsg/sys_reqs.rst
> index 8e2307b..ef4196e 100644
> --- a/doc/guides/linux_gsg/sys_reqs.rst
> +++ b/doc/guides/linux_gsg/sys_reqs.rst
> @@ -62,7 +62,7 @@ Compilation of the DPDK
>  *   coreutils:  cmp, sed, grep, arch
> 
>  *   gcc: versions 4.5.x or later is recommended for i686/x86_64. versions 4.8.x
> or later is recommanded
> -    for ppc_64. On some distributions, some specific compiler flags and linker
> flags are enabled by
> +    for ppc_64 and x86_x32 ABI. On some distributions, some specific
> compiler flags and linker flags are enabled by
>      default and affect performance (- fstack-protector, for example). Please
> refer to the documentation
>      of your distribution and to gcc -dumpspecs.
> 
> @@ -78,7 +78,14 @@ Compilation of the DPDK
> 
>      glibc.ppc64, libgcc.ppc64, libstdc++.ppc64 and glibc-devel.ppc64 for IBM
> ppc_64;
> 
> -*   Python, version 2.6 or 2.7, to use various helper scripts included in the
> DPDK package
> +.. note::
> +
> +    x86_x32 ABI is currently supported with distribution packages only on
> Ubuntu
> +    higher than 13.10 or recent debian distribution. The only supported
> compiler is gcc 4.8+.
> +
> +.. note::
> +
> +    Python, version 2.6 or 2.7, to use various helper scripts included in the
> DPDK package
> 
> 
>  **Optional Tools:**
> --
> 2.1.0

Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>

Thanks Daniel!

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v2] doc: Add requirements for x32 ABI
  2015-02-13 15:58 11% [dpdk-dev] [PATCH] doc: Add requirements for x32 ABI Daniel Mrzyglod
  2015-02-16 16:09  4% ` De Lara Guarch, Pablo
@ 2015-02-16 16:27 11% ` Daniel Mrzyglod
  2015-02-16 16:29  4%   ` De Lara Guarch, Pablo
  1 sibling, 1 reply; 200+ results
From: Daniel Mrzyglod @ 2015-02-16 16:27 UTC (permalink / raw)
  To: dev

This patch add requirements about compiler and distribution support.

v2:
spelling fixes

Signed-off-by: Daniel Mrzyglod <danielx.t.mrzyglod@intel.com>
---
 doc/guides/linux_gsg/sys_reqs.rst | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/doc/guides/linux_gsg/sys_reqs.rst b/doc/guides/linux_gsg/sys_reqs.rst
index 8e2307b..ef4196e 100644
--- a/doc/guides/linux_gsg/sys_reqs.rst
+++ b/doc/guides/linux_gsg/sys_reqs.rst
@@ -62,7 +62,7 @@ Compilation of the DPDK
 *   coreutils:  cmp, sed, grep, arch
 
 *   gcc: versions 4.5.x or later is recommended for i686/x86_64. versions 4.8.x or later is recommanded
-    for ppc_64. On some distributions, some specific compiler flags and linker flags are enabled by
+    for ppc_64 and x86_x32 ABI. On some distributions, some specific compiler flags and linker flags are enabled by
     default and affect performance (- fstack-protector, for example). Please refer to the documentation
     of your distribution and to gcc -dumpspecs.
 
@@ -78,7 +78,14 @@ Compilation of the DPDK
 
     glibc.ppc64, libgcc.ppc64, libstdc++.ppc64 and glibc-devel.ppc64 for IBM ppc_64;
 
-*   Python, version 2.6 or 2.7, to use various helper scripts included in the DPDK package
+.. note::
+
+    x86_x32 ABI is currently supported with distribution packages only on Ubuntu
+    higher than 13.10 or recent debian distribution. The only supported  compiler is gcc 4.8+.
+
+.. note::
+
+    Python, version 2.6 or 2.7, to use various helper scripts included in the DPDK package
 
 
 **Optional Tools:**
-- 
2.1.0

^ permalink raw reply	[relevance 11%]

* Re: [dpdk-dev] [PATCH] doc: Add requirements for x32 ABI
  2015-02-13 15:58 11% [dpdk-dev] [PATCH] doc: Add requirements for x32 ABI Daniel Mrzyglod
@ 2015-02-16 16:09  4% ` De Lara Guarch, Pablo
  2015-02-16 16:27 11% ` [dpdk-dev] [PATCH v2] " Daniel Mrzyglod
  1 sibling, 0 replies; 200+ results
From: De Lara Guarch, Pablo @ 2015-02-16 16:09 UTC (permalink / raw)
  To: Mrzyglod, DanielX T, dev



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Daniel Mrzyglod
> Sent: Friday, February 13, 2015 3:58 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH] doc: Add requirements for x32 ABI
> 
> This patch add requirements about compiler and distribution support.
> 
> Signed-off-by: Daniel Mrzyglod <danielx.t.mrzyglod@intel.com>
> ---
>  doc/guides/linux_gsg/sys_reqs.rst | 11 +++++++++--
>  1 file changed, 9 insertions(+), 2 deletions(-)
> 
> diff --git a/doc/guides/linux_gsg/sys_reqs.rst
> b/doc/guides/linux_gsg/sys_reqs.rst
> index 8e2307b..ef4196e 100644
> --- a/doc/guides/linux_gsg/sys_reqs.rst
> +++ b/doc/guides/linux_gsg/sys_reqs.rst
> @@ -62,7 +62,7 @@ Compilation of the DPDK
>  *   coreutils:  cmp, sed, grep, arch
> 
>  *   gcc: versions 4.5.x or later is recommended for i686/x86_64. versions 4.8.x
> or later is recommanded
> -    for ppc_64. On some distributions, some specific compiler flags and linker
> flags are enabled by
> +    for ppc_64 and x86_x32 ABI. On some distributions, some specific
> compiler flags and linker flags are enabled by
>      default and affect performance (- fstack-protector, for example). Please
> refer to the documentation
>      of your distribution and to gcc -dumpspecs.
> 
> @@ -78,7 +78,14 @@ Compilation of the DPDK
> 
>      glibc.ppc64, libgcc.ppc64, libstdc++.ppc64 and glibc-devel.ppc64 for IBM
> ppc_64;
> 
> -*   Python, version 2.6 or 2.7, to use various helper scripts included in the
> DPDK package
> +.. note::
> +
> +    x86_x32 ABI is currently supported with distribution packages only on
> Ubuntu
> +    higher then 13.10 or recent debian distribution. The only supported
> compiler is gcc 4.8+.

Typo here: "then" -> "than"

> +
> +.. note::
> +
> +    Python, version 2.6 or 2.7, to use various helper scripts included in the
> DPDK package
> 
> 
>  **Optional Tools:**
> --
> 2.1.0

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PULL REQUEST] fm10k: new polling mode driver for PF/VF.
  2015-02-16 10:18  4% [dpdk-dev] [PULL REQUEST] fm10k: new polling mode driver for PF/VF Chen Jing D(Mark)
@ 2015-02-16 12:24  0% ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-02-16 12:24 UTC (permalink / raw)
  To: Chen Jing D(Mark); +Cc: dev

Hi,

2015-02-16 18:18, Chen Jing D:
> These changes add poll mode driver for the host interface of Intel
> Ethernet Switch FM10000 Series of silicons, which integrate NIC and
> switch functionalities. The patch set include below features:
> 
> 1. Basic RX/TX functions for PF/VF.
> 2. Interrupt handling mechanism for PF/VF.
> 3. per queue start/stop functions for PF/VF.
> 4. Mailbox handling between PF/VF and PF/Switch Manager.
> 5. Receive Side Scaling (RSS) for PF/VF.
> 6. Scatter receive function for PF/VF.
> 7. reta update/query for PF/VF.
> 8. VLAN filter set for PF.
> 9. Link status query for PF/VF.
> 
> The following changes since commit f2c5125a686ab64034925dabafea0877d1e5857e:
> 
>   app/testpmd: use default Rx/Tx port configuration (2015-02-14 11:35:25 +0100)
> 
> are available in the git repository at:
> 
>   jing@dpdk.org:dpdk-fm10k-next.git master
> 
> for you to fetch changes up to 1b073a75d5e809f10c0a71cbc755b02045bf8783:
> 
>   fm10k: Add ABI version of librte_pmd_fm10k (2015-02-16 03:46:00 -0500)

It seems you are requesting to pull the v5, right?
I think there were some comments from David which are not adressed.

Thanks for checking them

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PULL REQUEST] fm10k: new polling mode driver for PF/VF.
@ 2015-02-16 10:18  4% Chen Jing D(Mark)
  2015-02-16 12:24  0% ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Chen Jing D(Mark) @ 2015-02-16 10:18 UTC (permalink / raw)
  To: dev

These changes add poll mode driver for the host interface of Intel
Ethernet Switch FM10000 Series of silicons, which integrate NIC and
switch functionalities. The patch set include below features:

1. Basic RX/TX functions for PF/VF.
2. Interrupt handling mechanism for PF/VF.
3. per queue start/stop functions for PF/VF.
4. Mailbox handling between PF/VF and PF/Switch Manager.
5. Receive Side Scaling (RSS) for PF/VF.
6. Scatter receive function for PF/VF.
7. reta update/query for PF/VF.
8. VLAN filter set for PF.
9. Link status query for PF/VF.

The following changes since commit f2c5125a686ab64034925dabafea0877d1e5857e:

  app/testpmd: use default Rx/Tx port configuration (2015-02-14 11:35:25 +0100)

are available in the git repository at:

  jing@dpdk.org:dpdk-fm10k-next.git master

for you to fetch changes up to 1b073a75d5e809f10c0a71cbc755b02045bf8783:

  fm10k: Add ABI version of librte_pmd_fm10k (2015-02-16 03:46:00 -0500)

----------------------------------------------------------------
Chen Jing D(Mark) (1):
      maintainers: claim for fm10k review

Jeff Shaw (15):
      fm10k: add base driver
      eal: add fm10k device id
      fm10k: register fm10k pmd PF driver
      Change config files to add fm10k into compile
      fm10k: add reta update/requery functions
      fm10k: add rx_queue_setup/release function
      fm10k: add tx_queue_setup/release function
      fm10k: add RX/TX single queue start/stop function
      fm10k: add dev start/stop functions
      fm10k: add receive and tranmit function
      fm10k: add PF RSS support
      fm10k: Add scatter receive function
      fm10k: add function to set vlan
      fm10k: Add SRIOV-VF support
      fm10k: add PF and VF interrupt handling function

Michael Qiu (1):
      fm10k: Add ABI version of librte_pmd_fm10k

 MAINTAINERS                                     |    4 +
 config/common_bsdapp                            |   11 +
 config/common_linuxapp                          |   11 +
 lib/Makefile                                    |    1 +
 lib/librte_eal/common/include/rte_pci_dev_ids.h |   22 +
 lib/librte_pmd_fm10k/Makefile                   |  100 ++
 lib/librte_pmd_fm10k/base/fm10k_api.c           |  341 ++++
 lib/librte_pmd_fm10k/base/fm10k_api.h           |   61 +
 lib/librte_pmd_fm10k/base/fm10k_common.c        |  572 ++++++
 lib/librte_pmd_fm10k/base/fm10k_common.h        |   52 +
 lib/librte_pmd_fm10k/base/fm10k_mbx.c           | 2185 +++++++++++++++++++++++
 lib/librte_pmd_fm10k/base/fm10k_mbx.h           |  329 ++++
 lib/librte_pmd_fm10k/base/fm10k_osdep.h         |  148 ++
 lib/librte_pmd_fm10k/base/fm10k_pf.c            | 1992 +++++++++++++++++++++
 lib/librte_pmd_fm10k/base/fm10k_pf.h            |  155 ++
 lib/librte_pmd_fm10k/base/fm10k_tlv.c           |  914 ++++++++++
 lib/librte_pmd_fm10k/base/fm10k_tlv.h           |  199 +++
 lib/librte_pmd_fm10k/base/fm10k_type.h          |  937 ++++++++++
 lib/librte_pmd_fm10k/base/fm10k_vf.c            |  641 +++++++
 lib/librte_pmd_fm10k/base/fm10k_vf.h            |   91 +
 lib/librte_pmd_fm10k/fm10k.h                    |  293 +++
 lib/librte_pmd_fm10k/fm10k_ethdev.c             | 1868 +++++++++++++++++++
 lib/librte_pmd_fm10k/fm10k_logs.h               |   78 +
 lib/librte_pmd_fm10k/fm10k_rxtx.c               |  459 +++++
 lib/librte_pmd_fm10k/rte_pmd_fm10k_version.map  |    4 +
 mk/rte.app.mk                                   |    4 +
 26 files changed, 11472 insertions(+)
 create mode 100644 lib/librte_pmd_fm10k/Makefile
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_api.c
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_api.h
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_common.c
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_common.h
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_mbx.c
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_mbx.h
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_osdep.h
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_pf.c
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_pf.h
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_tlv.c
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_tlv.h
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_type.h
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_vf.c
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_vf.h
 create mode 100644 lib/librte_pmd_fm10k/fm10k.h
 create mode 100644 lib/librte_pmd_fm10k/fm10k_ethdev.c
 create mode 100644 lib/librte_pmd_fm10k/fm10k_logs.h
 create mode 100644 lib/librte_pmd_fm10k/fm10k_rxtx.c
 create mode 100644 lib/librte_pmd_fm10k/rte_pmd_fm10k_version.map

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v5 00/17] lib/librte_pmd_fm10k : fm10k pmd driver
  2015-02-13  8:19  4% ` [dpdk-dev] [PATCH v5 00/17] lib/librte_pmd_fm10k : fm10k pmd driver Chen Jing D(Mark)
  2015-02-13  8:19  7%   ` [dpdk-dev] [PATCH v5 17/17] fm10k: Add ABI version of librte_pmd_fm10k Chen Jing D(Mark)
  2015-02-13  8:37  0%   ` [dpdk-dev] [PATCH v5 00/17] lib/librte_pmd_fm10k : fm10k pmd driver Zhang, Helin
@ 2015-02-15  5:07  0%   ` Qiu, Michael
  2 siblings, 0 replies; 200+ results
From: Qiu, Michael @ 2015-02-15  5:07 UTC (permalink / raw)
  To: Chen, Jing D, dev

On 2/13/2015 4:20 PM, Chen, Jing D wrote:
> From: "Chen Jing D(Mark)" <jing.d.chen@intel.com>
>
> The patch set add poll mode driver for the host interface of Intel
> Ethernet Switch FM10000 Series of silicons, which integrate NIC and
> switch functionalities. The patch set include below features:
>
> 1. Basic RX/TX functions for PF/VF.
> 2. Interrupt handling mechanism for PF/VF.
> 3. per queue start/stop functions for PF/VF.
> 4. Mailbox handling between PF/VF and PF/Switch Manager.
> 5. Receive Side Scaling (RSS) for PF/VF.
> 6. Scatter receive function for PF/VF.
> 7. reta update/query for PF/VF.
> 8. VLAN filter set for PF.
> 9. Link status query for PF/VF.
>
> Change in v5:
> - Add sanity check for mbuf allocation.
> - Add a new patch to claim fm10k driver review
> - Change commit log.
> - Add unlikely in func rx_desc_to_ol_flags to gain performance
> - Add a new patch to add ABI version
>
> Change in v4:
> - Change commit log to remove improper words.
>
> Changes in v3:
> - Update base driver.
> - Define several macros to pass base driver compile.
>
> Changes in v2:
> - Merge 3 patches into 1 to configure fm10k compile environment.
> - Rework on log code to follow style in ixgbe.
> - Rework log message, remove redundant '\n'
> - Update Copyright year from "2014" to "2015"
> - Change base driver directory name from SHARED to base
> - Add more description in log for patch "add PF and VF interrupt"
> - Merge 2 patches into 1 to register fm10k driver
> - Define macro to replace numeric for lower 32-bit mask.
>
> Chen Jing D(Mark) (1):
>   maintainers: claim for fm10k review
>
> Jeff Shaw (15):
>   fm10k: add base driver
>   eal: add fm10k device id
>   fm10k: register fm10k pmd PF driver
>   Change config files to add fm10k into compile
>   fm10k: add reta update/requery functions
>   fm10k: add rx_queue_setup/release function
>   fm10k: add tx_queue_setup/release function
>   fm10k: add RX/TX single queue start/stop function
>   fm10k: add dev start/stop functions
>   fm10k: add receive and tranmit function
>   fm10k: add PF RSS support
>   fm10k: Add scatter receive function
>   fm10k: add function to set vlan
>   fm10k: Add SRIOV-VF support
>   fm10k: add PF and VF interrupt handling function
>
> Michael Qiu (1):
>   fm10k: Add ABI version of librte_pmd_fm10k
>
>  MAINTAINERS                                     |    4 +
>  config/common_bsdapp                            |   11 +
>  config/common_linuxapp                          |   11 +
>  lib/Makefile                                    |    1 +
>  lib/librte_eal/common/include/rte_pci_dev_ids.h |   22 +
>  lib/librte_pmd_fm10k/Makefile                   |  100 +
>  lib/librte_pmd_fm10k/base/fm10k_api.c           |  341 ++++
>  lib/librte_pmd_fm10k/base/fm10k_api.h           |   61 +
>  lib/librte_pmd_fm10k/base/fm10k_common.c        |  572 ++++++
>  lib/librte_pmd_fm10k/base/fm10k_common.h        |   52 +
>  lib/librte_pmd_fm10k/base/fm10k_mbx.c           | 2185 +++++++++++++++++++++++
>  lib/librte_pmd_fm10k/base/fm10k_mbx.h           |  329 ++++
>  lib/librte_pmd_fm10k/base/fm10k_osdep.h         |  148 ++
>  lib/librte_pmd_fm10k/base/fm10k_pf.c            | 1992 +++++++++++++++++++++
>  lib/librte_pmd_fm10k/base/fm10k_pf.h            |  155 ++
>  lib/librte_pmd_fm10k/base/fm10k_tlv.c           |  914 ++++++++++
>  lib/librte_pmd_fm10k/base/fm10k_tlv.h           |  199 ++
>  lib/librte_pmd_fm10k/base/fm10k_type.h          |  937 ++++++++++
>  lib/librte_pmd_fm10k/base/fm10k_vf.c            |  641 +++++++
>  lib/librte_pmd_fm10k/base/fm10k_vf.h            |   91 +
>  lib/librte_pmd_fm10k/fm10k.h                    |  293 +++
>  lib/librte_pmd_fm10k/fm10k_ethdev.c             | 1868 +++++++++++++++++++
>  lib/librte_pmd_fm10k/fm10k_logs.h               |   78 +
>  lib/librte_pmd_fm10k/fm10k_rxtx.c               |  459 +++++
>  lib/librte_pmd_fm10k/rte_pmd_fm10k_version.map  |    4 +
>  mk/rte.app.mk                                   |    4 +
>  26 files changed, 11472 insertions(+), 0 deletions(-)
>  create mode 100644 lib/librte_pmd_fm10k/Makefile
>  create mode 100644 lib/librte_pmd_fm10k/base/fm10k_api.c
>  create mode 100644 lib/librte_pmd_fm10k/base/fm10k_api.h
>  create mode 100644 lib/librte_pmd_fm10k/base/fm10k_common.c
>  create mode 100644 lib/librte_pmd_fm10k/base/fm10k_common.h
>  create mode 100644 lib/librte_pmd_fm10k/base/fm10k_mbx.c
>  create mode 100644 lib/librte_pmd_fm10k/base/fm10k_mbx.h
>  create mode 100644 lib/librte_pmd_fm10k/base/fm10k_osdep.h
>  create mode 100644 lib/librte_pmd_fm10k/base/fm10k_pf.c
>  create mode 100644 lib/librte_pmd_fm10k/base/fm10k_pf.h
>  create mode 100644 lib/librte_pmd_fm10k/base/fm10k_tlv.c
>  create mode 100644 lib/librte_pmd_fm10k/base/fm10k_tlv.h
>  create mode 100644 lib/librte_pmd_fm10k/base/fm10k_type.h
>  create mode 100644 lib/librte_pmd_fm10k/base/fm10k_vf.c
>  create mode 100644 lib/librte_pmd_fm10k/base/fm10k_vf.h
>  create mode 100644 lib/librte_pmd_fm10k/fm10k.h
>  create mode 100644 lib/librte_pmd_fm10k/fm10k_ethdev.c
>  create mode 100644 lib/librte_pmd_fm10k/fm10k_logs.h
>  create mode 100644 lib/librte_pmd_fm10k/fm10k_rxtx.c
>  create mode 100644 lib/librte_pmd_fm10k/rte_pmd_fm10k_version.map
>
Acked-by: Michael Qiu <michael.qiu@intel.com>

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v2 4/4] abi: Added rxtx callback functions to ABI versioning
  2015-02-13 15:39  5%   ` [dpdk-dev] [PATCH v2 4/4] abi: Added rxtx callback functions to ABI versioning John McNamara
@ 2015-02-13 15:59  5%     ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-02-13 15:59 UTC (permalink / raw)
  To: John McNamara; +Cc: dev

2015-02-13 15:39, John McNamara:
> ---

There is no signed-off.
And there is no need of a separate patch for that.

>  lib/librte_ether/rte_ether_version.map |    4 ++++

^ permalink raw reply	[relevance 5%]

* [dpdk-dev] [PATCH] doc: Add requirements for x32 ABI
@ 2015-02-13 15:58 11% Daniel Mrzyglod
  2015-02-16 16:09  4% ` De Lara Guarch, Pablo
  2015-02-16 16:27 11% ` [dpdk-dev] [PATCH v2] " Daniel Mrzyglod
  0 siblings, 2 replies; 200+ results
From: Daniel Mrzyglod @ 2015-02-13 15:58 UTC (permalink / raw)
  To: dev

This patch add requirements about compiler and distribution support.

Signed-off-by: Daniel Mrzyglod <danielx.t.mrzyglod@intel.com>
---
 doc/guides/linux_gsg/sys_reqs.rst | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/doc/guides/linux_gsg/sys_reqs.rst b/doc/guides/linux_gsg/sys_reqs.rst
index 8e2307b..ef4196e 100644
--- a/doc/guides/linux_gsg/sys_reqs.rst
+++ b/doc/guides/linux_gsg/sys_reqs.rst
@@ -62,7 +62,7 @@ Compilation of the DPDK
 *   coreutils:  cmp, sed, grep, arch
 
 *   gcc: versions 4.5.x or later is recommended for i686/x86_64. versions 4.8.x or later is recommanded
-    for ppc_64. On some distributions, some specific compiler flags and linker flags are enabled by
+    for ppc_64 and x86_x32 ABI. On some distributions, some specific compiler flags and linker flags are enabled by
     default and affect performance (- fstack-protector, for example). Please refer to the documentation
     of your distribution and to gcc -dumpspecs.
 
@@ -78,7 +78,14 @@ Compilation of the DPDK
 
     glibc.ppc64, libgcc.ppc64, libstdc++.ppc64 and glibc-devel.ppc64 for IBM ppc_64;
 
-*   Python, version 2.6 or 2.7, to use various helper scripts included in the DPDK package
+.. note::
+
+    x86_x32 ABI is currently supported with distribution packages only on Ubuntu
+    higher then 13.10 or recent debian distribution. The only supported  compiler is gcc 4.8+.
+
+.. note::
+
+    Python, version 2.6 or 2.7, to use various helper scripts included in the DPDK package
 
 
 **Optional Tools:**
-- 
2.1.0

^ permalink raw reply	[relevance 11%]

* Re: [dpdk-dev] [PATCH v2 0/4] DPDK ethdev callback support
  2015-02-13 15:39  4% ` [dpdk-dev] [PATCH v2 0/4] " John McNamara
  2015-02-13 15:39  5%   ` [dpdk-dev] [PATCH v2 4/4] abi: Added rxtx callback functions to ABI versioning John McNamara
@ 2015-02-13 15:48  0%   ` Declan Doherty
  1 sibling, 0 replies; 200+ results
From: Declan Doherty @ 2015-02-13 15:48 UTC (permalink / raw)
  To: John McNamara, dev

On 13/02/15 15:39, John McNamara wrote:
> This patchset is for a small addition to the ethdev library, to
> add in support for callbacks at the RX and TX stages. This allows
> packet processing to be done on packets before they get returned
> to applications using rte_eth_rx_burst call.
>
> See the RFC cover letter for the use cases:
>
>      http://dpdk.org/ml/archives/dev/2014-December/010491.html
>
> For the post-RFC version we spent some time investigating Stephen Hemminger's
> suggestion of using the userspace RCU (read-copy-update) library for
> SMP safety:
>
>     http://urcu.so/
>
> The default liburcu (which defaulted to liburcu-mb) requires the least
> interaction from the end user but showed a 25% drop in packet throughput
> in the callback sample app.
>
> The liburcu-qsbr (quiescent state) variant showed a 1% drop in packet
> throughput in the callback sample app. However it requires registered
> RCU threads in the program to periodically announce quiescent states.
> This makes it more difficult to implement for end user applications.
>
> For this release we will document that adding and removing callbacks
> is not thread safe.
>
> Note: Sample application documentation to follow in a patch update.
>
> Version 2 changes:
>      * Added ABI versioning.
>      * Doxygen clarifications.
>
> Version 1 changes:
>      * Added callback removal functions.
>      * Minor fixes.
>
>
> John McNamara (1):
>    abi: Added rxtx callback functions to ABI versioning
>
> Richardson, Bruce (3):
>    ethdev: rename callbacks field to intr_cbs
>    ethdev: Add in data rxtx callback support
>    examples: example showing use of callbacks.
>
>   app/test/virtual_pmd.c                 |    2 +-
>   examples/rxtx_callbacks/Makefile       |   57 ++++++++
>   examples/rxtx_callbacks/basicfwd.c     |  222 ++++++++++++++++++++++++++++++++
>   examples/rxtx_callbacks/basicfwd.h     |   46 +++++++
>   lib/librte_ether/rte_ethdev.c          |  175 ++++++++++++++++++++++++--
>   lib/librte_ether/rte_ethdev.h          |  191 +++++++++++++++++++++++++++-
>   lib/librte_ether/rte_ether_version.map |    4 +
>   lib/librte_pmd_bond/rte_eth_bond_api.c |    2 +-
>   8 files changed, 685 insertions(+), 14 deletions(-)
>   create mode 100644 examples/rxtx_callbacks/Makefile
>   create mode 100644 examples/rxtx_callbacks/basicfwd.c
>   create mode 100644 examples/rxtx_callbacks/basicfwd.h
>

Series Acked-by: Declan Doherty <declan.doherty@intel.com>

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v2 4/4] abi: Added rxtx callback functions to ABI versioning
  2015-02-13 15:39  4% ` [dpdk-dev] [PATCH v2 0/4] " John McNamara
@ 2015-02-13 15:39  5%   ` John McNamara
  2015-02-13 15:59  5%     ` Thomas Monjalon
  2015-02-13 15:48  0%   ` [dpdk-dev] [PATCH v2 0/4] DPDK ethdev callback support Declan Doherty
  1 sibling, 1 reply; 200+ results
From: John McNamara @ 2015-02-13 15:39 UTC (permalink / raw)
  To: dev

---
 lib/librte_ether/rte_ether_version.map |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map
index 7316530..3227cda 100644
--- a/lib/librte_ether/rte_ether_version.map
+++ b/lib/librte_ether/rte_ether_version.map
@@ -2,6 +2,8 @@ DPDK_2.0 {
 	global:
 
 	_rte_eth_dev_callback_process;
+	rte_eth_add_rx_callback;
+	rte_eth_add_tx_callback;
 	rte_eth_allmulticast_disable;
 	rte_eth_allmulticast_enable;
 	rte_eth_allmulticast_get;
@@ -96,6 +98,8 @@ DPDK_2.0 {
 	rte_eth_promiscuous_disable;
 	rte_eth_promiscuous_enable;
 	rte_eth_promiscuous_get;
+	rte_eth_remove_rx_callback;
+	rte_eth_remove_tx_callback;
 	rte_eth_rx_burst;
 	rte_eth_rx_descriptor_done;
 	rte_eth_rx_queue_count;
-- 
1.7.4.1

^ permalink raw reply	[relevance 5%]

* [dpdk-dev] [PATCH v2 0/4] DPDK ethdev callback support
    @ 2015-02-13 15:39  4% ` John McNamara
  2015-02-13 15:39  5%   ` [dpdk-dev] [PATCH v2 4/4] abi: Added rxtx callback functions to ABI versioning John McNamara
  2015-02-13 15:48  0%   ` [dpdk-dev] [PATCH v2 0/4] DPDK ethdev callback support Declan Doherty
  2015-02-18 17:42  4% ` [dpdk-dev] [PATCH v3 0/3] " John McNamara
  2 siblings, 2 replies; 200+ results
From: John McNamara @ 2015-02-13 15:39 UTC (permalink / raw)
  To: dev

This patchset is for a small addition to the ethdev library, to
add in support for callbacks at the RX and TX stages. This allows
packet processing to be done on packets before they get returned
to applications using rte_eth_rx_burst call.

See the RFC cover letter for the use cases:

    http://dpdk.org/ml/archives/dev/2014-December/010491.html

For the post-RFC version we spent some time investigating Stephen Hemminger's
suggestion of using the userspace RCU (read-copy-update) library for
SMP safety:

   http://urcu.so/

The default liburcu (which defaulted to liburcu-mb) requires the least
interaction from the end user but showed a 25% drop in packet throughput
in the callback sample app.

The liburcu-qsbr (quiescent state) variant showed a 1% drop in packet
throughput in the callback sample app. However it requires registered
RCU threads in the program to periodically announce quiescent states.
This makes it more difficult to implement for end user applications.

For this release we will document that adding and removing callbacks
is not thread safe.

Note: Sample application documentation to follow in a patch update.

Version 2 changes:
    * Added ABI versioning.
    * Doxygen clarifications.

Version 1 changes:
    * Added callback removal functions.
    * Minor fixes.


John McNamara (1):
  abi: Added rxtx callback functions to ABI versioning

Richardson, Bruce (3):
  ethdev: rename callbacks field to intr_cbs
  ethdev: Add in data rxtx callback support
  examples: example showing use of callbacks.

 app/test/virtual_pmd.c                 |    2 +-
 examples/rxtx_callbacks/Makefile       |   57 ++++++++
 examples/rxtx_callbacks/basicfwd.c     |  222 ++++++++++++++++++++++++++++++++
 examples/rxtx_callbacks/basicfwd.h     |   46 +++++++
 lib/librte_ether/rte_ethdev.c          |  175 ++++++++++++++++++++++++--
 lib/librte_ether/rte_ethdev.h          |  191 +++++++++++++++++++++++++++-
 lib/librte_ether/rte_ether_version.map |    4 +
 lib/librte_pmd_bond/rte_eth_bond_api.c |    2 +-
 8 files changed, 685 insertions(+), 14 deletions(-)
 create mode 100644 examples/rxtx_callbacks/Makefile
 create mode 100644 examples/rxtx_callbacks/basicfwd.c
 create mode 100644 examples/rxtx_callbacks/basicfwd.h

-- 
1.7.4.1

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH 0/3] DPDK ethdev callback support
    @ 2015-02-13 14:54  3%   ` Declan Doherty
  1 sibling, 0 replies; 200+ results
From: Declan Doherty @ 2015-02-13 14:54 UTC (permalink / raw)
  To: John McNamara, dev

On 12/02/15 19:57, John McNamara wrote:
> This patchset is for a small addition to the ethdev library, to
> add in support for callbacks at the RX and TX stages. This allows
> packet processing to be done on packets before they get returned
> to applications using rte_eth_rx_burst call.
>
> See the RFC cover letter for the use cases:
>
>      http://dpdk.org/ml/archives/dev/2014-December/010491.html
>
> For this version we spent some time investigating Stephen Hemminger's
> suggestion of using the userspace RCU (read-copy-update) library for
> SMP safety:
>
>     http://urcu.so/
>
> The default liburcu (which defaulted to liburcu-mb) requires the least
> interaction from the end user but showed a 25% drop in packet throughput
> in the callback sample app.
>
> The liburcu-qsbr (quiescent state) variant showed a 1% drop in packet
> throughput in the callback sample app. However it requires registered
> RCU threads in the program to periodically announce quiescent states.
> This makes it more difficult to implement for end user applications.
>
> For this release we will document that callbacks should be added/removed
> on stopped ports.
>
> Version 1 changes:
>      * Added callback removal functions.
>      * Minor fixes.
>
>
> Richardson, Bruce (3):
>    ethdev: rename callbacks field to intr_cbs
>    ethdev: Add in data rxtx callback support
>    examples: example showing use of callbacks.
>
>   app/test/virtual_pmd.c                 |    2 +-
>   examples/rxtx_callbacks/Makefile       |   57 ++++++++
>   examples/rxtx_callbacks/basicfwd.c     |  222 ++++++++++++++++++++++++++++++++
>   examples/rxtx_callbacks/basicfwd.h     |   46 +++++++
>   lib/librte_ether/rte_ethdev.c          |  177 ++++++++++++++++++++++++--
>   lib/librte_ether/rte_ethdev.h          |  175 +++++++++++++++++++++++++-
>   lib/librte_pmd_bond/rte_eth_bond_api.c |    2 +-
>   7 files changed, 667 insertions(+), 14 deletions(-)
>   create mode 100644 examples/rxtx_callbacks/Makefile
>   create mode 100644 examples/rxtx_callbacks/basicfwd.c
>   create mode 100644 examples/rxtx_callbacks/basicfwd.h
>

Looks good to me, I'll ack the next version which has addressed the ABI 
issues Neil raised. Also, it should probably be noted in the doxygen 
comments for the add/remove rxtx callbacks that as currently implemented 
the addition/removal of callbacks isn't thread safe

Declan

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH 0/8] Improve build process
  2015-02-13 11:08  0%                             ` Gonzalez Monroy, Sergio
@ 2015-02-13 12:51  0%                               ` Neil Horman
  2015-02-20 14:31  0%                                 ` Gonzalez Monroy, Sergio
  0 siblings, 1 reply; 200+ results
From: Neil Horman @ 2015-02-13 12:51 UTC (permalink / raw)
  To: Gonzalez Monroy, Sergio; +Cc: dev

On Fri, Feb 13, 2015 at 11:08:02AM +0000, Gonzalez Monroy, Sergio wrote:
> On 13/02/2015 10:14, Panu Matilainen wrote:
> >On 02/12/2015 05:52 PM, Neil Horman wrote:
> >>On Thu, Feb 12, 2015 at 04:07:50PM +0200, Panu Matilainen wrote:
> >>>On 02/12/2015 02:23 PM, Neil Horman wrote:
> >[...snip...]
> >>>>>>>>
> >>>>>>>So I just realized that I was not having into account a possible
> >>>>>>>scenario, where
> >>>>>>>we have an app built with static dpdk libs then loading a dso
> >>>>>>>with -d
> >>>>>>>option.
> >>>>>>>
> >>>>>>>In such case, because the pmd would have DT_NEEDED entries,
> >>>>>>>dlopen will
> >>>>>>>fail.
> >>>>>>>So to enable such scenario we would need to build PMDs without
> >>>>>>>DT_NEEDED
> >>>>>>>entries.
> >>>>>>
> >>>>>>Hmm, for that to be a problem you'd need to have the PMD built
> >>>>>>against
> >>>>>>shared dpdk libs and while the application is built against
> >>>>>>static dpdk
> >>>>>>libs. I dont think that's a supportable scenario in any case.
> >>>>>>
> >>>>>>Or is there some other scenario that I'm not seeing?
> >>>>>>
> >>>>>>    - Panu -
> >>>>>>
> >>>>>I agree with you. I suppose it comes down to, do we want to
> >>>>>support such
> >>>>>scenario?
> >>>>>
> >>>>> From what I can see, it seems that we do currently support such
> >>>>>scenario by
> >>>>>building dpdk apps against all static dpdk libs using
> >>>>>--whole-archive (all
> >>>>>libs and not only PMDs).
> >>>>>http://dpdk.org/browse/dpdk/commit/?id=20afd76a504155e947c770783ef5023e87136ad8
> >>>>>
> >>>>>
> >>>>>Am I misunderstanding this?
> >>>>>
> >>>>Shoot, you're right, I missed the static build aspect to this.  Yes,
> >>>>if we do the following:
> >>>>
> >>>>1) Build the DPDK as a static library
> >>>>2) Link an application against (1)
> >>>>3) Use the dlopen mechanism to load a PMD built as a DSO
> >>>>
> >>>>Then the DT_NEEDED entries in the DSO will go unsatisfied, because
> >>>>the shared
> >>>>objects on which it (the PMD) depends will not exist in the file
> >>>>system.
> >>>
> >>>I think its even more twisty:
> >>>
> >>>1) Build the DPDK as a static library
> >>>2) Link an application against (1)
> >>>3) Do another build of DPDK as a shared library
> >>>4) In app 2), use the dlopen mechanism to load a PMD built as a part
> >>>of or
> >>>against 3)
> >>>
> >>>Somehow I doubt this would work very well.
> >>>
> >>Ideally it should, presuming the ABI is preserved between (1) and (3),
> >>though I
> >>agree, up until recently, that was an assumption that was unreliable.
> >
> >Versioning is a big and important step towards reliability but there are
> >more issues to solve. This of course getting pretty far from the original
> >topic, but at least one such issue is that there are some cases where a
> >config value affects what are apparently public structs (rte_mbuf wrt
> >RTE_MBUF_REFCNT for example), which really is a no-go.
> >
> Agree, the RTE_MBUF_REFCNT is something that needs to be dealt with asap.
> I'll look into it.
> 
> >>>>
> >>>>I think the problem is a little bit orthogonal to the libdpdk_core
> >>>>problem you
> >>>>were initially addressing.  That is to say, this problem of
> >>>>dlopen-ed PMD's
> >>>>exists regardless of weather you build the DPDK as part of a static
> >>>>or dynamic
> >>>>library.  The problems just happen to intersect in their
> >>>>manipulation of the
> >>>>DT_NEEDED entries.
> >>>>
> >>>>Ok, so, given the above, I would say your approach is likely
> >>>>correct, just
> >>>>prevent DT_NEEDED entries from getting added to PMD's. Doing so will
> >>>>sidestep
> >>>>loading issue for libraries that may not exist in the filesystem,
> >>>>but thats ok,
> >>>>because by all rights, the symbols codified in those needed
> >>>>libraries should
> >>>>already be present in the running application (either made available
> >>>>by the
> >>>>application having statically linked them, or having the linker load
> >>>>them from
> >>>>the proper libraries at run time).
> >>>
> >>>My 5c is that I'd much rather see the common case (all static or all
> >>>shared)
> >>>be simple and reliable, which in case of DSOs includes no lying
> >>>(whether by
> >>>omission or otherwise) about DT_NEEDED, ever. That way the issue is
> >>>dealt
> >>>once where it belongs. If somebody wants to go down the rabbit hole of
> >>>mixed
> >>>shared + static linkage, let them dig the hole by themselves :)
> >>>
> >>This is a fair point.  Can DT_NEEDED sections be stripped via tools like
> >>objcopy
> >>after the build is complete?  If so, end users can hack this corner case
> >>to work
> >>as needed.
> >
> >Patchelf (http://nixos.org/patchelf.html) appears to support that, but
> >given that source is available it'd be easier to just modify the makefiles
> >if that's really needed.
> >
> I think we agree on the issue.
> 
> So I'll be sending a patch to add DT_NEEDED entries to all libraries and
> PMDs. The only exception would be librte_eal, which would not have proper
> NEEDED entries.
> Do we bother adding a linker script for librte_eal that would include
> dependent libraries?
> 
I say yes to the linker script, but will happily bow to an alternate consensus
Neil

> Sergio
> 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 0/8] Improve build process
  2015-02-13 10:14  0%                           ` Panu Matilainen
@ 2015-02-13 11:08  0%                             ` Gonzalez Monroy, Sergio
  2015-02-13 12:51  0%                               ` Neil Horman
  0 siblings, 1 reply; 200+ results
From: Gonzalez Monroy, Sergio @ 2015-02-13 11:08 UTC (permalink / raw)
  To: Panu Matilainen; +Cc: dev

On 13/02/2015 10:14, Panu Matilainen wrote:
> On 02/12/2015 05:52 PM, Neil Horman wrote:
>> On Thu, Feb 12, 2015 at 04:07:50PM +0200, Panu Matilainen wrote:
>>> On 02/12/2015 02:23 PM, Neil Horman wrote:
> [...snip...]
>>>>>>>>
>>>>>>> So I just realized that I was not having into account a possible
>>>>>>> scenario, where
>>>>>>> we have an app built with static dpdk libs then loading a dso 
>>>>>>> with -d
>>>>>>> option.
>>>>>>>
>>>>>>> In such case, because the pmd would have DT_NEEDED entries, 
>>>>>>> dlopen will
>>>>>>> fail.
>>>>>>> So to enable such scenario we would need to build PMDs without 
>>>>>>> DT_NEEDED
>>>>>>> entries.
>>>>>>
>>>>>> Hmm, for that to be a problem you'd need to have the PMD built 
>>>>>> against
>>>>>> shared dpdk libs and while the application is built against 
>>>>>> static dpdk
>>>>>> libs. I dont think that's a supportable scenario in any case.
>>>>>>
>>>>>> Or is there some other scenario that I'm not seeing?
>>>>>>
>>>>>>     - Panu -
>>>>>>
>>>>> I agree with you. I suppose it comes down to, do we want to 
>>>>> support such
>>>>> scenario?
>>>>>
>>>>>  From what I can see, it seems that we do currently support such 
>>>>> scenario by
>>>>> building dpdk apps against all static dpdk libs using 
>>>>> --whole-archive (all
>>>>> libs and not only PMDs).
>>>>> http://dpdk.org/browse/dpdk/commit/?id=20afd76a504155e947c770783ef5023e87136ad8 
>>>>>
>>>>>
>>>>> Am I misunderstanding this?
>>>>>
>>>> Shoot, you're right, I missed the static build aspect to this.  
>>>> Yes, if we do the following:
>>>>
>>>> 1) Build the DPDK as a static library
>>>> 2) Link an application against (1)
>>>> 3) Use the dlopen mechanism to load a PMD built as a DSO
>>>>
>>>> Then the DT_NEEDED entries in the DSO will go unsatisfied, because 
>>>> the shared
>>>> objects on which it (the PMD) depends will not exist in the file 
>>>> system.
>>>
>>> I think its even more twisty:
>>>
>>> 1) Build the DPDK as a static library
>>> 2) Link an application against (1)
>>> 3) Do another build of DPDK as a shared library
>>> 4) In app 2), use the dlopen mechanism to load a PMD built as a part 
>>> of or
>>> against 3)
>>>
>>> Somehow I doubt this would work very well.
>>>
>> Ideally it should, presuming the ABI is preserved between (1) and 
>> (3), though I
>> agree, up until recently, that was an assumption that was unreliable.
>
> Versioning is a big and important step towards reliability but there 
> are more issues to solve. This of course getting pretty far from the 
> original topic, but at least one such issue is that there are some 
> cases where a config value affects what are apparently public structs 
> (rte_mbuf wrt RTE_MBUF_REFCNT for example), which really is a no-go.
>
Agree, the RTE_MBUF_REFCNT is something that needs to be dealt with 
asap. I'll look into it.

>>>>
>>>> I think the problem is a little bit orthogonal to the libdpdk_core 
>>>> problem you
>>>> were initially addressing.  That is to say, this problem of 
>>>> dlopen-ed PMD's
>>>> exists regardless of weather you build the DPDK as part of a static 
>>>> or dynamic
>>>> library.  The problems just happen to intersect in their 
>>>> manipulation of the
>>>> DT_NEEDED entries.
>>>>
>>>> Ok, so, given the above, I would say your approach is likely 
>>>> correct, just
>>>> prevent DT_NEEDED entries from getting added to PMD's. Doing so 
>>>> will sidestep
>>>> loading issue for libraries that may not exist in the filesystem, 
>>>> but thats ok,
>>>> because by all rights, the symbols codified in those needed 
>>>> libraries should
>>>> already be present in the running application (either made 
>>>> available by the
>>>> application having statically linked them, or having the linker 
>>>> load them from
>>>> the proper libraries at run time).
>>>
>>> My 5c is that I'd much rather see the common case (all static or all 
>>> shared)
>>> be simple and reliable, which in case of DSOs includes no lying 
>>> (whether by
>>> omission or otherwise) about DT_NEEDED, ever. That way the issue is 
>>> dealt
>>> once where it belongs. If somebody wants to go down the rabbit hole 
>>> of mixed
>>> shared + static linkage, let them dig the hole by themselves :)
>>>
>> This is a fair point.  Can DT_NEEDED sections be stripped via tools 
>> like objcopy
>> after the build is complete?  If so, end users can hack this corner 
>> case to work
>> as needed.
>
> Patchelf (http://nixos.org/patchelf.html) appears to support that, but 
> given that source is available it'd be easier to just modify the 
> makefiles if that's really needed.
>
I think we agree on the issue.

So I'll be sending a patch to add DT_NEEDED entries to all libraries and 
PMDs. The only exception would be librte_eal, which would not have 
proper NEEDED entries.
Do we bother adding a linker script for librte_eal that would include 
dependent libraries?

Sergio

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 0/8] Improve build process
  2015-02-12 15:52  3%                         ` Neil Horman
@ 2015-02-13 10:14  0%                           ` Panu Matilainen
  2015-02-13 11:08  0%                             ` Gonzalez Monroy, Sergio
  0 siblings, 1 reply; 200+ results
From: Panu Matilainen @ 2015-02-13 10:14 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

On 02/12/2015 05:52 PM, Neil Horman wrote:
> On Thu, Feb 12, 2015 at 04:07:50PM +0200, Panu Matilainen wrote:
>> On 02/12/2015 02:23 PM, Neil Horman wrote:
[...snip...]
>>>>>>>
>>>>>> So I just realized that I was not having into account a possible
>>>>>> scenario, where
>>>>>> we have an app built with static dpdk libs then loading a dso with -d
>>>>>> option.
>>>>>>
>>>>>> In such case, because the pmd would have DT_NEEDED entries, dlopen will
>>>>>> fail.
>>>>>> So to enable such scenario we would need to build PMDs without DT_NEEDED
>>>>>> entries.
>>>>>
>>>>> Hmm, for that to be a problem you'd need to have the PMD built against
>>>>> shared dpdk libs and while the application is built against static dpdk
>>>>> libs. I dont think that's a supportable scenario in any case.
>>>>>
>>>>> Or is there some other scenario that I'm not seeing?
>>>>>
>>>>>     - Panu -
>>>>>
>>>> I agree with you. I suppose it comes down to, do we want to support such
>>>> scenario?
>>>>
>>>>  From what I can see, it seems that we do currently support such scenario by
>>>> building dpdk apps against all static dpdk libs using --whole-archive (all
>>>> libs and not only PMDs).
>>>> http://dpdk.org/browse/dpdk/commit/?id=20afd76a504155e947c770783ef5023e87136ad8
>>>>
>>>> Am I misunderstanding this?
>>>>
>>> Shoot, you're right, I missed the static build aspect to this.  Yes, if we do the following:
>>>
>>> 1) Build the DPDK as a static library
>>> 2) Link an application against (1)
>>> 3) Use the dlopen mechanism to load a PMD built as a DSO
>>>
>>> Then the DT_NEEDED entries in the DSO will go unsatisfied, because the shared
>>> objects on which it (the PMD) depends will not exist in the file system.
>>
>> I think its even more twisty:
>>
>> 1) Build the DPDK as a static library
>> 2) Link an application against (1)
>> 3) Do another build of DPDK as a shared library
>> 4) In app 2), use the dlopen mechanism to load a PMD built as a part of or
>> against 3)
>>
>> Somehow I doubt this would work very well.
>>
> Ideally it should, presuming the ABI is preserved between (1) and (3), though I
> agree, up until recently, that was an assumption that was unreliable.

Versioning is a big and important step towards reliability but there are 
more issues to solve. This of course getting pretty far from the 
original topic, but at least one such issue is that there are some cases 
where a config value affects what are apparently public structs 
(rte_mbuf wrt RTE_MBUF_REFCNT for example), which really is a no-go.

>>>
>>> I think the problem is a little bit orthogonal to the libdpdk_core problem you
>>> were initially addressing.  That is to say, this problem of dlopen-ed PMD's
>>> exists regardless of weather you build the DPDK as part of a static or dynamic
>>> library.  The problems just happen to intersect in their manipulation of the
>>> DT_NEEDED entries.
>>>
>>> Ok, so, given the above, I would say your approach is likely correct, just
>>> prevent DT_NEEDED entries from getting added to PMD's.  Doing so will sidestep
>>> loading issue for libraries that may not exist in the filesystem, but thats ok,
>>> because by all rights, the symbols codified in those needed libraries should
>>> already be present in the running application (either made available by the
>>> application having statically linked them, or having the linker load them from
>>> the proper libraries at run time).
>>
>> My 5c is that I'd much rather see the common case (all static or all shared)
>> be simple and reliable, which in case of DSOs includes no lying (whether by
>> omission or otherwise) about DT_NEEDED, ever. That way the issue is dealt
>> once where it belongs. If somebody wants to go down the rabbit hole of mixed
>> shared + static linkage, let them dig the hole by themselves :)
>>
> This is a fair point.  Can DT_NEEDED sections be stripped via tools like objcopy
> after the build is complete?  If so, end users can hack this corner case to work
> as needed.

Patchelf (http://nixos.org/patchelf.html) appears to support that, but 
given that source is available it'd be easier to just modify the 
makefiles if that's really needed.

	- Panu -

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v5 00/17] lib/librte_pmd_fm10k : fm10k pmd driver
  2015-02-13  8:19  4% ` [dpdk-dev] [PATCH v5 00/17] lib/librte_pmd_fm10k : fm10k pmd driver Chen Jing D(Mark)
  2015-02-13  8:19  7%   ` [dpdk-dev] [PATCH v5 17/17] fm10k: Add ABI version of librte_pmd_fm10k Chen Jing D(Mark)
@ 2015-02-13  8:37  0%   ` Zhang, Helin
  2015-02-15  5:07  0%   ` Qiu, Michael
  2 siblings, 0 replies; 200+ results
From: Zhang, Helin @ 2015-02-13  8:37 UTC (permalink / raw)
  To: Chen, Jing D, dev



> -----Original Message-----
> From: Chen, Jing D
> Sent: Friday, February 13, 2015 4:20 PM
> To: dev@dpdk.org
> Cc: Zhang, Helin; Qiu, Michael; nhorman@tuxdriver.com;
> thomas.monjalon@6wind.com; david.marchand@6wind.com; Chen, Jing D
> Subject: [PATCH v5 00/17] lib/librte_pmd_fm10k : fm10k pmd driver
> 
> From: "Chen Jing D(Mark)" <jing.d.chen@intel.com>
> 
> The patch set add poll mode driver for the host interface of Intel Ethernet
> Switch FM10000 Series of silicons, which integrate NIC and switch
> functionalities. The patch set include below features:
> 
> 1. Basic RX/TX functions for PF/VF.
> 2. Interrupt handling mechanism for PF/VF.
> 3. per queue start/stop functions for PF/VF.
> 4. Mailbox handling between PF/VF and PF/Switch Manager.
> 5. Receive Side Scaling (RSS) for PF/VF.
> 6. Scatter receive function for PF/VF.
> 7. reta update/query for PF/VF.
> 8. VLAN filter set for PF.
> 9. Link status query for PF/VF.
> 
> Change in v5:
> - Add sanity check for mbuf allocation.
> - Add a new patch to claim fm10k driver review
> - Change commit log.
> - Add unlikely in func rx_desc_to_ol_flags to gain performance
> - Add a new patch to add ABI version
> 
> Change in v4:
> - Change commit log to remove improper words.
> 
> Changes in v3:
> - Update base driver.
> - Define several macros to pass base driver compile.
> 
> Changes in v2:
> - Merge 3 patches into 1 to configure fm10k compile environment.
> - Rework on log code to follow style in ixgbe.
> - Rework log message, remove redundant '\n'
> - Update Copyright year from "2014" to "2015"
> - Change base driver directory name from SHARED to base
> - Add more description in log for patch "add PF and VF interrupt"
> - Merge 2 patches into 1 to register fm10k driver
> - Define macro to replace numeric for lower 32-bit mask.
> 
> Chen Jing D(Mark) (1):
>   maintainers: claim for fm10k review
> 
> Jeff Shaw (15):
>   fm10k: add base driver
>   eal: add fm10k device id
>   fm10k: register fm10k pmd PF driver
>   Change config files to add fm10k into compile
>   fm10k: add reta update/requery functions
>   fm10k: add rx_queue_setup/release function
>   fm10k: add tx_queue_setup/release function
>   fm10k: add RX/TX single queue start/stop function
>   fm10k: add dev start/stop functions
>   fm10k: add receive and tranmit function
>   fm10k: add PF RSS support
>   fm10k: Add scatter receive function
>   fm10k: add function to set vlan
>   fm10k: Add SRIOV-VF support
>   fm10k: add PF and VF interrupt handling function
> 
> Michael Qiu (1):
>   fm10k: Add ABI version of librte_pmd_fm10k
> 
>  MAINTAINERS                                     |    4 +
>  config/common_bsdapp                            |   11 +
>  config/common_linuxapp                          |   11 +
>  lib/Makefile                                    |    1 +
>  lib/librte_eal/common/include/rte_pci_dev_ids.h |   22 +
>  lib/librte_pmd_fm10k/Makefile                   |  100 +
>  lib/librte_pmd_fm10k/base/fm10k_api.c           |  341 ++++
>  lib/librte_pmd_fm10k/base/fm10k_api.h           |   61 +
>  lib/librte_pmd_fm10k/base/fm10k_common.c        |  572 ++++++
>  lib/librte_pmd_fm10k/base/fm10k_common.h        |   52 +
>  lib/librte_pmd_fm10k/base/fm10k_mbx.c           | 2185
> +++++++++++++++++++++++
>  lib/librte_pmd_fm10k/base/fm10k_mbx.h           |  329 ++++
>  lib/librte_pmd_fm10k/base/fm10k_osdep.h         |  148 ++
>  lib/librte_pmd_fm10k/base/fm10k_pf.c            | 1992
> +++++++++++++++++++++
>  lib/librte_pmd_fm10k/base/fm10k_pf.h            |  155 ++
>  lib/librte_pmd_fm10k/base/fm10k_tlv.c           |  914 ++++++++++
>  lib/librte_pmd_fm10k/base/fm10k_tlv.h           |  199 ++
>  lib/librte_pmd_fm10k/base/fm10k_type.h          |  937 ++++++++++
>  lib/librte_pmd_fm10k/base/fm10k_vf.c            |  641 +++++++
>  lib/librte_pmd_fm10k/base/fm10k_vf.h            |   91 +
>  lib/librte_pmd_fm10k/fm10k.h                    |  293 +++
>  lib/librte_pmd_fm10k/fm10k_ethdev.c             | 1868
> +++++++++++++++++++
>  lib/librte_pmd_fm10k/fm10k_logs.h               |   78 +
>  lib/librte_pmd_fm10k/fm10k_rxtx.c               |  459 +++++
>  lib/librte_pmd_fm10k/rte_pmd_fm10k_version.map  |    4 +
>  mk/rte.app.mk                                   |    4 +
>  26 files changed, 11472 insertions(+), 0 deletions(-)  create mode 100644
> lib/librte_pmd_fm10k/Makefile  create mode 100644
> lib/librte_pmd_fm10k/base/fm10k_api.c
>  create mode 100644 lib/librte_pmd_fm10k/base/fm10k_api.h
>  create mode 100644 lib/librte_pmd_fm10k/base/fm10k_common.c
>  create mode 100644 lib/librte_pmd_fm10k/base/fm10k_common.h
>  create mode 100644 lib/librte_pmd_fm10k/base/fm10k_mbx.c
>  create mode 100644 lib/librte_pmd_fm10k/base/fm10k_mbx.h
>  create mode 100644 lib/librte_pmd_fm10k/base/fm10k_osdep.h
>  create mode 100644 lib/librte_pmd_fm10k/base/fm10k_pf.c
>  create mode 100644 lib/librte_pmd_fm10k/base/fm10k_pf.h
>  create mode 100644 lib/librte_pmd_fm10k/base/fm10k_tlv.c
>  create mode 100644 lib/librte_pmd_fm10k/base/fm10k_tlv.h
>  create mode 100644 lib/librte_pmd_fm10k/base/fm10k_type.h
>  create mode 100644 lib/librte_pmd_fm10k/base/fm10k_vf.c
>  create mode 100644 lib/librte_pmd_fm10k/base/fm10k_vf.h
>  create mode 100644 lib/librte_pmd_fm10k/fm10k.h  create mode 100644
> lib/librte_pmd_fm10k/fm10k_ethdev.c
>  create mode 100644 lib/librte_pmd_fm10k/fm10k_logs.h  create mode
> 100644 lib/librte_pmd_fm10k/fm10k_rxtx.c  create mode 100644
> lib/librte_pmd_fm10k/rte_pmd_fm10k_version.map
> 
> --
> 1.7.7.6

Acked-by: Helin Zhang <helin.zhang@intel.com>

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v5 17/17] fm10k: Add ABI version of librte_pmd_fm10k
  2015-02-13  8:19  4% ` [dpdk-dev] [PATCH v5 00/17] lib/librte_pmd_fm10k : fm10k pmd driver Chen Jing D(Mark)
@ 2015-02-13  8:19  7%   ` Chen Jing D(Mark)
  2015-02-13  8:37  0%   ` [dpdk-dev] [PATCH v5 00/17] lib/librte_pmd_fm10k : fm10k pmd driver Zhang, Helin
  2015-02-15  5:07  0%   ` Qiu, Michael
  2 siblings, 0 replies; 200+ results
From: Chen Jing D(Mark) @ 2015-02-13  8:19 UTC (permalink / raw)
  To: dev

From: Michael Qiu <michael.qiu@intel.com>

ABI version must be specified, set to version 1 for DPDK 2.0

Signed-off-by: Michael Qiu <michael.qiu@intel.com>
Signed-off-by: Chen Jing D(Mark) <jing.d.chen@intel.com>
---
 lib/librte_pmd_fm10k/Makefile                  |    4 ++++
 lib/librte_pmd_fm10k/rte_pmd_fm10k_version.map |    4 ++++
 2 files changed, 8 insertions(+), 0 deletions(-)
 create mode 100644 lib/librte_pmd_fm10k/rte_pmd_fm10k_version.map

diff --git a/lib/librte_pmd_fm10k/Makefile b/lib/librte_pmd_fm10k/Makefile
index 8ab788c..986f4ef 100644
--- a/lib/librte_pmd_fm10k/Makefile
+++ b/lib/librte_pmd_fm10k/Makefile
@@ -39,6 +39,10 @@ LIB = librte_pmd_fm10k.a
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
+EXPORT_MAP := rte_pmd_fm10k_version.map
+
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_fm10k/rte_pmd_fm10k_version.map b/lib/librte_pmd_fm10k/rte_pmd_fm10k_version.map
new file mode 100644
index 0000000..ef35398
--- /dev/null
+++ b/lib/librte_pmd_fm10k/rte_pmd_fm10k_version.map
@@ -0,0 +1,4 @@
+DPDK_2.0 {
+
+	local: *;
+};
-- 
1.7.7.6

^ permalink raw reply	[relevance 7%]

* [dpdk-dev] [PATCH v5 00/17] lib/librte_pmd_fm10k : fm10k pmd driver
  @ 2015-02-13  8:19  4% ` Chen Jing D(Mark)
  2015-02-13  8:19  7%   ` [dpdk-dev] [PATCH v5 17/17] fm10k: Add ABI version of librte_pmd_fm10k Chen Jing D(Mark)
                     ` (2 more replies)
  0 siblings, 3 replies; 200+ results
From: Chen Jing D(Mark) @ 2015-02-13  8:19 UTC (permalink / raw)
  To: dev

From: "Chen Jing D(Mark)" <jing.d.chen@intel.com>

The patch set add poll mode driver for the host interface of Intel
Ethernet Switch FM10000 Series of silicons, which integrate NIC and
switch functionalities. The patch set include below features:

1. Basic RX/TX functions for PF/VF.
2. Interrupt handling mechanism for PF/VF.
3. per queue start/stop functions for PF/VF.
4. Mailbox handling between PF/VF and PF/Switch Manager.
5. Receive Side Scaling (RSS) for PF/VF.
6. Scatter receive function for PF/VF.
7. reta update/query for PF/VF.
8. VLAN filter set for PF.
9. Link status query for PF/VF.

Change in v5:
- Add sanity check for mbuf allocation.
- Add a new patch to claim fm10k driver review
- Change commit log.
- Add unlikely in func rx_desc_to_ol_flags to gain performance
- Add a new patch to add ABI version

Change in v4:
- Change commit log to remove improper words.

Changes in v3:
- Update base driver.
- Define several macros to pass base driver compile.

Changes in v2:
- Merge 3 patches into 1 to configure fm10k compile environment.
- Rework on log code to follow style in ixgbe.
- Rework log message, remove redundant '\n'
- Update Copyright year from "2014" to "2015"
- Change base driver directory name from SHARED to base
- Add more description in log for patch "add PF and VF interrupt"
- Merge 2 patches into 1 to register fm10k driver
- Define macro to replace numeric for lower 32-bit mask.

Chen Jing D(Mark) (1):
  maintainers: claim for fm10k review

Jeff Shaw (15):
  fm10k: add base driver
  eal: add fm10k device id
  fm10k: register fm10k pmd PF driver
  Change config files to add fm10k into compile
  fm10k: add reta update/requery functions
  fm10k: add rx_queue_setup/release function
  fm10k: add tx_queue_setup/release function
  fm10k: add RX/TX single queue start/stop function
  fm10k: add dev start/stop functions
  fm10k: add receive and tranmit function
  fm10k: add PF RSS support
  fm10k: Add scatter receive function
  fm10k: add function to set vlan
  fm10k: Add SRIOV-VF support
  fm10k: add PF and VF interrupt handling function

Michael Qiu (1):
  fm10k: Add ABI version of librte_pmd_fm10k

 MAINTAINERS                                     |    4 +
 config/common_bsdapp                            |   11 +
 config/common_linuxapp                          |   11 +
 lib/Makefile                                    |    1 +
 lib/librte_eal/common/include/rte_pci_dev_ids.h |   22 +
 lib/librte_pmd_fm10k/Makefile                   |  100 +
 lib/librte_pmd_fm10k/base/fm10k_api.c           |  341 ++++
 lib/librte_pmd_fm10k/base/fm10k_api.h           |   61 +
 lib/librte_pmd_fm10k/base/fm10k_common.c        |  572 ++++++
 lib/librte_pmd_fm10k/base/fm10k_common.h        |   52 +
 lib/librte_pmd_fm10k/base/fm10k_mbx.c           | 2185 +++++++++++++++++++++++
 lib/librte_pmd_fm10k/base/fm10k_mbx.h           |  329 ++++
 lib/librte_pmd_fm10k/base/fm10k_osdep.h         |  148 ++
 lib/librte_pmd_fm10k/base/fm10k_pf.c            | 1992 +++++++++++++++++++++
 lib/librte_pmd_fm10k/base/fm10k_pf.h            |  155 ++
 lib/librte_pmd_fm10k/base/fm10k_tlv.c           |  914 ++++++++++
 lib/librte_pmd_fm10k/base/fm10k_tlv.h           |  199 ++
 lib/librte_pmd_fm10k/base/fm10k_type.h          |  937 ++++++++++
 lib/librte_pmd_fm10k/base/fm10k_vf.c            |  641 +++++++
 lib/librte_pmd_fm10k/base/fm10k_vf.h            |   91 +
 lib/librte_pmd_fm10k/fm10k.h                    |  293 +++
 lib/librte_pmd_fm10k/fm10k_ethdev.c             | 1868 +++++++++++++++++++
 lib/librte_pmd_fm10k/fm10k_logs.h               |   78 +
 lib/librte_pmd_fm10k/fm10k_rxtx.c               |  459 +++++
 lib/librte_pmd_fm10k/rte_pmd_fm10k_version.map  |    4 +
 mk/rte.app.mk                                   |    4 +
 26 files changed, 11472 insertions(+), 0 deletions(-)
 create mode 100644 lib/librte_pmd_fm10k/Makefile
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_api.c
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_api.h
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_common.c
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_common.h
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_mbx.c
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_mbx.h
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_osdep.h
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_pf.c
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_pf.h
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_tlv.c
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_tlv.h
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_type.h
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_vf.c
 create mode 100644 lib/librte_pmd_fm10k/base/fm10k_vf.h
 create mode 100644 lib/librte_pmd_fm10k/fm10k.h
 create mode 100644 lib/librte_pmd_fm10k/fm10k_ethdev.c
 create mode 100644 lib/librte_pmd_fm10k/fm10k_logs.h
 create mode 100644 lib/librte_pmd_fm10k/fm10k_rxtx.c
 create mode 100644 lib/librte_pmd_fm10k/rte_pmd_fm10k_version.map

-- 
1.7.7.6

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH 2/3] ethdev: Add in data rxtx callback support
  @ 2015-02-12 21:12  3%     ` Neil Horman
  0 siblings, 0 replies; 200+ results
From: Neil Horman @ 2015-02-12 21:12 UTC (permalink / raw)
  To: John McNamara; +Cc: dev

On Thu, Feb 12, 2015 at 07:57:56PM +0000, John McNamara wrote:
> From: Richardson, Bruce <bruce.richardson@intel.com>
> 
> Add in support for inline processing of packets inside the RX or
> TX call. For an RX callback, what happens is that we get a set of
> packets from the NIC and then pass them to a callback function, if
> configured, to allow additional processing to be done on them, e.g.
> filling in more mbuf fields, before passing back to the application.
> On TX, the packets are similarly post-processed before being handed
> to the NIC for transmission.
> 
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> ---
>  lib/librte_ether/rte_ethdev.c |  165 +++++++++++++++++++++++++++++++++++++-
>  lib/librte_ether/rte_ethdev.h |  175 ++++++++++++++++++++++++++++++++++++++++-
>  2 files changed, 334 insertions(+), 6 deletions(-)
> 
> diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
> index e4b3315..944737e 100644
> --- a/lib/librte_ether/rte_ethdev.c
> +++ b/lib/librte_ether/rte_ethdev.c
> @@ -337,6 +337,15 @@ rte_eth_dev_rx_queue_config(struct rte_eth_dev *dev, uint16_t nb_queues)
>  			dev->data->nb_rx_queues = 0;
>  			return -(ENOMEM);
>  		}
> +		dev->rx_cbs = rte_zmalloc("ethdev->rx_cbs",
> +				sizeof(*dev->rx_cbs) * nb_queues,
> +				RTE_CACHE_LINE_SIZE);
> +		if (dev->rx_cbs == NULL) {
> +			rte_free(dev->data->rx_queues);
> +			dev->data->rx_queues = NULL;
> +			dev->data->nb_rx_queues = 0;
> +			return -(ENOMEM);
> +		}
>  	} else { /* re-configure */
>  		FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_release, -ENOTSUP);
>  
> @@ -348,10 +357,18 @@ rte_eth_dev_rx_queue_config(struct rte_eth_dev *dev, uint16_t nb_queues)
>  				RTE_CACHE_LINE_SIZE);
>  		if (rxq == NULL)
>  			return -(ENOMEM);
> +		dev->rx_cbs = rte_realloc(dev->rx_cbs, sizeof(*dev->rx_cbs) *
> +				nb_queues, RTE_CACHE_LINE_SIZE);
> +		if (dev->rx_cbs == NULL)
> +			return -(ENOMEM);
>  
> -		if (nb_queues > old_nb_queues)
> +		if (nb_queues > old_nb_queues) {
> +			uint16_t new_qs = nb_queues - old_nb_queues;
>  			memset(rxq + old_nb_queues, 0,
> -				sizeof(rxq[0]) * (nb_queues - old_nb_queues));
> +				sizeof(rxq[0]) * new_qs);
> +			memset(dev->rx_cbs + old_nb_queues, 0,
> +				sizeof(dev->rx_cbs[0]) * new_qs);
> +		}
>  
>  		dev->data->rx_queues = rxq;
>  
> @@ -479,6 +496,15 @@ rte_eth_dev_tx_queue_config(struct rte_eth_dev *dev, uint16_t nb_queues)
>  			dev->data->nb_tx_queues = 0;
>  			return -(ENOMEM);
>  		}
> +		dev->tx_cbs = rte_zmalloc("ethdev->tx_cbs",
> +				sizeof(*dev->tx_cbs) * nb_queues,
> +				RTE_CACHE_LINE_SIZE);
> +		if (dev->tx_cbs == NULL) {
> +			rte_free(dev->data->tx_queues);
> +			dev->data->tx_queues = NULL;
> +			dev->data->nb_tx_queues = 0;
> +			return -(ENOMEM);
> +		}
>  	} else { /* re-configure */
>  		FUNC_PTR_OR_ERR_RET(*dev->dev_ops->tx_queue_release, -ENOTSUP);
>  
> @@ -490,10 +516,19 @@ rte_eth_dev_tx_queue_config(struct rte_eth_dev *dev, uint16_t nb_queues)
>  				RTE_CACHE_LINE_SIZE);
>  		if (txq == NULL)
>  			return -(ENOMEM);
> +		dev->tx_cbs = rte_realloc(dev->tx_cbs, sizeof(*dev->tx_cbs) *
> +				nb_queues, RTE_CACHE_LINE_SIZE);
> +		if (dev->tx_cbs == NULL)
> +			return -(ENOMEM);
> +
>  
> -		if (nb_queues > old_nb_queues)
> +		if (nb_queues > old_nb_queues) {
> +			uint16_t new_qs = nb_queues - old_nb_queues;
>  			memset(txq + old_nb_queues, 0,
> -				sizeof(txq[0]) * (nb_queues - old_nb_queues));
> +				sizeof(txq[0]) * new_qs);
> +			memset(dev->tx_cbs + old_nb_queues, 0,
> +				sizeof(dev->tx_cbs[0]) * new_qs);
> +		}
>  
>  		dev->data->tx_queues = txq;
>  
> @@ -3253,3 +3288,125 @@ rte_eth_dev_filter_ctrl(uint8_t port_id, enum rte_filter_type filter_type,
>  	FUNC_PTR_OR_ERR_RET(*dev->dev_ops->filter_ctrl, -ENOTSUP);
>  	return (*dev->dev_ops->filter_ctrl)(dev, filter_type, filter_op, arg);
>  }
> +
> +void *
> +rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id,
> +		rte_rxtx_callback_fn fn, void *user_param)
> +{
These, and its companion manipulator functions need to be added to the ABI
versioning scripts.  As it currently stands this won't be exposed in a shared
build, and so the examples won't build.

Neil

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH 0/8] Improve build process
  @ 2015-02-12 15:52  3%                         ` Neil Horman
  2015-02-13 10:14  0%                           ` Panu Matilainen
  0 siblings, 1 reply; 200+ results
From: Neil Horman @ 2015-02-12 15:52 UTC (permalink / raw)
  To: Panu Matilainen; +Cc: dev

On Thu, Feb 12, 2015 at 04:07:50PM +0200, Panu Matilainen wrote:
> On 02/12/2015 02:23 PM, Neil Horman wrote:
> >On Thu, Feb 12, 2015 at 10:03:51AM +0000, Gonzalez Monroy, Sergio wrote:
> >>On 12/02/2015 09:22, Panu Matilainen wrote:
> >>>On 02/11/2015 01:11 PM, Gonzalez Monroy, Sergio wrote:
> >>>>>From: Neil Horman [mailto:nhorman@tuxdriver.com]
> >>>>>Sent: Friday, January 30, 2015 6:13 PM
> >>>>>To: Gonzalez Monroy, Sergio
> >>>>>Cc: Thomas Monjalon; dev@dpdk.org
> >>>>>Subject: Re: [dpdk-dev] [PATCH 0/8] Improve build process
> >>>>>
> >>>>>On Fri, Jan 30, 2015 at 05:38:49PM +0000, Gonzalez Monroy, Sergio
> >>>>>wrote:
> >>>>
> >>>>[snip]
> >>>>
> >>>>>>
> >>>>>>So would it be reasonable to add DT_NEEDED entries to all DPDK
> >>>>>>libraries
> >>>>>but EAL?
> >>>>>>If I understood what you were saying right, we could enforce the
> >>>>>>'dependency' in the linker script with something like this:
> >>>>>>$ cat  librte_eal.so
> >>>>>>INPUT( librte_eal.so.1 -lrte_mempool -lrte_malloc) We could have such
> >>>>>>linker script for librte_eal.so instead of the soft link once
> >>>>>>versioning is in place.
> >>>>>>
> >>>>>Correct.
> >>>>>
> >>>>>>Things that would be missing versus the proposed patch:
> >>>>>>  - As I have mention in previous post, ldd info for EAL library
> >>>>>>would not
> >>>>>reflect
> >>>>>>    its dependency to other DPDK libs.
> >>>>>librte_eal.so would no show those dependencies, as far as I know
> >>>>>(though I
> >>>>>haven't explicitly checked).  The subordunate libraries included in
> >>>>>the input
> >>>>>line, may or may not show dependencies among themselves, depending on
> >>>>>your build setup (and the use of --no-as-needed and -l when linking the
> >>>>>individual .so libraries.
> >>>>>
> >>>>>>  - I was enforcing resolving all references when building the
> >>>>>>libraries (-z
> >>>>>defs), so
> >>>>>>    we either remove it altogether or skip eal.
> >>>>>I think thats correct, yes.
> >>>>>
> >>>>>>  - All apps would show DT_NEEDED entries for a set of DPDK
> >>>>>>libraries that
> >>>>>>    in most cases are required (eal, mempool, malloc, mbuf, ring VS
> >>>>>>dpdk_core)
> >>>>>>
> >>>>>I think apps linked to libdpdk_core would have DT_NEEDED entries for
> >>>>>libdpdk_core, not the subordonate libraries (though check me on that
> >>>>>to be
> >>>>>sure).
> >>>>>
> >>>>Just checked on this and they do link against the subordinate libraries,
> >>>>although
> >>>>It does not really matter as we are dropping the 'core' library approach
> >>>>anyway.
> >>>>
> >>>>>>I think that the linker script approach is reasonable if we prefer to
> >>>>>>go that way instead of creating a core library.
> >>>>>>
> >>>>>I think it would make sense from a build environment point of view, in
> >>>>>that it
> >>>>>allows library specific flags to be incorporated properly.  I think
> >>>>>the only
> >>>>>downside is that the individual libraries still need to be carried
> >>>>>around
> >>>>>(though they can be ignored from an application build/run standpoint).
> >>>>>You're question should probably be asked of people using COMBINED_LIBS
> >>>>>currently to make sure that meets their needs, though I think it will.
> >>>>>
> >>>>>Neil
> >>>>>
> >>>>So I just realized that I was not having into account a possible
> >>>>scenario, where
> >>>>we have an app built with static dpdk libs then loading a dso with -d
> >>>>option.
> >>>>
> >>>>In such case, because the pmd would have DT_NEEDED entries, dlopen will
> >>>>fail.
> >>>>So to enable such scenario we would need to build PMDs without DT_NEEDED
> >>>>entries.
> >>>
> >>>Hmm, for that to be a problem you'd need to have the PMD built against
> >>>shared dpdk libs and while the application is built against static dpdk
> >>>libs. I dont think that's a supportable scenario in any case.
> >>>
> >>>Or is there some other scenario that I'm not seeing?
> >>>
> >>>    - Panu -
> >>>
> >>I agree with you. I suppose it comes down to, do we want to support such
> >>scenario?
> >>
> >> From what I can see, it seems that we do currently support such scenario by
> >>building dpdk apps against all static dpdk libs using --whole-archive (all
> >>libs and not only PMDs).
> >>http://dpdk.org/browse/dpdk/commit/?id=20afd76a504155e947c770783ef5023e87136ad8
> >>
> >>Am I misunderstanding this?
> >>
> >Shoot, you're right, I missed the static build aspect to this.  Yes, if we do the following:
> >
> >1) Build the DPDK as a static library
> >2) Link an application against (1)
> >3) Use the dlopen mechanism to load a PMD built as a DSO
> >
> >Then the DT_NEEDED entries in the DSO will go unsatisfied, because the shared
> >objects on which it (the PMD) depends will not exist in the file system.
> 
> I think its even more twisty:
> 
> 1) Build the DPDK as a static library
> 2) Link an application against (1)
> 3) Do another build of DPDK as a shared library
> 4) In app 2), use the dlopen mechanism to load a PMD built as a part of or
> against 3)
> 
> Somehow I doubt this would work very well.
> 
Ideally it should, presuming the ABI is preserved between (1) and (3), though I
agree, up until recently, that was an assumption that was unreliable.

> >
> >I think the problem is a little bit orthogonal to the libdpdk_core problem you
> >were initially addressing.  That is to say, this problem of dlopen-ed PMD's
> >exists regardless of weather you build the DPDK as part of a static or dynamic
> >library.  The problems just happen to intersect in their manipulation of the
> >DT_NEEDED entries.
> >
> >Ok, so, given the above, I would say your approach is likely correct, just
> >prevent DT_NEEDED entries from getting added to PMD's.  Doing so will sidestep
> >loading issue for libraries that may not exist in the filesystem, but thats ok,
> >because by all rights, the symbols codified in those needed libraries should
> >already be present in the running application (either made available by the
> >application having statically linked them, or having the linker load them from
> >the proper libraries at run time).
> 
> My 5c is that I'd much rather see the common case (all static or all shared)
> be simple and reliable, which in case of DSOs includes no lying (whether by
> omission or otherwise) about DT_NEEDED, ever. That way the issue is dealt
> once where it belongs. If somebody wants to go down the rabbit hole of mixed
> shared + static linkage, let them dig the hole by themselves :)
> 
This is a fair point.  Can DT_NEEDED sections be stripped via tools like objcopy
after the build is complete?  If so, end users can hack this corner case to work
as needed.

Neil

> 	- Panu -
> 
> >Regards
> >Neil
> >
> >>Regards,
> >>Sergio
> >>
> 
> 

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH] x32 ABI support, first iteration
  2015-02-09 10:22  4% ` [dpdk-dev] [PATCH] x32 ABI support, first iteration Ananyev, Konstantin
@ 2015-02-12 13:18  4%   ` De Lara Guarch, Pablo
  2015-02-18 19:32  4%     ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: De Lara Guarch, Pablo @ 2015-02-12 13:18 UTC (permalink / raw)
  To: Ananyev, Konstantin, dev



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Ananyev,
> Konstantin
> Sent: Monday, February 09, 2015 10:23 AM
> To: dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH] x32 ABI support, first iteration
> 
> > Subject: [PATCH] x32 ABI support, first iteration
> >
> > Signed-off-by: Konstantin Ananyev <konstantin.ananyev at intel.com>
> > Signed-off-by: Daniel Mrzyglod <danielx.t.mrzyglod at intel.com>
> > ---
> >  config/defconfig_x86_x32-native-linuxapp-gcc | 46
> ++++++++++++++++++++
> >  mk/arch/x86_x32/rte.vars.mk                  | 63
> ++++++++++++++++++++++++++++
> >  2 files changed, 109 insertions(+)
> >  create mode 100644 config/defconfig_x86_x32-native-linuxapp-gcc
> >  create mode 100644 mk/arch/x86_x32/rte.vars.mk
> >
> > --
> 
> Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
> 

Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>

Just add that documentation should be updated for this.
> > 1.9.1

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH 0/3] update maintainers areas
  2015-02-04 22:23  4% [dpdk-dev] [PATCH 0/3] update maintainers areas Thomas Monjalon
  2015-02-04 22:23 14% ` [dpdk-dev] [PATCH 2/3] maintainers: add ABI versioning Thomas Monjalon
@ 2015-02-09 14:21  0% ` Thomas Monjalon
  1 sibling, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-02-09 14:21 UTC (permalink / raw)
  To: dev

> More files should be referenced in MAINTAINERS files:
>   - some (forgotten) docs can be co-maintained in doc and lib areas
>   - new ABI files
> The script can now check for unknown files.
> 
> Thomas Monjalon (3):
>   maintainers: dispatch more doc
>   maintainers: add ABI versioning
>   scripts: check wrong patterns in maintainers file

Applied

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 2/3] maintainers: add ABI versioning
  2015-02-05  1:39  4%   ` Neil Horman
@ 2015-02-09 14:20  7%     ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-02-09 14:20 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

2015-02-04 20:39, Neil Horman:
> On Wed, Feb 04, 2015 at 11:23:23PM +0100, Thomas Monjalon wrote:
> > Reference the new framework and policy for ABI versioning,
> > in the MAINTAINERS file.
> > 
> > Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
> > ---
> >  MAINTAINERS | 3 +++
> >  1 file changed, 3 insertions(+)
> > 
> > diff --git a/MAINTAINERS b/MAINTAINERS
> > index f2b697e..7c0047b 100644
> > --- a/MAINTAINERS
> > +++ b/MAINTAINERS
> > @@ -54,6 +54,9 @@ F: doc/guides/prog_guide/build_app.rst
> >  F: doc/guides/prog_guide/dev_kit_*
> >  F: doc/guides/prog_guide/ext_app_lib_make_help.rst
> >  
> > +ABI versioning
> > +F: lib/librte_compat/
> > +F: doc/guides/rel_notes/abi.rst
> >  
> Feel free to add my name to this area of you feel its warranted.
> Acked-by: Neil Horman <nhorman@tuxdriver.com>

OK Neil, your name is added as ABI versioning maintainer.
Thanks
-- 
Thomas

^ permalink raw reply	[relevance 7%]

* Re: [dpdk-dev] [PATCH] x32 ABI support, first iteration
       [not found]     <2601191342CEEE43887BDE71AB977258213E4175@irsmsx105.ger.corp.intel.com>
@ 2015-02-09 10:22  4% ` Ananyev, Konstantin
  2015-02-12 13:18  4%   ` De Lara Guarch, Pablo
  0 siblings, 1 reply; 200+ results
From: Ananyev, Konstantin @ 2015-02-09 10:22 UTC (permalink / raw)
  To: dev

> Subject: [PATCH] x32 ABI support, first iteration
> 
> Signed-off-by: Konstantin Ananyev <konstantin.ananyev at intel.com>
> Signed-off-by: Daniel Mrzyglod <danielx.t.mrzyglod at intel.com>
> ---
>  config/defconfig_x86_x32-native-linuxapp-gcc | 46 ++++++++++++++++++++
>  mk/arch/x86_x32/rte.vars.mk                  | 63 ++++++++++++++++++++++++++++
>  2 files changed, 109 insertions(+)
>  create mode 100644 config/defconfig_x86_x32-native-linuxapp-gcc
>  create mode 100644 mk/arch/x86_x32/rte.vars.mk
> 
> --

Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>

> 1.9.1

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] x32 ABI support, first iteration
       [not found]     ` <86228AFD5BCD8E4EBFD2B90117B5E81E10D789EA@SHSMSX103.ccr.corp.intel.com>
@ 2015-02-09  5:29  4%   ` Tang, HaifengX
  0 siblings, 0 replies; 200+ results
From: Tang, HaifengX @ 2015-02-09  5:29 UTC (permalink / raw)
  To: Mrzyglod, DanielX T, Ananyev, Konstantin, dev

Tested-by: Haifeng Tang <haifengx.tang@intel.com>
 
 - Tested Commit: bfca21f8a0defa7173895ba00e30f685b3209b81
 - OS&Kernel: Ubuntu 14.04 LTS 3.13.0-24-generic
 - GCC: gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
 - CPUIntel(R) Xeon(R) CPU E5-2680 0 @ 2.70GHz
 - NIC: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection [8086:10fb]
 - Default x86_x32-native-linuxapp-gcc configuration
 - Regression test result Total 74 cases, 74 passed, 0 failed 
pmd	checksum_checking	PASSED
	packet_checking	PASSED
		
ipfrag	ipfrag_fragment	PASSED
	ipfrag_nofragment	PASSED
	ipfrag_normalfwd	PASSED
		
cmdline cmdline_sample_commands	PASSED
		
hello_world	hello_world_all_cores	PASSED
	                hello_world_single_core PASSED
		
timer	timer_callbacks_verify	PASSED
		
fdir	fdir_filter_masks  PASSED
	fdir_flexbytes_filtering	PASSED
	fdir_matching	PASSED
	fdir_perfect_matching	PASSED
	fdir_signatures	PASSED
	fdir_space	PASSED
	fdir_vlanfiltering	PASSED
		
dynamic_config   dynamic_config_default_mode  PASSED
	                   dynamic_config_disable_promiscuous  PASSED
	                   dynamic_config_enable_promiscuous   PASSED
		
jumboframes	jumboframes_bigger_jumbo	PASSED
	                jumboframes_jumbo_jumbo	PASSED
	                jumboframes_jumbo_nojumbo  PASSED
	                jumboframes_normal_jumbo	PASSED
	               jumboframes_normal_nojumbo PASSED
		
scatter	      scatter_mbuf_1024	  PASSED
		
ieee1588	ieee1588_disable   PASSED
	                ieee1588_enable   PASSED		
l2fwd	port_testing	PASSED
		
checksum_offload	checksum_offload_372664	PASSED
	                                checksum_offload_372762	PASSED
	                                checksum_offload_disable	PASSED
	                                checksum_offload_enable	PASSED
		
link_flowctrl	flowctrl_off_pause_fwd_off	PASSED
	                flowctrl_off_pause_fwd_on	PASSED
	                flowctrl_on_pause_fwd_off	PASSED
	                flowctrl_on_pause_fwd_on	PASSED
		
whitelist	whitelist_add_remove_mac_address	PASSED
	                whitelist_invalid_addresses	PASSED
		
blacklist	bl_allbutoneportblacklisted	PASSED
	                bl_noblacklisted	PASSED
	                bl_oneportblacklisted	PASSED
		
shutdown_api	change_linkspeed	PASSED
	                change_numberrxdtxd	 PASSED
	                change_numberrxdtxdaftercycle  PASSED
	                change_thresholds	PASSED
	                enable_disablejumbo	PASSED
	                enable_disablerss	PASSED
	                link_stats	PASSED
	                reconfigure_ports	PASSED
	                reset_queues	PASSED
	                set_promiscuousmode	PASSED
	                stop_restart	PASSED
	                stress_test	PASSED
		
dual_vlan	vlan_filter_config	PASSED
	                vlan_filter_table	PASSED
	                vlan_insert_config	PASSED
	                vlan_random_test	PASSED
	                vlan_strip_config	PASSED
	                vlan_stripq_config	PASSED
	                vlan_synthetic_test	PASSED
	                vlan_tpid_config	PASSED
		
l2fwd_fork	floating	 PASSED
	                ports	 PASSED
	                respawn   PASSED
	                stress_respawn  PASSED
		
ipv4_reassembly	only_maxflows_packets_are_forwarded	PASSED
	                                packets_are_forwarded_after_ttl_timeout	PASSED
	                                send_1K_frames_split_in_4_and_1K_maxflows  PASSED
	                                send_2K_frames_split_in_4_and_1K_maxflows  PASSED
	                                send_4K_frames_split_in_7_and_4K_maxflows  PASSED
	                                send_delayed_fragment_packet_is_forwarded  PASSED
	                                send_jumbo_frames	PASSED
	                                send_jumbo_frames_with_wrong_arguments	 PASSED
	                                send_more_fragments_than_supported  PASSED

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH 3/7] hv: add basic vmbus support
  2015-02-05  1:13  1% ` [dpdk-dev] [PATCH 3/7] hv: add basic vmbus support Stephen Hemminger
@ 2015-02-05  1:50  0%   ` Neil Horman
  0 siblings, 0 replies; 200+ results
From: Neil Horman @ 2015-02-05  1:50 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev, KY Srinivasan, Stephen Hemminger

On Wed, Feb 04, 2015 at 05:13:25PM -0800, Stephen Hemminger wrote:
> From: Stephen Hemminger <shemming@brocade.com>
> 
> The hyper-v device driver forces the base EAL code to change
> to support multiple bus types. This is done changing the pci_device
> in ether driver to a generic union.
> 
> As much as possible this is done in a backwards source compatiable
> way. It will break ABI for device drivers.
> 
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
>  lib/librte_eal/common/Makefile             |   2 +-
>  lib/librte_eal/common/eal_common_options.c |   5 +
>  lib/librte_eal/common/eal_internal_cfg.h   |   1 +
>  lib/librte_eal/common/eal_options.h        |   2 +
>  lib/librte_eal/common/eal_private.h        |  10 +
>  lib/librte_eal/common/include/rte_pci.h    |   2 +
>  lib/librte_eal/common/include/rte_vmbus.h  | 153 +++++++
>  lib/librte_eal/linuxapp/eal/Makefile       |   3 +
>  lib/librte_eal/linuxapp/eal/eal.c          |   5 +
>  lib/librte_eal/linuxapp/eal/eal_vmbus.c    | 658 +++++++++++++++++++++++++++++
>  lib/librte_ether/rte_ethdev.c              |  84 +++-
>  lib/librte_ether/rte_ethdev.h              |  15 +-
>  12 files changed, 932 insertions(+), 8 deletions(-)
>  create mode 100644 lib/librte_eal/common/include/rte_vmbus.h
>  create mode 100644 lib/librte_eal/linuxapp/eal/eal_vmbus.c
> 
It seems like the vmbus functions need to be versioned here.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 2/3] maintainers: add ABI versioning
  2015-02-04 22:23 14% ` [dpdk-dev] [PATCH 2/3] maintainers: add ABI versioning Thomas Monjalon
@ 2015-02-05  1:39  4%   ` Neil Horman
  2015-02-09 14:20  7%     ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Neil Horman @ 2015-02-05  1:39 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Wed, Feb 04, 2015 at 11:23:23PM +0100, Thomas Monjalon wrote:
> Reference the new framework and policy for ABI versioning,
> in the MAINTAINERS file.
> 
> Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
> ---
>  MAINTAINERS | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/MAINTAINERS b/MAINTAINERS
> index f2b697e..7c0047b 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -54,6 +54,9 @@ F: doc/guides/prog_guide/build_app.rst
>  F: doc/guides/prog_guide/dev_kit_*
>  F: doc/guides/prog_guide/ext_app_lib_make_help.rst
>  
> +ABI versioning
> +F: lib/librte_compat/
> +F: doc/guides/rel_notes/abi.rst
>  
Feel free to add my name to this area of you feel its warranted.
Acked-by: Neil Horman <nhorman@tuxdriver.com>

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH 3/7] hv: add basic vmbus support
  @ 2015-02-05  1:13  1% ` Stephen Hemminger
  2015-02-05  1:50  0%   ` Neil Horman
  0 siblings, 1 reply; 200+ results
From: Stephen Hemminger @ 2015-02-05  1:13 UTC (permalink / raw)
  To: dev; +Cc: KY Srinivasan, Stephen Hemminger

From: Stephen Hemminger <shemming@brocade.com>

The hyper-v device driver forces the base EAL code to change
to support multiple bus types. This is done changing the pci_device
in ether driver to a generic union.

As much as possible this is done in a backwards source compatiable
way. It will break ABI for device drivers.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 lib/librte_eal/common/Makefile             |   2 +-
 lib/librte_eal/common/eal_common_options.c |   5 +
 lib/librte_eal/common/eal_internal_cfg.h   |   1 +
 lib/librte_eal/common/eal_options.h        |   2 +
 lib/librte_eal/common/eal_private.h        |  10 +
 lib/librte_eal/common/include/rte_pci.h    |   2 +
 lib/librte_eal/common/include/rte_vmbus.h  | 153 +++++++
 lib/librte_eal/linuxapp/eal/Makefile       |   3 +
 lib/librte_eal/linuxapp/eal/eal.c          |   5 +
 lib/librte_eal/linuxapp/eal/eal_vmbus.c    | 658 +++++++++++++++++++++++++++++
 lib/librte_ether/rte_ethdev.c              |  84 +++-
 lib/librte_ether/rte_ethdev.h              |  15 +-
 12 files changed, 932 insertions(+), 8 deletions(-)
 create mode 100644 lib/librte_eal/common/include/rte_vmbus.h
 create mode 100644 lib/librte_eal/linuxapp/eal/eal_vmbus.c

diff --git a/lib/librte_eal/common/Makefile b/lib/librte_eal/common/Makefile
index 52c1a5f..f4326e9 100644
--- a/lib/librte_eal/common/Makefile
+++ b/lib/librte_eal/common/Makefile
@@ -33,7 +33,7 @@ include $(RTE_SDK)/mk/rte.vars.mk
 
 INC := rte_branch_prediction.h rte_common.h
 INC += rte_debug.h rte_eal.h rte_errno.h rte_launch.h rte_lcore.h
-INC += rte_log.h rte_memory.h rte_memzone.h rte_pci.h
+INC += rte_log.h rte_memory.h rte_memzone.h rte_pci.h rte_vmbus.h
 INC += rte_pci_dev_ids.h rte_per_lcore.h rte_random.h
 INC += rte_rwlock.h rte_tailq.h rte_interrupts.h rte_alarm.h
 INC += rte_string_fns.h rte_version.h rte_tailq_elem.h
diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c
index 67e02dc..b254b83 100644
--- a/lib/librte_eal/common/eal_common_options.c
+++ b/lib/librte_eal/common/eal_common_options.c
@@ -73,6 +73,7 @@ eal_long_options[] = {
 	{OPT_NO_HPET, 0, 0, OPT_NO_HPET_NUM},
 	{OPT_VMWARE_TSC_MAP, 0, 0, OPT_VMWARE_TSC_MAP_NUM},
 	{OPT_NO_PCI, 0, 0, OPT_NO_PCI_NUM},
+	{OPT_NO_VMBUS, 0, 0, OPT_NO_VMBUS_NUM},
 	{OPT_NO_HUGE, 0, 0, OPT_NO_HUGE_NUM},
 	{OPT_FILE_PREFIX, 1, 0, OPT_FILE_PREFIX_NUM},
 	{OPT_SOCKET_MEM, 1, 0, OPT_SOCKET_MEM_NUM},
@@ -441,6 +442,10 @@ eal_parse_common_option(int opt, const char *optarg,
 		conf->no_pci = 1;
 		break;
 
+	case OPT_NO_VMBUS_NUM:
+		conf->no_vmbus = 1;
+		break;
+
 	case OPT_NO_HPET_NUM:
 		conf->no_hpet = 1;
 		break;
diff --git a/lib/librte_eal/common/eal_internal_cfg.h b/lib/librte_eal/common/eal_internal_cfg.h
index e2ecb0d..0e7de34 100644
--- a/lib/librte_eal/common/eal_internal_cfg.h
+++ b/lib/librte_eal/common/eal_internal_cfg.h
@@ -66,6 +66,7 @@ struct internal_config {
 	volatile unsigned no_hugetlbfs;   /**< true to disable hugetlbfs */
 	volatile unsigned xen_dom0_support; /**< support app running on Xen Dom0*/
 	volatile unsigned no_pci;         /**< true to disable PCI */
+	volatile unsigned no_vmbus;	  /**< true to disable VMBUS */
 	volatile unsigned no_hpet;        /**< true to disable HPET */
 	volatile unsigned vmware_tsc_map; /**< true to use VMware TSC mapping
 										* instead of native TSC */
diff --git a/lib/librte_eal/common/eal_options.h b/lib/librte_eal/common/eal_options.h
index e476f8d..b6075b9 100644
--- a/lib/librte_eal/common/eal_options.h
+++ b/lib/librte_eal/common/eal_options.h
@@ -57,6 +57,8 @@ enum {
 	OPT_VMWARE_TSC_MAP_NUM,
 #define OPT_NO_PCI      "no-pci"
 	OPT_NO_PCI_NUM,
+#define OPT_NO_VMBUS    "no-vmbus"
+	OPT_NO_VMBUS_NUM,
 #define OPT_NO_HUGE     "no-huge"
 	OPT_NO_HUGE_NUM,
 #define OPT_FILE_PREFIX "file-prefix"
diff --git a/lib/librte_eal/common/eal_private.h b/lib/librte_eal/common/eal_private.h
index 159cd66..af559a4 100644
--- a/lib/librte_eal/common/eal_private.h
+++ b/lib/librte_eal/common/eal_private.h
@@ -165,6 +165,16 @@ int rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr,
 		struct rte_pci_device *dev);
 
 /**
+ * VMBUS related functions and structures
+ */
+int rte_eal_vmbus_init(void);
+
+struct rte_vmbus_driver;
+struct rte_vmbus_device;
+
+int rte_eal_vmbus_probe_one_driver(struct rte_vmbus_driver *dr,
+		struct rte_vmbus_device *dev);
+/**
  * Init tail queues for non-EAL library structures. This is to allow
  * the rings, mempools, etc. lists to be shared among multiple processes
  *
diff --git a/lib/librte_eal/common/include/rte_pci.h b/lib/librte_eal/common/include/rte_pci.h
index 66ed793..0ede642 100644
--- a/lib/librte_eal/common/include/rte_pci.h
+++ b/lib/librte_eal/common/include/rte_pci.h
@@ -199,6 +199,8 @@ struct rte_pci_driver {
 #define RTE_PCI_DRV_FORCE_UNBIND 0x0004
 /** Device driver supports link state interrupt */
 #define RTE_PCI_DRV_INTR_LSC	0x0008
+/** Device driver needs VMBUS */
+#define RTE_PCI_DRV_NEED_HV_UIO	0x0010
 
 /**< Internal use only - Macro used by pci addr parsing functions **/
 #define GET_PCIADDR_FIELD(in, fd, lim, dlm)                   \
diff --git a/lib/librte_eal/common/include/rte_vmbus.h b/lib/librte_eal/common/include/rte_vmbus.h
new file mode 100644
index 0000000..2742cb1
--- /dev/null
+++ b/lib/librte_eal/common/include/rte_vmbus.h
@@ -0,0 +1,153 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2010-2013 Intel Corporation. All rights reserved.
+ *   Copyright(c) 2013-2015 Brocade Communications Systems, Inc.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef _RTE_VMBUS_H_
+#define _RTE_VMBUS_H_
+
+/**
+ * @file
+ *
+ * RTE VMBUS Interface
+ */
+
+#include <sys/queue.h>
+
+/** Pathname of VMBUS devices directory. */
+#define SYSFS_VMBUS_DEVICES "/sys/bus/vmbus/devices"
+
+/** Formatting string for VMBUS device identifier: Ex: vmbus_0_9 */
+#define VMBUS_PRI_FMT "vmbus_0_%u"
+
+#define VMBUS_ID_ANY 0xFFFF
+
+#define VMBUS_NETWORK_DEVICE "{f8615163-df3e-46c5-913f-f2d2f965ed0e}"
+
+/** Maximum number of VMBUS resources. */
+#define VMBUS_MAX_RESOURCE 7
+
+/**
+ * A structure describing an ID for a VMBUS driver. Each driver provides a
+ * table of these IDs for each device that it supports.
+ */
+struct rte_vmbus_id {
+	uint16_t device_id;           /**< VMBUS Device ID */
+	uint16_t sysfs_num;           /**< vmbus_0_X */
+};
+
+/**
+ * A structure describing a VMBUS memory resource.
+ */
+struct rte_vmbus_resource {
+	uint64_t phys_addr;   /**< Physical address, 0 if no resource. */
+	uint64_t len;         /**< Length of the resource. */
+	void *addr;           /**< Virtual address, NULL when not mapped. */
+};
+
+/**
+ * A structure describing a VMBUS device.
+ */
+struct rte_vmbus_device {
+	TAILQ_ENTRY(rte_vmbus_device) next;     /**< Next probed VMBUS device. */
+	struct rte_vmbus_id id;                 /**< VMBUS ID. */
+	const struct rte_vmbus_driver *driver;  /**< Associated driver */
+	int numa_node;                          /**< NUMA node connection */
+	unsigned int blacklisted:1;             /**< Device is blacklisted */
+	struct rte_vmbus_resource mem_resource[VMBUS_MAX_RESOURCE];   /**< VMBUS Memory Resource */
+	uint32_t vmbus_monitor_id;              /**< VMBus monitor ID for device */
+	int uio_fd;                             /** UIO device file descriptor */
+};
+
+/** Macro used to help building up tables of device IDs */
+#define RTE_VMBUS_DEVICE(dev)          \
+	.device_id = (dev)
+
+struct rte_vmbus_driver;
+
+/**
+ * Initialisation function for the driver called during VMBUS probing.
+ */
+typedef int (vmbus_devinit_t)(struct rte_vmbus_driver *, struct rte_vmbus_device *);
+
+/**
+ * A structure describing a VMBUS driver.
+ */
+struct rte_vmbus_driver {
+	TAILQ_ENTRY(rte_vmbus_driver) next;     /**< Next in list. */
+	const char *name;                       /**< Driver name. */
+	vmbus_devinit_t *devinit;               /**< Device init. function. */
+	struct rte_vmbus_id *id_table;          /**< ID table, NULL terminated. */
+	uint32_t drv_flags;                     /**< Flags contolling handling of device. */
+	const char *module_name;		/**< Associated kernel module */
+};
+
+/**
+ * Probe the VMBUS device for registered drivers.
+ *
+ * Scan the content of the vmbus, and call the probe() function for
+ * all registered drivers that have a matching entry in its id_table
+ * for discovered devices.
+ *
+ * @return
+ *   - 0 on success.
+ *   - Negative on error.
+ */
+int rte_eal_vmbus_probe(void);
+
+/**
+ * Dump the content of the vmbus.
+ */
+void rte_eal_vmbus_dump(void);
+
+/**
+ * Register a VMBUS driver.
+ *
+ * @param driver
+ *   A pointer to a rte_vmbus_driver structure describing the driver
+ *   to be registered.
+ */
+void rte_eal_vmbus_register(struct rte_vmbus_driver *driver);
+
+/**
+ * Unregister a VMBUS driver.
+ *
+ * @param driver
+ *   A pointer to a rte_vmbus_driver structure describing the driver
+ *   to be unregistered.
+ */
+void rte_eal_vmbus_unregister(struct rte_vmbus_driver *driver);
+
+int vmbus_uio_map_resource(struct rte_vmbus_device *dev);
+
+#endif /* _RTE_VMBUS_H_ */
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index e117cec..e4727fb 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -74,6 +74,9 @@ SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_alarm.c
 ifeq ($(CONFIG_RTE_LIBRTE_IVSHMEM),y)
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_ivshmem.c
 endif
+ifeq ($(CONFIG_RTE_LIBRTE_HV_PMD),y)
+SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_vmbus.c
+endif
 
 # from common dir
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_memzone.c
diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c
index f99e158..b750fd8 100644
--- a/lib/librte_eal/linuxapp/eal/eal.c
+++ b/lib/librte_eal/linuxapp/eal/eal.c
@@ -755,6 +755,11 @@ rte_eal_init(int argc, char **argv)
 	if (rte_eal_pci_init() < 0)
 		rte_panic("Cannot init PCI\n");
 
+#ifdef RTE_LIBRTE_HV_PMD
+	if (rte_eal_vmbus_init() < 0)
+		RTE_LOG(ERR, EAL, "Cannot init VMBUS\n");
+#endif
+
 #ifdef RTE_LIBRTE_IVSHMEM
 	if (rte_eal_ivshmem_init() < 0)
 		rte_panic("Cannot init IVSHMEM\n");
diff --git a/lib/librte_eal/linuxapp/eal/eal_vmbus.c b/lib/librte_eal/linuxapp/eal/eal_vmbus.c
new file mode 100644
index 0000000..8f87679
--- /dev/null
+++ b/lib/librte_eal/linuxapp/eal/eal_vmbus.c
@@ -0,0 +1,658 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2010-2013 Intel Corporation. All rights reserved.
+ *   Copyright(c) 2013-2015 Brocade Communications Systems, Inc.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <string.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <sys/queue.h>
+
+#include <rte_log.h>
+#include <rte_vmbus.h>
+#include <rte_common.h>
+#include <rte_tailq.h>
+#include <rte_eal.h>
+#include <rte_malloc.h>
+
+#include "eal_filesystem.h"
+#include "eal_private.h"
+
+#define PROC_MODULES "/proc/modules"
+#define VMBUS_DRV_PATH "/sys/bus/vmbus/drivers/%s"
+
+TAILQ_HEAD(vmbus_device_list, rte_vmbus_device); /**< VMBUS devices in D-linked Q. */
+TAILQ_HEAD(vmbus_driver_list, rte_vmbus_driver); /**< VMBUS drivers in D-linked Q. */
+
+static struct vmbus_driver_list vmbus_driver_list =
+	TAILQ_HEAD_INITIALIZER(vmbus_driver_list);
+static struct vmbus_device_list vmbus_device_list =
+	TAILQ_HEAD_INITIALIZER(vmbus_device_list);
+
+struct uio_map {
+	void *addr;
+	uint64_t offset;
+	uint64_t size;
+	uint64_t phaddr;
+};
+
+/*
+ * For multi-process we need to reproduce all vmbus mappings in secondary
+ * processes, so save them in a tailq.
+ */
+struct uio_resource {
+	TAILQ_ENTRY(uio_resource) next;
+
+	struct rte_vmbus_id vmbus_addr;
+	char path[PATH_MAX];
+	size_t nb_maps;
+	struct uio_map maps[VMBUS_MAX_RESOURCE];
+};
+
+/*
+ * parse a sysfs file containing one integer value
+ * different to the eal version, as it needs to work with 64-bit values
+ */
+static int
+vmbus_parse_sysfs_value(const char *filename, uint64_t *val)
+{
+	FILE *f;
+	char buf[BUFSIZ];
+	char *end = NULL;
+
+	f = fopen(filename, "r");
+	if (f == NULL) {
+		RTE_LOG(ERR, EAL, "%s(): cannot open sysfs value %s\n",
+				__func__, filename);
+		return -1;
+	}
+
+	if (fgets(buf, sizeof(buf), f) == NULL) {
+		RTE_LOG(ERR, EAL, "%s(): cannot read sysfs value %s\n",
+				__func__, filename);
+		fclose(f);
+		return -1;
+	}
+	*val = strtoull(buf, &end, 0);
+	if ((buf[0] == '\0') || (end == NULL) || (*end != '\n')) {
+		RTE_LOG(ERR, EAL, "%s(): cannot parse sysfs value %s\n",
+				__func__, filename);
+		fclose(f);
+		return -1;
+	}
+	fclose(f);
+	return 0;
+}
+
+#define OFF_MAX              ((uint64_t)(off_t)-1)
+static ssize_t
+vmbus_uio_get_mappings(const char *devname, struct uio_map maps[], size_t nb_maps)
+{
+	size_t i;
+	char dirname[PATH_MAX];
+	char filename[PATH_MAX];
+	uint64_t offset, size;
+
+	for (i = 0; i != nb_maps; i++) {
+
+		/* check if map directory exists */
+		snprintf(dirname, sizeof(dirname),
+				"%s/maps/map%zu", devname, i);
+
+		RTE_LOG(DEBUG, EAL, "Scanning maps in %s\n", (char *)dirname);
+
+		if (access(dirname, F_OK) != 0)
+			break;
+
+		/* get mapping offset */
+		snprintf(filename, sizeof(filename),
+				"%s/offset", dirname);
+		if (vmbus_parse_sysfs_value(filename, &offset) < 0) {
+			RTE_LOG(ERR, EAL,
+					"%s(): cannot parse offset of %s\n",
+					__func__, dirname);
+			return -1;
+		}
+
+		/* get mapping size */
+		snprintf(filename, sizeof(filename),
+				"%s/size", dirname);
+		if (vmbus_parse_sysfs_value(filename, &size) < 0) {
+			RTE_LOG(ERR, EAL,
+					"%s(): cannot parse size of %s\n",
+					__func__, dirname);
+			return -1;
+		}
+
+		/* get mapping physical address */
+		snprintf(filename, sizeof(filename),
+				"%s/addr", dirname);
+		if (vmbus_parse_sysfs_value(filename, &maps[i].phaddr) < 0) {
+			RTE_LOG(ERR, EAL,
+					"%s(): cannot parse addr of %s\n",
+					__func__, dirname);
+			return -1;
+		}
+
+		if ((offset > OFF_MAX) || (size > SIZE_MAX)) {
+			RTE_LOG(ERR, EAL,
+					"%s(): offset/size exceed system max value\n",
+					__func__);
+			return -1;
+		}
+
+		maps[i].offset = offset;
+		maps[i].size = size;
+	}
+	return i;
+}
+
+/* maximum time to wait that /dev/uioX appears */
+#define UIO_DEV_WAIT_TIMEOUT 3 /* seconds */
+
+/* map a particular resource from a file */
+static void *
+vmbus_map_resource(struct rte_vmbus_device *dev, void *requested_addr,
+		const char *devname, off_t offset, size_t size)
+{
+	int fd;
+	void *mapaddr;
+
+	if (dev->uio_fd <= 0) {
+#ifdef RTE_EAL_UNBIND_PORTS
+		/*
+		 * open devname, and mmap it: it can take some time to
+		 * appear, so we wait some time before returning an error
+		 */
+		unsigned n;
+		fd = -1;
+		for (n = 0; n < UIO_DEV_WAIT_TIMEOUT*10 && fd < 0; n++) {
+			errno = 0;
+			fd = open(devname, O_RDWR);
+			if (fd < 0 && errno != ENOENT)
+				break;
+			usleep(100000);
+		}
+#else
+		/*
+		 * open devname, to mmap it
+		 */
+		fd = open(devname, O_RDWR);
+#endif
+	} else
+		fd = dev->uio_fd;
+
+	if (fd < 0) {
+		RTE_LOG(ERR, EAL, "Cannot open %s: %s\n",
+				devname, strerror(errno));
+		goto fail;
+	}
+
+	dev->uio_fd = fd;
+	/* Map the memory resource of device */
+	mapaddr = mmap(requested_addr, size, PROT_READ | PROT_WRITE,
+			MAP_SHARED, fd, offset);
+	if (mapaddr == MAP_FAILED ||
+			(requested_addr != NULL && mapaddr != requested_addr)) {
+		RTE_LOG(ERR, EAL, "%s(): cannot mmap(%s(%d), %p, 0x%lx, 0x%lx):"
+				" %s (%p)\n", __func__, devname, fd, requested_addr,
+				(unsigned long)size, (unsigned long)offset,
+				strerror(errno), mapaddr);
+		close(fd);
+		goto fail;
+	}
+	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+		close(fd);
+
+	RTE_LOG(DEBUG, EAL, "  VMBUS memory mapped at %p\n", mapaddr);
+
+	return mapaddr;
+
+fail:
+	return NULL;
+}
+
+/* map the resources of a vmbus device in virtual memory */
+int
+vmbus_uio_map_resource(struct rte_vmbus_device *dev)
+{
+	int i;
+	struct dirent *e;
+	DIR *dir;
+	char dirname[PATH_MAX];
+	char dirname2[PATH_MAX];
+	char devname[PATH_MAX]; /* contains the /dev/uioX */
+	void *mapaddr;
+	unsigned uio_num;
+	uint64_t phaddr;
+	uint64_t offset;
+	uint64_t pagesz;
+	ssize_t nb_maps;
+	struct rte_vmbus_id *loc = &dev->id;
+	struct uio_resource *uio_res;
+	struct uio_map *maps;
+
+	/* depending on kernel version, uio can be located in uio/uioX
+	 * or uio:uioX */
+	snprintf(dirname, sizeof(dirname),
+			"/sys/bus/vmbus/devices/" VMBUS_PRI_FMT "/uio", loc->sysfs_num);
+
+	dir = opendir(dirname);
+	if (dir == NULL) {
+		/* retry with the parent directory */
+		snprintf(dirname, sizeof(dirname),
+				"/sys/bus/vmbus/devices/" VMBUS_PRI_FMT, loc->sysfs_num);
+		dir = opendir(dirname);
+
+		if (dir == NULL) {
+			RTE_LOG(ERR, EAL, "Cannot opendir %s\n", dirname);
+			return -1;
+		}
+	}
+
+	/* take the first file starting with "uio" */
+	while ((e = readdir(dir)) != NULL) {
+		/* format could be uio%d ...*/
+		int shortprefix_len = sizeof("uio") - 1;
+		/* ... or uio:uio%d */
+		int longprefix_len = sizeof("uio:uio") - 1;
+		char *endptr;
+
+		if (strncmp(e->d_name, "uio", 3) != 0)
+			continue;
+
+		/* first try uio%d */
+		errno = 0;
+		uio_num = strtoull(e->d_name + shortprefix_len, &endptr, 10);
+		if (errno == 0 && endptr != e->d_name) {
+			snprintf(dirname2, sizeof(dirname2),
+					"%s/uio%u", dirname, uio_num);
+			break;
+		}
+
+		/* then try uio:uio%d */
+		errno = 0;
+		uio_num = strtoull(e->d_name + longprefix_len, &endptr, 10);
+		if (errno == 0 && endptr != e->d_name) {
+			snprintf(dirname2, sizeof(dirname2),
+					"%s/uio:uio%u", dirname, uio_num);
+			break;
+		}
+	}
+	closedir(dir);
+
+	/* No uio resource found */
+	if (e == NULL) {
+		RTE_LOG(WARNING, EAL, "  "VMBUS_PRI_FMT" not managed by UIO driver, "
+				"skipping\n", loc->sysfs_num);
+		return -1;
+	}
+
+	/* allocate the mapping details for secondary processes*/
+	uio_res = rte_zmalloc("UIO_RES", sizeof(*uio_res), 0);
+	if (uio_res == NULL) {
+		RTE_LOG(ERR, EAL,
+				"%s(): cannot store uio mmap details\n", __func__);
+		return -1;
+	}
+
+	snprintf(devname, sizeof(devname), "/dev/uio%u", uio_num);
+	snprintf(uio_res->path, sizeof(uio_res->path), "%s", devname);
+	memcpy(&uio_res->vmbus_addr, &dev->id, sizeof(uio_res->vmbus_addr));
+
+	/* collect info about device mappings */
+	nb_maps = vmbus_uio_get_mappings(dirname2, uio_res->maps,
+			sizeof(uio_res->maps) / sizeof(uio_res->maps[0]));
+	if (nb_maps < 0)
+		return nb_maps;
+
+	RTE_LOG(DEBUG, EAL, "Found %d memory maps for device "VMBUS_PRI_FMT"\n",
+			(int)nb_maps, loc->sysfs_num);
+
+	uio_res->nb_maps = nb_maps;
+
+	pagesz = sysconf(_SC_PAGESIZE);
+
+	maps = uio_res->maps;
+	for (i = 0; i != VMBUS_MAX_RESOURCE; i++) {
+		phaddr = maps[i].phaddr;
+		if (phaddr == 0)
+			continue;
+
+		RTE_LOG(DEBUG, EAL, "	mem_map%d: addr=0x%lx len = %lu\n",
+				i,
+				maps[i].phaddr,
+				maps[i].size);
+
+		if (i != nb_maps) {
+			offset = i * pagesz;
+			mapaddr = vmbus_map_resource(dev, NULL, devname, (off_t)offset,
+					(size_t)maps[i].size);
+			if (mapaddr == NULL)
+				return -1;
+
+			/* Important: offset for mapping can be non-zero, pad the addr */
+			mapaddr = ((char *)mapaddr + maps[i].offset);
+			maps[i].addr = mapaddr;
+			maps[i].offset = offset;
+			dev->mem_resource[i].addr = mapaddr;
+			dev->mem_resource[i].phys_addr = phaddr;
+			dev->mem_resource[i].len = maps[i].size;
+		}
+	}
+
+	return 0;
+}
+
+/* Compare two VMBUS device addresses. */
+static int
+vmbus_compare(struct rte_vmbus_id *id, struct rte_vmbus_id *id2)
+{
+	return id->device_id > id2->device_id;
+}
+
+/* Scan one vmbus sysfs entry, and fill the devices list from it. */
+static int
+vmbus_scan_one(const char *name)
+{
+	char filename[PATH_MAX];
+	char buf[BUFSIZ];
+	char dirname[PATH_MAX];
+	unsigned long tmp;
+	struct rte_vmbus_device *dev;
+	FILE *f;
+
+	dev = rte_zmalloc("vmbus_device", sizeof(*dev), 0);
+	if (dev == NULL)
+		return -1;
+
+	snprintf(dirname, sizeof(dirname), "%s/%s",
+		 SYSFS_VMBUS_DEVICES, name);
+
+	/* parse directory name in sysfs.  this does not always reflect
+	 * the device id read below.
+	 */
+	unsigned int sysfs_num;
+	if (sscanf(name, VMBUS_PRI_FMT, &sysfs_num) != 1) {
+		RTE_LOG(ERR, EAL, "Unable to parse vmbus sysfs name\n");
+		rte_free(dev);
+		return -1;
+	}
+	dev->id.sysfs_num = sysfs_num;
+
+	/* get device id */
+	snprintf(filename, sizeof(filename), "%s/id", dirname);
+	if (eal_parse_sysfs_value(filename, &tmp) < 0) {
+		rte_free(dev);
+		return -1;
+	}
+	dev->id.device_id = (uint16_t)tmp;
+
+	/* get monitor id */
+	snprintf(filename, sizeof(filename), "%s/monitor_id", dirname);
+	if (eal_parse_sysfs_value(filename, &tmp) < 0) {
+		rte_free(dev);
+		return -1;
+	}
+	dev->vmbus_monitor_id = tmp;
+
+	/* compare class_id of device with {f8615163-df3e-46c5-913ff2d2f965ed0e} */
+	snprintf(filename, sizeof(filename), "%s/class_id", dirname);
+	f = fopen(filename, "r");
+	if (f == NULL) {
+		RTE_LOG(ERR, EAL, "%s(): cannot open sysfs value %s\n",
+				__func__, filename);
+		rte_free(dev);
+		return -1;
+	}
+	if (fgets(buf, sizeof(buf), f) == NULL) {
+		RTE_LOG(ERR, EAL, "%s(): cannot read sysfs value %s\n",
+				__func__, filename);
+		fclose(f);
+		rte_free(dev);
+		return -1;
+	}
+	fclose(f);
+
+	if (strncmp(buf, VMBUS_NETWORK_DEVICE, strlen(VMBUS_NETWORK_DEVICE))) {
+		RTE_LOG(DEBUG, EAL, "%s(): skip vmbus_0_%u with class_id = %s",
+				__func__, dev->id.sysfs_num, buf);
+		rte_free(dev);
+		return 0;
+	}
+
+	/* device is valid, add in list (sorted) */
+	RTE_LOG(DEBUG, EAL, "Adding vmbus device %d\n", dev->id.device_id);
+	if (!TAILQ_EMPTY(&vmbus_device_list)) {
+		struct rte_vmbus_device *dev2 = NULL;
+
+		TAILQ_FOREACH(dev2, &vmbus_device_list, next) {
+			if (vmbus_compare(&dev->id, &dev2->id))
+				continue;
+
+			TAILQ_INSERT_BEFORE(dev2, dev, next);
+			return 0;
+		}
+	}
+
+	TAILQ_INSERT_TAIL(&vmbus_device_list, dev, next);
+
+	return 0;
+}
+
+static int
+check_vmbus_device(const char *buf, int bufsize)
+{
+	char *n = strrchr(buf, '_');
+	/* the format is 'vmbus_0_%d' */
+	if (n == NULL)
+		return -1;
+	n++;
+	char *buf_copy = strndup(n, bufsize);
+	if (buf_copy == NULL) {
+		RTE_LOG(ERR, EAL, "%s(): failed to strndup: %s\n",
+				__func__, strerror(errno));
+		return -1;
+	}
+
+	int err = strtoul(buf_copy, NULL, 10);
+	free(buf_copy);
+
+	if (errno || err < 0) {
+		RTE_LOG(ERR, EAL, "%s(): can't parse devid: %s\n",
+				__func__, strerror(errno));
+		return -1;
+	}
+
+	return 0;
+}
+
+/*
+ * Scan the content of the vmbus, and the devices in the devices list
+ */
+static int
+vmbus_scan(void)
+{
+	struct dirent *e;
+	DIR *dir;
+
+	dir = opendir(SYSFS_VMBUS_DEVICES);
+	if (dir == NULL) {
+		if (errno == ENOENT)
+			return 0;
+		else {
+			RTE_LOG(ERR, EAL, "%s(): opendir failed: %s\n",
+					__func__, strerror(errno));
+			return -1;
+		}
+	}
+
+	while ((e = readdir(dir)) != NULL) {
+		if (e->d_name[0] == '.')
+			continue;
+
+		if (check_vmbus_device(e->d_name, sizeof(e->d_name)))
+			continue;
+
+		if (vmbus_scan_one(e->d_name) < 0)
+			goto error;
+	}
+	closedir(dir);
+	return 0;
+
+error:
+	closedir(dir);
+	return -1;
+}
+
+/* Init the VMBUS EAL subsystem */
+int rte_eal_vmbus_init(void)
+{
+	/* VMBUS can be disabled */
+	if (internal_config.no_vmbus)
+		return 0;
+
+	if (vmbus_scan() < 0) {
+		RTE_LOG(ERR, EAL, "%s(): Cannot scan vmbus\n", __func__);
+		return -1;
+	}
+	return 0;
+}
+
+/* Below is PROBE part of eal_vmbus library */
+
+/*
+ * If device ID match, call the devinit() function of the driver.
+ */
+int
+rte_eal_vmbus_probe_one_driver(struct rte_vmbus_driver *dr,
+		struct rte_vmbus_device *dev)
+{
+	struct rte_vmbus_id *id_table;
+
+	for (id_table = dr->id_table; id_table->device_id != VMBUS_ID_ANY; id_table++) {
+
+		struct rte_vmbus_id *loc = &dev->id;
+
+		RTE_LOG(DEBUG, EAL, "VMBUS device "VMBUS_PRI_FMT"\n",
+				loc->sysfs_num);
+
+		RTE_LOG(DEBUG, EAL, "  probe driver: %s\n", dr->name);
+
+		/* no initialization when blacklisted, return without error */
+		if (dev->blacklisted) {
+			RTE_LOG(DEBUG, EAL, "  Device is blacklisted, not initializing\n");
+			return 0;
+		}
+
+		/* map the resources */
+		if (vmbus_uio_map_resource(dev) < 0)
+			return -1;
+
+		/* reference driver structure */
+		dev->driver = dr;
+
+		/* call the driver devinit() function */
+		return dr->devinit(dr, dev);
+	}
+
+	/* return positive value if driver is not found */
+	return 1;
+}
+
+/*
+ * call the devinit() function of all
+ * registered drivers for the vmbus device. Return -1 if no driver is
+ * found for this class of vmbus device.
+ * The present assumption is that we have drivers only for vmbus network
+ * devices. That's why we don't check driver's id_table now.
+ */
+static int
+vmbus_probe_all_drivers(struct rte_vmbus_device *dev)
+{
+	struct rte_vmbus_driver *dr = NULL;
+	int ret;
+
+	TAILQ_FOREACH(dr, &vmbus_driver_list, next) {
+		ret = rte_eal_vmbus_probe_one_driver(dr, dev);
+		if (ret < 0) {
+			/* negative value is an error */
+			RTE_LOG(ERR, EAL, "Failed to probe driver %s\n", dr->name);
+			break;
+		}
+		if (ret > 0) {
+			/* positive value means driver not found */
+			RTE_LOG(DEBUG, EAL, "Driver %s not found", dr->name);
+			continue;
+		}
+
+		RTE_LOG(DEBUG, EAL, "OK. Driver was found and probed.\n");
+		return 0;
+	}
+	return -1;
+}
+
+
+/*
+ * Scan the vmbus, and call the devinit() function for
+ * all registered drivers that have a matching entry in its id_table
+ * for discovered devices.
+ */
+int
+rte_eal_vmbus_probe(void)
+{
+	struct rte_vmbus_device *dev = NULL;
+
+	TAILQ_FOREACH(dev, &vmbus_device_list, next) {
+		RTE_LOG(DEBUG, EAL, "Probing driver for device %d ...\n",
+				dev->id.device_id);
+		vmbus_probe_all_drivers(dev);
+	}
+	return 0;
+}
+
+/* register vmbus driver */
+void
+rte_eal_vmbus_register(struct rte_vmbus_driver *driver)
+{
+	TAILQ_INSERT_TAIL(&vmbus_driver_list, driver, next);
+}
+
+/* unregister vmbus driver */
+void
+rte_eal_vmbus_unregister(struct rte_vmbus_driver *driver)
+{
+	TAILQ_REMOVE(&vmbus_driver_list, driver, next);
+}
+
diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 4d803d0..f5a1d07 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -287,6 +287,57 @@ rte_eth_dev_init(struct rte_pci_driver *pci_drv,
 	return diag;
 }
 
+#ifdef RTE_LIBRTE_HV_PMD
+static int
+rte_vmbus_dev_init(struct rte_vmbus_driver *vmbus_drv,
+		   struct rte_vmbus_device *vmbus_dev)
+{
+	struct eth_driver  *eth_drv = (struct eth_driver *)vmbus_drv;
+	struct rte_eth_dev *eth_dev;
+	char ethdev_name[RTE_ETH_NAME_MAX_LEN];
+	int diag;
+
+	snprintf(ethdev_name, RTE_ETH_NAME_MAX_LEN, "%u_%u",
+		 vmbus_dev->id.device_id, vmbus_dev->id.sysfs_num);
+
+	eth_dev = rte_eth_dev_allocate(ethdev_name);
+	if (eth_dev == NULL)
+		return -ENOMEM;
+
+	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
+		eth_dev->data->dev_private = rte_zmalloc("ethdev private structure",
+				  eth_drv->dev_private_size,
+				  RTE_CACHE_LINE_SIZE);
+		if (eth_dev->data->dev_private == NULL)
+			rte_panic("Cannot allocate memzone for private port data\n");
+	}
+	eth_dev->vmbus_dev = vmbus_dev;
+	eth_dev->driver = eth_drv;
+	eth_dev->data->rx_mbuf_alloc_failed = 0;
+
+	/* init user callbacks */
+	TAILQ_INIT(&(eth_dev->callbacks));
+
+	/*
+	 * Set the default maximum frame size.
+	 */
+	eth_dev->data->mtu = ETHER_MTU;
+
+	/* Invoke PMD device initialization function */
+	diag = (*eth_drv->eth_dev_init)(eth_drv, eth_dev);
+	if (diag == 0)
+		return 0;
+
+	PMD_DEBUG_TRACE("driver %s: eth_dev_init(device_id=0x%x)"
+			" failed\n", vmbus_drv->name,
+			(unsigned) vmbus_dev->id.device_id);
+	if (rte_eal_process_type() == RTE_PROC_PRIMARY)
+		rte_free(eth_dev->data->dev_private);
+	nb_ports--;
+	return diag;
+}
+#endif
+
 /**
  * Register an Ethernet [Poll Mode] driver.
  *
@@ -304,8 +355,20 @@ rte_eth_dev_init(struct rte_pci_driver *pci_drv,
 void
 rte_eth_driver_register(struct eth_driver *eth_drv)
 {
-	eth_drv->pci_drv.devinit = rte_eth_dev_init;
-	rte_eal_pci_register(&eth_drv->pci_drv);
+	switch (eth_drv->bus_type) {
+	case RTE_BUS_PCI:
+		eth_drv->pci_drv.devinit = rte_eth_dev_init;
+		rte_eal_pci_register(&eth_drv->pci_drv);
+		break;
+#ifdef RTE_LIBRTE_HV_PMD
+	case RTE_BUS_VMBUS:
+		eth_drv->vmbus_drv.devinit = rte_vmbus_dev_init;
+		rte_eal_vmbus_register(&eth_drv->vmbus_drv);
+		break;
+#endif
+	default:
+		rte_panic("unknown bus type %u\n", eth_drv->bus_type);
+	}
 }
 
 int
@@ -1275,6 +1338,9 @@ rte_eth_has_link_state(uint8_t port_id)
 	}
 	dev = &rte_eth_devices[port_id];
 
+	if (dev->driver->bus_type != RTE_BUS_PCI)
+		return 0;
+
 	return (dev->pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC) != 0;
 }
 
@@ -1457,9 +1523,17 @@ rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info)
 
 	FUNC_PTR_OR_RET(*dev->dev_ops->dev_infos_get);
 	(*dev->dev_ops->dev_infos_get)(dev, dev_info);
-	dev_info->pci_dev = dev->pci_dev;
-	if (dev->driver)
-		dev_info->driver_name = dev->driver->pci_drv.name;
+
+	if (dev->driver) {
+		switch (dev->driver->bus_type) {
+		case RTE_BUS_PCI:
+			dev_info->driver_name = dev->driver->pci_drv.name;
+			dev_info->pci_dev = dev->pci_dev;
+			break;
+		case RTE_BUS_VMBUS:
+			dev_info->driver_name = dev->driver->vmbus_drv.name;
+		}
+	}
 }
 
 void
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 9d43ca3..714f94d 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -175,6 +175,7 @@ extern "C" {
 #include <rte_log.h>
 #include <rte_interrupts.h>
 #include <rte_pci.h>
+#include <rte_vmbus.h>
 #include <rte_mbuf.h>
 #include "rte_ether.h"
 #include "rte_eth_ctrl.h"
@@ -1537,7 +1538,10 @@ struct rte_eth_dev {
 	struct rte_eth_dev_data *data;  /**< Pointer to device data */
 	const struct eth_driver *driver;/**< Driver for this device */
 	struct eth_dev_ops *dev_ops;    /**< Functions exported by PMD */
-	struct rte_pci_device *pci_dev; /**< PCI info. supplied by probing */
+	union {
+		struct rte_pci_device *pci_dev; /**< PCI info. supplied by probing */
+		struct rte_vmbus_device *vmbus_dev; /**< VMBUS info. supplied by probing */
+	};
 	struct rte_eth_dev_cb_list callbacks; /**< User application callbacks */
 };
 
@@ -1671,7 +1675,14 @@ typedef int (*eth_dev_init_t)(struct eth_driver  *eth_drv,
  * - The size of the private data to allocate for each matching device.
  */
 struct eth_driver {
-	struct rte_pci_driver pci_drv;    /**< The PMD is also a PCI driver. */
+	union {
+		struct rte_pci_driver pci_drv;    /**< The PMD is also a PCI driver. */
+		struct rte_vmbus_driver vmbus_drv;/**< The PMD is also a VMBUS drv. */
+	};
+	enum {
+		RTE_BUS_PCI=0,
+		RTE_BUS_VMBUS
+	} bus_type; 			  /**< Device bus type. */
 	eth_dev_init_t eth_dev_init;      /**< Device init function. */
 	unsigned int dev_private_size;    /**< Size of device private data. */
 };
-- 
2.1.4

^ permalink raw reply	[relevance 1%]

* [dpdk-dev] [PATCH 2/3] maintainers: add ABI versioning
  2015-02-04 22:23  4% [dpdk-dev] [PATCH 0/3] update maintainers areas Thomas Monjalon
@ 2015-02-04 22:23 14% ` Thomas Monjalon
  2015-02-05  1:39  4%   ` Neil Horman
  2015-02-09 14:21  0% ` [dpdk-dev] [PATCH 0/3] update maintainers areas Thomas Monjalon
  1 sibling, 1 reply; 200+ results
From: Thomas Monjalon @ 2015-02-04 22:23 UTC (permalink / raw)
  To: dev

Reference the new framework and policy for ABI versioning,
in the MAINTAINERS file.

Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
---
 MAINTAINERS | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index f2b697e..7c0047b 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -54,6 +54,9 @@ F: doc/guides/prog_guide/build_app.rst
 F: doc/guides/prog_guide/dev_kit_*
 F: doc/guides/prog_guide/ext_app_lib_make_help.rst
 
+ABI versioning
+F: lib/librte_compat/
+F: doc/guides/rel_notes/abi.rst
 
 Environment Abstraction Layer
 -----------------------------
-- 
2.2.2

^ permalink raw reply	[relevance 14%]

* [dpdk-dev] [PATCH 0/3] update maintainers areas
@ 2015-02-04 22:23  4% Thomas Monjalon
  2015-02-04 22:23 14% ` [dpdk-dev] [PATCH 2/3] maintainers: add ABI versioning Thomas Monjalon
  2015-02-09 14:21  0% ` [dpdk-dev] [PATCH 0/3] update maintainers areas Thomas Monjalon
  0 siblings, 2 replies; 200+ results
From: Thomas Monjalon @ 2015-02-04 22:23 UTC (permalink / raw)
  To: dev

More files should be referenced in MAINTAINERS files:
  - some (forgotten) docs can be co-maintained in doc and lib areas
  - new ABI files
The script can now check for unknown files.

Thomas Monjalon (3):
  maintainers: dispatch more doc
  maintainers: add ABI versioning
  scripts: check wrong patterns in maintainers file

 MAINTAINERS                  |  9 +++++++++
 scripts/check-maintainers.sh | 20 +++++++++++++++++++-
 2 files changed, 28 insertions(+), 1 deletion(-)

-- 
2.2.2

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility
  2015-02-03 16:01  0% ` [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Thomas Monjalon
@ 2015-02-03 20:20  0%   ` Neil Horman
  0 siblings, 0 replies; 200+ results
From: Neil Horman @ 2015-02-03 20:20 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Tue, Feb 03, 2015 at 05:01:51PM +0100, Thomas Monjalon wrote:
> 2014-12-20 16:01, Neil Horman:
> > GI: [PATCH 1/4] compat: Add infrastructure to support symbol versioninBI
> > develops and changes quickly, which makes it difficult for
> > applications to keep up with the latest version of the library, especially when
> > it (the DPDK) is built as a set of shared objects, as applications may be built
> > against an older version of the library.
> > 
> > To mitigate this, this patch series introduces support for library and symbol
> > versioning when the DPDK is built as a DSO.  Specifically, it does 4 things:
> > 
> > 1) Adds initial support for library versioning.  Each library now has a version
> > map that explicitly calls out what symbols are exported to using applications,
> > and assigns version(s) to them
> > 
> > 2) Adds support macros so that when libraries create incompatible ABI's,
> > multiple versions may be supported so that applications linked against older
> > DPDK releases can continue to function
> > 
> > 3) Adds library soname versioning suffixes so that when ABI's must be broken in
> > a fashion that requires a rebuild of older applications, they will break at load
> > time, rather than cause unexpected issues at run time.
> > 
> > 4) Adds documentation for ABI policy, and provides space to document deprecated
> > ABI versions, so that applications might be warned of impending changes.
> > 
> > With these elements in place the DPDK has some support to allow for the extended
> > maintenence of older API's while still allowing the freedom to develop new and
> > improved API's.
> > 
> > Implementing this feature will require some additional effort on the part of
> > developers and reviewers.  When reviewing patches, must be checked against
> > existing exports to ensure that the function prototypes are not changing.  If
> > they are, the versioning macros must be used, and the library export map should
> > be updated to reflect the new version of the function.
> > 
> > When data structures change, if those structures are application accessible,
> > apis that accept or return instances of those data structures should have new
> > versions created so that users of the old data structure version might co-exist
> > at the same time.
> > 
> > Note it was requested that this series be delayed until DPDK 2.0, so this is a
> > repost, now that DPDK 1.8 has been tagged.
> > 
> > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> > CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> > CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> > CC: "Robert Love" <robert.w.love@intel.com>
> 
> After updating to version 2.0, and sorting symbol lists,
> Applied
> 
> It's probably an important change which makes 2.0 number meaningful.
> Thanks
> -- 
> Thomas
> 
Thank you Thomas!  Just as a heads up, there may be some inconsistencies
resulting from patches that you merged between the time of my last repost and
the time of this merge.  They'll be easy to fix as they will just amount to
symbol additions/removals from the various version map file.  So please cc me on
any sucpicious build breaks in the next few days when building shared objects,
and I'll fix them up ASAP.

Neil

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility
  2014-12-20 21:01  4% [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
                   ` (11 preceding siblings ...)
       [not found]     ` <1422898822-16422-1-git-send-email-nhorman@tuxdriver.com>
@ 2015-02-03 16:01  0% ` Thomas Monjalon
  2015-02-03 20:20  0%   ` Neil Horman
  12 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2015-02-03 16:01 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

2014-12-20 16:01, Neil Horman:
> GI: [PATCH 1/4] compat: Add infrastructure to support symbol versioninBI
> develops and changes quickly, which makes it difficult for
> applications to keep up with the latest version of the library, especially when
> it (the DPDK) is built as a set of shared objects, as applications may be built
> against an older version of the library.
> 
> To mitigate this, this patch series introduces support for library and symbol
> versioning when the DPDK is built as a DSO.  Specifically, it does 4 things:
> 
> 1) Adds initial support for library versioning.  Each library now has a version
> map that explicitly calls out what symbols are exported to using applications,
> and assigns version(s) to them
> 
> 2) Adds support macros so that when libraries create incompatible ABI's,
> multiple versions may be supported so that applications linked against older
> DPDK releases can continue to function
> 
> 3) Adds library soname versioning suffixes so that when ABI's must be broken in
> a fashion that requires a rebuild of older applications, they will break at load
> time, rather than cause unexpected issues at run time.
> 
> 4) Adds documentation for ABI policy, and provides space to document deprecated
> ABI versions, so that applications might be warned of impending changes.
> 
> With these elements in place the DPDK has some support to allow for the extended
> maintenence of older API's while still allowing the freedom to develop new and
> improved API's.
> 
> Implementing this feature will require some additional effort on the part of
> developers and reviewers.  When reviewing patches, must be checked against
> existing exports to ensure that the function prototypes are not changing.  If
> they are, the versioning macros must be used, and the library export map should
> be updated to reflect the new version of the function.
> 
> When data structures change, if those structures are application accessible,
> apis that accept or return instances of those data structures should have new
> versions created so that users of the old data structure version might co-exist
> at the same time.
> 
> Note it was requested that this series be delayed until DPDK 2.0, so this is a
> repost, now that DPDK 1.8 has been tagged.
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> CC: "Robert Love" <robert.w.love@intel.com>

After updating to version 2.0, and sorting symbol lists,
Applied

It's probably an important change which makes 2.0 number meaningful.
Thanks
-- 
Thomas

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v9 4/4] docs: Add ABI documentation
       [not found]       ` <1422898822-16422-4-git-send-email-nhorman@tuxdriver.com>
@ 2015-02-03 15:24  8%     ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-02-03 15:24 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

> Adding a document describing rudimentary ABI policy and adding notice space for
> any deprecation announcements
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>

Acked-by: Thomas Monjalon <thomas.monjalon@6wind.com>

Thanks Neil for writing the policy.

The version 2.0 will be the first to have a versioned ABI with LIBABIVER := 1.
Starting from there, we'll have to consider this ABI policy when preparing
next versions.

-- 
Thomas

^ permalink raw reply	[relevance 8%]

* [dpdk-dev] [PATCH v2] ABI: Add abi checking utility
  2015-01-30 21:16 17% [dpdk-dev] [PATCH] ABI: Add abi checking utility Neil Horman
@ 2015-02-02 18:18 17% ` Neil Horman
  0 siblings, 0 replies; 200+ results
From: Neil Horman @ 2015-02-02 18:18 UTC (permalink / raw)
  To: dev

There was a request for an abi validation utiltyfor the ongoing ABI stability
work.  As it turns out there is a abi compliance checker in development that
seems to be under active development and provides fairly detailed ABI compliance
reports.  Its not yet intellegent enough to understand symbol versioning, but it
does provide the ability to identify symbols which have changed between
releases, along with details of the change, and offers develoeprs the
opportunity to identify which symbols then need versioning and validation for a
given update via manaul testing.

This script automates the use of the compliance checker between two arbitrarily
specified tags within the dpdk tree.  To execute enter the $RTE_SDK directory
and run:

./scripts/validate_abi.sh $GIT_TAG1 $GIT_TAG2 $CONFIG

where $GIT_TAG1 and 2 are git tags and $CONFIG is a config specification
suitable for passing as the T= variable in the make config command.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>

Change Notes:

v2) Fixed some typos as requested by Thomas
---
 scripts/validate_abi.sh | 241 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 241 insertions(+)
 create mode 100755 scripts/validate_abi.sh

diff --git a/scripts/validate_abi.sh b/scripts/validate_abi.sh
new file mode 100755
index 0000000..31583df
--- /dev/null
+++ b/scripts/validate_abi.sh
@@ -0,0 +1,241 @@
+#!/bin/sh
+#   BSD LICENSE
+#
+#   Copyright(c) 2015 Neil Horman. All rights reserved.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+TAG1=$1
+TAG2=$2
+TARGET=$3
+ABI_DIR=`mktemp -d -p /tmp ABI.XXXXXX`
+
+usage() {
+	echo "$0 <TAG1> <TAG2> <TARGET>"
+}
+
+log() {
+	local level=$1
+	shift
+	echo "$*"
+}
+
+validate_tags() {
+	git tag -l | grep -q "$TAG1"
+	if [ $? -ne 0 ]
+	then
+		echo "$TAG1 is invalid"
+		return
+	fi
+	git tag -l | grep -q "$TAG2"
+	if [ $? -ne 0 ]
+	then
+		echo "$TAG2 is invalid"
+		return
+	fi
+}
+
+validate_args() {
+	if [ -z "$TAG1" ]
+	then
+		echo "Must Specify TAG1"
+		return
+	fi
+	if [ -z "$TAG2" ]
+	then
+		echo "Must Specify TAG2"
+		return
+	fi
+	if [ -z "$TARGET" ]
+	then
+		echo "Must Specify a build target"
+	fi
+}
+
+
+cleanup_and_exit() {
+	rm -rf $ABI_DIR
+	exit $1
+}
+
+###########################################
+#START
+############################################
+
+#Save the current branch
+CURRENT_BRANCH=`git branch | grep \* | cut -d' ' -f2`
+
+if [ -n "$VERBOSE" ]
+then
+	export VERBOSE=/dev/stdout
+else
+	export VERBOSE=/dev/null
+fi
+
+# Validate that we have all the arguments we need
+res=$(validate_args)
+if [ -n "$res" ]
+then
+	echo $res
+	usage
+	cleanup_and_exit 1
+fi
+
+# Make sure our tags exist
+res=$(validate_tags)
+if [ -n "$res" ]
+then
+	echo $res
+	cleanup_and_exit 1
+fi
+
+ABICHECK=`which abi-compliance-checker 2>/dev/null`
+if [ $? -ne 0 ]
+then
+	log "INFO" "Cant find abi-compliance-checker utility"
+	cleanup_and_exit 1
+fi
+
+ABIDUMP=`which abi-dumper 2>/dev/null`
+if [ $? -ne 0 ]
+then
+	log "INFO" "Cant find abi-dumper utility"
+	cleanup_and_exit 1
+fi
+
+log "INFO" "We're going to check and make sure that applications built"
+log "INFO" "against DPDK DSOs from tag $TAG1 will still run when executed"
+log "INFO" "against DPDK DSOs built from tag $TAG2."
+log "INFO" ""
+
+# Check to make sure we have a clean tree
+git status | grep -q clean
+if [ $? -ne 0 ]
+then
+	log "WARN" "Working directory not clean, aborting"
+	cleanup_and_exit 1
+fi
+
+if [ ! -d ./.git ]
+then
+	log "WARN" "You must be in the root of the dpdk git tree"
+	log "WARN" "You are in $PWD"
+	cleanup_and_exit 1
+fi
+
+log "INFO" "Checking out version $TAG1 of the dpdk"
+# Move to the old version of the tree
+git checkout $TAG1
+
+# Make sure we configure SHARED libraries
+# Also turn off IGB and KNI as those require kernel headers to build
+sed -i -e"$ a\CONFIG_RTE_BUILD_SHARED_LIB=y" config/defconfig_$TARGET
+sed -i -e"$ a\CONFIG_RTE_EAL_IGB_UIO=n" config/defconfig_$TARGET
+sed -i -e"$ a\CONFIG_RTE_LIBRTE_KNI=n" config/defconfig_$TARGET
+
+export EXTRA_CFLAGS=-g
+export EXTRA_LDFLAGS=-g
+
+# Now configure the build
+log "INFO" "Configuring DPDK $TAG1"
+make config T=$TARGET O=$TARGET > $VERBOSE 2>&1
+
+log "INFO" "Building DPDK $TAG1. This might take a moment"
+make O=$TARGET > $VERBOSE 2>&1
+
+if [ $? -ne 0 ]
+then
+	log "INFO" "THE BUILD FAILED.  ABORTING"
+	cleanup_and_exit 1
+fi
+
+# Move to the lib directory
+cd $TARGET/lib
+log "INFO" "COLLECTING ABI INFORMATION FOR $TAG1"
+for i in `ls *.so`
+do
+	$ABIDUMP $i -o $ABI_DIR/$i-ABI-0.dump -lver $TAG1
+done
+cd ../..
+
+# Now clean the tree, checkout the second tag, and rebuild
+git clean -f -d
+git reset --hard
+# Move to the new version of the tree
+log "INFO" "Checking out version $TAG2 of the dpdk"
+git checkout $TAG2
+
+export EXTRA_CFLAGS=-g
+export EXTRA_LDFLAGS=-g
+
+# Make sure we configure SHARED libraries
+# Also turn off IGB and KNI as those require kernel headers to build
+sed -i -e"$ a\CONFIG_RTE_BUILD_SHARED_LIB=y" config/defconfig_$TARGET
+sed -i -e"$ a\CONFIG_RTE_EAL_IGB_UIO=n" config/defconfig_$TARGET
+sed -i -e"$ a\CONFIG_RTE_LIBRTE_KNI=n" config/defconfig_$TARGET
+
+# Now configure the build
+log "INFO" "Configuring DPDK $TAG2"
+make config T=$TARGET O=$TARGET > $VERBOSE 2>&1
+
+log "INFO" "Building DPDK $TAG2. This might take a moment"
+make O=$TARGET > $VERBOSE 2>&1
+
+if [ $? -ne 0 ]
+then
+	log "INFO" "THE BUILD FAILED.  ABORTING"
+	cleanup_and_exit 1
+fi
+
+cd $TARGET/lib
+log "INFO" "COLLECTING ABI INFORMATION FOR $TAG2"
+for i in `ls *.so`
+do
+	$ABIDUMP $i -o $ABI_DIR/$i-ABI-1.dump -lver $TAG2
+done
+cd ../..
+
+# Start comparison of ABI dumps
+for i in `ls $ABI_DIR/*-1.dump`
+do
+	NEWNAME=`basename $i`
+	OLDNAME=`basename $i | sed -e"s/1.dump/0.dump/"`
+	LIBNAME=`basename $i | sed -e"s/-ABI-1.dump//"`
+
+	if [ ! -f $ABI_DIR/$OLDNAME ]
+	then
+		log "INFO" "$OLDNAME DOES NOT EXIST IN $TAG1. SKIPPING..."
+	fi
+
+	#compare the abi dumps
+	$ABICHECK -l $LIBNAME -old $ABI_DIR/$OLDNAME -new $ABI_DIR/$NEWNAME
+done
+
+git reset --hard
+git checkout $CURRENT_BRANCH
+log "INFO" "ABI CHECK COMPLETE.  REPORTS ARE IN compat_report directory"
+cleanup_and_exit 0
+
+
-- 
2.1.0

^ permalink raw reply	[relevance 17%]

* [dpdk-dev] [PATCH] ABI: Add abi checking utility
@ 2015-01-30 21:16 17% Neil Horman
  2015-02-02 18:18 17% ` [dpdk-dev] [PATCH v2] " Neil Horman
  0 siblings, 1 reply; 200+ results
From: Neil Horman @ 2015-01-30 21:16 UTC (permalink / raw)
  To: dev

There was a request for an abi validation utiltyfor the ongoing ABI stability
work.  As it turns out there is a abi compliance checker in development that
seems to be under active development and provides fairly detailed ABI compliance
reports.  Its not yet intellegent enough to understand symbol versioning, but it
does provide the ability to identify symbols which have changed between
releases, along with details of the change, and offers develoeprs the
opportunity to identify which symbols then need versioning and validation for a
given update via manaul testing.

This script automates the use of the compliance checker between two arbitrarily
specified tags within the dpdk tree.  To execute enter the $RTE_SDK directory
and run:

./scripts/validate_abi.sh $GIT_TAG1 $GIT_TAG2 $CONFIG

where $GIT_TAG1 and 2 are git tags and $CONFIG is a config specification
suitable for passing as the T= variable in the make config command.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
---
 scripts/validate_abi.sh | 244 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 244 insertions(+)
 create mode 100755 scripts/validate_abi.sh

diff --git a/scripts/validate_abi.sh b/scripts/validate_abi.sh
new file mode 100755
index 0000000..9ba28da
--- /dev/null
+++ b/scripts/validate_abi.sh
@@ -0,0 +1,244 @@
+#!/bin/sh
+#   BSD LICENSE
+#
+#   Copyright(c) 2015 Neil Horman. All rights reserved.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+TAG1=$1
+TAG2=$2
+TARGET=$3
+ABI_DIR=`mktemp -d -p /tmp ABI.XXXXXX`
+
+usage() {
+	echo "$0 <TAG1> <TAG2> <TARGET>"
+}
+
+log() {
+	local level=$1
+	shift
+	echo "$*"
+}
+
+validate_tags() {
+	git tag -l | grep -q "$TAG1"
+	if [ $? -ne 0 ]
+	then 
+		echo "$TAG1 is invalid"
+		return
+	fi
+	git tag -l | grep -q "$TAG2"
+	if [ $? -ne 0 ]
+	then
+		echo "$TAG2 is invalid"
+		return
+	fi
+}
+
+validate_args() {
+	if [ -z "$TAG1" ]
+	then
+		echo "Must Specify TAG1"
+		return
+	fi
+	if [ -z "$TAG2" ]
+	then	
+		echo "Must Specify TAG2"
+		return
+	fi
+	if [ -z "$TARGET" ]
+	then
+		echo "Must Specify a build target"
+	fi
+}
+
+
+cleanup_and_exit() {
+	rm -rf $ABI_DIR
+	exit $1
+}
+
+###########################################
+#START
+############################################
+
+#Save the current branch
+CURRENT_BRANCH=`git branch | grep \* | cut -d' ' -f2`
+
+if [ -n "$VERBOSE" ]
+then
+	export VERBOSE=/dev/stdout
+else
+	export VERBOSE=/dev/null
+fi
+
+# Validate that we have all the arguments we need
+res=$(validate_args)
+if [ -n "$res" ]
+then
+	echo $res
+	usage
+	cleanup_and_exit 1
+fi
+
+# Make sure our tags exist
+res=$(validate_tags)
+if [ -n "$res" ]
+then
+	echo $res
+	cleanup_and_exit 1
+fi
+
+ABICHECK=`which abi-compliance-checker 2>/dev/null`
+if [ $? -ne 0 ]
+then
+	log "INFO" "Cant find abi-compliance-checker utility"
+	cleanup_and_exit 1
+fi
+
+ABIDUMP=`which abi-dumper 2>/dev/null`
+if [ $? -ne 0 ]
+then
+	log "INFO" "Cant find abi-dumper utility"
+	cleanup_and_exit 1
+fi
+
+log "INFO" "We're going to check and make sure that applications built"
+log "INFO" "against DPDK DSOs from tag $TAG1 will still run when executed"
+log "INFO" "against DPDK DSOs built from tag $TAG2."
+log "INFO" ""
+
+# Check to make sure we have a clean tree
+git status | grep -q clean
+if [ $? -ne 0 ]
+then
+	log "WARN" "Working directory not clean, aborting"
+	cleanup_and_exit 1
+fi
+
+if [ ! -d ./.git ]
+then
+	log "WARN" "You must be in the root of the dpdk git tree"
+	log "WARN" "You are in $PWD"
+	cleanup_and_exit 1
+fi
+
+log "INFO" "Checking out version $TAG1 of the dpdk"
+# Move to the old version of the tree
+git checkout $TAG1
+
+# Make sure we configure SHARED libraries
+# Also turn off IGB and KNI as those require kernel headers to build
+sed -i -e"$ a\CONFIG_RTE_BUILD_SHARED_LIB=y" config/defconfig_$TARGET
+sed -i -e"$ a\CONFIG_RTE_EAL_IGB_UIO=n" config/defconfig_$TARGET
+sed -i -e"$ a\CONFIG_RTE_LIBRTE_KNI=n" config/defconfig_$TARGET
+
+export EXTRA_CFLAGS=-g
+export EXTRA_LDFLAGS=-g
+
+# Now configure the build
+log "INFO" "Configuring DPDK $TAG1"
+make config T=$TARGET O=$TARGET > $VERBOSE 2>&1
+
+log "INFO" "Building DPDK $TAG1. This might take a moment"
+make O=$TARGET > $VERBOSE 2>&1
+
+if [ $? -ne 0 ]
+then
+	log "INFO" "THE BUILD FAILED.  ABORTING"
+	cleanup_and_exit 1
+fi
+
+# Move to the lib directory
+cd $TARGET/lib
+log "INFO" "COlLECTING ABI INFORMATION FOR $TAG1"
+for i in `ls *.so`
+do
+	$ABIDUMP $i -o $ABI_DIR/$i-ABI-0.dump -lver $TAG1
+done
+cd ../..
+
+# Now clean the tree, checkout the second tag, and rebuild
+git clean -f -d
+git reset --hard
+# Move to the new version of the tree
+log "INFO" "Checking out version $TAG2 of the dpdk"
+git checkout $TAG2
+
+export EXTRA_CFLAGS=-g
+export EXTRA_LDFLAGS=-g
+
+# Make sure we configure SHARED libraries
+# Also turn off IGB and KNI as those require kernel headers to build
+sed -i -e"$ a\CONFIG_RTE_BUILD_SHARED_LIB=y" config/defconfig_$TARGET
+sed -i -e"$ a\CONFIG_RTE_EAL_IGB_UIO=n" config/defconfig_$TARGET
+sed -i -e"$ a\CONFIG_RTE_LIBRTE_KNI=n" config/defconfig_$TARGET
+
+# Now configure the build
+log "INFO" "Configuring DPDK $TAG2"
+make config T=$TARGET O=$TARGET > $VERBOSE 2>&1
+
+log "INFO" "Building DPDK $TAG2. This might take a moment"
+make O=$TARGET > $VERBOSE 2>&1
+
+if [ $? -ne 0 ]
+then
+	log "INFO" "THE BUILD FAILED.  ABORTING"
+	cleanup_and_exit 1
+fi
+
+cd $TARGET/lib
+log "INFO" "COlLECTING ABI INFORMATION FOR $TAG2"
+for i in `ls *.so`
+do
+	$ABIDUMP $i -o $ABI_DIR/$i-ABI-1.dump -lver $TAG2 
+done
+cd ../..
+
+# Start comparison of ABI dumps
+for i in `ls $ABI_DIR/*-1.dump`
+do
+	NEWNAME=`basename $i`
+	OLDNAME=`basename $i | sed -e"s/1.dump/0.dump/"`
+	LIBNAME=`basename $i | sed -e"s/-ABI-1.dump//"`
+
+	if [ ! -f $ABI_DIR/$OLDNAME ]
+	then
+		log "INFO" "$OLDNAME DOES NOT EXIST IN $TAG1. SKIPPING..."
+	fi
+
+	#compare the abi dumps
+	$ABICHECK -l $LIBNAME -old $ABI_DIR/$OLDNAME -new $ABI_DIR/$NEWNAME
+done
+
+git reset --hard
+git checkout $CURRENT_BRANCH
+log "INFO" "ABI CHECK COMPLETE.  REPORTS ARE IN compat_report directory"
+cleanup_and_exit 0
+
+
-- 
2.1.0

^ permalink raw reply	[relevance 17%]

* Re: [dpdk-dev] [PATCH 0/8] Improve build process
  2015-01-30 17:38  0%           ` Gonzalez Monroy, Sergio
@ 2015-01-30 18:12  0%             ` Neil Horman
    0 siblings, 1 reply; 200+ results
From: Neil Horman @ 2015-01-30 18:12 UTC (permalink / raw)
  To: Gonzalez Monroy, Sergio; +Cc: dev

On Fri, Jan 30, 2015 at 05:38:49PM +0000, Gonzalez Monroy, Sergio wrote:
> > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > Sent: Friday, January 30, 2015 2:05 PM
> > To: Gonzalez Monroy, Sergio
> > Cc: Thomas Monjalon; dev@dpdk.org
> > Subject: Re: [dpdk-dev] [PATCH 0/8] Improve build process
> > 
> > On Fri, Jan 30, 2015 at 01:39:28PM +0000, Gonzalez Monroy, Sergio wrote:
> > > > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > > > Sent: Thursday, January 29, 2015 7:46 PM
> > > > To: Gonzalez Monroy, Sergio
> > > > Cc: dev@dpdk.org
> > > > Subject: Re: [dpdk-dev] [PATCH 0/8] Improve build process
> > > >
> > > > On Thu, Jan 29, 2015 at 05:04:20PM +0000, Gonzalez Monroy, Sergio
> > wrote:
> > > > > > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > > > > > Sent: Thursday, January 29, 2015 4:39 PM
> > > > > > To: Gonzalez Monroy, Sergio
> > > > > > Cc: dev@dpdk.org
> > > > > > Subject: Re: [dpdk-dev] [PATCH 0/8] Improve build process
> > > > > >
> > > > > > On Thu, Jan 29, 2015 at 03:20:03PM +0000, Sergio Gonzalez Monroy
> > > > wrote:
> > > > > > > This patch series improves the DPDK build system mostly for
> > > > > > > shared libraries (and a few nits for static libraries) with the following
> > goals:
> > > > > > >  - Create a library containing core DPDK libraries (librte_eal,
> > > > > > >    librte_malloc, librte_mempool, librte_mbuf and librte_ring).
> > > > > > >    The idea of core libraries is to group those libraries that are
> > > > > > >    always required (and have interdependencies) for any DPDK
> > > > application.
> > > > > > >  - Remove config option to build a combined library.
> > > > > > >  - For shared libraries, explicitly link against dependant
> > > > > > >    libraries (adding entries to DT_NEEDED).
> > > > > > >  - Update app linking flags for static/shared DPDK libs.
> > > > > > >
> > > > > > > Sergio Gonzalez Monroy (8):
> > > > > > >   mk: remove combined library and related options
> > > > > > >   core: create new librte_core
> > > > > > >   mk: new corelib makefile
> > > > > > >   lib: update DEPDIRS variable
> > > > > > >   lib: set LDLIBS for each library
> > > > > > >   mk: use LDLIBS when linking shared libraries
> > > > > > >   mk: update LDLIBS for app building
> > > > > > >   mk: add -lpthread to linuxapp EXECENV_LDLIBS
> > > > > > >
> > > > > > >  config/common_bsdapp                        |   6 --
> > > > > > >  config/common_linuxapp                      |   6 --
> > > > > > >  config/defconfig_ppc_64-power8-linuxapp-gcc |   2 -
> > > > > > >  lib/Makefile                                |   1 -
> > > > > > >  lib/librte_acl/Makefile                     |   5 +-
> > > > > > >  lib/librte_cfgfile/Makefile                 |   4 +-
> > > > > > >  lib/librte_cmdline/Makefile                 |   6 +-
> > > > > > >  lib/librte_core/Makefile                    |  45 +++++++++++++
> > > > > > >  lib/librte_distributor/Makefile             |   5 +-
> > > > > > >  lib/librte_eal/bsdapp/eal/Makefile          |   3 +-
> > > > > > >  lib/librte_eal/linuxapp/eal/Makefile        |   3 +-
> > > > > > >  lib/librte_ether/Makefile                   |   4 +-
> > > > > > >  lib/librte_hash/Makefile                    |   4 +-
> > > > > > >  lib/librte_ip_frag/Makefile                 |   6 +-
> > > > > > >  lib/librte_ivshmem/Makefile                 |   4 +-
> > > > > > >  lib/librte_kni/Makefile                     |   6 +-
> > > > > > >  lib/librte_kvargs/Makefile                  |   6 +-
> > > > > > >  lib/librte_lpm/Makefile                     |   6 +-
> > > > > > >  lib/librte_malloc/Makefile                  |   2 +-
> > > > > > >  lib/librte_mbuf/Makefile                    |   2 +-
> > > > > > >  lib/librte_mempool/Makefile                 |   2 +-
> > > > > > >  lib/librte_meter/Makefile                   |   4 +-
> > > > > > >  lib/librte_pipeline/Makefile                |   3 +
> > > > > > >  lib/librte_pmd_af_packet/Makefile           |   5 +-
> > > > > > >  lib/librte_pmd_bond/Makefile                |   7 +-
> > > > > > >  lib/librte_pmd_e1000/Makefile               |   8 ++-
> > > > > > >  lib/librte_pmd_enic/Makefile                |   8 ++-
> > > > > > >  lib/librte_pmd_i40e/Makefile                |   8 ++-
> > > > > > >  lib/librte_pmd_ixgbe/Makefile               |   8 ++-
> > > > > > >  lib/librte_pmd_pcap/Makefile                |   5 +-
> > > > > > >  lib/librte_pmd_ring/Makefile                |   6 +-
> > > > > > >  lib/librte_pmd_virtio/Makefile              |   7 +-
> > > > > > >  lib/librte_pmd_vmxnet3/Makefile             |   8 ++-
> > > > > > >  lib/librte_pmd_xenvirt/Makefile             |   8 ++-
> > > > > > >  lib/librte_port/Makefile                    |   8 +--
> > > > > > >  lib/librte_power/Makefile                   |   4 +-
> > > > > > >  lib/librte_ring/Makefile                    |   2 +-
> > > > > > >  lib/librte_sched/Makefile                   |   7 +-
> > > > > > >  lib/librte_table/Makefile                   |   8 +--
> > > > > > >  lib/librte_timer/Makefile                   |   6 +-
> > > > > > >  lib/librte_vhost/Makefile                   |   9 +--
> > > > > > >  mk/exec-env/linuxapp/rte.vars.mk            |   2 +
> > > > > > >  mk/rte.app.mk                               |  53 ++++-----------
> > > > > > >  mk/rte.corelib.mk                           |  84 +++++++++++++++++++++++
> > > > > > >  mk/rte.lib.mk                               |  49 +++-----------
> > > > > > >  mk/rte.sdkbuild.mk                          |   3 -
> > > > > > >  mk/rte.sharelib.mk                          | 101 ----------------------------
> > > > > > >  mk/rte.vars.mk                              |   9 ---
> > > > > > >  48 files changed, 276 insertions(+), 282 deletions(-)  create
> > > > > > > mode
> > > > > > > 100644 lib/librte_core/Makefile  create mode 100644
> > > > > > > mk/rte.corelib.mk delete mode 100644 mk/rte.sharelib.mk
> > > > > > >
> > > > > > > --
> > > > > > > 1.9.3
> > > > > > >
> > > > > > >
> > > > > > Something occured to me thinking about this patch set.  I
> > > > > > noticed recently that different rules are used to build the
> > > > > > shared combined lib from the individual shared objects.  The
> > > > > > implication here is that linker options specified in individual
> > > > > > make files (like the LIBABIVER and EXPORT_MAP options in my ABI
> > > > > > versioning script) get ignored, which is bad.  Any other file
> > > > > > specific linker options (like <file>_LDFLAGS specified in
> > > > > > individual library makefiles are getting
> > > > dropped for the combined lib.
> > > > > >
> > > > > > It seems like it would be better if the combined libs were
> > > > > > manufactured as linker scripts themselves (textfiles that used
> > > > > > linker directives to include individual libraries under the
> > > > > > covers (see
> > > > /lib64/libc.so for an example).
> > > > > >
> > > > > > The disadvantage of such an approach are fairly minimal.  With
> > > > > > such a combined library, you still need to install individual
> > > > > > libraries, but for applications that wish to link and run
> > > > > > against a single dpdk library will still work just as they
> > > > > > currently do, you can link to just a single
> > > > library.
> > > > > >
> > > > > > The advantage is clear however.  By following a linker script
> > > > > > aproach, objects build as separate libraries are built exactly
> > > > > > the same way, using the same rules with the same options.  It
> > > > > > reduces the dpdk build environment size and complexity, and
> > > > > > reduces the opportunity for bugs to creep in from forgetting to
> > > > > > add build options to multiple locations.  It also provides a
> > > > > > more granular approach for grouping files.  Creating a dpdk core
> > > > > > library becomes a matter of creating a one line linker script
> > > > > > named libdpdk_core.so, rather
> > > > than re- arraning sections of the build system.
> > > > > >
> > > > > > Thoughts?
> > > > > > Neil
> > > > > >
> > > > > Hi  Neil,
> > > > >
> > > > > I think that is a very interesting approach.
> > > > > I have tried to do something similar in this patch by removing
> > > > > rte.sharelib.mk and just having rte.lib.mk to do the linking,
> > > > > leaving as you suggest a single file to modify anything related to building
> > libs.
> > > > >
> > > > > I do think however that your proposal is an improvement over the
> > > > > current
> > > > patch.
> > > > >
> > > > > So basically we want:
> > > > > - get rid of rte.corelib.mk
> > > > > - generate librte_core.so linker script grouping core libs
> > > > > - we do not modify DEPDIR variables
> > > > > - when setting LDLIBS to each lib, we do specify -lrte_core, right?
> > > > >
> > > > Exactly, and librte_core.so is really just a text file containing
> > > > the following line
> > > > :
> > > > INPUT(-lrte_malloc -lrte_mbuf -lrte_eal ....)
> > > >
> > > > Adding in whatever libraries you want librte_core to consist of.
> > > > Truthfully, you could almost get rid of the COMBINE_LIBS option
> > > > entirely, and just create this file statically if you wanted to (not
> > > > sure thats the best approach, but its definately do-able).
> > > >
> > > Hi Neil,
> > >
> > > Actually, the first patch series does get rid of COMBINE_LIBS entirely.
> > >
> > Sorry, I didn't mean to imply your patch wasn't, just re-iterating that the
> > option is not needed using the alternate method we're discussing, but I really
> > wasn't very clear on that.
> > 
> > > So as I was looking into this, by using this approach we do not resolve the
> > interdependencies issue of the core libraries.
> > > We would effectively leave all core libraries (or at least EAL) without proper
> > DT_NEEDED entries.
> > >
> > > Thoughts?
> > >
> > You're correct, or at least what you assert is possible, depending on the
> > implementation.  Adding DT_NEEDED entries is something of an orthogonal
> > problem (though your current implementation I think handles it well).  You
> > could specify linker directives when building each library so that each DSO
> > contains the proper DT_NEEDED entries (using -l<lib> and --no-as-needed).
> > using a linker script approach doesn't preclude you from doing that, though
> > its not strictly speaking necessecary.  When you write the linker script, you
> > implicitly specify the link dependencies by the order in whcih you list the
> > inferior libraries in the scripts INPUT line.  It doesn't give you the DT_NEEDED
> > entries, but from an application build/run standpoint, it won't matter,
> > because the libraries will be linked/loaded in the order specified.  You can still
> > do the --no-as-needed method though if you like for safety on the part of
> > those using libraries independently.
> 
> So would it be reasonable to add DT_NEEDED entries to all DPDK libraries but EAL?
> If I understood what you were saying right, we could enforce the 'dependency' in the 
> linker script with something like this:
> $ cat  librte_eal.so
> INPUT( librte_eal.so.1 -lrte_mempool -lrte_malloc)
> We could have such linker script for librte_eal.so instead of the soft link once
> versioning is in place.
> 
Correct.

> Things that would be missing versus the proposed patch:
>  - As I have mention in previous post, ldd info for EAL library would not reflect
>    its dependency to other DPDK libs.
librte_eal.so would no show those dependencies, as far as I know (though I
haven't explicitly checked).  The subordunate libraries included in the input
line, may or may not show dependencies among themselves, depending on your build
setup (and the use of --no-as-needed and -l when linking the individual .so
libraries.

>  - I was enforcing resolving all references when building the libraries (-z defs), so
>    we either remove it altogether or skip eal.
I think thats correct, yes.

>  - All apps would show DT_NEEDED entries for a set of DPDK libraries that
>    in most cases are required (eal, mempool, malloc, mbuf, ring VS dpdk_core)
> 
I think apps linked to libdpdk_core would have DT_NEEDED entries for
libdpdk_core, not the subordonate libraries (though check me on that to be
sure).

> I think that the linker script approach is reasonable if we prefer to go that way
> instead of creating a core library.
> 
I think it would make sense from a build environment point of view, in that it
allows library specific flags to be incorporated properly.  I think the only
downside is that the individual libraries still need to be carried around
(though they can be ignored from an application build/run standpoint).  You're
question should probably be asked of people using COMBINED_LIBS currently to
make sure that meets their needs, though I think it will.

Neil

> Regards,
> Sergio
> 
> > Neil
> > 
> > > Regards,
> > > Sergio
> > >
> > > > Regards
> > > > Neil
> > > >
> > >
> 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 0/8] Improve build process
  2015-01-30 14:05  0%         ` Neil Horman
@ 2015-01-30 17:38  0%           ` Gonzalez Monroy, Sergio
  2015-01-30 18:12  0%             ` Neil Horman
  0 siblings, 1 reply; 200+ results
From: Gonzalez Monroy, Sergio @ 2015-01-30 17:38 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

> From: Neil Horman [mailto:nhorman@tuxdriver.com]
> Sent: Friday, January 30, 2015 2:05 PM
> To: Gonzalez Monroy, Sergio
> Cc: Thomas Monjalon; dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH 0/8] Improve build process
> 
> On Fri, Jan 30, 2015 at 01:39:28PM +0000, Gonzalez Monroy, Sergio wrote:
> > > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > > Sent: Thursday, January 29, 2015 7:46 PM
> > > To: Gonzalez Monroy, Sergio
> > > Cc: dev@dpdk.org
> > > Subject: Re: [dpdk-dev] [PATCH 0/8] Improve build process
> > >
> > > On Thu, Jan 29, 2015 at 05:04:20PM +0000, Gonzalez Monroy, Sergio
> wrote:
> > > > > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > > > > Sent: Thursday, January 29, 2015 4:39 PM
> > > > > To: Gonzalez Monroy, Sergio
> > > > > Cc: dev@dpdk.org
> > > > > Subject: Re: [dpdk-dev] [PATCH 0/8] Improve build process
> > > > >
> > > > > On Thu, Jan 29, 2015 at 03:20:03PM +0000, Sergio Gonzalez Monroy
> > > wrote:
> > > > > > This patch series improves the DPDK build system mostly for
> > > > > > shared libraries (and a few nits for static libraries) with the following
> goals:
> > > > > >  - Create a library containing core DPDK libraries (librte_eal,
> > > > > >    librte_malloc, librte_mempool, librte_mbuf and librte_ring).
> > > > > >    The idea of core libraries is to group those libraries that are
> > > > > >    always required (and have interdependencies) for any DPDK
> > > application.
> > > > > >  - Remove config option to build a combined library.
> > > > > >  - For shared libraries, explicitly link against dependant
> > > > > >    libraries (adding entries to DT_NEEDED).
> > > > > >  - Update app linking flags for static/shared DPDK libs.
> > > > > >
> > > > > > Sergio Gonzalez Monroy (8):
> > > > > >   mk: remove combined library and related options
> > > > > >   core: create new librte_core
> > > > > >   mk: new corelib makefile
> > > > > >   lib: update DEPDIRS variable
> > > > > >   lib: set LDLIBS for each library
> > > > > >   mk: use LDLIBS when linking shared libraries
> > > > > >   mk: update LDLIBS for app building
> > > > > >   mk: add -lpthread to linuxapp EXECENV_LDLIBS
> > > > > >
> > > > > >  config/common_bsdapp                        |   6 --
> > > > > >  config/common_linuxapp                      |   6 --
> > > > > >  config/defconfig_ppc_64-power8-linuxapp-gcc |   2 -
> > > > > >  lib/Makefile                                |   1 -
> > > > > >  lib/librte_acl/Makefile                     |   5 +-
> > > > > >  lib/librte_cfgfile/Makefile                 |   4 +-
> > > > > >  lib/librte_cmdline/Makefile                 |   6 +-
> > > > > >  lib/librte_core/Makefile                    |  45 +++++++++++++
> > > > > >  lib/librte_distributor/Makefile             |   5 +-
> > > > > >  lib/librte_eal/bsdapp/eal/Makefile          |   3 +-
> > > > > >  lib/librte_eal/linuxapp/eal/Makefile        |   3 +-
> > > > > >  lib/librte_ether/Makefile                   |   4 +-
> > > > > >  lib/librte_hash/Makefile                    |   4 +-
> > > > > >  lib/librte_ip_frag/Makefile                 |   6 +-
> > > > > >  lib/librte_ivshmem/Makefile                 |   4 +-
> > > > > >  lib/librte_kni/Makefile                     |   6 +-
> > > > > >  lib/librte_kvargs/Makefile                  |   6 +-
> > > > > >  lib/librte_lpm/Makefile                     |   6 +-
> > > > > >  lib/librte_malloc/Makefile                  |   2 +-
> > > > > >  lib/librte_mbuf/Makefile                    |   2 +-
> > > > > >  lib/librte_mempool/Makefile                 |   2 +-
> > > > > >  lib/librte_meter/Makefile                   |   4 +-
> > > > > >  lib/librte_pipeline/Makefile                |   3 +
> > > > > >  lib/librte_pmd_af_packet/Makefile           |   5 +-
> > > > > >  lib/librte_pmd_bond/Makefile                |   7 +-
> > > > > >  lib/librte_pmd_e1000/Makefile               |   8 ++-
> > > > > >  lib/librte_pmd_enic/Makefile                |   8 ++-
> > > > > >  lib/librte_pmd_i40e/Makefile                |   8 ++-
> > > > > >  lib/librte_pmd_ixgbe/Makefile               |   8 ++-
> > > > > >  lib/librte_pmd_pcap/Makefile                |   5 +-
> > > > > >  lib/librte_pmd_ring/Makefile                |   6 +-
> > > > > >  lib/librte_pmd_virtio/Makefile              |   7 +-
> > > > > >  lib/librte_pmd_vmxnet3/Makefile             |   8 ++-
> > > > > >  lib/librte_pmd_xenvirt/Makefile             |   8 ++-
> > > > > >  lib/librte_port/Makefile                    |   8 +--
> > > > > >  lib/librte_power/Makefile                   |   4 +-
> > > > > >  lib/librte_ring/Makefile                    |   2 +-
> > > > > >  lib/librte_sched/Makefile                   |   7 +-
> > > > > >  lib/librte_table/Makefile                   |   8 +--
> > > > > >  lib/librte_timer/Makefile                   |   6 +-
> > > > > >  lib/librte_vhost/Makefile                   |   9 +--
> > > > > >  mk/exec-env/linuxapp/rte.vars.mk            |   2 +
> > > > > >  mk/rte.app.mk                               |  53 ++++-----------
> > > > > >  mk/rte.corelib.mk                           |  84 +++++++++++++++++++++++
> > > > > >  mk/rte.lib.mk                               |  49 +++-----------
> > > > > >  mk/rte.sdkbuild.mk                          |   3 -
> > > > > >  mk/rte.sharelib.mk                          | 101 ----------------------------
> > > > > >  mk/rte.vars.mk                              |   9 ---
> > > > > >  48 files changed, 276 insertions(+), 282 deletions(-)  create
> > > > > > mode
> > > > > > 100644 lib/librte_core/Makefile  create mode 100644
> > > > > > mk/rte.corelib.mk delete mode 100644 mk/rte.sharelib.mk
> > > > > >
> > > > > > --
> > > > > > 1.9.3
> > > > > >
> > > > > >
> > > > > Something occured to me thinking about this patch set.  I
> > > > > noticed recently that different rules are used to build the
> > > > > shared combined lib from the individual shared objects.  The
> > > > > implication here is that linker options specified in individual
> > > > > make files (like the LIBABIVER and EXPORT_MAP options in my ABI
> > > > > versioning script) get ignored, which is bad.  Any other file
> > > > > specific linker options (like <file>_LDFLAGS specified in
> > > > > individual library makefiles are getting
> > > dropped for the combined lib.
> > > > >
> > > > > It seems like it would be better if the combined libs were
> > > > > manufactured as linker scripts themselves (textfiles that used
> > > > > linker directives to include individual libraries under the
> > > > > covers (see
> > > /lib64/libc.so for an example).
> > > > >
> > > > > The disadvantage of such an approach are fairly minimal.  With
> > > > > such a combined library, you still need to install individual
> > > > > libraries, but for applications that wish to link and run
> > > > > against a single dpdk library will still work just as they
> > > > > currently do, you can link to just a single
> > > library.
> > > > >
> > > > > The advantage is clear however.  By following a linker script
> > > > > aproach, objects build as separate libraries are built exactly
> > > > > the same way, using the same rules with the same options.  It
> > > > > reduces the dpdk build environment size and complexity, and
> > > > > reduces the opportunity for bugs to creep in from forgetting to
> > > > > add build options to multiple locations.  It also provides a
> > > > > more granular approach for grouping files.  Creating a dpdk core
> > > > > library becomes a matter of creating a one line linker script
> > > > > named libdpdk_core.so, rather
> > > than re- arraning sections of the build system.
> > > > >
> > > > > Thoughts?
> > > > > Neil
> > > > >
> > > > Hi  Neil,
> > > >
> > > > I think that is a very interesting approach.
> > > > I have tried to do something similar in this patch by removing
> > > > rte.sharelib.mk and just having rte.lib.mk to do the linking,
> > > > leaving as you suggest a single file to modify anything related to building
> libs.
> > > >
> > > > I do think however that your proposal is an improvement over the
> > > > current
> > > patch.
> > > >
> > > > So basically we want:
> > > > - get rid of rte.corelib.mk
> > > > - generate librte_core.so linker script grouping core libs
> > > > - we do not modify DEPDIR variables
> > > > - when setting LDLIBS to each lib, we do specify -lrte_core, right?
> > > >
> > > Exactly, and librte_core.so is really just a text file containing
> > > the following line
> > > :
> > > INPUT(-lrte_malloc -lrte_mbuf -lrte_eal ....)
> > >
> > > Adding in whatever libraries you want librte_core to consist of.
> > > Truthfully, you could almost get rid of the COMBINE_LIBS option
> > > entirely, and just create this file statically if you wanted to (not
> > > sure thats the best approach, but its definately do-able).
> > >
> > Hi Neil,
> >
> > Actually, the first patch series does get rid of COMBINE_LIBS entirely.
> >
> Sorry, I didn't mean to imply your patch wasn't, just re-iterating that the
> option is not needed using the alternate method we're discussing, but I really
> wasn't very clear on that.
> 
> > So as I was looking into this, by using this approach we do not resolve the
> interdependencies issue of the core libraries.
> > We would effectively leave all core libraries (or at least EAL) without proper
> DT_NEEDED entries.
> >
> > Thoughts?
> >
> You're correct, or at least what you assert is possible, depending on the
> implementation.  Adding DT_NEEDED entries is something of an orthogonal
> problem (though your current implementation I think handles it well).  You
> could specify linker directives when building each library so that each DSO
> contains the proper DT_NEEDED entries (using -l<lib> and --no-as-needed).
> using a linker script approach doesn't preclude you from doing that, though
> its not strictly speaking necessecary.  When you write the linker script, you
> implicitly specify the link dependencies by the order in whcih you list the
> inferior libraries in the scripts INPUT line.  It doesn't give you the DT_NEEDED
> entries, but from an application build/run standpoint, it won't matter,
> because the libraries will be linked/loaded in the order specified.  You can still
> do the --no-as-needed method though if you like for safety on the part of
> those using libraries independently.

So would it be reasonable to add DT_NEEDED entries to all DPDK libraries but EAL?
If I understood what you were saying right, we could enforce the 'dependency' in the 
linker script with something like this:
$ cat  librte_eal.so
INPUT( librte_eal.so.1 -lrte_mempool -lrte_malloc)

We could have such linker script for librte_eal.so instead of the soft link once
versioning is in place.

Things that would be missing versus the proposed patch:
 - As I have mention in previous post, ldd info for EAL library would not reflect
   its dependency to other DPDK libs.
 - I was enforcing resolving all references when building the libraries (-z defs), so
   we either remove it altogether or skip eal.
 - All apps would show DT_NEEDED entries for a set of DPDK libraries that
   in most cases are required (eal, mempool, malloc, mbuf, ring VS dpdk_core)

I think that the linker script approach is reasonable if we prefer to go that way
instead of creating a core library.

Regards,
Sergio

> Neil
> 
> > Regards,
> > Sergio
> >
> > > Regards
> > > Neil
> > >
> >

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v4 1/4] compat: Add infrastructure to support symbol versioning
  2015-01-15 19:35  3% ` [dpdk-dev] [PATCH v4 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
  2015-01-15 19:35  7%   ` [dpdk-dev] [PATCH v4 3/4] Add library version extenstion Neil Horman
  2015-01-15 19:35 23%   ` [dpdk-dev] [PATCH v4 4/4] docs: Add ABI documentation Neil Horman
@ 2015-01-30 17:13  3%   ` Gray, Mark D
  2 siblings, 0 replies; 200+ results
From: Gray, Mark D @ 2015-01-30 17:13 UTC (permalink / raw)
  To: Neil Horman, dev

I agree in principle with this patchset. OVS links with DPDK and providing stability in the ABI/API (and the Policy to manage this) makes deployment easier for OVS when linking with shared dpdk libs. It should also be easy for us to track changes in the API through the deprecation notices making development easier! 

Good job.

Acked-by: Mark D. Gray <mark.d.gray@intel.com>

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> Sent: Thursday, January 15, 2015 7:35 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v4 1/4] compat: Add infrastructure to support
> symbol versioning
> 
> Add initial pass header files to support symbol versioning.
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> CC: "Gonzalez Monroy, Sergio" <sergio.gonzalez.monroy@intel.com>
> 
> ---
> Change Notes:
> V2)
> 	Moved ifeq to _INSTALL target
> 
> V3)
> 	Undo V2 changes and make librte_compat use the rte.install.mk file
> instead
> 
> v4)
> 	changed --version-script to accept SRCDIR in this patch at per request
> 	documented versioning macros
> 	cleaned up macro parameter consistency
> 	converted SA macro to RTE_STR macro
> 	fixed copyright
> ---
>  lib/Makefile                   |   1 +
>  lib/librte_compat/Makefile     |  38 +++++++++++++
>  lib/librte_compat/rte_compat.h | 117
> +++++++++++++++++++++++++++++++++++++++++
>  mk/rte.lib.mk                  |   4 ++
>  4 files changed, 160 insertions(+)
>  create mode 100644 lib/librte_compat/Makefile  create mode 100644
> lib/librte_compat/rte_compat.h
> 
> diff --git a/lib/Makefile b/lib/Makefile index 0ffc982..d617d81 100644
> --- a/lib/Makefile
> +++ b/lib/Makefile
> @@ -31,6 +31,7 @@
> 
>  include $(RTE_SDK)/mk/rte.vars.mk
> 
> +DIRS-y += librte_compat
>  DIRS-$(CONFIG_RTE_LIBRTE_EAL) += librte_eal
>  DIRS-$(CONFIG_RTE_LIBRTE_MALLOC) += librte_malloc
>  DIRS-$(CONFIG_RTE_LIBRTE_RING) += librte_ring diff --git
> a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile new file mode
> 100644 index 0000000..0bab870
> --- /dev/null
> +++ b/lib/librte_compat/Makefile
> @@ -0,0 +1,38 @@
> +#   BSD LICENSE
> +#
> +#   Copyright(c) 2013 Neil Horman <nhorman@tuxdriver.com>
> +#   All rights reserved.
> +#
> +#   Redistribution and use in source and binary forms, with or without
> +#   modification, are permitted provided that the following conditions
> +#   are met:
> +#
> +#     * Redistributions of source code must retain the above copyright
> +#       notice, this list of conditions and the following disclaimer.
> +#     * Redistributions in binary form must reproduce the above copyright
> +#       notice, this list of conditions and the following disclaimer in
> +#       the documentation and/or other materials provided with the
> +#       distribution.
> +#     * Neither the name of Intel Corporation nor the names of its
> +#       contributors may be used to endorse or promote products derived
> +#       from this software without specific prior written permission.
> +#
> +#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
> CONTRIBUTORS
> +#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
> NOT
> +#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
> FITNESS FOR
> +#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
> COPYRIGHT
> +#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
> INCIDENTAL,
> +#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> NOT
> +#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
> OF USE,
> +#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
> AND ON ANY
> +#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
> TORT
> +#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
> THE USE
> +#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
> DAMAGE.
> +
> +include $(RTE_SDK)/mk/rte.vars.mk
> +
> +
> +# install includes
> +SYMLINK-y-include := rte_compat.h
> +
> +include $(RTE_SDK)/mk/rte.install.mk
> diff --git a/lib/librte_compat/rte_compat.h
> b/lib/librte_compat/rte_compat.h new file mode 100644 index
> 0000000..d7cc176
> --- /dev/null
> +++ b/lib/librte_compat/rte_compat.h
> @@ -0,0 +1,117 @@
> +/*-
> + *   BSD LICENSE
> + *
> + *   Copyright(c) 2010 Neil Horman <nhorman@tuxdriver.com>.
> + *   All rights reserved.
> + *
> + *   Redistribution and use in source and binary forms, with or without
> + *   modification, are permitted provided that the following conditions
> + *   are met:
> + *
> + *     * Redistributions of source code must retain the above copyright
> + *       notice, this list of conditions and the following disclaimer.
> + *     * Redistributions in binary form must reproduce the above copyright
> + *       notice, this list of conditions and the following disclaimer in
> + *       the documentation and/or other materials provided with the
> + *       distribution.
> + *     * Neither the name of Intel Corporation nor the names of its
> + *       contributors may be used to endorse or promote products derived
> + *       from this software without specific prior written permission.
> + *
> + *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
> CONTRIBUTORS
> + *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
> NOT
> + *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
> FITNESS FOR
> + *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
> COPYRIGHT
> + *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
> INCIDENTAL,
> + *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> NOT
> + *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
> OF USE,
> + *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
> AND ON ANY
> + *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
> TORT
> + *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
> THE USE
> + *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
> DAMAGE.
> + */
> +
> +#ifndef _RTE_COMPAT_H_
> +#define _RTE_COMPAT_H_
> +#include <rte_common.h>
> +
> +#ifdef RTE_BUILD_SHARED_LIB
> +
> +/*
> + * Provides backwards compatibility when updating exported functions.
> + * When a symol is exported from a library to provide an API, it also
> +provides a
> + * calling convention (ABI) that is embodied in its name, return type,
> + * arguments, etc.  On occasion that function may need to change to
> +accomodate
> + * new functionality, behavior, etc.  When that occurs, it is
> +desireable to
> + * allow for backwards compatibility for a time with older binaries
> +that are
> + * dynamically linked to the dpdk.  To support that, the __vsym and
> + * VERSION_SYMBOL macros are created.  They, in conjunction with the
> + * <library>_version.map file for a given library allow for multiple
> +versions of
> + * a symbol to exist in a shared library so that older binaries need
> +not be
> + * immediately recompiled. Their use is outlined in the following example:
> + * Assumptions: DPDK 1.(X) contains a function int foo(char *string)
> + *              DPDK 1.(X+1) needs to change foo to be int foo(int index)
> + *
> + * To accomplish this:
> + * 1) Edit lib/<library>/library_version.map to add a DPDK_1.(X+1)
> +node, in which
> + * foo is exported as a global symbol.
> + *
> + * 2) rename the existing function int foo(char *string) to
> + * 	int __vsym foo_v18(char *string)
> + *
> + * 3) Add this macro immediately below the function
> + * 	VERSION_SYMBOL(foo, _v18, 1.8);
> + *
> + * 4) Implement a new version of foo.
> + * 	char foo(int value, int otherval) { ...}
> + *
> + * 5) Mark the newest version as the default version
> + * 	BIND_DEFAULT_SYMBOL(foo, 1.9);
> + *
> + */
> +
> +/*
> + * Macro Parameters:
> + * b - function base name
> + * e - function version extension, to be concatenated with base name
> + * n - function symbol version string to be applied  */
> +
> +/*
> + * VERSION_SYMBOL
> + * Creates a symbol version table entry binding symbol <b>@DPDK_<n> to
> +the internal
> + * function name <b>_<e>
> + */
> +#define VERSION_SYMBOL(b, e, n) __asm__(".symver " RTE_STR(b)
> +RTE_STR(e) ", "RTE_STR(b)"@DPDK_"RTE_STR(n))
> +
> +/*
> + * BASE_SYMBOL
> + * Creates a symbol version table entry binding unversioned symbol <b>
> + * to the internal function <b>_<e>
> + */
> +#define BASE_SYMBOL(b, e) __asm__(".symver " RTE_STR(b) RTE_STR(e) ",
> +"RTE_STR(b)"@")
> +
> +/*
> + * BNID_DEFAULT_SYMBOL
> + * Creates a symbol version entry instructing the linker to bind
> +references to
> + * symbol <b> to the internal symbol <b>_<e>  */ #define
> +BIND_DEFAULT_SYMBOL(b, e, n) __asm__(".symver " RTE_STR(b)
> RTE_STR(e)
> +", "RTE_STR(b)"@@DPDK_"RTE_STR(n)) #define __vsym
> __attribute__((used))
> +
> +#else
> +/*
> + * No symbol versioning in use
> + */
> +#define VERSION_SYMBOL(b, e, v)
> +#define __vsym
> +#define BASE_SYMBOL(b, n)
> +#define BIND_DEFAULT_SYMBOL(b, v)
> +
> +/*
> + * RTE_BUILD_SHARED_LIB=n
> + */
> +#endif
> +
> +
> +#endif /* _RTE_COMPAT_H_ */
> diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk index 81bf8e1..1d3b646 100644
> --- a/mk/rte.lib.mk
> +++ b/mk/rte.lib.mk
> @@ -40,8 +40,12 @@ VPATH += $(SRCDIR)
> 
>  ifeq ($(RTE_BUILD_SHARED_LIB),y)
>  LIB := $(patsubst %.a,%.so,$(LIB))
> +
> +CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
> +
>  endif
> 
> +
>  _BUILD = $(LIB)
>  _INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y)
> $(RTE_OUTPUT)/lib/$(LIB)  _CLEAN = doclean
> --
> 2.1.0

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH 0/8] Improve build process
  2015-01-30 13:39  0%       ` Gonzalez Monroy, Sergio
@ 2015-01-30 14:05  0%         ` Neil Horman
  2015-01-30 17:38  0%           ` Gonzalez Monroy, Sergio
  0 siblings, 1 reply; 200+ results
From: Neil Horman @ 2015-01-30 14:05 UTC (permalink / raw)
  To: Gonzalez Monroy, Sergio; +Cc: dev

On Fri, Jan 30, 2015 at 01:39:28PM +0000, Gonzalez Monroy, Sergio wrote:
> > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > Sent: Thursday, January 29, 2015 7:46 PM
> > To: Gonzalez Monroy, Sergio
> > Cc: dev@dpdk.org
> > Subject: Re: [dpdk-dev] [PATCH 0/8] Improve build process
> > 
> > On Thu, Jan 29, 2015 at 05:04:20PM +0000, Gonzalez Monroy, Sergio wrote:
> > > > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > > > Sent: Thursday, January 29, 2015 4:39 PM
> > > > To: Gonzalez Monroy, Sergio
> > > > Cc: dev@dpdk.org
> > > > Subject: Re: [dpdk-dev] [PATCH 0/8] Improve build process
> > > >
> > > > On Thu, Jan 29, 2015 at 03:20:03PM +0000, Sergio Gonzalez Monroy
> > wrote:
> > > > > This patch series improves the DPDK build system mostly for shared
> > > > > libraries (and a few nits for static libraries) with the following goals:
> > > > >  - Create a library containing core DPDK libraries (librte_eal,
> > > > >    librte_malloc, librte_mempool, librte_mbuf and librte_ring).
> > > > >    The idea of core libraries is to group those libraries that are
> > > > >    always required (and have interdependencies) for any DPDK
> > application.
> > > > >  - Remove config option to build a combined library.
> > > > >  - For shared libraries, explicitly link against dependant
> > > > >    libraries (adding entries to DT_NEEDED).
> > > > >  - Update app linking flags for static/shared DPDK libs.
> > > > >
> > > > > Sergio Gonzalez Monroy (8):
> > > > >   mk: remove combined library and related options
> > > > >   core: create new librte_core
> > > > >   mk: new corelib makefile
> > > > >   lib: update DEPDIRS variable
> > > > >   lib: set LDLIBS for each library
> > > > >   mk: use LDLIBS when linking shared libraries
> > > > >   mk: update LDLIBS for app building
> > > > >   mk: add -lpthread to linuxapp EXECENV_LDLIBS
> > > > >
> > > > >  config/common_bsdapp                        |   6 --
> > > > >  config/common_linuxapp                      |   6 --
> > > > >  config/defconfig_ppc_64-power8-linuxapp-gcc |   2 -
> > > > >  lib/Makefile                                |   1 -
> > > > >  lib/librte_acl/Makefile                     |   5 +-
> > > > >  lib/librte_cfgfile/Makefile                 |   4 +-
> > > > >  lib/librte_cmdline/Makefile                 |   6 +-
> > > > >  lib/librte_core/Makefile                    |  45 +++++++++++++
> > > > >  lib/librte_distributor/Makefile             |   5 +-
> > > > >  lib/librte_eal/bsdapp/eal/Makefile          |   3 +-
> > > > >  lib/librte_eal/linuxapp/eal/Makefile        |   3 +-
> > > > >  lib/librte_ether/Makefile                   |   4 +-
> > > > >  lib/librte_hash/Makefile                    |   4 +-
> > > > >  lib/librte_ip_frag/Makefile                 |   6 +-
> > > > >  lib/librte_ivshmem/Makefile                 |   4 +-
> > > > >  lib/librte_kni/Makefile                     |   6 +-
> > > > >  lib/librte_kvargs/Makefile                  |   6 +-
> > > > >  lib/librte_lpm/Makefile                     |   6 +-
> > > > >  lib/librte_malloc/Makefile                  |   2 +-
> > > > >  lib/librte_mbuf/Makefile                    |   2 +-
> > > > >  lib/librte_mempool/Makefile                 |   2 +-
> > > > >  lib/librte_meter/Makefile                   |   4 +-
> > > > >  lib/librte_pipeline/Makefile                |   3 +
> > > > >  lib/librte_pmd_af_packet/Makefile           |   5 +-
> > > > >  lib/librte_pmd_bond/Makefile                |   7 +-
> > > > >  lib/librte_pmd_e1000/Makefile               |   8 ++-
> > > > >  lib/librte_pmd_enic/Makefile                |   8 ++-
> > > > >  lib/librte_pmd_i40e/Makefile                |   8 ++-
> > > > >  lib/librte_pmd_ixgbe/Makefile               |   8 ++-
> > > > >  lib/librte_pmd_pcap/Makefile                |   5 +-
> > > > >  lib/librte_pmd_ring/Makefile                |   6 +-
> > > > >  lib/librte_pmd_virtio/Makefile              |   7 +-
> > > > >  lib/librte_pmd_vmxnet3/Makefile             |   8 ++-
> > > > >  lib/librte_pmd_xenvirt/Makefile             |   8 ++-
> > > > >  lib/librte_port/Makefile                    |   8 +--
> > > > >  lib/librte_power/Makefile                   |   4 +-
> > > > >  lib/librte_ring/Makefile                    |   2 +-
> > > > >  lib/librte_sched/Makefile                   |   7 +-
> > > > >  lib/librte_table/Makefile                   |   8 +--
> > > > >  lib/librte_timer/Makefile                   |   6 +-
> > > > >  lib/librte_vhost/Makefile                   |   9 +--
> > > > >  mk/exec-env/linuxapp/rte.vars.mk            |   2 +
> > > > >  mk/rte.app.mk                               |  53 ++++-----------
> > > > >  mk/rte.corelib.mk                           |  84 +++++++++++++++++++++++
> > > > >  mk/rte.lib.mk                               |  49 +++-----------
> > > > >  mk/rte.sdkbuild.mk                          |   3 -
> > > > >  mk/rte.sharelib.mk                          | 101 ----------------------------
> > > > >  mk/rte.vars.mk                              |   9 ---
> > > > >  48 files changed, 276 insertions(+), 282 deletions(-)  create
> > > > > mode
> > > > > 100644 lib/librte_core/Makefile  create mode 100644
> > > > > mk/rte.corelib.mk delete mode 100644 mk/rte.sharelib.mk
> > > > >
> > > > > --
> > > > > 1.9.3
> > > > >
> > > > >
> > > > Something occured to me thinking about this patch set.  I noticed
> > > > recently that different rules are used to build the shared combined
> > > > lib from the individual shared objects.  The implication here is
> > > > that linker options specified in individual make files (like the
> > > > LIBABIVER and EXPORT_MAP options in my ABI versioning script) get
> > > > ignored, which is bad.  Any other file specific linker options (like
> > > > <file>_LDFLAGS specified in individual library makefiles are getting
> > dropped for the combined lib.
> > > >
> > > > It seems like it would be better if the combined libs were
> > > > manufactured as linker scripts themselves (textfiles that used
> > > > linker directives to include individual libraries under the covers (see
> > /lib64/libc.so for an example).
> > > >
> > > > The disadvantage of such an approach are fairly minimal.  With such
> > > > a combined library, you still need to install individual libraries,
> > > > but for applications that wish to link and run against a single dpdk
> > > > library will still work just as they currently do, you can link to just a single
> > library.
> > > >
> > > > The advantage is clear however.  By following a linker script
> > > > aproach, objects build as separate libraries are built exactly the
> > > > same way, using the same rules with the same options.  It reduces
> > > > the dpdk build environment size and complexity, and reduces the
> > > > opportunity for bugs to creep in from forgetting to add build
> > > > options to multiple locations.  It also provides a more granular
> > > > approach for grouping files.  Creating a dpdk core library becomes a
> > > > matter of creating a one line linker script named libdpdk_core.so, rather
> > than re- arraning sections of the build system.
> > > >
> > > > Thoughts?
> > > > Neil
> > > >
> > > Hi  Neil,
> > >
> > > I think that is a very interesting approach.
> > > I have tried to do something similar in this patch by removing
> > > rte.sharelib.mk and just having rte.lib.mk to do the linking, leaving
> > > as you suggest a single file to modify anything related to building libs.
> > >
> > > I do think however that your proposal is an improvement over the current
> > patch.
> > >
> > > So basically we want:
> > > - get rid of rte.corelib.mk
> > > - generate librte_core.so linker script grouping core libs
> > > - we do not modify DEPDIR variables
> > > - when setting LDLIBS to each lib, we do specify -lrte_core, right?
> > >
> > Exactly, and librte_core.so is really just a text file containing the following line
> > :
> > INPUT(-lrte_malloc -lrte_mbuf -lrte_eal ....)
> > 
> > Adding in whatever libraries you want librte_core to consist of.  Truthfully,
> > you could almost get rid of the COMBINE_LIBS option entirely, and just
> > create this file statically if you wanted to (not sure thats the best approach,
> > but its definately do-able).
> > 
> Hi Neil,
> 
> Actually, the first patch series does get rid of COMBINE_LIBS entirely.
> 
Sorry, I didn't mean to imply your patch wasn't, just re-iterating that the
option is not needed using the alternate method we're discussing, but I really
wasn't very clear on that.

> So as I was looking into this, by using this approach we do not resolve the interdependencies issue of the core libraries.
> We would effectively leave all core libraries (or at least EAL) without proper DT_NEEDED entries.
> 
> Thoughts?
> 
You're correct, or at least what you assert is possible, depending on the
implementation.  Adding DT_NEEDED entries is something of an orthogonal problem
(though your current implementation I think handles it well).  You could specify
linker directives when building each library so that each DSO contains the
proper DT_NEEDED entries (using -l<lib> and --no-as-needed).  using a linker
script approach doesn't preclude you from doing that, though its not strictly
speaking necessecary.  When you write the linker script, you implicitly specify
the link dependencies by the order in whcih you list the inferior libraries in
the scripts INPUT line.  It doesn't give you the DT_NEEDED entries, but from an
application build/run standpoint, it won't matter, because the libraries will be
linked/loaded in the order specified.  You can still do the --no-as-needed
method though if you like for safety on the part of those using libraries
independently.
Neil

> Regards,
> Sergio
> 
> > Regards
> > Neil
> > 
> 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 0/8] Improve build process
  2015-01-29 19:45  0%     ` Neil Horman
@ 2015-01-30 13:39  0%       ` Gonzalez Monroy, Sergio
  2015-01-30 14:05  0%         ` Neil Horman
  0 siblings, 1 reply; 200+ results
From: Gonzalez Monroy, Sergio @ 2015-01-30 13:39 UTC (permalink / raw)
  To: Neil Horman, Thomas Monjalon; +Cc: dev

> From: Neil Horman [mailto:nhorman@tuxdriver.com]
> Sent: Thursday, January 29, 2015 7:46 PM
> To: Gonzalez Monroy, Sergio
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH 0/8] Improve build process
> 
> On Thu, Jan 29, 2015 at 05:04:20PM +0000, Gonzalez Monroy, Sergio wrote:
> > > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > > Sent: Thursday, January 29, 2015 4:39 PM
> > > To: Gonzalez Monroy, Sergio
> > > Cc: dev@dpdk.org
> > > Subject: Re: [dpdk-dev] [PATCH 0/8] Improve build process
> > >
> > > On Thu, Jan 29, 2015 at 03:20:03PM +0000, Sergio Gonzalez Monroy
> wrote:
> > > > This patch series improves the DPDK build system mostly for shared
> > > > libraries (and a few nits for static libraries) with the following goals:
> > > >  - Create a library containing core DPDK libraries (librte_eal,
> > > >    librte_malloc, librte_mempool, librte_mbuf and librte_ring).
> > > >    The idea of core libraries is to group those libraries that are
> > > >    always required (and have interdependencies) for any DPDK
> application.
> > > >  - Remove config option to build a combined library.
> > > >  - For shared libraries, explicitly link against dependant
> > > >    libraries (adding entries to DT_NEEDED).
> > > >  - Update app linking flags for static/shared DPDK libs.
> > > >
> > > > Sergio Gonzalez Monroy (8):
> > > >   mk: remove combined library and related options
> > > >   core: create new librte_core
> > > >   mk: new corelib makefile
> > > >   lib: update DEPDIRS variable
> > > >   lib: set LDLIBS for each library
> > > >   mk: use LDLIBS when linking shared libraries
> > > >   mk: update LDLIBS for app building
> > > >   mk: add -lpthread to linuxapp EXECENV_LDLIBS
> > > >
> > > >  config/common_bsdapp                        |   6 --
> > > >  config/common_linuxapp                      |   6 --
> > > >  config/defconfig_ppc_64-power8-linuxapp-gcc |   2 -
> > > >  lib/Makefile                                |   1 -
> > > >  lib/librte_acl/Makefile                     |   5 +-
> > > >  lib/librte_cfgfile/Makefile                 |   4 +-
> > > >  lib/librte_cmdline/Makefile                 |   6 +-
> > > >  lib/librte_core/Makefile                    |  45 +++++++++++++
> > > >  lib/librte_distributor/Makefile             |   5 +-
> > > >  lib/librte_eal/bsdapp/eal/Makefile          |   3 +-
> > > >  lib/librte_eal/linuxapp/eal/Makefile        |   3 +-
> > > >  lib/librte_ether/Makefile                   |   4 +-
> > > >  lib/librte_hash/Makefile                    |   4 +-
> > > >  lib/librte_ip_frag/Makefile                 |   6 +-
> > > >  lib/librte_ivshmem/Makefile                 |   4 +-
> > > >  lib/librte_kni/Makefile                     |   6 +-
> > > >  lib/librte_kvargs/Makefile                  |   6 +-
> > > >  lib/librte_lpm/Makefile                     |   6 +-
> > > >  lib/librte_malloc/Makefile                  |   2 +-
> > > >  lib/librte_mbuf/Makefile                    |   2 +-
> > > >  lib/librte_mempool/Makefile                 |   2 +-
> > > >  lib/librte_meter/Makefile                   |   4 +-
> > > >  lib/librte_pipeline/Makefile                |   3 +
> > > >  lib/librte_pmd_af_packet/Makefile           |   5 +-
> > > >  lib/librte_pmd_bond/Makefile                |   7 +-
> > > >  lib/librte_pmd_e1000/Makefile               |   8 ++-
> > > >  lib/librte_pmd_enic/Makefile                |   8 ++-
> > > >  lib/librte_pmd_i40e/Makefile                |   8 ++-
> > > >  lib/librte_pmd_ixgbe/Makefile               |   8 ++-
> > > >  lib/librte_pmd_pcap/Makefile                |   5 +-
> > > >  lib/librte_pmd_ring/Makefile                |   6 +-
> > > >  lib/librte_pmd_virtio/Makefile              |   7 +-
> > > >  lib/librte_pmd_vmxnet3/Makefile             |   8 ++-
> > > >  lib/librte_pmd_xenvirt/Makefile             |   8 ++-
> > > >  lib/librte_port/Makefile                    |   8 +--
> > > >  lib/librte_power/Makefile                   |   4 +-
> > > >  lib/librte_ring/Makefile                    |   2 +-
> > > >  lib/librte_sched/Makefile                   |   7 +-
> > > >  lib/librte_table/Makefile                   |   8 +--
> > > >  lib/librte_timer/Makefile                   |   6 +-
> > > >  lib/librte_vhost/Makefile                   |   9 +--
> > > >  mk/exec-env/linuxapp/rte.vars.mk            |   2 +
> > > >  mk/rte.app.mk                               |  53 ++++-----------
> > > >  mk/rte.corelib.mk                           |  84 +++++++++++++++++++++++
> > > >  mk/rte.lib.mk                               |  49 +++-----------
> > > >  mk/rte.sdkbuild.mk                          |   3 -
> > > >  mk/rte.sharelib.mk                          | 101 ----------------------------
> > > >  mk/rte.vars.mk                              |   9 ---
> > > >  48 files changed, 276 insertions(+), 282 deletions(-)  create
> > > > mode
> > > > 100644 lib/librte_core/Makefile  create mode 100644
> > > > mk/rte.corelib.mk delete mode 100644 mk/rte.sharelib.mk
> > > >
> > > > --
> > > > 1.9.3
> > > >
> > > >
> > > Something occured to me thinking about this patch set.  I noticed
> > > recently that different rules are used to build the shared combined
> > > lib from the individual shared objects.  The implication here is
> > > that linker options specified in individual make files (like the
> > > LIBABIVER and EXPORT_MAP options in my ABI versioning script) get
> > > ignored, which is bad.  Any other file specific linker options (like
> > > <file>_LDFLAGS specified in individual library makefiles are getting
> dropped for the combined lib.
> > >
> > > It seems like it would be better if the combined libs were
> > > manufactured as linker scripts themselves (textfiles that used
> > > linker directives to include individual libraries under the covers (see
> /lib64/libc.so for an example).
> > >
> > > The disadvantage of such an approach are fairly minimal.  With such
> > > a combined library, you still need to install individual libraries,
> > > but for applications that wish to link and run against a single dpdk
> > > library will still work just as they currently do, you can link to just a single
> library.
> > >
> > > The advantage is clear however.  By following a linker script
> > > aproach, objects build as separate libraries are built exactly the
> > > same way, using the same rules with the same options.  It reduces
> > > the dpdk build environment size and complexity, and reduces the
> > > opportunity for bugs to creep in from forgetting to add build
> > > options to multiple locations.  It also provides a more granular
> > > approach for grouping files.  Creating a dpdk core library becomes a
> > > matter of creating a one line linker script named libdpdk_core.so, rather
> than re- arraning sections of the build system.
> > >
> > > Thoughts?
> > > Neil
> > >
> > Hi  Neil,
> >
> > I think that is a very interesting approach.
> > I have tried to do something similar in this patch by removing
> > rte.sharelib.mk and just having rte.lib.mk to do the linking, leaving
> > as you suggest a single file to modify anything related to building libs.
> >
> > I do think however that your proposal is an improvement over the current
> patch.
> >
> > So basically we want:
> > - get rid of rte.corelib.mk
> > - generate librte_core.so linker script grouping core libs
> > - we do not modify DEPDIR variables
> > - when setting LDLIBS to each lib, we do specify -lrte_core, right?
> >
> Exactly, and librte_core.so is really just a text file containing the following line
> :
> INPUT(-lrte_malloc -lrte_mbuf -lrte_eal ....)
> 
> Adding in whatever libraries you want librte_core to consist of.  Truthfully,
> you could almost get rid of the COMBINE_LIBS option entirely, and just
> create this file statically if you wanted to (not sure thats the best approach,
> but its definately do-able).
> 
Hi Neil,

Actually, the first patch series does get rid of COMBINE_LIBS entirely.

So as I was looking into this, by using this approach we do not resolve the interdependencies issue of the core libraries.
We would effectively leave all core libraries (or at least EAL) without proper DT_NEEDED entries.

Thoughts?

Regards,
Sergio

> Regards
> Neil
> 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 0/8] Improve build process
  2015-01-29 17:04  0%   ` Gonzalez Monroy, Sergio
@ 2015-01-29 19:45  0%     ` Neil Horman
  2015-01-30 13:39  0%       ` Gonzalez Monroy, Sergio
  0 siblings, 1 reply; 200+ results
From: Neil Horman @ 2015-01-29 19:45 UTC (permalink / raw)
  To: Gonzalez Monroy, Sergio; +Cc: dev

On Thu, Jan 29, 2015 at 05:04:20PM +0000, Gonzalez Monroy, Sergio wrote:
> > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > Sent: Thursday, January 29, 2015 4:39 PM
> > To: Gonzalez Monroy, Sergio
> > Cc: dev@dpdk.org
> > Subject: Re: [dpdk-dev] [PATCH 0/8] Improve build process
> > 
> > On Thu, Jan 29, 2015 at 03:20:03PM +0000, Sergio Gonzalez Monroy wrote:
> > > This patch series improves the DPDK build system mostly for shared
> > > libraries (and a few nits for static libraries) with the following goals:
> > >  - Create a library containing core DPDK libraries (librte_eal,
> > >    librte_malloc, librte_mempool, librte_mbuf and librte_ring).
> > >    The idea of core libraries is to group those libraries that are
> > >    always required (and have interdependencies) for any DPDK application.
> > >  - Remove config option to build a combined library.
> > >  - For shared libraries, explicitly link against dependant
> > >    libraries (adding entries to DT_NEEDED).
> > >  - Update app linking flags for static/shared DPDK libs.
> > >
> > > Sergio Gonzalez Monroy (8):
> > >   mk: remove combined library and related options
> > >   core: create new librte_core
> > >   mk: new corelib makefile
> > >   lib: update DEPDIRS variable
> > >   lib: set LDLIBS for each library
> > >   mk: use LDLIBS when linking shared libraries
> > >   mk: update LDLIBS for app building
> > >   mk: add -lpthread to linuxapp EXECENV_LDLIBS
> > >
> > >  config/common_bsdapp                        |   6 --
> > >  config/common_linuxapp                      |   6 --
> > >  config/defconfig_ppc_64-power8-linuxapp-gcc |   2 -
> > >  lib/Makefile                                |   1 -
> > >  lib/librte_acl/Makefile                     |   5 +-
> > >  lib/librte_cfgfile/Makefile                 |   4 +-
> > >  lib/librte_cmdline/Makefile                 |   6 +-
> > >  lib/librte_core/Makefile                    |  45 +++++++++++++
> > >  lib/librte_distributor/Makefile             |   5 +-
> > >  lib/librte_eal/bsdapp/eal/Makefile          |   3 +-
> > >  lib/librte_eal/linuxapp/eal/Makefile        |   3 +-
> > >  lib/librte_ether/Makefile                   |   4 +-
> > >  lib/librte_hash/Makefile                    |   4 +-
> > >  lib/librte_ip_frag/Makefile                 |   6 +-
> > >  lib/librte_ivshmem/Makefile                 |   4 +-
> > >  lib/librte_kni/Makefile                     |   6 +-
> > >  lib/librte_kvargs/Makefile                  |   6 +-
> > >  lib/librte_lpm/Makefile                     |   6 +-
> > >  lib/librte_malloc/Makefile                  |   2 +-
> > >  lib/librte_mbuf/Makefile                    |   2 +-
> > >  lib/librte_mempool/Makefile                 |   2 +-
> > >  lib/librte_meter/Makefile                   |   4 +-
> > >  lib/librte_pipeline/Makefile                |   3 +
> > >  lib/librte_pmd_af_packet/Makefile           |   5 +-
> > >  lib/librte_pmd_bond/Makefile                |   7 +-
> > >  lib/librte_pmd_e1000/Makefile               |   8 ++-
> > >  lib/librte_pmd_enic/Makefile                |   8 ++-
> > >  lib/librte_pmd_i40e/Makefile                |   8 ++-
> > >  lib/librte_pmd_ixgbe/Makefile               |   8 ++-
> > >  lib/librte_pmd_pcap/Makefile                |   5 +-
> > >  lib/librte_pmd_ring/Makefile                |   6 +-
> > >  lib/librte_pmd_virtio/Makefile              |   7 +-
> > >  lib/librte_pmd_vmxnet3/Makefile             |   8 ++-
> > >  lib/librte_pmd_xenvirt/Makefile             |   8 ++-
> > >  lib/librte_port/Makefile                    |   8 +--
> > >  lib/librte_power/Makefile                   |   4 +-
> > >  lib/librte_ring/Makefile                    |   2 +-
> > >  lib/librte_sched/Makefile                   |   7 +-
> > >  lib/librte_table/Makefile                   |   8 +--
> > >  lib/librte_timer/Makefile                   |   6 +-
> > >  lib/librte_vhost/Makefile                   |   9 +--
> > >  mk/exec-env/linuxapp/rte.vars.mk            |   2 +
> > >  mk/rte.app.mk                               |  53 ++++-----------
> > >  mk/rte.corelib.mk                           |  84 +++++++++++++++++++++++
> > >  mk/rte.lib.mk                               |  49 +++-----------
> > >  mk/rte.sdkbuild.mk                          |   3 -
> > >  mk/rte.sharelib.mk                          | 101 ----------------------------
> > >  mk/rte.vars.mk                              |   9 ---
> > >  48 files changed, 276 insertions(+), 282 deletions(-)  create mode
> > > 100644 lib/librte_core/Makefile  create mode 100644 mk/rte.corelib.mk
> > > delete mode 100644 mk/rte.sharelib.mk
> > >
> > > --
> > > 1.9.3
> > >
> > >
> > Something occured to me thinking about this patch set.  I noticed recently
> > that different rules are used to build the shared combined lib from the
> > individual shared objects.  The implication here is that linker options specified
> > in individual make files (like the LIBABIVER and EXPORT_MAP options in my
> > ABI versioning script) get ignored, which is bad.  Any other file specific linker
> > options (like <file>_LDFLAGS specified in individual library makefiles are
> > getting dropped for the combined lib.
> > 
> > It seems like it would be better if the combined libs were manufactured as
> > linker scripts themselves (textfiles that used linker directives to include
> > individual libraries under the covers (see /lib64/libc.so for an example).
> > 
> > The disadvantage of such an approach are fairly minimal.  With such a
> > combined library, you still need to install individual libraries, but for
> > applications that wish to link and run against a single dpdk library will still work
> > just as they currently do, you can link to just a single library.
> > 
> > The advantage is clear however.  By following a linker script aproach, objects
> > build as separate libraries are built exactly the same way, using the same
> > rules with the same options.  It reduces the dpdk build environment size and
> > complexity, and reduces the opportunity for bugs to creep in from forgetting
> > to add build options to multiple locations.  It also provides a more granular
> > approach for grouping files.  Creating a dpdk core library becomes a matter of
> > creating a one line linker script named libdpdk_core.so, rather than re-
> > arraning sections of the build system.
> > 
> > Thoughts?
> > Neil
> > 
> Hi  Neil,
> 
> I think that is a very interesting approach.
> I have tried to do something similar in this patch by removing rte.sharelib.mk and
> just having rte.lib.mk to do the linking, leaving as you suggest a single file to
> modify anything related to building libs.
> 
> I do think however that your proposal is an improvement over the current patch.
> 
> So basically we want:
> - get rid of rte.corelib.mk
> - generate librte_core.so linker script grouping core libs
> - we do not modify DEPDIR variables
> - when setting LDLIBS to each lib, we do specify -lrte_core, right?
> 
Exactly, and librte_core.so is really just a text file containing the following
line
:
INPUT(-lrte_malloc -lrte_mbuf -lrte_eal ....)

Adding in whatever libraries you want librte_core to consist of.  Truthfully,
you could almost get rid of the COMBINE_LIBS option entirely, and just create
this file statically if you wanted to (not sure thats the best approach, but its
definately do-able).

Regards
Neil
 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 0/8] Improve build process
  2015-01-29 16:38  3% ` Neil Horman
  2015-01-29 17:02  0%   ` Thomas Monjalon
@ 2015-01-29 17:04  0%   ` Gonzalez Monroy, Sergio
  2015-01-29 19:45  0%     ` Neil Horman
  1 sibling, 1 reply; 200+ results
From: Gonzalez Monroy, Sergio @ 2015-01-29 17:04 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

> From: Neil Horman [mailto:nhorman@tuxdriver.com]
> Sent: Thursday, January 29, 2015 4:39 PM
> To: Gonzalez Monroy, Sergio
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH 0/8] Improve build process
> 
> On Thu, Jan 29, 2015 at 03:20:03PM +0000, Sergio Gonzalez Monroy wrote:
> > This patch series improves the DPDK build system mostly for shared
> > libraries (and a few nits for static libraries) with the following goals:
> >  - Create a library containing core DPDK libraries (librte_eal,
> >    librte_malloc, librte_mempool, librte_mbuf and librte_ring).
> >    The idea of core libraries is to group those libraries that are
> >    always required (and have interdependencies) for any DPDK application.
> >  - Remove config option to build a combined library.
> >  - For shared libraries, explicitly link against dependant
> >    libraries (adding entries to DT_NEEDED).
> >  - Update app linking flags for static/shared DPDK libs.
> >
> > Sergio Gonzalez Monroy (8):
> >   mk: remove combined library and related options
> >   core: create new librte_core
> >   mk: new corelib makefile
> >   lib: update DEPDIRS variable
> >   lib: set LDLIBS for each library
> >   mk: use LDLIBS when linking shared libraries
> >   mk: update LDLIBS for app building
> >   mk: add -lpthread to linuxapp EXECENV_LDLIBS
> >
> >  config/common_bsdapp                        |   6 --
> >  config/common_linuxapp                      |   6 --
> >  config/defconfig_ppc_64-power8-linuxapp-gcc |   2 -
> >  lib/Makefile                                |   1 -
> >  lib/librte_acl/Makefile                     |   5 +-
> >  lib/librte_cfgfile/Makefile                 |   4 +-
> >  lib/librte_cmdline/Makefile                 |   6 +-
> >  lib/librte_core/Makefile                    |  45 +++++++++++++
> >  lib/librte_distributor/Makefile             |   5 +-
> >  lib/librte_eal/bsdapp/eal/Makefile          |   3 +-
> >  lib/librte_eal/linuxapp/eal/Makefile        |   3 +-
> >  lib/librte_ether/Makefile                   |   4 +-
> >  lib/librte_hash/Makefile                    |   4 +-
> >  lib/librte_ip_frag/Makefile                 |   6 +-
> >  lib/librte_ivshmem/Makefile                 |   4 +-
> >  lib/librte_kni/Makefile                     |   6 +-
> >  lib/librte_kvargs/Makefile                  |   6 +-
> >  lib/librte_lpm/Makefile                     |   6 +-
> >  lib/librte_malloc/Makefile                  |   2 +-
> >  lib/librte_mbuf/Makefile                    |   2 +-
> >  lib/librte_mempool/Makefile                 |   2 +-
> >  lib/librte_meter/Makefile                   |   4 +-
> >  lib/librte_pipeline/Makefile                |   3 +
> >  lib/librte_pmd_af_packet/Makefile           |   5 +-
> >  lib/librte_pmd_bond/Makefile                |   7 +-
> >  lib/librte_pmd_e1000/Makefile               |   8 ++-
> >  lib/librte_pmd_enic/Makefile                |   8 ++-
> >  lib/librte_pmd_i40e/Makefile                |   8 ++-
> >  lib/librte_pmd_ixgbe/Makefile               |   8 ++-
> >  lib/librte_pmd_pcap/Makefile                |   5 +-
> >  lib/librte_pmd_ring/Makefile                |   6 +-
> >  lib/librte_pmd_virtio/Makefile              |   7 +-
> >  lib/librte_pmd_vmxnet3/Makefile             |   8 ++-
> >  lib/librte_pmd_xenvirt/Makefile             |   8 ++-
> >  lib/librte_port/Makefile                    |   8 +--
> >  lib/librte_power/Makefile                   |   4 +-
> >  lib/librte_ring/Makefile                    |   2 +-
> >  lib/librte_sched/Makefile                   |   7 +-
> >  lib/librte_table/Makefile                   |   8 +--
> >  lib/librte_timer/Makefile                   |   6 +-
> >  lib/librte_vhost/Makefile                   |   9 +--
> >  mk/exec-env/linuxapp/rte.vars.mk            |   2 +
> >  mk/rte.app.mk                               |  53 ++++-----------
> >  mk/rte.corelib.mk                           |  84 +++++++++++++++++++++++
> >  mk/rte.lib.mk                               |  49 +++-----------
> >  mk/rte.sdkbuild.mk                          |   3 -
> >  mk/rte.sharelib.mk                          | 101 ----------------------------
> >  mk/rte.vars.mk                              |   9 ---
> >  48 files changed, 276 insertions(+), 282 deletions(-)  create mode
> > 100644 lib/librte_core/Makefile  create mode 100644 mk/rte.corelib.mk
> > delete mode 100644 mk/rte.sharelib.mk
> >
> > --
> > 1.9.3
> >
> >
> Something occured to me thinking about this patch set.  I noticed recently
> that different rules are used to build the shared combined lib from the
> individual shared objects.  The implication here is that linker options specified
> in individual make files (like the LIBABIVER and EXPORT_MAP options in my
> ABI versioning script) get ignored, which is bad.  Any other file specific linker
> options (like <file>_LDFLAGS specified in individual library makefiles are
> getting dropped for the combined lib.
> 
> It seems like it would be better if the combined libs were manufactured as
> linker scripts themselves (textfiles that used linker directives to include
> individual libraries under the covers (see /lib64/libc.so for an example).
> 
> The disadvantage of such an approach are fairly minimal.  With such a
> combined library, you still need to install individual libraries, but for
> applications that wish to link and run against a single dpdk library will still work
> just as they currently do, you can link to just a single library.
> 
> The advantage is clear however.  By following a linker script aproach, objects
> build as separate libraries are built exactly the same way, using the same
> rules with the same options.  It reduces the dpdk build environment size and
> complexity, and reduces the opportunity for bugs to creep in from forgetting
> to add build options to multiple locations.  It also provides a more granular
> approach for grouping files.  Creating a dpdk core library becomes a matter of
> creating a one line linker script named libdpdk_core.so, rather than re-
> arraning sections of the build system.
> 
> Thoughts?
> Neil
> 
Hi  Neil,

I think that is a very interesting approach.
I have tried to do something similar in this patch by removing rte.sharelib.mk and
just having rte.lib.mk to do the linking, leaving as you suggest a single file to
modify anything related to building libs.

I do think however that your proposal is an improvement over the current patch.

So basically we want:
- get rid of rte.corelib.mk
- generate librte_core.so linker script grouping core libs
- we do not modify DEPDIR variables
- when setting LDLIBS to each lib, we do specify -lrte_core, right?

Regards,
Sergio

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 0/8] Improve build process
  2015-01-29 16:38  3% ` Neil Horman
@ 2015-01-29 17:02  0%   ` Thomas Monjalon
  2015-01-29 17:04  0%   ` Gonzalez Monroy, Sergio
  1 sibling, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-01-29 17:02 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

2015-01-29 11:38, Neil Horman:
> On Thu, Jan 29, 2015 at 03:20:03PM +0000, Sergio Gonzalez Monroy wrote:
> > This patch series improves the DPDK build system mostly for shared
> > libraries (and a few nits for static libraries) with the following goals:
> >  - Create a library containing core DPDK libraries (librte_eal,
> >    librte_malloc, librte_mempool, librte_mbuf and librte_ring).
> >    The idea of core libraries is to group those libraries that are
> >    always required (and have interdependencies) for any DPDK application.
> >  - Remove config option to build a combined library.
> >  - For shared libraries, explicitly link against dependant
> >    libraries (adding entries to DT_NEEDED).
> >  - Update app linking flags for static/shared DPDK libs.
> > 
> > Sergio Gonzalez Monroy (8):
> >   mk: remove combined library and related options
> >   core: create new librte_core
> >   mk: new corelib makefile
> >   lib: update DEPDIRS variable
> >   lib: set LDLIBS for each library
> >   mk: use LDLIBS when linking shared libraries
> >   mk: update LDLIBS for app building
> >   mk: add -lpthread to linuxapp EXECENV_LDLIBS
> > 
> Something occured to me thinking about this patch set.  I noticed recently that
> different rules are used to build the shared combined lib from the individual
> shared objects.  The implication here is that linker options specified in
> individual make files (like the LIBABIVER and EXPORT_MAP options in my ABI
> versioning script) get ignored, which is bad.  Any other file specific linker
> options (like <file>_LDFLAGS specified in individual library makefiles are
> getting dropped for the combined lib.  
> 
> It seems like it would be better if the combined libs were manufactured as
> linker scripts themselves (textfiles that used linker directives to include
> individual libraries under the covers (see /lib64/libc.so for an example).
> 
> The disadvantage of such an approach are fairly minimal.  With such a combined
> library, you still need to install individual libraries, but for applications
> that wish to link and run against a single dpdk library will still work just as
> they currently do, you can link to just a single library.
> 
> The advantage is clear however.  By following a linker script aproach, objects
> build as separate libraries are built exactly the same way, using the same rules
> with the same options.  It reduces the dpdk build environment size and
> complexity, and reduces the opportunity for bugs to creep in from forgetting to
> add build options to multiple locations.  It also provides a more granular
> approach for grouping files.  Creating a dpdk core library becomes a matter of
> creating a one line linker script named libdpdk_core.so, rather than re-arraning
> sections of the build system.
> 
> Thoughts?

Neil, it seems to be a good idea.
I like the idea of making things simpler ;)

-- 
Thomas

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 0/8] Improve build process
  @ 2015-01-29 16:38  3% ` Neil Horman
  2015-01-29 17:02  0%   ` Thomas Monjalon
  2015-01-29 17:04  0%   ` Gonzalez Monroy, Sergio
  0 siblings, 2 replies; 200+ results
From: Neil Horman @ 2015-01-29 16:38 UTC (permalink / raw)
  To: Sergio Gonzalez Monroy; +Cc: dev

On Thu, Jan 29, 2015 at 03:20:03PM +0000, Sergio Gonzalez Monroy wrote:
> This patch series improves the DPDK build system mostly for shared
> libraries (and a few nits for static libraries) with the following goals:
>  - Create a library containing core DPDK libraries (librte_eal,
>    librte_malloc, librte_mempool, librte_mbuf and librte_ring).
>    The idea of core libraries is to group those libraries that are
>    always required (and have interdependencies) for any DPDK application.
>  - Remove config option to build a combined library.
>  - For shared libraries, explicitly link against dependant
>    libraries (adding entries to DT_NEEDED).
>  - Update app linking flags for static/shared DPDK libs.
> 
> Sergio Gonzalez Monroy (8):
>   mk: remove combined library and related options
>   core: create new librte_core
>   mk: new corelib makefile
>   lib: update DEPDIRS variable
>   lib: set LDLIBS for each library
>   mk: use LDLIBS when linking shared libraries
>   mk: update LDLIBS for app building
>   mk: add -lpthread to linuxapp EXECENV_LDLIBS
> 
>  config/common_bsdapp                        |   6 --
>  config/common_linuxapp                      |   6 --
>  config/defconfig_ppc_64-power8-linuxapp-gcc |   2 -
>  lib/Makefile                                |   1 -
>  lib/librte_acl/Makefile                     |   5 +-
>  lib/librte_cfgfile/Makefile                 |   4 +-
>  lib/librte_cmdline/Makefile                 |   6 +-
>  lib/librte_core/Makefile                    |  45 +++++++++++++
>  lib/librte_distributor/Makefile             |   5 +-
>  lib/librte_eal/bsdapp/eal/Makefile          |   3 +-
>  lib/librte_eal/linuxapp/eal/Makefile        |   3 +-
>  lib/librte_ether/Makefile                   |   4 +-
>  lib/librte_hash/Makefile                    |   4 +-
>  lib/librte_ip_frag/Makefile                 |   6 +-
>  lib/librte_ivshmem/Makefile                 |   4 +-
>  lib/librte_kni/Makefile                     |   6 +-
>  lib/librte_kvargs/Makefile                  |   6 +-
>  lib/librte_lpm/Makefile                     |   6 +-
>  lib/librte_malloc/Makefile                  |   2 +-
>  lib/librte_mbuf/Makefile                    |   2 +-
>  lib/librte_mempool/Makefile                 |   2 +-
>  lib/librte_meter/Makefile                   |   4 +-
>  lib/librte_pipeline/Makefile                |   3 +
>  lib/librte_pmd_af_packet/Makefile           |   5 +-
>  lib/librte_pmd_bond/Makefile                |   7 +-
>  lib/librte_pmd_e1000/Makefile               |   8 ++-
>  lib/librte_pmd_enic/Makefile                |   8 ++-
>  lib/librte_pmd_i40e/Makefile                |   8 ++-
>  lib/librte_pmd_ixgbe/Makefile               |   8 ++-
>  lib/librte_pmd_pcap/Makefile                |   5 +-
>  lib/librte_pmd_ring/Makefile                |   6 +-
>  lib/librte_pmd_virtio/Makefile              |   7 +-
>  lib/librte_pmd_vmxnet3/Makefile             |   8 ++-
>  lib/librte_pmd_xenvirt/Makefile             |   8 ++-
>  lib/librte_port/Makefile                    |   8 +--
>  lib/librte_power/Makefile                   |   4 +-
>  lib/librte_ring/Makefile                    |   2 +-
>  lib/librte_sched/Makefile                   |   7 +-
>  lib/librte_table/Makefile                   |   8 +--
>  lib/librte_timer/Makefile                   |   6 +-
>  lib/librte_vhost/Makefile                   |   9 +--
>  mk/exec-env/linuxapp/rte.vars.mk            |   2 +
>  mk/rte.app.mk                               |  53 ++++-----------
>  mk/rte.corelib.mk                           |  84 +++++++++++++++++++++++
>  mk/rte.lib.mk                               |  49 +++-----------
>  mk/rte.sdkbuild.mk                          |   3 -
>  mk/rte.sharelib.mk                          | 101 ----------------------------
>  mk/rte.vars.mk                              |   9 ---
>  48 files changed, 276 insertions(+), 282 deletions(-)
>  create mode 100644 lib/librte_core/Makefile
>  create mode 100644 mk/rte.corelib.mk
>  delete mode 100644 mk/rte.sharelib.mk
> 
> -- 
> 1.9.3
> 
> 
Something occured to me thinking about this patch set.  I noticed recently that
different rules are used to build the shared combined lib from the individual
shared objects.  The implication here is that linker options specified in
individual make files (like the LIBABIVER and EXPORT_MAP options in my ABI
versioning script) get ignored, which is bad.  Any other file specific linker
options (like <file>_LDFLAGS specified in individual library makefiles are
getting dropped for the combined lib.  

It seems like it would be better if the combined libs were manufactured as
linker scripts themselves (textfiles that used linker directives to include
individual libraries under the covers (see /lib64/libc.so for an example).

The disadvantage of such an approach are fairly minimal.  With such a combined
library, you still need to install individual libraries, but for applications
that wish to link and run against a single dpdk library will still work just as
they currently do, you can link to just a single library.

The advantage is clear however.  By following a linker script aproach, objects
build as separate libraries are built exactly the same way, using the same rules
with the same options.  It reduces the dpdk build environment size and
complexity, and reduces the opportunity for bugs to creep in from forgetting to
add build options to multiple locations.  It also provides a more granular
approach for grouping files.  Creating a dpdk core library becomes a matter of
creating a one line linker script named libdpdk_core.so, rather than re-arraning
sections of the build system.

Thoughts?
Neil

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v6 4/4] docs: Add ABI documentation
  2015-01-21 22:24  9%             ` Thomas Monjalon
@ 2015-01-22 19:21  4%               ` Neil Horman
  0 siblings, 0 replies; 200+ results
From: Neil Horman @ 2015-01-22 19:21 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Wed, Jan 21, 2015 at 11:24:12PM +0100, Thomas Monjalon wrote:
> 2015-01-21 14:43, Neil Horman:
> > On Wed, Jan 21, 2015 at 05:05:51PM +0100, Thomas Monjalon wrote:
> > > 2015-01-21 09:59, Neil Horman:
> > > > Considered and answered already.  I'm in favor of listing macros and structure
> > > > changes in the abi document, but I think an exhaustive list isn't needed.  If it
> > > > is, we could spend pages diving into minute.  Better to point out the need for
> > > > abi noticies as patches get posted.
> > > 
> > > I'm afraid you don't understand what I'm saying. Copy/paste:
> > > "No, I was suggesting to explain in this doc that macro removal must be
> > > announced with a deprecation notice,
> > > and that in case structure must be reworked, the name must change if we
> > > want to preserve ABI compatibility with old structure."
> > > Rewording: if you agree with this policy, please add it in this document.
> > > 
> > Yes, we're on the same page regarding what your asking, I just don't agree that
> > it needs to be explicitly called out.  I thought I was clear on that.
> > Appaerntly not however, so if it will settle the point, I'll just add it.
> 
> OK maybe I didn't explain enough my proposal.
> You can disagree but I want to be sure we think about the same thing.
> 
> 1) Macros are not part of the ABI but can be part of the API.
> Such macro removal must be announced in the previous release.
> 2) Structures are part of the ABI but cannot be versionned as the functions.
> So an ABI breaking change should be done by cloning the structure in a new one.
> And the API functions where this structure appears should be cloned and versionned
> to support new structure while keeping old version.
> 
> Maybe that these precisions are confuse and useless.
> Now I think I understand what you were saying by "an exhaustive list isn't needed".
> You mean listing all types of ABI/API breakage like I did with these 2 cases, right?
> I thought it was related to list of real/effective deprecations.
> 
> > > > > Neil, we expect that you consider comments done previously and that you test your patch.
> > > > > Otherwise, we are losing time in useless reviews.
> > > > > 
> > > > Thomas, I have considered your comments, I simply don't agree with all of them,
> > > > and I made that clear.
> > > > 
> > > > As for losing time, you let the first attempt at this
> > > > patch rot on the list in 1.7 and have done the same thing for the 1.8 cycle
> > > > until I yelled for reviews.
> > > 
> > > Now, I'm really upset of your wrong assumptions.
> > > You sent your first proposal on september, during 1.8 cycle, not 1.7 !
> > > And during this cycle, the decision was to postpone it for 2.0 release.
> > > 
> > you're missing the point. I apologize for not getting the release numbers right,
> > it should be 1.8 to 2.0 not 1.7 to 1.8 as you note, but that doesn't really
> > matter.  The point was 6 months.  6 months this has been sitting around.
> 
> No, 5 months. Yes, it's long.
> 
> > In that time up to this point I've gotten one review from another devloper on the
> > set, and you indicating that its not ready yet.  Then, the day 1.8 released, I
> > reposed the patch series as we agreed, and its taken almost 5 weeks before I've
> > gotten any feedback on it, and then its feedback that could have been given 6
> > months ago (you'll note this patch was initially identical to the version I
> > posted back in september).  I think you can understand how I find that
> > frustrating.
> 
> You must understand that I'd prefer more people feel involved by this change.
> It would be saner to have this policy reviewed and acked by many developpers.
> As it was announced on the roadmap for 2.0, this first month of the cycle was
> ideal to have more discussions on how this policy can be precisely applied.
> You only received my comments (which may be useless) and it's now time to
> apply this important patchset.
> 
> > > I don't understand what's wrong with you.
> > The above is whats wrong with me.  The fact that I can try and try and try to
> > add value to this project so that I can expand its user base, and the best I've
> > thus far been able to receive is indifference.  At worst, the indifference is
> > followed by being told that the indifference is tantamount to rejection.
> > 
> > 
> > > You don't make any effort to understand what we are saying and
> > > you make no effort to understand what is this doc directory.
> > > You prefer crying that your patch is not applied.
> > No effort?  How many emails have I written contesting your opinions, presenting
> > supporting evidence, only to be met with assertions?  I don't think I'm the one
> > not making an effort here.
> 
> At the end, I accept your point of view and will apply the patchset.
> 
> > > And I still don't understand if you are willing to work on a test tool for ABI?
> > > 
> > From this email
> > http://dpdk.org/ml/archives/dev/2015-January/011306.html
> > 
> > =======================================================
> > > Yes, it should be another patchset.
> > > Do you plan to work on it? It would be very convenient for developpers and
> > > maintainers to test ABI compatibility.
> > > 
> > Gladly, if we can get this in.  I think its an important tool.
> > =========================================================
> > 
> > I'm not sure how thats unclear, but in the event that it wasn't, yes, I will
> > gladly work on such a tool.
> 
> OK thanks, it would be helpful to have it in release 2.0.
> 
Its not going to make 2.0, its a big undertaking.  If you wanted it in 2.0 that
would have been something to bring up 5 months ago.

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v8 4/4] docs: Add ABI documentation
  2015-01-22 15:49 23%   ` [dpdk-dev] [PATCH v8 4/4] docs: Add ABI documentation Neil Horman
@ 2015-01-22 16:46  4%     ` Butler, Siobhan A
  0 siblings, 0 replies; 200+ results
From: Butler, Siobhan A @ 2015-01-22 16:46 UTC (permalink / raw)
  To: Neil Horman, dev


> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> Sent: Thursday, January 22, 2015 3:49 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v8 4/4] docs: Add ABI documentation
> 
> Adding a document describing rudimentary ABI policy and adding notice
> space for any deprecation announcements
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> 
> ---
> Change notes:
> 
> v5) Updated documentation to add notes from Thomas M.
> 
> v6) Moved abi.txt to guides/rel_notes/abi.rst
> 
> v7) Updated abi.rst to integrate with index file
>     Updated abi.rst to conform to rst formatting
>     Updated abi.rst to include example deprecation notices.  Its not exactly the
> language that Thomas indicated, but I think it makes the idea clear.
> 
> v8) Add missing file index.rst which was left out of the prior commit
> ---
>  doc/guides/rel_notes/abi.rst   | 40
> ++++++++++++++++++++++++++++++++++++++++
>  doc/guides/rel_notes/index.rst |  1 +
>  2 files changed, 41 insertions(+)
>  create mode 100644 doc/guides/rel_notes/abi.rst
> 
> diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst new
> file mode 100644 index 0000000..73d88ca
> --- /dev/null
> +++ b/doc/guides/rel_notes/abi.rst
> @@ -0,0 +1,40 @@
> +ABI policy
> +==========
> +ABI versions are set at the time of major release labeling, and ABI may
> +change multiple times between the last labeling and the HEAD label of
> +the git tree without warning.
> +
> +ABI versions, once released are available until such time as their
> +deprecation has been noted here for at least one major release cycle,
> +after it has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and
> +then the decision to remove it is made during the development of DPDK
> +1.9.  The decision will be recorded here, shipped with the DPDK 1.9
> +release, and actually removed when DPDK
> +1.10 ships.
> +
> +ABI versions may be deprecated in whole, or in part as needed by a given
> update.
> +
> +Some ABI changes may be too significant to reasonably maintain multiple
> +versions of.  In those events ABI's may be updated without backward
> +compatibility provided.  The requirements for doing so are:
> +
> +#. At least 3 acknoweldgements of the need on the dpdk.org #. A full
> +deprecation cycle must be made to offer downstream consumers sufficient
> +warning of the change.  E.g. if dpdk 2.0 is under development when the
> +change is proposed, a deprecation notice must be added to this file,
> +and released with dpdk 2.0.  Then the change may be incorporated for
> +dpdk 2.1 #. The LIBABIVER variable in the makefilei(s) where the ABI
> +changes are incorporated must be incremented in parallel with the ABI
> +changes themselves
> +
> +Note that the above process for ABI deprecation should not be
> +undertaken lightly.  ABI stability is extreemely important for
> +downstream consumers of the DPDK, especially when distributed in shared
> +object form.  Every effort should be made to preserve ABI whenever
> +possible.  For instance, reorganizing public structure field for
> +astetic or readability purposes should be avoided as it will cause ABI
> +breakage.  Only significant (e.g. performance) reasons should be seen as
> cause to alter ABI.
> +
> +Examples of Deprecation notices
> +-------------------------------
> +* The Macro #RTE_FOO is deprecated and will be removed with version
> +2.0, to be replaced with the inline function rte_bar()
> +* The function rte_mbuf_grok has been updated to include new parameter
> +in version 2.0.  Backwards compatibility will be maintained for this
> +function until the release of version 2.1
> +* The members struct foo have been reorganized in release 2.0.  Existing
> binary applications will have backwards compatibility in release 2.0, while
> newly built binaries will need to reference new structure variant struct foo2.
> Compatibility will be removed in release 2.2, and all applications will require
> updating a rebuilding to the new structure at that time, which will be
> renamed to the origional struct foo.
> +* Significant ABI changes are planned for the librte_dostuff library.  The
> upcomming release 2.0 will not contain these changes, but release 2.1 will,
> and no backwards compatibility is planned due to the invasive nature of
> these changes.  Binaries using this library built prior to version 2.1 will require
> updating and recompilation.
> +
> +Deprecation Notices
> +-------------------
> diff --git a/doc/guides/rel_notes/index.rst b/doc/guides/rel_notes/index.rst
> index 2724149..cf712b2 100644
> --- a/doc/guides/rel_notes/index.rst
> +++ b/doc/guides/rel_notes/index.rst
> @@ -48,4 +48,5 @@ Contents
>      updating_apps
>      known_issues
>      resolved_issues
> +    abi
>      faq
> --
> 2.1.0

Acked-by: Siobhan Butler <siobhan.a.butler@intel.com>

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v8 4/4] docs: Add ABI documentation
  2015-01-22 15:49  3% ` [dpdk-dev] [PATCH v8 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
  2015-01-22 15:49  7%   ` [dpdk-dev] [PATCH v8 3/4] Add library version extenstion Neil Horman
@ 2015-01-22 15:49 23%   ` Neil Horman
  2015-01-22 16:46  4%     ` Butler, Siobhan A
  1 sibling, 1 reply; 200+ results
From: Neil Horman @ 2015-01-22 15:49 UTC (permalink / raw)
  To: dev

Adding a document describing rudimentary ABI policy and adding notice space for
any deprecation announcements

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>

---
Change notes:

v5) Updated documentation to add notes from Thomas M.

v6) Moved abi.txt to guides/rel_notes/abi.rst

v7) Updated abi.rst to integrate with index file
    Updated abi.rst to conform to rst formatting
    Updated abi.rst to include example deprecation notices.  Its not exactly the
language that Thomas indicated, but I think it makes the idea clear.

v8) Add missing file index.rst which was left out of the prior commit
---
 doc/guides/rel_notes/abi.rst   | 40 ++++++++++++++++++++++++++++++++++++++++
 doc/guides/rel_notes/index.rst |  1 +
 2 files changed, 41 insertions(+)
 create mode 100644 doc/guides/rel_notes/abi.rst

diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst
new file mode 100644
index 0000000..73d88ca
--- /dev/null
+++ b/doc/guides/rel_notes/abi.rst
@@ -0,0 +1,40 @@
+ABI policy
+==========
+ABI versions are set at the time of major release labeling, and ABI may change
+multiple times between the last labeling and the HEAD label of the git tree
+without warning.
+
+ABI versions, once released are available until such time as their
+deprecation has been noted here for at least one major release cycle, after it
+has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
+remove it is made during the development of DPDK 1.9.  The decision will be
+recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
+1.10 ships.
+
+ABI versions may be deprecated in whole, or in part as needed by a given update.
+
+Some ABI changes may be too significant to reasonably maintain multiple
+versions of.  In those events ABI's may be updated without backward
+compatibility provided.  The requirements for doing so are:
+
+#. At least 3 acknoweldgements of the need on the dpdk.org
+#. A full deprecation cycle must be made to offer downstream consumers sufficient warning of the change.  E.g. if dpdk 2.0 is under development when the change is proposed, a deprecation notice must be added to this file, and released with dpdk 2.0.  Then the change may be incorporated for dpdk 2.1
+#. The LIBABIVER variable in the makefilei(s) where the ABI changes are incorporated must be incremented in parallel with the ABI changes themselves
+
+Note that the above process for ABI deprecation should not be undertaken
+lightly.  ABI stability is extreemely important for downstream consumers of the
+DPDK, especially when distributed in shared object form.  Every effort should be
+made to preserve ABI whenever possible.  For instance, reorganizing public
+structure field for astetic or readability purposes should be avoided as it will
+cause ABI breakage.  Only significant (e.g. performance) reasons should be seen
+as cause to alter ABI.
+
+Examples of Deprecation notices
+-------------------------------
+* The Macro #RTE_FOO is deprecated and will be removed with version 2.0, to be replaced with the inline function rte_bar()
+* The function rte_mbuf_grok has been updated to include new parameter in version 2.0.  Backwards compatibility will be maintained for this function until the release of version 2.1
+* The members struct foo have been reorganized in release 2.0.  Existing binary applications will have backwards compatibility in release 2.0, while newly built binaries will need to reference new structure variant struct foo2.  Compatibility will be removed in release 2.2, and all applications will require updating a rebuilding to the new structure at that time, which will be renamed to the origional struct foo.
+* Significant ABI changes are planned for the librte_dostuff library.  The upcomming release 2.0 will not contain these changes, but release 2.1 will, and no backwards compatibility is planned due to the invasive nature of these changes.  Binaries using this library built prior to version 2.1 will require updating and recompilation.
+
+Deprecation Notices
+-------------------
diff --git a/doc/guides/rel_notes/index.rst b/doc/guides/rel_notes/index.rst
index 2724149..cf712b2 100644
--- a/doc/guides/rel_notes/index.rst
+++ b/doc/guides/rel_notes/index.rst
@@ -48,4 +48,5 @@ Contents
     updating_apps
     known_issues
     resolved_issues
+    abi
     faq
-- 
2.1.0

^ permalink raw reply	[relevance 23%]

* [dpdk-dev] [PATCH v8 3/4] Add library version extenstion
  2015-01-22 15:49  3% ` [dpdk-dev] [PATCH v8 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
@ 2015-01-22 15:49  7%   ` Neil Horman
  2015-01-22 15:49 23%   ` [dpdk-dev] [PATCH v8 4/4] docs: Add ABI documentation Neil Horman
  1 sibling, 0 replies; 200+ results
From: Neil Horman @ 2015-01-22 15:49 UTC (permalink / raw)
  To: dev

To differentiate libraries that break ABI, we add a library version number
suffix to the library, which must be incremented when a given libraries ABI is
broken.  This patch enforces that addition, sets the initial abi soname
extension to 1 for each library and creates a symlink to the base SONAME so that
the test applications will link properly.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>

---
Change Notes:
v3)
	Made symlinking of libraries conditional on a DSO build

v4)	Removed erroneous newline
	changed @exit 1 to @false
	changed ./$(LIB) to $<
---
 lib/librte_acl/Makefile              |  2 ++
 lib/librte_cfgfile/Makefile          |  2 ++
 lib/librte_cmdline/Makefile          |  2 ++
 lib/librte_compat/Makefile           |  2 ++
 lib/librte_distributor/Makefile      |  2 ++
 lib/librte_eal/bsdapp/eal/Makefile   |  2 ++
 lib/librte_eal/linuxapp/eal/Makefile |  2 ++
 lib/librte_ether/Makefile            |  2 ++
 lib/librte_hash/Makefile             |  2 ++
 lib/librte_ip_frag/Makefile          |  2 ++
 lib/librte_ivshmem/Makefile          |  2 ++
 lib/librte_kni/Makefile              |  2 ++
 lib/librte_kvargs/Makefile           |  2 ++
 lib/librte_lpm/Makefile              |  2 ++
 lib/librte_malloc/Makefile           |  2 ++
 lib/librte_mbuf/Makefile             |  2 ++
 lib/librte_mempool/Makefile          |  2 ++
 lib/librte_meter/Makefile            |  2 ++
 lib/librte_pipeline/Makefile         |  2 ++
 lib/librte_pmd_af_packet/Makefile    |  2 ++
 lib/librte_pmd_bond/Makefile         |  2 ++
 lib/librte_pmd_e1000/Makefile        |  2 ++
 lib/librte_pmd_enic/Makefile         |  2 ++
 lib/librte_pmd_i40e/Makefile         |  2 ++
 lib/librte_pmd_ixgbe/Makefile        |  2 ++
 lib/librte_pmd_pcap/Makefile         |  2 ++
 lib/librte_pmd_ring/Makefile         |  2 ++
 lib/librte_pmd_virtio/Makefile       |  2 ++
 lib/librte_pmd_vmxnet3/Makefile      |  2 ++
 lib/librte_pmd_xenvirt/Makefile      |  2 ++
 lib/librte_port/Makefile             |  2 ++
 lib/librte_power/Makefile            |  2 ++
 lib/librte_ring/Makefile             |  2 ++
 lib/librte_sched/Makefile            |  2 ++
 lib/librte_table/Makefile            |  2 ++
 lib/librte_timer/Makefile            |  2 ++
 lib/librte_vhost/Makefile            |  2 ++
 mk/rte.lib.mk                        | 12 ++++++++++--
 38 files changed, 84 insertions(+), 2 deletions(-)

diff --git a/lib/librte_acl/Makefile b/lib/librte_acl/Makefile
index 45cbf80..765deb1 100644
--- a/lib/librte_acl/Makefile
+++ b/lib/librte_acl/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_acl_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_ACL) += tb_mem.c
 
diff --git a/lib/librte_cfgfile/Makefile b/lib/librte_cfgfile/Makefile
index a4f73de..032c240 100644
--- a/lib/librte_cfgfile/Makefile
+++ b/lib/librte_cfgfile/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_cfgfile_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_cmdline/Makefile b/lib/librte_cmdline/Makefile
index 3c71831..719dff6 100644
--- a/lib/librte_cmdline/Makefile
+++ b/lib/librte_cmdline/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_cmdline_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) := cmdline.c
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_cirbuf.c
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
index 0bab870..0c57533 100644
--- a/lib/librte_compat/Makefile
+++ b/lib/librte_compat/Makefile
@@ -32,6 +32,8 @@
 include $(RTE_SDK)/mk/rte.vars.mk
 
 
+LIBABIVER := 1
+
 # install includes
 SYMLINK-y-include := rte_compat.h
 
diff --git a/lib/librte_distributor/Makefile b/lib/librte_distributor/Makefile
index 3674a2c..4c9af17 100644
--- a/lib/librte_distributor/Makefile
+++ b/lib/librte_distributor/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_distributor_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor.c
 
diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index 0b5f9d9..ae214a4 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -48,6 +48,8 @@ CFLAGS += $(WERROR_FLAGS) -O3
 
 EXPORT_MAP := rte_eal_version.map
 
+LIBABIVER := 1
+
 # specific to linuxapp exec-env
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) := eal.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_memory.c
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index bae8af1..e117cec 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -35,6 +35,8 @@ LIB = librte_eal.a
 
 EXPORT_MAP := rte_eal_version.map
 
+LIBABIVER := 1
+
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
 CFLAGS += -I$(SRCDIR)/include
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index 80ad78d..c0e5768 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_ether_version.map
 
+LIBABIVER := 1
+
 SRCS-y += rte_ethdev.c
 
 #
diff --git a/lib/librte_hash/Makefile b/lib/librte_hash/Makefile
index bec61ab..3696cb1 100644
--- a/lib/librte_hash/Makefile
+++ b/lib/librte_hash/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_hash_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) := rte_hash.c
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) += rte_fbk_hash.c
diff --git a/lib/librte_ip_frag/Makefile b/lib/librte_ip_frag/Makefile
index aa88578..fe926f7 100644
--- a/lib/librte_ip_frag/Makefile
+++ b/lib/librte_ip_frag/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_ipfrag_version.map
 
+LIBABIVER := 1
+
 #source files
 ifeq ($(CONFIG_RTE_MBUF_REFCNT),y)
 SRCS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += rte_ipv4_fragmentation.c
diff --git a/lib/librte_ivshmem/Makefile b/lib/librte_ivshmem/Makefile
index 068ee10..16defdb 100644
--- a/lib/librte_ivshmem/Makefile
+++ b/lib/librte_ivshmem/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_ivshmem_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_IVSHMEM) := rte_ivshmem.c
 
diff --git a/lib/librte_kni/Makefile b/lib/librte_kni/Makefile
index 93a516d..7107832 100644
--- a/lib/librte_kni/Makefile
+++ b/lib/librte_kni/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := rte_kni_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KNI) := rte_kni.c
 
diff --git a/lib/librte_kvargs/Makefile b/lib/librte_kvargs/Makefile
index b1c34f3..87b09f2 100644
--- a/lib/librte_kvargs/Makefile
+++ b/lib/librte_kvargs/Makefile
@@ -40,6 +40,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_kvargs_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KVARGS) := rte_kvargs.c
 
diff --git a/lib/librte_lpm/Makefile b/lib/librte_lpm/Makefile
index 8214630..35e6389 100644
--- a/lib/librte_lpm/Makefile
+++ b/lib/librte_lpm/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_lpm_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_LPM) := rte_lpm.c rte_lpm6.c
 
diff --git a/lib/librte_malloc/Makefile b/lib/librte_malloc/Makefile
index 15b7eed..947e41c 100644
--- a/lib/librte_malloc/Makefile
+++ b/lib/librte_malloc/Makefile
@@ -34,6 +34,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_malloc.a
 
+LIBABIVER := 1
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_malloc_version.map
diff --git a/lib/librte_mbuf/Makefile b/lib/librte_mbuf/Makefile
index 03becae..080f3cf 100644
--- a/lib/librte_mbuf/Makefile
+++ b/lib/librte_mbuf/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_mbuf_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MBUF) := rte_mbuf.c
 
diff --git a/lib/librte_mempool/Makefile b/lib/librte_mempool/Makefile
index 31d1a71..940d1f7 100644
--- a/lib/librte_mempool/Makefile
+++ b/lib/librte_mempool/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_mempool_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) +=  rte_mempool.c
 ifeq ($(CONFIG_RTE_LIBRTE_XEN_DOM0),y)
diff --git a/lib/librte_meter/Makefile b/lib/librte_meter/Makefile
index c4a7a32..8765881 100644
--- a/lib/librte_meter/Makefile
+++ b/lib/librte_meter/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_meter_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pipeline/Makefile b/lib/librte_pipeline/Makefile
index 15b58df..15e406b 100644
--- a/lib/librte_pipeline/Makefile
+++ b/lib/librte_pipeline/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pipeline_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_af_packet/Makefile b/lib/librte_pmd_af_packet/Makefile
index 85a7860..f0bf537 100644
--- a/lib/librte_pmd_af_packet/Makefile
+++ b/lib/librte_pmd_af_packet/Makefile
@@ -40,6 +40,8 @@ LIB = librte_pmd_af_packet.a
 
 EXPORT_MAP := rte_pmd_af_packet_version.map
 
+LIBABIVER := 1
+
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
diff --git a/lib/librte_pmd_bond/Makefile b/lib/librte_pmd_bond/Makefile
index 074110a..d6c81a8 100644
--- a/lib/librte_pmd_bond/Makefile
+++ b/lib/librte_pmd_bond/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_bond_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_e1000/Makefile b/lib/librte_pmd_e1000/Makefile
index cd14444..8c8fed8 100644
--- a/lib/librte_pmd_e1000/Makefile
+++ b/lib/librte_pmd_e1000/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_e1000_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_enic/Makefile b/lib/librte_pmd_enic/Makefile
index 697231c..251a898 100644
--- a/lib/librte_pmd_enic/Makefile
+++ b/lib/librte_pmd_enic/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_enic.a
 
 EXPORT_MAP := rte_pmd_enic_version.map
 
+LIBABIVER := 1
+
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/vnic/
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/
 CFLAGS += -O3
diff --git a/lib/librte_pmd_i40e/Makefile b/lib/librte_pmd_i40e/Makefile
index 73de373..9a0eec8 100644
--- a/lib/librte_pmd_i40e/Makefile
+++ b/lib/librte_pmd_i40e/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_i40e_version.map
 
+LIBABIVER := 1
+
 #
 # Add extra flags for base driver files (also known as shared code)
 # to disable warnings
diff --git a/lib/librte_pmd_ixgbe/Makefile b/lib/librte_pmd_ixgbe/Makefile
index e0a17f6..d580f62 100644
--- a/lib/librte_pmd_ixgbe/Makefile
+++ b/lib/librte_pmd_ixgbe/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_ixgbe_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_pcap/Makefile b/lib/librte_pmd_pcap/Makefile
index cb6678e..0775dbc 100644
--- a/lib/librte_pmd_pcap/Makefile
+++ b/lib/librte_pmd_pcap/Makefile
@@ -42,6 +42,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_pcap_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_ring/Makefile b/lib/librte_pmd_ring/Makefile
index aa1b461..e442d0b 100644
--- a/lib/librte_pmd_ring/Makefile
+++ b/lib/librte_pmd_ring/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_ring_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_virtio/Makefile b/lib/librte_pmd_virtio/Makefile
index d979c59..793067f 100644
--- a/lib/librte_pmd_virtio/Makefile
+++ b/lib/librte_pmd_virtio/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_virtio_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_vmxnet3/Makefile b/lib/librte_pmd_vmxnet3/Makefile
index f3ab178..93e5580 100644
--- a/lib/librte_pmd_vmxnet3/Makefile
+++ b/lib/librte_pmd_vmxnet3/Makefile
@@ -68,6 +68,8 @@ VPATH += $(RTE_SDK)/lib/librte_pmd_vmxnet3/vmxnet3
 
 EXPORT_MAP := rte_pmd_vmxnet3_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_xenvirt/Makefile b/lib/librte_pmd_xenvirt/Makefile
index 4510603..f0c796c 100644
--- a/lib/librte_pmd_xenvirt/Makefile
+++ b/lib/librte_pmd_xenvirt/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_xenvirt_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_port/Makefile b/lib/librte_port/Makefile
index 266ed39..0e38452 100644
--- a/lib/librte_port/Makefile
+++ b/lib/librte_port/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_port_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_power/Makefile b/lib/librte_power/Makefile
index 0547dcd..cee95cd 100644
--- a/lib/librte_power/Makefile
+++ b/lib/librte_power/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := rte_power_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) := rte_power.c rte_power_acpi_cpufreq.c
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) += rte_power_kvm_vm.c guest_channel.c
diff --git a/lib/librte_ring/Makefile b/lib/librte_ring/Makefile
index b437dc5..84ad3d3 100644
--- a/lib/librte_ring/Makefile
+++ b/lib/librte_ring/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_ring_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_RING) := rte_ring.c
 
diff --git a/lib/librte_sched/Makefile b/lib/librte_sched/Makefile
index 48f280a..b1cb285 100644
--- a/lib/librte_sched/Makefile
+++ b/lib/librte_sched/Makefile
@@ -43,6 +43,8 @@ CFLAGS_rte_red.o := -D_GNU_SOURCE
 
 EXPORT_MAP := rte_sched_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_table/Makefile b/lib/librte_table/Makefile
index 4e1a54a..0d8394c 100644
--- a/lib/librte_table/Makefile
+++ b/lib/librte_table/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_table_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_timer/Makefile b/lib/librte_timer/Makefile
index 9fb6079..2aabef8 100644
--- a/lib/librte_timer/Makefile
+++ b/lib/librte_timer/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_timer_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_TIMER) := rte_timer.c
 
diff --git a/lib/librte_vhost/Makefile b/lib/librte_vhost/Makefile
index 96a7dd0..369c25a 100644
--- a/lib/librte_vhost/Makefile
+++ b/lib/librte_vhost/Makefile
@@ -36,6 +36,8 @@ LIB = librte_vhost.a
 
 EXPORT_MAP := rte_vhost_version.map
 
+LIBABIVER := 1
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -D_FILE_OFFSET_BITS=64 -lfuse
 LDFLAGS += -lfuse
 # all source are stored in SRCS-y
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 1d3b646..865a307 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -37,10 +37,9 @@ include $(RTE_SDK)/mk/internal/rte.depdirs-pre.mk
 
 # VPATH contains at least SRCDIR
 VPATH += $(SRCDIR)
-
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
-LIB := $(patsubst %.a,%.so,$(LIB))
 
+LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB))
 CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
 
 endif
@@ -113,6 +112,10 @@ lib_dir = [ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib;
 #
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
+ifeq ($(LIBABIVER),)
+	@echo "Must Specify a $(LIB) ABI version"
+	@false
+endif
 	@[ -d $(dir $@) ] || mkdir -p $(dir $@)
 	$(if $(D),\
 		@echo -n "$< -> $@ " ; \
@@ -126,6 +129,7 @@ $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
 		$(depfile_missing),\
 		$(depfile_newer)),\
 		$(O_TO_S_DO))
+
 ifeq ($(RTE_BUILD_COMBINE_LIBS),y)
 	$(if $(or \
         $(file_missing),\
@@ -163,9 +167,13 @@ endif
 # install lib in $(RTE_OUTPUT)/lib
 #
 $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
+	$(eval LIBSONAME := $(basename $(LIB)))
 	@echo "  INSTALL-LIB $(LIB)"
 	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
 	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
+ifeq ($(RTE_BUILD_SHARED_LIB),y)
+	$(Q)ln -s -f $< $(RTE_OUTPUT)/lib/$(LIBSONAME)
+endif
 
 #
 # Clean all generated files
-- 
2.1.0

^ permalink raw reply	[relevance 7%]

* [dpdk-dev] [PATCH v8 1/4] compat: Add infrastructure to support symbol versioning
  2014-12-20 21:01  4% [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
                   ` (9 preceding siblings ...)
  2015-01-21 20:59  3% ` [dpdk-dev] [PATCH v7 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
@ 2015-01-22 15:49  3% ` Neil Horman
  2015-01-22 15:49  7%   ` [dpdk-dev] [PATCH v8 3/4] Add library version extenstion Neil Horman
  2015-01-22 15:49 23%   ` [dpdk-dev] [PATCH v8 4/4] docs: Add ABI documentation Neil Horman
       [not found]     ` <1422898822-16422-1-git-send-email-nhorman@tuxdriver.com>
  2015-02-03 16:01  0% ` [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Thomas Monjalon
  12 siblings, 2 replies; 200+ results
From: Neil Horman @ 2015-01-22 15:49 UTC (permalink / raw)
  To: dev

Add initial pass header files to support symbol versioning.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
CC: "Gonzalez Monroy, Sergio" <sergio.gonzalez.monroy@intel.com>

---
Change Notes:
V2)
	Moved ifeq to _INSTALL target

V3)
	Undo V2 changes and make librte_compat use the rte.install.mk file
instead

v4)
	changed --version-script to accept SRCDIR in this patch at per request
	documented versioning macros
	cleaned up macro parameter consistency
	converted SA macro to RTE_STR macro
	fixed copyright
---
 lib/Makefile                   |   1 +
 lib/librte_compat/Makefile     |  38 +++++++++++++
 lib/librte_compat/rte_compat.h | 117 +++++++++++++++++++++++++++++++++++++++++
 mk/rte.lib.mk                  |   4 ++
 4 files changed, 160 insertions(+)
 create mode 100644 lib/librte_compat/Makefile
 create mode 100644 lib/librte_compat/rte_compat.h

diff --git a/lib/Makefile b/lib/Makefile
index 0ffc982..d617d81 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -31,6 +31,7 @@
 
 include $(RTE_SDK)/mk/rte.vars.mk
 
+DIRS-y += librte_compat
 DIRS-$(CONFIG_RTE_LIBRTE_EAL) += librte_eal
 DIRS-$(CONFIG_RTE_LIBRTE_MALLOC) += librte_malloc
 DIRS-$(CONFIG_RTE_LIBRTE_RING) += librte_ring
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
new file mode 100644
index 0000000..0bab870
--- /dev/null
+++ b/lib/librte_compat/Makefile
@@ -0,0 +1,38 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2013 Neil Horman <nhorman@tuxdriver.com>
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+
+# install includes
+SYMLINK-y-include := rte_compat.h
+
+include $(RTE_SDK)/mk/rte.install.mk
diff --git a/lib/librte_compat/rte_compat.h b/lib/librte_compat/rte_compat.h
new file mode 100644
index 0000000..d7cc176
--- /dev/null
+++ b/lib/librte_compat/rte_compat.h
@@ -0,0 +1,117 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2010 Neil Horman <nhorman@tuxdriver.com>.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _RTE_COMPAT_H_
+#define _RTE_COMPAT_H_
+#include <rte_common.h>
+
+#ifdef RTE_BUILD_SHARED_LIB
+
+/*
+ * Provides backwards compatibility when updating exported functions.
+ * When a symol is exported from a library to provide an API, it also provides a
+ * calling convention (ABI) that is embodied in its name, return type,
+ * arguments, etc.  On occasion that function may need to change to accomodate
+ * new functionality, behavior, etc.  When that occurs, it is desireable to
+ * allow for backwards compatibility for a time with older binaries that are
+ * dynamically linked to the dpdk.  To support that, the __vsym and
+ * VERSION_SYMBOL macros are created.  They, in conjunction with the
+ * <library>_version.map file for a given library allow for multiple versions of
+ * a symbol to exist in a shared library so that older binaries need not be
+ * immediately recompiled. Their use is outlined in the following example:
+ * Assumptions: DPDK 1.(X) contains a function int foo(char *string)
+ *              DPDK 1.(X+1) needs to change foo to be int foo(int index)
+ *
+ * To accomplish this:
+ * 1) Edit lib/<library>/library_version.map to add a DPDK_1.(X+1) node, in which
+ * foo is exported as a global symbol.
+ *
+ * 2) rename the existing function int foo(char *string) to 
+ * 	int __vsym foo_v18(char *string)
+ *
+ * 3) Add this macro immediately below the function
+ * 	VERSION_SYMBOL(foo, _v18, 1.8);
+ *
+ * 4) Implement a new version of foo.
+ * 	char foo(int value, int otherval) { ...}
+ *
+ * 5) Mark the newest version as the default version
+ * 	BIND_DEFAULT_SYMBOL(foo, 1.9);
+ *
+ */
+
+/* 
+ * Macro Parameters:
+ * b - function base name
+ * e - function version extension, to be concatenated with base name
+ * n - function symbol version string to be applied
+ */
+
+/*
+ * VERSION_SYMBOL
+ * Creates a symbol version table entry binding symbol <b>@DPDK_<n> to the internal
+ * function name <b>_<e>
+ */ 
+#define VERSION_SYMBOL(b, e, n) __asm__(".symver " RTE_STR(b) RTE_STR(e) ", "RTE_STR(b)"@DPDK_"RTE_STR(n))
+
+/*
+ * BASE_SYMBOL
+ * Creates a symbol version table entry binding unversioned symbol <b> 
+ * to the internal function <b>_<e>
+ */ 
+#define BASE_SYMBOL(b, e) __asm__(".symver " RTE_STR(b) RTE_STR(e) ", "RTE_STR(b)"@")
+
+/*
+ * BNID_DEFAULT_SYMBOL
+ * Creates a symbol version entry instructing the linker to bind references to
+ * symbol <b> to the internal symbol <b>_<e>
+ */
+#define BIND_DEFAULT_SYMBOL(b, e, n) __asm__(".symver " RTE_STR(b) RTE_STR(e) ", "RTE_STR(b)"@@DPDK_"RTE_STR(n))
+#define __vsym __attribute__((used))
+
+#else
+/*
+ * No symbol versioning in use
+ */
+#define VERSION_SYMBOL(b, e, v)
+#define __vsym
+#define BASE_SYMBOL(b, n)
+#define BIND_DEFAULT_SYMBOL(b, v)
+
+/*
+ * RTE_BUILD_SHARED_LIB=n
+ */
+#endif
+
+
+#endif /* _RTE_COMPAT_H_ */
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 81bf8e1..1d3b646 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -40,8 +40,12 @@ VPATH += $(SRCDIR)
 
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 LIB := $(patsubst %.a,%.so,$(LIB))
+
+CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
+
 endif
 
+
 _BUILD = $(LIB)
 _INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) $(RTE_OUTPUT)/lib/$(LIB)
 _CLEAN = doclean
-- 
2.1.0

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v7 4/4] docs: Add ABI documentation
  2015-01-22 10:56  8%     ` Iremonger, Bernard
@ 2015-01-22 15:37  7%       ` Neil Horman
  0 siblings, 0 replies; 200+ results
From: Neil Horman @ 2015-01-22 15:37 UTC (permalink / raw)
  To: Iremonger, Bernard; +Cc: dev

On Thu, Jan 22, 2015 at 10:56:08AM +0000, Iremonger, Bernard wrote:
> 
> 
> > -----Original Message-----
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> > Sent: Wednesday, January 21, 2015 9:00 PM
> > To: dev@dpdk.org
> > Subject: [dpdk-dev] [PATCH v7 4/4] docs: Add ABI documentation
> > 
> > Adding a document describing rudimentary ABI policy and adding notice space for any deprecation
> > announcements
> > 
> > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> > CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> > CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> 
> Hi Neil,
> 
> Tried to apply the patch and build it, the following warnings occurred.
> 
> Applying: docs: Add ABI documentation
> /nfs/sie/disks/git_workspace/bairemon/dpdk-doc-next/.git/rebase-apply/patch:55: trailing whitespace.
> -------------------------------  
> /nfs/sie/disks/git_workspace/bairemon/dpdk-doc-next/.git/rebase-apply/patch:22: new blank line at EOF.
> +
> warning: 2 lines add whitespace errors.
> 
Those errors don't make much sense.  Theres no whitespace on line 55 of the
patch after the last character and line 22 isn't the end of a file that I can
see.

> sivswdev01> make doc-guides-html
> sphinx for guides...
> /nfs/sie/disks/git_workspace/bairemon/dpdk-doc-next/doc/guides/rel_notes/abi.rst:: WARNING: document isn't included in any toctree
> 
> Change to doc/guides/rel_notes/index.rst is missing from the patch.
> 
> Suggest applying and building the patch and then checking the generated HTML in Firefox to see that it is as you expect.
> file:///home/nhorman/dpdk-doc-next/build/doc/html/guides/rel_notes/index.html
> 
No, the generated html works fine.  I have the abi line added to index.rst but
somehow it didn't get comitted, so my testing worked, but the patch isn't right.
I'll resend it, and try to figure out whats wrong with those lines, though they
really seem screwy to me.
Neil

> Regards,
> 
> Bernard.
> 
>  
> > 
> > ---
> > Change notes:
> > 
> > v5) Updated documentation to add notes from Thomas M.
> > 
> > v6) Moved abi.txt to guides/rel_notes/abi.rst
> > 
> > v7) Updated abi.rst to integrate with index file
> >     Updated abi.rst to conform to rst formatting
> >     Updated abi.rst to include example deprecation notices.  Its not exactly the language that Thomas
> > indicated, but I think it makes the idea clear.
> > ---
> >  doc/guides/rel_notes/abi.rst | 41 +++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 41 insertions(+)
> >  create mode 100644 doc/guides/rel_notes/abi.rst
> > 
> > diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst new file mode 100644 index
> > 0000000..9b72719
> > --- /dev/null
> > +++ b/doc/guides/rel_notes/abi.rst
> > @@ -0,0 +1,41 @@
> > +ABI policy
> > +==========
> > +ABI versions are set at the time of major release labeling, and ABI may
> > +change multiple times between the last labeling and the HEAD label of
> > +the git tree without warning.
> > +
> > +ABI versions, once released are available until such time as their
> > +deprecation has been noted here for at least one major release cycle,
> > +after it has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and
> > +then the decision to remove it is made during the development of DPDK
> > +1.9.  The decision will be recorded here, shipped with the DPDK 1.9
> > +release, and actually removed when DPDK
> > +1.10 ships.
> > +
> > +ABI versions may be deprecated in whole, or in part as needed by a given update.
> > +
> > +Some ABI changes may be too significant to reasonably maintain multiple
> > +versions of.  In those events ABI's may be updated without backward
> > +compatibility provided.  The requirements for doing so are:
> > +
> > +#. At least 3 acknoweldgements of the need on the dpdk.org #. A full
> > +deprecation cycle must be made to offer downstream consumers sufficient
> > +warning of the change.  E.g. if dpdk 2.0 is under development when the
> > +change is proposed, a deprecation notice must be added to this file,
> > +and released with dpdk 2.0.  Then the change may be incorporated for
> > +dpdk 2.1 #. The LIBABIVER variable in the makefilei(s) where the ABI
> > +changes are incorporated must be incremented in parallel with the ABI
> > +changes themselves
> > +
> > +Note that the above process for ABI deprecation should not be
> > +undertaken lightly.  ABI stability is extreemely important for
> > +downstream consumers of the DPDK, especially when distributed in shared
> > +object form.  Every effort should be made to preserve ABI whenever
> > +possible.  For instance, reorganizing public structure field for
> > +astetic or readability purposes should be avoided as it will cause ABI
> > +breakage.  Only significant (e.g. performance) reasons should be seen as cause to alter ABI.
> > +
> > +Examples of Deprecation notices
> > +-------------------------------
> > +* The Macro #RTE_FOO is deprecated and will be removed with version
> > +2.0, to be replaced with the inline function rte_bar()
> > +* The function rte_mbuf_grok has been updated to include new parameter
> > +in version 2.0.  Backwards compatibility will be maintained for this
> > +function until the release of version 2.1
> > +* The members struct foo have been reorganized in release 2.0.  Existing binary applications will have
> > backwards compatibility in release 2.0, while newly built binaries will need to reference new structure
> > variant struct foo2.  Compatibility will be removed in release 2.2, and all applications will require
> > updating a rebuilding to the new structure at that time, which will be renamed to the origional struct
> > foo.
> > +* Significant ABI changes are planned for the librte_dostuff library.  The upcomming release 2.0 will
> > not contain these changes, but release 2.1 will, and no backwards compatibility is planned due to the
> > invasive nature of these changes.  Binaries using this library built prior to version 2.1 will require
> > updating and recompilation.
> > +
> > +Deprecation Notices
> > +-------------------
> > +
> > --
> > 2.1.0
> 
> 

^ permalink raw reply	[relevance 7%]

* Re: [dpdk-dev] [PATCH v7 4/4] docs: Add ABI documentation
  2015-01-21 20:59 23%   ` [dpdk-dev] [PATCH v7 4/4] docs: Add ABI documentation Neil Horman
@ 2015-01-22 10:56  8%     ` Iremonger, Bernard
  2015-01-22 15:37  7%       ` Neil Horman
  0 siblings, 1 reply; 200+ results
From: Iremonger, Bernard @ 2015-01-22 10:56 UTC (permalink / raw)
  To: Neil Horman, dev



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> Sent: Wednesday, January 21, 2015 9:00 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v7 4/4] docs: Add ABI documentation
> 
> Adding a document describing rudimentary ABI policy and adding notice space for any deprecation
> announcements
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: "Richardson, Bruce" <bruce.richardson@intel.com>

Hi Neil,

Tried to apply the patch and build it, the following warnings occurred.

Applying: docs: Add ABI documentation
/nfs/sie/disks/git_workspace/bairemon/dpdk-doc-next/.git/rebase-apply/patch:55: trailing whitespace.
-------------------------------  
/nfs/sie/disks/git_workspace/bairemon/dpdk-doc-next/.git/rebase-apply/patch:22: new blank line at EOF.
+
warning: 2 lines add whitespace errors.

sivswdev01> make doc-guides-html
sphinx for guides...
/nfs/sie/disks/git_workspace/bairemon/dpdk-doc-next/doc/guides/rel_notes/abi.rst:: WARNING: document isn't included in any toctree

Change to doc/guides/rel_notes/index.rst is missing from the patch.

Suggest applying and building the patch and then checking the generated HTML in Firefox to see that it is as you expect.
file:///home/nhorman/dpdk-doc-next/build/doc/html/guides/rel_notes/index.html

Regards,

Bernard.

 
> 
> ---
> Change notes:
> 
> v5) Updated documentation to add notes from Thomas M.
> 
> v6) Moved abi.txt to guides/rel_notes/abi.rst
> 
> v7) Updated abi.rst to integrate with index file
>     Updated abi.rst to conform to rst formatting
>     Updated abi.rst to include example deprecation notices.  Its not exactly the language that Thomas
> indicated, but I think it makes the idea clear.
> ---
>  doc/guides/rel_notes/abi.rst | 41 +++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 41 insertions(+)
>  create mode 100644 doc/guides/rel_notes/abi.rst
> 
> diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst new file mode 100644 index
> 0000000..9b72719
> --- /dev/null
> +++ b/doc/guides/rel_notes/abi.rst
> @@ -0,0 +1,41 @@
> +ABI policy
> +==========
> +ABI versions are set at the time of major release labeling, and ABI may
> +change multiple times between the last labeling and the HEAD label of
> +the git tree without warning.
> +
> +ABI versions, once released are available until such time as their
> +deprecation has been noted here for at least one major release cycle,
> +after it has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and
> +then the decision to remove it is made during the development of DPDK
> +1.9.  The decision will be recorded here, shipped with the DPDK 1.9
> +release, and actually removed when DPDK
> +1.10 ships.
> +
> +ABI versions may be deprecated in whole, or in part as needed by a given update.
> +
> +Some ABI changes may be too significant to reasonably maintain multiple
> +versions of.  In those events ABI's may be updated without backward
> +compatibility provided.  The requirements for doing so are:
> +
> +#. At least 3 acknoweldgements of the need on the dpdk.org #. A full
> +deprecation cycle must be made to offer downstream consumers sufficient
> +warning of the change.  E.g. if dpdk 2.0 is under development when the
> +change is proposed, a deprecation notice must be added to this file,
> +and released with dpdk 2.0.  Then the change may be incorporated for
> +dpdk 2.1 #. The LIBABIVER variable in the makefilei(s) where the ABI
> +changes are incorporated must be incremented in parallel with the ABI
> +changes themselves
> +
> +Note that the above process for ABI deprecation should not be
> +undertaken lightly.  ABI stability is extreemely important for
> +downstream consumers of the DPDK, especially when distributed in shared
> +object form.  Every effort should be made to preserve ABI whenever
> +possible.  For instance, reorganizing public structure field for
> +astetic or readability purposes should be avoided as it will cause ABI
> +breakage.  Only significant (e.g. performance) reasons should be seen as cause to alter ABI.
> +
> +Examples of Deprecation notices
> +-------------------------------
> +* The Macro #RTE_FOO is deprecated and will be removed with version
> +2.0, to be replaced with the inline function rte_bar()
> +* The function rte_mbuf_grok has been updated to include new parameter
> +in version 2.0.  Backwards compatibility will be maintained for this
> +function until the release of version 2.1
> +* The members struct foo have been reorganized in release 2.0.  Existing binary applications will have
> backwards compatibility in release 2.0, while newly built binaries will need to reference new structure
> variant struct foo2.  Compatibility will be removed in release 2.2, and all applications will require
> updating a rebuilding to the new structure at that time, which will be renamed to the origional struct
> foo.
> +* Significant ABI changes are planned for the librte_dostuff library.  The upcomming release 2.0 will
> not contain these changes, but release 2.1 will, and no backwards compatibility is planned due to the
> invasive nature of these changes.  Binaries using this library built prior to version 2.1 will require
> updating and recompilation.
> +
> +Deprecation Notices
> +-------------------
> +
> --
> 2.1.0

^ permalink raw reply	[relevance 8%]

* Re: [dpdk-dev] [PATCH v6 4/4] docs: Add ABI documentation
  2015-01-21 19:43  4%           ` Neil Horman
@ 2015-01-21 22:24  9%             ` Thomas Monjalon
  2015-01-22 19:21  4%               ` Neil Horman
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2015-01-21 22:24 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

2015-01-21 14:43, Neil Horman:
> On Wed, Jan 21, 2015 at 05:05:51PM +0100, Thomas Monjalon wrote:
> > 2015-01-21 09:59, Neil Horman:
> > > Considered and answered already.  I'm in favor of listing macros and structure
> > > changes in the abi document, but I think an exhaustive list isn't needed.  If it
> > > is, we could spend pages diving into minute.  Better to point out the need for
> > > abi noticies as patches get posted.
> > 
> > I'm afraid you don't understand what I'm saying. Copy/paste:
> > "No, I was suggesting to explain in this doc that macro removal must be
> > announced with a deprecation notice,
> > and that in case structure must be reworked, the name must change if we
> > want to preserve ABI compatibility with old structure."
> > Rewording: if you agree with this policy, please add it in this document.
> > 
> Yes, we're on the same page regarding what your asking, I just don't agree that
> it needs to be explicitly called out.  I thought I was clear on that.
> Appaerntly not however, so if it will settle the point, I'll just add it.

OK maybe I didn't explain enough my proposal.
You can disagree but I want to be sure we think about the same thing.

1) Macros are not part of the ABI but can be part of the API.
Such macro removal must be announced in the previous release.
2) Structures are part of the ABI but cannot be versionned as the functions.
So an ABI breaking change should be done by cloning the structure in a new one.
And the API functions where this structure appears should be cloned and versionned
to support new structure while keeping old version.

Maybe that these precisions are confuse and useless.
Now I think I understand what you were saying by "an exhaustive list isn't needed".
You mean listing all types of ABI/API breakage like I did with these 2 cases, right?
I thought it was related to list of real/effective deprecations.

> > > > Neil, we expect that you consider comments done previously and that you test your patch.
> > > > Otherwise, we are losing time in useless reviews.
> > > > 
> > > Thomas, I have considered your comments, I simply don't agree with all of them,
> > > and I made that clear.
> > > 
> > > As for losing time, you let the first attempt at this
> > > patch rot on the list in 1.7 and have done the same thing for the 1.8 cycle
> > > until I yelled for reviews.
> > 
> > Now, I'm really upset of your wrong assumptions.
> > You sent your first proposal on september, during 1.8 cycle, not 1.7 !
> > And during this cycle, the decision was to postpone it for 2.0 release.
> > 
> you're missing the point. I apologize for not getting the release numbers right,
> it should be 1.8 to 2.0 not 1.7 to 1.8 as you note, but that doesn't really
> matter.  The point was 6 months.  6 months this has been sitting around.

No, 5 months. Yes, it's long.

> In that time up to this point I've gotten one review from another devloper on the
> set, and you indicating that its not ready yet.  Then, the day 1.8 released, I
> reposed the patch series as we agreed, and its taken almost 5 weeks before I've
> gotten any feedback on it, and then its feedback that could have been given 6
> months ago (you'll note this patch was initially identical to the version I
> posted back in september).  I think you can understand how I find that
> frustrating.

You must understand that I'd prefer more people feel involved by this change.
It would be saner to have this policy reviewed and acked by many developpers.
As it was announced on the roadmap for 2.0, this first month of the cycle was
ideal to have more discussions on how this policy can be precisely applied.
You only received my comments (which may be useless) and it's now time to
apply this important patchset.

> > I don't understand what's wrong with you.
> The above is whats wrong with me.  The fact that I can try and try and try to
> add value to this project so that I can expand its user base, and the best I've
> thus far been able to receive is indifference.  At worst, the indifference is
> followed by being told that the indifference is tantamount to rejection.
> 
> 
> > You don't make any effort to understand what we are saying and
> > you make no effort to understand what is this doc directory.
> > You prefer crying that your patch is not applied.
> No effort?  How many emails have I written contesting your opinions, presenting
> supporting evidence, only to be met with assertions?  I don't think I'm the one
> not making an effort here.

At the end, I accept your point of view and will apply the patchset.

> > And I still don't understand if you are willing to work on a test tool for ABI?
> > 
> From this email
> http://dpdk.org/ml/archives/dev/2015-January/011306.html
> 
> =======================================================
> > Yes, it should be another patchset.
> > Do you plan to work on it? It would be very convenient for developpers and
> > maintainers to test ABI compatibility.
> > 
> Gladly, if we can get this in.  I think its an important tool.
> =========================================================
> 
> I'm not sure how thats unclear, but in the event that it wasn't, yes, I will
> gladly work on such a tool.

OK thanks, it would be helpful to have it in release 2.0.

> > > No doubt when all is said and done here you'll
> > > complain because this series likely won't work when you apply it for all the
> > > patches you take between the time I posted it and now.  So lets be careful about
> > > complaining over wasted time.
> > 
> > Note that I'm sure we can do some good work together. And I'd prefer more
> > pleasant discussions. Life is too short to have this kind of conflict.
> > 
> I agree, and we've done so in the past.  I'm sorry if I've upset you, it wasn't
> my intention.  That said, can you see how I might be frustrated by this patch
> set taking 6 months to get reviewed, only to have commentary made on it that I
> could have handled back at the beginning of this whole mess?

Yes, I was hoping more people would participate in this discussion.

> Participation.  Thats really whats needed here.  Not just from you, not just
> from me, everyone, and not just on the items that we consider important to
> ourselves.  Indifference leads to exclusion and frustration.

You're totally right. Participation is the key.
Sometimes, we have to *carefully* review patches whose we have no interest.
And maybe someone else will do the same thing for a patch we care.
This is a message ;)

-- 
Thomas

^ permalink raw reply	[relevance 9%]

* [dpdk-dev] [PATCH v7 4/4] docs: Add ABI documentation
  2015-01-21 20:59  3% ` [dpdk-dev] [PATCH v7 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
  2015-01-21 20:59  7%   ` [dpdk-dev] [PATCH v7 3/4] Add library version extenstion Neil Horman
@ 2015-01-21 20:59 23%   ` Neil Horman
  2015-01-22 10:56  8%     ` Iremonger, Bernard
  1 sibling, 1 reply; 200+ results
From: Neil Horman @ 2015-01-21 20:59 UTC (permalink / raw)
  To: dev

Adding a document describing rudimentary ABI policy and adding notice space for
any deprecation announcements

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>

---
Change notes:

v5) Updated documentation to add notes from Thomas M.

v6) Moved abi.txt to guides/rel_notes/abi.rst

v7) Updated abi.rst to integrate with index file
    Updated abi.rst to conform to rst formatting
    Updated abi.rst to include example deprecation notices.  Its not exactly the
language that Thomas indicated, but I think it makes the idea clear.
---
 doc/guides/rel_notes/abi.rst | 41 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)
 create mode 100644 doc/guides/rel_notes/abi.rst

diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst
new file mode 100644
index 0000000..9b72719
--- /dev/null
+++ b/doc/guides/rel_notes/abi.rst
@@ -0,0 +1,41 @@
+ABI policy
+==========
+ABI versions are set at the time of major release labeling, and ABI may change
+multiple times between the last labeling and the HEAD label of the git tree
+without warning.
+
+ABI versions, once released are available until such time as their
+deprecation has been noted here for at least one major release cycle, after it
+has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
+remove it is made during the development of DPDK 1.9.  The decision will be
+recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
+1.10 ships.
+
+ABI versions may be deprecated in whole, or in part as needed by a given update.
+
+Some ABI changes may be too significant to reasonably maintain multiple
+versions of.  In those events ABI's may be updated without backward
+compatibility provided.  The requirements for doing so are:
+
+#. At least 3 acknoweldgements of the need on the dpdk.org
+#. A full deprecation cycle must be made to offer downstream consumers sufficient warning of the change.  E.g. if dpdk 2.0 is under development when the change is proposed, a deprecation notice must be added to this file, and released with dpdk 2.0.  Then the change may be incorporated for dpdk 2.1
+#. The LIBABIVER variable in the makefilei(s) where the ABI changes are incorporated must be incremented in parallel with the ABI changes themselves
+
+Note that the above process for ABI deprecation should not be undertaken
+lightly.  ABI stability is extreemely important for downstream consumers of the
+DPDK, especially when distributed in shared object form.  Every effort should be
+made to preserve ABI whenever possible.  For instance, reorganizing public
+structure field for astetic or readability purposes should be avoided as it will
+cause ABI breakage.  Only significant (e.g. performance) reasons should be seen
+as cause to alter ABI.
+
+Examples of Deprecation notices
+-------------------------------  
+* The Macro #RTE_FOO is deprecated and will be removed with version 2.0, to be replaced with the inline function rte_bar()
+* The function rte_mbuf_grok has been updated to include new parameter in version 2.0.  Backwards compatibility will be maintained for this function until the release of version 2.1
+* The members struct foo have been reorganized in release 2.0.  Existing binary applications will have backwards compatibility in release 2.0, while newly built binaries will need to reference new structure variant struct foo2.  Compatibility will be removed in release 2.2, and all applications will require updating a rebuilding to the new structure at that time, which will be renamed to the origional struct foo.
+* Significant ABI changes are planned for the librte_dostuff library.  The upcomming release 2.0 will not contain these changes, but release 2.1 will, and no backwards compatibility is planned due to the invasive nature of these changes.  Binaries using this library built prior to version 2.1 will require updating and recompilation.
+
+Deprecation Notices
+-------------------
+
-- 
2.1.0

^ permalink raw reply	[relevance 23%]

* [dpdk-dev] [PATCH v7 3/4] Add library version extenstion
  2015-01-21 20:59  3% ` [dpdk-dev] [PATCH v7 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
@ 2015-01-21 20:59  7%   ` Neil Horman
  2015-01-21 20:59 23%   ` [dpdk-dev] [PATCH v7 4/4] docs: Add ABI documentation Neil Horman
  1 sibling, 0 replies; 200+ results
From: Neil Horman @ 2015-01-21 20:59 UTC (permalink / raw)
  To: dev

To differentiate libraries that break ABI, we add a library version number
suffix to the library, which must be incremented when a given libraries ABI is
broken.  This patch enforces that addition, sets the initial abi soname
extension to 1 for each library and creates a symlink to the base SONAME so that
the test applications will link properly.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>

---
Change Notes:
v3)
	Made symlinking of libraries conditional on a DSO build

v4)	Removed erroneous newline
	changed @exit 1 to @false
	changed ./$(LIB) to $<
---
 lib/librte_acl/Makefile              |  2 ++
 lib/librte_cfgfile/Makefile          |  2 ++
 lib/librte_cmdline/Makefile          |  2 ++
 lib/librte_compat/Makefile           |  2 ++
 lib/librte_distributor/Makefile      |  2 ++
 lib/librte_eal/bsdapp/eal/Makefile   |  2 ++
 lib/librte_eal/linuxapp/eal/Makefile |  2 ++
 lib/librte_ether/Makefile            |  2 ++
 lib/librte_hash/Makefile             |  2 ++
 lib/librte_ip_frag/Makefile          |  2 ++
 lib/librte_ivshmem/Makefile          |  2 ++
 lib/librte_kni/Makefile              |  2 ++
 lib/librte_kvargs/Makefile           |  2 ++
 lib/librte_lpm/Makefile              |  2 ++
 lib/librte_malloc/Makefile           |  2 ++
 lib/librte_mbuf/Makefile             |  2 ++
 lib/librte_mempool/Makefile          |  2 ++
 lib/librte_meter/Makefile            |  2 ++
 lib/librte_pipeline/Makefile         |  2 ++
 lib/librte_pmd_af_packet/Makefile    |  2 ++
 lib/librte_pmd_bond/Makefile         |  2 ++
 lib/librte_pmd_e1000/Makefile        |  2 ++
 lib/librte_pmd_enic/Makefile         |  2 ++
 lib/librte_pmd_i40e/Makefile         |  2 ++
 lib/librte_pmd_ixgbe/Makefile        |  2 ++
 lib/librte_pmd_pcap/Makefile         |  2 ++
 lib/librte_pmd_ring/Makefile         |  2 ++
 lib/librte_pmd_virtio/Makefile       |  2 ++
 lib/librte_pmd_vmxnet3/Makefile      |  2 ++
 lib/librte_pmd_xenvirt/Makefile      |  2 ++
 lib/librte_port/Makefile             |  2 ++
 lib/librte_power/Makefile            |  2 ++
 lib/librte_ring/Makefile             |  2 ++
 lib/librte_sched/Makefile            |  2 ++
 lib/librte_table/Makefile            |  2 ++
 lib/librte_timer/Makefile            |  2 ++
 lib/librte_vhost/Makefile            |  2 ++
 mk/rte.lib.mk                        | 12 ++++++++++--
 38 files changed, 84 insertions(+), 2 deletions(-)

diff --git a/lib/librte_acl/Makefile b/lib/librte_acl/Makefile
index 45cbf80..765deb1 100644
--- a/lib/librte_acl/Makefile
+++ b/lib/librte_acl/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_acl_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_ACL) += tb_mem.c
 
diff --git a/lib/librte_cfgfile/Makefile b/lib/librte_cfgfile/Makefile
index a4f73de..032c240 100644
--- a/lib/librte_cfgfile/Makefile
+++ b/lib/librte_cfgfile/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_cfgfile_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_cmdline/Makefile b/lib/librte_cmdline/Makefile
index 3c71831..719dff6 100644
--- a/lib/librte_cmdline/Makefile
+++ b/lib/librte_cmdline/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_cmdline_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) := cmdline.c
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_cirbuf.c
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
index 0bab870..0c57533 100644
--- a/lib/librte_compat/Makefile
+++ b/lib/librte_compat/Makefile
@@ -32,6 +32,8 @@
 include $(RTE_SDK)/mk/rte.vars.mk
 
 
+LIBABIVER := 1
+
 # install includes
 SYMLINK-y-include := rte_compat.h
 
diff --git a/lib/librte_distributor/Makefile b/lib/librte_distributor/Makefile
index 3674a2c..4c9af17 100644
--- a/lib/librte_distributor/Makefile
+++ b/lib/librte_distributor/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_distributor_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor.c
 
diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index 0b5f9d9..ae214a4 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -48,6 +48,8 @@ CFLAGS += $(WERROR_FLAGS) -O3
 
 EXPORT_MAP := rte_eal_version.map
 
+LIBABIVER := 1
+
 # specific to linuxapp exec-env
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) := eal.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_memory.c
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index bae8af1..e117cec 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -35,6 +35,8 @@ LIB = librte_eal.a
 
 EXPORT_MAP := rte_eal_version.map
 
+LIBABIVER := 1
+
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
 CFLAGS += -I$(SRCDIR)/include
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index 80ad78d..c0e5768 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_ether_version.map
 
+LIBABIVER := 1
+
 SRCS-y += rte_ethdev.c
 
 #
diff --git a/lib/librte_hash/Makefile b/lib/librte_hash/Makefile
index bec61ab..3696cb1 100644
--- a/lib/librte_hash/Makefile
+++ b/lib/librte_hash/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_hash_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) := rte_hash.c
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) += rte_fbk_hash.c
diff --git a/lib/librte_ip_frag/Makefile b/lib/librte_ip_frag/Makefile
index aa88578..fe926f7 100644
--- a/lib/librte_ip_frag/Makefile
+++ b/lib/librte_ip_frag/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_ipfrag_version.map
 
+LIBABIVER := 1
+
 #source files
 ifeq ($(CONFIG_RTE_MBUF_REFCNT),y)
 SRCS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += rte_ipv4_fragmentation.c
diff --git a/lib/librte_ivshmem/Makefile b/lib/librte_ivshmem/Makefile
index 068ee10..16defdb 100644
--- a/lib/librte_ivshmem/Makefile
+++ b/lib/librte_ivshmem/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_ivshmem_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_IVSHMEM) := rte_ivshmem.c
 
diff --git a/lib/librte_kni/Makefile b/lib/librte_kni/Makefile
index 93a516d..7107832 100644
--- a/lib/librte_kni/Makefile
+++ b/lib/librte_kni/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := rte_kni_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KNI) := rte_kni.c
 
diff --git a/lib/librte_kvargs/Makefile b/lib/librte_kvargs/Makefile
index b1c34f3..87b09f2 100644
--- a/lib/librte_kvargs/Makefile
+++ b/lib/librte_kvargs/Makefile
@@ -40,6 +40,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_kvargs_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KVARGS) := rte_kvargs.c
 
diff --git a/lib/librte_lpm/Makefile b/lib/librte_lpm/Makefile
index 8214630..35e6389 100644
--- a/lib/librte_lpm/Makefile
+++ b/lib/librte_lpm/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_lpm_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_LPM) := rte_lpm.c rte_lpm6.c
 
diff --git a/lib/librte_malloc/Makefile b/lib/librte_malloc/Makefile
index 15b7eed..947e41c 100644
--- a/lib/librte_malloc/Makefile
+++ b/lib/librte_malloc/Makefile
@@ -34,6 +34,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_malloc.a
 
+LIBABIVER := 1
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_malloc_version.map
diff --git a/lib/librte_mbuf/Makefile b/lib/librte_mbuf/Makefile
index 03becae..080f3cf 100644
--- a/lib/librte_mbuf/Makefile
+++ b/lib/librte_mbuf/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_mbuf_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MBUF) := rte_mbuf.c
 
diff --git a/lib/librte_mempool/Makefile b/lib/librte_mempool/Makefile
index 31d1a71..940d1f7 100644
--- a/lib/librte_mempool/Makefile
+++ b/lib/librte_mempool/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_mempool_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) +=  rte_mempool.c
 ifeq ($(CONFIG_RTE_LIBRTE_XEN_DOM0),y)
diff --git a/lib/librte_meter/Makefile b/lib/librte_meter/Makefile
index c4a7a32..8765881 100644
--- a/lib/librte_meter/Makefile
+++ b/lib/librte_meter/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_meter_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pipeline/Makefile b/lib/librte_pipeline/Makefile
index 15b58df..15e406b 100644
--- a/lib/librte_pipeline/Makefile
+++ b/lib/librte_pipeline/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pipeline_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_af_packet/Makefile b/lib/librte_pmd_af_packet/Makefile
index 85a7860..f0bf537 100644
--- a/lib/librte_pmd_af_packet/Makefile
+++ b/lib/librte_pmd_af_packet/Makefile
@@ -40,6 +40,8 @@ LIB = librte_pmd_af_packet.a
 
 EXPORT_MAP := rte_pmd_af_packet_version.map
 
+LIBABIVER := 1
+
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
diff --git a/lib/librte_pmd_bond/Makefile b/lib/librte_pmd_bond/Makefile
index 074110a..d6c81a8 100644
--- a/lib/librte_pmd_bond/Makefile
+++ b/lib/librte_pmd_bond/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_bond_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_e1000/Makefile b/lib/librte_pmd_e1000/Makefile
index cd14444..8c8fed8 100644
--- a/lib/librte_pmd_e1000/Makefile
+++ b/lib/librte_pmd_e1000/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_e1000_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_enic/Makefile b/lib/librte_pmd_enic/Makefile
index 697231c..251a898 100644
--- a/lib/librte_pmd_enic/Makefile
+++ b/lib/librte_pmd_enic/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_enic.a
 
 EXPORT_MAP := rte_pmd_enic_version.map
 
+LIBABIVER := 1
+
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/vnic/
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/
 CFLAGS += -O3
diff --git a/lib/librte_pmd_i40e/Makefile b/lib/librte_pmd_i40e/Makefile
index 73de373..9a0eec8 100644
--- a/lib/librte_pmd_i40e/Makefile
+++ b/lib/librte_pmd_i40e/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_i40e_version.map
 
+LIBABIVER := 1
+
 #
 # Add extra flags for base driver files (also known as shared code)
 # to disable warnings
diff --git a/lib/librte_pmd_ixgbe/Makefile b/lib/librte_pmd_ixgbe/Makefile
index e0a17f6..d580f62 100644
--- a/lib/librte_pmd_ixgbe/Makefile
+++ b/lib/librte_pmd_ixgbe/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_ixgbe_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_pcap/Makefile b/lib/librte_pmd_pcap/Makefile
index cb6678e..0775dbc 100644
--- a/lib/librte_pmd_pcap/Makefile
+++ b/lib/librte_pmd_pcap/Makefile
@@ -42,6 +42,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_pcap_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_ring/Makefile b/lib/librte_pmd_ring/Makefile
index aa1b461..e442d0b 100644
--- a/lib/librte_pmd_ring/Makefile
+++ b/lib/librte_pmd_ring/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_ring_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_virtio/Makefile b/lib/librte_pmd_virtio/Makefile
index d979c59..793067f 100644
--- a/lib/librte_pmd_virtio/Makefile
+++ b/lib/librte_pmd_virtio/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_virtio_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_vmxnet3/Makefile b/lib/librte_pmd_vmxnet3/Makefile
index f3ab178..93e5580 100644
--- a/lib/librte_pmd_vmxnet3/Makefile
+++ b/lib/librte_pmd_vmxnet3/Makefile
@@ -68,6 +68,8 @@ VPATH += $(RTE_SDK)/lib/librte_pmd_vmxnet3/vmxnet3
 
 EXPORT_MAP := rte_pmd_vmxnet3_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_xenvirt/Makefile b/lib/librte_pmd_xenvirt/Makefile
index 4510603..f0c796c 100644
--- a/lib/librte_pmd_xenvirt/Makefile
+++ b/lib/librte_pmd_xenvirt/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_xenvirt_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_port/Makefile b/lib/librte_port/Makefile
index 266ed39..0e38452 100644
--- a/lib/librte_port/Makefile
+++ b/lib/librte_port/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_port_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_power/Makefile b/lib/librte_power/Makefile
index 0547dcd..cee95cd 100644
--- a/lib/librte_power/Makefile
+++ b/lib/librte_power/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := rte_power_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) := rte_power.c rte_power_acpi_cpufreq.c
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) += rte_power_kvm_vm.c guest_channel.c
diff --git a/lib/librte_ring/Makefile b/lib/librte_ring/Makefile
index b437dc5..84ad3d3 100644
--- a/lib/librte_ring/Makefile
+++ b/lib/librte_ring/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_ring_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_RING) := rte_ring.c
 
diff --git a/lib/librte_sched/Makefile b/lib/librte_sched/Makefile
index 48f280a..b1cb285 100644
--- a/lib/librte_sched/Makefile
+++ b/lib/librte_sched/Makefile
@@ -43,6 +43,8 @@ CFLAGS_rte_red.o := -D_GNU_SOURCE
 
 EXPORT_MAP := rte_sched_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_table/Makefile b/lib/librte_table/Makefile
index 4e1a54a..0d8394c 100644
--- a/lib/librte_table/Makefile
+++ b/lib/librte_table/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_table_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_timer/Makefile b/lib/librte_timer/Makefile
index 9fb6079..2aabef8 100644
--- a/lib/librte_timer/Makefile
+++ b/lib/librte_timer/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_timer_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_TIMER) := rte_timer.c
 
diff --git a/lib/librte_vhost/Makefile b/lib/librte_vhost/Makefile
index 96a7dd0..369c25a 100644
--- a/lib/librte_vhost/Makefile
+++ b/lib/librte_vhost/Makefile
@@ -36,6 +36,8 @@ LIB = librte_vhost.a
 
 EXPORT_MAP := rte_vhost_version.map
 
+LIBABIVER := 1
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -D_FILE_OFFSET_BITS=64 -lfuse
 LDFLAGS += -lfuse
 # all source are stored in SRCS-y
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 1d3b646..865a307 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -37,10 +37,9 @@ include $(RTE_SDK)/mk/internal/rte.depdirs-pre.mk
 
 # VPATH contains at least SRCDIR
 VPATH += $(SRCDIR)
-
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
-LIB := $(patsubst %.a,%.so,$(LIB))
 
+LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB))
 CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
 
 endif
@@ -113,6 +112,10 @@ lib_dir = [ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib;
 #
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
+ifeq ($(LIBABIVER),)
+	@echo "Must Specify a $(LIB) ABI version"
+	@false
+endif
 	@[ -d $(dir $@) ] || mkdir -p $(dir $@)
 	$(if $(D),\
 		@echo -n "$< -> $@ " ; \
@@ -126,6 +129,7 @@ $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
 		$(depfile_missing),\
 		$(depfile_newer)),\
 		$(O_TO_S_DO))
+
 ifeq ($(RTE_BUILD_COMBINE_LIBS),y)
 	$(if $(or \
         $(file_missing),\
@@ -163,9 +167,13 @@ endif
 # install lib in $(RTE_OUTPUT)/lib
 #
 $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
+	$(eval LIBSONAME := $(basename $(LIB)))
 	@echo "  INSTALL-LIB $(LIB)"
 	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
 	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
+ifeq ($(RTE_BUILD_SHARED_LIB),y)
+	$(Q)ln -s -f $< $(RTE_OUTPUT)/lib/$(LIBSONAME)
+endif
 
 #
 # Clean all generated files
-- 
2.1.0

^ permalink raw reply	[relevance 7%]

* [dpdk-dev] [PATCH v7 1/4] compat: Add infrastructure to support symbol versioning
  2014-12-20 21:01  4% [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
                   ` (8 preceding siblings ...)
  2015-01-20 21:17  3% ` [dpdk-dev] [PATCH v6 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
@ 2015-01-21 20:59  3% ` Neil Horman
  2015-01-21 20:59  7%   ` [dpdk-dev] [PATCH v7 3/4] Add library version extenstion Neil Horman
  2015-01-21 20:59 23%   ` [dpdk-dev] [PATCH v7 4/4] docs: Add ABI documentation Neil Horman
  2015-01-22 15:49  3% ` [dpdk-dev] [PATCH v8 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
                   ` (2 subsequent siblings)
  12 siblings, 2 replies; 200+ results
From: Neil Horman @ 2015-01-21 20:59 UTC (permalink / raw)
  To: dev

Add initial pass header files to support symbol versioning.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
CC: "Gonzalez Monroy, Sergio" <sergio.gonzalez.monroy@intel.com>

---
Change Notes:
V2)
	Moved ifeq to _INSTALL target

V3)
	Undo V2 changes and make librte_compat use the rte.install.mk file
instead

v4)
	changed --version-script to accept SRCDIR in this patch at per request
	documented versioning macros
	cleaned up macro parameter consistency
	converted SA macro to RTE_STR macro
	fixed copyright
---
 lib/Makefile                   |   1 +
 lib/librte_compat/Makefile     |  38 +++++++++++++
 lib/librte_compat/rte_compat.h | 117 +++++++++++++++++++++++++++++++++++++++++
 mk/rte.lib.mk                  |   4 ++
 4 files changed, 160 insertions(+)
 create mode 100644 lib/librte_compat/Makefile
 create mode 100644 lib/librte_compat/rte_compat.h

diff --git a/lib/Makefile b/lib/Makefile
index 0ffc982..d617d81 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -31,6 +31,7 @@
 
 include $(RTE_SDK)/mk/rte.vars.mk
 
+DIRS-y += librte_compat
 DIRS-$(CONFIG_RTE_LIBRTE_EAL) += librte_eal
 DIRS-$(CONFIG_RTE_LIBRTE_MALLOC) += librte_malloc
 DIRS-$(CONFIG_RTE_LIBRTE_RING) += librte_ring
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
new file mode 100644
index 0000000..0bab870
--- /dev/null
+++ b/lib/librte_compat/Makefile
@@ -0,0 +1,38 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2013 Neil Horman <nhorman@tuxdriver.com>
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+
+# install includes
+SYMLINK-y-include := rte_compat.h
+
+include $(RTE_SDK)/mk/rte.install.mk
diff --git a/lib/librte_compat/rte_compat.h b/lib/librte_compat/rte_compat.h
new file mode 100644
index 0000000..d7cc176
--- /dev/null
+++ b/lib/librte_compat/rte_compat.h
@@ -0,0 +1,117 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2010 Neil Horman <nhorman@tuxdriver.com>.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _RTE_COMPAT_H_
+#define _RTE_COMPAT_H_
+#include <rte_common.h>
+
+#ifdef RTE_BUILD_SHARED_LIB
+
+/*
+ * Provides backwards compatibility when updating exported functions.
+ * When a symol is exported from a library to provide an API, it also provides a
+ * calling convention (ABI) that is embodied in its name, return type,
+ * arguments, etc.  On occasion that function may need to change to accomodate
+ * new functionality, behavior, etc.  When that occurs, it is desireable to
+ * allow for backwards compatibility for a time with older binaries that are
+ * dynamically linked to the dpdk.  To support that, the __vsym and
+ * VERSION_SYMBOL macros are created.  They, in conjunction with the
+ * <library>_version.map file for a given library allow for multiple versions of
+ * a symbol to exist in a shared library so that older binaries need not be
+ * immediately recompiled. Their use is outlined in the following example:
+ * Assumptions: DPDK 1.(X) contains a function int foo(char *string)
+ *              DPDK 1.(X+1) needs to change foo to be int foo(int index)
+ *
+ * To accomplish this:
+ * 1) Edit lib/<library>/library_version.map to add a DPDK_1.(X+1) node, in which
+ * foo is exported as a global symbol.
+ *
+ * 2) rename the existing function int foo(char *string) to 
+ * 	int __vsym foo_v18(char *string)
+ *
+ * 3) Add this macro immediately below the function
+ * 	VERSION_SYMBOL(foo, _v18, 1.8);
+ *
+ * 4) Implement a new version of foo.
+ * 	char foo(int value, int otherval) { ...}
+ *
+ * 5) Mark the newest version as the default version
+ * 	BIND_DEFAULT_SYMBOL(foo, 1.9);
+ *
+ */
+
+/* 
+ * Macro Parameters:
+ * b - function base name
+ * e - function version extension, to be concatenated with base name
+ * n - function symbol version string to be applied
+ */
+
+/*
+ * VERSION_SYMBOL
+ * Creates a symbol version table entry binding symbol <b>@DPDK_<n> to the internal
+ * function name <b>_<e>
+ */ 
+#define VERSION_SYMBOL(b, e, n) __asm__(".symver " RTE_STR(b) RTE_STR(e) ", "RTE_STR(b)"@DPDK_"RTE_STR(n))
+
+/*
+ * BASE_SYMBOL
+ * Creates a symbol version table entry binding unversioned symbol <b> 
+ * to the internal function <b>_<e>
+ */ 
+#define BASE_SYMBOL(b, e) __asm__(".symver " RTE_STR(b) RTE_STR(e) ", "RTE_STR(b)"@")
+
+/*
+ * BNID_DEFAULT_SYMBOL
+ * Creates a symbol version entry instructing the linker to bind references to
+ * symbol <b> to the internal symbol <b>_<e>
+ */
+#define BIND_DEFAULT_SYMBOL(b, e, n) __asm__(".symver " RTE_STR(b) RTE_STR(e) ", "RTE_STR(b)"@@DPDK_"RTE_STR(n))
+#define __vsym __attribute__((used))
+
+#else
+/*
+ * No symbol versioning in use
+ */
+#define VERSION_SYMBOL(b, e, v)
+#define __vsym
+#define BASE_SYMBOL(b, n)
+#define BIND_DEFAULT_SYMBOL(b, v)
+
+/*
+ * RTE_BUILD_SHARED_LIB=n
+ */
+#endif
+
+
+#endif /* _RTE_COMPAT_H_ */
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 81bf8e1..1d3b646 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -40,8 +40,12 @@ VPATH += $(SRCDIR)
 
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 LIB := $(patsubst %.a,%.so,$(LIB))
+
+CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
+
 endif
 
+
 _BUILD = $(LIB)
 _INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) $(RTE_OUTPUT)/lib/$(LIB)
 _CLEAN = doclean
-- 
2.1.0

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v6 4/4] docs: Add ABI documentation
  2015-01-21 16:05  8%         ` Thomas Monjalon
@ 2015-01-21 19:43  4%           ` Neil Horman
  2015-01-21 22:24  9%             ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Neil Horman @ 2015-01-21 19:43 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Wed, Jan 21, 2015 at 05:05:51PM +0100, Thomas Monjalon wrote:
> 2015-01-21 09:59, Neil Horman:
> > On Wed, Jan 21, 2015 at 11:25:48AM +0100, Thomas Monjalon wrote:
> > > 2015-01-20 16:17, Neil Horman:
> > > > Adding a document describing rudimentary ABI policy and adding notice space for
> > > > any deprecation announcements
> > > > 
> > > > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> > > > CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> > > > CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> > > > 
> > > > ---
> > > > Change notes:
> > > > 
> > > > v5) Updated documentation to add notes from Thomas M.
> > > > 
> > > > v6) Moved abi.txt to guides/rel_notes/abi.rst
> > > 
> > > You didn't integrate this file in the index.
> > > 
> > Shiobahn indicated that its just a plain text file, so I left it as a plain text
> > file.  I guess we have different definitions of plain text files.
> > 
> > > [...]
> > > 
> > > > --- /dev/null
> > > > +++ b/doc/guides/rel_notes/abi.rst
> > > > @@ -0,0 +1,38 @@
> > > > +ABI policy
> > > > +==========
> > > > +	ABI versions are set at the time of major release labeling, and ABI may
> > > > +change multiple times between the last labeling and the HEAD label of the git
> > > > +tree without warning
> > > > +
> > > > +	ABI versions, once released are available until such time as their
> > > > +deprecation has been noted here for at least one major release cycle, after it
> > > > +has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
> > > > +remove it is made during the development of DPDK 1.9.  The decision will be
> > > > +recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
> > > > +1.10 ships.
> > > 
> > > As previously said, speaking about 2.0/2.1 would be more coherent.
> > > 
> > As previously mentioned, I really don't see this as relevant, as it will be out
> > of date within a release, and I think we can agree, no one is going to update
> > this paragraph every release.
> > 
> > > > +
> > > > +	ABI versions may be deprecated in whole, or in part as needed by a given
> > > > +update.
> > > > +
> > > > +	Some ABI changes may be too significant to reasonably maintain multiple
> > > > +versions of.  In those events ABI's may be updated without backward
> > > > +compatibility provided.  The requirements for doing so are:
> > > > +	1) At least 3 acknoweldgements of the need on the dpdk.org
> > > > +	2) A full deprecation cycle must be made to offer downstream consumers
> > > > +sufficient warning of the change.  E.g. if dpdk 2.0 is under development when
> > > > +the change is proposed, a deprecation notice must be added to this file, and
> > > > +released with dpdk 2.0.  Then the change may be incorporated for dpdk 2.1
> > > > +	3) The LIBABIVER variable in the makefilei(s) where the ABI changes are
> > > > +incorporated must be incremented in parallel with the ABI changes themselves
> > > > +
> > > > +	Note that the above process for ABI deprecation should not be undertaken
> > > > +lightly.  ABI stability is extreemely important for downstream consumers of the
> > > > +DPDK, especially when distributed in shared object form.  Every effort should be
> > > > +made to preserve ABI whenever possible.  For instance, reorganizing public
> > > > +structure field for astetic or readability purposes should be avoided as it will
> > > > +cause ABI breakage.  Only significant (e.g. performance) reasons should be seen
> > > > +as cause to alter ABI.
> > > 
> > > When applying the patch, there are these (minor) warnings:
> > > 
> > > /home/thomas/projects/dpdk/dpdk/.git/rebase-apply/patch:52: trailing whitespace.
> > > /home/thomas/projects/dpdk/dpdk/.git/rebase-apply/patch:55: new blank line at EOF.
> > > 
> > > When building the documentation, there are these errors:
> > > make doc-guides-html
> > > /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:4: WARNING: Block quote ends without a blank line; unexpected unindent.
> > > /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:8: WARNING: Block quote ends without a blank line; unexpected unindent.
> > > /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:15: WARNING: Block quote ends without a blank line; unexpected unindent.
> > > /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:18: WARNING: Block quote ends without a blank line; unexpected unindent.
> > > /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:20: ERROR: Unexpected indentation.
> > > /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:22: WARNING: Block quote ends without a blank line; unexpected unindent.
> > > /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:25: ERROR: Unexpected indentation.
> > > /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:26: WARNING: Block quote ends without a blank line; unexpected unindent.
> > > /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:29: WARNING: Block quote ends without a blank line; unexpected unindent.
> > > /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:: WARNING: document isn't included in any toctree
> > > 
> > > Please check it.
> > > 
> > Again, I guess we have separate definitions of what a plain text file is, but
> > I'll look into it.
> > 
> > 
> > > Other comment, what about the additions I suggested about macros and structure renaming?
> > > 
> > Considered and answered already.  I'm in favor of listing macros and structure
> > changes in the abi document, but I think an exhaustive list isn't needed.  If it
> > is, we could spend pages diving into minute.  Better to point out the need for
> > abi noticies as patches get posted.
> 
> I'm afraid you don't understand what I'm saying. Copy/paste:
> "No, I was suggesting to explain in this doc that macro removal must be
> announced with a deprecation notice,
> and that in case structure must be reworked, the name must change if we
> want to preserve ABI compatibility with old structure."
> Rewording: if you agree with this policy, please add it in this document.
> 
Yes, we're on the same page regarding what your asking, I just don't agree that
it needs to be explicitly called out.  I thought I was clear on that.
Appaerntly not however, so if it will settle the point, I'll just add it.

> > > Neil, we expect that you consider comments done previously and that you test your patch.
> > > Otherwise, we are losing time in useless reviews.
> > > 
> > Thomas, I have considered your comments, I simply don't agree with all of them,
> > and I made that clear.
> > 
> > As for losing time, you let the first attempt at this
> > patch rot on the list in 1.7 and have done the same thing for the 1.8 cycle
> > until I yelled for reviews.
> 
> Now, I'm really upset of your wrong assumptions.
> You sent your first proposal on september, during 1.8 cycle, not 1.7 !
> And during this cycle, the decision was to postpone it for 2.0 release.
> 
you're missing the point. I apologize for not getting the release numbers right,
it should be 1.8 to 2.0 not 1.7 to 1.8 as you note, but that doesn't really
matter.  The point was 6 months.  6 months this has been sitting around.  In
that time up to this point I've gotten one review from another devloper on the
set, and you indicating that its not ready yet.  Then, the day 1.8 released, I
reposed the patch series as we agreed, and its taken almost 5 weeks before I've
gotten any feedback on it, and then its feedback that could have been given 6
months ago (you'll note this patch was initially identical to the version I
posted back in september).  I think you can understand how I find that
frustrating.

> I don't understand what's wrong with you.
The above is whats wrong with me.  The fact that I can try and try and try to
add value to this project so that I can expand its user base, and the best I've
thus far been able to receive is indifference.  At worst, the indifference is
followed by being told that the indifference is tantamount to rejection.


> You don't make any effort to understand what we are saying and
> you make no effort to understand what is this doc directory.
> You prefer crying that your patch is not applied.
No effort?  How many emails have I written contesting your opinions, presenting
supporting evidence, only to be met with assertions?  I don't think I'm the one
not making an effort here.

> And I still don't understand if you are willing to work on a test tool for ABI?
> 
>From this email
http://dpdk.org/ml/archives/dev/2015-January/011306.html

=======================================================
> Yes, it should be another patchset.
> Do you plan to work on it? It would be very convenient for developpers and
> maintainers to test ABI compatibility.
> 
Gladly, if we can get this in.  I think its an important tool.
=========================================================

I'm not sure how thats unclear, but in the event that it wasn't, yes, I will
gladly work on such a tool.

> > No doubt when all is said and done here you'll
> > complain because this series likely won't work when you apply it for all the
> > patches you take between the time I posted it and now.  So lets be careful about
> > complaining over wasted time.
> 
> Note that I'm sure we can do some good work together. And I'd prefer more
> pleasant discussions. Life is too short to have this kind of conflict.
> 
I agree, and we've done so in the past.  I'm sorry if I've upset you, it wasn't
my intention.  That said, can you see how I might be frustrated by this patch
set taking 6 months to get reviewed, only to have commentary made on it that I
could have handled back at the beginning of this whole mess?

Participation.  Thats really whats needed here.  Not just from you, not just
from me, everyone, and not just on the items that we consider important to
ourselves.  Indifference leads to exclusion and frustration. 


I'll have another version of this ready soon.
Neil

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v6 4/4] docs: Add ABI documentation
  2015-01-21 14:59  8%       ` Neil Horman
@ 2015-01-21 16:05  8%         ` Thomas Monjalon
  2015-01-21 19:43  4%           ` Neil Horman
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2015-01-21 16:05 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

2015-01-21 09:59, Neil Horman:
> On Wed, Jan 21, 2015 at 11:25:48AM +0100, Thomas Monjalon wrote:
> > 2015-01-20 16:17, Neil Horman:
> > > Adding a document describing rudimentary ABI policy and adding notice space for
> > > any deprecation announcements
> > > 
> > > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> > > CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> > > CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> > > 
> > > ---
> > > Change notes:
> > > 
> > > v5) Updated documentation to add notes from Thomas M.
> > > 
> > > v6) Moved abi.txt to guides/rel_notes/abi.rst
> > 
> > You didn't integrate this file in the index.
> > 
> Shiobahn indicated that its just a plain text file, so I left it as a plain text
> file.  I guess we have different definitions of plain text files.
> 
> > [...]
> > 
> > > --- /dev/null
> > > +++ b/doc/guides/rel_notes/abi.rst
> > > @@ -0,0 +1,38 @@
> > > +ABI policy
> > > +==========
> > > +	ABI versions are set at the time of major release labeling, and ABI may
> > > +change multiple times between the last labeling and the HEAD label of the git
> > > +tree without warning
> > > +
> > > +	ABI versions, once released are available until such time as their
> > > +deprecation has been noted here for at least one major release cycle, after it
> > > +has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
> > > +remove it is made during the development of DPDK 1.9.  The decision will be
> > > +recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
> > > +1.10 ships.
> > 
> > As previously said, speaking about 2.0/2.1 would be more coherent.
> > 
> As previously mentioned, I really don't see this as relevant, as it will be out
> of date within a release, and I think we can agree, no one is going to update
> this paragraph every release.
> 
> > > +
> > > +	ABI versions may be deprecated in whole, or in part as needed by a given
> > > +update.
> > > +
> > > +	Some ABI changes may be too significant to reasonably maintain multiple
> > > +versions of.  In those events ABI's may be updated without backward
> > > +compatibility provided.  The requirements for doing so are:
> > > +	1) At least 3 acknoweldgements of the need on the dpdk.org
> > > +	2) A full deprecation cycle must be made to offer downstream consumers
> > > +sufficient warning of the change.  E.g. if dpdk 2.0 is under development when
> > > +the change is proposed, a deprecation notice must be added to this file, and
> > > +released with dpdk 2.0.  Then the change may be incorporated for dpdk 2.1
> > > +	3) The LIBABIVER variable in the makefilei(s) where the ABI changes are
> > > +incorporated must be incremented in parallel with the ABI changes themselves
> > > +
> > > +	Note that the above process for ABI deprecation should not be undertaken
> > > +lightly.  ABI stability is extreemely important for downstream consumers of the
> > > +DPDK, especially when distributed in shared object form.  Every effort should be
> > > +made to preserve ABI whenever possible.  For instance, reorganizing public
> > > +structure field for astetic or readability purposes should be avoided as it will
> > > +cause ABI breakage.  Only significant (e.g. performance) reasons should be seen
> > > +as cause to alter ABI.
> > 
> > When applying the patch, there are these (minor) warnings:
> > 
> > /home/thomas/projects/dpdk/dpdk/.git/rebase-apply/patch:52: trailing whitespace.
> > /home/thomas/projects/dpdk/dpdk/.git/rebase-apply/patch:55: new blank line at EOF.
> > 
> > When building the documentation, there are these errors:
> > make doc-guides-html
> > /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:4: WARNING: Block quote ends without a blank line; unexpected unindent.
> > /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:8: WARNING: Block quote ends without a blank line; unexpected unindent.
> > /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:15: WARNING: Block quote ends without a blank line; unexpected unindent.
> > /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:18: WARNING: Block quote ends without a blank line; unexpected unindent.
> > /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:20: ERROR: Unexpected indentation.
> > /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:22: WARNING: Block quote ends without a blank line; unexpected unindent.
> > /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:25: ERROR: Unexpected indentation.
> > /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:26: WARNING: Block quote ends without a blank line; unexpected unindent.
> > /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:29: WARNING: Block quote ends without a blank line; unexpected unindent.
> > /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:: WARNING: document isn't included in any toctree
> > 
> > Please check it.
> > 
> Again, I guess we have separate definitions of what a plain text file is, but
> I'll look into it.
> 
> 
> > Other comment, what about the additions I suggested about macros and structure renaming?
> > 
> Considered and answered already.  I'm in favor of listing macros and structure
> changes in the abi document, but I think an exhaustive list isn't needed.  If it
> is, we could spend pages diving into minute.  Better to point out the need for
> abi noticies as patches get posted.

I'm afraid you don't understand what I'm saying. Copy/paste:
"No, I was suggesting to explain in this doc that macro removal must be
announced with a deprecation notice,
and that in case structure must be reworked, the name must change if we
want to preserve ABI compatibility with old structure."
Rewording: if you agree with this policy, please add it in this document.

> > Neil, we expect that you consider comments done previously and that you test your patch.
> > Otherwise, we are losing time in useless reviews.
> > 
> Thomas, I have considered your comments, I simply don't agree with all of them,
> and I made that clear.
> 
> As for losing time, you let the first attempt at this
> patch rot on the list in 1.7 and have done the same thing for the 1.8 cycle
> until I yelled for reviews.

Now, I'm really upset of your wrong assumptions.
You sent your first proposal on september, during 1.8 cycle, not 1.7 !
And during this cycle, the decision was to postpone it for 2.0 release.

I don't understand what's wrong with you.
You don't make any effort to understand what we are saying and
you make no effort to understand what is this doc directory.
You prefer crying that your patch is not applied.
And I still don't understand if you are willing to work on a test tool for ABI?

> No doubt when all is said and done here you'll
> complain because this series likely won't work when you apply it for all the
> patches you take between the time I posted it and now.  So lets be careful about
> complaining over wasted time.

Note that I'm sure we can do some good work together. And I'd prefer more
pleasant discussions. Life is too short to have this kind of conflict.

-- 
Thomas

^ permalink raw reply	[relevance 8%]

* Re: [dpdk-dev] [PATCH v6 4/4] docs: Add ABI documentation
  2015-01-21 10:25 10%     ` Thomas Monjalon
@ 2015-01-21 14:59  8%       ` Neil Horman
  2015-01-21 16:05  8%         ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Neil Horman @ 2015-01-21 14:59 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Wed, Jan 21, 2015 at 11:25:48AM +0100, Thomas Monjalon wrote:
> 2015-01-20 16:17, Neil Horman:
> > Adding a document describing rudimentary ABI policy and adding notice space for
> > any deprecation announcements
> > 
> > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> > CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> > CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> > 
> > ---
> > Change notes:
> > 
> > v5) Updated documentation to add notes from Thomas M.
> > 
> > v6) Moved abi.txt to guides/rel_notes/abi.rst
> 
> You didn't integrate this file in the index.
> 
Shiobahn indicated that its just a plain text file, so I left it as a plain text
file.  I guess we have different definitions of plain text files.

> [...]
> 
> > --- /dev/null
> > +++ b/doc/guides/rel_notes/abi.rst
> > @@ -0,0 +1,38 @@
> > +ABI policy
> > +==========
> > +	ABI versions are set at the time of major release labeling, and ABI may
> > +change multiple times between the last labeling and the HEAD label of the git
> > +tree without warning
> > +
> > +	ABI versions, once released are available until such time as their
> > +deprecation has been noted here for at least one major release cycle, after it
> > +has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
> > +remove it is made during the development of DPDK 1.9.  The decision will be
> > +recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
> > +1.10 ships.
> 
> As previously said, speaking about 2.0/2.1 would be more coherent.
> 
As previously mentioned, I really don't see this as relevant, as it will be out
of date within a release, and I think we can agree, no one is going to update
this paragraph every release.

> > +
> > +	ABI versions may be deprecated in whole, or in part as needed by a given
> > +update.
> > +
> > +	Some ABI changes may be too significant to reasonably maintain multiple
> > +versions of.  In those events ABI's may be updated without backward
> > +compatibility provided.  The requirements for doing so are:
> > +	1) At least 3 acknoweldgements of the need on the dpdk.org
> > +	2) A full deprecation cycle must be made to offer downstream consumers
> > +sufficient warning of the change.  E.g. if dpdk 2.0 is under development when
> > +the change is proposed, a deprecation notice must be added to this file, and
> > +released with dpdk 2.0.  Then the change may be incorporated for dpdk 2.1
> > +	3) The LIBABIVER variable in the makefilei(s) where the ABI changes are
> > +incorporated must be incremented in parallel with the ABI changes themselves
> > +
> > +	Note that the above process for ABI deprecation should not be undertaken
> > +lightly.  ABI stability is extreemely important for downstream consumers of the
> > +DPDK, especially when distributed in shared object form.  Every effort should be
> > +made to preserve ABI whenever possible.  For instance, reorganizing public
> > +structure field for astetic or readability purposes should be avoided as it will
> > +cause ABI breakage.  Only significant (e.g. performance) reasons should be seen
> > +as cause to alter ABI.
> 
> When applying the patch, there are these (minor) warnings:
> 
> /home/thomas/projects/dpdk/dpdk/.git/rebase-apply/patch:52: trailing whitespace.
> /home/thomas/projects/dpdk/dpdk/.git/rebase-apply/patch:55: new blank line at EOF.
> 
> When building the documentation, there are these errors:
> make doc-guides-html
> /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:4: WARNING: Block quote ends without a blank line; unexpected unindent.
> /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:8: WARNING: Block quote ends without a blank line; unexpected unindent.
> /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:15: WARNING: Block quote ends without a blank line; unexpected unindent.
> /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:18: WARNING: Block quote ends without a blank line; unexpected unindent.
> /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:20: ERROR: Unexpected indentation.
> /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:22: WARNING: Block quote ends without a blank line; unexpected unindent.
> /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:25: ERROR: Unexpected indentation.
> /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:26: WARNING: Block quote ends without a blank line; unexpected unindent.
> /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:29: WARNING: Block quote ends without a blank line; unexpected unindent.
> /home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:: WARNING: document isn't included in any toctree
> 
> Please check it.
> 
Again, I guess we have separate definitions of what a plain text file is, but
I'll look into it.


> Other comment, what about the additions I suggested about macros and structure renaming?
> 
Considered and answered already.  I'm in favor of listing macros and structure
changes in the abi document, but I think an exhaustive list isn't needed.  If it
is, we could spend pages diving into minute.  Better to point out the need for
abi noticies as patches get posted.

> Neil, we expect that you consider comments done previously and that you test your patch.
> Otherwise, we are losing time in useless reviews.
> 
Thomas, I have considered your comments, I simply don't agree with all of them,
and I made that clear.

As for losing time, you let the first attempt at this
patch rot on the list in 1.7 and have done the same thing for the 1.8 cycle
until I yelled for reviews.  No doubt when all is said and done here you'll
complain because this series likely won't work when you apply it for all the
patches you take between the time I posted it and now.  So lets be careful about
complaining over wasted time.

Neil
 
> -- 
> Thomas
> 

^ permalink raw reply	[relevance 8%]

* Re: [dpdk-dev] [PATCH v6 4/4] docs: Add ABI documentation
  2015-01-20 21:17 24%   ` [dpdk-dev] [PATCH v6 4/4] docs: Add ABI documentation Neil Horman
  2015-01-21 10:13  8%     ` Iremonger, Bernard
@ 2015-01-21 10:25 10%     ` Thomas Monjalon
  2015-01-21 14:59  8%       ` Neil Horman
  1 sibling, 1 reply; 200+ results
From: Thomas Monjalon @ 2015-01-21 10:25 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

2015-01-20 16:17, Neil Horman:
> Adding a document describing rudimentary ABI policy and adding notice space for
> any deprecation announcements
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> 
> ---
> Change notes:
> 
> v5) Updated documentation to add notes from Thomas M.
> 
> v6) Moved abi.txt to guides/rel_notes/abi.rst

You didn't integrate this file in the index.

[...]

> --- /dev/null
> +++ b/doc/guides/rel_notes/abi.rst
> @@ -0,0 +1,38 @@
> +ABI policy
> +==========
> +	ABI versions are set at the time of major release labeling, and ABI may
> +change multiple times between the last labeling and the HEAD label of the git
> +tree without warning
> +
> +	ABI versions, once released are available until such time as their
> +deprecation has been noted here for at least one major release cycle, after it
> +has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
> +remove it is made during the development of DPDK 1.9.  The decision will be
> +recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
> +1.10 ships.

As previously said, speaking about 2.0/2.1 would be more coherent.

> +
> +	ABI versions may be deprecated in whole, or in part as needed by a given
> +update.
> +
> +	Some ABI changes may be too significant to reasonably maintain multiple
> +versions of.  In those events ABI's may be updated without backward
> +compatibility provided.  The requirements for doing so are:
> +	1) At least 3 acknoweldgements of the need on the dpdk.org
> +	2) A full deprecation cycle must be made to offer downstream consumers
> +sufficient warning of the change.  E.g. if dpdk 2.0 is under development when
> +the change is proposed, a deprecation notice must be added to this file, and
> +released with dpdk 2.0.  Then the change may be incorporated for dpdk 2.1
> +	3) The LIBABIVER variable in the makefilei(s) where the ABI changes are
> +incorporated must be incremented in parallel with the ABI changes themselves
> +
> +	Note that the above process for ABI deprecation should not be undertaken
> +lightly.  ABI stability is extreemely important for downstream consumers of the
> +DPDK, especially when distributed in shared object form.  Every effort should be
> +made to preserve ABI whenever possible.  For instance, reorganizing public
> +structure field for astetic or readability purposes should be avoided as it will
> +cause ABI breakage.  Only significant (e.g. performance) reasons should be seen
> +as cause to alter ABI.

When applying the patch, there are these (minor) warnings:

/home/thomas/projects/dpdk/dpdk/.git/rebase-apply/patch:52: trailing whitespace.
/home/thomas/projects/dpdk/dpdk/.git/rebase-apply/patch:55: new blank line at EOF.

When building the documentation, there are these errors:
make doc-guides-html
/home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:4: WARNING: Block quote ends without a blank line; unexpected unindent.
/home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:8: WARNING: Block quote ends without a blank line; unexpected unindent.
/home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:15: WARNING: Block quote ends without a blank line; unexpected unindent.
/home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:18: WARNING: Block quote ends without a blank line; unexpected unindent.
/home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:20: ERROR: Unexpected indentation.
/home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:22: WARNING: Block quote ends without a blank line; unexpected unindent.
/home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:25: ERROR: Unexpected indentation.
/home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:26: WARNING: Block quote ends without a blank line; unexpected unindent.
/home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:29: WARNING: Block quote ends without a blank line; unexpected unindent.
/home/thomas/projects/dpdk/dpdk/doc/guides/rel_notes/abi.rst:: WARNING: document isn't included in any toctree

Please check it.

Other comment, what about the additions I suggested about macros and structure renaming?

Neil, we expect that you consider comments done previously and that you test your patch.
Otherwise, we are losing time in useless reviews.

-- 
Thomas

^ permalink raw reply	[relevance 10%]

* Re: [dpdk-dev] [PATCH v6 4/4] docs: Add ABI documentation
  2015-01-20 21:17 24%   ` [dpdk-dev] [PATCH v6 4/4] docs: Add ABI documentation Neil Horman
@ 2015-01-21 10:13  8%     ` Iremonger, Bernard
  2015-01-21 10:25 10%     ` Thomas Monjalon
  1 sibling, 0 replies; 200+ results
From: Iremonger, Bernard @ 2015-01-21 10:13 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> Sent: Tuesday, January 20, 2015 9:18 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v6 4/4] docs: Add ABI documentation
> 
> Adding a document describing rudimentary ABI policy and adding notice space for any deprecation
> announcements
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> 
> ---
> Change notes:
> 
> v5) Updated documentation to add notes from Thomas M.
> 
> v6) Moved abi.txt to guides/rel_notes/abi.rst
> ---
>  doc/guides/rel_notes/abi.rst | 38 ++++++++++++++++++++++++++++++++++++++
>  1 file changed, 38 insertions(+)
>  create mode 100644 doc/guides/rel_notes/abi.rst

Hi Neil,

The file doc/guides/rel_notes/index.rst  should be modified to include "abi" so that the abi.rst file is included in the release notes.

> 
> diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst new file mode 100644 index
> 0000000..98ac19d
> --- /dev/null
> +++ b/doc/guides/rel_notes/abi.rst
> @@ -0,0 +1,38 @@
> +ABI policy
> +==========
> +	ABI versions are set at the time of major release labeling, and ABI
> +may change multiple times between the last labeling and the HEAD label
> +of the git tree without warning
> +
> +	ABI versions, once released are available until such time as their
> +deprecation has been noted here for at least one major release cycle,
> +after it has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and
> +then the decision to remove it is made during the development of DPDK
> +1.9.  The decision will be recorded here, shipped with the DPDK 1.9
> +release, and actually removed when DPDK
> +1.10 ships.
> +
> +	ABI versions may be deprecated in whole, or in part as needed by a
> +given update.
> +
> +	Some ABI changes may be too significant to reasonably maintain
> +multiple versions of.  In those events ABI's may be updated without
> +backward compatibility provided.  The requirements for doing so are:

The #.  Syntax could be used for numbered lists

> +	1) At least 3 acknoweldgements of the need on the dpdk.org

A blank line is needed otherwise the text will concatenate.

> +	2) A full deprecation cycle must be made to offer downstream consumers
> +sufficient warning of the change.  E.g. if dpdk 2.0 is under
> +development when the change is proposed, a deprecation notice must be
> +added to this file, and released with dpdk 2.0.  Then the change may be incorporated for dpdk 2.1

A blank line is needed otherwise the text will concatenate.

> +	3) The LIBABIVER variable in the makefilei(s) where the ABI changes
> +are incorporated must be incremented in parallel with the ABI changes
> +themselves

A blank line is needed otherwise the text will concatenate.
> +
> +	Note that the above process for ABI deprecation should not be
> +undertaken lightly.  ABI stability is extreemely important for
> +downstream consumers of the DPDK, especially when distributed in shared
> +object form.  Every effort should be made to preserve ABI whenever
> +possible.  For instance, reorganizing public structure field for
> +astetic or readability purposes should be avoided as it will cause ABI
> +breakage.  Only significant (e.g. performance) reasons should be seen as cause to alter ABI.
> +
> +Deprecation Notices
> +===================
> +
> --
> 2.1.0
Regards,

Bernard.

^ permalink raw reply	[relevance 8%]

* [dpdk-dev] [PATCH v6 4/4] docs: Add ABI documentation
  2015-01-20 21:17  3% ` [dpdk-dev] [PATCH v6 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
  2015-01-20 21:17  7%   ` [dpdk-dev] [PATCH v6 3/4] Add library version extenstion Neil Horman
@ 2015-01-20 21:17 24%   ` Neil Horman
  2015-01-21 10:13  8%     ` Iremonger, Bernard
  2015-01-21 10:25 10%     ` Thomas Monjalon
  1 sibling, 2 replies; 200+ results
From: Neil Horman @ 2015-01-20 21:17 UTC (permalink / raw)
  To: dev

Adding a document describing rudimentary ABI policy and adding notice space for
any deprecation announcements

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>

---
Change notes:

v5) Updated documentation to add notes from Thomas M.

v6) Moved abi.txt to guides/rel_notes/abi.rst
---
 doc/guides/rel_notes/abi.rst | 38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)
 create mode 100644 doc/guides/rel_notes/abi.rst

diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst
new file mode 100644
index 0000000..98ac19d
--- /dev/null
+++ b/doc/guides/rel_notes/abi.rst
@@ -0,0 +1,38 @@
+ABI policy
+==========
+	ABI versions are set at the time of major release labeling, and ABI may
+change multiple times between the last labeling and the HEAD label of the git
+tree without warning
+
+	ABI versions, once released are available until such time as their
+deprecation has been noted here for at least one major release cycle, after it
+has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
+remove it is made during the development of DPDK 1.9.  The decision will be
+recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
+1.10 ships.
+
+	ABI versions may be deprecated in whole, or in part as needed by a given
+update.
+
+	Some ABI changes may be too significant to reasonably maintain multiple
+versions of.  In those events ABI's may be updated without backward
+compatibility provided.  The requirements for doing so are:
+	1) At least 3 acknoweldgements of the need on the dpdk.org
+	2) A full deprecation cycle must be made to offer downstream consumers
+sufficient warning of the change.  E.g. if dpdk 2.0 is under development when
+the change is proposed, a deprecation notice must be added to this file, and
+released with dpdk 2.0.  Then the change may be incorporated for dpdk 2.1
+	3) The LIBABIVER variable in the makefilei(s) where the ABI changes are
+incorporated must be incremented in parallel with the ABI changes themselves
+
+	Note that the above process for ABI deprecation should not be undertaken
+lightly.  ABI stability is extreemely important for downstream consumers of the
+DPDK, especially when distributed in shared object form.  Every effort should be
+made to preserve ABI whenever possible.  For instance, reorganizing public
+structure field for astetic or readability purposes should be avoided as it will
+cause ABI breakage.  Only significant (e.g. performance) reasons should be seen
+as cause to alter ABI.
+  
+Deprecation Notices
+===================
+
-- 
2.1.0

^ permalink raw reply	[relevance 24%]

* [dpdk-dev] [PATCH v6 3/4] Add library version extenstion
  2015-01-20 21:17  3% ` [dpdk-dev] [PATCH v6 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
@ 2015-01-20 21:17  7%   ` Neil Horman
  2015-01-20 21:17 24%   ` [dpdk-dev] [PATCH v6 4/4] docs: Add ABI documentation Neil Horman
  1 sibling, 0 replies; 200+ results
From: Neil Horman @ 2015-01-20 21:17 UTC (permalink / raw)
  To: dev

To differentiate libraries that break ABI, we add a library version number
suffix to the library, which must be incremented when a given libraries ABI is
broken.  This patch enforces that addition, sets the initial abi soname
extension to 1 for each library and creates a symlink to the base SONAME so that
the test applications will link properly.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>

---
Change Notes:
v3)
	Made symlinking of libraries conditional on a DSO build

v4)	Removed erroneous newline
	changed @exit 1 to @false
	changed ./$(LIB) to $<
---
 lib/librte_acl/Makefile              |  2 ++
 lib/librte_cfgfile/Makefile          |  2 ++
 lib/librte_cmdline/Makefile          |  2 ++
 lib/librte_compat/Makefile           |  2 ++
 lib/librte_distributor/Makefile      |  2 ++
 lib/librte_eal/bsdapp/eal/Makefile   |  2 ++
 lib/librte_eal/linuxapp/eal/Makefile |  2 ++
 lib/librte_ether/Makefile            |  2 ++
 lib/librte_hash/Makefile             |  2 ++
 lib/librte_ip_frag/Makefile          |  2 ++
 lib/librte_ivshmem/Makefile          |  2 ++
 lib/librte_kni/Makefile              |  2 ++
 lib/librte_kvargs/Makefile           |  2 ++
 lib/librte_lpm/Makefile              |  2 ++
 lib/librte_malloc/Makefile           |  2 ++
 lib/librte_mbuf/Makefile             |  2 ++
 lib/librte_mempool/Makefile          |  2 ++
 lib/librte_meter/Makefile            |  2 ++
 lib/librte_pipeline/Makefile         |  2 ++
 lib/librte_pmd_af_packet/Makefile    |  2 ++
 lib/librte_pmd_bond/Makefile         |  2 ++
 lib/librte_pmd_e1000/Makefile        |  2 ++
 lib/librte_pmd_enic/Makefile         |  2 ++
 lib/librte_pmd_i40e/Makefile         |  2 ++
 lib/librte_pmd_ixgbe/Makefile        |  2 ++
 lib/librte_pmd_pcap/Makefile         |  2 ++
 lib/librte_pmd_ring/Makefile         |  2 ++
 lib/librte_pmd_virtio/Makefile       |  2 ++
 lib/librte_pmd_vmxnet3/Makefile      |  2 ++
 lib/librte_pmd_xenvirt/Makefile      |  2 ++
 lib/librte_port/Makefile             |  2 ++
 lib/librte_power/Makefile            |  2 ++
 lib/librte_ring/Makefile             |  2 ++
 lib/librte_sched/Makefile            |  2 ++
 lib/librte_table/Makefile            |  2 ++
 lib/librte_timer/Makefile            |  2 ++
 lib/librte_vhost/Makefile            |  2 ++
 mk/rte.lib.mk                        | 12 ++++++++++--
 38 files changed, 84 insertions(+), 2 deletions(-)

diff --git a/lib/librte_acl/Makefile b/lib/librte_acl/Makefile
index 45cbf80..765deb1 100644
--- a/lib/librte_acl/Makefile
+++ b/lib/librte_acl/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_acl_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_ACL) += tb_mem.c
 
diff --git a/lib/librte_cfgfile/Makefile b/lib/librte_cfgfile/Makefile
index a4f73de..032c240 100644
--- a/lib/librte_cfgfile/Makefile
+++ b/lib/librte_cfgfile/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_cfgfile_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_cmdline/Makefile b/lib/librte_cmdline/Makefile
index 3c71831..719dff6 100644
--- a/lib/librte_cmdline/Makefile
+++ b/lib/librte_cmdline/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_cmdline_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) := cmdline.c
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_cirbuf.c
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
index 0bab870..0c57533 100644
--- a/lib/librte_compat/Makefile
+++ b/lib/librte_compat/Makefile
@@ -32,6 +32,8 @@
 include $(RTE_SDK)/mk/rte.vars.mk
 
 
+LIBABIVER := 1
+
 # install includes
 SYMLINK-y-include := rte_compat.h
 
diff --git a/lib/librte_distributor/Makefile b/lib/librte_distributor/Makefile
index 3674a2c..4c9af17 100644
--- a/lib/librte_distributor/Makefile
+++ b/lib/librte_distributor/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_distributor_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor.c
 
diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index 0b5f9d9..ae214a4 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -48,6 +48,8 @@ CFLAGS += $(WERROR_FLAGS) -O3
 
 EXPORT_MAP := rte_eal_version.map
 
+LIBABIVER := 1
+
 # specific to linuxapp exec-env
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) := eal.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_memory.c
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index bae8af1..e117cec 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -35,6 +35,8 @@ LIB = librte_eal.a
 
 EXPORT_MAP := rte_eal_version.map
 
+LIBABIVER := 1
+
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
 CFLAGS += -I$(SRCDIR)/include
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index 80ad78d..c0e5768 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_ether_version.map
 
+LIBABIVER := 1
+
 SRCS-y += rte_ethdev.c
 
 #
diff --git a/lib/librte_hash/Makefile b/lib/librte_hash/Makefile
index bec61ab..3696cb1 100644
--- a/lib/librte_hash/Makefile
+++ b/lib/librte_hash/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_hash_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) := rte_hash.c
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) += rte_fbk_hash.c
diff --git a/lib/librte_ip_frag/Makefile b/lib/librte_ip_frag/Makefile
index aa88578..fe926f7 100644
--- a/lib/librte_ip_frag/Makefile
+++ b/lib/librte_ip_frag/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_ipfrag_version.map
 
+LIBABIVER := 1
+
 #source files
 ifeq ($(CONFIG_RTE_MBUF_REFCNT),y)
 SRCS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += rte_ipv4_fragmentation.c
diff --git a/lib/librte_ivshmem/Makefile b/lib/librte_ivshmem/Makefile
index 068ee10..16defdb 100644
--- a/lib/librte_ivshmem/Makefile
+++ b/lib/librte_ivshmem/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_ivshmem_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_IVSHMEM) := rte_ivshmem.c
 
diff --git a/lib/librte_kni/Makefile b/lib/librte_kni/Makefile
index 93a516d..7107832 100644
--- a/lib/librte_kni/Makefile
+++ b/lib/librte_kni/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := rte_kni_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KNI) := rte_kni.c
 
diff --git a/lib/librte_kvargs/Makefile b/lib/librte_kvargs/Makefile
index b1c34f3..87b09f2 100644
--- a/lib/librte_kvargs/Makefile
+++ b/lib/librte_kvargs/Makefile
@@ -40,6 +40,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_kvargs_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KVARGS) := rte_kvargs.c
 
diff --git a/lib/librte_lpm/Makefile b/lib/librte_lpm/Makefile
index 8214630..35e6389 100644
--- a/lib/librte_lpm/Makefile
+++ b/lib/librte_lpm/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_lpm_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_LPM) := rte_lpm.c rte_lpm6.c
 
diff --git a/lib/librte_malloc/Makefile b/lib/librte_malloc/Makefile
index 15b7eed..947e41c 100644
--- a/lib/librte_malloc/Makefile
+++ b/lib/librte_malloc/Makefile
@@ -34,6 +34,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_malloc.a
 
+LIBABIVER := 1
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_malloc_version.map
diff --git a/lib/librte_mbuf/Makefile b/lib/librte_mbuf/Makefile
index 03becae..080f3cf 100644
--- a/lib/librte_mbuf/Makefile
+++ b/lib/librte_mbuf/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_mbuf_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MBUF) := rte_mbuf.c
 
diff --git a/lib/librte_mempool/Makefile b/lib/librte_mempool/Makefile
index 31d1a71..940d1f7 100644
--- a/lib/librte_mempool/Makefile
+++ b/lib/librte_mempool/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_mempool_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) +=  rte_mempool.c
 ifeq ($(CONFIG_RTE_LIBRTE_XEN_DOM0),y)
diff --git a/lib/librte_meter/Makefile b/lib/librte_meter/Makefile
index c4a7a32..8765881 100644
--- a/lib/librte_meter/Makefile
+++ b/lib/librte_meter/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_meter_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pipeline/Makefile b/lib/librte_pipeline/Makefile
index 15b58df..15e406b 100644
--- a/lib/librte_pipeline/Makefile
+++ b/lib/librte_pipeline/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pipeline_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_af_packet/Makefile b/lib/librte_pmd_af_packet/Makefile
index 85a7860..f0bf537 100644
--- a/lib/librte_pmd_af_packet/Makefile
+++ b/lib/librte_pmd_af_packet/Makefile
@@ -40,6 +40,8 @@ LIB = librte_pmd_af_packet.a
 
 EXPORT_MAP := rte_pmd_af_packet_version.map
 
+LIBABIVER := 1
+
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
diff --git a/lib/librte_pmd_bond/Makefile b/lib/librte_pmd_bond/Makefile
index 074110a..d6c81a8 100644
--- a/lib/librte_pmd_bond/Makefile
+++ b/lib/librte_pmd_bond/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_bond_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_e1000/Makefile b/lib/librte_pmd_e1000/Makefile
index cd14444..8c8fed8 100644
--- a/lib/librte_pmd_e1000/Makefile
+++ b/lib/librte_pmd_e1000/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_e1000_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_enic/Makefile b/lib/librte_pmd_enic/Makefile
index 697231c..251a898 100644
--- a/lib/librte_pmd_enic/Makefile
+++ b/lib/librte_pmd_enic/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_enic.a
 
 EXPORT_MAP := rte_pmd_enic_version.map
 
+LIBABIVER := 1
+
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/vnic/
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/
 CFLAGS += -O3
diff --git a/lib/librte_pmd_i40e/Makefile b/lib/librte_pmd_i40e/Makefile
index 73de373..9a0eec8 100644
--- a/lib/librte_pmd_i40e/Makefile
+++ b/lib/librte_pmd_i40e/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_i40e_version.map
 
+LIBABIVER := 1
+
 #
 # Add extra flags for base driver files (also known as shared code)
 # to disable warnings
diff --git a/lib/librte_pmd_ixgbe/Makefile b/lib/librte_pmd_ixgbe/Makefile
index e0a17f6..d580f62 100644
--- a/lib/librte_pmd_ixgbe/Makefile
+++ b/lib/librte_pmd_ixgbe/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_ixgbe_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_pcap/Makefile b/lib/librte_pmd_pcap/Makefile
index cb6678e..0775dbc 100644
--- a/lib/librte_pmd_pcap/Makefile
+++ b/lib/librte_pmd_pcap/Makefile
@@ -42,6 +42,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_pcap_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_ring/Makefile b/lib/librte_pmd_ring/Makefile
index aa1b461..e442d0b 100644
--- a/lib/librte_pmd_ring/Makefile
+++ b/lib/librte_pmd_ring/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_ring_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_virtio/Makefile b/lib/librte_pmd_virtio/Makefile
index d979c59..793067f 100644
--- a/lib/librte_pmd_virtio/Makefile
+++ b/lib/librte_pmd_virtio/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_virtio_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_vmxnet3/Makefile b/lib/librte_pmd_vmxnet3/Makefile
index f3ab178..93e5580 100644
--- a/lib/librte_pmd_vmxnet3/Makefile
+++ b/lib/librte_pmd_vmxnet3/Makefile
@@ -68,6 +68,8 @@ VPATH += $(RTE_SDK)/lib/librte_pmd_vmxnet3/vmxnet3
 
 EXPORT_MAP := rte_pmd_vmxnet3_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_xenvirt/Makefile b/lib/librte_pmd_xenvirt/Makefile
index 4510603..f0c796c 100644
--- a/lib/librte_pmd_xenvirt/Makefile
+++ b/lib/librte_pmd_xenvirt/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_xenvirt_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_port/Makefile b/lib/librte_port/Makefile
index 266ed39..0e38452 100644
--- a/lib/librte_port/Makefile
+++ b/lib/librte_port/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_port_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_power/Makefile b/lib/librte_power/Makefile
index 0547dcd..cee95cd 100644
--- a/lib/librte_power/Makefile
+++ b/lib/librte_power/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := rte_power_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) := rte_power.c rte_power_acpi_cpufreq.c
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) += rte_power_kvm_vm.c guest_channel.c
diff --git a/lib/librte_ring/Makefile b/lib/librte_ring/Makefile
index b437dc5..84ad3d3 100644
--- a/lib/librte_ring/Makefile
+++ b/lib/librte_ring/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_ring_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_RING) := rte_ring.c
 
diff --git a/lib/librte_sched/Makefile b/lib/librte_sched/Makefile
index 48f280a..b1cb285 100644
--- a/lib/librte_sched/Makefile
+++ b/lib/librte_sched/Makefile
@@ -43,6 +43,8 @@ CFLAGS_rte_red.o := -D_GNU_SOURCE
 
 EXPORT_MAP := rte_sched_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_table/Makefile b/lib/librte_table/Makefile
index 4e1a54a..0d8394c 100644
--- a/lib/librte_table/Makefile
+++ b/lib/librte_table/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_table_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_timer/Makefile b/lib/librte_timer/Makefile
index 9fb6079..2aabef8 100644
--- a/lib/librte_timer/Makefile
+++ b/lib/librte_timer/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_timer_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_TIMER) := rte_timer.c
 
diff --git a/lib/librte_vhost/Makefile b/lib/librte_vhost/Makefile
index 96a7dd0..369c25a 100644
--- a/lib/librte_vhost/Makefile
+++ b/lib/librte_vhost/Makefile
@@ -36,6 +36,8 @@ LIB = librte_vhost.a
 
 EXPORT_MAP := rte_vhost_version.map
 
+LIBABIVER := 1
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -D_FILE_OFFSET_BITS=64 -lfuse
 LDFLAGS += -lfuse
 # all source are stored in SRCS-y
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 1d3b646..865a307 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -37,10 +37,9 @@ include $(RTE_SDK)/mk/internal/rte.depdirs-pre.mk
 
 # VPATH contains at least SRCDIR
 VPATH += $(SRCDIR)
-
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
-LIB := $(patsubst %.a,%.so,$(LIB))
 
+LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB))
 CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
 
 endif
@@ -113,6 +112,10 @@ lib_dir = [ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib;
 #
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
+ifeq ($(LIBABIVER),)
+	@echo "Must Specify a $(LIB) ABI version"
+	@false
+endif
 	@[ -d $(dir $@) ] || mkdir -p $(dir $@)
 	$(if $(D),\
 		@echo -n "$< -> $@ " ; \
@@ -126,6 +129,7 @@ $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
 		$(depfile_missing),\
 		$(depfile_newer)),\
 		$(O_TO_S_DO))
+
 ifeq ($(RTE_BUILD_COMBINE_LIBS),y)
 	$(if $(or \
         $(file_missing),\
@@ -163,9 +167,13 @@ endif
 # install lib in $(RTE_OUTPUT)/lib
 #
 $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
+	$(eval LIBSONAME := $(basename $(LIB)))
 	@echo "  INSTALL-LIB $(LIB)"
 	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
 	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
+ifeq ($(RTE_BUILD_SHARED_LIB),y)
+	$(Q)ln -s -f $< $(RTE_OUTPUT)/lib/$(LIBSONAME)
+endif
 
 #
 # Clean all generated files
-- 
2.1.0

^ permalink raw reply	[relevance 7%]

* [dpdk-dev] [PATCH v6 1/4] compat: Add infrastructure to support symbol versioning
  2014-12-20 21:01  4% [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
                   ` (7 preceding siblings ...)
  2015-01-16 15:33  3% ` [dpdk-dev] [PATCH v5 " Neil Horman
@ 2015-01-20 21:17  3% ` Neil Horman
  2015-01-20 21:17  7%   ` [dpdk-dev] [PATCH v6 3/4] Add library version extenstion Neil Horman
  2015-01-20 21:17 24%   ` [dpdk-dev] [PATCH v6 4/4] docs: Add ABI documentation Neil Horman
  2015-01-21 20:59  3% ` [dpdk-dev] [PATCH v7 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
                   ` (3 subsequent siblings)
  12 siblings, 2 replies; 200+ results
From: Neil Horman @ 2015-01-20 21:17 UTC (permalink / raw)
  To: dev

Add initial pass header files to support symbol versioning.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
CC: "Gonzalez Monroy, Sergio" <sergio.gonzalez.monroy@intel.com>

---
Change Notes:
V2)
	Moved ifeq to _INSTALL target

V3)
	Undo V2 changes and make librte_compat use the rte.install.mk file
instead

v4)
	changed --version-script to accept SRCDIR in this patch at per request
	documented versioning macros
	cleaned up macro parameter consistency
	converted SA macro to RTE_STR macro
	fixed copyright
---
 lib/Makefile                   |   1 +
 lib/librte_compat/Makefile     |  38 +++++++++++++
 lib/librte_compat/rte_compat.h | 117 +++++++++++++++++++++++++++++++++++++++++
 mk/rte.lib.mk                  |   4 ++
 4 files changed, 160 insertions(+)
 create mode 100644 lib/librte_compat/Makefile
 create mode 100644 lib/librte_compat/rte_compat.h

diff --git a/lib/Makefile b/lib/Makefile
index 0ffc982..d617d81 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -31,6 +31,7 @@
 
 include $(RTE_SDK)/mk/rte.vars.mk
 
+DIRS-y += librte_compat
 DIRS-$(CONFIG_RTE_LIBRTE_EAL) += librte_eal
 DIRS-$(CONFIG_RTE_LIBRTE_MALLOC) += librte_malloc
 DIRS-$(CONFIG_RTE_LIBRTE_RING) += librte_ring
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
new file mode 100644
index 0000000..0bab870
--- /dev/null
+++ b/lib/librte_compat/Makefile
@@ -0,0 +1,38 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2013 Neil Horman <nhorman@tuxdriver.com>
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+
+# install includes
+SYMLINK-y-include := rte_compat.h
+
+include $(RTE_SDK)/mk/rte.install.mk
diff --git a/lib/librte_compat/rte_compat.h b/lib/librte_compat/rte_compat.h
new file mode 100644
index 0000000..d7cc176
--- /dev/null
+++ b/lib/librte_compat/rte_compat.h
@@ -0,0 +1,117 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2010 Neil Horman <nhorman@tuxdriver.com>.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _RTE_COMPAT_H_
+#define _RTE_COMPAT_H_
+#include <rte_common.h>
+
+#ifdef RTE_BUILD_SHARED_LIB
+
+/*
+ * Provides backwards compatibility when updating exported functions.
+ * When a symol is exported from a library to provide an API, it also provides a
+ * calling convention (ABI) that is embodied in its name, return type,
+ * arguments, etc.  On occasion that function may need to change to accomodate
+ * new functionality, behavior, etc.  When that occurs, it is desireable to
+ * allow for backwards compatibility for a time with older binaries that are
+ * dynamically linked to the dpdk.  To support that, the __vsym and
+ * VERSION_SYMBOL macros are created.  They, in conjunction with the
+ * <library>_version.map file for a given library allow for multiple versions of
+ * a symbol to exist in a shared library so that older binaries need not be
+ * immediately recompiled. Their use is outlined in the following example:
+ * Assumptions: DPDK 1.(X) contains a function int foo(char *string)
+ *              DPDK 1.(X+1) needs to change foo to be int foo(int index)
+ *
+ * To accomplish this:
+ * 1) Edit lib/<library>/library_version.map to add a DPDK_1.(X+1) node, in which
+ * foo is exported as a global symbol.
+ *
+ * 2) rename the existing function int foo(char *string) to 
+ * 	int __vsym foo_v18(char *string)
+ *
+ * 3) Add this macro immediately below the function
+ * 	VERSION_SYMBOL(foo, _v18, 1.8);
+ *
+ * 4) Implement a new version of foo.
+ * 	char foo(int value, int otherval) { ...}
+ *
+ * 5) Mark the newest version as the default version
+ * 	BIND_DEFAULT_SYMBOL(foo, 1.9);
+ *
+ */
+
+/* 
+ * Macro Parameters:
+ * b - function base name
+ * e - function version extension, to be concatenated with base name
+ * n - function symbol version string to be applied
+ */
+
+/*
+ * VERSION_SYMBOL
+ * Creates a symbol version table entry binding symbol <b>@DPDK_<n> to the internal
+ * function name <b>_<e>
+ */ 
+#define VERSION_SYMBOL(b, e, n) __asm__(".symver " RTE_STR(b) RTE_STR(e) ", "RTE_STR(b)"@DPDK_"RTE_STR(n))
+
+/*
+ * BASE_SYMBOL
+ * Creates a symbol version table entry binding unversioned symbol <b> 
+ * to the internal function <b>_<e>
+ */ 
+#define BASE_SYMBOL(b, e) __asm__(".symver " RTE_STR(b) RTE_STR(e) ", "RTE_STR(b)"@")
+
+/*
+ * BNID_DEFAULT_SYMBOL
+ * Creates a symbol version entry instructing the linker to bind references to
+ * symbol <b> to the internal symbol <b>_<e>
+ */
+#define BIND_DEFAULT_SYMBOL(b, e, n) __asm__(".symver " RTE_STR(b) RTE_STR(e) ", "RTE_STR(b)"@@DPDK_"RTE_STR(n))
+#define __vsym __attribute__((used))
+
+#else
+/*
+ * No symbol versioning in use
+ */
+#define VERSION_SYMBOL(b, e, v)
+#define __vsym
+#define BASE_SYMBOL(b, n)
+#define BIND_DEFAULT_SYMBOL(b, v)
+
+/*
+ * RTE_BUILD_SHARED_LIB=n
+ */
+#endif
+
+
+#endif /* _RTE_COMPAT_H_ */
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 81bf8e1..1d3b646 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -40,8 +40,12 @@ VPATH += $(SRCDIR)
 
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 LIB := $(patsubst %.a,%.so,$(LIB))
+
+CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
+
 endif
 
+
 _BUILD = $(LIB)
 _INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) $(RTE_OUTPUT)/lib/$(LIB)
 _CLEAN = doclean
-- 
2.1.0

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-20 15:06  9%         ` Thomas Monjalon
@ 2015-01-20 15:35  4%           ` Neil Horman
  0 siblings, 0 replies; 200+ results
From: Neil Horman @ 2015-01-20 15:35 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Tue, Jan 20, 2015 at 04:06:07PM +0100, Thomas Monjalon wrote:
> 2015-01-20 09:37, Neil Horman:
> > On Tue, Jan 20, 2015 at 03:00:01PM +0100, Thomas Monjalon wrote:
> > > 2015-01-16 10:33, Neil Horman:
> > > > --- /dev/null
> > > > +++ b/doc/abi.txt
> > > > @@ -0,0 +1,36 @@
> > > > +ABI policy:
> > > > +	ABI versions are set at the time of major release labeling, and ABI may
> > > > +change multiple times between the last labeling and the HEAD label of the git
> > > > +tree without warning
> > > > +
> > > > +	ABI versions, once released are available until such time as their
> > > > +deprecation has been noted here for at least one major release cycle, after it
> > > > +has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
> > > > +remove it is made during the development of DPDK 1.9.  The decision will be
> > > > +recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
> > > > +1.10 ships.
> > > > +
> > > > +	ABI versions may be deprecated in whole, or in part as needed by a given
> > > > +update.
> > > > +
> > > > +	Some ABI changes may be too significant to reasonably maintain multiple
> > > > +versions of.  In those events ABI's may be updated without backward
> > > > +compatibility provided.  The requirements for doing so are:
> > > > +	1) At least 3 acknoweldgements of the need on the dpdk.org
> > > > +	2) A full deprecation cycle must be made to offer downstream consumers
> > > > +sufficient warning of the change.  E.g. if dpdk 2.0 is under development when
> > > > +the change is proposed, a deprecation notice must be added to this file, and
> > > > +released with dpdk 2.0.  Then the change may be incorporated for dpdk 2.1
> > > > +	3) The LIBABIVER variable in the makefilei(s) where the ABI changes are
> > > > +incorporated must be incremented in parallel with the ABI changes themselves
> > > > +
> > > > +	Note that the above process for ABI deprecation should not be undertaken
> > > > +lightly.  ABI stability is extreemely important for downstream consumers of the
> > > > +DPDK, especially when distributed in shared object form.  Every effort should be
> > > > +made to preserve ABI whenever possible.  For instance, reorganizing public
> > > > +structure field for astetic or readability purposes should be avoided as it will
> > > 
> > > astetic? typo?
> > > 
> > > > +cause ABI breakage.  Only significant (e.g. performance) reasons should be seen
> > > > +as cause to alter ABI.
> > > > +  
> > > > +Deprecation Notices:
> > > 
> > > Neil, are you sure it's a good idea to put deprecations notices here instead
> > > of release notes?
> > > 
> > Funny, I just made mention of that in my last note.  I do think that the release
> > notes is the right place to "officially" announce deprecation warnings, but I
> > think we need a way for developers to communicate that efficiently (given that
> > the release notes aren't stored in the git tree).
> 
> Yes, they are:
> 	http://dpdk.org/browse/dpdk/tree/doc/guides/rel_notes
> So I suggest to remove Deprecation Notices from abi.txt and create an entry
> in release notes.
> 
> > I think this is the place for
> > developers to canonically list deprecations, and make reading this file part of
> > the release notes generation process.  That way, updates can be made as part of
> > the commit process easily.
> 
> Developpers can update the release notes themselves.
> 
ok, I was unaware. If thats the case, then yes, putting these deprecations
directly in the release notes makes the most sense. I'll resubmit with that
changed.


> > > I'm also thinking that we need to add more things in this doc:
> > > 	- case of macros/constant deprecation (API only)
> > > 	- case of structure update: must be renamed to provide ABI compatibility?
> > > 
> > I'm definately in favor of adding such notices here, but I hadn't planned for
> > any strict formatting of any given notice.  That is to say, I considered you're
> > two issues above to be able to be included here.  I have no issue with listing a
> > deprecation note that indicates macros are being removed or that sections of api
> > are being versioned to accomodate structure changes. of any sort
> 
> No, I was suggesting to explain in this doc that macro removal must be
> announced with a deprecation notice,
> and that in case structure must be reworked, the name must change if we
> want to preserve ABI compatibility with old structure.
> 
> > > Do you think we can have a tool to test the ABI compatibility by building
> > > examples/apps of previous version and checking them with built DSO of
> > > current version?
> > > 
> > I do, though I'm not sure its within the scope of this update.  The easiest way
> > to do it currently is to checkout the last released version of the dpdk, build
> > it as a DSO build, copy out one of the test/example apps, checkout the HEAD of
> > the tree, rebuild, and run the saved off test app from the first build using the
> > shared objects of the second build.  That does some rudimentary validation,
> > but it only touches on the API aspects that the application you're using makes
> > use of.  What would be better would be if we had a test application that made a
> > call to every exported API call that we have, so that we could be confident that
> > we were exhaustively testing the ABI surface.  I think thats a large piece of
> > work, but it would be beneficial to have.
> 
> Yes, it should be another patchset.
> Do you plan to work on it? It would be very convenient for developpers and
> maintainers to test ABI compatibility.
> 
Gladly, if we can get this in.  I think its an important tool.

> Thanks
> -- 
> Thomas
> 

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-20 14:50  4%               ` Butler, Siobhan A
@ 2015-01-20 15:30  4%                 ` Neil Horman
  0 siblings, 0 replies; 200+ results
From: Neil Horman @ 2015-01-20 15:30 UTC (permalink / raw)
  To: Butler, Siobhan A; +Cc: dev

On Tue, Jan 20, 2015 at 02:50:43PM +0000, Butler, Siobhan A wrote:
> 
> 
> > -----Original Message-----
> > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > Sent: Tuesday, January 20, 2015 2:42 PM
> > To: Butler, Siobhan A
> > Cc: Iremonger, Bernard; dev@dpdk.org
> > Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
> > 
> > On Tue, Jan 20, 2015 at 02:29:54PM +0000, Butler, Siobhan A wrote:
> > >
> > >
> > > > -----Original Message-----
> > > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> > > > Sent: Tuesday, January 20, 2015 2:24 PM
> > > > To: Iremonger, Bernard
> > > > Cc: dev@dpdk.org
> > > > Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
> > > >
> > > > On Tue, Jan 20, 2015 at 01:37:35PM +0000, Iremonger, Bernard wrote:
> > > > > > -----Original Message-----
> > > > > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas
> > > > Monjalon
> > > > > > Sent: Tuesday, January 20, 2015 7:15 AM
> > > > > > To: Neil Horman
> > > > > > Cc: dev@dpdk.org
> > > > > > Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI
> > > > > > documentation
> > > > > >
> > > > > > Thank you Neil for writing this document.
> > > > > > This is a really important change in DPDK.
> > > > > > It would be very good to have comments or acknowledgement from
> > > > > > several developpers. This policy would be enforced by having
> > > > > > several
> > > > Acked-by lines.
> > > > > >
> > > > > >
> > > > > > 2015-01-16 10:33, Neil Horman:
> > > > > > > Adding a document describing rudimentary ABI policy and adding
> > > > > > > notice space for any deprecation announcements
> > > > > > >
> > > > > > > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> > > > > > > CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> > > > > > > CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> > > > > > >
> > > > > > > ---
> > > > > > > Change notes:
> > > > > > >
> > > > > > > v5) Updated documentation to add notes from Thomas M.
> > > > > > > ---
> > > > > > >  doc/abi.txt | 36 ++++++++++++++++++++++++++++++++++++
> > > > > > >  1 file changed, 36 insertions(+)  create mode 100644
> > > > > > > doc/abi.txt
> > > > > > >
> > > > > > > diff --git a/doc/abi.txt b/doc/abi.txt new file mode 100644
> > > > > > > index
> > > > > > > 0000000..14be464
> > > > > > > --- /dev/null
> > > > > > > +++ b/doc/abi.txt
> > > > > > > @@ -0,0 +1,36 @@
> > > > > > > +ABI policy:
> > > > > > > +	ABI versions are set at the time of major release labeling,
> > > > > > > +and ABI may change multiple times between the last labeling
> > > > > > > +and the HEAD label of the git tree without warning
> > > > > > > +
> > > > > > > +	ABI versions, once released are available until such time as
> > > > > > > +their deprecation has been noted here for at least one major
> > > > > > > +release cycle, after it has been tagged.  E.g. the ABI for
> > > > > > > +DPDK
> > > > > > > +1.8 is shipped, and then the decision to remove it is made
> > > > > > > +during the development of DPDK 1.9.  The decision will be
> > > > > > > +recorded here, shipped with the DPDK 1.9 release, and
> > > > > > > +actually removed when DPDK
> > > > > > > +1.10 ships.
> > > > > > > +
> > > > > > > +	ABI versions may be deprecated in whole, or in part as
> > > > > > > +needed by a given update.
> > > > > > > +
> > > > > > > +	Some ABI changes may be too significant to reasonably
> > > > > > > +maintain multiple versions of.  In those events ABI's may be
> > > > > > > +updated without backward compatibility provided.  The
> > > > > > > +requirements for doing
> > > > so are:
> > > > > > > +	1) At least 3 acknoweldgements of the need on the dpdk.org
> > > > > > > +	2) A full deprecation cycle must be made to offer
> > downstream
> > > > > > > +consumers sufficient warning of the change.  E.g. if dpdk 2.0
> > > > > > > +is under development when the change is proposed, a
> > > > > > > +deprecation notice must be added to this file, and released with
> > dpdk 2.0.
> > > > > > > +Then the change may be incorporated for
> > > > > > dpdk 2.1
> > > > > > > +	3) The LIBABIVER variable in the makefilei(s) where the ABI
> > > > > > > +changes are incorporated must be incremented in parallel with
> > > > > > > +the ABI changes themselves
> > > > > > > +
> > > > > > > +	Note that the above process for ABI deprecation should not
> > > > > > > +be undertaken lightly.  ABI stability is extreemely important
> > > > > > > +for downstream consumers of the DPDK, especially when
> > > > > > > +distributed in shared object form.  Every effort should be
> > > > > > > +made to preserve ABI whenever possible.  For instance,
> > > > > > > +reorganizing public structure field for astetic or
> > > > > > > +readability purposes should be avoided as it will cause ABI
> > > > > > > +breakage.  Only significant (e.g. performance) reasons should
> > > > > > > +be seen as cause to alter
> > > > > > ABI.
> > > > >
> > > > > Hi Thomas,
> > > > >
> > > > > Should there be a reference to this document in the programmers
> > guide?
> > > > >
> > > > Thats a good question. I think, as Thomas notes, it probably should
> > > > be referenced in some way.  The programmers guide might be good.
> > > > What might be better would be checking the deprecation notices and
> > > > adding them to the release notes for any given release.
> > > >
> > > > Thoughts?
> > > > Neil
> > > >
> > > > > Regards,
> > > > >
> > > > > Bernard.
> > > > >
> > > > >
> > >
> > > Sorry to be pedantic but would you also mind sending it as a .rst file
> > > instead of .txt if you're going to send as patches to Programmer's
> > > Guide anyway? :) Thanks,
> > Actually I'm not sure this is a good idea.  The release notes get formatted and
> > review by a documentation team right?  I'm not sure theres value in having a
> > developer write formatted text if its just going to get reviewed and
> > reformatted later, is there?
> > Neil
> Bernard and I are the documentation team :) we use .rst files (which are plain text files) and then sphinx to auto-generate the HTML version.
> It's no big issue anyway, just if you had to resend it I thought it would be handy.
Can I infer from this then, that if I need to resend it, it would be sufficient
to simply rename this file with an .rst extension?  If so, I'm happy to do so.

> Thanks Neil - great to see more contributions to the docs coming in.
Thank you!
Neil

> S
> > 
> > > Siobhan
> > >
> 
> 

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-20 14:37  7%       ` Neil Horman
@ 2015-01-20 15:06  9%         ` Thomas Monjalon
  2015-01-20 15:35  4%           ` Neil Horman
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2015-01-20 15:06 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

2015-01-20 09:37, Neil Horman:
> On Tue, Jan 20, 2015 at 03:00:01PM +0100, Thomas Monjalon wrote:
> > 2015-01-16 10:33, Neil Horman:
> > > --- /dev/null
> > > +++ b/doc/abi.txt
> > > @@ -0,0 +1,36 @@
> > > +ABI policy:
> > > +	ABI versions are set at the time of major release labeling, and ABI may
> > > +change multiple times between the last labeling and the HEAD label of the git
> > > +tree without warning
> > > +
> > > +	ABI versions, once released are available until such time as their
> > > +deprecation has been noted here for at least one major release cycle, after it
> > > +has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
> > > +remove it is made during the development of DPDK 1.9.  The decision will be
> > > +recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
> > > +1.10 ships.
> > > +
> > > +	ABI versions may be deprecated in whole, or in part as needed by a given
> > > +update.
> > > +
> > > +	Some ABI changes may be too significant to reasonably maintain multiple
> > > +versions of.  In those events ABI's may be updated without backward
> > > +compatibility provided.  The requirements for doing so are:
> > > +	1) At least 3 acknoweldgements of the need on the dpdk.org
> > > +	2) A full deprecation cycle must be made to offer downstream consumers
> > > +sufficient warning of the change.  E.g. if dpdk 2.0 is under development when
> > > +the change is proposed, a deprecation notice must be added to this file, and
> > > +released with dpdk 2.0.  Then the change may be incorporated for dpdk 2.1
> > > +	3) The LIBABIVER variable in the makefilei(s) where the ABI changes are
> > > +incorporated must be incremented in parallel with the ABI changes themselves
> > > +
> > > +	Note that the above process for ABI deprecation should not be undertaken
> > > +lightly.  ABI stability is extreemely important for downstream consumers of the
> > > +DPDK, especially when distributed in shared object form.  Every effort should be
> > > +made to preserve ABI whenever possible.  For instance, reorganizing public
> > > +structure field for astetic or readability purposes should be avoided as it will
> > 
> > astetic? typo?
> > 
> > > +cause ABI breakage.  Only significant (e.g. performance) reasons should be seen
> > > +as cause to alter ABI.
> > > +  
> > > +Deprecation Notices:
> > 
> > Neil, are you sure it's a good idea to put deprecations notices here instead
> > of release notes?
> > 
> Funny, I just made mention of that in my last note.  I do think that the release
> notes is the right place to "officially" announce deprecation warnings, but I
> think we need a way for developers to communicate that efficiently (given that
> the release notes aren't stored in the git tree).

Yes, they are:
	http://dpdk.org/browse/dpdk/tree/doc/guides/rel_notes
So I suggest to remove Deprecation Notices from abi.txt and create an entry
in release notes.

> I think this is the place for
> developers to canonically list deprecations, and make reading this file part of
> the release notes generation process.  That way, updates can be made as part of
> the commit process easily.

Developpers can update the release notes themselves.

> > I'm also thinking that we need to add more things in this doc:
> > 	- case of macros/constant deprecation (API only)
> > 	- case of structure update: must be renamed to provide ABI compatibility?
> > 
> I'm definately in favor of adding such notices here, but I hadn't planned for
> any strict formatting of any given notice.  That is to say, I considered you're
> two issues above to be able to be included here.  I have no issue with listing a
> deprecation note that indicates macros are being removed or that sections of api
> are being versioned to accomodate structure changes. of any sort

No, I was suggesting to explain in this doc that macro removal must be
announced with a deprecation notice,
and that in case structure must be reworked, the name must change if we
want to preserve ABI compatibility with old structure.

> > Do you think we can have a tool to test the ABI compatibility by building
> > examples/apps of previous version and checking them with built DSO of
> > current version?
> > 
> I do, though I'm not sure its within the scope of this update.  The easiest way
> to do it currently is to checkout the last released version of the dpdk, build
> it as a DSO build, copy out one of the test/example apps, checkout the HEAD of
> the tree, rebuild, and run the saved off test app from the first build using the
> shared objects of the second build.  That does some rudimentary validation,
> but it only touches on the API aspects that the application you're using makes
> use of.  What would be better would be if we had a test application that made a
> call to every exported API call that we have, so that we could be confident that
> we were exhaustively testing the ABI surface.  I think thats a large piece of
> work, but it would be beneficial to have.

Yes, it should be another patchset.
Do you plan to work on it? It would be very convenient for developpers and
maintainers to test ABI compatibility.

Thanks
-- 
Thomas

^ permalink raw reply	[relevance 9%]

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-20 14:41  4%             ` Neil Horman
@ 2015-01-20 14:50  4%               ` Butler, Siobhan A
  2015-01-20 15:30  4%                 ` Neil Horman
  0 siblings, 1 reply; 200+ results
From: Butler, Siobhan A @ 2015-01-20 14:50 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev



> -----Original Message-----
> From: Neil Horman [mailto:nhorman@tuxdriver.com]
> Sent: Tuesday, January 20, 2015 2:42 PM
> To: Butler, Siobhan A
> Cc: Iremonger, Bernard; dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
> 
> On Tue, Jan 20, 2015 at 02:29:54PM +0000, Butler, Siobhan A wrote:
> >
> >
> > > -----Original Message-----
> > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> > > Sent: Tuesday, January 20, 2015 2:24 PM
> > > To: Iremonger, Bernard
> > > Cc: dev@dpdk.org
> > > Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
> > >
> > > On Tue, Jan 20, 2015 at 01:37:35PM +0000, Iremonger, Bernard wrote:
> > > > > -----Original Message-----
> > > > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas
> > > Monjalon
> > > > > Sent: Tuesday, January 20, 2015 7:15 AM
> > > > > To: Neil Horman
> > > > > Cc: dev@dpdk.org
> > > > > Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI
> > > > > documentation
> > > > >
> > > > > Thank you Neil for writing this document.
> > > > > This is a really important change in DPDK.
> > > > > It would be very good to have comments or acknowledgement from
> > > > > several developpers. This policy would be enforced by having
> > > > > several
> > > Acked-by lines.
> > > > >
> > > > >
> > > > > 2015-01-16 10:33, Neil Horman:
> > > > > > Adding a document describing rudimentary ABI policy and adding
> > > > > > notice space for any deprecation announcements
> > > > > >
> > > > > > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> > > > > > CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> > > > > > CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> > > > > >
> > > > > > ---
> > > > > > Change notes:
> > > > > >
> > > > > > v5) Updated documentation to add notes from Thomas M.
> > > > > > ---
> > > > > >  doc/abi.txt | 36 ++++++++++++++++++++++++++++++++++++
> > > > > >  1 file changed, 36 insertions(+)  create mode 100644
> > > > > > doc/abi.txt
> > > > > >
> > > > > > diff --git a/doc/abi.txt b/doc/abi.txt new file mode 100644
> > > > > > index
> > > > > > 0000000..14be464
> > > > > > --- /dev/null
> > > > > > +++ b/doc/abi.txt
> > > > > > @@ -0,0 +1,36 @@
> > > > > > +ABI policy:
> > > > > > +	ABI versions are set at the time of major release labeling,
> > > > > > +and ABI may change multiple times between the last labeling
> > > > > > +and the HEAD label of the git tree without warning
> > > > > > +
> > > > > > +	ABI versions, once released are available until such time as
> > > > > > +their deprecation has been noted here for at least one major
> > > > > > +release cycle, after it has been tagged.  E.g. the ABI for
> > > > > > +DPDK
> > > > > > +1.8 is shipped, and then the decision to remove it is made
> > > > > > +during the development of DPDK 1.9.  The decision will be
> > > > > > +recorded here, shipped with the DPDK 1.9 release, and
> > > > > > +actually removed when DPDK
> > > > > > +1.10 ships.
> > > > > > +
> > > > > > +	ABI versions may be deprecated in whole, or in part as
> > > > > > +needed by a given update.
> > > > > > +
> > > > > > +	Some ABI changes may be too significant to reasonably
> > > > > > +maintain multiple versions of.  In those events ABI's may be
> > > > > > +updated without backward compatibility provided.  The
> > > > > > +requirements for doing
> > > so are:
> > > > > > +	1) At least 3 acknoweldgements of the need on the dpdk.org
> > > > > > +	2) A full deprecation cycle must be made to offer
> downstream
> > > > > > +consumers sufficient warning of the change.  E.g. if dpdk 2.0
> > > > > > +is under development when the change is proposed, a
> > > > > > +deprecation notice must be added to this file, and released with
> dpdk 2.0.
> > > > > > +Then the change may be incorporated for
> > > > > dpdk 2.1
> > > > > > +	3) The LIBABIVER variable in the makefilei(s) where the ABI
> > > > > > +changes are incorporated must be incremented in parallel with
> > > > > > +the ABI changes themselves
> > > > > > +
> > > > > > +	Note that the above process for ABI deprecation should not
> > > > > > +be undertaken lightly.  ABI stability is extreemely important
> > > > > > +for downstream consumers of the DPDK, especially when
> > > > > > +distributed in shared object form.  Every effort should be
> > > > > > +made to preserve ABI whenever possible.  For instance,
> > > > > > +reorganizing public structure field for astetic or
> > > > > > +readability purposes should be avoided as it will cause ABI
> > > > > > +breakage.  Only significant (e.g. performance) reasons should
> > > > > > +be seen as cause to alter
> > > > > ABI.
> > > >
> > > > Hi Thomas,
> > > >
> > > > Should there be a reference to this document in the programmers
> guide?
> > > >
> > > Thats a good question. I think, as Thomas notes, it probably should
> > > be referenced in some way.  The programmers guide might be good.
> > > What might be better would be checking the deprecation notices and
> > > adding them to the release notes for any given release.
> > >
> > > Thoughts?
> > > Neil
> > >
> > > > Regards,
> > > >
> > > > Bernard.
> > > >
> > > >
> >
> > Sorry to be pedantic but would you also mind sending it as a .rst file
> > instead of .txt if you're going to send as patches to Programmer's
> > Guide anyway? :) Thanks,
> Actually I'm not sure this is a good idea.  The release notes get formatted and
> review by a documentation team right?  I'm not sure theres value in having a
> developer write formatted text if its just going to get reviewed and
> reformatted later, is there?
> Neil
Bernard and I are the documentation team :) we use .rst files (which are plain text files) and then sphinx to auto-generate the HTML version.
It's no big issue anyway, just if you had to resend it I thought it would be handy.
Thanks Neil - great to see more contributions to the docs coming in.
S
> 
> > Siobhan
> >

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-20 14:29  4%           ` Butler, Siobhan A
@ 2015-01-20 14:41  4%             ` Neil Horman
  2015-01-20 14:50  4%               ` Butler, Siobhan A
  0 siblings, 1 reply; 200+ results
From: Neil Horman @ 2015-01-20 14:41 UTC (permalink / raw)
  To: Butler, Siobhan A; +Cc: dev

On Tue, Jan 20, 2015 at 02:29:54PM +0000, Butler, Siobhan A wrote:
> 
> 
> > -----Original Message-----
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> > Sent: Tuesday, January 20, 2015 2:24 PM
> > To: Iremonger, Bernard
> > Cc: dev@dpdk.org
> > Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
> > 
> > On Tue, Jan 20, 2015 at 01:37:35PM +0000, Iremonger, Bernard wrote:
> > > > -----Original Message-----
> > > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas
> > Monjalon
> > > > Sent: Tuesday, January 20, 2015 7:15 AM
> > > > To: Neil Horman
> > > > Cc: dev@dpdk.org
> > > > Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
> > > >
> > > > Thank you Neil for writing this document.
> > > > This is a really important change in DPDK.
> > > > It would be very good to have comments or acknowledgement from
> > > > several developpers. This policy would be enforced by having several
> > Acked-by lines.
> > > >
> > > >
> > > > 2015-01-16 10:33, Neil Horman:
> > > > > Adding a document describing rudimentary ABI policy and adding
> > > > > notice space for any deprecation announcements
> > > > >
> > > > > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> > > > > CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> > > > > CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> > > > >
> > > > > ---
> > > > > Change notes:
> > > > >
> > > > > v5) Updated documentation to add notes from Thomas M.
> > > > > ---
> > > > >  doc/abi.txt | 36 ++++++++++++++++++++++++++++++++++++
> > > > >  1 file changed, 36 insertions(+)
> > > > >  create mode 100644 doc/abi.txt
> > > > >
> > > > > diff --git a/doc/abi.txt b/doc/abi.txt new file mode 100644 index
> > > > > 0000000..14be464
> > > > > --- /dev/null
> > > > > +++ b/doc/abi.txt
> > > > > @@ -0,0 +1,36 @@
> > > > > +ABI policy:
> > > > > +	ABI versions are set at the time of major release labeling, and
> > > > > +ABI may change multiple times between the last labeling and the
> > > > > +HEAD label of the git tree without warning
> > > > > +
> > > > > +	ABI versions, once released are available until such time as
> > > > > +their deprecation has been noted here for at least one major
> > > > > +release cycle, after it has been tagged.  E.g. the ABI for DPDK
> > > > > +1.8 is shipped, and then the decision to remove it is made during
> > > > > +the development of DPDK 1.9.  The decision will be recorded here,
> > > > > +shipped with the DPDK 1.9 release, and actually removed when DPDK
> > > > > +1.10 ships.
> > > > > +
> > > > > +	ABI versions may be deprecated in whole, or in part as needed by
> > > > > +a given update.
> > > > > +
> > > > > +	Some ABI changes may be too significant to reasonably maintain
> > > > > +multiple versions of.  In those events ABI's may be updated
> > > > > +without backward compatibility provided.  The requirements for doing
> > so are:
> > > > > +	1) At least 3 acknoweldgements of the need on the dpdk.org
> > > > > +	2) A full deprecation cycle must be made to offer downstream
> > > > > +consumers sufficient warning of the change.  E.g. if dpdk 2.0 is
> > > > > +under development when the change is proposed, a deprecation
> > > > > +notice must be added to this file, and released with dpdk 2.0.
> > > > > +Then the change may be incorporated for
> > > > dpdk 2.1
> > > > > +	3) The LIBABIVER variable in the makefilei(s) where the ABI
> > > > > +changes are incorporated must be incremented in parallel with the
> > > > > +ABI changes themselves
> > > > > +
> > > > > +	Note that the above process for ABI deprecation should not be
> > > > > +undertaken lightly.  ABI stability is extreemely important for
> > > > > +downstream consumers of the DPDK, especially when distributed in
> > > > > +shared object form.  Every effort should be made to preserve ABI
> > > > > +whenever possible.  For instance, reorganizing public structure
> > > > > +field for astetic or readability purposes should be avoided as it
> > > > > +will cause ABI breakage.  Only significant (e.g. performance)
> > > > > +reasons should be seen as cause to alter
> > > > ABI.
> > >
> > > Hi Thomas,
> > >
> > > Should there be a reference to this document in the programmers guide?
> > >
> > Thats a good question. I think, as Thomas notes, it probably should be
> > referenced in some way.  The programmers guide might be good.  What
> > might be better would be checking the deprecation notices and adding them
> > to the release notes for any given release.
> > 
> > Thoughts?
> > Neil
> > 
> > > Regards,
> > >
> > > Bernard.
> > >
> > >
> 
> Sorry to be pedantic but would you also mind sending it as a .rst file instead of .txt if you're going to send as patches to Programmer's Guide anyway? :)
> Thanks,
Actually I'm not sure this is a good idea.  The release notes get formatted and
review by a documentation team right?  I'm not sure theres value in having a
developer write formatted text if its just going to get reviewed and reformatted
later, is there?
Neil

> Siobhan
> 

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-20 14:00  8%     ` Thomas Monjalon
@ 2015-01-20 14:37  7%       ` Neil Horman
  2015-01-20 15:06  9%         ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Neil Horman @ 2015-01-20 14:37 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Tue, Jan 20, 2015 at 03:00:01PM +0100, Thomas Monjalon wrote:
> 2015-01-16 10:33, Neil Horman:
> > --- /dev/null
> > +++ b/doc/abi.txt
> > @@ -0,0 +1,36 @@
> > +ABI policy:
> > +	ABI versions are set at the time of major release labeling, and ABI may
> > +change multiple times between the last labeling and the HEAD label of the git
> > +tree without warning
> > +
> > +	ABI versions, once released are available until such time as their
> > +deprecation has been noted here for at least one major release cycle, after it
> > +has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
> > +remove it is made during the development of DPDK 1.9.  The decision will be
> > +recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
> > +1.10 ships.
> > +
> > +	ABI versions may be deprecated in whole, or in part as needed by a given
> > +update.
> > +
> > +	Some ABI changes may be too significant to reasonably maintain multiple
> > +versions of.  In those events ABI's may be updated without backward
> > +compatibility provided.  The requirements for doing so are:
> > +	1) At least 3 acknoweldgements of the need on the dpdk.org
> > +	2) A full deprecation cycle must be made to offer downstream consumers
> > +sufficient warning of the change.  E.g. if dpdk 2.0 is under development when
> > +the change is proposed, a deprecation notice must be added to this file, and
> > +released with dpdk 2.0.  Then the change may be incorporated for dpdk 2.1
> > +	3) The LIBABIVER variable in the makefilei(s) where the ABI changes are
> > +incorporated must be incremented in parallel with the ABI changes themselves
> > +
> > +	Note that the above process for ABI deprecation should not be undertaken
> > +lightly.  ABI stability is extreemely important for downstream consumers of the
> > +DPDK, especially when distributed in shared object form.  Every effort should be
> > +made to preserve ABI whenever possible.  For instance, reorganizing public
> > +structure field for astetic or readability purposes should be avoided as it will
> 
> astetic? typo?
> 
> > +cause ABI breakage.  Only significant (e.g. performance) reasons should be seen
> > +as cause to alter ABI.
> > +  
> > +Deprecation Notices:
> 
> Neil, are you sure it's a good idea to put deprecations notices here instead
> of release notes?
> 
Funny, I just made mention of that in my last note.  I do think that the release
notes is the right place to "officially" announce deprecation warnings, but I
think we need a way for developers to communicate that efficiently (given that
the release notes aren't stored in the git tree).  I think this is the place for
developers to canonically list deprecations, and make reading this file part of
the release notes generation process.  That way, updates can be made as part of
the commit process easily.

> I'm also thinking that we need to add more things in this doc:
> 	- case of macros/constant deprecation (API only)
> 	- case of structure update: must be renamed to provide ABI compatibility?
> 
I'm definately in favor of adding such notices here, but I hadn't planned for
any strict formatting of any given notice.  That is to say, I considered you're
two issues above to be able to be included here.  I have no issue with listing a
deprecation note that indicates macros are being removed or that sections of api
are being versioned to accomodate structure changes. of any sort

> Do you think we can have a tool to test the ABI compatibility by building
> examples/apps of previous version and checking them with built DSO of
> current version?
> 
I do, though I'm not sure its within the scope of this update.  The easiest way
to do it currently is to checkout the last released version of the dpdk, build
it as a DSO build, copy out one of the test/example apps, checkout the HEAD of
the tree, rebuild, and run the saved off test app from the first build using the
shared objects of the second build.  That does some rudimentary validation,
but it only touches on the API aspects that the application you're using makes
use of.  What would be better would be if we had a test application that made a
call to every exported API call that we have, so that we could be confident that
we were exhaustively testing the ABI surface.  I think thats a large piece of
work, but it would be beneficial to have.

Thanks
Neil

^ permalink raw reply	[relevance 7%]

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-20 14:24  4%         ` Neil Horman
  2015-01-20 14:29  4%           ` Butler, Siobhan A
@ 2015-01-20 14:32  4%           ` O'driscoll, Tim
  1 sibling, 0 replies; 200+ results
From: O'driscoll, Tim @ 2015-01-20 14:32 UTC (permalink / raw)
  To: Neil Horman, Iremonger, Bernard; +Cc: dev

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> Sent: Tuesday, January 20, 2015 2:24 PM
> To: Iremonger, Bernard
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
> 
> On Tue, Jan 20, 2015 at 01:37:35PM +0000, Iremonger, Bernard wrote:
> > > -----Original Message-----
> > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas
> Monjalon
> > > Sent: Tuesday, January 20, 2015 7:15 AM
> > > To: Neil Horman
> > > Cc: dev@dpdk.org
> > > Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
> > >
> > > Thank you Neil for writing this document.
> > > This is a really important change in DPDK.
> > > It would be very good to have comments or acknowledgement from
> several developpers. This policy
> > > would be enforced by having several Acked-by lines.
> > >
> > >
> > > 2015-01-16 10:33, Neil Horman:
> > > > Adding a document describing rudimentary ABI policy and adding notice
> > > > space for any deprecation announcements
> > > >
> > > > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> > > > CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> > > > CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> > > >
> > > > ---
> > > > Change notes:
> > > >
> > > > v5) Updated documentation to add notes from Thomas M.
> > > > ---
> > > >  doc/abi.txt | 36 ++++++++++++++++++++++++++++++++++++
> > > >  1 file changed, 36 insertions(+)
> > > >  create mode 100644 doc/abi.txt
> > > >
> > > > diff --git a/doc/abi.txt b/doc/abi.txt new file mode 100644 index
> > > > 0000000..14be464
> > > > --- /dev/null
> > > > +++ b/doc/abi.txt
> > > > @@ -0,0 +1,36 @@
> > > > +ABI policy:
> > > > +	ABI versions are set at the time of major release labeling, and ABI
> > > > +may change multiple times between the last labeling and the HEAD
> > > > +label of the git tree without warning
> > > > +
> > > > +	ABI versions, once released are available until such time as their
> > > > +deprecation has been noted here for at least one major release cycle,
> > > > +after it has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and
> > > > +then the decision to remove it is made during the development of
> DPDK
> > > > +1.9.  The decision will be recorded here, shipped with the DPDK 1.9
> > > > +release, and actually removed when DPDK
> > > > +1.10 ships.
> > > > +
> > > > +	ABI versions may be deprecated in whole, or in part as needed by a
> > > > +given update.
> > > > +
> > > > +	Some ABI changes may be too significant to reasonably maintain
> > > > +multiple versions of.  In those events ABI's may be updated without
> > > > +backward compatibility provided.  The requirements for doing so are:
> > > > +	1) At least 3 acknoweldgements of the need on the dpdk.org
> > > > +	2) A full deprecation cycle must be made to offer downstream
> > > > +consumers sufficient warning of the change.  E.g. if dpdk 2.0 is
> > > > +under development when the change is proposed, a deprecation
> notice
> > > > +must be added to this file, and released with dpdk 2.0.  Then the
> change may be incorporated for
> > > dpdk 2.1
> > > > +	3) The LIBABIVER variable in the makefilei(s) where the ABI changes
> > > > +are incorporated must be incremented in parallel with the ABI changes
> > > > +themselves
> > > > +
> > > > +	Note that the above process for ABI deprecation should not be
> > > > +undertaken lightly.  ABI stability is extreemely important for
> > > > +downstream consumers of the DPDK, especially when distributed in
> > > > +shared object form.  Every effort should be made to preserve ABI
> > > > +whenever possible.  For instance, reorganizing public structure field
> > > > +for astetic or readability purposes should be avoided as it will
> > > > +cause ABI breakage.  Only significant (e.g. performance) reasons
> should be seen as cause to alter
> > > ABI.
> >
> > Hi Thomas,
> >
> > Should there be a reference to this document in the programmers guide?
> >
> Thats a good question. I think, as Thomas notes, it probably should be
> referenced in some way.  The programmers guide might be good.  What
> might be
> better would be checking the deprecation notices and adding them to the
> release
> notes for any given release.
> 
> Thoughts?

I'd suggest that the policy itself should go in, or at least be referenced from, the programmer's guide. I agree that the deprecation notices themselves should go in the release notes.

> Neil
> 
> > Regards,
> >
> > Bernard.
> >
> >

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-20 14:24  4%         ` Neil Horman
@ 2015-01-20 14:29  4%           ` Butler, Siobhan A
  2015-01-20 14:41  4%             ` Neil Horman
  2015-01-20 14:32  4%           ` O'driscoll, Tim
  1 sibling, 1 reply; 200+ results
From: Butler, Siobhan A @ 2015-01-20 14:29 UTC (permalink / raw)
  To: Neil Horman, Iremonger, Bernard; +Cc: dev



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> Sent: Tuesday, January 20, 2015 2:24 PM
> To: Iremonger, Bernard
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
> 
> On Tue, Jan 20, 2015 at 01:37:35PM +0000, Iremonger, Bernard wrote:
> > > -----Original Message-----
> > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas
> Monjalon
> > > Sent: Tuesday, January 20, 2015 7:15 AM
> > > To: Neil Horman
> > > Cc: dev@dpdk.org
> > > Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
> > >
> > > Thank you Neil for writing this document.
> > > This is a really important change in DPDK.
> > > It would be very good to have comments or acknowledgement from
> > > several developpers. This policy would be enforced by having several
> Acked-by lines.
> > >
> > >
> > > 2015-01-16 10:33, Neil Horman:
> > > > Adding a document describing rudimentary ABI policy and adding
> > > > notice space for any deprecation announcements
> > > >
> > > > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> > > > CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> > > > CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> > > >
> > > > ---
> > > > Change notes:
> > > >
> > > > v5) Updated documentation to add notes from Thomas M.
> > > > ---
> > > >  doc/abi.txt | 36 ++++++++++++++++++++++++++++++++++++
> > > >  1 file changed, 36 insertions(+)
> > > >  create mode 100644 doc/abi.txt
> > > >
> > > > diff --git a/doc/abi.txt b/doc/abi.txt new file mode 100644 index
> > > > 0000000..14be464
> > > > --- /dev/null
> > > > +++ b/doc/abi.txt
> > > > @@ -0,0 +1,36 @@
> > > > +ABI policy:
> > > > +	ABI versions are set at the time of major release labeling, and
> > > > +ABI may change multiple times between the last labeling and the
> > > > +HEAD label of the git tree without warning
> > > > +
> > > > +	ABI versions, once released are available until such time as
> > > > +their deprecation has been noted here for at least one major
> > > > +release cycle, after it has been tagged.  E.g. the ABI for DPDK
> > > > +1.8 is shipped, and then the decision to remove it is made during
> > > > +the development of DPDK 1.9.  The decision will be recorded here,
> > > > +shipped with the DPDK 1.9 release, and actually removed when DPDK
> > > > +1.10 ships.
> > > > +
> > > > +	ABI versions may be deprecated in whole, or in part as needed by
> > > > +a given update.
> > > > +
> > > > +	Some ABI changes may be too significant to reasonably maintain
> > > > +multiple versions of.  In those events ABI's may be updated
> > > > +without backward compatibility provided.  The requirements for doing
> so are:
> > > > +	1) At least 3 acknoweldgements of the need on the dpdk.org
> > > > +	2) A full deprecation cycle must be made to offer downstream
> > > > +consumers sufficient warning of the change.  E.g. if dpdk 2.0 is
> > > > +under development when the change is proposed, a deprecation
> > > > +notice must be added to this file, and released with dpdk 2.0.
> > > > +Then the change may be incorporated for
> > > dpdk 2.1
> > > > +	3) The LIBABIVER variable in the makefilei(s) where the ABI
> > > > +changes are incorporated must be incremented in parallel with the
> > > > +ABI changes themselves
> > > > +
> > > > +	Note that the above process for ABI deprecation should not be
> > > > +undertaken lightly.  ABI stability is extreemely important for
> > > > +downstream consumers of the DPDK, especially when distributed in
> > > > +shared object form.  Every effort should be made to preserve ABI
> > > > +whenever possible.  For instance, reorganizing public structure
> > > > +field for astetic or readability purposes should be avoided as it
> > > > +will cause ABI breakage.  Only significant (e.g. performance)
> > > > +reasons should be seen as cause to alter
> > > ABI.
> >
> > Hi Thomas,
> >
> > Should there be a reference to this document in the programmers guide?
> >
> Thats a good question. I think, as Thomas notes, it probably should be
> referenced in some way.  The programmers guide might be good.  What
> might be better would be checking the deprecation notices and adding them
> to the release notes for any given release.
> 
> Thoughts?
> Neil
> 
> > Regards,
> >
> > Bernard.
> >
> >

Sorry to be pedantic but would you also mind sending it as a .rst file instead of .txt if you're going to send as patches to Programmer's Guide anyway? :)
Thanks,
Siobhan

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-20 13:37  4%       ` Iremonger, Bernard
  2015-01-20 13:46  4%         ` Thomas Monjalon
@ 2015-01-20 14:24  4%         ` Neil Horman
  2015-01-20 14:29  4%           ` Butler, Siobhan A
  2015-01-20 14:32  4%           ` O'driscoll, Tim
  1 sibling, 2 replies; 200+ results
From: Neil Horman @ 2015-01-20 14:24 UTC (permalink / raw)
  To: Iremonger, Bernard; +Cc: dev

On Tue, Jan 20, 2015 at 01:37:35PM +0000, Iremonger, Bernard wrote:
> > -----Original Message-----
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas Monjalon
> > Sent: Tuesday, January 20, 2015 7:15 AM
> > To: Neil Horman
> > Cc: dev@dpdk.org
> > Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
> > 
> > Thank you Neil for writing this document.
> > This is a really important change in DPDK.
> > It would be very good to have comments or acknowledgement from several developpers. This policy
> > would be enforced by having several Acked-by lines.
> > 
> > 
> > 2015-01-16 10:33, Neil Horman:
> > > Adding a document describing rudimentary ABI policy and adding notice
> > > space for any deprecation announcements
> > >
> > > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> > > CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> > > CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> > >
> > > ---
> > > Change notes:
> > >
> > > v5) Updated documentation to add notes from Thomas M.
> > > ---
> > >  doc/abi.txt | 36 ++++++++++++++++++++++++++++++++++++
> > >  1 file changed, 36 insertions(+)
> > >  create mode 100644 doc/abi.txt
> > >
> > > diff --git a/doc/abi.txt b/doc/abi.txt new file mode 100644 index
> > > 0000000..14be464
> > > --- /dev/null
> > > +++ b/doc/abi.txt
> > > @@ -0,0 +1,36 @@
> > > +ABI policy:
> > > +	ABI versions are set at the time of major release labeling, and ABI
> > > +may change multiple times between the last labeling and the HEAD
> > > +label of the git tree without warning
> > > +
> > > +	ABI versions, once released are available until such time as their
> > > +deprecation has been noted here for at least one major release cycle,
> > > +after it has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and
> > > +then the decision to remove it is made during the development of DPDK
> > > +1.9.  The decision will be recorded here, shipped with the DPDK 1.9
> > > +release, and actually removed when DPDK
> > > +1.10 ships.
> > > +
> > > +	ABI versions may be deprecated in whole, or in part as needed by a
> > > +given update.
> > > +
> > > +	Some ABI changes may be too significant to reasonably maintain
> > > +multiple versions of.  In those events ABI's may be updated without
> > > +backward compatibility provided.  The requirements for doing so are:
> > > +	1) At least 3 acknoweldgements of the need on the dpdk.org
> > > +	2) A full deprecation cycle must be made to offer downstream
> > > +consumers sufficient warning of the change.  E.g. if dpdk 2.0 is
> > > +under development when the change is proposed, a deprecation notice
> > > +must be added to this file, and released with dpdk 2.0.  Then the change may be incorporated for
> > dpdk 2.1
> > > +	3) The LIBABIVER variable in the makefilei(s) where the ABI changes
> > > +are incorporated must be incremented in parallel with the ABI changes
> > > +themselves
> > > +
> > > +	Note that the above process for ABI deprecation should not be
> > > +undertaken lightly.  ABI stability is extreemely important for
> > > +downstream consumers of the DPDK, especially when distributed in
> > > +shared object form.  Every effort should be made to preserve ABI
> > > +whenever possible.  For instance, reorganizing public structure field
> > > +for astetic or readability purposes should be avoided as it will
> > > +cause ABI breakage.  Only significant (e.g. performance) reasons should be seen as cause to alter
> > ABI.
> 
> Hi Thomas,
> 
> Should there be a reference to this document in the programmers guide?
> 
Thats a good question. I think, as Thomas notes, it probably should be
referenced in some way.  The programmers guide might be good.  What might be
better would be checking the deprecation notices and adding them to the release
notes for any given release.

Thoughts?
Neil

> Regards,
> 
> Bernard.
> 
> 

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-16 15:33 23%   ` [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation Neil Horman
  2015-01-20  7:14  4%     ` Thomas Monjalon
@ 2015-01-20 14:00  8%     ` Thomas Monjalon
  2015-01-20 14:37  7%       ` Neil Horman
  1 sibling, 1 reply; 200+ results
From: Thomas Monjalon @ 2015-01-20 14:00 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

2015-01-16 10:33, Neil Horman:
> --- /dev/null
> +++ b/doc/abi.txt
> @@ -0,0 +1,36 @@
> +ABI policy:
> +	ABI versions are set at the time of major release labeling, and ABI may
> +change multiple times between the last labeling and the HEAD label of the git
> +tree without warning
> +
> +	ABI versions, once released are available until such time as their
> +deprecation has been noted here for at least one major release cycle, after it
> +has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
> +remove it is made during the development of DPDK 1.9.  The decision will be
> +recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
> +1.10 ships.
> +
> +	ABI versions may be deprecated in whole, or in part as needed by a given
> +update.
> +
> +	Some ABI changes may be too significant to reasonably maintain multiple
> +versions of.  In those events ABI's may be updated without backward
> +compatibility provided.  The requirements for doing so are:
> +	1) At least 3 acknoweldgements of the need on the dpdk.org
> +	2) A full deprecation cycle must be made to offer downstream consumers
> +sufficient warning of the change.  E.g. if dpdk 2.0 is under development when
> +the change is proposed, a deprecation notice must be added to this file, and
> +released with dpdk 2.0.  Then the change may be incorporated for dpdk 2.1
> +	3) The LIBABIVER variable in the makefilei(s) where the ABI changes are
> +incorporated must be incremented in parallel with the ABI changes themselves
> +
> +	Note that the above process for ABI deprecation should not be undertaken
> +lightly.  ABI stability is extreemely important for downstream consumers of the
> +DPDK, especially when distributed in shared object form.  Every effort should be
> +made to preserve ABI whenever possible.  For instance, reorganizing public
> +structure field for astetic or readability purposes should be avoided as it will

astetic? typo?

> +cause ABI breakage.  Only significant (e.g. performance) reasons should be seen
> +as cause to alter ABI.
> +  
> +Deprecation Notices:

Neil, are you sure it's a good idea to put deprecations notices here instead
of release notes?

I'm also thinking that we need to add more things in this doc:
	- case of macros/constant deprecation (API only)
	- case of structure update: must be renamed to provide ABI compatibility?

Do you think we can have a tool to test the ABI compatibility by building
examples/apps of previous version and checking them with built DSO of
current version?

Thanks
-- 
Thomas

^ permalink raw reply	[relevance 8%]

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-20 13:37  4%       ` Iremonger, Bernard
@ 2015-01-20 13:46  4%         ` Thomas Monjalon
  2015-01-20 14:24  4%         ` Neil Horman
  1 sibling, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-01-20 13:46 UTC (permalink / raw)
  To: Iremonger, Bernard; +Cc: dev

2015-01-20 13:37, Iremonger, Bernard:
> Should there be a reference to this document in the programmers guide?

Maybe. You mean that an application developper must be aware of the deprecation
policy? So probably yes.
And I'd add that the release notes should reference the deprecations.

-- 
Thomas

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-20  7:14  4%     ` Thomas Monjalon
  2015-01-20 10:47  4%       ` Bruce Richardson
@ 2015-01-20 13:37  4%       ` Iremonger, Bernard
  2015-01-20 13:46  4%         ` Thomas Monjalon
  2015-01-20 14:24  4%         ` Neil Horman
  1 sibling, 2 replies; 200+ results
From: Iremonger, Bernard @ 2015-01-20 13:37 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas Monjalon
> Sent: Tuesday, January 20, 2015 7:15 AM
> To: Neil Horman
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
> 
> Thank you Neil for writing this document.
> This is a really important change in DPDK.
> It would be very good to have comments or acknowledgement from several developpers. This policy
> would be enforced by having several Acked-by lines.
> 
> 
> 2015-01-16 10:33, Neil Horman:
> > Adding a document describing rudimentary ABI policy and adding notice
> > space for any deprecation announcements
> >
> > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> > CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> > CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> >
> > ---
> > Change notes:
> >
> > v5) Updated documentation to add notes from Thomas M.
> > ---
> >  doc/abi.txt | 36 ++++++++++++++++++++++++++++++++++++
> >  1 file changed, 36 insertions(+)
> >  create mode 100644 doc/abi.txt
> >
> > diff --git a/doc/abi.txt b/doc/abi.txt new file mode 100644 index
> > 0000000..14be464
> > --- /dev/null
> > +++ b/doc/abi.txt
> > @@ -0,0 +1,36 @@
> > +ABI policy:
> > +	ABI versions are set at the time of major release labeling, and ABI
> > +may change multiple times between the last labeling and the HEAD
> > +label of the git tree without warning
> > +
> > +	ABI versions, once released are available until such time as their
> > +deprecation has been noted here for at least one major release cycle,
> > +after it has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and
> > +then the decision to remove it is made during the development of DPDK
> > +1.9.  The decision will be recorded here, shipped with the DPDK 1.9
> > +release, and actually removed when DPDK
> > +1.10 ships.
> > +
> > +	ABI versions may be deprecated in whole, or in part as needed by a
> > +given update.
> > +
> > +	Some ABI changes may be too significant to reasonably maintain
> > +multiple versions of.  In those events ABI's may be updated without
> > +backward compatibility provided.  The requirements for doing so are:
> > +	1) At least 3 acknoweldgements of the need on the dpdk.org
> > +	2) A full deprecation cycle must be made to offer downstream
> > +consumers sufficient warning of the change.  E.g. if dpdk 2.0 is
> > +under development when the change is proposed, a deprecation notice
> > +must be added to this file, and released with dpdk 2.0.  Then the change may be incorporated for
> dpdk 2.1
> > +	3) The LIBABIVER variable in the makefilei(s) where the ABI changes
> > +are incorporated must be incremented in parallel with the ABI changes
> > +themselves
> > +
> > +	Note that the above process for ABI deprecation should not be
> > +undertaken lightly.  ABI stability is extreemely important for
> > +downstream consumers of the DPDK, especially when distributed in
> > +shared object form.  Every effort should be made to preserve ABI
> > +whenever possible.  For instance, reorganizing public structure field
> > +for astetic or readability purposes should be avoided as it will
> > +cause ABI breakage.  Only significant (e.g. performance) reasons should be seen as cause to alter
> ABI.

Hi Thomas,

Should there be a reference to this document in the programmers guide?

Regards,

Bernard.

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-20  7:14  4%     ` Thomas Monjalon
@ 2015-01-20 10:47  4%       ` Bruce Richardson
  2015-01-20 13:37  4%       ` Iremonger, Bernard
  1 sibling, 0 replies; 200+ results
From: Bruce Richardson @ 2015-01-20 10:47 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Tue, Jan 20, 2015 at 08:14:50AM +0100, Thomas Monjalon wrote:
> Thank you Neil for writing this document.
> This is a really important change in DPDK.
> It would be very good to have comments or acknowledgement from several
> developpers. This policy would be enforced by having several Acked-by lines.
> 
> 
> 2015-01-16 10:33, Neil Horman:
> > Adding a document describing rudimentary ABI policy and adding notice space for
> > any deprecation announcements
> > 
> > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> > CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> > CC: "Richardson, Bruce" <bruce.richardson@intel.com>

This policy looks sensible to me.
Acked-by: Bruce Richardson <bruce.richardson@intel.com>

> > 
> > ---
> > Change notes:
> > 
> > v5) Updated documentation to add notes from Thomas M.
> > ---
> >  doc/abi.txt | 36 ++++++++++++++++++++++++++++++++++++
> >  1 file changed, 36 insertions(+)
> >  create mode 100644 doc/abi.txt
> > 
> > diff --git a/doc/abi.txt b/doc/abi.txt
> > new file mode 100644
> > index 0000000..14be464
> > --- /dev/null
> > +++ b/doc/abi.txt
> > @@ -0,0 +1,36 @@
> > +ABI policy:
> > +	ABI versions are set at the time of major release labeling, and ABI may
> > +change multiple times between the last labeling and the HEAD label of the git
> > +tree without warning
> > +
> > +	ABI versions, once released are available until such time as their
> > +deprecation has been noted here for at least one major release cycle, after it
> > +has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
> > +remove it is made during the development of DPDK 1.9.  The decision will be
> > +recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
> > +1.10 ships.
> > +
> > +	ABI versions may be deprecated in whole, or in part as needed by a given
> > +update.
> > +
> > +	Some ABI changes may be too significant to reasonably maintain multiple
> > +versions of.  In those events ABI's may be updated without backward
> > +compatibility provided.  The requirements for doing so are:
> > +	1) At least 3 acknoweldgements of the need on the dpdk.org
> > +	2) A full deprecation cycle must be made to offer downstream consumers
> > +sufficient warning of the change.  E.g. if dpdk 2.0 is under development when
> > +the change is proposed, a deprecation notice must be added to this file, and
> > +released with dpdk 2.0.  Then the change may be incorporated for dpdk 2.1
> > +	3) The LIBABIVER variable in the makefilei(s) where the ABI changes are
> > +incorporated must be incremented in parallel with the ABI changes themselves
> > +
> > +	Note that the above process for ABI deprecation should not be undertaken
> > +lightly.  ABI stability is extreemely important for downstream consumers of the
> > +DPDK, especially when distributed in shared object form.  Every effort should be
> > +made to preserve ABI whenever possible.  For instance, reorganizing public
> > +structure field for astetic or readability purposes should be avoided as it will
> > +cause ABI breakage.  Only significant (e.g. performance) reasons should be seen
> > +as cause to alter ABI.
>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-16 15:33 23%   ` [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation Neil Horman
@ 2015-01-20  7:14  4%     ` Thomas Monjalon
  2015-01-20 10:47  4%       ` Bruce Richardson
  2015-01-20 13:37  4%       ` Iremonger, Bernard
  2015-01-20 14:00  8%     ` Thomas Monjalon
  1 sibling, 2 replies; 200+ results
From: Thomas Monjalon @ 2015-01-20  7:14 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

Thank you Neil for writing this document.
This is a really important change in DPDK.
It would be very good to have comments or acknowledgement from several
developpers. This policy would be enforced by having several Acked-by lines.


2015-01-16 10:33, Neil Horman:
> Adding a document describing rudimentary ABI policy and adding notice space for
> any deprecation announcements
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> 
> ---
> Change notes:
> 
> v5) Updated documentation to add notes from Thomas M.
> ---
>  doc/abi.txt | 36 ++++++++++++++++++++++++++++++++++++
>  1 file changed, 36 insertions(+)
>  create mode 100644 doc/abi.txt
> 
> diff --git a/doc/abi.txt b/doc/abi.txt
> new file mode 100644
> index 0000000..14be464
> --- /dev/null
> +++ b/doc/abi.txt
> @@ -0,0 +1,36 @@
> +ABI policy:
> +	ABI versions are set at the time of major release labeling, and ABI may
> +change multiple times between the last labeling and the HEAD label of the git
> +tree without warning
> +
> +	ABI versions, once released are available until such time as their
> +deprecation has been noted here for at least one major release cycle, after it
> +has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
> +remove it is made during the development of DPDK 1.9.  The decision will be
> +recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
> +1.10 ships.
> +
> +	ABI versions may be deprecated in whole, or in part as needed by a given
> +update.
> +
> +	Some ABI changes may be too significant to reasonably maintain multiple
> +versions of.  In those events ABI's may be updated without backward
> +compatibility provided.  The requirements for doing so are:
> +	1) At least 3 acknoweldgements of the need on the dpdk.org
> +	2) A full deprecation cycle must be made to offer downstream consumers
> +sufficient warning of the change.  E.g. if dpdk 2.0 is under development when
> +the change is proposed, a deprecation notice must be added to this file, and
> +released with dpdk 2.0.  Then the change may be incorporated for dpdk 2.1
> +	3) The LIBABIVER variable in the makefilei(s) where the ABI changes are
> +incorporated must be incremented in parallel with the ABI changes themselves
> +
> +	Note that the above process for ABI deprecation should not be undertaken
> +lightly.  ABI stability is extreemely important for downstream consumers of the
> +DPDK, especially when distributed in shared object form.  Every effort should be
> +made to preserve ABI whenever possible.  For instance, reorganizing public
> +structure field for astetic or readability purposes should be avoided as it will
> +cause ABI breakage.  Only significant (e.g. performance) reasons should be seen
> +as cause to alter ABI.

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation
  2015-01-16 15:33  3% ` [dpdk-dev] [PATCH v5 " Neil Horman
  2015-01-16 15:33  7%   ` [dpdk-dev] [PATCH v5 3/4] Add library version extenstion Neil Horman
@ 2015-01-16 15:33 23%   ` Neil Horman
  2015-01-20  7:14  4%     ` Thomas Monjalon
  2015-01-20 14:00  8%     ` Thomas Monjalon
  1 sibling, 2 replies; 200+ results
From: Neil Horman @ 2015-01-16 15:33 UTC (permalink / raw)
  To: dev

Adding a document describing rudimentary ABI policy and adding notice space for
any deprecation announcements

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>

---
Change notes:

v5) Updated documentation to add notes from Thomas M.
---
 doc/abi.txt | 36 ++++++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)
 create mode 100644 doc/abi.txt

diff --git a/doc/abi.txt b/doc/abi.txt
new file mode 100644
index 0000000..14be464
--- /dev/null
+++ b/doc/abi.txt
@@ -0,0 +1,36 @@
+ABI policy:
+	ABI versions are set at the time of major release labeling, and ABI may
+change multiple times between the last labeling and the HEAD label of the git
+tree without warning
+
+	ABI versions, once released are available until such time as their
+deprecation has been noted here for at least one major release cycle, after it
+has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
+remove it is made during the development of DPDK 1.9.  The decision will be
+recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
+1.10 ships.
+
+	ABI versions may be deprecated in whole, or in part as needed by a given
+update.
+
+	Some ABI changes may be too significant to reasonably maintain multiple
+versions of.  In those events ABI's may be updated without backward
+compatibility provided.  The requirements for doing so are:
+	1) At least 3 acknoweldgements of the need on the dpdk.org
+	2) A full deprecation cycle must be made to offer downstream consumers
+sufficient warning of the change.  E.g. if dpdk 2.0 is under development when
+the change is proposed, a deprecation notice must be added to this file, and
+released with dpdk 2.0.  Then the change may be incorporated for dpdk 2.1
+	3) The LIBABIVER variable in the makefilei(s) where the ABI changes are
+incorporated must be incremented in parallel with the ABI changes themselves
+
+	Note that the above process for ABI deprecation should not be undertaken
+lightly.  ABI stability is extreemely important for downstream consumers of the
+DPDK, especially when distributed in shared object form.  Every effort should be
+made to preserve ABI whenever possible.  For instance, reorganizing public
+structure field for astetic or readability purposes should be avoided as it will
+cause ABI breakage.  Only significant (e.g. performance) reasons should be seen
+as cause to alter ABI.
+  
+Deprecation Notices:
+
-- 
2.1.0

^ permalink raw reply	[relevance 23%]

* [dpdk-dev] [PATCH v5 3/4] Add library version extenstion
  2015-01-16 15:33  3% ` [dpdk-dev] [PATCH v5 " Neil Horman
@ 2015-01-16 15:33  7%   ` Neil Horman
  2015-01-16 15:33 23%   ` [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation Neil Horman
  1 sibling, 0 replies; 200+ results
From: Neil Horman @ 2015-01-16 15:33 UTC (permalink / raw)
  To: dev

To differentiate libraries that break ABI, we add a library version number
suffix to the library, which must be incremented when a given libraries ABI is
broken.  This patch enforces that addition, sets the initial abi soname
extension to 1 for each library and creates a symlink to the base SONAME so that
the test applications will link properly.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>

---
Change Notes:
v3)
	Made symlinking of libraries conditional on a DSO build

v4)	Removed erroneous newline
	changed @exit 1 to @false
	changed ./$(LIB) to $<
---
 lib/librte_acl/Makefile              |  2 ++
 lib/librte_cfgfile/Makefile          |  2 ++
 lib/librte_cmdline/Makefile          |  2 ++
 lib/librte_compat/Makefile           |  2 ++
 lib/librte_distributor/Makefile      |  2 ++
 lib/librte_eal/bsdapp/eal/Makefile   |  2 ++
 lib/librte_eal/linuxapp/eal/Makefile |  2 ++
 lib/librte_ether/Makefile            |  2 ++
 lib/librte_hash/Makefile             |  2 ++
 lib/librte_ip_frag/Makefile          |  2 ++
 lib/librte_ivshmem/Makefile          |  2 ++
 lib/librte_kni/Makefile              |  2 ++
 lib/librte_kvargs/Makefile           |  2 ++
 lib/librte_lpm/Makefile              |  2 ++
 lib/librte_malloc/Makefile           |  2 ++
 lib/librte_mbuf/Makefile             |  2 ++
 lib/librte_mempool/Makefile          |  2 ++
 lib/librte_meter/Makefile            |  2 ++
 lib/librte_pipeline/Makefile         |  2 ++
 lib/librte_pmd_af_packet/Makefile    |  2 ++
 lib/librte_pmd_bond/Makefile         |  2 ++
 lib/librte_pmd_e1000/Makefile        |  2 ++
 lib/librte_pmd_enic/Makefile         |  2 ++
 lib/librte_pmd_i40e/Makefile         |  2 ++
 lib/librte_pmd_ixgbe/Makefile        |  2 ++
 lib/librte_pmd_pcap/Makefile         |  2 ++
 lib/librte_pmd_ring/Makefile         |  2 ++
 lib/librte_pmd_virtio/Makefile       |  2 ++
 lib/librte_pmd_vmxnet3/Makefile      |  2 ++
 lib/librte_pmd_xenvirt/Makefile      |  2 ++
 lib/librte_port/Makefile             |  2 ++
 lib/librte_power/Makefile            |  2 ++
 lib/librte_ring/Makefile             |  2 ++
 lib/librte_sched/Makefile            |  2 ++
 lib/librte_table/Makefile            |  2 ++
 lib/librte_timer/Makefile            |  2 ++
 lib/librte_vhost/Makefile            |  2 ++
 mk/rte.lib.mk                        | 12 ++++++++++--
 38 files changed, 84 insertions(+), 2 deletions(-)

diff --git a/lib/librte_acl/Makefile b/lib/librte_acl/Makefile
index 45cbf80..765deb1 100644
--- a/lib/librte_acl/Makefile
+++ b/lib/librte_acl/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_acl_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_ACL) += tb_mem.c
 
diff --git a/lib/librte_cfgfile/Makefile b/lib/librte_cfgfile/Makefile
index a4f73de..032c240 100644
--- a/lib/librte_cfgfile/Makefile
+++ b/lib/librte_cfgfile/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_cfgfile_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_cmdline/Makefile b/lib/librte_cmdline/Makefile
index 3c71831..719dff6 100644
--- a/lib/librte_cmdline/Makefile
+++ b/lib/librte_cmdline/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_cmdline_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) := cmdline.c
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_cirbuf.c
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
index 0bab870..0c57533 100644
--- a/lib/librte_compat/Makefile
+++ b/lib/librte_compat/Makefile
@@ -32,6 +32,8 @@
 include $(RTE_SDK)/mk/rte.vars.mk
 
 
+LIBABIVER := 1
+
 # install includes
 SYMLINK-y-include := rte_compat.h
 
diff --git a/lib/librte_distributor/Makefile b/lib/librte_distributor/Makefile
index 3674a2c..4c9af17 100644
--- a/lib/librte_distributor/Makefile
+++ b/lib/librte_distributor/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_distributor_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor.c
 
diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index 0b5f9d9..ae214a4 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -48,6 +48,8 @@ CFLAGS += $(WERROR_FLAGS) -O3
 
 EXPORT_MAP := rte_eal_version.map
 
+LIBABIVER := 1
+
 # specific to linuxapp exec-env
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) := eal.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_memory.c
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index bae8af1..e117cec 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -35,6 +35,8 @@ LIB = librte_eal.a
 
 EXPORT_MAP := rte_eal_version.map
 
+LIBABIVER := 1
+
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
 CFLAGS += -I$(SRCDIR)/include
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index 80ad78d..c0e5768 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_ether_version.map
 
+LIBABIVER := 1
+
 SRCS-y += rte_ethdev.c
 
 #
diff --git a/lib/librte_hash/Makefile b/lib/librte_hash/Makefile
index bec61ab..3696cb1 100644
--- a/lib/librte_hash/Makefile
+++ b/lib/librte_hash/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_hash_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) := rte_hash.c
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) += rte_fbk_hash.c
diff --git a/lib/librte_ip_frag/Makefile b/lib/librte_ip_frag/Makefile
index aa88578..fe926f7 100644
--- a/lib/librte_ip_frag/Makefile
+++ b/lib/librte_ip_frag/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_ipfrag_version.map
 
+LIBABIVER := 1
+
 #source files
 ifeq ($(CONFIG_RTE_MBUF_REFCNT),y)
 SRCS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += rte_ipv4_fragmentation.c
diff --git a/lib/librte_ivshmem/Makefile b/lib/librte_ivshmem/Makefile
index 068ee10..16defdb 100644
--- a/lib/librte_ivshmem/Makefile
+++ b/lib/librte_ivshmem/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_ivshmem_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_IVSHMEM) := rte_ivshmem.c
 
diff --git a/lib/librte_kni/Makefile b/lib/librte_kni/Makefile
index 93a516d..7107832 100644
--- a/lib/librte_kni/Makefile
+++ b/lib/librte_kni/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := rte_kni_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KNI) := rte_kni.c
 
diff --git a/lib/librte_kvargs/Makefile b/lib/librte_kvargs/Makefile
index b1c34f3..87b09f2 100644
--- a/lib/librte_kvargs/Makefile
+++ b/lib/librte_kvargs/Makefile
@@ -40,6 +40,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_kvargs_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KVARGS) := rte_kvargs.c
 
diff --git a/lib/librte_lpm/Makefile b/lib/librte_lpm/Makefile
index 8214630..35e6389 100644
--- a/lib/librte_lpm/Makefile
+++ b/lib/librte_lpm/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_lpm_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_LPM) := rte_lpm.c rte_lpm6.c
 
diff --git a/lib/librte_malloc/Makefile b/lib/librte_malloc/Makefile
index 15b7eed..947e41c 100644
--- a/lib/librte_malloc/Makefile
+++ b/lib/librte_malloc/Makefile
@@ -34,6 +34,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_malloc.a
 
+LIBABIVER := 1
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_malloc_version.map
diff --git a/lib/librte_mbuf/Makefile b/lib/librte_mbuf/Makefile
index 03becae..080f3cf 100644
--- a/lib/librte_mbuf/Makefile
+++ b/lib/librte_mbuf/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_mbuf_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MBUF) := rte_mbuf.c
 
diff --git a/lib/librte_mempool/Makefile b/lib/librte_mempool/Makefile
index 31d1a71..940d1f7 100644
--- a/lib/librte_mempool/Makefile
+++ b/lib/librte_mempool/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_mempool_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) +=  rte_mempool.c
 ifeq ($(CONFIG_RTE_LIBRTE_XEN_DOM0),y)
diff --git a/lib/librte_meter/Makefile b/lib/librte_meter/Makefile
index c4a7a32..8765881 100644
--- a/lib/librte_meter/Makefile
+++ b/lib/librte_meter/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_meter_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pipeline/Makefile b/lib/librte_pipeline/Makefile
index 15b58df..15e406b 100644
--- a/lib/librte_pipeline/Makefile
+++ b/lib/librte_pipeline/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pipeline_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_af_packet/Makefile b/lib/librte_pmd_af_packet/Makefile
index 85a7860..f0bf537 100644
--- a/lib/librte_pmd_af_packet/Makefile
+++ b/lib/librte_pmd_af_packet/Makefile
@@ -40,6 +40,8 @@ LIB = librte_pmd_af_packet.a
 
 EXPORT_MAP := rte_pmd_af_packet_version.map
 
+LIBABIVER := 1
+
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
diff --git a/lib/librte_pmd_bond/Makefile b/lib/librte_pmd_bond/Makefile
index 074110a..d6c81a8 100644
--- a/lib/librte_pmd_bond/Makefile
+++ b/lib/librte_pmd_bond/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_bond_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_e1000/Makefile b/lib/librte_pmd_e1000/Makefile
index cd14444..8c8fed8 100644
--- a/lib/librte_pmd_e1000/Makefile
+++ b/lib/librte_pmd_e1000/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_e1000_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_enic/Makefile b/lib/librte_pmd_enic/Makefile
index 697231c..251a898 100644
--- a/lib/librte_pmd_enic/Makefile
+++ b/lib/librte_pmd_enic/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_enic.a
 
 EXPORT_MAP := rte_pmd_enic_version.map
 
+LIBABIVER := 1
+
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/vnic/
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/
 CFLAGS += -O3
diff --git a/lib/librte_pmd_i40e/Makefile b/lib/librte_pmd_i40e/Makefile
index 73de373..9a0eec8 100644
--- a/lib/librte_pmd_i40e/Makefile
+++ b/lib/librte_pmd_i40e/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_i40e_version.map
 
+LIBABIVER := 1
+
 #
 # Add extra flags for base driver files (also known as shared code)
 # to disable warnings
diff --git a/lib/librte_pmd_ixgbe/Makefile b/lib/librte_pmd_ixgbe/Makefile
index e0a17f6..d580f62 100644
--- a/lib/librte_pmd_ixgbe/Makefile
+++ b/lib/librte_pmd_ixgbe/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_ixgbe_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_pcap/Makefile b/lib/librte_pmd_pcap/Makefile
index cb6678e..0775dbc 100644
--- a/lib/librte_pmd_pcap/Makefile
+++ b/lib/librte_pmd_pcap/Makefile
@@ -42,6 +42,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_pcap_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_ring/Makefile b/lib/librte_pmd_ring/Makefile
index aa1b461..e442d0b 100644
--- a/lib/librte_pmd_ring/Makefile
+++ b/lib/librte_pmd_ring/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_ring_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_virtio/Makefile b/lib/librte_pmd_virtio/Makefile
index d979c59..793067f 100644
--- a/lib/librte_pmd_virtio/Makefile
+++ b/lib/librte_pmd_virtio/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_virtio_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_vmxnet3/Makefile b/lib/librte_pmd_vmxnet3/Makefile
index f3ab178..93e5580 100644
--- a/lib/librte_pmd_vmxnet3/Makefile
+++ b/lib/librte_pmd_vmxnet3/Makefile
@@ -68,6 +68,8 @@ VPATH += $(RTE_SDK)/lib/librte_pmd_vmxnet3/vmxnet3
 
 EXPORT_MAP := rte_pmd_vmxnet3_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_xenvirt/Makefile b/lib/librte_pmd_xenvirt/Makefile
index 4510603..f0c796c 100644
--- a/lib/librte_pmd_xenvirt/Makefile
+++ b/lib/librte_pmd_xenvirt/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_xenvirt_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_port/Makefile b/lib/librte_port/Makefile
index 266ed39..0e38452 100644
--- a/lib/librte_port/Makefile
+++ b/lib/librte_port/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_port_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_power/Makefile b/lib/librte_power/Makefile
index 0547dcd..cee95cd 100644
--- a/lib/librte_power/Makefile
+++ b/lib/librte_power/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := rte_power_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) := rte_power.c rte_power_acpi_cpufreq.c
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) += rte_power_kvm_vm.c guest_channel.c
diff --git a/lib/librte_ring/Makefile b/lib/librte_ring/Makefile
index b437dc5..84ad3d3 100644
--- a/lib/librte_ring/Makefile
+++ b/lib/librte_ring/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_ring_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_RING) := rte_ring.c
 
diff --git a/lib/librte_sched/Makefile b/lib/librte_sched/Makefile
index 48f280a..b1cb285 100644
--- a/lib/librte_sched/Makefile
+++ b/lib/librte_sched/Makefile
@@ -43,6 +43,8 @@ CFLAGS_rte_red.o := -D_GNU_SOURCE
 
 EXPORT_MAP := rte_sched_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_table/Makefile b/lib/librte_table/Makefile
index 4e1a54a..0d8394c 100644
--- a/lib/librte_table/Makefile
+++ b/lib/librte_table/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_table_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_timer/Makefile b/lib/librte_timer/Makefile
index 9fb6079..2aabef8 100644
--- a/lib/librte_timer/Makefile
+++ b/lib/librte_timer/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_timer_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_TIMER) := rte_timer.c
 
diff --git a/lib/librte_vhost/Makefile b/lib/librte_vhost/Makefile
index 96a7dd0..369c25a 100644
--- a/lib/librte_vhost/Makefile
+++ b/lib/librte_vhost/Makefile
@@ -36,6 +36,8 @@ LIB = librte_vhost.a
 
 EXPORT_MAP := rte_vhost_version.map
 
+LIBABIVER := 1
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -D_FILE_OFFSET_BITS=64 -lfuse
 LDFLAGS += -lfuse
 # all source are stored in SRCS-y
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 1d3b646..865a307 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -37,10 +37,9 @@ include $(RTE_SDK)/mk/internal/rte.depdirs-pre.mk
 
 # VPATH contains at least SRCDIR
 VPATH += $(SRCDIR)
-
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
-LIB := $(patsubst %.a,%.so,$(LIB))
 
+LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB))
 CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
 
 endif
@@ -113,6 +112,10 @@ lib_dir = [ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib;
 #
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
+ifeq ($(LIBABIVER),)
+	@echo "Must Specify a $(LIB) ABI version"
+	@false
+endif
 	@[ -d $(dir $@) ] || mkdir -p $(dir $@)
 	$(if $(D),\
 		@echo -n "$< -> $@ " ; \
@@ -126,6 +129,7 @@ $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
 		$(depfile_missing),\
 		$(depfile_newer)),\
 		$(O_TO_S_DO))
+
 ifeq ($(RTE_BUILD_COMBINE_LIBS),y)
 	$(if $(or \
         $(file_missing),\
@@ -163,9 +167,13 @@ endif
 # install lib in $(RTE_OUTPUT)/lib
 #
 $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
+	$(eval LIBSONAME := $(basename $(LIB)))
 	@echo "  INSTALL-LIB $(LIB)"
 	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
 	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
+ifeq ($(RTE_BUILD_SHARED_LIB),y)
+	$(Q)ln -s -f $< $(RTE_OUTPUT)/lib/$(LIBSONAME)
+endif
 
 #
 # Clean all generated files
-- 
2.1.0

^ permalink raw reply	[relevance 7%]

* [dpdk-dev] [PATCH v5 1/4] compat: Add infrastructure to support symbol versioning
  2014-12-20 21:01  4% [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
                   ` (6 preceding siblings ...)
  2015-01-15 19:35  3% ` [dpdk-dev] [PATCH v4 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
@ 2015-01-16 15:33  3% ` Neil Horman
  2015-01-16 15:33  7%   ` [dpdk-dev] [PATCH v5 3/4] Add library version extenstion Neil Horman
  2015-01-16 15:33 23%   ` [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation Neil Horman
  2015-01-20 21:17  3% ` [dpdk-dev] [PATCH v6 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
                   ` (4 subsequent siblings)
  12 siblings, 2 replies; 200+ results
From: Neil Horman @ 2015-01-16 15:33 UTC (permalink / raw)
  To: dev

Add initial pass header files to support symbol versioning.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
CC: "Gonzalez Monroy, Sergio" <sergio.gonzalez.monroy@intel.com>

---
Change Notes:
V2)
	Moved ifeq to _INSTALL target

V3)
	Undo V2 changes and make librte_compat use the rte.install.mk file
instead

v4)
	changed --version-script to accept SRCDIR in this patch at per request
	documented versioning macros
	cleaned up macro parameter consistency
	converted SA macro to RTE_STR macro
	fixed copyright
---
 lib/Makefile                   |   1 +
 lib/librte_compat/Makefile     |  38 +++++++++++++
 lib/librte_compat/rte_compat.h | 117 +++++++++++++++++++++++++++++++++++++++++
 mk/rte.lib.mk                  |   4 ++
 4 files changed, 160 insertions(+)
 create mode 100644 lib/librte_compat/Makefile
 create mode 100644 lib/librte_compat/rte_compat.h

diff --git a/lib/Makefile b/lib/Makefile
index 0ffc982..d617d81 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -31,6 +31,7 @@
 
 include $(RTE_SDK)/mk/rte.vars.mk
 
+DIRS-y += librte_compat
 DIRS-$(CONFIG_RTE_LIBRTE_EAL) += librte_eal
 DIRS-$(CONFIG_RTE_LIBRTE_MALLOC) += librte_malloc
 DIRS-$(CONFIG_RTE_LIBRTE_RING) += librte_ring
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
new file mode 100644
index 0000000..0bab870
--- /dev/null
+++ b/lib/librte_compat/Makefile
@@ -0,0 +1,38 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2013 Neil Horman <nhorman@tuxdriver.com>
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+
+# install includes
+SYMLINK-y-include := rte_compat.h
+
+include $(RTE_SDK)/mk/rte.install.mk
diff --git a/lib/librte_compat/rte_compat.h b/lib/librte_compat/rte_compat.h
new file mode 100644
index 0000000..d7cc176
--- /dev/null
+++ b/lib/librte_compat/rte_compat.h
@@ -0,0 +1,117 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2010 Neil Horman <nhorman@tuxdriver.com>.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _RTE_COMPAT_H_
+#define _RTE_COMPAT_H_
+#include <rte_common.h>
+
+#ifdef RTE_BUILD_SHARED_LIB
+
+/*
+ * Provides backwards compatibility when updating exported functions.
+ * When a symol is exported from a library to provide an API, it also provides a
+ * calling convention (ABI) that is embodied in its name, return type,
+ * arguments, etc.  On occasion that function may need to change to accomodate
+ * new functionality, behavior, etc.  When that occurs, it is desireable to
+ * allow for backwards compatibility for a time with older binaries that are
+ * dynamically linked to the dpdk.  To support that, the __vsym and
+ * VERSION_SYMBOL macros are created.  They, in conjunction with the
+ * <library>_version.map file for a given library allow for multiple versions of
+ * a symbol to exist in a shared library so that older binaries need not be
+ * immediately recompiled. Their use is outlined in the following example:
+ * Assumptions: DPDK 1.(X) contains a function int foo(char *string)
+ *              DPDK 1.(X+1) needs to change foo to be int foo(int index)
+ *
+ * To accomplish this:
+ * 1) Edit lib/<library>/library_version.map to add a DPDK_1.(X+1) node, in which
+ * foo is exported as a global symbol.
+ *
+ * 2) rename the existing function int foo(char *string) to 
+ * 	int __vsym foo_v18(char *string)
+ *
+ * 3) Add this macro immediately below the function
+ * 	VERSION_SYMBOL(foo, _v18, 1.8);
+ *
+ * 4) Implement a new version of foo.
+ * 	char foo(int value, int otherval) { ...}
+ *
+ * 5) Mark the newest version as the default version
+ * 	BIND_DEFAULT_SYMBOL(foo, 1.9);
+ *
+ */
+
+/* 
+ * Macro Parameters:
+ * b - function base name
+ * e - function version extension, to be concatenated with base name
+ * n - function symbol version string to be applied
+ */
+
+/*
+ * VERSION_SYMBOL
+ * Creates a symbol version table entry binding symbol <b>@DPDK_<n> to the internal
+ * function name <b>_<e>
+ */ 
+#define VERSION_SYMBOL(b, e, n) __asm__(".symver " RTE_STR(b) RTE_STR(e) ", "RTE_STR(b)"@DPDK_"RTE_STR(n))
+
+/*
+ * BASE_SYMBOL
+ * Creates a symbol version table entry binding unversioned symbol <b> 
+ * to the internal function <b>_<e>
+ */ 
+#define BASE_SYMBOL(b, e) __asm__(".symver " RTE_STR(b) RTE_STR(e) ", "RTE_STR(b)"@")
+
+/*
+ * BNID_DEFAULT_SYMBOL
+ * Creates a symbol version entry instructing the linker to bind references to
+ * symbol <b> to the internal symbol <b>_<e>
+ */
+#define BIND_DEFAULT_SYMBOL(b, e, n) __asm__(".symver " RTE_STR(b) RTE_STR(e) ", "RTE_STR(b)"@@DPDK_"RTE_STR(n))
+#define __vsym __attribute__((used))
+
+#else
+/*
+ * No symbol versioning in use
+ */
+#define VERSION_SYMBOL(b, e, v)
+#define __vsym
+#define BASE_SYMBOL(b, n)
+#define BIND_DEFAULT_SYMBOL(b, v)
+
+/*
+ * RTE_BUILD_SHARED_LIB=n
+ */
+#endif
+
+
+#endif /* _RTE_COMPAT_H_ */
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 81bf8e1..1d3b646 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -40,8 +40,12 @@ VPATH += $(SRCDIR)
 
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 LIB := $(patsubst %.a,%.so,$(LIB))
+
+CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
+
 endif
 
+
 _BUILD = $(LIB)
 _INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) $(RTE_OUTPUT)/lib/$(LIB)
 _CLEAN = doclean
-- 
2.1.0

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v3 4/4] docs: Add ABI documentation
  2015-01-14 20:07  7%       ` Neil Horman
@ 2015-01-16 13:34  7%         ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-01-16 13:34 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

2015-01-14 15:07, Neil Horman:
> On Wed, Jan 14, 2015 at 04:59:51PM +0100, Thomas Monjalon wrote:
> > 2014-12-23 10:51, Neil Horman:
> > > Adding a document describing rudimentary ABI policy and adding notice space for
> > > any deprecation announcements
> > 
> > We had a good discussion about the policy and its impact:
> > 	http://thread.gmane.org/gmane.comp.networking.dpdk.devel/8367/focus=8461
> > Sadly nobody else discussed it.
> > I think we should integrate some of the conclusions in this documentation.
> > 
> I'm certainly open to that.  However, I felt like that conversation centered
> more around the debate for the need for ABI versioning, not the mechanics
> thereof.  Are there specific sections of that conversation that you are looking
> to incorporate, or specific topics?

Yes.
In the point number 2, you suggest to skip ABI compatibility (after a
deprecation schedule) for big changes.
In the point 3, you suggest to add new fields at the end of the structure,
even if it's asthetic, with exceptions if performance impact.

Thank you
-- 
Thomas

^ permalink raw reply	[relevance 7%]

* [dpdk-dev] [PATCH v4 4/4] docs: Add ABI documentation
  2015-01-15 19:35  3% ` [dpdk-dev] [PATCH v4 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
  2015-01-15 19:35  7%   ` [dpdk-dev] [PATCH v4 3/4] Add library version extenstion Neil Horman
@ 2015-01-15 19:35 23%   ` Neil Horman
  2015-01-30 17:13  3%   ` [dpdk-dev] [PATCH v4 1/4] compat: Add infrastructure to support symbol versioning Gray, Mark D
  2 siblings, 0 replies; 200+ results
From: Neil Horman @ 2015-01-15 19:35 UTC (permalink / raw)
  To: dev

Adding a document describing rudimentary ABI policy and adding notice space for
any deprecation announcements

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
---
 doc/abi.txt | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)
 create mode 100644 doc/abi.txt

diff --git a/doc/abi.txt b/doc/abi.txt
new file mode 100644
index 0000000..b6dcc7d
--- /dev/null
+++ b/doc/abi.txt
@@ -0,0 +1,17 @@
+ABI policy:
+	ABI versions are set at the time of major release labeling, and ABI may
+change multiple times between the last labeling and the HEAD label of the git
+tree without warning
+
+	ABI versions, once released are available until such time as their
+deprecation has been noted here for at least one major release cycle, after it
+has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
+remove it is made during the development of DPDK 1.9.  The decision will be
+recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
+1.10 ships.
+
+	ABI versions may be deprecated in whole, or in part as needed by a given
+update.
+
+Deprecation Notices:
+
-- 
2.1.0

^ permalink raw reply	[relevance 23%]

* [dpdk-dev] [PATCH v4 3/4] Add library version extenstion
  2015-01-15 19:35  3% ` [dpdk-dev] [PATCH v4 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
@ 2015-01-15 19:35  7%   ` Neil Horman
  2015-01-15 19:35 23%   ` [dpdk-dev] [PATCH v4 4/4] docs: Add ABI documentation Neil Horman
  2015-01-30 17:13  3%   ` [dpdk-dev] [PATCH v4 1/4] compat: Add infrastructure to support symbol versioning Gray, Mark D
  2 siblings, 0 replies; 200+ results
From: Neil Horman @ 2015-01-15 19:35 UTC (permalink / raw)
  To: dev

To differentiate libraries that break ABI, we add a library version number
suffix to the library, which must be incremented when a given libraries ABI is
broken.  This patch enforces that addition, sets the initial abi soname
extension to 1 for each library and creates a symlink to the base SONAME so that
the test applications will link properly.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>

---
Change Notes:
v3)
	Made symlinking of libraries conditional on a DSO build

v4)	Removed erroneous newline
	changed @exit 1 to @false
	changed ./$(LIB) to $<
---
 lib/librte_acl/Makefile              |  2 ++
 lib/librte_cfgfile/Makefile          |  2 ++
 lib/librte_cmdline/Makefile          |  2 ++
 lib/librte_compat/Makefile           |  2 ++
 lib/librte_distributor/Makefile      |  2 ++
 lib/librte_eal/bsdapp/eal/Makefile   |  2 ++
 lib/librte_eal/linuxapp/eal/Makefile |  2 ++
 lib/librte_ether/Makefile            |  2 ++
 lib/librte_hash/Makefile             |  2 ++
 lib/librte_ip_frag/Makefile          |  2 ++
 lib/librte_ivshmem/Makefile          |  2 ++
 lib/librte_kni/Makefile              |  2 ++
 lib/librte_kvargs/Makefile           |  2 ++
 lib/librte_lpm/Makefile              |  2 ++
 lib/librte_malloc/Makefile           |  2 ++
 lib/librte_mbuf/Makefile             |  2 ++
 lib/librte_mempool/Makefile          |  2 ++
 lib/librte_meter/Makefile            |  2 ++
 lib/librte_pipeline/Makefile         |  2 ++
 lib/librte_pmd_af_packet/Makefile    |  2 ++
 lib/librte_pmd_bond/Makefile         |  2 ++
 lib/librte_pmd_e1000/Makefile        |  2 ++
 lib/librte_pmd_enic/Makefile         |  2 ++
 lib/librte_pmd_i40e/Makefile         |  2 ++
 lib/librte_pmd_ixgbe/Makefile        |  2 ++
 lib/librte_pmd_pcap/Makefile         |  2 ++
 lib/librte_pmd_ring/Makefile         |  2 ++
 lib/librte_pmd_virtio/Makefile       |  2 ++
 lib/librte_pmd_vmxnet3/Makefile      |  2 ++
 lib/librte_pmd_xenvirt/Makefile      |  2 ++
 lib/librte_port/Makefile             |  2 ++
 lib/librte_power/Makefile            |  2 ++
 lib/librte_ring/Makefile             |  2 ++
 lib/librte_sched/Makefile            |  2 ++
 lib/librte_table/Makefile            |  2 ++
 lib/librte_timer/Makefile            |  2 ++
 lib/librte_vhost/Makefile            |  2 ++
 mk/rte.lib.mk                        | 12 ++++++++++--
 38 files changed, 84 insertions(+), 2 deletions(-)

diff --git a/lib/librte_acl/Makefile b/lib/librte_acl/Makefile
index 45cbf80..765deb1 100644
--- a/lib/librte_acl/Makefile
+++ b/lib/librte_acl/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_acl_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_ACL) += tb_mem.c
 
diff --git a/lib/librte_cfgfile/Makefile b/lib/librte_cfgfile/Makefile
index a4f73de..032c240 100644
--- a/lib/librte_cfgfile/Makefile
+++ b/lib/librte_cfgfile/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_cfgfile_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_cmdline/Makefile b/lib/librte_cmdline/Makefile
index 3c71831..719dff6 100644
--- a/lib/librte_cmdline/Makefile
+++ b/lib/librte_cmdline/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_cmdline_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) := cmdline.c
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_cirbuf.c
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
index 0bab870..0c57533 100644
--- a/lib/librte_compat/Makefile
+++ b/lib/librte_compat/Makefile
@@ -32,6 +32,8 @@
 include $(RTE_SDK)/mk/rte.vars.mk
 
 
+LIBABIVER := 1
+
 # install includes
 SYMLINK-y-include := rte_compat.h
 
diff --git a/lib/librte_distributor/Makefile b/lib/librte_distributor/Makefile
index 3674a2c..4c9af17 100644
--- a/lib/librte_distributor/Makefile
+++ b/lib/librte_distributor/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_distributor_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor.c
 
diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index 0b5f9d9..ae214a4 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -48,6 +48,8 @@ CFLAGS += $(WERROR_FLAGS) -O3
 
 EXPORT_MAP := rte_eal_version.map
 
+LIBABIVER := 1
+
 # specific to linuxapp exec-env
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) := eal.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_memory.c
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index bae8af1..e117cec 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -35,6 +35,8 @@ LIB = librte_eal.a
 
 EXPORT_MAP := rte_eal_version.map
 
+LIBABIVER := 1
+
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
 CFLAGS += -I$(SRCDIR)/include
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index 80ad78d..c0e5768 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_ether_version.map
 
+LIBABIVER := 1
+
 SRCS-y += rte_ethdev.c
 
 #
diff --git a/lib/librte_hash/Makefile b/lib/librte_hash/Makefile
index bec61ab..3696cb1 100644
--- a/lib/librte_hash/Makefile
+++ b/lib/librte_hash/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_hash_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) := rte_hash.c
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) += rte_fbk_hash.c
diff --git a/lib/librte_ip_frag/Makefile b/lib/librte_ip_frag/Makefile
index aa88578..fe926f7 100644
--- a/lib/librte_ip_frag/Makefile
+++ b/lib/librte_ip_frag/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_ipfrag_version.map
 
+LIBABIVER := 1
+
 #source files
 ifeq ($(CONFIG_RTE_MBUF_REFCNT),y)
 SRCS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += rte_ipv4_fragmentation.c
diff --git a/lib/librte_ivshmem/Makefile b/lib/librte_ivshmem/Makefile
index 068ee10..16defdb 100644
--- a/lib/librte_ivshmem/Makefile
+++ b/lib/librte_ivshmem/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_ivshmem_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_IVSHMEM) := rte_ivshmem.c
 
diff --git a/lib/librte_kni/Makefile b/lib/librte_kni/Makefile
index 93a516d..7107832 100644
--- a/lib/librte_kni/Makefile
+++ b/lib/librte_kni/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := rte_kni_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KNI) := rte_kni.c
 
diff --git a/lib/librte_kvargs/Makefile b/lib/librte_kvargs/Makefile
index b1c34f3..87b09f2 100644
--- a/lib/librte_kvargs/Makefile
+++ b/lib/librte_kvargs/Makefile
@@ -40,6 +40,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_kvargs_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KVARGS) := rte_kvargs.c
 
diff --git a/lib/librte_lpm/Makefile b/lib/librte_lpm/Makefile
index 8214630..35e6389 100644
--- a/lib/librte_lpm/Makefile
+++ b/lib/librte_lpm/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_lpm_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_LPM) := rte_lpm.c rte_lpm6.c
 
diff --git a/lib/librte_malloc/Makefile b/lib/librte_malloc/Makefile
index 15b7eed..947e41c 100644
--- a/lib/librte_malloc/Makefile
+++ b/lib/librte_malloc/Makefile
@@ -34,6 +34,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_malloc.a
 
+LIBABIVER := 1
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_malloc_version.map
diff --git a/lib/librte_mbuf/Makefile b/lib/librte_mbuf/Makefile
index 03becae..080f3cf 100644
--- a/lib/librte_mbuf/Makefile
+++ b/lib/librte_mbuf/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_mbuf_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MBUF) := rte_mbuf.c
 
diff --git a/lib/librte_mempool/Makefile b/lib/librte_mempool/Makefile
index 31d1a71..940d1f7 100644
--- a/lib/librte_mempool/Makefile
+++ b/lib/librte_mempool/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_mempool_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) +=  rte_mempool.c
 ifeq ($(CONFIG_RTE_LIBRTE_XEN_DOM0),y)
diff --git a/lib/librte_meter/Makefile b/lib/librte_meter/Makefile
index c4a7a32..8765881 100644
--- a/lib/librte_meter/Makefile
+++ b/lib/librte_meter/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_meter_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pipeline/Makefile b/lib/librte_pipeline/Makefile
index 15b58df..15e406b 100644
--- a/lib/librte_pipeline/Makefile
+++ b/lib/librte_pipeline/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pipeline_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_af_packet/Makefile b/lib/librte_pmd_af_packet/Makefile
index 85a7860..f0bf537 100644
--- a/lib/librte_pmd_af_packet/Makefile
+++ b/lib/librte_pmd_af_packet/Makefile
@@ -40,6 +40,8 @@ LIB = librte_pmd_af_packet.a
 
 EXPORT_MAP := rte_pmd_af_packet_version.map
 
+LIBABIVER := 1
+
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
diff --git a/lib/librte_pmd_bond/Makefile b/lib/librte_pmd_bond/Makefile
index 074110a..d6c81a8 100644
--- a/lib/librte_pmd_bond/Makefile
+++ b/lib/librte_pmd_bond/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_bond_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_e1000/Makefile b/lib/librte_pmd_e1000/Makefile
index cd14444..8c8fed8 100644
--- a/lib/librte_pmd_e1000/Makefile
+++ b/lib/librte_pmd_e1000/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_e1000_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_enic/Makefile b/lib/librte_pmd_enic/Makefile
index 697231c..251a898 100644
--- a/lib/librte_pmd_enic/Makefile
+++ b/lib/librte_pmd_enic/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_enic.a
 
 EXPORT_MAP := rte_pmd_enic_version.map
 
+LIBABIVER := 1
+
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/vnic/
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/
 CFLAGS += -O3
diff --git a/lib/librte_pmd_i40e/Makefile b/lib/librte_pmd_i40e/Makefile
index 73de373..9a0eec8 100644
--- a/lib/librte_pmd_i40e/Makefile
+++ b/lib/librte_pmd_i40e/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_i40e_version.map
 
+LIBABIVER := 1
+
 #
 # Add extra flags for base driver files (also known as shared code)
 # to disable warnings
diff --git a/lib/librte_pmd_ixgbe/Makefile b/lib/librte_pmd_ixgbe/Makefile
index e0a17f6..d580f62 100644
--- a/lib/librte_pmd_ixgbe/Makefile
+++ b/lib/librte_pmd_ixgbe/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_ixgbe_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_pcap/Makefile b/lib/librte_pmd_pcap/Makefile
index cb6678e..0775dbc 100644
--- a/lib/librte_pmd_pcap/Makefile
+++ b/lib/librte_pmd_pcap/Makefile
@@ -42,6 +42,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_pcap_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_ring/Makefile b/lib/librte_pmd_ring/Makefile
index aa1b461..e442d0b 100644
--- a/lib/librte_pmd_ring/Makefile
+++ b/lib/librte_pmd_ring/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_ring_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_virtio/Makefile b/lib/librte_pmd_virtio/Makefile
index d979c59..793067f 100644
--- a/lib/librte_pmd_virtio/Makefile
+++ b/lib/librte_pmd_virtio/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_virtio_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_vmxnet3/Makefile b/lib/librte_pmd_vmxnet3/Makefile
index f3ab178..93e5580 100644
--- a/lib/librte_pmd_vmxnet3/Makefile
+++ b/lib/librte_pmd_vmxnet3/Makefile
@@ -68,6 +68,8 @@ VPATH += $(RTE_SDK)/lib/librte_pmd_vmxnet3/vmxnet3
 
 EXPORT_MAP := rte_pmd_vmxnet3_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_xenvirt/Makefile b/lib/librte_pmd_xenvirt/Makefile
index 4510603..f0c796c 100644
--- a/lib/librte_pmd_xenvirt/Makefile
+++ b/lib/librte_pmd_xenvirt/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_xenvirt_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_port/Makefile b/lib/librte_port/Makefile
index 266ed39..0e38452 100644
--- a/lib/librte_port/Makefile
+++ b/lib/librte_port/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_port_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_power/Makefile b/lib/librte_power/Makefile
index 0547dcd..cee95cd 100644
--- a/lib/librte_power/Makefile
+++ b/lib/librte_power/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := rte_power_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) := rte_power.c rte_power_acpi_cpufreq.c
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) += rte_power_kvm_vm.c guest_channel.c
diff --git a/lib/librte_ring/Makefile b/lib/librte_ring/Makefile
index b437dc5..84ad3d3 100644
--- a/lib/librte_ring/Makefile
+++ b/lib/librte_ring/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_ring_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_RING) := rte_ring.c
 
diff --git a/lib/librte_sched/Makefile b/lib/librte_sched/Makefile
index 48f280a..b1cb285 100644
--- a/lib/librte_sched/Makefile
+++ b/lib/librte_sched/Makefile
@@ -43,6 +43,8 @@ CFLAGS_rte_red.o := -D_GNU_SOURCE
 
 EXPORT_MAP := rte_sched_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_table/Makefile b/lib/librte_table/Makefile
index 4e1a54a..0d8394c 100644
--- a/lib/librte_table/Makefile
+++ b/lib/librte_table/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_table_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_timer/Makefile b/lib/librte_timer/Makefile
index 9fb6079..2aabef8 100644
--- a/lib/librte_timer/Makefile
+++ b/lib/librte_timer/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_timer_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_TIMER) := rte_timer.c
 
diff --git a/lib/librte_vhost/Makefile b/lib/librte_vhost/Makefile
index 96a7dd0..369c25a 100644
--- a/lib/librte_vhost/Makefile
+++ b/lib/librte_vhost/Makefile
@@ -36,6 +36,8 @@ LIB = librte_vhost.a
 
 EXPORT_MAP := rte_vhost_version.map
 
+LIBABIVER := 1
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -D_FILE_OFFSET_BITS=64 -lfuse
 LDFLAGS += -lfuse
 # all source are stored in SRCS-y
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 1d3b646..865a307 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -37,10 +37,9 @@ include $(RTE_SDK)/mk/internal/rte.depdirs-pre.mk
 
 # VPATH contains at least SRCDIR
 VPATH += $(SRCDIR)
-
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
-LIB := $(patsubst %.a,%.so,$(LIB))
 
+LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB))
 CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
 
 endif
@@ -113,6 +112,10 @@ lib_dir = [ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib;
 #
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
+ifeq ($(LIBABIVER),)
+	@echo "Must Specify a $(LIB) ABI version"
+	@false
+endif
 	@[ -d $(dir $@) ] || mkdir -p $(dir $@)
 	$(if $(D),\
 		@echo -n "$< -> $@ " ; \
@@ -126,6 +129,7 @@ $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
 		$(depfile_missing),\
 		$(depfile_newer)),\
 		$(O_TO_S_DO))
+
 ifeq ($(RTE_BUILD_COMBINE_LIBS),y)
 	$(if $(or \
         $(file_missing),\
@@ -163,9 +167,13 @@ endif
 # install lib in $(RTE_OUTPUT)/lib
 #
 $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
+	$(eval LIBSONAME := $(basename $(LIB)))
 	@echo "  INSTALL-LIB $(LIB)"
 	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
 	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
+ifeq ($(RTE_BUILD_SHARED_LIB),y)
+	$(Q)ln -s -f $< $(RTE_OUTPUT)/lib/$(LIBSONAME)
+endif
 
 #
 # Clean all generated files
-- 
2.1.0

^ permalink raw reply	[relevance 7%]

* [dpdk-dev] [PATCH v4 1/4] compat: Add infrastructure to support symbol versioning
  2014-12-20 21:01  4% [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
                   ` (5 preceding siblings ...)
  2015-01-09 12:35  0% ` [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
@ 2015-01-15 19:35  3% ` Neil Horman
  2015-01-15 19:35  7%   ` [dpdk-dev] [PATCH v4 3/4] Add library version extenstion Neil Horman
                     ` (2 more replies)
  2015-01-16 15:33  3% ` [dpdk-dev] [PATCH v5 " Neil Horman
                   ` (5 subsequent siblings)
  12 siblings, 3 replies; 200+ results
From: Neil Horman @ 2015-01-15 19:35 UTC (permalink / raw)
  To: dev

Add initial pass header files to support symbol versioning.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
CC: "Gonzalez Monroy, Sergio" <sergio.gonzalez.monroy@intel.com>

---
Change Notes:
V2)
	Moved ifeq to _INSTALL target

V3)
	Undo V2 changes and make librte_compat use the rte.install.mk file
instead

v4)
	changed --version-script to accept SRCDIR in this patch at per request
	documented versioning macros
	cleaned up macro parameter consistency
	converted SA macro to RTE_STR macro
	fixed copyright
---
 lib/Makefile                   |   1 +
 lib/librte_compat/Makefile     |  38 +++++++++++++
 lib/librte_compat/rte_compat.h | 117 +++++++++++++++++++++++++++++++++++++++++
 mk/rte.lib.mk                  |   4 ++
 4 files changed, 160 insertions(+)
 create mode 100644 lib/librte_compat/Makefile
 create mode 100644 lib/librte_compat/rte_compat.h

diff --git a/lib/Makefile b/lib/Makefile
index 0ffc982..d617d81 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -31,6 +31,7 @@
 
 include $(RTE_SDK)/mk/rte.vars.mk
 
+DIRS-y += librte_compat
 DIRS-$(CONFIG_RTE_LIBRTE_EAL) += librte_eal
 DIRS-$(CONFIG_RTE_LIBRTE_MALLOC) += librte_malloc
 DIRS-$(CONFIG_RTE_LIBRTE_RING) += librte_ring
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
new file mode 100644
index 0000000..0bab870
--- /dev/null
+++ b/lib/librte_compat/Makefile
@@ -0,0 +1,38 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2013 Neil Horman <nhorman@tuxdriver.com>
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+
+# install includes
+SYMLINK-y-include := rte_compat.h
+
+include $(RTE_SDK)/mk/rte.install.mk
diff --git a/lib/librte_compat/rte_compat.h b/lib/librte_compat/rte_compat.h
new file mode 100644
index 0000000..d7cc176
--- /dev/null
+++ b/lib/librte_compat/rte_compat.h
@@ -0,0 +1,117 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2010 Neil Horman <nhorman@tuxdriver.com>.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _RTE_COMPAT_H_
+#define _RTE_COMPAT_H_
+#include <rte_common.h>
+
+#ifdef RTE_BUILD_SHARED_LIB
+
+/*
+ * Provides backwards compatibility when updating exported functions.
+ * When a symol is exported from a library to provide an API, it also provides a
+ * calling convention (ABI) that is embodied in its name, return type,
+ * arguments, etc.  On occasion that function may need to change to accomodate
+ * new functionality, behavior, etc.  When that occurs, it is desireable to
+ * allow for backwards compatibility for a time with older binaries that are
+ * dynamically linked to the dpdk.  To support that, the __vsym and
+ * VERSION_SYMBOL macros are created.  They, in conjunction with the
+ * <library>_version.map file for a given library allow for multiple versions of
+ * a symbol to exist in a shared library so that older binaries need not be
+ * immediately recompiled. Their use is outlined in the following example:
+ * Assumptions: DPDK 1.(X) contains a function int foo(char *string)
+ *              DPDK 1.(X+1) needs to change foo to be int foo(int index)
+ *
+ * To accomplish this:
+ * 1) Edit lib/<library>/library_version.map to add a DPDK_1.(X+1) node, in which
+ * foo is exported as a global symbol.
+ *
+ * 2) rename the existing function int foo(char *string) to 
+ * 	int __vsym foo_v18(char *string)
+ *
+ * 3) Add this macro immediately below the function
+ * 	VERSION_SYMBOL(foo, _v18, 1.8);
+ *
+ * 4) Implement a new version of foo.
+ * 	char foo(int value, int otherval) { ...}
+ *
+ * 5) Mark the newest version as the default version
+ * 	BIND_DEFAULT_SYMBOL(foo, 1.9);
+ *
+ */
+
+/* 
+ * Macro Parameters:
+ * b - function base name
+ * e - function version extension, to be concatenated with base name
+ * n - function symbol version string to be applied
+ */
+
+/*
+ * VERSION_SYMBOL
+ * Creates a symbol version table entry binding symbol <b>@DPDK_<n> to the internal
+ * function name <b>_<e>
+ */ 
+#define VERSION_SYMBOL(b, e, n) __asm__(".symver " RTE_STR(b) RTE_STR(e) ", "RTE_STR(b)"@DPDK_"RTE_STR(n))
+
+/*
+ * BASE_SYMBOL
+ * Creates a symbol version table entry binding unversioned symbol <b> 
+ * to the internal function <b>_<e>
+ */ 
+#define BASE_SYMBOL(b, e) __asm__(".symver " RTE_STR(b) RTE_STR(e) ", "RTE_STR(b)"@")
+
+/*
+ * BNID_DEFAULT_SYMBOL
+ * Creates a symbol version entry instructing the linker to bind references to
+ * symbol <b> to the internal symbol <b>_<e>
+ */
+#define BIND_DEFAULT_SYMBOL(b, e, n) __asm__(".symver " RTE_STR(b) RTE_STR(e) ", "RTE_STR(b)"@@DPDK_"RTE_STR(n))
+#define __vsym __attribute__((used))
+
+#else
+/*
+ * No symbol versioning in use
+ */
+#define VERSION_SYMBOL(b, e, v)
+#define __vsym
+#define BASE_SYMBOL(b, n)
+#define BIND_DEFAULT_SYMBOL(b, v)
+
+/*
+ * RTE_BUILD_SHARED_LIB=n
+ */
+#endif
+
+
+#endif /* _RTE_COMPAT_H_ */
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 81bf8e1..1d3b646 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -40,8 +40,12 @@ VPATH += $(SRCDIR)
 
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 LIB := $(patsubst %.a,%.so,$(LIB))
+
+CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
+
 endif
 
+
 _BUILD = $(LIB)
 _INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) $(RTE_OUTPUT)/lib/$(LIB)
 _CLEAN = doclean
-- 
2.1.0

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v3 1/4] compat: Add infrastructure to support symbol versioning
  2015-01-14 15:25  0%   ` [dpdk-dev] [PATCH v3 1/4] compat: Add infrastructure to support symbol versioning Thomas Monjalon
@ 2015-01-14 20:29  0%     ` Neil Horman
  0 siblings, 0 replies; 200+ results
From: Neil Horman @ 2015-01-14 20:29 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Wed, Jan 14, 2015 at 04:25:19PM +0100, Thomas Monjalon wrote:
> Hi Neil,
> 
> 2014-12-23 10:51, Neil Horman:
> > Add initial pass header files to support symbol versioning.
> 
> [...]
> 
> > +#   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>
> 
> Why these dates?
> 
Because I copied the Makefile from librte_acl, and modified the name but not the
dates.

> > +#   All rights reserved.
> 
> I think this line is not required anymore:
> 	http://en.wikipedia.org/wiki/All_rights_reserved
> 
Hmm, apparently so.  However, since it exists in every other copyright notice in
the tree, I'd just as soon keep this language consistent, and make a tree wide
change in a separate patch if the consensus is to do so.

> [...]
> 
> > +#ifndef _RTE_COMPAT_H_
> > +#define _RTE_COMPAT_H_
> 
> Why using underscores?
> I think it's reserved:
> 	http://en.wikipedia.org/wiki/Include_guard#Use_of_.23include_guards
> 
Its reserved for the implementation, and must not be used by a user using the
header file.  Its ok, and is common practice.  See every other symlinked header
file in the DPDK.

> > +#define SA(x) #x
> 
> It should be prefixed. But it's better to use RTE_STR.
> 
very well

> > +#ifdef RTE_BUILD_SHARED_LIB
> > +
> > +/*
> > + * Provides backwards compatibility when updating exported functions.
> > + * When a symol is exported from a library to provide an API, it also provides a
> > + * calling convention (ABI) that is embodied in its name, return type,
> > + * arguments, etc.  On occasion that function may need to change to accomodate
> > + * new functionality, behavior, etc.  When that occurs, it is desireable to
> > + * allow for backwards compatibility for a time with older binaries that are
> > + * dynamically linked to the dpdk.  to support that the __vsym and
> 
> Should be "To support that," with uppercase and comma.
> 
yup

> > + * VERSION_SYMBOL macros are created.  They, in conjunction with the
> > + * <library>_version.map file for a given library allow for multiple versions of
> > + * a symbol to exist in a shared library so that older binaries need not be
> > + * immediately recompiled. Their use is outlined in the following example:
> > + * Assumptions: DPDK 1.(X) contains a function int foo(char *string)
> > + *              DPDK 1.(X+1) needs to change foo to be int foo(int index)
> > + *
> > + * To accomplish this:
> > + * 1) Edit lib/<library>/library_version.map to add a DPDK_1.(X+1) node, in which
> > + * foo is exported as a global symbol.
> > + *
> > + * 2) rename the existing function int foo(char *string) to 
> > + * 	int __vsym foo_v18(char *string)
> > + *
> > + * 3) Add this macro immediately below the function
> > + * 	VERSION_SYMBOL(foo, _v18, 1.8);
> > + *
> > + * 4) Implement a new version of foo.
> > + * 	char foo(int value, int otherval) { ...}
> > + *
> > + * 5) Mark the newest version as the default version
> > + * 	BIND_DEFAULT_SYMBOL(foo, 1.9);
> > + *
> > + */
> 
> Thanks for this good tutorial.
> 
> > +#define VERSION_SYMBOL(b, e, v) __asm__(".symver " SA(b) SA(e) ", "SA(b)"@DPDK_"SA(v))
> > +#define BASE_SYMBOL(b, n) __asm__(".symver " SA(n) ", "SA(b)"@")
> > +#define BIND_DEFAULT_SYMBOL(b, v) __asm__(".symver " SA(b) ", "SA(b)"@@DPDK_"SA(v))
> > +#define __vsym __attribute__((used))
> 
> OK. It would be simpler to read if b, e, v and n were formally defined in a comment.
> 
> > +#else
> [...]
> > +/*
> > + * RTE_BUILD_SHARED_LIB
> > + */
> 
> This type of comment is strange. It makes me think that we are in the case
> RTE_BUILD_SHARED_LIB=y
> 
> > +#endif
> 
> [...]
> 
> > +
> > +CPU_LDFLAGS += --version-script=$(EXPORT_MAP)
> 
> Why this variable name? VERSION_SCRIPT or VERSION_MAP seems more appropriate.
> 
> > +
> >  endif
> >  
> > +
> 
> Why this newline?
> 
> >  _BUILD = $(LIB)
> 
> -- 
> Thomas
> 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v3 4/4] docs: Add ABI documentation
  2015-01-14 15:59  4%     ` Thomas Monjalon
@ 2015-01-14 20:07  7%       ` Neil Horman
  2015-01-16 13:34  7%         ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Neil Horman @ 2015-01-14 20:07 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Wed, Jan 14, 2015 at 04:59:51PM +0100, Thomas Monjalon wrote:
> 2014-12-23 10:51, Neil Horman:
> > Adding a document describing rudimentary ABI policy and adding notice space for
> > any deprecation announcements
> 
> We had a good discussion about the policy and its impact:
> 	http://thread.gmane.org/gmane.comp.networking.dpdk.devel/8367/focus=8461
> Sadly nobody else discussed it.
> I think we should integrate some of the conclusions in this documentation.
> 
I'm certainly open to that.  However, I felt like that conversation centered
more around the debate for the need for ABI versioning, not the mechanics
thereof.  Are there specific sections of that conversation that you are looking
to incorporate, or specific topics?

> > --- /dev/null
> > +++ b/doc/abi.txt
> > @@ -0,0 +1,17 @@
> > +ABI policy:
> > +	ABI versions are set at the time of major release labeling, and ABI may
> > +change multiple times between the last labeling and the HEAD label of the git
> > +tree without warning
> > +
> > +	ABI versions, once released are available until such time as their
> > +deprecation has been noted here for at least one major release cycle, after it
> > +has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
> > +remove it is made during the development of DPDK 1.9.  The decision will be
> > +recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
> > +1.10 ships.
> > +
> > +	ABI versions may be deprecated in whole, or in part as needed by a given
> > +update.
> > +
> > +Deprecation Notices:
> > +
> 
> You could upgrade your example to 2.0/2.1.
> 
Sure, though I think doing so is rather arbitrary, as its going to be
immediately dated as soon as version 2.1 releases.  But I can do that if you
like when we square up the documentation question above
Neil

> Thanks
> -- 
> Thomas
> 

^ permalink raw reply	[relevance 7%]

* Re: [dpdk-dev] [PATCH v3 4/4] docs: Add ABI documentation
  2014-12-23 15:51 23%   ` [dpdk-dev] [PATCH v3 4/4] docs: Add ABI documentation Neil Horman
  2014-12-29 16:24  4%     ` Sergio Gonzalez Monroy
@ 2015-01-14 15:59  4%     ` Thomas Monjalon
  2015-01-14 20:07  7%       ` Neil Horman
  1 sibling, 1 reply; 200+ results
From: Thomas Monjalon @ 2015-01-14 15:59 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

2014-12-23 10:51, Neil Horman:
> Adding a document describing rudimentary ABI policy and adding notice space for
> any deprecation announcements

We had a good discussion about the policy and its impact:
	http://thread.gmane.org/gmane.comp.networking.dpdk.devel/8367/focus=8461
Sadly nobody else discussed it.
I think we should integrate some of the conclusions in this documentation.

> --- /dev/null
> +++ b/doc/abi.txt
> @@ -0,0 +1,17 @@
> +ABI policy:
> +	ABI versions are set at the time of major release labeling, and ABI may
> +change multiple times between the last labeling and the HEAD label of the git
> +tree without warning
> +
> +	ABI versions, once released are available until such time as their
> +deprecation has been noted here for at least one major release cycle, after it
> +has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
> +remove it is made during the development of DPDK 1.9.  The decision will be
> +recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
> +1.10 ships.
> +
> +	ABI versions may be deprecated in whole, or in part as needed by a given
> +update.
> +
> +Deprecation Notices:
> +

You could upgrade your example to 2.0/2.1.

Thanks
-- 
Thomas

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v3 3/4] Add library version extenstion
  2014-12-23 15:51  7%   ` [dpdk-dev] [PATCH v3 3/4] Add library version extenstion Neil Horman
  2014-12-29 16:23  0%     ` Sergio Gonzalez Monroy
@ 2015-01-14 15:48  0%     ` Thomas Monjalon
  1 sibling, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-01-14 15:48 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

2014-12-23 10:51, Neil Horman:
> To differentiate libraries that break ABI, we add a library version number
> suffix to the library, which must be incremented when a given libraries ABI is
> broken.  This patch enforces that addition, sets the initial abi soname
> extension to 1 for each library and creates a symlink to the base SONAME so that
> the test applications will link properly.

[...]

> --- a/mk/rte.lib.mk
> +++ b/mk/rte.lib.mk
> @@ -37,10 +37,9 @@ include $(RTE_SDK)/mk/internal/rte.depdirs-pre.mk
>  
>  # VPATH contains at least SRCDIR
>  VPATH += $(SRCDIR)
> -
>  ifeq ($(RTE_BUILD_SHARED_LIB),y)
> -LIB := $(patsubst %.a,%.so,$(LIB))
>  
> +LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB))
>  CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
>  
>  endif
> @@ -63,6 +62,7 @@ build: _postbuild
>  
>  exe2cmd = $(strip $(call dotfile,$(patsubst %,%.cmd,$(1))))
>  
> +

Newline changes seem weird.

>  ifeq ($(LINK_USING_CC),1)
>  # Override the definition of LD here, since we're linking with CC
>  LD := $(CC) $(CPU_CFLAGS)
> @@ -113,6 +113,10 @@ lib_dir = [ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib;
>  #
>  ifeq ($(RTE_BUILD_SHARED_LIB),y)
>  $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
> +ifeq ($(LIBABIVER),)
> +	@echo "Must Specify a $(LIB) ABI version"
> +	@exit 1

I think (not sure) that @false is better handled than @exit in case of parallel processing.

> +endif
>  	@[ -d $(dir $@) ] || mkdir -p $(dir $@)
>  	$(if $(D),\
>  		@echo -n "$< -> $@ " ; \
> @@ -126,6 +130,7 @@ $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
>  		$(depfile_missing),\
>  		$(depfile_newer)),\
>  		$(O_TO_S_DO))
> +
>  ifeq ($(RTE_BUILD_COMBINE_LIBS),y)
>  	$(if $(or \
>          $(file_missing),\
> @@ -163,9 +168,13 @@ endif
>  # install lib in $(RTE_OUTPUT)/lib
>  #
>  $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
> +	$(eval LIBSONAME := $(basename $(LIB)))
>  	@echo "  INSTALL-LIB $(LIB)"
>  	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
>  	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
> +ifeq ($(RTE_BUILD_SHARED_LIB),y)
> +	$(Q)ln -s -f ./$(LIB) $(RTE_OUTPUT)/lib/$(LIBSONAME)
> +endif

Why using ./ ?
Why using the eval trick for $(LIBSONAME) instead of $(basename $(LIB)) ?
Even better, you could use $< instead of $(LIB), matter of taste.

-- 
Thomas

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v3 1/4] compat: Add infrastructure to support symbol versioning
  2014-12-23 15:51  4% ` [dpdk-dev] [PATCH v3 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
  2014-12-23 15:51  7%   ` [dpdk-dev] [PATCH v3 3/4] Add library version extenstion Neil Horman
  2014-12-23 15:51 23%   ` [dpdk-dev] [PATCH v3 4/4] docs: Add ABI documentation Neil Horman
@ 2015-01-14 15:25  0%   ` Thomas Monjalon
  2015-01-14 20:29  0%     ` Neil Horman
  2 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2015-01-14 15:25 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

Hi Neil,

2014-12-23 10:51, Neil Horman:
> Add initial pass header files to support symbol versioning.

[...]

> +#   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>

Why these dates?

> +#   All rights reserved.

I think this line is not required anymore:
	http://en.wikipedia.org/wiki/All_rights_reserved

[...]

> +#ifndef _RTE_COMPAT_H_
> +#define _RTE_COMPAT_H_

Why using underscores?
I think it's reserved:
	http://en.wikipedia.org/wiki/Include_guard#Use_of_.23include_guards

> +#define SA(x) #x

It should be prefixed. But it's better to use RTE_STR.

> +#ifdef RTE_BUILD_SHARED_LIB
> +
> +/*
> + * Provides backwards compatibility when updating exported functions.
> + * When a symol is exported from a library to provide an API, it also provides a
> + * calling convention (ABI) that is embodied in its name, return type,
> + * arguments, etc.  On occasion that function may need to change to accomodate
> + * new functionality, behavior, etc.  When that occurs, it is desireable to
> + * allow for backwards compatibility for a time with older binaries that are
> + * dynamically linked to the dpdk.  to support that the __vsym and

Should be "To support that," with uppercase and comma.

> + * VERSION_SYMBOL macros are created.  They, in conjunction with the
> + * <library>_version.map file for a given library allow for multiple versions of
> + * a symbol to exist in a shared library so that older binaries need not be
> + * immediately recompiled. Their use is outlined in the following example:
> + * Assumptions: DPDK 1.(X) contains a function int foo(char *string)
> + *              DPDK 1.(X+1) needs to change foo to be int foo(int index)
> + *
> + * To accomplish this:
> + * 1) Edit lib/<library>/library_version.map to add a DPDK_1.(X+1) node, in which
> + * foo is exported as a global symbol.
> + *
> + * 2) rename the existing function int foo(char *string) to 
> + * 	int __vsym foo_v18(char *string)
> + *
> + * 3) Add this macro immediately below the function
> + * 	VERSION_SYMBOL(foo, _v18, 1.8);
> + *
> + * 4) Implement a new version of foo.
> + * 	char foo(int value, int otherval) { ...}
> + *
> + * 5) Mark the newest version as the default version
> + * 	BIND_DEFAULT_SYMBOL(foo, 1.9);
> + *
> + */

Thanks for this good tutorial.

> +#define VERSION_SYMBOL(b, e, v) __asm__(".symver " SA(b) SA(e) ", "SA(b)"@DPDK_"SA(v))
> +#define BASE_SYMBOL(b, n) __asm__(".symver " SA(n) ", "SA(b)"@")
> +#define BIND_DEFAULT_SYMBOL(b, v) __asm__(".symver " SA(b) ", "SA(b)"@@DPDK_"SA(v))
> +#define __vsym __attribute__((used))

OK. It would be simpler to read if b, e, v and n were formally defined in a comment.

> +#else
[...]
> +/*
> + * RTE_BUILD_SHARED_LIB
> + */

This type of comment is strange. It makes me think that we are in the case
RTE_BUILD_SHARED_LIB=y

> +#endif

[...]

> +
> +CPU_LDFLAGS += --version-script=$(EXPORT_MAP)

Why this variable name? VERSION_SCRIPT or VERSION_MAP seems more appropriate.

> +
>  endif
>  
> +

Why this newline?

>  _BUILD = $(LIB)

-- 
Thomas

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility
  2014-12-20 21:01  4% [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
                   ` (4 preceding siblings ...)
  2014-12-23 15:51  4% ` [dpdk-dev] [PATCH v3 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
@ 2015-01-09 12:35  0% ` Neil Horman
  2015-01-15 19:35  3% ` [dpdk-dev] [PATCH v4 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
                   ` (6 subsequent siblings)
  12 siblings, 0 replies; 200+ results
From: Neil Horman @ 2015-01-09 12:35 UTC (permalink / raw)
  To: dev

On Sat, Dec 20, 2014 at 04:01:35PM -0500, Neil Horman wrote:
> GI: [PATCH 1/4] compat: Add infrastructure to support symbol versioninBI
> develops and changes quickly, which makes it difficult for
> applications to keep up with the latest version of the library, especially when
> it (the DPDK) is built as a set of shared objects, as applications may be built
> against an older version of the library.
> 
> To mitigate this, this patch series introduces support for library and symbol
> versioning when the DPDK is built as a DSO.  Specifically, it does 4 things:
> 
> 1) Adds initial support for library versioning.  Each library now has a version
> map that explicitly calls out what symbols are exported to using applications,
> and assigns version(s) to them
> 
> 2) Adds support macros so that when libraries create incompatible ABI's,
> multiple versions may be supported so that applications linked against older
> DPDK releases can continue to function
> 
> 3) Adds library soname versioning suffixes so that when ABI's must be broken in
> a fashion that requires a rebuild of older applications, they will break at load
> time, rather than cause unexpected issues at run time.
> 
> 4) Adds documentation for ABI policy, and provides space to document deprecated
> ABI versions, so that applications might be warned of impending changes.
> 
> With these elements in place the DPDK has some support to allow for the extended
> maintenence of older API's while still allowing the freedom to develop new and
> improved API's.
> 
> Implementing this feature will require some additional effort on the part of
> developers and reviewers.  When reviewing patches, must be checked against
> existing exports to ensure that the function prototypes are not changing.  If
> they are, the versioning macros must be used, and the library export map should
> be updated to reflect the new version of the function.
> 
> When data structures change, if those structures are application accessible,
> apis that accept or return instances of those data structures should have new
> versions created so that users of the old data structure version might co-exist
> at the same time.
> 
> Note it was requested that this series be delayed until DPDK 2.0, so this is a
> repost, now that DPDK 1.8 has been tagged.
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> CC: "Robert Love" <robert.w.love@intel.com>
> 
> 
Ping Thomas....

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v3 4/4] docs: Add ABI documentation
  2014-12-23 15:51 23%   ` [dpdk-dev] [PATCH v3 4/4] docs: Add ABI documentation Neil Horman
@ 2014-12-29 16:24  4%     ` Sergio Gonzalez Monroy
  2015-01-14 15:59  4%     ` Thomas Monjalon
  1 sibling, 0 replies; 200+ results
From: Sergio Gonzalez Monroy @ 2014-12-29 16:24 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

On Tue, Dec 23, 2014 at 10:51:53AM -0500, Neil Horman wrote:
> Adding a document describing rudimentary ABI policy and adding notice space for
> any deprecation announcements
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> ---
>  doc/abi.txt | 17 +++++++++++++++++
>  1 file changed, 17 insertions(+)
>  create mode 100644 doc/abi.txt
> 
> diff --git a/doc/abi.txt b/doc/abi.txt
> new file mode 100644
> index 0000000..b6dcc7d
> --- /dev/null
> +++ b/doc/abi.txt
> @@ -0,0 +1,17 @@
> +ABI policy:
> +	ABI versions are set at the time of major release labeling, and ABI may
> +change multiple times between the last labeling and the HEAD label of the git
> +tree without warning
> +
> +	ABI versions, once released are available until such time as their
> +deprecation has been noted here for at least one major release cycle, after it
> +has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
> +remove it is made during the development of DPDK 1.9.  The decision will be
> +recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
> +1.10 ships.
> +
> +	ABI versions may be deprecated in whole, or in part as needed by a given
> +update.
> +
> +Deprecation Notices:
> +
> -- 
> 1.9.3
>
Acked-by: Sergio Gonzalez Monroy <sergio.gonzalez.monroy@intel.com>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v3 3/4] Add library version extenstion
  2014-12-23 15:51  7%   ` [dpdk-dev] [PATCH v3 3/4] Add library version extenstion Neil Horman
@ 2014-12-29 16:23  0%     ` Sergio Gonzalez Monroy
  2015-01-14 15:48  0%     ` Thomas Monjalon
  1 sibling, 0 replies; 200+ results
From: Sergio Gonzalez Monroy @ 2014-12-29 16:23 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

On Tue, Dec 23, 2014 at 10:51:52AM -0500, Neil Horman wrote:
> To differentiate libraries that break ABI, we add a library version number
> suffix to the library, which must be incremented when a given libraries ABI is
> broken.  This patch enforces that addition, sets the initial abi soname
> extension to 1 for each library and creates a symlink to the base SONAME so that
> the test applications will link properly.
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> 
> Change Notes:
> v3)
> 	Made symlinking of libraries conditional on a DSO build
> ---
Acked-by: Sergio Gonzalez Monroy <sergio.gonzalez.monroy@intel.com>

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v3 4/4] docs: Add ABI documentation
  2014-12-23 15:51  4% ` [dpdk-dev] [PATCH v3 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
  2014-12-23 15:51  7%   ` [dpdk-dev] [PATCH v3 3/4] Add library version extenstion Neil Horman
@ 2014-12-23 15:51 23%   ` Neil Horman
  2014-12-29 16:24  4%     ` Sergio Gonzalez Monroy
  2015-01-14 15:59  4%     ` Thomas Monjalon
  2015-01-14 15:25  0%   ` [dpdk-dev] [PATCH v3 1/4] compat: Add infrastructure to support symbol versioning Thomas Monjalon
  2 siblings, 2 replies; 200+ results
From: Neil Horman @ 2014-12-23 15:51 UTC (permalink / raw)
  To: dev

Adding a document describing rudimentary ABI policy and adding notice space for
any deprecation announcements

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
---
 doc/abi.txt | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)
 create mode 100644 doc/abi.txt

diff --git a/doc/abi.txt b/doc/abi.txt
new file mode 100644
index 0000000..b6dcc7d
--- /dev/null
+++ b/doc/abi.txt
@@ -0,0 +1,17 @@
+ABI policy:
+	ABI versions are set at the time of major release labeling, and ABI may
+change multiple times between the last labeling and the HEAD label of the git
+tree without warning
+
+	ABI versions, once released are available until such time as their
+deprecation has been noted here for at least one major release cycle, after it
+has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
+remove it is made during the development of DPDK 1.9.  The decision will be
+recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
+1.10 ships.
+
+	ABI versions may be deprecated in whole, or in part as needed by a given
+update.
+
+Deprecation Notices:
+
-- 
1.9.3

^ permalink raw reply	[relevance 23%]

* [dpdk-dev] [PATCH v3 3/4] Add library version extenstion
  2014-12-23 15:51  4% ` [dpdk-dev] [PATCH v3 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
@ 2014-12-23 15:51  7%   ` Neil Horman
  2014-12-29 16:23  0%     ` Sergio Gonzalez Monroy
  2015-01-14 15:48  0%     ` Thomas Monjalon
  2014-12-23 15:51 23%   ` [dpdk-dev] [PATCH v3 4/4] docs: Add ABI documentation Neil Horman
  2015-01-14 15:25  0%   ` [dpdk-dev] [PATCH v3 1/4] compat: Add infrastructure to support symbol versioning Thomas Monjalon
  2 siblings, 2 replies; 200+ results
From: Neil Horman @ 2014-12-23 15:51 UTC (permalink / raw)
  To: dev

To differentiate libraries that break ABI, we add a library version number
suffix to the library, which must be incremented when a given libraries ABI is
broken.  This patch enforces that addition, sets the initial abi soname
extension to 1 for each library and creates a symlink to the base SONAME so that
the test applications will link properly.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>

Change Notes:
v3)
	Made symlinking of libraries conditional on a DSO build
---
 lib/librte_acl/Makefile              |  2 ++
 lib/librte_cfgfile/Makefile          |  2 ++
 lib/librte_cmdline/Makefile          |  2 ++
 lib/librte_compat/Makefile           |  2 ++
 lib/librte_distributor/Makefile      |  2 ++
 lib/librte_eal/bsdapp/eal/Makefile   |  2 ++
 lib/librte_eal/linuxapp/eal/Makefile |  2 ++
 lib/librte_ether/Makefile            |  2 ++
 lib/librte_hash/Makefile             |  2 ++
 lib/librte_ip_frag/Makefile          |  2 ++
 lib/librte_ivshmem/Makefile          |  2 ++
 lib/librte_kni/Makefile              |  2 ++
 lib/librte_kvargs/Makefile           |  2 ++
 lib/librte_lpm/Makefile              |  2 ++
 lib/librte_malloc/Makefile           |  2 ++
 lib/librte_mbuf/Makefile             |  2 ++
 lib/librte_mempool/Makefile          |  2 ++
 lib/librte_meter/Makefile            |  2 ++
 lib/librte_pipeline/Makefile         |  2 ++
 lib/librte_pmd_af_packet/Makefile    |  2 ++
 lib/librte_pmd_bond/Makefile         |  2 ++
 lib/librte_pmd_e1000/Makefile        |  2 ++
 lib/librte_pmd_enic/Makefile         |  2 ++
 lib/librte_pmd_i40e/Makefile         |  2 ++
 lib/librte_pmd_ixgbe/Makefile        |  2 ++
 lib/librte_pmd_pcap/Makefile         |  2 ++
 lib/librte_pmd_ring/Makefile         |  2 ++
 lib/librte_pmd_virtio/Makefile       |  2 ++
 lib/librte_pmd_vmxnet3/Makefile      |  2 ++
 lib/librte_pmd_xenvirt/Makefile      |  2 ++
 lib/librte_port/Makefile             |  2 ++
 lib/librte_power/Makefile            |  2 ++
 lib/librte_ring/Makefile             |  2 ++
 lib/librte_sched/Makefile            |  2 ++
 lib/librte_table/Makefile            |  2 ++
 lib/librte_timer/Makefile            |  2 ++
 lib/librte_vhost/Makefile            |  2 ++
 mk/rte.lib.mk                        | 13 +++++++++++--
 38 files changed, 85 insertions(+), 2 deletions(-)

diff --git a/lib/librte_acl/Makefile b/lib/librte_acl/Makefile
index 45cbf80..765deb1 100644
--- a/lib/librte_acl/Makefile
+++ b/lib/librte_acl/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_acl_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_ACL) += tb_mem.c
 
diff --git a/lib/librte_cfgfile/Makefile b/lib/librte_cfgfile/Makefile
index a4f73de..032c240 100644
--- a/lib/librte_cfgfile/Makefile
+++ b/lib/librte_cfgfile/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_cfgfile_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_cmdline/Makefile b/lib/librte_cmdline/Makefile
index 3c71831..719dff6 100644
--- a/lib/librte_cmdline/Makefile
+++ b/lib/librte_cmdline/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_cmdline_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) := cmdline.c
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_cirbuf.c
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
index 46d5905..c63d622 100644
--- a/lib/librte_compat/Makefile
+++ b/lib/librte_compat/Makefile
@@ -32,6 +32,8 @@
 include $(RTE_SDK)/mk/rte.vars.mk
 
 
+LIBABIVER := 1
+
 # install includes
 SYMLINK-y-include := rte_compat.h
 
diff --git a/lib/librte_distributor/Makefile b/lib/librte_distributor/Makefile
index 3674a2c..4c9af17 100644
--- a/lib/librte_distributor/Makefile
+++ b/lib/librte_distributor/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_distributor_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor.c
 
diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index 0b5f9d9..ae214a4 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -48,6 +48,8 @@ CFLAGS += $(WERROR_FLAGS) -O3
 
 EXPORT_MAP := rte_eal_version.map
 
+LIBABIVER := 1
+
 # specific to linuxapp exec-env
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) := eal.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_memory.c
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index bae8af1..e117cec 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -35,6 +35,8 @@ LIB = librte_eal.a
 
 EXPORT_MAP := rte_eal_version.map
 
+LIBABIVER := 1
+
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
 CFLAGS += -I$(SRCDIR)/include
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index 80ad78d..c0e5768 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_ether_version.map
 
+LIBABIVER := 1
+
 SRCS-y += rte_ethdev.c
 
 #
diff --git a/lib/librte_hash/Makefile b/lib/librte_hash/Makefile
index bec61ab..3696cb1 100644
--- a/lib/librte_hash/Makefile
+++ b/lib/librte_hash/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_hash_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) := rte_hash.c
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) += rte_fbk_hash.c
diff --git a/lib/librte_ip_frag/Makefile b/lib/librte_ip_frag/Makefile
index aa88578..fe926f7 100644
--- a/lib/librte_ip_frag/Makefile
+++ b/lib/librte_ip_frag/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_ipfrag_version.map
 
+LIBABIVER := 1
+
 #source files
 ifeq ($(CONFIG_RTE_MBUF_REFCNT),y)
 SRCS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += rte_ipv4_fragmentation.c
diff --git a/lib/librte_ivshmem/Makefile b/lib/librte_ivshmem/Makefile
index 068ee10..16defdb 100644
--- a/lib/librte_ivshmem/Makefile
+++ b/lib/librte_ivshmem/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_ivshmem_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_IVSHMEM) := rte_ivshmem.c
 
diff --git a/lib/librte_kni/Makefile b/lib/librte_kni/Makefile
index 93a516d..7107832 100644
--- a/lib/librte_kni/Makefile
+++ b/lib/librte_kni/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := rte_kni_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KNI) := rte_kni.c
 
diff --git a/lib/librte_kvargs/Makefile b/lib/librte_kvargs/Makefile
index b1c34f3..87b09f2 100644
--- a/lib/librte_kvargs/Makefile
+++ b/lib/librte_kvargs/Makefile
@@ -40,6 +40,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_kvargs_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KVARGS) := rte_kvargs.c
 
diff --git a/lib/librte_lpm/Makefile b/lib/librte_lpm/Makefile
index 8214630..35e6389 100644
--- a/lib/librte_lpm/Makefile
+++ b/lib/librte_lpm/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_lpm_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_LPM) := rte_lpm.c rte_lpm6.c
 
diff --git a/lib/librte_malloc/Makefile b/lib/librte_malloc/Makefile
index 15b7eed..947e41c 100644
--- a/lib/librte_malloc/Makefile
+++ b/lib/librte_malloc/Makefile
@@ -34,6 +34,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_malloc.a
 
+LIBABIVER := 1
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_malloc_version.map
diff --git a/lib/librte_mbuf/Makefile b/lib/librte_mbuf/Makefile
index 03becae..080f3cf 100644
--- a/lib/librte_mbuf/Makefile
+++ b/lib/librte_mbuf/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_mbuf_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MBUF) := rte_mbuf.c
 
diff --git a/lib/librte_mempool/Makefile b/lib/librte_mempool/Makefile
index 31d1a71..940d1f7 100644
--- a/lib/librte_mempool/Makefile
+++ b/lib/librte_mempool/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_mempool_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) +=  rte_mempool.c
 ifeq ($(CONFIG_RTE_LIBRTE_XEN_DOM0),y)
diff --git a/lib/librte_meter/Makefile b/lib/librte_meter/Makefile
index c4a7a32..8765881 100644
--- a/lib/librte_meter/Makefile
+++ b/lib/librte_meter/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_meter_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pipeline/Makefile b/lib/librte_pipeline/Makefile
index 15b58df..15e406b 100644
--- a/lib/librte_pipeline/Makefile
+++ b/lib/librte_pipeline/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pipeline_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_af_packet/Makefile b/lib/librte_pmd_af_packet/Makefile
index 85a7860..f0bf537 100644
--- a/lib/librte_pmd_af_packet/Makefile
+++ b/lib/librte_pmd_af_packet/Makefile
@@ -40,6 +40,8 @@ LIB = librte_pmd_af_packet.a
 
 EXPORT_MAP := rte_pmd_af_packet_version.map
 
+LIBABIVER := 1
+
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
diff --git a/lib/librte_pmd_bond/Makefile b/lib/librte_pmd_bond/Makefile
index 074110a..d6c81a8 100644
--- a/lib/librte_pmd_bond/Makefile
+++ b/lib/librte_pmd_bond/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_bond_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_e1000/Makefile b/lib/librte_pmd_e1000/Makefile
index cd14444..8c8fed8 100644
--- a/lib/librte_pmd_e1000/Makefile
+++ b/lib/librte_pmd_e1000/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_e1000_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_enic/Makefile b/lib/librte_pmd_enic/Makefile
index 697231c..251a898 100644
--- a/lib/librte_pmd_enic/Makefile
+++ b/lib/librte_pmd_enic/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_enic.a
 
 EXPORT_MAP := rte_pmd_enic_version.map
 
+LIBABIVER := 1
+
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/vnic/
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/
 CFLAGS += -O3
diff --git a/lib/librte_pmd_i40e/Makefile b/lib/librte_pmd_i40e/Makefile
index 73de373..9a0eec8 100644
--- a/lib/librte_pmd_i40e/Makefile
+++ b/lib/librte_pmd_i40e/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_i40e_version.map
 
+LIBABIVER := 1
+
 #
 # Add extra flags for base driver files (also known as shared code)
 # to disable warnings
diff --git a/lib/librte_pmd_ixgbe/Makefile b/lib/librte_pmd_ixgbe/Makefile
index e0a17f6..d580f62 100644
--- a/lib/librte_pmd_ixgbe/Makefile
+++ b/lib/librte_pmd_ixgbe/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_ixgbe_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_pcap/Makefile b/lib/librte_pmd_pcap/Makefile
index cb6678e..0775dbc 100644
--- a/lib/librte_pmd_pcap/Makefile
+++ b/lib/librte_pmd_pcap/Makefile
@@ -42,6 +42,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_pcap_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_ring/Makefile b/lib/librte_pmd_ring/Makefile
index aa1b461..e442d0b 100644
--- a/lib/librte_pmd_ring/Makefile
+++ b/lib/librte_pmd_ring/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_ring_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_virtio/Makefile b/lib/librte_pmd_virtio/Makefile
index d979c59..793067f 100644
--- a/lib/librte_pmd_virtio/Makefile
+++ b/lib/librte_pmd_virtio/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_virtio_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_vmxnet3/Makefile b/lib/librte_pmd_vmxnet3/Makefile
index f3ab178..93e5580 100644
--- a/lib/librte_pmd_vmxnet3/Makefile
+++ b/lib/librte_pmd_vmxnet3/Makefile
@@ -68,6 +68,8 @@ VPATH += $(RTE_SDK)/lib/librte_pmd_vmxnet3/vmxnet3
 
 EXPORT_MAP := rte_pmd_vmxnet3_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_xenvirt/Makefile b/lib/librte_pmd_xenvirt/Makefile
index 4510603..f0c796c 100644
--- a/lib/librte_pmd_xenvirt/Makefile
+++ b/lib/librte_pmd_xenvirt/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_xenvirt_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_port/Makefile b/lib/librte_port/Makefile
index 266ed39..0e38452 100644
--- a/lib/librte_port/Makefile
+++ b/lib/librte_port/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_port_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_power/Makefile b/lib/librte_power/Makefile
index 0547dcd..cee95cd 100644
--- a/lib/librte_power/Makefile
+++ b/lib/librte_power/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := rte_power_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) := rte_power.c rte_power_acpi_cpufreq.c
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) += rte_power_kvm_vm.c guest_channel.c
diff --git a/lib/librte_ring/Makefile b/lib/librte_ring/Makefile
index b437dc5..84ad3d3 100644
--- a/lib/librte_ring/Makefile
+++ b/lib/librte_ring/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_ring_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_RING) := rte_ring.c
 
diff --git a/lib/librte_sched/Makefile b/lib/librte_sched/Makefile
index 48f280a..b1cb285 100644
--- a/lib/librte_sched/Makefile
+++ b/lib/librte_sched/Makefile
@@ -43,6 +43,8 @@ CFLAGS_rte_red.o := -D_GNU_SOURCE
 
 EXPORT_MAP := rte_sched_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_table/Makefile b/lib/librte_table/Makefile
index 4e1a54a..0d8394c 100644
--- a/lib/librte_table/Makefile
+++ b/lib/librte_table/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_table_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_timer/Makefile b/lib/librte_timer/Makefile
index 9fb6079..2aabef8 100644
--- a/lib/librte_timer/Makefile
+++ b/lib/librte_timer/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_timer_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_TIMER) := rte_timer.c
 
diff --git a/lib/librte_vhost/Makefile b/lib/librte_vhost/Makefile
index 96a7dd0..369c25a 100644
--- a/lib/librte_vhost/Makefile
+++ b/lib/librte_vhost/Makefile
@@ -36,6 +36,8 @@ LIB = librte_vhost.a
 
 EXPORT_MAP := rte_vhost_version.map
 
+LIBABIVER := 1
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -D_FILE_OFFSET_BITS=64 -lfuse
 LDFLAGS += -lfuse
 # all source are stored in SRCS-y
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 1d3b646..7326b8e 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -37,10 +37,9 @@ include $(RTE_SDK)/mk/internal/rte.depdirs-pre.mk
 
 # VPATH contains at least SRCDIR
 VPATH += $(SRCDIR)
-
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
-LIB := $(patsubst %.a,%.so,$(LIB))
 
+LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB))
 CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
 
 endif
@@ -63,6 +62,7 @@ build: _postbuild
 
 exe2cmd = $(strip $(call dotfile,$(patsubst %,%.cmd,$(1))))
 
+
 ifeq ($(LINK_USING_CC),1)
 # Override the definition of LD here, since we're linking with CC
 LD := $(CC) $(CPU_CFLAGS)
@@ -113,6 +113,10 @@ lib_dir = [ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib;
 #
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
+ifeq ($(LIBABIVER),)
+	@echo "Must Specify a $(LIB) ABI version"
+	@exit 1
+endif
 	@[ -d $(dir $@) ] || mkdir -p $(dir $@)
 	$(if $(D),\
 		@echo -n "$< -> $@ " ; \
@@ -126,6 +130,7 @@ $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
 		$(depfile_missing),\
 		$(depfile_newer)),\
 		$(O_TO_S_DO))
+
 ifeq ($(RTE_BUILD_COMBINE_LIBS),y)
 	$(if $(or \
         $(file_missing),\
@@ -163,9 +168,13 @@ endif
 # install lib in $(RTE_OUTPUT)/lib
 #
 $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
+	$(eval LIBSONAME := $(basename $(LIB)))
 	@echo "  INSTALL-LIB $(LIB)"
 	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
 	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
+ifeq ($(RTE_BUILD_SHARED_LIB),y)
+	$(Q)ln -s -f ./$(LIB) $(RTE_OUTPUT)/lib/$(LIBSONAME)
+endif
 
 #
 # Clean all generated files
-- 
1.9.3

^ permalink raw reply	[relevance 7%]

* [dpdk-dev] [PATCH v3 1/4] compat: Add infrastructure to support symbol versioning
  2014-12-20 21:01  4% [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
                   ` (3 preceding siblings ...)
  2014-12-22 20:24  4% ` [dpdk-dev] [PATCH v2 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
@ 2014-12-23 15:51  4% ` Neil Horman
  2014-12-23 15:51  7%   ` [dpdk-dev] [PATCH v3 3/4] Add library version extenstion Neil Horman
                     ` (2 more replies)
  2015-01-09 12:35  0% ` [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
                   ` (7 subsequent siblings)
  12 siblings, 3 replies; 200+ results
From: Neil Horman @ 2014-12-23 15:51 UTC (permalink / raw)
  To: dev

Add initial pass header files to support symbol versioning.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
CC: "Gonzalez Monroy, Sergio" <sergio.gonzalez.monroy@intel.com>

Change Notes:
V2)
	Moved ifeq to _INSTALL target

V3)
	Undo V2 changes and make librte_compat use the rte.install.mk file
instead
---
 lib/Makefile                   |  1 +
 lib/librte_compat/Makefile     | 38 +++++++++++++++++
 lib/librte_compat/rte_compat.h | 96 ++++++++++++++++++++++++++++++++++++++++++
 mk/rte.lib.mk                  |  4 ++
 4 files changed, 139 insertions(+)
 create mode 100644 lib/librte_compat/Makefile
 create mode 100644 lib/librte_compat/rte_compat.h

diff --git a/lib/Makefile b/lib/Makefile
index 0ffc982..d617d81 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -31,6 +31,7 @@
 
 include $(RTE_SDK)/mk/rte.vars.mk
 
+DIRS-y += librte_compat
 DIRS-$(CONFIG_RTE_LIBRTE_EAL) += librte_eal
 DIRS-$(CONFIG_RTE_LIBRTE_MALLOC) += librte_malloc
 DIRS-$(CONFIG_RTE_LIBRTE_RING) += librte_ring
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
new file mode 100644
index 0000000..46d5905
--- /dev/null
+++ b/lib/librte_compat/Makefile
@@ -0,0 +1,38 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+
+# install includes
+SYMLINK-y-include := rte_compat.h
+
+include $(RTE_SDK)/mk/rte.install.mk
diff --git a/lib/librte_compat/rte_compat.h b/lib/librte_compat/rte_compat.h
new file mode 100644
index 0000000..d99e362
--- /dev/null
+++ b/lib/librte_compat/rte_compat.h
@@ -0,0 +1,96 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _RTE_COMPAT_H_
+#define _RTE_COMPAT_H_
+
+/*
+ * This is just a stringification macro for use below.
+ */
+#define SA(x) #x
+
+#ifdef RTE_BUILD_SHARED_LIB
+
+/*
+ * Provides backwards compatibility when updating exported functions.
+ * When a symol is exported from a library to provide an API, it also provides a
+ * calling convention (ABI) that is embodied in its name, return type,
+ * arguments, etc.  On occasion that function may need to change to accomodate
+ * new functionality, behavior, etc.  When that occurs, it is desireable to
+ * allow for backwards compatibility for a time with older binaries that are
+ * dynamically linked to the dpdk.  to support that the __vsym and
+ * VERSION_SYMBOL macros are created.  They, in conjunction with the
+ * <library>_version.map file for a given library allow for multiple versions of
+ * a symbol to exist in a shared library so that older binaries need not be
+ * immediately recompiled. Their use is outlined in the following example:
+ * Assumptions: DPDK 1.(X) contains a function int foo(char *string)
+ *              DPDK 1.(X+1) needs to change foo to be int foo(int index)
+ *
+ * To accomplish this:
+ * 1) Edit lib/<library>/library_version.map to add a DPDK_1.(X+1) node, in which
+ * foo is exported as a global symbol.
+ *
+ * 2) rename the existing function int foo(char *string) to 
+ * 	int __vsym foo_v18(char *string)
+ *
+ * 3) Add this macro immediately below the function
+ * 	VERSION_SYMBOL(foo, _v18, 1.8);
+ *
+ * 4) Implement a new version of foo.
+ * 	char foo(int value, int otherval) { ...}
+ *
+ * 5) Mark the newest version as the default version
+ * 	BIND_DEFAULT_SYMBOL(foo, 1.9);
+ *
+ */
+#define VERSION_SYMBOL(b, e, v) __asm__(".symver " SA(b) SA(e) ", "SA(b)"@DPDK_"SA(v))
+#define BASE_SYMBOL(b, n) __asm__(".symver " SA(n) ", "SA(b)"@")
+#define BIND_DEFAULT_SYMBOL(b, v) __asm__(".symver " SA(b) ", "SA(b)"@@DPDK_"SA(v))
+#define __vsym __attribute__((used))
+
+#else
+/*
+ * No symbol versioning in use
+ */
+#define VERSION_SYMBOL(b, e, v)
+#define __vsym
+#define BASE_SYMBOL(b, n)
+#define BIND_DEFAULT_SYMBOL(b, v)
+
+/*
+ * RTE_BUILD_SHARED_LIB
+ */
+#endif
+
+
+#endif /* _RTE_COMPAT_H_ */
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 81bf8e1..75e3652 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -40,8 +40,12 @@ VPATH += $(SRCDIR)
 
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 LIB := $(patsubst %.a,%.so,$(LIB))
+
+CPU_LDFLAGS += --version-script=$(EXPORT_MAP)
+
 endif
 
+
 _BUILD = $(LIB)
 _INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) $(RTE_OUTPUT)/lib/$(LIB)
 _CLEAN = doclean
-- 
1.9.3

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v2 4/4] docs: Add ABI documentation
  2014-12-23  9:48  4%     ` Iremonger, Bernard
@ 2014-12-23 13:01  4%       ` Neil Horman
  0 siblings, 0 replies; 200+ results
From: Neil Horman @ 2014-12-23 13:01 UTC (permalink / raw)
  To: Iremonger, Bernard; +Cc: dev

On Tue, Dec 23, 2014 at 09:48:43AM +0000, Iremonger, Bernard wrote:
> > -----Original Message-----
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> > Sent: Monday, December 22, 2014 8:24 PM
> > To: dev@dpdk.org
> > Subject: [dpdk-dev] [PATCH v2 4/4] docs: Add ABI documentation
> > 
> > Adding a document describing rudimentary ABI policy and adding notice space for any deprecation
> > announcements
> > 
> > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> > CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> > CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> > ---
> >  doc/abi.txt | 17 +++++++++++++++++
> >  1 file changed, 17 insertions(+)
> >  create mode 100644 doc/abi.txt
> > 
> > diff --git a/doc/abi.txt b/doc/abi.txt
> > new file mode 100644
> > index 0000000..b6dcc7d
> > --- /dev/null
> > +++ b/doc/abi.txt
> > @@ -0,0 +1,17 @@
> > +ABI policy:
> > +	ABI versions are set at the time of major release labeling, and ABI
> > +may change multiple times between the last labeling and the HEAD label
> > +of the git tree without warning
> > +
> > +	ABI versions, once released are available until such time as their
> > +deprecation has been noted here for at least one major release cycle,
> > +after it has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and
> > +then the decision to remove it is made during the development of DPDK
> > +1.9.  The decision will be recorded here, shipped with the DPDK 1.9
> > +release, and actually removed when DPDK
> > +1.10 ships.
> > +
> > +	ABI versions may be deprecated in whole, or in part as needed by a
> > +given update.
> > +
> > +Deprecation Notices:
> > +
> > --
> > 1.9.3
> 
> Should this document be added to the guides documentation (for example doc/guides/prog_guide)?
> 
> Regards,
> 
> Bernard.
> 
> 
I don't think so, since this document is meant to be used not only by end users,
but by other programmers while working on the dpdk.  

Neil

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v2 4/4] docs: Add ABI documentation
  2014-12-22 20:24 23%   ` [dpdk-dev] [PATCH v2 4/4] docs: Add ABI documentation Neil Horman
@ 2014-12-23  9:48  4%     ` Iremonger, Bernard
  2014-12-23 13:01  4%       ` Neil Horman
  0 siblings, 1 reply; 200+ results
From: Iremonger, Bernard @ 2014-12-23  9:48 UTC (permalink / raw)
  To: Neil Horman, dev

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> Sent: Monday, December 22, 2014 8:24 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v2 4/4] docs: Add ABI documentation
> 
> Adding a document describing rudimentary ABI policy and adding notice space for any deprecation
> announcements
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> ---
>  doc/abi.txt | 17 +++++++++++++++++
>  1 file changed, 17 insertions(+)
>  create mode 100644 doc/abi.txt
> 
> diff --git a/doc/abi.txt b/doc/abi.txt
> new file mode 100644
> index 0000000..b6dcc7d
> --- /dev/null
> +++ b/doc/abi.txt
> @@ -0,0 +1,17 @@
> +ABI policy:
> +	ABI versions are set at the time of major release labeling, and ABI
> +may change multiple times between the last labeling and the HEAD label
> +of the git tree without warning
> +
> +	ABI versions, once released are available until such time as their
> +deprecation has been noted here for at least one major release cycle,
> +after it has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and
> +then the decision to remove it is made during the development of DPDK
> +1.9.  The decision will be recorded here, shipped with the DPDK 1.9
> +release, and actually removed when DPDK
> +1.10 ships.
> +
> +	ABI versions may be deprecated in whole, or in part as needed by a
> +given update.
> +
> +Deprecation Notices:
> +
> --
> 1.9.3

Should this document be added to the guides documentation (for example doc/guides/prog_guide)?

Regards,

Bernard.

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v2 4/4] docs: Add ABI documentation
  2014-12-22 20:24  4% ` [dpdk-dev] [PATCH v2 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
  2014-12-22 20:24  7%   ` [dpdk-dev] [PATCH v2 3/4] Add library version extenstion Neil Horman
@ 2014-12-22 20:24 23%   ` Neil Horman
  2014-12-23  9:48  4%     ` Iremonger, Bernard
  1 sibling, 1 reply; 200+ results
From: Neil Horman @ 2014-12-22 20:24 UTC (permalink / raw)
  To: dev

Adding a document describing rudimentary ABI policy and adding notice space for
any deprecation announcements

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
---
 doc/abi.txt | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)
 create mode 100644 doc/abi.txt

diff --git a/doc/abi.txt b/doc/abi.txt
new file mode 100644
index 0000000..b6dcc7d
--- /dev/null
+++ b/doc/abi.txt
@@ -0,0 +1,17 @@
+ABI policy:
+	ABI versions are set at the time of major release labeling, and ABI may
+change multiple times between the last labeling and the HEAD label of the git
+tree without warning
+
+	ABI versions, once released are available until such time as their
+deprecation has been noted here for at least one major release cycle, after it
+has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
+remove it is made during the development of DPDK 1.9.  The decision will be
+recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
+1.10 ships.
+
+	ABI versions may be deprecated in whole, or in part as needed by a given
+update.
+
+Deprecation Notices:
+
-- 
1.9.3

^ permalink raw reply	[relevance 23%]

* [dpdk-dev] [PATCH v2 3/4] Add library version extenstion
  2014-12-22 20:24  4% ` [dpdk-dev] [PATCH v2 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
@ 2014-12-22 20:24  7%   ` Neil Horman
  2014-12-22 20:24 23%   ` [dpdk-dev] [PATCH v2 4/4] docs: Add ABI documentation Neil Horman
  1 sibling, 0 replies; 200+ results
From: Neil Horman @ 2014-12-22 20:24 UTC (permalink / raw)
  To: dev

To differentiate libraries that break ABI, we add a library version number
suffix to the library, which must be incremented when a given libraries ABI is
broken.  This patch enforces that addition, sets the initial abi soname
extension to 1 for each library and creates a symlink to the base SONAME so that
the test applications will link properly.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
---
 lib/librte_acl/Makefile              |  2 ++
 lib/librte_cfgfile/Makefile          |  2 ++
 lib/librte_cmdline/Makefile          |  2 ++
 lib/librte_compat/Makefile           |  2 ++
 lib/librte_distributor/Makefile      |  2 ++
 lib/librte_eal/bsdapp/eal/Makefile   |  2 ++
 lib/librte_eal/linuxapp/eal/Makefile |  2 ++
 lib/librte_ether/Makefile            |  2 ++
 lib/librte_hash/Makefile             |  2 ++
 lib/librte_ip_frag/Makefile          |  2 ++
 lib/librte_ivshmem/Makefile          |  2 ++
 lib/librte_kni/Makefile              |  2 ++
 lib/librte_kvargs/Makefile           |  2 ++
 lib/librte_lpm/Makefile              |  2 ++
 lib/librte_malloc/Makefile           |  2 ++
 lib/librte_mbuf/Makefile             |  2 ++
 lib/librte_mempool/Makefile          |  2 ++
 lib/librte_meter/Makefile            |  2 ++
 lib/librte_pipeline/Makefile         |  2 ++
 lib/librte_pmd_af_packet/Makefile    |  2 ++
 lib/librte_pmd_bond/Makefile         |  2 ++
 lib/librte_pmd_e1000/Makefile        |  2 ++
 lib/librte_pmd_enic/Makefile         |  2 ++
 lib/librte_pmd_i40e/Makefile         |  2 ++
 lib/librte_pmd_ixgbe/Makefile        |  2 ++
 lib/librte_pmd_pcap/Makefile         |  2 ++
 lib/librte_pmd_ring/Makefile         |  2 ++
 lib/librte_pmd_virtio/Makefile       |  2 ++
 lib/librte_pmd_vmxnet3/Makefile      |  2 ++
 lib/librte_pmd_xenvirt/Makefile      |  2 ++
 lib/librte_port/Makefile             |  2 ++
 lib/librte_power/Makefile            |  2 ++
 lib/librte_ring/Makefile             |  2 ++
 lib/librte_sched/Makefile            |  2 ++
 lib/librte_table/Makefile            |  2 ++
 lib/librte_timer/Makefile            |  2 ++
 lib/librte_vhost/Makefile            |  2 ++
 mk/rte.lib.mk                        | 11 +++++++++--
 38 files changed, 83 insertions(+), 2 deletions(-)

diff --git a/lib/librte_acl/Makefile b/lib/librte_acl/Makefile
index 45cbf80..765deb1 100644
--- a/lib/librte_acl/Makefile
+++ b/lib/librte_acl/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_acl_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_ACL) += tb_mem.c
 
diff --git a/lib/librte_cfgfile/Makefile b/lib/librte_cfgfile/Makefile
index a4f73de..032c240 100644
--- a/lib/librte_cfgfile/Makefile
+++ b/lib/librte_cfgfile/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_cfgfile_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_cmdline/Makefile b/lib/librte_cmdline/Makefile
index 3c71831..719dff6 100644
--- a/lib/librte_cmdline/Makefile
+++ b/lib/librte_cmdline/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_cmdline_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) := cmdline.c
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_cirbuf.c
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
index 3415c7b..a23d349 100644
--- a/lib/librte_compat/Makefile
+++ b/lib/librte_compat/Makefile
@@ -32,6 +32,8 @@
 include $(RTE_SDK)/mk/rte.vars.mk
 
 
+LIBABIVER := 1
+
 # install includes
 SYMLINK-y-include := rte_compat.h
 
diff --git a/lib/librte_distributor/Makefile b/lib/librte_distributor/Makefile
index 3674a2c..4c9af17 100644
--- a/lib/librte_distributor/Makefile
+++ b/lib/librte_distributor/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_distributor_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor.c
 
diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index 0b5f9d9..ae214a4 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -48,6 +48,8 @@ CFLAGS += $(WERROR_FLAGS) -O3
 
 EXPORT_MAP := rte_eal_version.map
 
+LIBABIVER := 1
+
 # specific to linuxapp exec-env
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) := eal.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_memory.c
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index bae8af1..e117cec 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -35,6 +35,8 @@ LIB = librte_eal.a
 
 EXPORT_MAP := rte_eal_version.map
 
+LIBABIVER := 1
+
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
 CFLAGS += -I$(SRCDIR)/include
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index 80ad78d..c0e5768 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_ether_version.map
 
+LIBABIVER := 1
+
 SRCS-y += rte_ethdev.c
 
 #
diff --git a/lib/librte_hash/Makefile b/lib/librte_hash/Makefile
index bec61ab..3696cb1 100644
--- a/lib/librte_hash/Makefile
+++ b/lib/librte_hash/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_hash_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) := rte_hash.c
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) += rte_fbk_hash.c
diff --git a/lib/librte_ip_frag/Makefile b/lib/librte_ip_frag/Makefile
index aa88578..fe926f7 100644
--- a/lib/librte_ip_frag/Makefile
+++ b/lib/librte_ip_frag/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_ipfrag_version.map
 
+LIBABIVER := 1
+
 #source files
 ifeq ($(CONFIG_RTE_MBUF_REFCNT),y)
 SRCS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += rte_ipv4_fragmentation.c
diff --git a/lib/librte_ivshmem/Makefile b/lib/librte_ivshmem/Makefile
index 068ee10..16defdb 100644
--- a/lib/librte_ivshmem/Makefile
+++ b/lib/librte_ivshmem/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_ivshmem_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_IVSHMEM) := rte_ivshmem.c
 
diff --git a/lib/librte_kni/Makefile b/lib/librte_kni/Makefile
index 93a516d..7107832 100644
--- a/lib/librte_kni/Makefile
+++ b/lib/librte_kni/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := rte_kni_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KNI) := rte_kni.c
 
diff --git a/lib/librte_kvargs/Makefile b/lib/librte_kvargs/Makefile
index b1c34f3..87b09f2 100644
--- a/lib/librte_kvargs/Makefile
+++ b/lib/librte_kvargs/Makefile
@@ -40,6 +40,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_kvargs_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KVARGS) := rte_kvargs.c
 
diff --git a/lib/librte_lpm/Makefile b/lib/librte_lpm/Makefile
index 8214630..35e6389 100644
--- a/lib/librte_lpm/Makefile
+++ b/lib/librte_lpm/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := rte_lpm_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_LPM) := rte_lpm.c rte_lpm6.c
 
diff --git a/lib/librte_malloc/Makefile b/lib/librte_malloc/Makefile
index 15b7eed..947e41c 100644
--- a/lib/librte_malloc/Makefile
+++ b/lib/librte_malloc/Makefile
@@ -34,6 +34,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_malloc.a
 
+LIBABIVER := 1
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_malloc_version.map
diff --git a/lib/librte_mbuf/Makefile b/lib/librte_mbuf/Makefile
index 03becae..080f3cf 100644
--- a/lib/librte_mbuf/Makefile
+++ b/lib/librte_mbuf/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_mbuf_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MBUF) := rte_mbuf.c
 
diff --git a/lib/librte_mempool/Makefile b/lib/librte_mempool/Makefile
index 31d1a71..940d1f7 100644
--- a/lib/librte_mempool/Makefile
+++ b/lib/librte_mempool/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_mempool_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) +=  rte_mempool.c
 ifeq ($(CONFIG_RTE_LIBRTE_XEN_DOM0),y)
diff --git a/lib/librte_meter/Makefile b/lib/librte_meter/Makefile
index c4a7a32..8765881 100644
--- a/lib/librte_meter/Makefile
+++ b/lib/librte_meter/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_meter_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pipeline/Makefile b/lib/librte_pipeline/Makefile
index 15b58df..15e406b 100644
--- a/lib/librte_pipeline/Makefile
+++ b/lib/librte_pipeline/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pipeline_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_af_packet/Makefile b/lib/librte_pmd_af_packet/Makefile
index 85a7860..f0bf537 100644
--- a/lib/librte_pmd_af_packet/Makefile
+++ b/lib/librte_pmd_af_packet/Makefile
@@ -40,6 +40,8 @@ LIB = librte_pmd_af_packet.a
 
 EXPORT_MAP := rte_pmd_af_packet_version.map
 
+LIBABIVER := 1
+
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
 
diff --git a/lib/librte_pmd_bond/Makefile b/lib/librte_pmd_bond/Makefile
index 074110a..d6c81a8 100644
--- a/lib/librte_pmd_bond/Makefile
+++ b/lib/librte_pmd_bond/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_bond_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_e1000/Makefile b/lib/librte_pmd_e1000/Makefile
index cd14444..8c8fed8 100644
--- a/lib/librte_pmd_e1000/Makefile
+++ b/lib/librte_pmd_e1000/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_e1000_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_enic/Makefile b/lib/librte_pmd_enic/Makefile
index 697231c..251a898 100644
--- a/lib/librte_pmd_enic/Makefile
+++ b/lib/librte_pmd_enic/Makefile
@@ -39,6 +39,8 @@ LIB = librte_pmd_enic.a
 
 EXPORT_MAP := rte_pmd_enic_version.map
 
+LIBABIVER := 1
+
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/vnic/
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/
 CFLAGS += -O3
diff --git a/lib/librte_pmd_i40e/Makefile b/lib/librte_pmd_i40e/Makefile
index 73de373..9a0eec8 100644
--- a/lib/librte_pmd_i40e/Makefile
+++ b/lib/librte_pmd_i40e/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_i40e_version.map
 
+LIBABIVER := 1
+
 #
 # Add extra flags for base driver files (also known as shared code)
 # to disable warnings
diff --git a/lib/librte_pmd_ixgbe/Makefile b/lib/librte_pmd_ixgbe/Makefile
index e0a17f6..d580f62 100644
--- a/lib/librte_pmd_ixgbe/Makefile
+++ b/lib/librte_pmd_ixgbe/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_ixgbe_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_pcap/Makefile b/lib/librte_pmd_pcap/Makefile
index cb6678e..0775dbc 100644
--- a/lib/librte_pmd_pcap/Makefile
+++ b/lib/librte_pmd_pcap/Makefile
@@ -42,6 +42,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_pcap_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_ring/Makefile b/lib/librte_pmd_ring/Makefile
index aa1b461..e442d0b 100644
--- a/lib/librte_pmd_ring/Makefile
+++ b/lib/librte_pmd_ring/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_ring_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_virtio/Makefile b/lib/librte_pmd_virtio/Makefile
index d979c59..793067f 100644
--- a/lib/librte_pmd_virtio/Makefile
+++ b/lib/librte_pmd_virtio/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_pmd_virtio_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_vmxnet3/Makefile b/lib/librte_pmd_vmxnet3/Makefile
index f3ab178..93e5580 100644
--- a/lib/librte_pmd_vmxnet3/Makefile
+++ b/lib/librte_pmd_vmxnet3/Makefile
@@ -68,6 +68,8 @@ VPATH += $(RTE_SDK)/lib/librte_pmd_vmxnet3/vmxnet3
 
 EXPORT_MAP := rte_pmd_vmxnet3_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_xenvirt/Makefile b/lib/librte_pmd_xenvirt/Makefile
index 4510603..f0c796c 100644
--- a/lib/librte_pmd_xenvirt/Makefile
+++ b/lib/librte_pmd_xenvirt/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_eth_xenvirt_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_port/Makefile b/lib/librte_port/Makefile
index 266ed39..0e38452 100644
--- a/lib/librte_port/Makefile
+++ b/lib/librte_port/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_port_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_power/Makefile b/lib/librte_power/Makefile
index 0547dcd..cee95cd 100644
--- a/lib/librte_power/Makefile
+++ b/lib/librte_power/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := rte_power_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) := rte_power.c rte_power_acpi_cpufreq.c
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) += rte_power_kvm_vm.c guest_channel.c
diff --git a/lib/librte_ring/Makefile b/lib/librte_ring/Makefile
index b437dc5..84ad3d3 100644
--- a/lib/librte_ring/Makefile
+++ b/lib/librte_ring/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_ring_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_RING) := rte_ring.c
 
diff --git a/lib/librte_sched/Makefile b/lib/librte_sched/Makefile
index 48f280a..b1cb285 100644
--- a/lib/librte_sched/Makefile
+++ b/lib/librte_sched/Makefile
@@ -43,6 +43,8 @@ CFLAGS_rte_red.o := -D_GNU_SOURCE
 
 EXPORT_MAP := rte_sched_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_table/Makefile b/lib/librte_table/Makefile
index 4e1a54a..0d8394c 100644
--- a/lib/librte_table/Makefile
+++ b/lib/librte_table/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_table_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_timer/Makefile b/lib/librte_timer/Makefile
index 9fb6079..2aabef8 100644
--- a/lib/librte_timer/Makefile
+++ b/lib/librte_timer/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_timer_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_TIMER) := rte_timer.c
 
diff --git a/lib/librte_vhost/Makefile b/lib/librte_vhost/Makefile
index 96a7dd0..369c25a 100644
--- a/lib/librte_vhost/Makefile
+++ b/lib/librte_vhost/Makefile
@@ -36,6 +36,8 @@ LIB = librte_vhost.a
 
 EXPORT_MAP := rte_vhost_version.map
 
+LIBABIVER := 1
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -D_FILE_OFFSET_BITS=64 -lfuse
 LDFLAGS += -lfuse
 # all source are stored in SRCS-y
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 7949254..ad058b5 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -37,10 +37,9 @@ include $(RTE_SDK)/mk/internal/rte.depdirs-pre.mk
 
 # VPATH contains at least SRCDIR
 VPATH += $(SRCDIR)
-
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
-LIB := $(patsubst %.a,%.so,$(LIB))
 
+LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB))
 CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
 
 endif
@@ -66,6 +65,7 @@ build: _postbuild
 
 exe2cmd = $(strip $(call dotfile,$(patsubst %,%.cmd,$(1))))
 
+
 ifeq ($(LINK_USING_CC),1)
 # Override the definition of LD here, since we're linking with CC
 LD := $(CC) $(CPU_CFLAGS)
@@ -116,6 +116,10 @@ lib_dir = [ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib;
 #
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
+ifeq ($(LIBABIVER),)
+	@echo "Must Specify a $(LIB) ABI version"
+	@exit 1
+endif
 	@[ -d $(dir $@) ] || mkdir -p $(dir $@)
 	$(if $(D),\
 		@echo -n "$< -> $@ " ; \
@@ -129,6 +133,7 @@ $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
 		$(depfile_missing),\
 		$(depfile_newer)),\
 		$(O_TO_S_DO))
+
 ifeq ($(RTE_BUILD_COMBINE_LIBS),y)
 	$(if $(or \
         $(file_missing),\
@@ -166,9 +171,11 @@ endif
 # install lib in $(RTE_OUTPUT)/lib
 #
 $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
+	$(eval LIBSONAME := $(basename $(LIB)))
 	@echo "  INSTALL-LIB $(LIB)"
 	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
 	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
+	$(Q)ln -s -f $(RTE_OUTPUT)/lib/$(LIB) $(RTE_OUTPUT)/lib/$(LIBSONAME)
 
 #
 # Clean all generated files
-- 
1.9.3

^ permalink raw reply	[relevance 7%]

* [dpdk-dev] [PATCH v2 1/4] compat: Add infrastructure to support symbol versioning
  2014-12-20 21:01  4% [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
                   ` (2 preceding siblings ...)
  2014-12-20 21:01 23% ` [dpdk-dev] [PATCH 4/4] docs: Add ABI documentation Neil Horman
@ 2014-12-22 20:24  4% ` Neil Horman
  2014-12-22 20:24  7%   ` [dpdk-dev] [PATCH v2 3/4] Add library version extenstion Neil Horman
  2014-12-22 20:24 23%   ` [dpdk-dev] [PATCH v2 4/4] docs: Add ABI documentation Neil Horman
  2014-12-23 15:51  4% ` [dpdk-dev] [PATCH v3 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
                   ` (8 subsequent siblings)
  12 siblings, 2 replies; 200+ results
From: Neil Horman @ 2014-12-22 20:24 UTC (permalink / raw)
  To: dev

Add initial pass header files to support symbol versioning.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
CC: "Gonzalez Monroy, Sergio" <sergio.gonzalez.monroy@intel.com>

Change Notes:
V2)
	Moved ifeq to _INSTALL target
---
 lib/Makefile                   |  1 +
 lib/librte_compat/Makefile     | 38 +++++++++++++++++
 lib/librte_compat/rte_compat.h | 96 ++++++++++++++++++++++++++++++++++++++++++
 mk/rte.lib.mk                  |  9 +++-
 4 files changed, 143 insertions(+), 1 deletion(-)
 create mode 100644 lib/librte_compat/Makefile
 create mode 100644 lib/librte_compat/rte_compat.h

diff --git a/lib/Makefile b/lib/Makefile
index 0ffc982..d617d81 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -31,6 +31,7 @@
 
 include $(RTE_SDK)/mk/rte.vars.mk
 
+DIRS-y += librte_compat
 DIRS-$(CONFIG_RTE_LIBRTE_EAL) += librte_eal
 DIRS-$(CONFIG_RTE_LIBRTE_MALLOC) += librte_malloc
 DIRS-$(CONFIG_RTE_LIBRTE_RING) += librte_ring
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
new file mode 100644
index 0000000..3415c7b
--- /dev/null
+++ b/lib/librte_compat/Makefile
@@ -0,0 +1,38 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+
+# install includes
+SYMLINK-y-include := rte_compat.h
+
+include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/lib/librte_compat/rte_compat.h b/lib/librte_compat/rte_compat.h
new file mode 100644
index 0000000..d99e362
--- /dev/null
+++ b/lib/librte_compat/rte_compat.h
@@ -0,0 +1,96 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _RTE_COMPAT_H_
+#define _RTE_COMPAT_H_
+
+/*
+ * This is just a stringification macro for use below.
+ */
+#define SA(x) #x
+
+#ifdef RTE_BUILD_SHARED_LIB
+
+/*
+ * Provides backwards compatibility when updating exported functions.
+ * When a symol is exported from a library to provide an API, it also provides a
+ * calling convention (ABI) that is embodied in its name, return type,
+ * arguments, etc.  On occasion that function may need to change to accomodate
+ * new functionality, behavior, etc.  When that occurs, it is desireable to
+ * allow for backwards compatibility for a time with older binaries that are
+ * dynamically linked to the dpdk.  to support that the __vsym and
+ * VERSION_SYMBOL macros are created.  They, in conjunction with the
+ * <library>_version.map file for a given library allow for multiple versions of
+ * a symbol to exist in a shared library so that older binaries need not be
+ * immediately recompiled. Their use is outlined in the following example:
+ * Assumptions: DPDK 1.(X) contains a function int foo(char *string)
+ *              DPDK 1.(X+1) needs to change foo to be int foo(int index)
+ *
+ * To accomplish this:
+ * 1) Edit lib/<library>/library_version.map to add a DPDK_1.(X+1) node, in which
+ * foo is exported as a global symbol.
+ *
+ * 2) rename the existing function int foo(char *string) to 
+ * 	int __vsym foo_v18(char *string)
+ *
+ * 3) Add this macro immediately below the function
+ * 	VERSION_SYMBOL(foo, _v18, 1.8);
+ *
+ * 4) Implement a new version of foo.
+ * 	char foo(int value, int otherval) { ...}
+ *
+ * 5) Mark the newest version as the default version
+ * 	BIND_DEFAULT_SYMBOL(foo, 1.9);
+ *
+ */
+#define VERSION_SYMBOL(b, e, v) __asm__(".symver " SA(b) SA(e) ", "SA(b)"@DPDK_"SA(v))
+#define BASE_SYMBOL(b, n) __asm__(".symver " SA(n) ", "SA(b)"@")
+#define BIND_DEFAULT_SYMBOL(b, v) __asm__(".symver " SA(b) ", "SA(b)"@@DPDK_"SA(v))
+#define __vsym __attribute__((used))
+
+#else
+/*
+ * No symbol versioning in use
+ */
+#define VERSION_SYMBOL(b, e, v)
+#define __vsym
+#define BASE_SYMBOL(b, n)
+#define BIND_DEFAULT_SYMBOL(b, v)
+
+/*
+ * RTE_BUILD_SHARED_LIB
+ */
+#endif
+
+
+#endif /* _RTE_COMPAT_H_ */
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 81bf8e1..cbd439b 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -40,10 +40,17 @@ VPATH += $(SRCDIR)
 
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 LIB := $(patsubst %.a,%.so,$(LIB))
+
+CPU_LDFLAGS += --version-script=$(EXPORT_MAP)
+
 endif
 
+
 _BUILD = $(LIB)
-_INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) $(RTE_OUTPUT)/lib/$(LIB)
+_INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y)
+ifneq ($(LIB),)
+_INSTALL += $(RTE_OUTPUT)/lib/$(LIB)
+endif
 _CLEAN = doclean
 
 .PHONY: all
-- 
1.9.3

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH 4/4] docs: Add ABI documentation
  2014-12-20 21:01  4% [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
  2014-12-20 21:01  4% ` [dpdk-dev] [PATCH 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
  2014-12-20 21:01  7% ` [dpdk-dev] [PATCH 3/4] Add library version extenstion Neil Horman
@ 2014-12-20 21:01 23% ` Neil Horman
  2014-12-22 20:24  4% ` [dpdk-dev] [PATCH v2 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
                   ` (9 subsequent siblings)
  12 siblings, 0 replies; 200+ results
From: Neil Horman @ 2014-12-20 21:01 UTC (permalink / raw)
  To: dev

Adding a document describing rudimentary ABI policy and adding notice space for
any deprecation announcements

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
---
 doc/abi.txt | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)
 create mode 100644 doc/abi.txt

diff --git a/doc/abi.txt b/doc/abi.txt
new file mode 100644
index 0000000..b6dcc7d
--- /dev/null
+++ b/doc/abi.txt
@@ -0,0 +1,17 @@
+ABI policy:
+	ABI versions are set at the time of major release labeling, and ABI may
+change multiple times between the last labeling and the HEAD label of the git
+tree without warning
+
+	ABI versions, once released are available until such time as their
+deprecation has been noted here for at least one major release cycle, after it
+has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
+remove it is made during the development of DPDK 1.9.  The decision will be
+recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
+1.10 ships.
+
+	ABI versions may be deprecated in whole, or in part as needed by a given
+update.
+
+Deprecation Notices:
+
-- 
1.9.3

^ permalink raw reply	[relevance 23%]

* [dpdk-dev] [PATCH 3/4] Add library version extenstion
  2014-12-20 21:01  4% [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
  2014-12-20 21:01  4% ` [dpdk-dev] [PATCH 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
@ 2014-12-20 21:01  7% ` Neil Horman
  2014-12-20 21:01 23% ` [dpdk-dev] [PATCH 4/4] docs: Add ABI documentation Neil Horman
                   ` (10 subsequent siblings)
  12 siblings, 0 replies; 200+ results
From: Neil Horman @ 2014-12-20 21:01 UTC (permalink / raw)
  To: dev

To differentiate libraries that break ABI, we add a library version number
suffix to the library, which must be incremented when a given libraries ABI is
broken.  This patch enforces that addition, sets the initial abi soname
extension to 1 for each library and creates a symlink to the base SONAME so that
the test applications will link properly.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
---
 lib/librte_acl/Makefile              |  2 ++
 lib/librte_cfgfile/Makefile          |  2 ++
 lib/librte_cmdline/Makefile          |  2 ++
 lib/librte_compat/Makefile           |  2 ++
 lib/librte_distributor/Makefile      |  2 ++
 lib/librte_eal/bsdapp/eal/Makefile   |  2 ++
 lib/librte_eal/linuxapp/eal/Makefile |  2 ++
 lib/librte_ether/Makefile            |  2 ++
 lib/librte_hash/Makefile             |  2 ++
 lib/librte_ip_frag/Makefile          |  2 ++
 lib/librte_ivshmem/Makefile          |  2 ++
 lib/librte_kni/Makefile              |  2 ++
 lib/librte_kvargs/Makefile           |  2 ++
 lib/librte_lpm/Makefile              |  2 ++
 lib/librte_malloc/Makefile           |  2 ++
 lib/librte_mbuf/Makefile             |  2 ++
 lib/librte_mempool/Makefile          |  2 ++
 lib/librte_meter/Makefile            |  2 ++
 lib/librte_pipeline/Makefile         |  2 ++
 lib/librte_pmd_af_packet/Makefile    |  2 ++
 lib/librte_pmd_bond/Makefile         |  2 ++
 lib/librte_pmd_e1000/Makefile        |  2 ++
 lib/librte_pmd_enic/Makefile         |  2 ++
 lib/librte_pmd_i40e/Makefile         |  2 ++
 lib/librte_pmd_ixgbe/Makefile        |  2 ++
 lib/librte_pmd_pcap/Makefile         |  2 ++
 lib/librte_pmd_ring/Makefile         |  2 ++
 lib/librte_pmd_virtio/Makefile       |  2 ++
 lib/librte_pmd_vmxnet3/Makefile      |  2 ++
 lib/librte_pmd_xenvirt/Makefile      |  2 ++
 lib/librte_port/Makefile             |  2 ++
 lib/librte_power/Makefile            |  2 ++
 lib/librte_ring/Makefile             |  2 ++
 lib/librte_sched/Makefile            |  2 ++
 lib/librte_table/Makefile            |  2 ++
 lib/librte_timer/Makefile            |  2 ++
 lib/librte_vhost/Makefile            |  2 ++
 mk/rte.lib.mk                        | 12 +++++++++---
 38 files changed, 83 insertions(+), 3 deletions(-)

diff --git a/lib/librte_acl/Makefile b/lib/librte_acl/Makefile
index 1f96645..4db403b 100644
--- a/lib/librte_acl/Makefile
+++ b/lib/librte_acl/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_acl/rte_acl_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_ACL) += tb_mem.c
 
diff --git a/lib/librte_cfgfile/Makefile b/lib/librte_cfgfile/Makefile
index e655098..1c81579 100644
--- a/lib/librte_cfgfile/Makefile
+++ b/lib/librte_cfgfile/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_cfgfile/rte_cfgfile_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_cmdline/Makefile b/lib/librte_cmdline/Makefile
index 1a47173..b0ab5b6 100644
--- a/lib/librte_cmdline/Makefile
+++ b/lib/librte_cmdline/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_cmdline/rte_cmdline_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) := cmdline.c
 SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_cirbuf.c
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
index 3415c7b..a23d349 100644
--- a/lib/librte_compat/Makefile
+++ b/lib/librte_compat/Makefile
@@ -32,6 +32,8 @@
 include $(RTE_SDK)/mk/rte.vars.mk
 
 
+LIBABIVER := 1
+
 # install includes
 SYMLINK-y-include := rte_compat.h
 
diff --git a/lib/librte_distributor/Makefile b/lib/librte_distributor/Makefile
index 97d8bbb..12d9df1 100644
--- a/lib/librte_distributor/Makefile
+++ b/lib/librte_distributor/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_distributor/rte_distributor_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor.c
 
diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index b28a8b7..664698a 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -48,6 +48,8 @@ CFLAGS += $(WERROR_FLAGS) -O3
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_eal/bsdapp/eal/rte_eal_version.map
 
+LIBABIVER := 1
+
 # specific to linuxapp exec-env
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) := eal.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_memory.c
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index 4f1b11f..1eacf4a 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -35,6 +35,8 @@ LIB = librte_eal.a
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_eal/linuxapp/eal/rte_eal_version.map
 
+LIBABIVER := 1
+
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
 CFLAGS += -I$(SRCDIR)/include
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index 6250f4d..8e6d253 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_ether/rte_ether_version.map
 
+LIBABIVER := 1
+
 SRCS-y += rte_ethdev.c
 
 #
diff --git a/lib/librte_hash/Makefile b/lib/librte_hash/Makefile
index a449ec2..17778ba 100644
--- a/lib/librte_hash/Makefile
+++ b/lib/librte_hash/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_hash/rte_hash_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) := rte_hash.c
 SRCS-$(CONFIG_RTE_LIBRTE_HASH) += rte_fbk_hash.c
diff --git a/lib/librte_ip_frag/Makefile b/lib/librte_ip_frag/Makefile
index fba05d0..43313e4 100644
--- a/lib/librte_ip_frag/Makefile
+++ b/lib/librte_ip_frag/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_ip_frag/rte_ipfrag_version.map
 
+LIBABIVER := 1
+
 #source files
 ifeq ($(CONFIG_RTE_MBUF_REFCNT),y)
 SRCS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += rte_ipv4_fragmentation.c
diff --git a/lib/librte_ivshmem/Makefile b/lib/librte_ivshmem/Makefile
index be6f21a..7c8dc17 100644
--- a/lib/librte_ivshmem/Makefile
+++ b/lib/librte_ivshmem/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAPS := $(RTE_SDK)/lib/librte_ivshmem/rte_ivshmem_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_IVSHMEM) := rte_ivshmem.c
 
diff --git a/lib/librte_kni/Makefile b/lib/librte_kni/Makefile
index c119fc1..59abd85 100644
--- a/lib/librte_kni/Makefile
+++ b/lib/librte_kni/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_kni/rte_kni_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KNI) := rte_kni.c
 
diff --git a/lib/librte_kvargs/Makefile b/lib/librte_kvargs/Makefile
index 83a42b1..10713db 100644
--- a/lib/librte_kvargs/Makefile
+++ b/lib/librte_kvargs/Makefile
@@ -40,6 +40,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_kvargs/rte_kvargs_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_KVARGS) := rte_kvargs.c
 
diff --git a/lib/librte_lpm/Makefile b/lib/librte_lpm/Makefile
index 05de8d9..c99bfbd 100644
--- a/lib/librte_lpm/Makefile
+++ b/lib/librte_lpm/Makefile
@@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_lpm/rte_lpm_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_LPM) := rte_lpm.c rte_lpm6.c
 
diff --git a/lib/librte_malloc/Makefile b/lib/librte_malloc/Makefile
index 1a5c288..3bb7a99 100644
--- a/lib/librte_malloc/Makefile
+++ b/lib/librte_malloc/Makefile
@@ -34,6 +34,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_malloc.a
 
+LIBABIVER := 1
+
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_malloc/rte_malloc_version.map
diff --git a/lib/librte_mbuf/Makefile b/lib/librte_mbuf/Makefile
index 5cd4941..3cf94d1 100644
--- a/lib/librte_mbuf/Makefile
+++ b/lib/librte_mbuf/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_mbuf/rte_mbuf_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MBUF) := rte_mbuf.c
 
diff --git a/lib/librte_mempool/Makefile b/lib/librte_mempool/Makefile
index 07b5b4e..2c2a6e8 100644
--- a/lib/librte_mempool/Makefile
+++ b/lib/librte_mempool/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_mempool/rte_mempool_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) +=  rte_mempool.c
 ifeq ($(CONFIG_RTE_LIBRTE_XEN_DOM0),y)
diff --git a/lib/librte_meter/Makefile b/lib/librte_meter/Makefile
index 0778690..f58822e 100644
--- a/lib/librte_meter/Makefile
+++ b/lib/librte_meter/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_meter/rte_meter_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pipeline/Makefile b/lib/librte_pipeline/Makefile
index 5465d00..df44f51 100644
--- a/lib/librte_pipeline/Makefile
+++ b/lib/librte_pipeline/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_pipeline/rte_pipeline_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_af_packet/Makefile b/lib/librte_pmd_af_packet/Makefile
index 41bb2cd..bd7d091 100644
--- a/lib/librte_pmd_af_packet/Makefile
+++ b/lib/librte_pmd_af_packet/Makefile
@@ -38,6 +38,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 #
 LIB = librte_pmd_af_packet.a
 
+LIBABIVER := 1
+
 EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_af_packet/rte_pmd_af_packet_version.map
 
 CFLAGS += -O3
diff --git a/lib/librte_pmd_bond/Makefile b/lib/librte_pmd_bond/Makefile
index 7376018..974cb65 100644
--- a/lib/librte_pmd_bond/Makefile
+++ b/lib/librte_pmd_bond/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_bond/rte_eth_bond_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_e1000/Makefile b/lib/librte_pmd_e1000/Makefile
index e225bfe..a5e3b66 100644
--- a/lib/librte_pmd_e1000/Makefile
+++ b/lib/librte_pmd_e1000/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_e1000/rte_pmd_e1000_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_enic/Makefile b/lib/librte_pmd_enic/Makefile
index 6359ac0..3238d85 100644
--- a/lib/librte_pmd_enic/Makefile
+++ b/lib/librte_pmd_enic/Makefile
@@ -37,6 +37,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 #
 LIB = librte_pmd_enic.a
 
+LIBABIVER := 1
+
 EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_enic/rte_pmd_enic_version.map
 
 CFLAGS += -I$(RTE_SDK)/lib/librte_pmd_enic/vnic/
diff --git a/lib/librte_pmd_i40e/Makefile b/lib/librte_pmd_i40e/Makefile
index 9c26ab6..e4f17ec 100644
--- a/lib/librte_pmd_i40e/Makefile
+++ b/lib/librte_pmd_i40e/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_i40e/rte_pmd_i40e_version.map
 
+LIBABIVER := 1
+
 #
 # Add extra flags for base driver files (also known as shared code)
 # to disable warnings
diff --git a/lib/librte_pmd_ixgbe/Makefile b/lib/librte_pmd_ixgbe/Makefile
index c9e8665..a38685b 100644
--- a/lib/librte_pmd_ixgbe/Makefile
+++ b/lib/librte_pmd_ixgbe/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map
 
+LIBABIVER := 1
+
 ifeq ($(CC), icc)
 #
 # CFLAGS for icc
diff --git a/lib/librte_pmd_pcap/Makefile b/lib/librte_pmd_pcap/Makefile
index fff5572..8f05c2c 100644
--- a/lib/librte_pmd_pcap/Makefile
+++ b/lib/librte_pmd_pcap/Makefile
@@ -42,6 +42,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_pcap/rte_pmd_pcap_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_ring/Makefile b/lib/librte_pmd_ring/Makefile
index 25ad27f..24c57fc 100644
--- a/lib/librte_pmd_ring/Makefile
+++ b/lib/librte_pmd_ring/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_ring/rte_eth_ring_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_virtio/Makefile b/lib/librte_pmd_virtio/Makefile
index bf51bd9..d0bec84 100644
--- a/lib/librte_pmd_virtio/Makefile
+++ b/lib/librte_pmd_virtio/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_virtio/rte_pmd_virtio_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_vmxnet3/Makefile b/lib/librte_pmd_vmxnet3/Makefile
index e5a1c6b..2b418f4 100644
--- a/lib/librte_pmd_vmxnet3/Makefile
+++ b/lib/librte_pmd_vmxnet3/Makefile
@@ -68,6 +68,8 @@ VPATH += $(RTE_SDK)/lib/librte_pmd_vmxnet3/vmxnet3
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_pmd_xenvirt/Makefile b/lib/librte_pmd_xenvirt/Makefile
index 0a08b1b..6132c1c 100644
--- a/lib/librte_pmd_xenvirt/Makefile
+++ b/lib/librte_pmd_xenvirt/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_port/Makefile b/lib/librte_port/Makefile
index f01a12c..98f9eec 100644
--- a/lib/librte_port/Makefile
+++ b/lib/librte_port/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_port/rte_port_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_power/Makefile b/lib/librte_power/Makefile
index faf73a5..f96330a 100644
--- a/lib/librte_power/Makefile
+++ b/lib/librte_power/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_power/rte_power_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) := rte_power.c rte_power_acpi_cpufreq.c
 SRCS-$(CONFIG_RTE_LIBRTE_POWER) += rte_power_kvm_vm.c guest_channel.c
diff --git a/lib/librte_ring/Makefile b/lib/librte_ring/Makefile
index 0adaa00..fa697ea 100644
--- a/lib/librte_ring/Makefile
+++ b/lib/librte_ring/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_ring/rte_ring_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_RING) := rte_ring.c
 
diff --git a/lib/librte_sched/Makefile b/lib/librte_sched/Makefile
index 205fb7a..1a54bf9 100644
--- a/lib/librte_sched/Makefile
+++ b/lib/librte_sched/Makefile
@@ -43,6 +43,8 @@ CFLAGS_rte_red.o := -D_GNU_SOURCE
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_sched/rte_sched_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_table/Makefile b/lib/librte_table/Makefile
index 5b54acc..29b768c 100644
--- a/lib/librte_table/Makefile
+++ b/lib/librte_table/Makefile
@@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_table/rte_table_version.map
 
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
diff --git a/lib/librte_timer/Makefile b/lib/librte_timer/Makefile
index f703e5f..01772c7 100644
--- a/lib/librte_timer/Makefile
+++ b/lib/librte_timer/Makefile
@@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := $(RTE_SDK)/lib/librte_timer/rte_timer_version.map
 
+LIBABIVER := 1
+
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_TIMER) := rte_timer.c
 
diff --git a/lib/librte_vhost/Makefile b/lib/librte_vhost/Makefile
index 7f8c5dc..2747070 100644
--- a/lib/librte_vhost/Makefile
+++ b/lib/librte_vhost/Makefile
@@ -34,6 +34,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
 # library name
 LIB = librte_vhost.a
 
+LIBABIVER := 1
+
 EXPORT_MAP := $(RTE_SDK)/lib/librte_vhost/rte_vhost_version.map
 
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -D_FILE_OFFSET_BITS=64 -lfuse
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 2299cbe..e0a1863 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -37,10 +37,8 @@ include $(RTE_SDK)/mk/internal/rte.depdirs-pre.mk
 
 # VPATH contains at least SRCDIR
 VPATH += $(SRCDIR)
-
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
-LIB := $(patsubst %.a,%.so,$(LIB))
-
+LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB))
 CPU_LDFLAGS += --version-script=$(EXPORT_MAP)
 
 endif
@@ -63,6 +61,7 @@ build: _postbuild
 
 exe2cmd = $(strip $(call dotfile,$(patsubst %,%.cmd,$(1))))
 
+
 ifeq ($(LINK_USING_CC),1)
 # Override the definition of LD here, since we're linking with CC
 LD := $(CC) $(CPU_CFLAGS)
@@ -113,6 +112,10 @@ lib_dir = [ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib;
 #
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
+ifeq ($(LIBABIVER),)
+	@echo "Must Specify a $(LIB) ABI version"
+	@exit 1
+endif
 	@[ -d $(dir $@) ] || mkdir -p $(dir $@)
 	$(if $(D),\
 		@echo -n "$< -> $@ " ; \
@@ -126,6 +129,7 @@ $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
 		$(depfile_missing),\
 		$(depfile_newer)),\
 		$(O_TO_S_DO))
+
 ifeq ($(RTE_BUILD_COMBINE_LIBS),y)
 	$(if $(or \
         $(file_missing),\
@@ -163,10 +167,12 @@ endif
 # install lib in $(RTE_OUTPUT)/lib
 #
 $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
+	$(eval LIBSONAME := $(basename $(LIB)))
 	@echo "  INSTALL-LIB $(LIB)"
 	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
 ifneq ($(LIB),)
 	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
+	$(Q)ln -s -f $(RTE_OUTPUT)/lib/$(LIB) $(RTE_OUTPUT)/lib/$(LIBSONAME)
 endif
 
 #
-- 
1.9.3

^ permalink raw reply	[relevance 7%]

* [dpdk-dev] [PATCH 1/4] compat: Add infrastructure to support symbol versioning
  2014-12-20 21:01  4% [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
@ 2014-12-20 21:01  4% ` Neil Horman
  2014-12-20 21:01  7% ` [dpdk-dev] [PATCH 3/4] Add library version extenstion Neil Horman
                   ` (11 subsequent siblings)
  12 siblings, 0 replies; 200+ results
From: Neil Horman @ 2014-12-20 21:01 UTC (permalink / raw)
  To: dev

Add initial pass header files to support symbol versioning.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
CC: "Gonzalez Monroy, Sergio" <sergio.gonzalez.monroy@intel.com>
---
 lib/Makefile                   |  1 +
 lib/librte_compat/Makefile     | 38 +++++++++++++++++
 lib/librte_compat/rte_compat.h | 96 ++++++++++++++++++++++++++++++++++++++++++
 mk/rte.lib.mk                  |  6 +++
 4 files changed, 141 insertions(+)
 create mode 100644 lib/librte_compat/Makefile
 create mode 100644 lib/librte_compat/rte_compat.h

diff --git a/lib/Makefile b/lib/Makefile
index 0ffc982..d617d81 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -31,6 +31,7 @@
 
 include $(RTE_SDK)/mk/rte.vars.mk
 
+DIRS-y += librte_compat
 DIRS-$(CONFIG_RTE_LIBRTE_EAL) += librte_eal
 DIRS-$(CONFIG_RTE_LIBRTE_MALLOC) += librte_malloc
 DIRS-$(CONFIG_RTE_LIBRTE_RING) += librte_ring
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
new file mode 100644
index 0000000..3415c7b
--- /dev/null
+++ b/lib/librte_compat/Makefile
@@ -0,0 +1,38 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+
+# install includes
+SYMLINK-y-include := rte_compat.h
+
+include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/lib/librte_compat/rte_compat.h b/lib/librte_compat/rte_compat.h
new file mode 100644
index 0000000..d99e362
--- /dev/null
+++ b/lib/librte_compat/rte_compat.h
@@ -0,0 +1,96 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _RTE_COMPAT_H_
+#define _RTE_COMPAT_H_
+
+/*
+ * This is just a stringification macro for use below.
+ */
+#define SA(x) #x
+
+#ifdef RTE_BUILD_SHARED_LIB
+
+/*
+ * Provides backwards compatibility when updating exported functions.
+ * When a symol is exported from a library to provide an API, it also provides a
+ * calling convention (ABI) that is embodied in its name, return type,
+ * arguments, etc.  On occasion that function may need to change to accomodate
+ * new functionality, behavior, etc.  When that occurs, it is desireable to
+ * allow for backwards compatibility for a time with older binaries that are
+ * dynamically linked to the dpdk.  to support that the __vsym and
+ * VERSION_SYMBOL macros are created.  They, in conjunction with the
+ * <library>_version.map file for a given library allow for multiple versions of
+ * a symbol to exist in a shared library so that older binaries need not be
+ * immediately recompiled. Their use is outlined in the following example:
+ * Assumptions: DPDK 1.(X) contains a function int foo(char *string)
+ *              DPDK 1.(X+1) needs to change foo to be int foo(int index)
+ *
+ * To accomplish this:
+ * 1) Edit lib/<library>/library_version.map to add a DPDK_1.(X+1) node, in which
+ * foo is exported as a global symbol.
+ *
+ * 2) rename the existing function int foo(char *string) to 
+ * 	int __vsym foo_v18(char *string)
+ *
+ * 3) Add this macro immediately below the function
+ * 	VERSION_SYMBOL(foo, _v18, 1.8);
+ *
+ * 4) Implement a new version of foo.
+ * 	char foo(int value, int otherval) { ...}
+ *
+ * 5) Mark the newest version as the default version
+ * 	BIND_DEFAULT_SYMBOL(foo, 1.9);
+ *
+ */
+#define VERSION_SYMBOL(b, e, v) __asm__(".symver " SA(b) SA(e) ", "SA(b)"@DPDK_"SA(v))
+#define BASE_SYMBOL(b, n) __asm__(".symver " SA(n) ", "SA(b)"@")
+#define BIND_DEFAULT_SYMBOL(b, v) __asm__(".symver " SA(b) ", "SA(b)"@@DPDK_"SA(v))
+#define __vsym __attribute__((used))
+
+#else
+/*
+ * No symbol versioning in use
+ */
+#define VERSION_SYMBOL(b, e, v)
+#define __vsym
+#define BASE_SYMBOL(b, n)
+#define BIND_DEFAULT_SYMBOL(b, v)
+
+/*
+ * RTE_BUILD_SHARED_LIB
+ */
+#endif
+
+
+#endif /* _RTE_COMPAT_H_ */
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 81bf8e1..2299cbe 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -40,8 +40,12 @@ VPATH += $(SRCDIR)
 
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 LIB := $(patsubst %.a,%.so,$(LIB))
+
+CPU_LDFLAGS += --version-script=$(EXPORT_MAP)
+
 endif
 
+
 _BUILD = $(LIB)
 _INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) $(RTE_OUTPUT)/lib/$(LIB)
 _CLEAN = doclean
@@ -161,7 +165,9 @@ endif
 $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
 	@echo "  INSTALL-LIB $(LIB)"
 	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
+ifneq ($(LIB),)
 	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
+endif
 
 #
 # Clean all generated files
-- 
1.9.3

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility
@ 2014-12-20 21:01  4% Neil Horman
  2014-12-20 21:01  4% ` [dpdk-dev] [PATCH 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
                   ` (12 more replies)
  0 siblings, 13 replies; 200+ results
From: Neil Horman @ 2014-12-20 21:01 UTC (permalink / raw)
  To: dev

GI: [PATCH 1/4] compat: Add infrastructure to support symbol versioninBI
develops and changes quickly, which makes it difficult for
applications to keep up with the latest version of the library, especially when
it (the DPDK) is built as a set of shared objects, as applications may be built
against an older version of the library.

To mitigate this, this patch series introduces support for library and symbol
versioning when the DPDK is built as a DSO.  Specifically, it does 4 things:

1) Adds initial support for library versioning.  Each library now has a version
map that explicitly calls out what symbols are exported to using applications,
and assigns version(s) to them

2) Adds support macros so that when libraries create incompatible ABI's,
multiple versions may be supported so that applications linked against older
DPDK releases can continue to function

3) Adds library soname versioning suffixes so that when ABI's must be broken in
a fashion that requires a rebuild of older applications, they will break at load
time, rather than cause unexpected issues at run time.

4) Adds documentation for ABI policy, and provides space to document deprecated
ABI versions, so that applications might be warned of impending changes.

With these elements in place the DPDK has some support to allow for the extended
maintenence of older API's while still allowing the freedom to develop new and
improved API's.

Implementing this feature will require some additional effort on the part of
developers and reviewers.  When reviewing patches, must be checked against
existing exports to ensure that the function prototypes are not changing.  If
they are, the versioning macros must be used, and the library export map should
be updated to reflect the new version of the function.

When data structures change, if those structures are application accessible,
apis that accept or return instances of those data structures should have new
versions created so that users of the old data structure version might co-exist
at the same time.

Note it was requested that this series be delayed until DPDK 2.0, so this is a
repost, now that DPDK 1.8 has been tagged.

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
CC: "Robert Love" <robert.w.love@intel.com>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] versioning and maintenance
  2014-11-21 13:23  4%             ` Thomas Monjalon
@ 2014-11-21 20:17  4%               ` Neil Horman
  0 siblings, 0 replies; 200+ results
From: Neil Horman @ 2014-11-21 20:17 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Fri, Nov 21, 2014 at 02:23:15PM +0100, Thomas Monjalon wrote:
> 2014-11-20 20:05, Neil Horman:
> > On Thu, Nov 20, 2014 at 10:08:25PM +0100, Thomas Monjalon wrote:
> > > 2014-11-20 13:25, Neil Horman:
> > > > On Thu, Nov 20, 2014 at 06:09:10PM +0100, Thomas Monjalon wrote:
> > > > > 2014-11-19 10:13, Neil Horman:
> > > > > > On Wed, Nov 19, 2014 at 11:35:08AM +0000, Bruce Richardson wrote:
> > > > > > > On Wed, Nov 19, 2014 at 12:22:14PM +0100, Thomas Monjalon wrote:
> > > > > > > > Following the discussion we had with Neil during the conference call,
> > > > > > > > I suggest this plan, starting with the next release (2.0):
> > > > > > > > 	- add version numbers to libraries
> > > > > > > > 	- add version numbers to functions inside .map files
> > > > > > > > 	- create a git tree dedicated to maintenance and API compatibility
> > > > > > > > 
> > > > > > > > It means these version numbers must be incremented when breaking the API.
> > > > > > > > Though the old code paths will be maintained and tested separately by volunteers.
> > > > > > > > A mailing list for maintenance purpose could be created if needed.
> > > > > > > >
> > > > > > > Hi Thomas,
> > > > > > > 
> > > > > > > I really think that the versionning is best handled inside the main repository
> > > > > > > itself. Given that the proposed deprecation policy is over two releases i.e. an
> > > > > > > API is marked deprecated in release X and then removed in X+1, I don't see the
> > > > > > > maintaining of old code paths to be particularly onerous.
> > > > > > > 
> > > > > > > /Bruce
> > > > > > 
> > > > > > I agree with Bruce, even if it is on occasion an added workload, its not the
> > > > > > sort of thing that can or should be placed on an alternate developer.  Backwards
> > > > > > compatibility is the sort of thing that has to be on the mind of the developer
> > > > > > when modifying an API, and on the mind of the reviewer when reviewing code.  To
> > > > > > shunt that responsibility elsewhere invites the opportunity for backwards
> > > > > > compatibilty to be a second class citizen who's goal will never be reached,
> > > > > > because developers instituting ABI changes will never care about the
> > > > > > consequences, and anyone worrying about backwards compatibility will always be
> > > > > > playing catch up, possibly allowing ABI breaks to slip through.
> > > > > > 
> > > > > > Neil
> > > > >  
> > > > > Before taking a decision, we should detail every concern.
> > > > > 
> > > > > 1/
> > > > > Currently there are not a lot of API refactoring because DPDK is well tailored
> > > > > for x86 and Intel NICs. But we are seeing that new CPU and new NICs to support
> > > > > would require some adaptations.
> > > > > 
> > > > Yes, you're absolutely right here.  I had hoped that, during my presentation
> > > > that this would happen occasionaly, and that we would need to deal with it.
> > > > What I think you are implying here (correct me if I'm wrong), is that you would
> > > > advocate that we wait to introduce ABI versioning until after such refactoring
> > > > is, for lack of a better term "complete".  The problem here is that, software
> > > > that is growing in user base is never "complete".  What you are effectively
> > > > saying is that you want to wait until the API is in a state in which no (or
> > > > almost no) more changes are required, then fixate it.  Thats quite simply never
> > > > going to happen.  And if it does, it obviates the need for versioning at all.
> > > 
> > > I agree Neil. This point is not about how long we should wait but how the
> > > overhead could be estimate for coming releases.
> > > 
> > Well, I understand the desire, but I'm not sure how it can be accomplished.  For
> > a given release, the overhead will be dependent on two factors:
> > 
> > 1) The number off ABI changes in a given release
> > 
> > 2) The extent of the ABI changes that were made.
> > 
> > If we have a way to predict those, then we can estimate the overhead, but
> > without that information, you're kinda stuck.  That said, if we all concur that
> > this is a necessecary effort to undertake, then the overhead is, not overly
> > important.  Whats more important is providing enough time to alot enough time to
> > do the work for a given project.  That is to say, when undertaking a large
> > refactoring, or other project that promises to make significant ABI changes,
> > that the developer needs to factor in time to design an implement backwards
> > compatibility.  Put another way, if the developer does their job right, and
> > takes backwards compatibility seriously, the overhead to you as a maintainer is
> > nil.  The onus to handle this extra effort needs to be on the developer.
> > 
> > > > > 2/
> > > > > I'm curious to know how you would handle a big change like the recent mbuf rework.
> > > > > Should we duplicate the structure and all the functions using mbuf?
> > > > 
> > > > Several ways, what you suggest above is one way, although thats what I would
> > > > consider to be a pessimal case.  Ideally such large changes are extreemely rare
> > > > (a search of the git history I think confirms this).  Much more common are
> > > > small, limited changes to various API's for which providing multiple versions of
> > > > a function is a much more reasonable approach.
> > > > 
> > > > In the event that we do decide to do a refactor that is so far reaching that we
> > > > simply don't feel like multi-versioning is feasible, the recourse is then to
> > > > deprecate the old API, publish that information on the deprecation schedule,
> > > > wait for a release, then replace it wholesale.  When the API is released, we
> > > > bump the DSO version number.  Note the versioning policy never guarantees that
> > > > backwards compatibility will always be available, nor does it stipulate that a
> > > > newer version of the API is available prior to removing the old one. The goal
> > > > here is to give distributors and application vendors advanced notice of ABI
> > > > breaking changes so that they can adapt appropriately before they are caught off
> > > > guard.  If the new ABI can't be packaged alongside the old, then so be it,
> > > > downstream vendors will have to use the upstream git head to test and validate,
> > > > rather than a newer distribution release
> > > 
> > > Seems reasonable.
> > > 
> > > > Ideally though, that shouldn't happen, because it causes downstream headaches,
> > > > and we would really like to avoid that.  Thats why I feel its so important to
> > > > keep this work in the main tree.  If we segregate it to a separate location it
> > > > will make it all to easy for developers to ignore these needs and just assume we
> > > > constantly drop old ABI versions without providing backwards compatibility.
> > > > 
> > > > > 3/
> > > > > Should we add new fields at the end of its structure to avoid ABI breaking?
> > > > > 
> > > > In the common case yes, this usually avoids ABI breakage, though it can't always
> > > > be relied upon (e.g. cases where structures are statically allocated by an
> > > > application).  And then there are patches that attempt to reduce memory usage
> > > > and increase performance by re-arranging structures.  In those cases we need to
> > > > do ABI versioning or announce/delay/release as noted above, though again, that
> > > > should really be avoided if possible.
> > > 
> > > So there is no hope of having fields logically sorted.
> > > Not a major problem but we have to know it. And it should probably be
> > > documented if we choose this way.
> > > 
> > Sure, though I'm not sure I agree with the statement above.  Having fields
> > logically sorted seems like it should be a forgone  conclusion in that the
> > developer should have laid those fields out in some semblance of order in the
> > first place.  If a large data structure re-ordering is taking place such that
> > structure fields are getting rearranged, that in my mind is part of a large
> > refactoring for which the entire API that is affected by those data structures
> > must have a new version created to provide backward compatibility, or in the
> > extreeme case, we may need to preform a warn and deprecate/exchange operation as
> > noted previously, though again, that is a Nuclear option.
> 
> Just to illustrate my thought:
> Let's imagine this struct {
> 	fish_name;
> 	fish_taste;
> 	vegetables_name;
> }
> When adding the new field "fish_cooking", we'll add it at the end to avoid ABI break.
> struct {
> 	fish_name;
> 	fish_taste;
> 	vegetables_name;
> 	fish_cooking;
> }
You're right, asthetically the above is displeasing, which is unfortunate.  The
decision we have to make is twofold:
1) Are asthetics more important that backwards compatibility (theres also a
correlary here, which is "are the performance/space gains acheived by
reorganizing the above structure sufficent to warant an ABI breakage)
and 
2) How can we mitigate the ABI impact if the answer to the above is "yes"

I think the answer to (1) is going to be situationally specific.  Generally,
Asthetics aren't worth breaking ABI, but performance gains might be, if they're
large enough.  We'll have to wait for an example case to see where exactly we
draw that line

Assuming the answer to (2) is yes, then we need to know how to mitigate it.
Ideally what we would do is create a secondary structure like so:

struct1 {
	fish_name;
	fish_taste;
	veg_name;
};

struct2 {
	fish_name;
	fish_taste;
	fish_cook;
	veg_name;
};

and then we would version the API calls that use struct1 to instead accept
struct2. So if a function used struct1 we would have:

static void foo_v1(struct1 *a) {
	struct2 b;
	b.fish_name = a->name;
	b.fish_taste = a->fish_taste;
	b.veg_name = a->veg_name;
	a-fish_cook = SOME_VALUE;
	foo_v2(&b);
}
VERSION_SYMBOL(foo, v1, 1.8);

static void foo_v2(struct2 *a) {
	...
	if (a->fish_cook == SOME_VALUE)
		/* we know this is from the old api version */
	...
}
VERSION_SYMBOL(foo, v2, 1.9);

That would be repeated of course for every function that used struct1.  Then we
can decide on a deprecation schedule, which might be the next release after this
change is published.  Or it might be longer, if the decision is that this change
is easy enough to maintain.

> It's mostly an esthetic/readability consequence.
> Now I'm hungry ;)
> 
I don't think I ever told you, my family and I were in Paris last summer, and
had lunch at this place just south of Notre Dame.  My wife still occasionally
mentions that as the best fish she ever had.  And my 7 year old daughter is
willing to forgo a trip to Disney World to go back :)


> > > > > 4/
> > > > > Developers contribute because they need some changes. So when breaking
> > > > > an API, their application is already ready for the new version.
> > > > > I mean the author of such patch is probably not really motivated to keep ABI
> > > > > compability and duplicate the code path.
> > > > > 
> > > > What?  That doesn't make any sense.  Its our job to enforce this requirement on
> > > > developers during the review cycle.  If you don't feel like we can enforce
> > > > coding requirements on the project, we've already lost.  I agree that an
> > > > application developer submitting a patch for DPDK might not care about ABI
> > > > compatibility because they've already modified their application, but they (and
> > > > we) need to recognize that there are more than just a handful of users of the
> > > > DPDK, some of whom don't participate in this community (i.e. are simply end
> > > > users).  We need to make sure all users needs are met.  Thats the entire point
> > > > of this patch series, to make DPDK available to a wider range of users.
> > > 
> > > Exact. To make it simple, you care about end users and I have to care about
> > > developers motivation. But I perfectly understand the end users needs.
> > > I don't say we cannot enforce coding requirements. I just think it will be
> > > less pleasant.
> > > 
> > I disagree with the assertion that you will loose developers becausee they don't
> > care about compatibility.  You're developer base may change.  This is no
> > different than any other requirement that you place on a developer.  You make
> > all sorts of mandates regarding development (they can't break other older
> > supported cpu architecture, their code has to compile on all configurations,
> > etc).  This is no different.
> > 
> > > > > 5/
> > > > > Intead of simply modifying an API function, it would appear as a whole new
> > > > > function with some differences compared to the old one. Such change is really
> > > > > not convenient to review.
> > > > 
> > > > Um, yes, versioning is the process of creating an additional
> > > > function that closely resembles an older version of the same function, but with
> > > > different arguments and a newer version number.  Thats what it is by defintion,
> > > > and yes, its additional work.  All you're saying here is that, its extra work
> > > > and we shouldn't do it.  I thought I made this clear on the call, its been done
> > > > in thousands of other libraries, but if you just don't want to do it, then you
> > > > should abandon distributions as a way to reach a larger community, but if you
> > > > want to see the DPDK reach a larger community, then this is something that has
> > > > to happen, hard or not.
> > > 
> > > The goal of this discussion is to establish all the implications of this
> > > decision. We expose the facts. No conclusion.
> > > 
> > You haven't exposed a fact, you've asserted an opinion.  Theres is no notion of
> > something being convienient or inconvienient to review in any quantitative way.
> > If facts are your goal, you missed the mark here.
> 
> Maybe you use a tool that I don't know.
> My main material for review is the patch. And I think it's simpler to check an
> one-line change than a duplicated code path. But instead of giving my opinion,
> I must expose what it looks like for a simple example:
> 
> -	void cook_fish()
> +	void cook_fish(oil_bottle)
> 	{
> +		use_oil(oil_bottle);
> 		start_fire();
> 		put_fish();
> 		wait();
> 		stop_fire();
> 	}
> 
> vs
> 
> -	void cook_fish()
> +	void __vsym cook_fish_v1()
> 	{
> 		start_fire();
> 		put_fish();
> 		wait();
> 		stop_fire();
> 	}
> +	VERSION_SYMBOL(cook_fish, _v1, 1);
> +	void cook_fish(oil_bottle)
> +	{
> +		use_oil(oil_bottle);
> +		start_fire();
> +		put_fish();
> +		wait();
> +		stop_fire();
> +	}
> +	BIND_DEFAULT_SYMBOL(cook_fish, 2);
> 

You make a fair point in that, generally speaking less code is easier to review
than more code, but that said, you need to normalize the comparison.  That is to
say, in the example above your first patch adds functionality (i.e. you add a
feature by which you use oil to cook a fish), in the second patch, you not only
add that feature, but allow older code that was already built to continue to
work.  You've not just added complexity, you've added features as well.  Its
like comparing a patch that adds features a and b, and indicating that you
would only accept feature a because you didn't want to review 2 features.  I
think thats important to remember, we're not adding code for the sake of making
our lives more difficult.  We're doing it to fullfill a need that a large group
of potential end users have.
> 

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] versioning and maintenance
  2014-11-21  1:05  4%           ` Neil Horman
@ 2014-11-21 13:23  4%             ` Thomas Monjalon
  2014-11-21 20:17  4%               ` Neil Horman
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2014-11-21 13:23 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

2014-11-20 20:05, Neil Horman:
> On Thu, Nov 20, 2014 at 10:08:25PM +0100, Thomas Monjalon wrote:
> > 2014-11-20 13:25, Neil Horman:
> > > On Thu, Nov 20, 2014 at 06:09:10PM +0100, Thomas Monjalon wrote:
> > > > 2014-11-19 10:13, Neil Horman:
> > > > > On Wed, Nov 19, 2014 at 11:35:08AM +0000, Bruce Richardson wrote:
> > > > > > On Wed, Nov 19, 2014 at 12:22:14PM +0100, Thomas Monjalon wrote:
> > > > > > > Following the discussion we had with Neil during the conference call,
> > > > > > > I suggest this plan, starting with the next release (2.0):
> > > > > > > 	- add version numbers to libraries
> > > > > > > 	- add version numbers to functions inside .map files
> > > > > > > 	- create a git tree dedicated to maintenance and API compatibility
> > > > > > > 
> > > > > > > It means these version numbers must be incremented when breaking the API.
> > > > > > > Though the old code paths will be maintained and tested separately by volunteers.
> > > > > > > A mailing list for maintenance purpose could be created if needed.
> > > > > > >
> > > > > > Hi Thomas,
> > > > > > 
> > > > > > I really think that the versionning is best handled inside the main repository
> > > > > > itself. Given that the proposed deprecation policy is over two releases i.e. an
> > > > > > API is marked deprecated in release X and then removed in X+1, I don't see the
> > > > > > maintaining of old code paths to be particularly onerous.
> > > > > > 
> > > > > > /Bruce
> > > > > 
> > > > > I agree with Bruce, even if it is on occasion an added workload, its not the
> > > > > sort of thing that can or should be placed on an alternate developer.  Backwards
> > > > > compatibility is the sort of thing that has to be on the mind of the developer
> > > > > when modifying an API, and on the mind of the reviewer when reviewing code.  To
> > > > > shunt that responsibility elsewhere invites the opportunity for backwards
> > > > > compatibilty to be a second class citizen who's goal will never be reached,
> > > > > because developers instituting ABI changes will never care about the
> > > > > consequences, and anyone worrying about backwards compatibility will always be
> > > > > playing catch up, possibly allowing ABI breaks to slip through.
> > > > > 
> > > > > Neil
> > > >  
> > > > Before taking a decision, we should detail every concern.
> > > > 
> > > > 1/
> > > > Currently there are not a lot of API refactoring because DPDK is well tailored
> > > > for x86 and Intel NICs. But we are seeing that new CPU and new NICs to support
> > > > would require some adaptations.
> > > > 
> > > Yes, you're absolutely right here.  I had hoped that, during my presentation
> > > that this would happen occasionaly, and that we would need to deal with it.
> > > What I think you are implying here (correct me if I'm wrong), is that you would
> > > advocate that we wait to introduce ABI versioning until after such refactoring
> > > is, for lack of a better term "complete".  The problem here is that, software
> > > that is growing in user base is never "complete".  What you are effectively
> > > saying is that you want to wait until the API is in a state in which no (or
> > > almost no) more changes are required, then fixate it.  Thats quite simply never
> > > going to happen.  And if it does, it obviates the need for versioning at all.
> > 
> > I agree Neil. This point is not about how long we should wait but how the
> > overhead could be estimate for coming releases.
> > 
> Well, I understand the desire, but I'm not sure how it can be accomplished.  For
> a given release, the overhead will be dependent on two factors:
> 
> 1) The number off ABI changes in a given release
> 
> 2) The extent of the ABI changes that were made.
> 
> If we have a way to predict those, then we can estimate the overhead, but
> without that information, you're kinda stuck.  That said, if we all concur that
> this is a necessecary effort to undertake, then the overhead is, not overly
> important.  Whats more important is providing enough time to alot enough time to
> do the work for a given project.  That is to say, when undertaking a large
> refactoring, or other project that promises to make significant ABI changes,
> that the developer needs to factor in time to design an implement backwards
> compatibility.  Put another way, if the developer does their job right, and
> takes backwards compatibility seriously, the overhead to you as a maintainer is
> nil.  The onus to handle this extra effort needs to be on the developer.
> 
> > > > 2/
> > > > I'm curious to know how you would handle a big change like the recent mbuf rework.
> > > > Should we duplicate the structure and all the functions using mbuf?
> > > 
> > > Several ways, what you suggest above is one way, although thats what I would
> > > consider to be a pessimal case.  Ideally such large changes are extreemely rare
> > > (a search of the git history I think confirms this).  Much more common are
> > > small, limited changes to various API's for which providing multiple versions of
> > > a function is a much more reasonable approach.
> > > 
> > > In the event that we do decide to do a refactor that is so far reaching that we
> > > simply don't feel like multi-versioning is feasible, the recourse is then to
> > > deprecate the old API, publish that information on the deprecation schedule,
> > > wait for a release, then replace it wholesale.  When the API is released, we
> > > bump the DSO version number.  Note the versioning policy never guarantees that
> > > backwards compatibility will always be available, nor does it stipulate that a
> > > newer version of the API is available prior to removing the old one. The goal
> > > here is to give distributors and application vendors advanced notice of ABI
> > > breaking changes so that they can adapt appropriately before they are caught off
> > > guard.  If the new ABI can't be packaged alongside the old, then so be it,
> > > downstream vendors will have to use the upstream git head to test and validate,
> > > rather than a newer distribution release
> > 
> > Seems reasonable.
> > 
> > > Ideally though, that shouldn't happen, because it causes downstream headaches,
> > > and we would really like to avoid that.  Thats why I feel its so important to
> > > keep this work in the main tree.  If we segregate it to a separate location it
> > > will make it all to easy for developers to ignore these needs and just assume we
> > > constantly drop old ABI versions without providing backwards compatibility.
> > > 
> > > > 3/
> > > > Should we add new fields at the end of its structure to avoid ABI breaking?
> > > > 
> > > In the common case yes, this usually avoids ABI breakage, though it can't always
> > > be relied upon (e.g. cases where structures are statically allocated by an
> > > application).  And then there are patches that attempt to reduce memory usage
> > > and increase performance by re-arranging structures.  In those cases we need to
> > > do ABI versioning or announce/delay/release as noted above, though again, that
> > > should really be avoided if possible.
> > 
> > So there is no hope of having fields logically sorted.
> > Not a major problem but we have to know it. And it should probably be
> > documented if we choose this way.
> > 
> Sure, though I'm not sure I agree with the statement above.  Having fields
> logically sorted seems like it should be a forgone  conclusion in that the
> developer should have laid those fields out in some semblance of order in the
> first place.  If a large data structure re-ordering is taking place such that
> structure fields are getting rearranged, that in my mind is part of a large
> refactoring for which the entire API that is affected by those data structures
> must have a new version created to provide backward compatibility, or in the
> extreeme case, we may need to preform a warn and deprecate/exchange operation as
> noted previously, though again, that is a Nuclear option.

Just to illustrate my thought:
Let's imagine this struct {
	fish_name;
	fish_taste;
	vegetables_name;
}
When adding the new field "fish_cooking", we'll add it at the end to avoid ABI break.
struct {
	fish_name;
	fish_taste;
	vegetables_name;
	fish_cooking;
}
So "fish_*" fields won't be grouped.
It's mostly an esthetic/readability consequence.
Now I'm hungry ;)

> > > > 4/
> > > > Developers contribute because they need some changes. So when breaking
> > > > an API, their application is already ready for the new version.
> > > > I mean the author of such patch is probably not really motivated to keep ABI
> > > > compability and duplicate the code path.
> > > > 
> > > What?  That doesn't make any sense.  Its our job to enforce this requirement on
> > > developers during the review cycle.  If you don't feel like we can enforce
> > > coding requirements on the project, we've already lost.  I agree that an
> > > application developer submitting a patch for DPDK might not care about ABI
> > > compatibility because they've already modified their application, but they (and
> > > we) need to recognize that there are more than just a handful of users of the
> > > DPDK, some of whom don't participate in this community (i.e. are simply end
> > > users).  We need to make sure all users needs are met.  Thats the entire point
> > > of this patch series, to make DPDK available to a wider range of users.
> > 
> > Exact. To make it simple, you care about end users and I have to care about
> > developers motivation. But I perfectly understand the end users needs.
> > I don't say we cannot enforce coding requirements. I just think it will be
> > less pleasant.
> > 
> I disagree with the assertion that you will loose developers becausee they don't
> care about compatibility.  You're developer base may change.  This is no
> different than any other requirement that you place on a developer.  You make
> all sorts of mandates regarding development (they can't break other older
> supported cpu architecture, their code has to compile on all configurations,
> etc).  This is no different.
> 
> > > > 5/
> > > > Intead of simply modifying an API function, it would appear as a whole new
> > > > function with some differences compared to the old one. Such change is really
> > > > not convenient to review.
> > > 
> > > Um, yes, versioning is the process of creating an additional
> > > function that closely resembles an older version of the same function, but with
> > > different arguments and a newer version number.  Thats what it is by defintion,
> > > and yes, its additional work.  All you're saying here is that, its extra work
> > > and we shouldn't do it.  I thought I made this clear on the call, its been done
> > > in thousands of other libraries, but if you just don't want to do it, then you
> > > should abandon distributions as a way to reach a larger community, but if you
> > > want to see the DPDK reach a larger community, then this is something that has
> > > to happen, hard or not.
> > 
> > The goal of this discussion is to establish all the implications of this
> > decision. We expose the facts. No conclusion.
> > 
> You haven't exposed a fact, you've asserted an opinion.  Theres is no notion of
> something being convienient or inconvienient to review in any quantitative way.
> If facts are your goal, you missed the mark here.

Maybe you use a tool that I don't know.
My main material for review is the patch. And I think it's simpler to check an
one-line change than a duplicated code path. But instead of giving my opinion,
I must expose what it looks like for a simple example:

-	void cook_fish()
+	void cook_fish(oil_bottle)
	{
+		use_oil(oil_bottle);
		start_fire();
		put_fish();
		wait();
		stop_fire();
	}

vs

-	void cook_fish()
+	void __vsym cook_fish_v1()
	{
		start_fire();
		put_fish();
		wait();
		stop_fire();
	}
+	VERSION_SYMBOL(cook_fish, _v1, 1);
+	void cook_fish(oil_bottle)
+	{
+		use_oil(oil_bottle);
+		start_fire();
+		put_fish();
+		wait();
+		stop_fire();
+	}
+	BIND_DEFAULT_SYMBOL(cook_fish, 2);

> > > > 6/
> > > > Testing ABI compatibility could be tricky. We would need a tool to check it's
> > > > mostly OK. The good place for such a tool is in app/test. It was designed to be
> > > > the unit tests of the API.
> > > 
> > > That seems like a reasonable idea, but I'm not sure what the concern is.  Are
> > > you saying that you need to test every old version of the ABI?  Thats fine.  I
> > > really don't think it has to be as stringent as the latest version testing, but
> > > if you want to, it should be as easy as building the latest release of
> > > the DPDK libraries, and the previous version of the test application.  That will
> > > force the previous version code paths to be used by the test app in the new
> > > library and, if the test fully exercize the api, then you should get pretty good
> > > coverage.
> > 
> > Yes it will provide an unit test to developpers.
> > 
> > > > 7/
> > > > This system would allow application developpers to upgrade DPDK to n+1 without
> > > > rebuilding. But when upgrading to n+2, they should have adapted their
> > > > application to comply with n+1 API (because n will be removed).
> > > 
> > > Only assuming that the old ABI facet was deprecated at the same time the new ABI
> > > was introduced.  Theres nothing that says we have to do that, but I digress.
> > > 
> > > > So this solution offers a delay between the upgrade decision and the
> > > > app work. Note that they could prepare their application before upgrading.
> > > > Anyway, an upgrade should be tested before doing it effectively. The behaviour
> > > > of the application could change and require some adaptations.
> > > > 
> > > Um, yes.  Whats the concern here?
> > 
> > I'm just trying to figure which workflows are eased by progressive ABI deprecation.
> > 
> The workflow for end users, in that they are given an alert prior to a breaking
> change, and the time to fix it, in a way that distributions can manage without
> having to individually (as distributions) undertake that effort on their own, an
> in a way that might one day provide for multi version compatibility.
> 
> > > Downstream application developers need 2
> > > things:
> > > 
> > > A) The ability to note that ABI changes are comming so that they can adapt to
> > > the new version
> > > 
> > > B) Time to do so
> > > 
> > > The deprecation policy, if properly distributed by Distributions provide (A),
> > > and the ABI versioning provides (B).  I.e. they can get all the latest bug fixes
> > > and enhancements while in parallel adapting to the comming new version. Note
> > > ideally this will happen rarely, as having to constantly rebuild/adapt does not
> > > sit will with application vendors who choose to go through distributions, but
> > > we'll do the best we can.
> > 
> > It's an interesting point. In a long-term distribution model like RHEL, do you
> > plan to upgrade DPDK at each new release?
> > 
> Given that you intermix hardware support with bug fixes and new features (which
> granted is not uncommon), yes, I don't see any way to avoid doing so.  We could
> of course cherry pick bug fixes and non-ABI-breaking features, to preserve
> compatibility, but doing so diverges from upstream quickly to the point that it
> becomes extreemely difficult to maintain.  As an example, the one project that
> Red Hat does this on routinely is the kernel, and to do so employs a staff of
> hundreds of engineers.  No distribution wants to do that for every user space
> library that they support.  They/we are willing to do minor fixes in a given
> release with the foreknoweldge that we can drop them when the next relase comes
> out, but beyond that, the logistics just don't scale.
> 
> > > > 8/
> > > > How to handle a change in the implementation of a PMD which severely impact
> > > > the application? Example: an ol_flag was mis-used and the application has
> > > > a workaround to interpret this flag but it's now incompatible with the fix.
> > > > 
> > > We run into this sometimes in Fedora and RHEL, and doesn't require versioning.
> > > The problem you describe is one in which something internal to the library that
> > > an application has come to rely on.  Fixing the bug isn't typically considered
> > > within the purview of versioning, because you're not changing the ABI, you're
> > > just correcting a bug in the PMD's behavior.  Customers who ask for the behavior
> > > to remain unchanged are asking for what's commonly referred to as "Bug for Bug
> > > compatibility" and in those cases the application vendor needs to release a
> > > corresponding fix.  Developers can't be required to preserve buggy behavior.
> > > 
> > > It should also be noted that in this case, ABI never changed.  All the data
> > > types/sizes/locations/etc have remained unchanged. Its just a bug in
> > > interpretation of data passed accross the ABI. As such, theres nothing for ABI
> > > versioning to do here.
> > 
> > OK, that's what I thought.
> > 
> > > > 9/
> > > > When we don't want to adapt an application, it means the development is
> > > > finished and we don't care about the new features of the library.
> > > > So I wonder if it wouldn't be more appropriate to provide stable releases
> > > > with true maintenance to such users. I understood that is what Redhat provides
> > > > to their customers.
> > > > 
> > > No, thats incorrect, we frequently update packages to the latest upstream
> > > version when at all possible.  We are able to do this sepcifically because
> > > upstream library releases provide ABI versioning, so that we can update with
> > > confidence.  If they don't do that, then yes, we are often restricted to
> > > selecting a release and maintaining it for the duration of a major RHEL release,
> > > which implies that security and feature updates are extreemely limited
> > > 
> > > That said, if you wanted to do ongoing maintenence on each release, I suppsose
> > > you could, in fact its somewhat simmilar to the -stable series that the kernel
> > > uses, exept that the kernel enoys an extreemly stable user space ABI, and even
> > > then the kernel -stable series doesn't take internal ABI changing patches, so
> > > theres alot of divergence.  You don't currently have that stable ABI interface,
> > > and so I think you'll find that that doing this is way more work than just
> > > supporting versioning.
> > > 
> > > To illustrate, lets say you want to support maintenence releases the latest 3
> > > releases of the DPDK with patches.  To do this, for every patch that is posted
> > > to the dpdk that is a bug fix, you will have to apply it four times, one for
> > > the git head, and again for each of the three releases that you are doing
> > > maintenence on.  the patch will of course apply cleanly to the git head, as
> > > thats what the developer wrote it against, but the other three releases have
> > > every opportunity to conflict with code introduced in the git head but that
> > > couldn't be taken into the maintenece releases.  Fixing those up is work that
> > > you will either have to do, or request that the patch author do.  And for this
> > > work you will provide distibutions with about 2 years of ABI stability
> > > (presuming an ~8 month release cycle), after which they are back to just living
> > > with whatever they stabilized on until the next major relase (note a single RHEL
> > > major release has a 10+ year life cycle).  I would personally rather avoid that
> > > work, and just do the ABI compatibility, as those patches are far fewer in
> > > number, and it buys for the effort.
> > 
> > Interesting point of view.
> > Note that there is no plan to maintain stable version on dpdk.org.
> > But if some volunteers want absolutely to do it (even after reading your comment),
> > we cannot forbid it.
> >
> Certainly, and as I noted the kernel does that.  But given the rate of change
> that the DPDK undergoes, and the current size of the community, I don't think
> anyone is going to step up to do that work.  Thats really the underlying problem
> here, you can solve this problem lots of ways if you have enough manpower, but
> given the resources at hand, doing versioning in the master tree is really the
> only viable solution.
>  
> > > > Hope this discussion will bring a clear idea of what should be done with
> > > > which implications.
> > > > Thanks
> > Thanks again

I think my concerns are now well explained.
It was important to expose clearly what a such ABI policy means.
If nobody disagree with your approach, it should be accepted.

Thanks
-- 
Thomas

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] versioning and maintenance
  2014-11-20 21:08  3%         ` Thomas Monjalon
@ 2014-11-21  1:05  4%           ` Neil Horman
  2014-11-21 13:23  4%             ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Neil Horman @ 2014-11-21  1:05 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Thu, Nov 20, 2014 at 10:08:25PM +0100, Thomas Monjalon wrote:
> 2014-11-20 13:25, Neil Horman:
> > On Thu, Nov 20, 2014 at 06:09:10PM +0100, Thomas Monjalon wrote:
> > > 2014-11-19 10:13, Neil Horman:
> > > > On Wed, Nov 19, 2014 at 11:35:08AM +0000, Bruce Richardson wrote:
> > > > > On Wed, Nov 19, 2014 at 12:22:14PM +0100, Thomas Monjalon wrote:
> > > > > > Following the discussion we had with Neil during the conference call,
> > > > > > I suggest this plan, starting with the next release (2.0):
> > > > > > 	- add version numbers to libraries
> > > > > > 	- add version numbers to functions inside .map files
> > > > > > 	- create a git tree dedicated to maintenance and API compatibility
> > > > > > 
> > > > > > It means these version numbers must be incremented when breaking the API.
> > > > > > Though the old code paths will be maintained and tested separately by volunteers.
> > > > > > A mailing list for maintenance purpose could be created if needed.
> > > > > >
> > > > > Hi Thomas,
> > > > > 
> > > > > I really think that the versionning is best handled inside the main repository
> > > > > itself. Given that the proposed deprecation policy is over two releases i.e. an
> > > > > API is marked deprecated in release X and then removed in X+1, I don't see the
> > > > > maintaining of old code paths to be particularly onerous.
> > > > > 
> > > > > /Bruce
> > > > 
> > > > I agree with Bruce, even if it is on occasion an added workload, its not the
> > > > sort of thing that can or should be placed on an alternate developer.  Backwards
> > > > compatibility is the sort of thing that has to be on the mind of the developer
> > > > when modifying an API, and on the mind of the reviewer when reviewing code.  To
> > > > shunt that responsibility elsewhere invites the opportunity for backwards
> > > > compatibilty to be a second class citizen who's goal will never be reached,
> > > > because developers instituting ABI changes will never care about the
> > > > consequences, and anyone worrying about backwards compatibility will always be
> > > > playing catch up, possibly allowing ABI breaks to slip through.
> > > > 
> > > > Neil
> > >  
> > > Before taking a decision, we should detail every concern.
> > > 
> > > 1/
> > > Currently there are not a lot of API refactoring because DPDK is well tailored
> > > for x86 and Intel NICs. But we are seeing that new CPU and new NICs to support
> > > would require some adaptations.
> > > 
> > Yes, you're absolutely right here.  I had hoped that, during my presentation
> > that this would happen occasionaly, and that we would need to deal with it.
> > What I think you are implying here (correct me if I'm wrong), is that you would
> > advocate that we wait to introduce ABI versioning until after such refactoring
> > is, for lack of a better term "complete".  The problem here is that, software
> > that is growing in user base is never "complete".  What you are effectively
> > saying is that you want to wait until the API is in a state in which no (or
> > almost no) more changes are required, then fixate it.  Thats quite simply never
> > going to happen.  And if it does, it obviates the need for versioning at all.
> 
> I agree Neil. This point is not about how long we should wait but how the
> overhead could be estimate for coming releases.
> 
Well, I understand the desire, but I'm not sure how it can be accomplished.  For
a given release, the overhead will be dependent on two factors:

1) The number off ABI changes in a given release

2) The extent of the ABI changes that were made.

If we have a way to predict those, then we can estimate the overhead, but
without that information, you're kinda stuck.  That said, if we all concur that
this is a necessecary effort to undertake, then the overhead is, not overly
important.  Whats more important is providing enough time to alot enough time to
do the work for a given project.  That is to say, when undertaking a large
refactoring, or other project that promises to make significant ABI changes,
that the developer needs to factor in time to design an implement backwards
compatibility.  Put another way, if the developer does their job right, and
takes backwards compatibility seriously, the overhead to you as a maintainer is
nil.  The onus to handle this extra effort needs to be on the developer.

> > > 2/
> > > I'm curious to know how you would handle a big change like the recent mbuf rework.
> > > Should we duplicate the structure and all the functions using mbuf?
> > 
> > Several ways, what you suggest above is one way, although thats what I would
> > consider to be a pessimal case.  Ideally such large changes are extreemely rare
> > (a search of the git history I think confirms this).  Much more common are
> > small, limited changes to various API's for which providing multiple versions of
> > a function is a much more reasonable approach.
> > 
> > In the event that we do decide to do a refactor that is so far reaching that we
> > simply don't feel like multi-versioning is feasible, the recourse is then to
> > deprecate the old API, publish that information on the deprecation schedule,
> > wait for a release, then replace it wholesale.  When the API is released, we
> > bump the DSO version number.  Note the versioning policy never guarantees that
> > backwards compatibility will always be available, nor does it stipulate that a
> > newer version of the API is available prior to removing the old one. The goal
> > here is to give distributors and application vendors advanced notice of ABI
> > breaking changes so that they can adapt appropriately before they are caught off
> > guard.  If the new ABI can't be packaged alongside the old, then so be it,
> > downstream vendors will have to use the upstream git head to test and validate,
> > rather than a newer distribution release
> 
> Seems reasonable.
> 
> > Ideally though, that shouldn't happen, because it causes downstream headaches,
> > and we would really like to avoid that.  Thats why I feel its so important to
> > keep this work in the main tree.  If we segregate it to a separate location it
> > will make it all to easy for developers to ignore these needs and just assume we
> > constantly drop old ABI versions without providing backwards compatibility.
> > 
> > > 3/
> > > Should we add new fields at the end of its structure to avoid ABI breaking?
> > > 
> > In the common case yes, this usually avoids ABI breakage, though it can't always
> > be relied upon (e.g. cases where structures are statically allocated by an
> > application).  And then there are patches that attempt to reduce memory usage
> > and increase performance by re-arranging structures.  In those cases we need to
> > do ABI versioning or announce/delay/release as noted above, though again, that
> > should really be avoided if possible.
> 
> So there is no hope of having fields logically sorted.
> Not a major problem but we have to know it. And it should probably be
> documented if we choose this way.
> 
Sure, though I'm not sure I agree with the statement above.  Having fields
logically sorted seems like it should be a forgone  conclusion in that the
developer should have laid those fields out in some semblance of order in the
first place.  If a large data structure re-ordering is taking place such that
structure fields are getting rearranged, that in my mind is part of a large
refactoring for which the entire API that is affected by those data structures
must have a new version created to provide backward compatibility, or in the
extreeme case, we may need to preform a warn and deprecate/exchange operation as
noted previously, though again, that is a Nuclear option.

> > > 4/
> > > Developers contribute because they need some changes. So when breaking
> > > an API, their application is already ready for the new version.
> > > I mean the author of such patch is probably not really motivated to keep ABI
> > > compability and duplicate the code path.
> > > 
> > What?  That doesn't make any sense.  Its our job to enforce this requirement on
> > developers during the review cycle.  If you don't feel like we can enforce
> > coding requirements on the project, we've already lost.  I agree that an
> > application developer submitting a patch for DPDK might not care about ABI
> > compatibility because they've already modified their application, but they (and
> > we) need to recognize that there are more than just a handful of users of the
> > DPDK, some of whom don't participate in this community (i.e. are simply end
> > users).  We need to make sure all users needs are met.  Thats the entire point
> > of this patch series, to make DPDK available to a wider range of users.
> 
> Exact. To make it simple, you care about end users and I have to care about
> developers motivation. But I perfectly understand the end users needs.
> I don't say we cannot enforce coding requirements. I just think it will be
> less pleasant.
> 
I disagree with the assertion that you will loose developers becausee they don't
care about compatibility.  You're developer base may change.  This is no
different than any other requirement that you place on a developer.  You make
all sorts of mandates regarding development (they can't break other older
supported cpu architecture, their code has to compile on all configurations,
etc).  This is no different.

> > > 5/
> > > Intead of simply modifying an API function, it would appear as a whole new
> > > function with some differences compared to the old one. Such change is really
> > > not convenient to review.
> > 
> > Um, yes, versioning is the process of creating an additional
> > function that closely resembles an older version of the same function, but with
> > different arguments and a newer version number.  Thats what it is by defintion,
> > and yes, its additional work.  All you're saying here is that, its extra work
> > and we shouldn't do it.  I thought I made this clear on the call, its been done
> > in thousands of other libraries, but if you just don't want to do it, then you
> > should abandon distributions as a way to reach a larger community, but if you
> > want to see the DPDK reach a larger community, then this is something that has
> > to happen, hard or not.
> 
> The goal of this discussion is to establish all the implications of this
> decision. We expose the facts. No conclusion.
> 
You haven't exposed a fact, you've asserted an opinion.  Theres is no notion of
something being convienient or inconvienient to review in any quantitative way.
If facts are your goal, you missed the mark here.

> > > 6/
> > > Testing ABI compatibility could be tricky. We would need a tool to check it's
> > > mostly OK. The good place for such a tool is in app/test. It was designed to be
> > > the unit tests of the API.
> > 
> > That seems like a reasonable idea, but I'm not sure what the concern is.  Are
> > you saying that you need to test every old version of the ABI?  Thats fine.  I
> > really don't think it has to be as stringent as the latest version testing, but
> > if you want to, it should be as easy as building the latest release of
> > the DPDK libraries, and the previous version of the test application.  That will
> > force the previous version code paths to be used by the test app in the new
> > library and, if the test fully exercize the api, then you should get pretty good
> > coverage.
> 
> Yes it will provide an unit test to developpers.
> 
> > > 7/
> > > This system would allow application developpers to upgrade DPDK to n+1 without
> > > rebuilding. But when upgrading to n+2, they should have adapted their
> > > application to comply with n+1 API (because n will be removed).
> > 
> > Only assuming that the old ABI facet was deprecated at the same time the new ABI
> > was introduced.  Theres nothing that says we have to do that, but I digress.
> > 
> > > So this solution offers a delay between the upgrade decision and the
> > > app work. Note that they could prepare their application before upgrading.
> > > Anyway, an upgrade should be tested before doing it effectively. The behaviour
> > > of the application could change and require some adaptations.
> > > 
> > Um, yes.  Whats the concern here?
> 
> I'm just trying to figure which workflows are eased by progressive ABI deprecation.
> 
The workflow for end users, in that they are given an alert prior to a breaking
change, and the time to fix it, in a way that distributions can manage without
having to individually (as distributions) undertake that effort on their own, an
in a way that might one day provide for multi version compatibility.

> > Downstream application developers need 2
> > things:
> > 
> > A) The ability to note that ABI changes are comming so that they can adapt to
> > the new version
> > 
> > B) Time to do so
> > 
> > The deprecation policy, if properly distributed by Distributions provide (A),
> > and the ABI versioning provides (B).  I.e. they can get all the latest bug fixes
> > and enhancements while in parallel adapting to the comming new version. Note
> > ideally this will happen rarely, as having to constantly rebuild/adapt does not
> > sit will with application vendors who choose to go through distributions, but
> > we'll do the best we can.
> 
> It's an interesting point. In a long-term distribution model like RHEL, do you
> plan to upgrade DPDK at each new release?
> 
Given that you intermix hardware support with bug fixes and new features (which
granted is not uncommon), yes, I don't see any way to avoid doing so.  We could
of course cherry pick bug fixes and non-ABI-breaking features, to preserve
compatibility, but doing so diverges from upstream quickly to the point that it
becomes extreemely difficult to maintain.  As an example, the one project that
Red Hat does this on routinely is the kernel, and to do so employs a staff of
hundreds of engineers.  No distribution wants to do that for every user space
library that they support.  They/we are willing to do minor fixes in a given
release with the foreknoweldge that we can drop them when the next relase comes
out, but beyond that, the logistics just don't scale.

> > > 8/
> > > How to handle a change in the implementation of a PMD which severely impact
> > > the application? Example: an ol_flag was mis-used and the application has
> > > a workaround to interpret this flag but it's now incompatible with the fix.
> > > 
> > We run into this sometimes in Fedora and RHEL, and doesn't require versioning.
> > The problem you describe is one in which something internal to the library that
> > an application has come to rely on.  Fixing the bug isn't typically considered
> > within the purview of versioning, because you're not changing the ABI, you're
> > just correcting a bug in the PMD's behavior.  Customers who ask for the behavior
> > to remain unchanged are asking for what's commonly referred to as "Bug for Bug
> > compatibility" and in those cases the application vendor needs to release a
> > corresponding fix.  Developers can't be required to preserve buggy behavior.
> > 
> > It should also be noted that in this case, ABI never changed.  All the data
> > types/sizes/locations/etc have remained unchanged. Its just a bug in
> > interpretation of data passed accross the ABI. As such, theres nothing for ABI
> > versioning to do here.
> 
> OK, that's what I thought.
> 
> > > 9/
> > > When we don't want to adapt an application, it means the development is
> > > finished and we don't care about the new features of the library.
> > > So I wonder if it wouldn't be more appropriate to provide stable releases
> > > with true maintenance to such users. I understood that is what Redhat provides
> > > to their customers.
> > > 
> > No, thats incorrect, we frequently update packages to the latest upstream
> > version when at all possible.  We are able to do this sepcifically because
> > upstream library releases provide ABI versioning, so that we can update with
> > confidence.  If they don't do that, then yes, we are often restricted to
> > selecting a release and maintaining it for the duration of a major RHEL release,
> > which implies that security and feature updates are extreemely limited
> > 
> > That said, if you wanted to do ongoing maintenence on each release, I suppsose
> > you could, in fact its somewhat simmilar to the -stable series that the kernel
> > uses, exept that the kernel enoys an extreemly stable user space ABI, and even
> > then the kernel -stable series doesn't take internal ABI changing patches, so
> > theres alot of divergence.  You don't currently have that stable ABI interface,
> > and so I think you'll find that that doing this is way more work than just
> > supporting versioning.
> > 
> > To illustrate, lets say you want to support maintenence releases the latest 3
> > releases of the DPDK with patches.  To do this, for every patch that is posted
> > to the dpdk that is a bug fix, you will have to apply it four times, one for
> > the git head, and again for each of the three releases that you are doing
> > maintenence on.  the patch will of course apply cleanly to the git head, as
> > thats what the developer wrote it against, but the other three releases have
> > every opportunity to conflict with code introduced in the git head but that
> > couldn't be taken into the maintenece releases.  Fixing those up is work that
> > you will either have to do, or request that the patch author do.  And for this
> > work you will provide distibutions with about 2 years of ABI stability
> > (presuming an ~8 month release cycle), after which they are back to just living
> > with whatever they stabilized on until the next major relase (note a single RHEL
> > major release has a 10+ year life cycle).  I would personally rather avoid that
> > work, and just do the ABI compatibility, as those patches are far fewer in
> > number, and it buys for the effort.
> 
> Interesting point of view.
> Note that there is no plan to maintain stable version on dpdk.org.
> But if some volunteers want absolutely to do it (even after reading your comment),
> we cannot forbid it.
>
Certainly, and as I noted the kernel does that.  But given the rate of change
that the DPDK undergoes, and the current size of the community, I don't think
anyone is going to step up to do that work.  Thats really the underlying problem
here, you can solve this problem lots of ways if you have enough manpower, but
given the resources at hand, doing versioning in the master tree is really the
only viable solution.
 
> > > Hope this discussion will bring a clear idea of what should be done with
> > > which implications.
> > > Thanks
> Thanks again
> 

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] versioning and maintenance
  2014-11-20 18:25  5%       ` Neil Horman
@ 2014-11-20 21:08  3%         ` Thomas Monjalon
  2014-11-21  1:05  4%           ` Neil Horman
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2014-11-20 21:08 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

2014-11-20 13:25, Neil Horman:
> On Thu, Nov 20, 2014 at 06:09:10PM +0100, Thomas Monjalon wrote:
> > 2014-11-19 10:13, Neil Horman:
> > > On Wed, Nov 19, 2014 at 11:35:08AM +0000, Bruce Richardson wrote:
> > > > On Wed, Nov 19, 2014 at 12:22:14PM +0100, Thomas Monjalon wrote:
> > > > > Following the discussion we had with Neil during the conference call,
> > > > > I suggest this plan, starting with the next release (2.0):
> > > > > 	- add version numbers to libraries
> > > > > 	- add version numbers to functions inside .map files
> > > > > 	- create a git tree dedicated to maintenance and API compatibility
> > > > > 
> > > > > It means these version numbers must be incremented when breaking the API.
> > > > > Though the old code paths will be maintained and tested separately by volunteers.
> > > > > A mailing list for maintenance purpose could be created if needed.
> > > > >
> > > > Hi Thomas,
> > > > 
> > > > I really think that the versionning is best handled inside the main repository
> > > > itself. Given that the proposed deprecation policy is over two releases i.e. an
> > > > API is marked deprecated in release X and then removed in X+1, I don't see the
> > > > maintaining of old code paths to be particularly onerous.
> > > > 
> > > > /Bruce
> > > 
> > > I agree with Bruce, even if it is on occasion an added workload, its not the
> > > sort of thing that can or should be placed on an alternate developer.  Backwards
> > > compatibility is the sort of thing that has to be on the mind of the developer
> > > when modifying an API, and on the mind of the reviewer when reviewing code.  To
> > > shunt that responsibility elsewhere invites the opportunity for backwards
> > > compatibilty to be a second class citizen who's goal will never be reached,
> > > because developers instituting ABI changes will never care about the
> > > consequences, and anyone worrying about backwards compatibility will always be
> > > playing catch up, possibly allowing ABI breaks to slip through.
> > > 
> > > Neil
> >  
> > Before taking a decision, we should detail every concern.
> > 
> > 1/
> > Currently there are not a lot of API refactoring because DPDK is well tailored
> > for x86 and Intel NICs. But we are seeing that new CPU and new NICs to support
> > would require some adaptations.
> > 
> Yes, you're absolutely right here.  I had hoped that, during my presentation
> that this would happen occasionaly, and that we would need to deal with it.
> What I think you are implying here (correct me if I'm wrong), is that you would
> advocate that we wait to introduce ABI versioning until after such refactoring
> is, for lack of a better term "complete".  The problem here is that, software
> that is growing in user base is never "complete".  What you are effectively
> saying is that you want to wait until the API is in a state in which no (or
> almost no) more changes are required, then fixate it.  Thats quite simply never
> going to happen.  And if it does, it obviates the need for versioning at all.

I agree Neil. This point is not about how long we should wait but how the
overhead could be estimate for coming releases.

> > 2/
> > I'm curious to know how you would handle a big change like the recent mbuf rework.
> > Should we duplicate the structure and all the functions using mbuf?
> 
> Several ways, what you suggest above is one way, although thats what I would
> consider to be a pessimal case.  Ideally such large changes are extreemely rare
> (a search of the git history I think confirms this).  Much more common are
> small, limited changes to various API's for which providing multiple versions of
> a function is a much more reasonable approach.
> 
> In the event that we do decide to do a refactor that is so far reaching that we
> simply don't feel like multi-versioning is feasible, the recourse is then to
> deprecate the old API, publish that information on the deprecation schedule,
> wait for a release, then replace it wholesale.  When the API is released, we
> bump the DSO version number.  Note the versioning policy never guarantees that
> backwards compatibility will always be available, nor does it stipulate that a
> newer version of the API is available prior to removing the old one. The goal
> here is to give distributors and application vendors advanced notice of ABI
> breaking changes so that they can adapt appropriately before they are caught off
> guard.  If the new ABI can't be packaged alongside the old, then so be it,
> downstream vendors will have to use the upstream git head to test and validate,
> rather than a newer distribution release

Seems reasonable.

> Ideally though, that shouldn't happen, because it causes downstream headaches,
> and we would really like to avoid that.  Thats why I feel its so important to
> keep this work in the main tree.  If we segregate it to a separate location it
> will make it all to easy for developers to ignore these needs and just assume we
> constantly drop old ABI versions without providing backwards compatibility.
> 
> > 3/
> > Should we add new fields at the end of its structure to avoid ABI breaking?
> > 
> In the common case yes, this usually avoids ABI breakage, though it can't always
> be relied upon (e.g. cases where structures are statically allocated by an
> application).  And then there are patches that attempt to reduce memory usage
> and increase performance by re-arranging structures.  In those cases we need to
> do ABI versioning or announce/delay/release as noted above, though again, that
> should really be avoided if possible.

So there is no hope of having fields logically sorted.
Not a major problem but we have to know it. And it should probably be
documented if we choose this way.

> > 4/
> > Developers contribute because they need some changes. So when breaking
> > an API, their application is already ready for the new version.
> > I mean the author of such patch is probably not really motivated to keep ABI
> > compability and duplicate the code path.
> > 
> What?  That doesn't make any sense.  Its our job to enforce this requirement on
> developers during the review cycle.  If you don't feel like we can enforce
> coding requirements on the project, we've already lost.  I agree that an
> application developer submitting a patch for DPDK might not care about ABI
> compatibility because they've already modified their application, but they (and
> we) need to recognize that there are more than just a handful of users of the
> DPDK, some of whom don't participate in this community (i.e. are simply end
> users).  We need to make sure all users needs are met.  Thats the entire point
> of this patch series, to make DPDK available to a wider range of users.

Exact. To make it simple, you care about end users and I have to care about
developers motivation. But I perfectly understand the end users needs.
I don't say we cannot enforce coding requirements. I just think it will be
less pleasant.

> > 5/
> > Intead of simply modifying an API function, it would appear as a whole new
> > function with some differences compared to the old one. Such change is really
> > not convenient to review.
> 
> Um, yes, versioning is the process of creating an additional
> function that closely resembles an older version of the same function, but with
> different arguments and a newer version number.  Thats what it is by defintion,
> and yes, its additional work.  All you're saying here is that, its extra work
> and we shouldn't do it.  I thought I made this clear on the call, its been done
> in thousands of other libraries, but if you just don't want to do it, then you
> should abandon distributions as a way to reach a larger community, but if you
> want to see the DPDK reach a larger community, then this is something that has
> to happen, hard or not.

The goal of this discussion is to establish all the implications of this
decision. We expose the facts. No conclusion.

> > 6/
> > Testing ABI compatibility could be tricky. We would need a tool to check it's
> > mostly OK. The good place for such a tool is in app/test. It was designed to be
> > the unit tests of the API.
> 
> That seems like a reasonable idea, but I'm not sure what the concern is.  Are
> you saying that you need to test every old version of the ABI?  Thats fine.  I
> really don't think it has to be as stringent as the latest version testing, but
> if you want to, it should be as easy as building the latest release of
> the DPDK libraries, and the previous version of the test application.  That will
> force the previous version code paths to be used by the test app in the new
> library and, if the test fully exercize the api, then you should get pretty good
> coverage.

Yes it will provide an unit test to developpers.

> > 7/
> > This system would allow application developpers to upgrade DPDK to n+1 without
> > rebuilding. But when upgrading to n+2, they should have adapted their
> > application to comply with n+1 API (because n will be removed).
> 
> Only assuming that the old ABI facet was deprecated at the same time the new ABI
> was introduced.  Theres nothing that says we have to do that, but I digress.
> 
> > So this solution offers a delay between the upgrade decision and the
> > app work. Note that they could prepare their application before upgrading.
> > Anyway, an upgrade should be tested before doing it effectively. The behaviour
> > of the application could change and require some adaptations.
> > 
> Um, yes.  Whats the concern here?

I'm just trying to figure which workflows are eased by progressive ABI deprecation.

> Downstream application developers need 2
> things:
> 
> A) The ability to note that ABI changes are comming so that they can adapt to
> the new version
> 
> B) Time to do so
> 
> The deprecation policy, if properly distributed by Distributions provide (A),
> and the ABI versioning provides (B).  I.e. they can get all the latest bug fixes
> and enhancements while in parallel adapting to the comming new version. Note
> ideally this will happen rarely, as having to constantly rebuild/adapt does not
> sit will with application vendors who choose to go through distributions, but
> we'll do the best we can.

It's an interesting point. In a long-term distribution model like RHEL, do you
plan to upgrade DPDK at each new release?

> > 8/
> > How to handle a change in the implementation of a PMD which severely impact
> > the application? Example: an ol_flag was mis-used and the application has
> > a workaround to interpret this flag but it's now incompatible with the fix.
> > 
> We run into this sometimes in Fedora and RHEL, and doesn't require versioning.
> The problem you describe is one in which something internal to the library that
> an application has come to rely on.  Fixing the bug isn't typically considered
> within the purview of versioning, because you're not changing the ABI, you're
> just correcting a bug in the PMD's behavior.  Customers who ask for the behavior
> to remain unchanged are asking for what's commonly referred to as "Bug for Bug
> compatibility" and in those cases the application vendor needs to release a
> corresponding fix.  Developers can't be required to preserve buggy behavior.
> 
> It should also be noted that in this case, ABI never changed.  All the data
> types/sizes/locations/etc have remained unchanged. Its just a bug in
> interpretation of data passed accross the ABI. As such, theres nothing for ABI
> versioning to do here.

OK, that's what I thought.

> > 9/
> > When we don't want to adapt an application, it means the development is
> > finished and we don't care about the new features of the library.
> > So I wonder if it wouldn't be more appropriate to provide stable releases
> > with true maintenance to such users. I understood that is what Redhat provides
> > to their customers.
> > 
> No, thats incorrect, we frequently update packages to the latest upstream
> version when at all possible.  We are able to do this sepcifically because
> upstream library releases provide ABI versioning, so that we can update with
> confidence.  If they don't do that, then yes, we are often restricted to
> selecting a release and maintaining it for the duration of a major RHEL release,
> which implies that security and feature updates are extreemely limited
> 
> That said, if you wanted to do ongoing maintenence on each release, I suppsose
> you could, in fact its somewhat simmilar to the -stable series that the kernel
> uses, exept that the kernel enoys an extreemly stable user space ABI, and even
> then the kernel -stable series doesn't take internal ABI changing patches, so
> theres alot of divergence.  You don't currently have that stable ABI interface,
> and so I think you'll find that that doing this is way more work than just
> supporting versioning.
> 
> To illustrate, lets say you want to support maintenence releases the latest 3
> releases of the DPDK with patches.  To do this, for every patch that is posted
> to the dpdk that is a bug fix, you will have to apply it four times, one for
> the git head, and again for each of the three releases that you are doing
> maintenence on.  the patch will of course apply cleanly to the git head, as
> thats what the developer wrote it against, but the other three releases have
> every opportunity to conflict with code introduced in the git head but that
> couldn't be taken into the maintenece releases.  Fixing those up is work that
> you will either have to do, or request that the patch author do.  And for this
> work you will provide distibutions with about 2 years of ABI stability
> (presuming an ~8 month release cycle), after which they are back to just living
> with whatever they stabilized on until the next major relase (note a single RHEL
> major release has a 10+ year life cycle).  I would personally rather avoid that
> work, and just do the ABI compatibility, as those patches are far fewer in
> number, and it buys for the effort.

Interesting point of view.
Note that there is no plan to maintain stable version on dpdk.org.
But if some volunteers want absolutely to do it (even after reading your comment),
we cannot forbid it.

> > Hope this discussion will bring a clear idea of what should be done with
> > which implications.
> > Thanks
Thanks again

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] versioning and maintenance
  2014-11-20 17:09  4%     ` Thomas Monjalon
@ 2014-11-20 18:25  5%       ` Neil Horman
  2014-11-20 21:08  3%         ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Neil Horman @ 2014-11-20 18:25 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Thu, Nov 20, 2014 at 06:09:10PM +0100, Thomas Monjalon wrote:
> Hi,
> 
> 2014-11-19 10:13, Neil Horman:
> > On Wed, Nov 19, 2014 at 11:35:08AM +0000, Bruce Richardson wrote:
> > > On Wed, Nov 19, 2014 at 12:22:14PM +0100, Thomas Monjalon wrote:
> > > > Following the discussion we had with Neil during the conference call,
> > > > I suggest this plan, starting with the next release (2.0):
> > > > 	- add version numbers to libraries
> > > > 	- add version numbers to functions inside .map files
> > > > 	- create a git tree dedicated to maintenance and API compatibility
> > > > 
> > > > It means these version numbers must be incremented when breaking the API.
> > > > Though the old code paths will be maintained and tested separately by volunteers.
> > > > A mailing list for maintenance purpose could be created if needed.
> > > >
> > > Hi Thomas,
> > > 
> > > I really think that the versionning is best handled inside the main repository
> > > itself. Given that the proposed deprecation policy is over two releases i.e. an
> > > API is marked deprecated in release X and then removed in X+1, I don't see the
> > > maintaining of old code paths to be particularly onerous.
> > > 
> > > /Bruce
> > 
> > I agree with Bruce, even if it is on occasion an added workload, its not the
> > sort of thing that can or should be placed on an alternate developer.  Backwards
> > compatibility is the sort of thing that has to be on the mind of the developer
> > when modifying an API, and on the mind of the reviewer when reviewing code.  To
> > shunt that responsibility elsewhere invites the opportunity for backwards
> > compatibilty to be a second class citizen who's goal will never be reached,
> > because developers instituting ABI changes will never care about the
> > consequences, and anyone worrying about backwards compatibility will always be
> > playing catch up, possibly allowing ABI breaks to slip through.
> > 
> > Neil
>  
> Before taking a decision, we should detail every concern.
> 
> 1/
> Currently there are not a lot of API refactoring because DPDK is well tailored
> for x86 and Intel NICs. But we are seeing that new CPU and new NICs to support
> would require some adaptations.
> 
Yes, you're absolutely right here.  I had hoped that, during my presentation
that this would happen occasionaly, and that we would need to deal with it.
What I think you are implying here (correct me if I'm wrong), is that you would
advocate that we wait to introduce ABI versioning until after such refactoring
is, for lack of a better term "complete".  The problem here is that, software
that is growing in user base is never "complete".  What you are effectively
saying is that you want to wait until the API is in a state in which no (or
almost no) more changes are required, then fixate it.  Thats quite simply never
going to happen.  And if it does, it obviates the need for versioning at all.

> 2/
> I'm curious to know how you would handle a big change like the recent mbuf rework.
> Should we duplicate the structure and all the functions using mbuf?
> 

Several ways, what you suggest above is one way, although thats what I would
consider to be a pessimal case.  Ideally such large changes are extreemely rare
(a search of the git history I think confirms this).  Much more common are
small, limited changes to various API's for which providing multiple versions of
a function is a much more reasonable approach.

In the event that we do decide to do a refactor that is so far reaching that we
simply don't feel like multi-versioning is feasible, the recourse is then to
deprecate the old API, publish that information on the deprecation schedule,
wait for a release, then replace it wholesale.  When the API is released, we
bump the DSO version number.  Note the versioning policy never guarantees that
backwards compatibility will always be available, nor does it stipulate that a
newer version of the API is available prior to removing the old one. The goal
here is to give distributors and application vendors advanced notice of ABI
breaking changes so that they can adapt appropriately before they are caught off
guard.  If the new ABI can't be packaged alongside the old, then so be it,
downstream vendors will have to use the upstream git head to test and validate,
rather than a newer distribution release

Ideally though, that shouldn't happen, because it causes downstream headaches,
and we would really like to avoid that.  Thats why I feel its so important to
keep this work in the main tree.  If we segregate it to a separate location it
will make it all to easy for developers to ignore these needs and just assume we
constantly drop old ABI versions without providing backwards compatibility.

> 3/
> Should we add new fields at the end of its structure to avoid ABI breaking?
> 
In the common case yes, this usually avoids ABI breakage, though it can't always
be relied upon (e.g. cases where structures are statically allocated by an
application).  And then there are patches that attempt to reduce memory usage
and increase performance by re-arranging structures.  In those cases we need to
do ABI versioning or announce/delay/release as noted above, though again, that
should really be avoided if possible.

> 4/
> Developers contribute because they need some changes. So when breaking
> an API, their application is already ready for the new version.
> I mean the author of such patch is probably not really motivated to keep ABI
> compability and duplicate the code path.
> 
What?  That doesn't make any sense.  Its our job to enforce this requirement on
developers during the review cycle.  If you don't feel like we can enforce
coding requirements on the project, we've already lost.  I agree that an
application developer submitting a patch for DPDK might not care about ABI
compatibility because they've already modified their application, but they (and
we) need to recognize that there are more than just a handful of users of the
DPDK, some of whom don't participate in this community (i.e. are simply end
users).  We need to make sure all users needs are met.  Thats the entire point
of this patch series, to make DPDK available to a wider range of users.

> 5/
> Intead of simply modifying an API function, it would appear as a whole new
> function with some differences compared to the old one. Such change is really
> not convenient to review.
> 

Um, yes, versioning is the process of creating an additional
function that closely resembles an older version of the same function, but with
different arguments and a newer version number.  Thats what it is by defintion,
and yes, its additional work.  All you're saying here is that, its extra work
and we shouldn't do it.  I thought I made this clear on the call, its been done
in thousands of other libraries, but if you just don't want to do it, then you
should abandon distributions as a way to reach a larger community, but if you
want to see the DPDK reach a larger community, then this is something that has
to happen, hard or not.

> 6/
> Testing ABI compatibility could be tricky. We would need a tool to check it's
> mostly OK. The good place for such a tool is in app/test. It was designed to be
> the unit tests of the API.
> 

That seems like a reasonable idea, but I'm not sure what the concern is.  Are
you saying that you need to test every old version of the ABI?  Thats fine.  I
really don't think it has to be as stringent as the latest version testing, but
if you want to, it should be as easy as building the latest release of
the DPDK libraries, and the previous version of the test application.  That will
force the previous version code paths to be used by the test app in the new
library and, if the test fully exercize the api, then you should get pretty good
coverage.

> 7/
> This system would allow application developpers to upgrade DPDK to n+1 without
> rebuilding. But when upgrading to n+2, they should have adapted their
> application to comply with n+1 API (because n will be removed).
Only assuming that the old ABI facet was deprecated at the same time the new ABI
was introduced.  Theres nothing that says we have to do that, but I digress.

> So this solution offers a delay between the upgrade decision and the
> app work. Note that they could prepare their application before upgrading.
> Anyway, an upgrade should be tested before doing it effectively. The behaviour
> of the application could change and require some adaptations.
> 
Um, yes.  Whats the concern here?  Downstream application developers need 2
things:

A) The ability to note that ABI changes are comming so that they can adapt to
the new version

B) Time to do so

The deprecation policy, if properly distributed by Distributions provide (A),
and the ABI versioning provides (B).  I.e. they can get all the latest bug fixes
and enhancements while in parallel adapting to the comming new version. Note
ideally this will happen rarely, as having to constantly rebuild/adapt does not
sit will with application vendors who choose to go through distributions, but
we'll do the best we can.

> 8/
> How to handle a change in the implementation of a PMD which severely impact
> the application? Example: an ol_flag was mis-used and the application has
> a workaround to interpret this flag but it's now incompatible with the fix.
> 
We run into this sometimes in Fedora and RHEL, and doesn't require versioning.
The problem you describe is one in which something internal to the library that
an application has come to rely on.  Fixing the bug isn't typically considered
within the purview of versioning, because you're not changing the ABI, you're
just correcting a bug in the PMD's behavior.  Customers who ask for the behavior
to remain unchanged are asking for what's commonly referred to as "Bug for Bug
compatibility" and in those cases the application vendor needs to release a
corresponding fix.  Developers can't be required to preserve buggy behavior.

It should also be noted that in this case, ABI never changed.  All the data
types/sizes/locations/etc have remained unchanged. Its just a bug in
interpretation of data passed accross the ABI. As such, theres nothing for ABI
versioning to do here.

> 9/
> When we don't want to adapt an application, it means the development is
> finished and we don't care about the new features of the library.
> So I wonder if it wouldn't be more appropriate to provide stable releases
> with true maintenance to such users. I understood that is what Redhat provides
> to their customers.
> 
No, thats incorrect, we frequently update packages to the latest upstream
version when at all possible.  We are able to do this sepcifically because
upstream library releases provide ABI versioning, so that we can update with
confidence.  If they don't do that, then yes, we are often restricted to
selecting a release and maintaining it for the duration of a major RHEL release,
which implies that security and feature updates are extreemely limited

That said, if you wanted to do ongoing maintenence on each release, I suppsose
you could, in fact its somewhat simmilar to the -stable series that the kernel
uses, exept that the kernel enoys an extreemly stable user space ABI, and even
then the kernel -stable series doesn't take internal ABI changing patches, so
theres alot of divergence.  You don't currently have that stable ABI interface,
and so I think you'll find that that doing this is way more work than just
supporting versioning.

To illustrate, lets say you want to support maintenence releases the latest 3
releases of the DPDK with patches.  To do this, for every patch that is posted
to the dpdk that is a bug fix, you will have to apply it four times, one for
the git head, and again for each of the three releases that you are doing
maintenence on.  the patch will of course apply cleanly to the git head, as
thats what the developer wrote it against, but the other three releases have
every opportunity to conflict with code introduced in the git head but that
couldn't be taken into the maintenece releases.  Fixing those up is work that
you will either have to do, or request that the patch author do.  And for this
work you will provide distibutions with about 2 years of ABI stability
(presuming an ~8 month release cycle), after which they are back to just living
with whatever they stabilized on until the next major relase (note a single RHEL
major release has a 10+ year life cycle).  I would personally rather avoid that
work, and just do the ABI compatibility, as those patches are far fewer in
number, and it buys for the effort.


> Hope this discussion will bring a clear idea of what should be done with
> which implications.
> Thanks
> -- 
> Thomas
> 

^ permalink raw reply	[relevance 5%]

* Re: [dpdk-dev] versioning and maintenance
  2014-11-19 15:13  4%   ` Neil Horman
@ 2014-11-20 17:09  4%     ` Thomas Monjalon
  2014-11-20 18:25  5%       ` Neil Horman
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2014-11-20 17:09 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

Hi,

2014-11-19 10:13, Neil Horman:
> On Wed, Nov 19, 2014 at 11:35:08AM +0000, Bruce Richardson wrote:
> > On Wed, Nov 19, 2014 at 12:22:14PM +0100, Thomas Monjalon wrote:
> > > Following the discussion we had with Neil during the conference call,
> > > I suggest this plan, starting with the next release (2.0):
> > > 	- add version numbers to libraries
> > > 	- add version numbers to functions inside .map files
> > > 	- create a git tree dedicated to maintenance and API compatibility
> > > 
> > > It means these version numbers must be incremented when breaking the API.
> > > Though the old code paths will be maintained and tested separately by volunteers.
> > > A mailing list for maintenance purpose could be created if needed.
> > >
> > Hi Thomas,
> > 
> > I really think that the versionning is best handled inside the main repository
> > itself. Given that the proposed deprecation policy is over two releases i.e. an
> > API is marked deprecated in release X and then removed in X+1, I don't see the
> > maintaining of old code paths to be particularly onerous.
> > 
> > /Bruce
> 
> I agree with Bruce, even if it is on occasion an added workload, its not the
> sort of thing that can or should be placed on an alternate developer.  Backwards
> compatibility is the sort of thing that has to be on the mind of the developer
> when modifying an API, and on the mind of the reviewer when reviewing code.  To
> shunt that responsibility elsewhere invites the opportunity for backwards
> compatibilty to be a second class citizen who's goal will never be reached,
> because developers instituting ABI changes will never care about the
> consequences, and anyone worrying about backwards compatibility will always be
> playing catch up, possibly allowing ABI breaks to slip through.
> 
> Neil
 
Before taking a decision, we should detail every concern.

1/
Currently there are not a lot of API refactoring because DPDK is well tailored
for x86 and Intel NICs. But we are seeing that new CPU and new NICs to support
would require some adaptations.

2/
I'm curious to know how you would handle a big change like the recent mbuf rework.
Should we duplicate the structure and all the functions using mbuf?

3/
Should we add new fields at the end of its structure to avoid ABI breaking?

4/
Developers contribute because they need some changes. So when breaking
an API, their application is already ready for the new version.
I mean the author of such patch is probably not really motivated to keep ABI
compability and duplicate the code path.

5/
Intead of simply modifying an API function, it would appear as a whole new
function with some differences compared to the old one. Such change is really
not convenient to review.

6/
Testing ABI compatibility could be tricky. We would need a tool to check it's
mostly OK. The good place for such a tool is in app/test. It was designed to be
the unit tests of the API.

7/
This system would allow application developpers to upgrade DPDK to n+1 without
rebuilding. But when upgrading to n+2, they should have adapted their
application to comply with n+1 API (because n will be removed).
So this solution offers a delay between the upgrade decision and the
app work. Note that they could prepare their application before upgrading.
Anyway, an upgrade should be tested before doing it effectively. The behaviour
of the application could change and require some adaptations.

8/
How to handle a change in the implementation of a PMD which severely impact
the application? Example: an ol_flag was mis-used and the application has
a workaround to interpret this flag but it's now incompatible with the fix.

9/
When we don't want to adapt an application, it means the development is
finished and we don't care about the new features of the library.
So I wonder if it wouldn't be more appropriate to provide stable releases
with true maintenance to such users. I understood that is what Redhat provides
to their customers.

Hope this discussion will bring a clear idea of what should be done with
which implications.
Thanks
-- 
Thomas

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] Community conference call - Tuesday 18th November
  2014-11-19 12:33  3%     ` O'driscoll, Tim
@ 2014-11-20  9:27  0%       ` Walukiewicz, Miroslaw
  0 siblings, 0 replies; 200+ results
From: Walukiewicz, Miroslaw @ 2014-11-20  9:27 UTC (permalink / raw)
  To: O'driscoll, Tim, 'dev@dpdk.org'

Tim, 

Is it a possibility to create some place on dpdk.org available to everyone where the slides and recording will be available?

Regards,

Mirek

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of O'driscoll, Tim
> Sent: Wednesday, November 19, 2014 1:34 PM
> To: 'dev@dpdk.org'
> Subject: Re: [dpdk-dev] Community conference call - Tuesday 18th
> November
> 
> Thanks again to those who attended the call yesterday. There was a good
> discussion, and it was more interactive than the previous call, which is what
> we were aiming for. We'll schedule a follow-up call for 2 weeks' time.
> 
> Thanks again to those who presented on the following features:
> - ABI Versioning (Neil Horman <nhorman@tuxdriver.com>)
> - Uio_pci_generic (Danny.Zhou@intel.com)
> - Integrated Qemu Userspace vHost (Huawei.Xie@intel.com)
> 
> I have a recording of the session, and will send a link to it soon for anybody
> who missed the call.
> 
> 
> Tim
> 
> > -----Original Message-----
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of O'driscoll, Tim
> > Sent: Tuesday, November 18, 2014 12:56 PM
> > To: 'dev@dpdk.org'
> > Subject: Re: [dpdk-dev] Community conference call - Tuesday 18th
> > November
> >
> > This is just a reminder of our call later today, which is at 17:00 GMT. The
> time
> > in a variety of timezones is included below.
> >
> > We're going to use GoToMeeting this time. If you follow the meeting link
> > (https://global.gotomeeting.com/join/843960205), the GoToMeeting web
> > viewer will start. You then have two options for audio:
> >
> > 1. You can join using a phone via one of the numbers listed below. The
> > Access Code is 843-960-205. You'll also be asked for an Audio PIN, which is
> > accessible by clicking the phone icon in the GoToMeeting web viewer after
> > you've joined the meeting.
> >
> > 2. To use your computer's audio via a headset, you need to switch to the
> > desktop version of GoToMeeting. You can do this by clicking the
> > GoToMeeting icon on the top right hand side of the web viewer, and then
> > selecting "Switch to the desktop version". The desktop version will need to
> > download and install, so if you plan to use this you may want to get it set up
> > in advance. Once it starts, under the Audio section, you can select "Mic &
> > Speakers". The desktop version is only available for Windows and Mac, so if
> > you're using Linux then you need to use option 1 above.
> >
> > Info on downloading the desktop app is available at:
> >
> http://support.citrixonline.com/en_US/meeting/help_files/G2M010002?title
> > =Download%7D
> > Info on the web viewer is available at:
> >
> http://support.citrixonline.com/en_US/GoToMeeting/help_files/GTM13001
> > 9?title=Web+Viewer+FAQs
> >
> > I plan to record the session in GoToMeeting, and make that recording
> > available for anybody who can't attend today.
> >
> >
> > Tim
> >
> > > -----Original Message-----
> > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of O'driscoll, Tim
> > > Sent: Friday, November 14, 2014 10:53 AM
> > > To: 'dev@dpdk.org'
> > > Subject: Re: [dpdk-dev] Community conference call - Tuesday 18th
> > > November
> > >
> > > Firstly, due to some conflicts, we're going to move next Tuesday's
> > > meeting to
> > > 1 hour later. Apologies for the short notice on the change. Here's the
> > > new meeting time in a variety of timezones:
> > >
> > > Dublin (Ireland)			Tuesday, November 18, 2014 at
> > 5:00:00 PM    GMT UTC
> > > San Francisco (U.S.A. - California)	Tuesday, November 18, 2014 at
> > 9:00:00 AM    PST UTC-8 hours
> > > Phoenix (U.S.A. - Arizona)		Tuesday, November 18, 2014 at
> > 10:00:00 AM   MST UTC-7 hours
> > > New York (U.S.A. - New York)		Tuesday, November 18, 2014
> > at 12:00:00 Noon EST UTC-5 hours
> > > Ottawa (Canada - Ontario)		Tuesday, November 18, 2014 at
> > 12:00:00 Noon EST UTC-5 hours
> > > Paris (France)				Tuesday, November 18, 2014
> at
> > 6:00:00 PM    CET UTC+1 hour
> > > Tel Aviv (Israel)			Tuesday, November 18, 2014 at
> > 7:00:00 PM    IST UTC+2 hours
> > > Moscow (Russia)			Tuesday, November 18, 2014 at
> > 8:00:00 PM    MSK UTC+3 hours
> > > Beijing (China - Beijing Municipality)	Wednesday, November 19,
> 2014 at
> > 1:00:00 AM  CST UTC+8 hours
> > > Tokyo (Japan)			Wednesday, November 19, 2014 at
> > 2:00:00 AM  JST UTC+9 hours
> > > Corresponding UTC (GMT)		Tuesday, November 18, 2014 at
> > 17:00:00
> > >
> > >
> > > Secondly, we're going to try using GoToMeeting this time. Here are the
> > > details:
> > > 1. Please join my meeting from your computer, tablet or smartphone on
> > > Tue, Nov 18, 5:00 PM GMT Standard Time
> > > https://global.gotomeeting.com/join/843960205
> > >
> > > 2. Use your microphone and speakers (VOIP) for audio. You'll sound
> > > best with a headset. You can also call in using your telephone.
> > > ◦ United Kingdom   (Long distance): +44 (0) 20 7151 1818
> > > ◦ Australia   (Long distance): +61 2 8355 1034
> > > ◦ Sweden   (Long distance): +46 (0) 852 500 182
> > > ◦ Canada   (Long distance): +1 (647) 497-9372
> > > ◦ Finland   (Long distance): +358 (0) 942 45 0382
> > > ◦ Ireland   (Long distance): +353 (0) 15 255 598
> > > ◦ Germany   (Long distance): +49 (0) 692 5736 7206
> > > ◦ Italy   (Long distance): +39 0 693 38 75 53
> > > ◦ Netherlands   (Long distance): +31 (0) 208 080 212
> > > ◦ Austria   (Long distance): +43 (0) 7 2088 3707
> > > ◦ Belgium   (Long distance): +32 (0) 28 08 9460
> > > ◦ United States   (Long distance): +1 (626) 521-0013
> > > ◦ Denmark   (Long distance): +45 (0) 89 88 03 61
> > > ◦ Switzerland   (Long distance): +41 (0) 435 0824 78
> > > ◦ France   (Long distance): +33 (0) 170 950 588
> > > ◦ Norway   (Long distance): +47 21 04 29 76
> > > ◦ New Zealand   (Long distance): +64 (0) 9 887 3469
> > > ◦ Spain   (Long distance): +34 932 20 0506
> > >
> > > Access Code: 843-960-205
> > > Audio PIN: Shown after joining the session
> > >
> > > Not at your computer? Click the link to join this meeting from your
> > > iPhone®, iPad®, Android® or Windows Phone® device via the
> GoToMeeting
> > app.
> > >
> > >
> > > Finally, what we'd like to discuss are the candidate features for the
> > > 2.0 release that we didn't cover last time. These include:
> > > ◦ ABI Versioning
> > > ◦ DPDK support for uio_pci_generic
> > > ◦ Integrated Qemu Userspace vHost
> > > ◦ PCI Hot Plug
> > > ◦ Single Virtio Driver
> > > ◦ X32 ABI
> > > ◦ AVX2 ACL
> > > ◦ Interrupt mode for PMD
> > > ◦ DPDK Headroom
> > >
> > >
> > > Thanks,
> > > Tim
> > >
> > > > -----Original Message-----
> > > > From: O'driscoll, Tim
> > > > Sent: Tuesday, November 11, 2014 10:16 AM
> > > > To: dev@dpdk.org
> > > > Subject: Community conference call - Tuesday 18th November
> > > >
> > > > We're going to hold our next community conference call a week from
> > > > today - Tuesday 18th November, at 4:00pm in Ireland/UK. Here's the
> > > > time in a variety of timezones:
> > > >
> > > > Dublin (Ireland)				Tuesday, November 18, 2014
> > > > at 4:00:00 PM  GMT UTC
> > > > San Francisco (U.S.A. - California)	Tuesday, November 18, 2014 at
> > > > 8:00:00 AM  PST UTC-8 hours
> > > > Phoenix (U.S.A. - Arizona)		Tuesday, November 18, 2014
> at
> > > > 9:00:00 AM  MST UTC-7 hours
> > > > New York (U.S.A. - New York)		Tuesday, November 18, 2014
> > > at
> > > > 11:00:00 AM EST UTC-5 hours
> > > > Ottawa (Canada - Ontario)		Tuesday, November 18, 2014
> at
> > > > 11:00:00 AM EST UTC-5 hours
> > > > Paris (France)				Tuesday, November 18, 2014
> > at
> > > > 5:00:00 PM  CET UTC+1 hour
> > > > Tel Aviv (Israel)				Tuesday, November 18, 2014
> > > at
> > > > 6:00:00 PM  IST UTC+2 hours
> > > > Moscow (Russia)			Tuesday, November 18, 2014 at
> > > > 7:00:00 PM  MSK UTC+3 hours
> > > > Corresponding UTC (GMT)		Tuesday, November 18, 2014
> at
> > > > 16:00:00
> > > >
> > > > I'll provide conference bridge numbers later, but I wanted to
> > > > communicate the date and time now.
> > > >
> > > >
> > > > Tim

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] versioning and maintenance
  @ 2014-11-19 15:13  4%   ` Neil Horman
  2014-11-20 17:09  4%     ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Neil Horman @ 2014-11-19 15:13 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: dev, Neil Horman

On Wed, Nov 19, 2014 at 11:35:08AM +0000, Bruce Richardson wrote:
> On Wed, Nov 19, 2014 at 12:22:14PM +0100, Thomas Monjalon wrote:
> > Following the discussion we had with Neil during the conference call,
> > I suggest this plan, starting with the next release (2.0):
> > 	- add version numbers to libraries
> > 	- add version numbers to functions inside .map files
> > 	- create a git tree dedicated to maintenance and API compatibility
> > 
> > It means these version numbers must be incremented when breaking the API.
> > Though the old code paths will be maintained and tested separately by volunteers.
> > A mailing list for maintenance purpose could be created if needed.
> >
> Hi Thomas,
> 
> I really think that the versionning is best handled inside the main repository
> itself. Given that the proposed deprecation policy is over two releases i.e. an
> API is marked deprecated in release X and then removed in X+1, I don't see the
> maintaining of old code paths to be particularly onerous.
> 
> /Bruce
> 

I agree with Bruce, even if it is on occasion an added workload, its not the
sort of thing that can or should be placed on an alternate developer.  Backwards
compatibility is the sort of thing that has to be on the mind of the developer
when modifying an API, and on the mind of the reviewer when reviewing code.  To
shunt that responsibility elsewhere invites the opportunity for backwards
compatibilty to be a second class citizen who's goal will never be reached,
because developers instituting ABI changes will never care about the
consequences, and anyone worrying about backwards compatibility will always be
playing catch up, possibly allowing ABI breaks to slip through.

Neil

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] Community conference call - Tuesday 18th November
  2014-11-18 12:56  0%   ` O'driscoll, Tim
@ 2014-11-19 12:33  3%     ` O'driscoll, Tim
  2014-11-20  9:27  0%       ` Walukiewicz, Miroslaw
  0 siblings, 1 reply; 200+ results
From: O'driscoll, Tim @ 2014-11-19 12:33 UTC (permalink / raw)
  To: 'dev@dpdk.org'

Thanks again to those who attended the call yesterday. There was a good discussion, and it was more interactive than the previous call, which is what we were aiming for. We'll schedule a follow-up call for 2 weeks' time. 

Thanks again to those who presented on the following features:
- ABI Versioning (Neil Horman <nhorman@tuxdriver.com>)
- Uio_pci_generic (Danny.Zhou@intel.com)
- Integrated Qemu Userspace vHost (Huawei.Xie@intel.com)

I have a recording of the session, and will send a link to it soon for anybody who missed the call.


Tim

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of O'driscoll, Tim
> Sent: Tuesday, November 18, 2014 12:56 PM
> To: 'dev@dpdk.org'
> Subject: Re: [dpdk-dev] Community conference call - Tuesday 18th
> November
> 
> This is just a reminder of our call later today, which is at 17:00 GMT. The time
> in a variety of timezones is included below.
> 
> We're going to use GoToMeeting this time. If you follow the meeting link
> (https://global.gotomeeting.com/join/843960205), the GoToMeeting web
> viewer will start. You then have two options for audio:
> 
> 1. You can join using a phone via one of the numbers listed below. The
> Access Code is 843-960-205. You'll also be asked for an Audio PIN, which is
> accessible by clicking the phone icon in the GoToMeeting web viewer after
> you've joined the meeting.
> 
> 2. To use your computer's audio via a headset, you need to switch to the
> desktop version of GoToMeeting. You can do this by clicking the
> GoToMeeting icon on the top right hand side of the web viewer, and then
> selecting "Switch to the desktop version". The desktop version will need to
> download and install, so if you plan to use this you may want to get it set up
> in advance. Once it starts, under the Audio section, you can select "Mic &
> Speakers". The desktop version is only available for Windows and Mac, so if
> you're using Linux then you need to use option 1 above.
> 
> Info on downloading the desktop app is available at:
> http://support.citrixonline.com/en_US/meeting/help_files/G2M010002?title
> =Download%7D
> Info on the web viewer is available at:
> http://support.citrixonline.com/en_US/GoToMeeting/help_files/GTM13001
> 9?title=Web+Viewer+FAQs
> 
> I plan to record the session in GoToMeeting, and make that recording
> available for anybody who can't attend today.
> 
> 
> Tim
> 
> > -----Original Message-----
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of O'driscoll, Tim
> > Sent: Friday, November 14, 2014 10:53 AM
> > To: 'dev@dpdk.org'
> > Subject: Re: [dpdk-dev] Community conference call - Tuesday 18th
> > November
> >
> > Firstly, due to some conflicts, we're going to move next Tuesday's
> > meeting to
> > 1 hour later. Apologies for the short notice on the change. Here's the
> > new meeting time in a variety of timezones:
> >
> > Dublin (Ireland)			Tuesday, November 18, 2014 at
> 5:00:00 PM    GMT UTC
> > San Francisco (U.S.A. - California)	Tuesday, November 18, 2014 at
> 9:00:00 AM    PST UTC-8 hours
> > Phoenix (U.S.A. - Arizona)		Tuesday, November 18, 2014 at
> 10:00:00 AM   MST UTC-7 hours
> > New York (U.S.A. - New York)		Tuesday, November 18, 2014
> at 12:00:00 Noon EST UTC-5 hours
> > Ottawa (Canada - Ontario)		Tuesday, November 18, 2014 at
> 12:00:00 Noon EST UTC-5 hours
> > Paris (France)				Tuesday, November 18, 2014 at
> 6:00:00 PM    CET UTC+1 hour
> > Tel Aviv (Israel)			Tuesday, November 18, 2014 at
> 7:00:00 PM    IST UTC+2 hours
> > Moscow (Russia)			Tuesday, November 18, 2014 at
> 8:00:00 PM    MSK UTC+3 hours
> > Beijing (China - Beijing Municipality)	Wednesday, November 19, 2014 at
> 1:00:00 AM  CST UTC+8 hours
> > Tokyo (Japan)			Wednesday, November 19, 2014 at
> 2:00:00 AM  JST UTC+9 hours
> > Corresponding UTC (GMT)		Tuesday, November 18, 2014 at
> 17:00:00
> >
> >
> > Secondly, we're going to try using GoToMeeting this time. Here are the
> > details:
> > 1. Please join my meeting from your computer, tablet or smartphone on
> > Tue, Nov 18, 5:00 PM GMT Standard Time
> > https://global.gotomeeting.com/join/843960205
> >
> > 2. Use your microphone and speakers (VOIP) for audio. You'll sound
> > best with a headset. You can also call in using your telephone.
> > ◦ United Kingdom   (Long distance): +44 (0) 20 7151 1818
> > ◦ Australia   (Long distance): +61 2 8355 1034
> > ◦ Sweden   (Long distance): +46 (0) 852 500 182
> > ◦ Canada   (Long distance): +1 (647) 497-9372
> > ◦ Finland   (Long distance): +358 (0) 942 45 0382
> > ◦ Ireland   (Long distance): +353 (0) 15 255 598
> > ◦ Germany   (Long distance): +49 (0) 692 5736 7206
> > ◦ Italy   (Long distance): +39 0 693 38 75 53
> > ◦ Netherlands   (Long distance): +31 (0) 208 080 212
> > ◦ Austria   (Long distance): +43 (0) 7 2088 3707
> > ◦ Belgium   (Long distance): +32 (0) 28 08 9460
> > ◦ United States   (Long distance): +1 (626) 521-0013
> > ◦ Denmark   (Long distance): +45 (0) 89 88 03 61
> > ◦ Switzerland   (Long distance): +41 (0) 435 0824 78
> > ◦ France   (Long distance): +33 (0) 170 950 588
> > ◦ Norway   (Long distance): +47 21 04 29 76
> > ◦ New Zealand   (Long distance): +64 (0) 9 887 3469
> > ◦ Spain   (Long distance): +34 932 20 0506
> >
> > Access Code: 843-960-205
> > Audio PIN: Shown after joining the session
> >
> > Not at your computer? Click the link to join this meeting from your
> > iPhone®, iPad®, Android® or Windows Phone® device via the GoToMeeting
> app.
> >
> >
> > Finally, what we'd like to discuss are the candidate features for the
> > 2.0 release that we didn't cover last time. These include:
> > ◦ ABI Versioning
> > ◦ DPDK support for uio_pci_generic
> > ◦ Integrated Qemu Userspace vHost
> > ◦ PCI Hot Plug
> > ◦ Single Virtio Driver
> > ◦ X32 ABI
> > ◦ AVX2 ACL
> > ◦ Interrupt mode for PMD
> > ◦ DPDK Headroom
> >
> >
> > Thanks,
> > Tim
> >
> > > -----Original Message-----
> > > From: O'driscoll, Tim
> > > Sent: Tuesday, November 11, 2014 10:16 AM
> > > To: dev@dpdk.org
> > > Subject: Community conference call - Tuesday 18th November
> > >
> > > We're going to hold our next community conference call a week from
> > > today - Tuesday 18th November, at 4:00pm in Ireland/UK. Here's the
> > > time in a variety of timezones:
> > >
> > > Dublin (Ireland)				Tuesday, November 18, 2014
> > > at 4:00:00 PM  GMT UTC
> > > San Francisco (U.S.A. - California)	Tuesday, November 18, 2014 at
> > > 8:00:00 AM  PST UTC-8 hours
> > > Phoenix (U.S.A. - Arizona)		Tuesday, November 18, 2014 at
> > > 9:00:00 AM  MST UTC-7 hours
> > > New York (U.S.A. - New York)		Tuesday, November 18, 2014
> > at
> > > 11:00:00 AM EST UTC-5 hours
> > > Ottawa (Canada - Ontario)		Tuesday, November 18, 2014 at
> > > 11:00:00 AM EST UTC-5 hours
> > > Paris (France)				Tuesday, November 18, 2014
> at
> > > 5:00:00 PM  CET UTC+1 hour
> > > Tel Aviv (Israel)				Tuesday, November 18, 2014
> > at
> > > 6:00:00 PM  IST UTC+2 hours
> > > Moscow (Russia)			Tuesday, November 18, 2014 at
> > > 7:00:00 PM  MSK UTC+3 hours
> > > Corresponding UTC (GMT)		Tuesday, November 18, 2014 at
> > > 16:00:00
> > >
> > > I'll provide conference bridge numbers later, but I wanted to
> > > communicate the date and time now.
> > >
> > >
> > > Tim

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] Community conference call - Tuesday 18th November
  2014-11-14 10:52  4% ` O'driscoll, Tim
@ 2014-11-18 12:56  0%   ` O'driscoll, Tim
  2014-11-19 12:33  3%     ` O'driscoll, Tim
  0 siblings, 1 reply; 200+ results
From: O'driscoll, Tim @ 2014-11-18 12:56 UTC (permalink / raw)
  To: 'dev@dpdk.org'

This is just a reminder of our call later today, which is at 17:00 GMT. The time in a variety of timezones is included below.

We're going to use GoToMeeting this time. If you follow the meeting link (https://global.gotomeeting.com/join/843960205), the GoToMeeting web viewer will start. You then have two options for audio:

1. You can join using a phone via one of the numbers listed below. The Access Code is 843-960-205. You'll also be asked for an Audio PIN, which is accessible by clicking the phone icon in the GoToMeeting web viewer after you've joined the meeting.

2. To use your computer's audio via a headset, you need to switch to the desktop version of GoToMeeting. You can do this by clicking the GoToMeeting icon on the top right hand side of the web viewer, and then selecting "Switch to the desktop version". The desktop version will need to download and install, so if you plan to use this you may want to get it set up in advance. Once it starts, under the Audio section, you can select "Mic & Speakers". The desktop version is only available for Windows and Mac, so if you're using Linux then you need to use option 1 above.

Info on downloading the desktop app is available at: http://support.citrixonline.com/en_US/meeting/help_files/G2M010002?title=Download%7D
Info on the web viewer is available at: http://support.citrixonline.com/en_US/GoToMeeting/help_files/GTM130019?title=Web+Viewer+FAQs

I plan to record the session in GoToMeeting, and make that recording available for anybody who can't attend today.


Tim

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of O'driscoll, Tim
> Sent: Friday, November 14, 2014 10:53 AM
> To: 'dev@dpdk.org'
> Subject: Re: [dpdk-dev] Community conference call - Tuesday 18th
> November
> 
> Firstly, due to some conflicts, we're going to move next Tuesday's meeting to
> 1 hour later. Apologies for the short notice on the change. Here's the new
> meeting time in a variety of timezones:
> 
> Dublin (Ireland)			Tuesday, November 18, 2014 at 5:00:00 PM    GMT UTC
> San Francisco (U.S.A. - California)	Tuesday, November 18, 2014 at 9:00:00 AM    PST UTC-8 hours
> Phoenix (U.S.A. - Arizona)		Tuesday, November 18, 2014 at 10:00:00 AM   MST UTC-7 hours
> New York (U.S.A. - New York)		Tuesday, November 18, 2014 at 12:00:00 Noon EST UTC-5 hours
> Ottawa (Canada - Ontario)		Tuesday, November 18, 2014 at 12:00:00 Noon EST UTC-5 hours
> Paris (France)				Tuesday, November 18, 2014 at 6:00:00 PM    CET UTC+1 hour
> Tel Aviv (Israel)			Tuesday, November 18, 2014 at 7:00:00 PM    IST UTC+2 hours
> Moscow (Russia)			Tuesday, November 18, 2014 at 8:00:00 PM    MSK UTC+3 hours
> Beijing (China - Beijing Municipality)	Wednesday, November 19, 2014 at 1:00:00 AM  CST UTC+8 hours
> Tokyo (Japan)			Wednesday, November 19, 2014 at 2:00:00 AM  JST UTC+9 hours
> Corresponding UTC (GMT)		Tuesday, November 18, 2014 at 17:00:00
> 
> 
> Secondly, we're going to try using GoToMeeting this time. Here are the
> details:
> 1. Please join my meeting from your computer, tablet or smartphone on Tue,
> Nov 18, 5:00 PM GMT Standard Time
> https://global.gotomeeting.com/join/843960205
> 
> 2. Use your microphone and speakers (VOIP) for audio. You'll sound best
> with a headset. You can also call in using your telephone.
> ◦ United Kingdom   (Long distance): +44 (0) 20 7151 1818
> ◦ Australia   (Long distance): +61 2 8355 1034
> ◦ Sweden   (Long distance): +46 (0) 852 500 182
> ◦ Canada   (Long distance): +1 (647) 497-9372
> ◦ Finland   (Long distance): +358 (0) 942 45 0382
> ◦ Ireland   (Long distance): +353 (0) 15 255 598
> ◦ Germany   (Long distance): +49 (0) 692 5736 7206
> ◦ Italy   (Long distance): +39 0 693 38 75 53
> ◦ Netherlands   (Long distance): +31 (0) 208 080 212
> ◦ Austria   (Long distance): +43 (0) 7 2088 3707
> ◦ Belgium   (Long distance): +32 (0) 28 08 9460
> ◦ United States   (Long distance): +1 (626) 521-0013
> ◦ Denmark   (Long distance): +45 (0) 89 88 03 61
> ◦ Switzerland   (Long distance): +41 (0) 435 0824 78
> ◦ France   (Long distance): +33 (0) 170 950 588
> ◦ Norway   (Long distance): +47 21 04 29 76
> ◦ New Zealand   (Long distance): +64 (0) 9 887 3469
> ◦ Spain   (Long distance): +34 932 20 0506
> 
> Access Code: 843-960-205
> Audio PIN: Shown after joining the session
> 
> Not at your computer? Click the link to join this meeting from your iPhone®,
> iPad®, Android® or Windows Phone® device via the GoToMeeting app.
> 
> 
> Finally, what we'd like to discuss are the candidate features for the 2.0
> release that we didn't cover last time. These include:
> ◦ ABI Versioning
> ◦ DPDK support for uio_pci_generic
> ◦ Integrated Qemu Userspace vHost
> ◦ PCI Hot Plug
> ◦ Single Virtio Driver
> ◦ X32 ABI
> ◦ AVX2 ACL
> ◦ Interrupt mode for PMD
> ◦ DPDK Headroom
> 
> 
> Thanks,
> Tim
> 
> > -----Original Message-----
> > From: O'driscoll, Tim
> > Sent: Tuesday, November 11, 2014 10:16 AM
> > To: dev@dpdk.org
> > Subject: Community conference call - Tuesday 18th November
> >
> > We're going to hold our next community conference call a week from
> > today - Tuesday 18th November, at 4:00pm in Ireland/UK. Here's the
> > time in a variety of timezones:
> >
> > Dublin (Ireland)				Tuesday, November 18, 2014
> > at 4:00:00 PM  GMT UTC
> > San Francisco (U.S.A. - California)	Tuesday, November 18, 2014 at
> > 8:00:00 AM  PST UTC-8 hours
> > Phoenix (U.S.A. - Arizona)		Tuesday, November 18, 2014 at
> > 9:00:00 AM  MST UTC-7 hours
> > New York (U.S.A. - New York)		Tuesday, November 18, 2014
> at
> > 11:00:00 AM EST UTC-5 hours
> > Ottawa (Canada - Ontario)		Tuesday, November 18, 2014 at
> > 11:00:00 AM EST UTC-5 hours
> > Paris (France)				Tuesday, November 18, 2014 at
> > 5:00:00 PM  CET UTC+1 hour
> > Tel Aviv (Israel)				Tuesday, November 18, 2014
> at
> > 6:00:00 PM  IST UTC+2 hours
> > Moscow (Russia)			Tuesday, November 18, 2014 at
> > 7:00:00 PM  MSK UTC+3 hours
> > Corresponding UTC (GMT)		Tuesday, November 18, 2014 at
> > 16:00:00
> >
> > I'll provide conference bridge numbers later, but I wanted to
> > communicate the date and time now.
> >
> >
> > Tim

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] Community conference call - Tuesday 18th November
  @ 2014-11-14 10:52  4% ` O'driscoll, Tim
  2014-11-18 12:56  0%   ` O'driscoll, Tim
  0 siblings, 1 reply; 200+ results
From: O'driscoll, Tim @ 2014-11-14 10:52 UTC (permalink / raw)
  To: 'dev@dpdk.org'

Firstly, due to some conflicts, we're going to move next Tuesday's meeting to 1 hour later. Apologies for the short notice on the change. Here's the new meeting time in a variety of timezones:

Dublin (Ireland)				Tuesday, November 18, 2014 at 5:00:00 PM    GMT UTC         
San Francisco (U.S.A. - California)	Tuesday, November 18, 2014 at 9:00:00 AM    PST UTC-8 hours 
Phoenix (U.S.A. - Arizona)		Tuesday, November 18, 2014 at 10:00:00 AM   MST UTC-7 hours 
New York (U.S.A. - New York)		Tuesday, November 18, 2014 at 12:00:00 Noon EST UTC-5 hours 
Ottawa (Canada - Ontario)		Tuesday, November 18, 2014 at 12:00:00 Noon EST UTC-5 hours 
Paris (France)				Tuesday, November 18, 2014 at 6:00:00 PM    CET UTC+1 hour  
Tel Aviv (Israel)				Tuesday, November 18, 2014 at 7:00:00 PM    IST UTC+2 hours 
Moscow (Russia)			Tuesday, November 18, 2014 at 8:00:00 PM    MSK UTC+3 hours 
Beijing (China - Beijing Municipality)	Wednesday, November 19, 2014 at 1:00:00 AM  CST UTC+8 hours 
Tokyo (Japan)				Wednesday, November 19, 2014 at 2:00:00 AM  JST UTC+9 hours 
Corresponding UTC (GMT)		Tuesday, November 18, 2014 at 17:00:00 


Secondly, we're going to try using GoToMeeting this time. Here are the details:
1. Please join my meeting from your computer, tablet or smartphone on Tue, Nov 18, 5:00 PM GMT Standard Time https://global.gotomeeting.com/join/843960205

2. Use your microphone and speakers (VOIP) for audio. You'll sound best with a headset. You can also call in using your telephone.  
◦ United Kingdom   (Long distance): +44 (0) 20 7151 1818  
◦ Australia   (Long distance): +61 2 8355 1034  
◦ Sweden   (Long distance): +46 (0) 852 500 182  
◦ Canada   (Long distance): +1 (647) 497-9372  
◦ Finland   (Long distance): +358 (0) 942 45 0382  
◦ Ireland   (Long distance): +353 (0) 15 255 598  
◦ Germany   (Long distance): +49 (0) 692 5736 7206  
◦ Italy   (Long distance): +39 0 693 38 75 53  
◦ Netherlands   (Long distance): +31 (0) 208 080 212  
◦ Austria   (Long distance): +43 (0) 7 2088 3707  
◦ Belgium   (Long distance): +32 (0) 28 08 9460  
◦ United States   (Long distance): +1 (626) 521-0013  
◦ Denmark   (Long distance): +45 (0) 89 88 03 61  
◦ Switzerland   (Long distance): +41 (0) 435 0824 78  
◦ France   (Long distance): +33 (0) 170 950 588  
◦ Norway   (Long distance): +47 21 04 29 76  
◦ New Zealand   (Long distance): +64 (0) 9 887 3469  
◦ Spain   (Long distance): +34 932 20 0506  

Access Code: 843-960-205 
Audio PIN: Shown after joining the session 
  
Not at your computer? Click the link to join this meeting from your iPhone®, iPad®, Android® or Windows Phone® device via the GoToMeeting app. 


Finally, what we'd like to discuss are the candidate features for the 2.0 release that we didn't cover last time. These include:
◦ ABI Versioning
◦ DPDK support for uio_pci_generic
◦ Integrated Qemu Userspace vHost
◦ PCI Hot Plug
◦ Single Virtio Driver
◦ X32 ABI
◦ AVX2 ACL
◦ Interrupt mode for PMD
◦ DPDK Headroom


Thanks,
Tim
                     
> -----Original Message-----
> From: O'driscoll, Tim
> Sent: Tuesday, November 11, 2014 10:16 AM
> To: dev@dpdk.org
> Subject: Community conference call - Tuesday 18th November
> 
> We're going to hold our next community conference call a week from today -
> Tuesday 18th November, at 4:00pm in Ireland/UK. Here's the time in a
> variety of timezones:
> 
> Dublin (Ireland)				Tuesday, November 18, 2014
> at 4:00:00 PM  GMT UTC
> San Francisco (U.S.A. - California)	Tuesday, November 18, 2014 at
> 8:00:00 AM  PST UTC-8 hours
> Phoenix (U.S.A. - Arizona)		Tuesday, November 18, 2014 at
> 9:00:00 AM  MST UTC-7 hours
> New York (U.S.A. - New York)		Tuesday, November 18, 2014 at
> 11:00:00 AM EST UTC-5 hours
> Ottawa (Canada - Ontario)		Tuesday, November 18, 2014 at
> 11:00:00 AM EST UTC-5 hours
> Paris (France)				Tuesday, November 18, 2014 at
> 5:00:00 PM  CET UTC+1 hour
> Tel Aviv (Israel)				Tuesday, November 18, 2014 at
> 6:00:00 PM  IST UTC+2 hours
> Moscow (Russia)			Tuesday, November 18, 2014 at
> 7:00:00 PM  MSK UTC+3 hours
> Corresponding UTC (GMT)		Tuesday, November 18, 2014 at
> 16:00:00
> 
> I'll provide conference bridge numbers later, but I wanted to communicate
> the date and time now.
> 
> 
> Tim

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] x32 ABI support, first iteration
  2014-11-13 12:01  8% [dpdk-dev] [PATCH] x32 ABI support, first iteration Daniel Mrzyglod
  2014-11-13 12:20  9% ` Mrzyglod, DanielX T
@ 2014-11-14  0:45  4% ` Neil Horman
       [not found]     ` <86228AFD5BCD8E4EBFD2B90117B5E81E10D789EA@SHSMSX103.ccr.corp.intel.com>
  2 siblings, 0 replies; 200+ results
From: Neil Horman @ 2014-11-14  0:45 UTC (permalink / raw)
  To: Daniel Mrzyglod; +Cc: dev

On Thu, Nov 13, 2014 at 12:01:31PM +0000, Daniel Mrzyglod wrote:
> Signed-off-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
> Signed-off-by: Daniel Mrzyglod <danielx.t.mrzyglod@intel.com>
> ---
>  config/defconfig_x86_x32-native-linuxapp-gcc | 46 ++++++++++++++++++++
>  mk/arch/x86_x32/rte.vars.mk                  | 63 ++++++++++++++++++++++++++++
>  2 files changed, 109 insertions(+)
>  create mode 100644 config/defconfig_x86_x32-native-linuxapp-gcc
>  create mode 100644 mk/arch/x86_x32/rte.vars.mk
> 
> diff --git a/config/defconfig_x86_x32-native-linuxapp-gcc b/config/defconfig_x86_x32-native-linuxapp-gcc
> new file mode 100644
> index 0000000..fb0afc4
> --- /dev/null
> +++ b/config/defconfig_x86_x32-native-linuxapp-gcc
> @@ -0,0 +1,46 @@
> +#   BSD LICENSE
> +#
> +#   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
> +#   All rights reserved.
> +#
> +#   Redistribution and use in source and binary forms, with or without
> +#   modification, are permitted provided that the following conditions
> +#   are met:
> +#
> +#     * Redistributions of source code must retain the above copyright
> +#       notice, this list of conditions and the following disclaimer.
> +#     * Redistributions in binary form must reproduce the above copyright
> +#       notice, this list of conditions and the following disclaimer in
> +#       the documentation and/or other materials provided with the
> +#       distribution.
> +#     * Neither the name of Intel Corporation nor the names of its
> +#       contributors may be used to endorse or promote products derived
> +#       from this software without specific prior written permission.
> +#
> +#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> +#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> +#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
> +#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
> +#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> +#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> +#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> +#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> +#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> +#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> +#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> +#
> +
> +#include "common_linuxapp"
> +
> +CONFIG_RTE_MACHINE="native"
> +
> +CONFIG_RTE_ARCH="x86_x32"
> +CONFIG_RTE_ARCH_X86_X32=y
> +
> +CONFIG_RTE_TOOLCHAIN="gcc"
> +CONFIG_RTE_TOOLCHAIN_GCC=y
> +
> +#
> +# KNI is not supported on 32-bit
> +#
> +CONFIG_RTE_LIBRTE_KNI=n
> diff --git a/mk/arch/x86_x32/rte.vars.mk b/mk/arch/x86_x32/rte.vars.mk
> new file mode 100644
> index 0000000..9507af7
> --- /dev/null
> +++ b/mk/arch/x86_x32/rte.vars.mk
> @@ -0,0 +1,63 @@
> +#   BSD LICENSE
> +#
> +#   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
> +#   All rights reserved.
> +#
> +#   Redistribution and use in source and binary forms, with or without
> +#   modification, are permitted provided that the following conditions
> +#   are met:
> +#
> +#     * Redistributions of source code must retain the above copyright
> +#       notice, this list of conditions and the following disclaimer.
> +#     * Redistributions in binary form must reproduce the above copyright
> +#       notice, this list of conditions and the following disclaimer in
> +#       the documentation and/or other materials provided with the
> +#       distribution.
> +#     * Neither the name of Intel Corporation nor the names of its
> +#       contributors may be used to endorse or promote products derived
> +#       from this software without specific prior written permission.
> +#
> +#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> +#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> +#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
> +#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
> +#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> +#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> +#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> +#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> +#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> +#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> +#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> +
> +#
> +# arch:
> +#
> +#   - define ARCH variable (overriden by cmdline or by previous
> +#     optional define in machine .mk)
> +#   - define CROSS variable (overriden by cmdline or previous define
> +#     in machine .mk)
> +#   - define CPU_CFLAGS variable (overriden by cmdline or previous
> +#     define in machine .mk)
> +#   - define CPU_LDFLAGS variable (overriden by cmdline or previous
> +#     define in machine .mk)
> +#   - define CPU_ASFLAGS variable (overriden by cmdline or previous
> +#     define in machine .mk)
> +#   - may override any previously defined variable
> +#
> +# examples for CONFIG_RTE_ARCH: i686, x86_64, x86_64_32
> +#
> +
> +ARCH  ?= x86_64
> +ARCH_DIR := x86
> +CROSS ?=
> +
> +CPU_CFLAGS  ?= -mx32
> +CPU_LDFLAGS ?= -melf32_x86_64
> +#CPU_ASFLAGS ?= -felf64
> +# x32 is supported by Linux distribution with gcc4.8 and newer in some
> +# cases there is backported support in gcc4.6
> +ifneq ($(shell echo | $(CC) $(CPU_CFLAGS) -E - 2>/dev/null 1>/dev/null && echo 0), 0)
> +	$(error This version of GCC does not support x32 ABI)
> +endif
> +
> +export ARCH CROSS CPU_CFLAGS CPU_LDFLAGS CPU_ASFLAGS
> -- 
> 1.9.1
> 
> 
Seems reasonable.  I presume that a build with all options enabled builds and
executes?
Neil

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] x32 ABI support, first iteration
  2014-11-13 12:01  8% [dpdk-dev] [PATCH] x32 ABI support, first iteration Daniel Mrzyglod
@ 2014-11-13 12:20  9% ` Mrzyglod, DanielX T
  2014-11-14  0:45  4% ` Neil Horman
       [not found]     ` <86228AFD5BCD8E4EBFD2B90117B5E81E10D789EA@SHSMSX103.ccr.corp.intel.com>
  2 siblings, 0 replies; 200+ results
From: Mrzyglod, DanielX T @ 2014-11-13 12:20 UTC (permalink / raw)
  To: dev


This patch provides support for x32 ABI.
x32 ABI provides benefits of x86-64 while using 32-bit pointers and avoiding overhead of 64-bit pointers.

Daniel Mrzyglod (1):
Konstantin Ananyev(1):
  x32 ABI support, first iteration

 config/defconfig_x86_x32-native-linuxapp-gcc | 46 ++++++++++++++++++++
 mk/arch/x86_x32/rte.vars.mk                  | 63 ++++++++++++++++++++++++++++
 2 files changed, 109 insertions(+)
 create mode 100644 config/defconfig_x86_x32-native-linuxapp-gcc
 create mode 100644 mk/arch/x86_x32/rte.vars.mk

--
2.1.0

^ permalink raw reply	[relevance 9%]

* [dpdk-dev] [PATCH] x32 ABI support, first iteration
@ 2014-11-13 12:01  8% Daniel Mrzyglod
  2014-11-13 12:20  9% ` Mrzyglod, DanielX T
                   ` (2 more replies)
  0 siblings, 3 replies; 200+ results
From: Daniel Mrzyglod @ 2014-11-13 12:01 UTC (permalink / raw)
  To: dev

Signed-off-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
Signed-off-by: Daniel Mrzyglod <danielx.t.mrzyglod@intel.com>
---
 config/defconfig_x86_x32-native-linuxapp-gcc | 46 ++++++++++++++++++++
 mk/arch/x86_x32/rte.vars.mk                  | 63 ++++++++++++++++++++++++++++
 2 files changed, 109 insertions(+)
 create mode 100644 config/defconfig_x86_x32-native-linuxapp-gcc
 create mode 100644 mk/arch/x86_x32/rte.vars.mk

diff --git a/config/defconfig_x86_x32-native-linuxapp-gcc b/config/defconfig_x86_x32-native-linuxapp-gcc
new file mode 100644
index 0000000..fb0afc4
--- /dev/null
+++ b/config/defconfig_x86_x32-native-linuxapp-gcc
@@ -0,0 +1,46 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+#include "common_linuxapp"
+
+CONFIG_RTE_MACHINE="native"
+
+CONFIG_RTE_ARCH="x86_x32"
+CONFIG_RTE_ARCH_X86_X32=y
+
+CONFIG_RTE_TOOLCHAIN="gcc"
+CONFIG_RTE_TOOLCHAIN_GCC=y
+
+#
+# KNI is not supported on 32-bit
+#
+CONFIG_RTE_LIBRTE_KNI=n
diff --git a/mk/arch/x86_x32/rte.vars.mk b/mk/arch/x86_x32/rte.vars.mk
new file mode 100644
index 0000000..9507af7
--- /dev/null
+++ b/mk/arch/x86_x32/rte.vars.mk
@@ -0,0 +1,63 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#
+# arch:
+#
+#   - define ARCH variable (overriden by cmdline or by previous
+#     optional define in machine .mk)
+#   - define CROSS variable (overriden by cmdline or previous define
+#     in machine .mk)
+#   - define CPU_CFLAGS variable (overriden by cmdline or previous
+#     define in machine .mk)
+#   - define CPU_LDFLAGS variable (overriden by cmdline or previous
+#     define in machine .mk)
+#   - define CPU_ASFLAGS variable (overriden by cmdline or previous
+#     define in machine .mk)
+#   - may override any previously defined variable
+#
+# examples for CONFIG_RTE_ARCH: i686, x86_64, x86_64_32
+#
+
+ARCH  ?= x86_64
+ARCH_DIR := x86
+CROSS ?=
+
+CPU_CFLAGS  ?= -mx32
+CPU_LDFLAGS ?= -melf32_x86_64
+#CPU_ASFLAGS ?= -felf64
+# x32 is supported by Linux distribution with gcc4.8 and newer in some
+# cases there is backported support in gcc4.6
+ifneq ($(shell echo | $(CC) $(CPU_CFLAGS) -E - 2>/dev/null 1>/dev/null && echo 0), 0)
+	$(error This version of GCC does not support x32 ABI)
+endif
+
+export ARCH CROSS CPU_CFLAGS CPU_LDFLAGS CPU_ASFLAGS
-- 
1.9.1

^ permalink raw reply	[relevance 8%]

* Re: [dpdk-dev] DPDK Community Conference Call - Friday 31st October
  2014-11-01 12:59  3%     ` Neil Horman
@ 2014-11-01 14:05  0%       ` Vincent JARDIN
  0 siblings, 0 replies; 200+ results
From: Vincent JARDIN @ 2014-11-01 14:05 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

+1 for hangout
Le 1 nov. 2014 13:59, "Neil Horman" <nhorman@tuxdriver.com> a écrit :

> On Fri, Oct 31, 2014 at 05:36:59PM +0000, O'driscoll, Tim wrote:
> > Thanks again to those who attended the call earlier. Hopefully people
> found it useful.
> >
> > We'll schedule a follow-up call for 2 weeks' time. One thing that we do
> want to look into is an easy way to allow screen sharing, so that we can
> use some slides to guide the discussion. Internally within Intel we use MS
> Lync. We can try that, but it's not always very user-friendly for external
> participants, and doesn't have a Linux client. Other options would include
> GoToMeeting or WebEx. If anybody has input on a good tool for this, let me
> know.
> >
> Don't use Lync, its a horrid tool.  As you note, there is no linux client
> (nor a
> mac client that I'm aware of).  Google hangouts offers screen sharing, and
> is
> free for anyone to use.
>
> > We covered the following features from our 2.0 list today, and will
> discuss the remainder on the next call. I've called out below who on our
> side was describing each of the features, and included their email
> addresses. If anybody has further questions on these, feel free to either
> ask openly on the mailing list, or else contact the relevant person
> directly.
> >
> > Bifurcated Driver (Danny.Zhou@intel.com)
> > Packet Reordering/Packet Distributor (Bruce.Richardson@intel.com)
> > New Hardware Support (Walter.E.Gilmore@intel.com)
> > Fortville features (Heqing.Zhu@intel.com)
> > Support Multiple Threads per Core (Venky.Venkatesan@intel.com)
> > Cuckoo Hash (Bruce.Richardson@intel.com, Venky.Venkatesan@intel.com)
> >
> > The Cuckoo Hash paper that was mentioned is available at:
> http://www.cs.cmu.edu/~dongz/papers/cuckooswitch.pdf.
> >
> > Finally, if anybody has suggestions for topics for future calls, please
> let me know.
> >
> ABI versioning, in support of packaging the DPDK for non-rebuilding users.
>
> Neil
>
> >
> > Thanks,
> > Tim
> >
> > > -----Original Message-----
> > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of O'driscoll, Tim
> > > Sent: Friday, October 31, 2014 3:35 PM
> > > To: 'dev@dpdk.org'
> > > Subject: Re: [dpdk-dev] DPDK Community Conference Call - Friday 31st
> > > October
> > >
> > > This is just a reminder for anybody who's interested that this will be
> on in 30
> > > minutes, and that we'll be discussing the feature list for the DPDK
> 2.0 release
> > > in March 2015.
> > >
> > > Audio bridge details are:
> > > France:             +33 1588 77298
> > > Germany:    +49 8999 143191
> > > Israel:             +972 2589 6577
> > > Russia:             +7 495 641 4663
> > > UK:         +44 1793 402663
> > > USA/Canada: +1 916 356 2663 or +1-888-875-9370
> > >
> > > Bridge: 5
> > > Conference ID: 1264677285
> > >
> > >
> > > Tim
> > >
> > > > -----Original Message-----
> > > > From: O'driscoll, Tim
> > > > Sent: Friday, October 24, 2014 10:22 AM
> > > > To: dev@dpdk.org
> > > > Subject: DPDK Community Conference Call - Friday 31st October
> > > >
> > > > We're planning to hold our first community conference call on Friday
> > > > 31st October. It's impossible to find a time that suits everybody, so
> > > > we've chosen to do this in the afternoon/evening in Europe, which is
> > > > the morning in the USA. This does unfortunately limit participation
> > > > from PRC, Japan and other parts of the world. Here's the time and
> date in a
> > > variety of time zones:
> > > >
> > > > Dublin (Ireland)                  Friday, October 31, 2014 at
> > > > 4:00:00 PM    GMT UTC
> > > > Paris (France)                            Friday, October 31, 2014
> at 5:00:00
> > > > PM    CET UTC+1 hour
> > > > San Francisco (U.S.A. - California)       Friday, October 31, 2014
> at 9:00:00
> > > > AM    PDT UTC-7 hours
> > > > New York (U.S.A. - New York)              Friday, October 31, 2014 at
> > > 12:00:00
> > > > Noon EDT UTC-4 hours
> > > > Tel Aviv (Israel)                         Friday, October 31, 2014 at
> > > 6:00:00
> > > > PM    IST UTC+2 hours
> > > > Moscow (Russia)                   Friday, October 31, 2014 at 7:00:00
> > > > PM    MSK UTC+3 hours
> > > >
> > > >
> > > > Audio bridge details are:
> > > > France:           +33 1588 77298
> > > > Germany:  +49 8999 143191
> > > > Israel:           +972 2589 6577
> > > > Russia:           +7 495 641 4663
> > > > UK:               +44 1793 402663
> > > > USA:              +1 916 356 2663
> > > >
> > > > Bridge: 5
> > > > Conference ID: 1264677285
> > > >
> > > > If anybody needs an access number for another country, let me know.
> > > >
> > > >
> > > > Agenda:
> > > > Discuss feature list for DPDK 2.0 (Q1 2015).
> > > > Suggestions for topics for future calls.
> > > >
> > > >
> > > > Thanks,
> > > > Tim
> >
>

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] DPDK Community Conference Call - Friday 31st October
  @ 2014-11-01 12:59  3%     ` Neil Horman
  2014-11-01 14:05  0%       ` Vincent JARDIN
  0 siblings, 1 reply; 200+ results
From: Neil Horman @ 2014-11-01 12:59 UTC (permalink / raw)
  To: O'driscoll, Tim; +Cc: 'dev@dpdk.org'

On Fri, Oct 31, 2014 at 05:36:59PM +0000, O'driscoll, Tim wrote:
> Thanks again to those who attended the call earlier. Hopefully people found it useful.
> 
> We'll schedule a follow-up call for 2 weeks' time. One thing that we do want to look into is an easy way to allow screen sharing, so that we can use some slides to guide the discussion. Internally within Intel we use MS Lync. We can try that, but it's not always very user-friendly for external participants, and doesn't have a Linux client. Other options would include GoToMeeting or WebEx. If anybody has input on a good tool for this, let me know.
> 
Don't use Lync, its a horrid tool.  As you note, there is no linux client (nor a
mac client that I'm aware of).  Google hangouts offers screen sharing, and is
free for anyone to use.

> We covered the following features from our 2.0 list today, and will discuss the remainder on the next call. I've called out below who on our side was describing each of the features, and included their email addresses. If anybody has further questions on these, feel free to either ask openly on the mailing list, or else contact the relevant person directly.
> 
> Bifurcated Driver (Danny.Zhou@intel.com)
> Packet Reordering/Packet Distributor (Bruce.Richardson@intel.com)
> New Hardware Support (Walter.E.Gilmore@intel.com)
> Fortville features (Heqing.Zhu@intel.com)
> Support Multiple Threads per Core (Venky.Venkatesan@intel.com)
> Cuckoo Hash (Bruce.Richardson@intel.com, Venky.Venkatesan@intel.com)
> 
> The Cuckoo Hash paper that was mentioned is available at: http://www.cs.cmu.edu/~dongz/papers/cuckooswitch.pdf.
> 
> Finally, if anybody has suggestions for topics for future calls, please let me know.
> 
ABI versioning, in support of packaging the DPDK for non-rebuilding users.

Neil

> 
> Thanks,
> Tim
> 
> > -----Original Message-----
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of O'driscoll, Tim
> > Sent: Friday, October 31, 2014 3:35 PM
> > To: 'dev@dpdk.org'
> > Subject: Re: [dpdk-dev] DPDK Community Conference Call - Friday 31st
> > October
> > 
> > This is just a reminder for anybody who's interested that this will be on in 30
> > minutes, and that we'll be discussing the feature list for the DPDK 2.0 release
> > in March 2015.
> > 
> > Audio bridge details are:
> > France:		+33 1588 77298
> > Germany:	+49 8999 143191
> > Israel:		+972 2589 6577
> > Russia: 		+7 495 641 4663
> > UK:		+44 1793 402663
> > USA/Canada:	+1 916 356 2663 or +1-888-875-9370
> > 
> > Bridge: 5
> > Conference ID: 1264677285
> > 
> > 
> > Tim
> > 
> > > -----Original Message-----
> > > From: O'driscoll, Tim
> > > Sent: Friday, October 24, 2014 10:22 AM
> > > To: dev@dpdk.org
> > > Subject: DPDK Community Conference Call - Friday 31st October
> > >
> > > We're planning to hold our first community conference call on Friday
> > > 31st October. It's impossible to find a time that suits everybody, so
> > > we've chosen to do this in the afternoon/evening in Europe, which is
> > > the morning in the USA. This does unfortunately limit participation
> > > from PRC, Japan and other parts of the world. Here's the time and date in a
> > variety of time zones:
> > >
> > > Dublin (Ireland)			Friday, October 31, 2014 at
> > > 4:00:00 PM    GMT UTC
> > > Paris (France)				Friday, October 31, 2014 at 5:00:00
> > > PM    CET UTC+1 hour
> > > San Francisco (U.S.A. - California)	Friday, October 31, 2014 at 9:00:00
> > > AM    PDT UTC-7 hours
> > > New York (U.S.A. - New York)		Friday, October 31, 2014 at
> > 12:00:00
> > > Noon EDT UTC-4 hours
> > > Tel Aviv (Israel)				Friday, October 31, 2014 at
> > 6:00:00
> > > PM    IST UTC+2 hours
> > > Moscow (Russia)			Friday, October 31, 2014 at 7:00:00
> > > PM    MSK UTC+3 hours
> > >
> > >
> > > Audio bridge details are:
> > > France:		+33 1588 77298
> > > Germany:	+49 8999 143191
> > > Israel:		+972 2589 6577
> > > Russia: 		+7 495 641 4663
> > > UK:		+44 1793 402663
> > > USA:		+1 916 356 2663
> > >
> > > Bridge: 5
> > > Conference ID: 1264677285
> > >
> > > If anybody needs an access number for another country, let me know.
> > >
> > >
> > > Agenda:
> > > Discuss feature list for DPDK 2.0 (Q1 2015).
> > > Suggestions for topics for future calls.
> > >
> > >
> > > Thanks,
> > > Tim
> 

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [dpdk-announce] DPDK Features for Q1 2015
  2014-10-22 13:48  2% [dpdk-dev] [dpdk-announce] DPDK Features for Q1 2015 O'driscoll, Tim
@ 2014-10-22 16:10  3% ` Luke Gorrie
  0 siblings, 0 replies; 200+ results
From: Luke Gorrie @ 2014-10-22 16:10 UTC (permalink / raw)
  To: O'driscoll, Tim; +Cc: dev

Hi Tim,

On 22 October 2014 15:48, O'driscoll, Tim <tim.o'driscoll@intel.com> wrote:

> 2.0 (Q1 2015) DPDK Features:
> Bifurcated Driver: With the Bifurcated Driver, the kernel will retain
> direct control of the NIC, and will assign specific queue pairs to DPDK.
> Configuration of the NIC is controlled by the kernel via ethtool.
>

That sounds awesome and potentially really useful for other people writing
userspace data planes too. If I understand correctly, this way the messy
details can be contained in one place (kernel) and the application (DPDK
PMD or otherwise) will access the NIC TX/RX queue via the ABI defined in
the hardware data sheet.

Single Virtio Driver: Merge existing Virtio drivers into a single
> implementation, incorporating the best features from each of the existing
> drivers.
>

Cool. Do you have a strategy in mind already for zero-copy optimisation
with VMDq? I have seen some patches floating around for this and it's an
area of active interest for myself and others. I see a lot of potential for
making this work more effectively with some modest extensions to Virtio and
guest behaviour, and would love to meet kindred spirits who are thinking
along these lines too.

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [dpdk-announce] DPDK Features for Q1 2015
@ 2014-10-22 13:48  2% O'driscoll, Tim
  2014-10-22 16:10  3% ` Luke Gorrie
  0 siblings, 1 reply; 200+ results
From: O'driscoll, Tim @ 2014-10-22 13:48 UTC (permalink / raw)
  To: announce

We're starting to plan our DPDK features for next year. We're planning to have a DPDK 2.0 release at the end of March, and we'd like to inform the community of the features that we hope to submit to that release. The current list of features, along with brief descriptions, is included below.

There will naturally be some changes to this list as work on these features progresses. Some will inevitably turn out to be bigger than anticipated and will need to be deferred to a later date, while other priorities will arise and need to be accommodated. So, this list will be subject to change, and should be taken as guidance on what we hope to submit, not a commitment.

Our aim in providing this information now is to solicit input from the community. We'd like to make sure we avoid duplication or conflicts with work that others are planning, so we'd be interested in hearing any plans that others in the community have for contributions to DPDK in this timeframe. This will allow us to build a complete picture and ensure we avoid duplication of effort. 

I'm sure people will have questions, and will be looking for more information on these features. Further details will be provided by the individual developers over the next few months. We aim to make better use of the RFC process in this release, and provide early outlines of the features so that we can obtain community feedback as soon as possible.

We also said at the recent DPDK Summit that we would investigate holding regular community conference calls. We'll be scheduling the first of these calls soon, and will use this to discuss the 2.0 (Q1 2015) features in a bit more detail.


2.0 (Q1 2015) DPDK Features:
Bifurcated Driver: With the Bifurcated Driver, the kernel will retain direct control of the NIC, and will assign specific queue pairs to DPDK. Configuration of the NIC is controlled by the kernel via ethtool.

Support the new Intel SoC platform, along with the embedded 10GbE NIC.

Packet Reordering: Assign a sequence number to packets on Rx, and then provide the ability to reorder on Tx to preserve the original order.

Packet Distributor (phase 2): Implement the following enhancements to the Packet Distributor that was originally delivered in the DPDK 1.7 release: performance improvements; the ability for packets from a flow to be processed by multiple worker cores in parallel and then reordered on Tx using the Packet Reordering feature; the ability to have multiple Distributors which share Worker cores.

Support Multiple Threads per Core: Use Linux cgroups to allow multiple threads to run on a single core. This would be useful in situations where a DPDK thread does not require the full resources of a core.

Support the Fedora 21 OS.

Support the host interface for Intel's next generation Ethernet switch. This only covers basic support for the host interface. Support for additional features will be added later.

Cuckoo Hash: A new hash algorithm was implemented as part of the Cuckoo Switch project (see http://www.cs.cmu.edu/~dongz/papers/cuckooswitch.pdf), and shows some promising performance results. This needs to be modified to make it more generic, and then incorporated into DPDK.

Provide DPDK support for uio_pci_generic.

Integrated Qemu Userspace vHost: Modify Userspace vHost to use Qemu version 2.1, and remove the need for the kernel module (cuse.ko).

PCI Hot Plug: When you migrate a VM, you need hot plug support as the new VF on the new hardware you are running on post-migration needs to be initialized. With an emulated NIC migration is seamless as all configuration for the NIC is within the RAM of the VM and the hypervisor. With a VF you have actual hardware in the picture which needs to be set up properly.

Additional XL710/X710 40-Gigabit Ethernet Controller Features:	Support for additional XL710/X710 40-Gigabit Ethernet Controller features, including bandwidth and QoS management, NVGRE and other network overlay support, TSO, IEEE1588, DCB support.  SR-IOV switching and port mirroring.

Single Virtio Driver: Merge existing Virtio drivers into a single implementation, incorporating the best features from each of the existing drivers.

X32 ABI: This is an application binary interface project for the Linux kernel that allows programs to take advantage of the benefits of x86-64 (larger number of CPU registers, better floating-point performance, faster position-independent code shared libraries, function parameters passed via registers, faster syscall instruction) while using 32-bit pointers and thus avoiding the overhead of 64-bit pointers.

AVX2 ACL: Modify ACL library to use AVX2 instructions to improve performance.

Interrupt mode for PMD: Allow DPDK process to transition to interrupt mode when load is low so that other processes can run, or else power can be saved. This will increase latency/jitter.

DPDK Headroom: Provide a mechanism to indicate how much headroom (spare capacity) exists in a DPDK process.


Thanks,
Tim

^ permalink raw reply	[relevance 2%]

* Re: [dpdk-dev] [PATCH v2 3/4] Update library build process
  2014-10-08 22:36  0%         ` Matthew Hall
@ 2014-10-09  9:44  0%           ` Sergio Gonzalez Monroy
  0 siblings, 0 replies; 200+ results
From: Sergio Gonzalez Monroy @ 2014-10-09  9:44 UTC (permalink / raw)
  To: Matthew Hall; +Cc: dev

On Wed, Oct 08, 2014 at 03:36:55PM -0700, Matthew Hall wrote:
> On Tue, Oct 07, 2014 at 10:55:11AM +0100, Sergio Gonzalez Monroy wrote:
> > I don't see how this particular patch would force people to change their code,
> > though in all likelihood they will have to as a result of ABI changes in the
> > following release.
> >
> > The only difference now would be when they link their applications against a
> > single library instead of multiple separated libraries.
> > 
> > Thanks,
> > Sergio
> 
> Hi Sergio,
> 
> Changing all of your Makefiles does sound like changing code to me.
> 

Hi Matthew,

You are right, it is changing code.
What I was trying to say is that the impact of this patch is probrably going to
be one of the lowest as far as changing code for the next release.

Thanks,
Sergio

> Matthew.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v2 3/4] Update library build process
  2014-10-07  9:55  3%       ` Sergio Gonzalez Monroy
@ 2014-10-08 22:36  0%         ` Matthew Hall
  2014-10-09  9:44  0%           ` Sergio Gonzalez Monroy
  0 siblings, 1 reply; 200+ results
From: Matthew Hall @ 2014-10-08 22:36 UTC (permalink / raw)
  To: Sergio Gonzalez Monroy; +Cc: dev

On Tue, Oct 07, 2014 at 10:55:11AM +0100, Sergio Gonzalez Monroy wrote:
> I don't see how this particular patch would force people to change their code,
> though in all likelihood they will have to as a result of ABI changes in the
> following release.
>
> The only difference now would be when they link their applications against a
> single library instead of multiple separated libraries.
> 
> Thanks,
> Sergio

Hi Sergio,

Changing all of your Makefiles does sound like changing code to me.

Matthew.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 0/4] Add DSO symbol versioning to support backwards compatibility
  2014-10-08 15:57  0%             ` Thomas Monjalon
  2014-10-08 18:46  3%               ` Butler, Siobhan A
@ 2014-10-08 19:09  4%               ` Neil Horman
  1 sibling, 0 replies; 200+ results
From: Neil Horman @ 2014-10-08 19:09 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Wed, Oct 08, 2014 at 05:57:29PM +0200, Thomas Monjalon wrote:
> Hi Neil,
> 
> 2014-10-07 17:01, Neil Horman:
> > On Wed, Oct 01, 2014 at 02:59:40PM -0400, Neil Horman wrote:
> > > On Fri, Sep 26, 2014 at 10:45:49AM -0400, Neil Horman wrote:
> > > > On Fri, Sep 26, 2014 at 12:41:33PM +0200, Thomas Monjalon wrote:
> > > > > Hi Neil,
> > > > > 
> > > > > 2014-09-24 14:19, Neil Horman:
> > > > > > Ping Thomas. I know you're busy, but I would like this to not fall off anyones
> > > > > > radar.  You alluded to concerns regarding what, for lack of a better term,
> > > > > > ABI/API lockin.  I had asked you to enuumerate/elaborate on specifics, but never
> > > > > > heard back.  Are there further specifics you wish to discuss, or are you
> > > > > > satisfied with the above answers?
> > > > > 
> > > > > Sorry for not being very reactive on this thread.
> > > > > All this discussion is very interesting but it's really not the proper
> > > > > time to apply it. As you said, it requires an extra effort. I'm not saying
> > > > > it will never be integrated. I'm just saying that we cannot change
> > > > > everything at the same time.
> > > > > 
> > > > > Let me sum up the situation. This community project has been very active
> > > > > for few months now. First, we learnt how to make some releases together
> > > > > and we are improving the process to be able to deliver a new major release
> > > > > every 4 months while having some good quality process.
> > > > > But these releases are still not complete because documentation is not
> > > > > integrated yet. Then developers should have a role in documentation updates.
> > > > > We also need to integrate and learn how to use more tools to be more
> > > > > efficient and improve quality.
> > > > > 
> > > > > So the question is "when should we care about API compatibility"?
> > > > > And the answer is: ASAP, but not now. I feel next year is a better target.
> > > > > Because the most important priority is to move together at a pace which
> > > > > allow most of us to stay in the race.
> > > > 
> > > > I'm sorry Thomas, I don't accept this.  I asked you for details as to your
> > > > concerns regarding this patch series, and you've provided more vague comments.
> > > > I need details to address
> > > > 
> > > > You say it requires extra effort, you're right it does.  Any feature that you
> > > > integreate requires some additional effort.  How is this patch any different
> > > > from adding the acl library or any other new API?  Everything requires
> > > > maintenence, thats how software works.  What specfically about this patch series
> > > > makes the effort insurmountable to you?
> > > > 
> > > > You say you're improving your process.  Great, this patch aids in that process
> > > > by ensuring backwards compatibility for a period of time.  Given that the API
> > > > and ABI can still evolve within this framework, as I've described, how is this
> > > > patch series not a significant step forward toward your goal of quality process.
> > > > 
> > > > You say documentation isn't integrated.  So, what does getting documentation
> > > > integrated have to do with this patch set, or any other?  I don't see you
> > > > holding any other patches based on documentation.  Again, nothing in this series
> > > > prevents evolution of the API or ABI.  If you're hope is to wait until
> > > > everything is perfect, then apply some control to the public facing API, and get
> > > > it all documented, none of thosse things will ever happen, I promise you.
> > > > 
> > > > You say you also need to learn to use more tools to be more efficient and
> > > > improve quality.  Great!  Thats exactly what this is. If we mandate even a short
> > > > term commitment to ABI stability (1 single relese worth of time), we will
> > > > quickly identify what API's change quickly and where we need to be cautious with
> > > > our API design.  If you just assume that developers will get better of their own
> > > > volition, it will never happen.
> > > > 
> > > > You say this should go in next year, but not now.  When exactly?  What event do
> > > > you forsee occuring in the next 12-18 months that will change everything such
> > > > that we can start supporing an ABI for more than just a few weeks at the head of
> > > > the tree?  
> > > > 
> > > > To this end, I just did a quick search through the git history for dpdk to look
> > > > at the histories of all the header files that are exposed via the makefile
> > > > SYMLINK command (given that that provides a list of header files that
> > > > applications can include, and embodies all the function symbols and data types
> > > > applications have access to.
> > > > 
> > > > There are 179 total commits in that list
> > > > Of those, a bit of spot checking suggests that about 10-15% of them actually
> > > > change ABI, and many of those came from Bruce's rework of the mbuf structure.
> > > > That about 17-20 instances over the last 2 years where an ABI update would have
> > > > been needed.  That seems pretty reasonable to me.  Where exactly is your concern
> > > > here?
> > > 
> > > Ping Thomas, I'd like to continue this debate to a conclusion.  Could you please
> > > provide specific details and/or concerns that you have with this patch series?
> > > 
> > Ping again Thomas, please lets debate this to a reasonable consensus.  Ignoring
> > it won't help anything.
> 
> I'm not ignoring the discussion, I was trying to focus on other topics.
> 
for 2 weeks?  In that time frame, it seems like this could have made 1.8, but I
suppose thats neither here nor there.

> You're right, we need a conclusion.
> This patch is an important change which needs time to be finely checked and
> tested.
Not sure I understand this.  At the moment, all this patch introduces in
infrastructure, testing has been done on it, to ensure that it allows for
multiple versions of a function to exist (See Sergios comments).  Beyond that,
this patch should do nothing, save for restrict the symbol export list to the
set of symbols you expose as an API.  That last bit was why I was so eager to
get this in weeks ago, so people could do builds and make sure no symbols were
missed).  But from a functional standpoint, this patch current does nothing (nor
should it).  Its functionality (and need for testing) comes only when the next
ABI change arrives, and we need to ensure that both old and new versions of a
given function work.

> So I plan to integrate it in version 2.0 which will be the next one
> after 1.8 release.
What do you see as the advantage to waiting longer here?  Already this patch
likely will need some fixups because of API changing patches integrated ahead of
the time I posted it.  As noted above, this series just install infrastructure,
its doesn't actively "do" anything right now, nor should it. It will only allow
developers to do something after you integrate it and ABI needs to change (in
that order).  By waiting longer, the only thing that happens is that the export
map file become more out of date.

> In the mean time you could test this patch with Fedora
> and see how it helps application packaging. Then we could be more confident
> that we are applying the right policy starting with 2.0.
> 
Again, I could add this patch to fedora, but without a subsequent change that
introduces an ABI incompatibility that we need to provide backwards
compatibility for, this patch will be functionally invisible.  I'm not sure what
the goal of doing something like that would be.  If you have a specific goal in
mind, please let me know and I gladly consider it, I just don't see it at the
moment.

> Thanks Neil, I appreciate your involvement in DPDK
And I yours.  I'm sorry for being so beligerent about this, but it seems to me
that, without raising my voice, this would go nowhere.

Neil

> -- 
> Thomas
> 

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH 0/4] Add DSO symbol versioning to support backwards compatibility
  2014-10-08 15:57  0%             ` Thomas Monjalon
@ 2014-10-08 18:46  3%               ` Butler, Siobhan A
  2014-10-08 19:09  4%               ` Neil Horman
  1 sibling, 0 replies; 200+ results
From: Butler, Siobhan A @ 2014-10-08 18:46 UTC (permalink / raw)
  To: Thomas Monjalon, Neil Horman; +Cc: dev


From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas Monjalon
Sent: Wednesday, October 8, 2014 4:57 PM
To: Neil Horman
Cc: dev@dpdk.org
Subject: Re: [dpdk-dev] [PATCH 0/4] Add DSO symbol versioning to support backwards compatibility

Hi Neil,

2014-10-07 17:01, Neil Horman:
> On Wed, Oct 01, 2014 at 02:59:40PM -0400, Neil Horman wrote:
> > On Fri, Sep 26, 2014 at 10:45:49AM -0400, Neil Horman wrote:
> > > On Fri, Sep 26, 2014 at 12:41:33PM +0200, Thomas Monjalon wrote:
> > > > Hi Neil,
> > > > 
> > > > 2014-09-24 14:19, Neil Horman:
> > > > > Ping Thomas. I know you're busy, but I would like this to not 
> > > > > fall off anyones radar.  You alluded to concerns regarding 
> > > > > what, for lack of a better term, ABI/API lockin.  I had asked 
> > > > > you to enuumerate/elaborate on specifics, but never heard 
> > > > > back.  Are there further specifics you wish to discuss, or are you satisfied with the above answers?
> > > > 
> > > > Sorry for not being very reactive on this thread.
> > > > All this discussion is very interesting but it's really not the 
> > > > proper time to apply it. As you said, it requires an extra 
> > > > effort. I'm not saying it will never be integrated. I'm just 
> > > > saying that we cannot change everything at the same time.
> > > > 
> > > > Let me sum up the situation. This community project has been 
> > > > very active for few months now. First, we learnt how to make 
> > > > some releases together and we are improving the process to be 
> > > > able to deliver a new major release every 4 months while having some good quality process.
> > > > But these releases are still not complete because documentation 
> > > > is not integrated yet. Then developers should have a role in documentation updates.
> > > > We also need to integrate and learn how to use more tools to be 
> > > > more efficient and improve quality.
> > > > 
> > > > So the question is "when should we care about API compatibility"?
> > > > And the answer is: ASAP, but not now. I feel next year is a better target.
> > > > Because the most important priority is to move together at a 
> > > > pace which allow most of us to stay in the race.
> > > 
> > > I'm sorry Thomas, I don't accept this.  I asked you for details as 
> > > to your concerns regarding this patch series, and you've provided more vague comments.
> > > I need details to address
> > > 
> > > You say it requires extra effort, you're right it does.  Any 
> > > feature that you integreate requires some additional effort.  How 
> > > is this patch any different from adding the acl library or any 
> > > other new API?  Everything requires maintenence, thats how 
> > > software works.  What specfically about this patch series makes the effort insurmountable to you?
> > > 
> > > You say you're improving your process.  Great, this patch aids in 
> > > that process by ensuring backwards compatibility for a period of 
> > > time.  Given that the API and ABI can still evolve within this 
> > > framework, as I've described, how is this patch series not a significant step forward toward your goal of quality process.
> > > 
> > > You say documentation isn't integrated.  So, what does getting 
> > > documentation integrated have to do with this patch set, or any 
> > > other?  I don't see you holding any other patches based on 
> > > documentation.  Again, nothing in this series prevents evolution 
> > > of the API or ABI.  If you're hope is to wait until everything is 
> > > perfect, then apply some control to the public facing API, and get it all documented, none of thosse things will ever happen, I promise you.
> > > 
> > > You say you also need to learn to use more tools to be more 
> > > efficient and improve quality.  Great!  Thats exactly what this 
> > > is. If we mandate even a short term commitment to ABI stability (1 
> > > single relese worth of time), we will quickly identify what API's 
> > > change quickly and where we need to be cautious with our API 
> > > design.  If you just assume that developers will get better of their own volition, it will never happen.
> > > 
> > > You say this should go in next year, but not now.  When exactly?  
> > > What event do you forsee occuring in the next 12-18 months that 
> > > will change everything such that we can start supporing an ABI for 
> > > more than just a few weeks at the head of the tree?
> > > 
> > > To this end, I just did a quick search through the git history for 
> > > dpdk to look at the histories of all the header files that are 
> > > exposed via the makefile SYMLINK command (given that that provides 
> > > a list of header files that applications can include, and embodies 
> > > all the function symbols and data types applications have access to.
> > > 
> > > There are 179 total commits in that list Of those, a bit of spot 
> > > checking suggests that about 10-15% of them actually change ABI, 
> > > and many of those came from Bruce's rework of the mbuf structure.
> > > That about 17-20 instances over the last 2 years where an ABI 
> > > update would have been needed.  That seems pretty reasonable to 
> > > me.  Where exactly is your concern here?
> > 
> > Ping Thomas, I'd like to continue this debate to a conclusion.  
> > Could you please provide specific details and/or concerns that you have with this patch series?
> > 
> Ping again Thomas, please lets debate this to a reasonable consensus.  
> Ignoring it won't help anything.

>>>I'm not ignoring the discussion, I was trying to focus on other topics.

>>>You're right, we need a conclusion.
>>>This patch is an important change which needs time to be finely checked and tested. So I plan to integrate it in version 2.0 which will be the next one >>>after 1.8 release. In the mean time you could test this patch with Fedora and see how it helps application packaging. Then we could be more confident >>>that we are applying the right policy starting with 2.0.

>>>Thanks Neil, I appreciate your involvement in DPDK
>>>--
>>>Thomas

Neil, Thomas,

I think Neil is correct here - these API/ABI compatibility/stability changes are really important. We need a conclusion as you both mentioned. I see Thomas' points about caution and needing time, but it seems like there is no point in prolonging the inevitable and having consider all of this for some time I think it might be wise to just adjust and get on with it? If these changes cannot be ready in the near term, what will make them more ready further out?

Siobhan 

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH 0/4] Add DSO symbol versioning to support backwards compatibility
  2014-10-07 21:01  0%           ` Neil Horman
@ 2014-10-08 15:57  0%             ` Thomas Monjalon
  2014-10-08 18:46  3%               ` Butler, Siobhan A
  2014-10-08 19:09  4%               ` Neil Horman
  0 siblings, 2 replies; 200+ results
From: Thomas Monjalon @ 2014-10-08 15:57 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

Hi Neil,

2014-10-07 17:01, Neil Horman:
> On Wed, Oct 01, 2014 at 02:59:40PM -0400, Neil Horman wrote:
> > On Fri, Sep 26, 2014 at 10:45:49AM -0400, Neil Horman wrote:
> > > On Fri, Sep 26, 2014 at 12:41:33PM +0200, Thomas Monjalon wrote:
> > > > Hi Neil,
> > > > 
> > > > 2014-09-24 14:19, Neil Horman:
> > > > > Ping Thomas. I know you're busy, but I would like this to not fall off anyones
> > > > > radar.  You alluded to concerns regarding what, for lack of a better term,
> > > > > ABI/API lockin.  I had asked you to enuumerate/elaborate on specifics, but never
> > > > > heard back.  Are there further specifics you wish to discuss, or are you
> > > > > satisfied with the above answers?
> > > > 
> > > > Sorry for not being very reactive on this thread.
> > > > All this discussion is very interesting but it's really not the proper
> > > > time to apply it. As you said, it requires an extra effort. I'm not saying
> > > > it will never be integrated. I'm just saying that we cannot change
> > > > everything at the same time.
> > > > 
> > > > Let me sum up the situation. This community project has been very active
> > > > for few months now. First, we learnt how to make some releases together
> > > > and we are improving the process to be able to deliver a new major release
> > > > every 4 months while having some good quality process.
> > > > But these releases are still not complete because documentation is not
> > > > integrated yet. Then developers should have a role in documentation updates.
> > > > We also need to integrate and learn how to use more tools to be more
> > > > efficient and improve quality.
> > > > 
> > > > So the question is "when should we care about API compatibility"?
> > > > And the answer is: ASAP, but not now. I feel next year is a better target.
> > > > Because the most important priority is to move together at a pace which
> > > > allow most of us to stay in the race.
> > > 
> > > I'm sorry Thomas, I don't accept this.  I asked you for details as to your
> > > concerns regarding this patch series, and you've provided more vague comments.
> > > I need details to address
> > > 
> > > You say it requires extra effort, you're right it does.  Any feature that you
> > > integreate requires some additional effort.  How is this patch any different
> > > from adding the acl library or any other new API?  Everything requires
> > > maintenence, thats how software works.  What specfically about this patch series
> > > makes the effort insurmountable to you?
> > > 
> > > You say you're improving your process.  Great, this patch aids in that process
> > > by ensuring backwards compatibility for a period of time.  Given that the API
> > > and ABI can still evolve within this framework, as I've described, how is this
> > > patch series not a significant step forward toward your goal of quality process.
> > > 
> > > You say documentation isn't integrated.  So, what does getting documentation
> > > integrated have to do with this patch set, or any other?  I don't see you
> > > holding any other patches based on documentation.  Again, nothing in this series
> > > prevents evolution of the API or ABI.  If you're hope is to wait until
> > > everything is perfect, then apply some control to the public facing API, and get
> > > it all documented, none of thosse things will ever happen, I promise you.
> > > 
> > > You say you also need to learn to use more tools to be more efficient and
> > > improve quality.  Great!  Thats exactly what this is. If we mandate even a short
> > > term commitment to ABI stability (1 single relese worth of time), we will
> > > quickly identify what API's change quickly and where we need to be cautious with
> > > our API design.  If you just assume that developers will get better of their own
> > > volition, it will never happen.
> > > 
> > > You say this should go in next year, but not now.  When exactly?  What event do
> > > you forsee occuring in the next 12-18 months that will change everything such
> > > that we can start supporing an ABI for more than just a few weeks at the head of
> > > the tree?  
> > > 
> > > To this end, I just did a quick search through the git history for dpdk to look
> > > at the histories of all the header files that are exposed via the makefile
> > > SYMLINK command (given that that provides a list of header files that
> > > applications can include, and embodies all the function symbols and data types
> > > applications have access to.
> > > 
> > > There are 179 total commits in that list
> > > Of those, a bit of spot checking suggests that about 10-15% of them actually
> > > change ABI, and many of those came from Bruce's rework of the mbuf structure.
> > > That about 17-20 instances over the last 2 years where an ABI update would have
> > > been needed.  That seems pretty reasonable to me.  Where exactly is your concern
> > > here?
> > 
> > Ping Thomas, I'd like to continue this debate to a conclusion.  Could you please
> > provide specific details and/or concerns that you have with this patch series?
> > 
> Ping again Thomas, please lets debate this to a reasonable consensus.  Ignoring
> it won't help anything.

I'm not ignoring the discussion, I was trying to focus on other topics.

You're right, we need a conclusion.
This patch is an important change which needs time to be finely checked and
tested. So I plan to integrate it in version 2.0 which will be the next one
after 1.8 release. In the mean time you could test this patch with Fedora
and see how it helps application packaging. Then we could be more confident
that we are applying the right policy starting with 2.0.

Thanks Neil, I appreciate your involvement in DPDK
-- 
Thomas

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 0/4] Add DSO symbol versioning to support backwards compatibility
  2014-10-01 18:59  0%         ` Neil Horman
@ 2014-10-07 21:01  0%           ` Neil Horman
  2014-10-08 15:57  0%             ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Neil Horman @ 2014-10-07 21:01 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Wed, Oct 01, 2014 at 02:59:40PM -0400, Neil Horman wrote:
> On Fri, Sep 26, 2014 at 10:45:49AM -0400, Neil Horman wrote:
> > On Fri, Sep 26, 2014 at 12:41:33PM +0200, Thomas Monjalon wrote:
> > > Hi Neil,
> > > 
> > > 2014-09-24 14:19, Neil Horman:
> > > > Ping Thomas. I know you're busy, but I would like this to not fall off anyones
> > > > radar.  You alluded to concerns regarding what, for lack of a better term,
> > > > ABI/API lockin.  I had asked you to enuumerate/elaborate on specifics, but never
> > > > heard back.  Are there further specifics you wish to discuss, or are you
> > > > satisfied with the above answers?
> > > 
> > > Sorry for not being very reactive on this thread.
> > > All this discussion is very interesting but it's really not the proper
> > > time to apply it. As you said, it requires an extra effort. I'm not saying
> > > it will never be integrated. I'm just saying that we cannot change
> > > everything at the same time.
> > > 
> > > Let me sum up the situation. This community project has been very active
> > > for few months now. First, we learnt how to make some releases together
> > > and we are improving the process to be able to deliver a new major release
> > > every 4 months while having some good quality process.
> > > But these releases are still not complete because documentation is not
> > > integrated yet. Then developers should have a role in documentation updates.
> > > We also need to integrate and learn how to use more tools to be more
> > > efficient and improve quality.
> > > 
> > > So the question is "when should we care about API compatibility"?
> > > And the answer is: ASAP, but not now. I feel next year is a better target.
> > > Because the most important priority is to move together at a pace which
> > > allow most of us to stay in the race.
> > > 
> > 
> > 
> > I'm sorry Thomas, I don't accept this.  I asked you for details as to your
> > concerns regarding this patch series, and you've provided more vague comments.
> > I need details to address
> > 
> > You say it requires extra effort, you're right it does.  Any feature that you
> > integreate requires some additional effort.  How is this patch any different
> > from adding the acl library or any other new API?  Everything requires
> > maintenence, thats how software works.  What specfically about this patch series
> > makes the effort insurmountable to you?
> > 
> > You say you're improving your process.  Great, this patch aids in that process
> > by ensuring backwards compatibility for a period of time.  Given that the API
> > and ABI can still evolve within this framework, as I've described, how is this
> > patch series not a significant step forward toward your goal of quality process.
> > 
> > You say documentation isn't integrated.  So, what does getting documentation
> > integrated have to do with this patch set, or any other?  I don't see you
> > holding any other patches based on documentation.  Again, nothing in this series
> > prevents evolution of the API or ABI.  If you're hope is to wait until
> > everything is perfect, then apply some control to the public facing API, and get
> > it all documented, none of thosse things will ever happen, I promise you.
> > 
> > You say you also need to learn to use more tools to be more efficient and
> > improve quality.  Great!  Thats exactly what this is. If we mandate even a short
> > term commitment to ABI stability (1 single relese worth of time), we will
> > quickly identify what API's change quickly and where we need to be cautious with
> > our API design.  If you just assume that developers will get better of their own
> > volition, it will never happen.
> > 
> > You say this should go in next year, but not now.  When exactly?  What event do
> > you forsee occuring in the next 12-18 months that will change everything such
> > that we can start supporing an ABI for more than just a few weeks at the head of
> > the tree?  
> > 
> > To this end, I just did a quick search through the git history for dpdk to look
> > at the histories of all the header files that are exposed via the makefile
> > SYMLINK command (given that that provides a list of header files that
> > applications can include, and embodies all the function symbols and data types
> > applications have access to.
> > 
> > There are 179 total commits in that list
> > Of those, a bit of spot checking suggests that about 10-15% of them actually
> > change ABI, and many of those came from Bruce's rework of the mbuf structure.
> > That about 17-20 instances over the last 2 years where an ABI update would have
> > been needed.  That seems pretty reasonable to me.  Where exactly is your concern
> > here?
> > 
> > Neil
> > 
> 
> Ping Thomas, I'd like to continue this debate to a conclusion.  Could you please
> provide specific details and/or concerns that you have with this patch series?
> 
> Thanks
> Neil
> 
Ping again Thomas, please lets debate this to a reasonable consensus.  Ignoring
it won't help anything.


Regards
Neil

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v2 3/4] Update library build process
  @ 2014-10-07  9:55  3%       ` Sergio Gonzalez Monroy
  2014-10-08 22:36  0%         ` Matthew Hall
  0 siblings, 1 reply; 200+ results
From: Sergio Gonzalez Monroy @ 2014-10-07  9:55 UTC (permalink / raw)
  To: Matthew Hall; +Cc: dev

On Mon, Oct 06, 2014 at 01:46:07PM -0700, Matthew Hall wrote:
> On Mon, Oct 06, 2014 at 11:52:34AM +0100, Sergio Gonzalez Monroy wrote:
> > Remove COMBINE_LIBS option and by default build:
> > - CONFIG_RTE_BUILD_SHARED_LIB=y : both individual and combined libraries
> > - CONFIG_RTE_BUILD_SHARED_LIB=n : single combined library
> 
> As previously discussed.,It would be better for backward-compatibility of 
> people linking against DPDK, if the static lib could come out as both a 
> combined library and separate individual libraries by default.
> 
> Otherwise everybody linking against DPDK has to change their code, and it 
> won't be easy for them to move forward and backward against different DPDKs 
> before and after this change.
> 
> Thanks,
> Matthew.

Hi Matthew,

My understanding from previous conversations is that backward-compatibility
is not being provided for the next release, as such it is unlikely that
backward-compatibility for compile/linking will be provided.

I don't see how this particular patch would force people to change their code,
though in all likelihood they will have to as a result of ABI changes in the
following release.
The only difference now would be when they link their applications against a
single library instead of multiple separated libraries.

Thanks,
Sergio

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH 0/4] Fix build issues with CONFIG_RTE_BUILD_COMBINE_LIBS=y
  @ 2014-10-04  2:30  3%             ` Neil Horman
  0 siblings, 0 replies; 200+ results
From: Neil Horman @ 2014-10-04  2:30 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev

On Fri, Oct 03, 2014 at 04:52:40PM -0700, Stephen Hemminger wrote:
> On Fri, 3 Oct 2014 07:28:33 -0400
> Neil Horman <nhorman@tuxdriver.com> wrote:
> 
> >  I.e. you can ship your pmd's
> > pacakged separately from your core
> 
> I was hoping only the application API would be "stable"
> As we know from Linux kernel, internal API's will never remain stable.
> 

None of the API's are stable.  My only hope with the ABI series I've posted is
to keep the interfaces stable for a release beyond the next time they change, so
that application developers aren't consistently caught off guard if they don't
synchronize with the DPDK release schedule.

I know the kernel API's are constantly changing, but this isn't the kernel,
its a user space library.  Theres nothing that prevents a third party from
writing a pmd to interface to the ethdev library, which is no different from any
other user space library.  If the DPDK wants to get packaged like other
libraries in distributions, it needs to provide stability assurances like other
libraries.

Neil

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH] Fix linking errors when CONFIG_RTE_BUILD_SHARED_LIB is enabled
  2014-10-02  9:05  0%             ` Tetsuya Mukawa
@ 2014-10-03 11:11  0%               ` Sergio Gonzalez Monroy
  0 siblings, 0 replies; 200+ results
From: Sergio Gonzalez Monroy @ 2014-10-03 11:11 UTC (permalink / raw)
  To: Tetsuya Mukawa; +Cc: dev

On Thu, Oct 02, 2014 at 06:05:09PM +0900, Tetsuya Mukawa wrote:
> (2014/10/02 17:53), Sergio Gonzalez Monroy wrote:
> > On Thu, Oct 02, 2014 at 05:28:04PM +0900, Tetsuya Mukawa wrote:
> >> (2014/10/02 17:12), Sergio Gonzalez Monroy wrote:
> >>> On Thu, Oct 02, 2014 at 11:48:37AM +0900, Tetsuya Mukawa wrote:
> >>>
> >>>> $ gcc -m64 -pthread -fPIC -march=native -DRTE_MACHINE_CPUFLAG_SSE
> >>>> -DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3
> >>>> -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1
> >>>> -DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES
> >>>> -DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX
> >>>> -DRTE_MACHINE_CPUFLAG_F16C
> >>>> -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C
> >>>> -I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include
> >>>> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h
> >>>> -W -Wall -Werror -Wstrict-prototypes -Wmissing-prototypes
> >>>> -Wmissing-declarations -Wold-style-definition -Wpointer-arith
> >>>> -Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral
> >>>> -Wformat-security -Wundef -Wwrite-strings -Wl,-Map=testacl.map,--cref
> >>>> -o testacl main.o -Wl,-export-dynamic
> >>>> -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib
> >>>> -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib
> >>>> -Wl,--whole-archive -Wl,-lrte_distributor -Wl,-lrte_kni
> >>>> -Wl,-lrte_pipeline -Wl,-lrte_table -Wl,-lrte_port -Wl,-lrte_timer
> >>>> -Wl,-lrte_hash -Wl,-lrte_lpm -Wl,-lrte_power -Wl,-lrte_acl
> >>>> -Wl,-lrte_meter -Wl,-lrte_sched -Wl,-lm -Wl,-lrt -Wl,--start-group
> >>>> -Wl,-lrte_kvargs -Wl,-lrte_mbuf -Wl,-lrte_ip_frag -Wl,-lethdev
> >>>> -Wl,-lrte_malloc -Wl,-lrte_mempool -Wl,-lrte_ring -Wl,-lrte_eal
> >>>> -Wl,-lrte_cmdline -Wl,-lrte_cfgfile -Wl,-lrte_pmd_bond -Wl,-lrt
> >>>> -Wl,-lm -Wl,-lgcc_s -Wl,-ldl -Wl,--end-group -Wl,--no-whole-archive
> >>>> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
> >>>> undefined reference to `rte_mempool_lookup'
> >>>> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
> >>>> undefined reference to `rte_mempool_create' collect2: error: ld
> >>>> returned 1 exit status 
> >>> Hi Tetsuya,
> >>>
> >>> Would you mind posting the output of the last command adding the option '-v'?
> >> Sure, here is.
> >>
> >> $ gcc -m64 -pthread -fPIC  -march=native -DRTE_MACHINE_CPUFLAG_SSE
> >> -DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3
> >> -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1
> >> -DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES
> >> -DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX
> >> -DRTE_MACHINE_CPUFLAG_F16C
> >> -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C 
> >> -I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include
> >> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h -W
> >> -Wall -Werror -Wstrict-prototypes -Wmissing-prototypes
> >> -Wmissing-declarations -Wold-style-definition -Wpointer-arith
> >> -Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral
> >> -Wformat-security -Wundef -Wwrite-strings  -Wl,-Map=testacl.map,--cref
> >> -o testacl main.o -Wl,-export-dynamic
> >> -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib 
> >> -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib
> >> -Wl,--whole-archive -Wl,-lrte_distributor -Wl,-lrte_kni
> >> -Wl,-lrte_pipeline -Wl,-lrte_table -Wl,-lrte_port -Wl,-lrte_timer
> >> -Wl,-lrte_hash -Wl,-lrte_lpm -Wl,-lrte_power -Wl,-lrte_acl
> >> -Wl,-lrte_meter -Wl,-lrte_sched -Wl,-lm -Wl,-lrt -Wl,--start-group
> >> -Wl,-lrte_kvargs -Wl,-lrte_mbuf -Wl,-lrte_ip_frag -Wl,-lethdev
> >> -Wl,-lrte_malloc -Wl,-lrte_mempool -Wl,-lrte_ring -Wl,-lrte_eal
> >> -Wl,-lrte_cmdline -Wl,-lrte_cfgfile -Wl,-lrte_pmd_bond -Wl,-lrt -Wl,-lm
> >> -Wl,-lgcc_s -Wl,-ldl -Wl,--end-group -Wl,--no-whole-archive -v
> >> Using built-in specs.
> >> COLLECT_GCC=gcc
> >> COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
> >> Target: x86_64-linux-gnu
> >> Configured with: ../src/configure -v --with-pkgversion='Ubuntu
> >> 4.8.2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs
> >> --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr
> >> --program-suffix=-4.8 --enable-shared --enable-linker-build-id
> >> --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
> >> --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib
> >> --enable-nls --with-sysroot=/ --enable-clocale=gnu
> >> --enable-libstdcxx-debug --enable-libstdcxx-time=yes
> >> --enable-gnu-unique-object --disable-libmudflap --enable-plugin
> >> --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk
> >> --enable-gtk-cairo
> >> --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre
> >> --enable-java-home
> >> --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64
> >> --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64
> >> --with-arch-directory=amd64
> >> --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc
> >> --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64
> >> --with-multilib-list=m32,m64,mx32 --with-tune=generic
> >> --enable-checking=release --build=x86_64-linux-gnu
> >> --host=x86_64-linux-gnu --target=x86_64-linux-gnu
> >> Thread model: posix
> >> gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
> >> COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/
> >> LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../:/lib/:/usr/lib/
> >> COLLECT_GCC_OPTIONS='-m64' '-pthread' '-fPIC' '-march=native' '-D'
> >> 'RTE_MACHINE_CPUFLAG_SSE' '-D' 'RTE_MACHINE_CPUFLAG_SSE2' '-D'
> >> 'RTE_MACHINE_CPUFLAG_SSE3' '-D' 'RTE_MACHINE_CPUFLAG_SSSE3' '-D'
> >> 'RTE_MACHINE_CPUFLAG_SSE4_1' '-D' 'RTE_MACHINE_CPUFLAG_SSE4_2' '-D'
> >> 'RTE_MACHINE_CPUFLAG_AES' '-D' 'RTE_MACHINE_CPUFLAG_PCLMULQDQ' '-D'
> >> 'RTE_MACHINE_CPUFLAG_AVX' '-D' 'RTE_MACHINE_CPUFLAG_F16C' '-D'
> >> 'RTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C'
> >> '-I' '/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include'
> >> '-include'
> >> '/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h'
> >> '-Wextra' '-Wall' '-Werror' '-Wstrict-prototypes' '-Wmissing-prototypes'
> >> '-Wmissing-declarations' '-Wold-style-definition' '-Wpointer-arith'
> >> '-Wcast-align' '-Wnested-externs' '-Wcast-qual' '-Wformat-nonliteral'
> >> '-Wformat-security' '-Wundef' '-Wwrite-strings' '-o' 'testacl'
> >> '-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib'
> >> '-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib' '-v'
> > We have been looking at this issue over the last couple of days.
> > It seems to be an Ubuntu GCC related bug as it works on other distros.
> > GCC is passing incorrectly the option '--as-needed' to LD resulting in wrong linking.
> >

Just a quick follow up on this issue and to rectify myself. 
This is not a bug but expected behavior:
https://wiki.debian.org/ToolChain/DSOLinking#Onlylinkwithneededlibraries

Sergio

> >>  /usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 --sysroot=/ --build-id
> >> --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed
> > The '--as-needed' just at the end of the above line is incorrect and not matching
> > a closing '--no-as-needed'.
> > You may get away with it by adding 'EXTRA_LDFLAGS=--no-as-needed'. 
> > ie. $ make install T=x86_64-native-linuxapp-gcc EXTRA_LDFLAGS=--no-as-needed
> 
> I can compile DPDK with above options.
> Thank you everyone for helping to solve this issue.
> 
> Regards,
> Tetsuya
> 
> >
> > Sergio
> >
> >> -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o testacl
> >> /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o
> >> /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o
> >> /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o
> >> -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib
> >> -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib
> >> -L/usr/lib/gcc/x86_64-linux-gnu/4.8
> >> -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu
> >> -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib
> >> -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu
> >> -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../..
> >> -Map=testacl.map --cref main.o -export-dynamic --whole-archive
> >> -lrte_distributor -lrte_kni -lrte_pipeline -lrte_table -lrte_port
> >> -lrte_timer -lrte_hash -lrte_lpm -lrte_power -lrte_acl -lrte_meter
> >> -lrte_sched -lm -lrt --start-group -lrte_kvargs -lrte_mbuf -lrte_ip_frag
> >> -lethdev -lrte_malloc -lrte_mempool -lrte_ring -lrte_eal -lrte_cmdline
> >> -lrte_cfgfile -lrte_pmd_bond -lrt -lm -lgcc_s -ldl --end-group
> >> --no-whole-archive -lgcc --as-needed -lgcc_s --no-as-needed -lpthread
> >> -lc -lgcc --as-needed -lgcc_s --no-as-needed
> >> /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o
> >> /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o
> >> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
> >> undefined reference to `rte_mempool_lookup'
> >> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
> >> undefined reference to `rte_mempool_create'
> >> collect2: error: ld returned 1 exit status
> >>
> >> Regards,
> >> Tetsuya
> >>
> >>> Sergio
> >>>
> >>>
> >>>> ----------------------------------------------------------------------
> >>>>
> >>>> I just enabled the following option, then compile DPDK.
> >>>> CONFIG_RTE_BUILD_SHARED_LIB
> >>>> Is this collect to compile PMDs as dynamic link libraries?
> >>>>
> >>>> With the option, all libraries include are compiled as dynamic link library.
> >>>> Does "--start-group/--end-group" options work with dynamic link libraries?
> >>>>
> >>>> Regards,
> >>>> Tetsuya
> >>>>
> 
> 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] Fix linking errors when CONFIG_RTE_BUILD_SHARED_LIB is enabled
  2014-10-02  8:53  0%           ` Sergio Gonzalez Monroy
@ 2014-10-02  9:05  0%             ` Tetsuya Mukawa
  2014-10-03 11:11  0%               ` Sergio Gonzalez Monroy
  0 siblings, 1 reply; 200+ results
From: Tetsuya Mukawa @ 2014-10-02  9:05 UTC (permalink / raw)
  To: Sergio Gonzalez Monroy; +Cc: dev

(2014/10/02 17:53), Sergio Gonzalez Monroy wrote:
> On Thu, Oct 02, 2014 at 05:28:04PM +0900, Tetsuya Mukawa wrote:
>> (2014/10/02 17:12), Sergio Gonzalez Monroy wrote:
>>> On Thu, Oct 02, 2014 at 11:48:37AM +0900, Tetsuya Mukawa wrote:
>>>
>>>> $ gcc -m64 -pthread -fPIC -march=native -DRTE_MACHINE_CPUFLAG_SSE
>>>> -DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3
>>>> -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1
>>>> -DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES
>>>> -DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX
>>>> -DRTE_MACHINE_CPUFLAG_F16C
>>>> -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C
>>>> -I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include
>>>> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h
>>>> -W -Wall -Werror -Wstrict-prototypes -Wmissing-prototypes
>>>> -Wmissing-declarations -Wold-style-definition -Wpointer-arith
>>>> -Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral
>>>> -Wformat-security -Wundef -Wwrite-strings -Wl,-Map=testacl.map,--cref
>>>> -o testacl main.o -Wl,-export-dynamic
>>>> -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib
>>>> -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib
>>>> -Wl,--whole-archive -Wl,-lrte_distributor -Wl,-lrte_kni
>>>> -Wl,-lrte_pipeline -Wl,-lrte_table -Wl,-lrte_port -Wl,-lrte_timer
>>>> -Wl,-lrte_hash -Wl,-lrte_lpm -Wl,-lrte_power -Wl,-lrte_acl
>>>> -Wl,-lrte_meter -Wl,-lrte_sched -Wl,-lm -Wl,-lrt -Wl,--start-group
>>>> -Wl,-lrte_kvargs -Wl,-lrte_mbuf -Wl,-lrte_ip_frag -Wl,-lethdev
>>>> -Wl,-lrte_malloc -Wl,-lrte_mempool -Wl,-lrte_ring -Wl,-lrte_eal
>>>> -Wl,-lrte_cmdline -Wl,-lrte_cfgfile -Wl,-lrte_pmd_bond -Wl,-lrt
>>>> -Wl,-lm -Wl,-lgcc_s -Wl,-ldl -Wl,--end-group -Wl,--no-whole-archive
>>>> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
>>>> undefined reference to `rte_mempool_lookup'
>>>> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
>>>> undefined reference to `rte_mempool_create' collect2: error: ld
>>>> returned 1 exit status 
>>> Hi Tetsuya,
>>>
>>> Would you mind posting the output of the last command adding the option '-v'?
>> Sure, here is.
>>
>> $ gcc -m64 -pthread -fPIC  -march=native -DRTE_MACHINE_CPUFLAG_SSE
>> -DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3
>> -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1
>> -DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES
>> -DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX
>> -DRTE_MACHINE_CPUFLAG_F16C
>> -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C 
>> -I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include
>> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h -W
>> -Wall -Werror -Wstrict-prototypes -Wmissing-prototypes
>> -Wmissing-declarations -Wold-style-definition -Wpointer-arith
>> -Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral
>> -Wformat-security -Wundef -Wwrite-strings  -Wl,-Map=testacl.map,--cref
>> -o testacl main.o -Wl,-export-dynamic
>> -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib 
>> -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib
>> -Wl,--whole-archive -Wl,-lrte_distributor -Wl,-lrte_kni
>> -Wl,-lrte_pipeline -Wl,-lrte_table -Wl,-lrte_port -Wl,-lrte_timer
>> -Wl,-lrte_hash -Wl,-lrte_lpm -Wl,-lrte_power -Wl,-lrte_acl
>> -Wl,-lrte_meter -Wl,-lrte_sched -Wl,-lm -Wl,-lrt -Wl,--start-group
>> -Wl,-lrte_kvargs -Wl,-lrte_mbuf -Wl,-lrte_ip_frag -Wl,-lethdev
>> -Wl,-lrte_malloc -Wl,-lrte_mempool -Wl,-lrte_ring -Wl,-lrte_eal
>> -Wl,-lrte_cmdline -Wl,-lrte_cfgfile -Wl,-lrte_pmd_bond -Wl,-lrt -Wl,-lm
>> -Wl,-lgcc_s -Wl,-ldl -Wl,--end-group -Wl,--no-whole-archive -v
>> Using built-in specs.
>> COLLECT_GCC=gcc
>> COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
>> Target: x86_64-linux-gnu
>> Configured with: ../src/configure -v --with-pkgversion='Ubuntu
>> 4.8.2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs
>> --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr
>> --program-suffix=-4.8 --enable-shared --enable-linker-build-id
>> --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
>> --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib
>> --enable-nls --with-sysroot=/ --enable-clocale=gnu
>> --enable-libstdcxx-debug --enable-libstdcxx-time=yes
>> --enable-gnu-unique-object --disable-libmudflap --enable-plugin
>> --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk
>> --enable-gtk-cairo
>> --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre
>> --enable-java-home
>> --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64
>> --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64
>> --with-arch-directory=amd64
>> --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc
>> --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64
>> --with-multilib-list=m32,m64,mx32 --with-tune=generic
>> --enable-checking=release --build=x86_64-linux-gnu
>> --host=x86_64-linux-gnu --target=x86_64-linux-gnu
>> Thread model: posix
>> gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
>> COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/
>> LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../:/lib/:/usr/lib/
>> COLLECT_GCC_OPTIONS='-m64' '-pthread' '-fPIC' '-march=native' '-D'
>> 'RTE_MACHINE_CPUFLAG_SSE' '-D' 'RTE_MACHINE_CPUFLAG_SSE2' '-D'
>> 'RTE_MACHINE_CPUFLAG_SSE3' '-D' 'RTE_MACHINE_CPUFLAG_SSSE3' '-D'
>> 'RTE_MACHINE_CPUFLAG_SSE4_1' '-D' 'RTE_MACHINE_CPUFLAG_SSE4_2' '-D'
>> 'RTE_MACHINE_CPUFLAG_AES' '-D' 'RTE_MACHINE_CPUFLAG_PCLMULQDQ' '-D'
>> 'RTE_MACHINE_CPUFLAG_AVX' '-D' 'RTE_MACHINE_CPUFLAG_F16C' '-D'
>> 'RTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C'
>> '-I' '/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include'
>> '-include'
>> '/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h'
>> '-Wextra' '-Wall' '-Werror' '-Wstrict-prototypes' '-Wmissing-prototypes'
>> '-Wmissing-declarations' '-Wold-style-definition' '-Wpointer-arith'
>> '-Wcast-align' '-Wnested-externs' '-Wcast-qual' '-Wformat-nonliteral'
>> '-Wformat-security' '-Wundef' '-Wwrite-strings' '-o' 'testacl'
>> '-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib'
>> '-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib' '-v'
> We have been looking at this issue over the last couple of days.
> It seems to be an Ubuntu GCC related bug as it works on other distros.
> GCC is passing incorrectly the option '--as-needed' to LD resulting in wrong linking.
>
>>  /usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 --sysroot=/ --build-id
>> --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed
> The '--as-needed' just at the end of the above line is incorrect and not matching
> a closing '--no-as-needed'.
> You may get away with it by adding 'EXTRA_LDFLAGS=--no-as-needed'. 
> ie. $ make install T=x86_64-native-linuxapp-gcc EXTRA_LDFLAGS=--no-as-needed

I can compile DPDK with above options.
Thank you everyone for helping to solve this issue.

Regards,
Tetsuya

>
> Sergio
>
>> -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o testacl
>> /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o
>> /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o
>> /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o
>> -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib
>> -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib
>> -L/usr/lib/gcc/x86_64-linux-gnu/4.8
>> -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu
>> -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib
>> -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu
>> -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../..
>> -Map=testacl.map --cref main.o -export-dynamic --whole-archive
>> -lrte_distributor -lrte_kni -lrte_pipeline -lrte_table -lrte_port
>> -lrte_timer -lrte_hash -lrte_lpm -lrte_power -lrte_acl -lrte_meter
>> -lrte_sched -lm -lrt --start-group -lrte_kvargs -lrte_mbuf -lrte_ip_frag
>> -lethdev -lrte_malloc -lrte_mempool -lrte_ring -lrte_eal -lrte_cmdline
>> -lrte_cfgfile -lrte_pmd_bond -lrt -lm -lgcc_s -ldl --end-group
>> --no-whole-archive -lgcc --as-needed -lgcc_s --no-as-needed -lpthread
>> -lc -lgcc --as-needed -lgcc_s --no-as-needed
>> /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o
>> /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o
>> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
>> undefined reference to `rte_mempool_lookup'
>> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
>> undefined reference to `rte_mempool_create'
>> collect2: error: ld returned 1 exit status
>>
>> Regards,
>> Tetsuya
>>
>>> Sergio
>>>
>>>
>>>> ----------------------------------------------------------------------
>>>>
>>>> I just enabled the following option, then compile DPDK.
>>>> CONFIG_RTE_BUILD_SHARED_LIB
>>>> Is this collect to compile PMDs as dynamic link libraries?
>>>>
>>>> With the option, all libraries include are compiled as dynamic link library.
>>>> Does "--start-group/--end-group" options work with dynamic link libraries?
>>>>
>>>> Regards,
>>>> Tetsuya
>>>>

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] Fix linking errors when CONFIG_RTE_BUILD_SHARED_LIB is enabled
  2014-10-02  8:28  2%         ` Tetsuya Mukawa
@ 2014-10-02  8:53  0%           ` Sergio Gonzalez Monroy
  2014-10-02  9:05  0%             ` Tetsuya Mukawa
  0 siblings, 1 reply; 200+ results
From: Sergio Gonzalez Monroy @ 2014-10-02  8:53 UTC (permalink / raw)
  To: Tetsuya Mukawa; +Cc: dev

On Thu, Oct 02, 2014 at 05:28:04PM +0900, Tetsuya Mukawa wrote:
> (2014/10/02 17:12), Sergio Gonzalez Monroy wrote:
> > On Thu, Oct 02, 2014 at 11:48:37AM +0900, Tetsuya Mukawa wrote:
> >
> >> $ gcc -m64 -pthread -fPIC -march=native -DRTE_MACHINE_CPUFLAG_SSE
> >> -DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3
> >> -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1
> >> -DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES
> >> -DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX
> >> -DRTE_MACHINE_CPUFLAG_F16C
> >> -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C
> >> -I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include
> >> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h
> >> -W -Wall -Werror -Wstrict-prototypes -Wmissing-prototypes
> >> -Wmissing-declarations -Wold-style-definition -Wpointer-arith
> >> -Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral
> >> -Wformat-security -Wundef -Wwrite-strings -Wl,-Map=testacl.map,--cref
> >> -o testacl main.o -Wl,-export-dynamic
> >> -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib
> >> -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib
> >> -Wl,--whole-archive -Wl,-lrte_distributor -Wl,-lrte_kni
> >> -Wl,-lrte_pipeline -Wl,-lrte_table -Wl,-lrte_port -Wl,-lrte_timer
> >> -Wl,-lrte_hash -Wl,-lrte_lpm -Wl,-lrte_power -Wl,-lrte_acl
> >> -Wl,-lrte_meter -Wl,-lrte_sched -Wl,-lm -Wl,-lrt -Wl,--start-group
> >> -Wl,-lrte_kvargs -Wl,-lrte_mbuf -Wl,-lrte_ip_frag -Wl,-lethdev
> >> -Wl,-lrte_malloc -Wl,-lrte_mempool -Wl,-lrte_ring -Wl,-lrte_eal
> >> -Wl,-lrte_cmdline -Wl,-lrte_cfgfile -Wl,-lrte_pmd_bond -Wl,-lrt
> >> -Wl,-lm -Wl,-lgcc_s -Wl,-ldl -Wl,--end-group -Wl,--no-whole-archive
> >> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
> >> undefined reference to `rte_mempool_lookup'
> >> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
> >> undefined reference to `rte_mempool_create' collect2: error: ld
> >> returned 1 exit status 
> > Hi Tetsuya,
> >
> > Would you mind posting the output of the last command adding the option '-v'?
> Sure, here is.
> 
> $ gcc -m64 -pthread -fPIC  -march=native -DRTE_MACHINE_CPUFLAG_SSE
> -DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3
> -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1
> -DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES
> -DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX
> -DRTE_MACHINE_CPUFLAG_F16C
> -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C 
> -I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include
> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h -W
> -Wall -Werror -Wstrict-prototypes -Wmissing-prototypes
> -Wmissing-declarations -Wold-style-definition -Wpointer-arith
> -Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral
> -Wformat-security -Wundef -Wwrite-strings  -Wl,-Map=testacl.map,--cref
> -o testacl main.o -Wl,-export-dynamic
> -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib 
> -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib
> -Wl,--whole-archive -Wl,-lrte_distributor -Wl,-lrte_kni
> -Wl,-lrte_pipeline -Wl,-lrte_table -Wl,-lrte_port -Wl,-lrte_timer
> -Wl,-lrte_hash -Wl,-lrte_lpm -Wl,-lrte_power -Wl,-lrte_acl
> -Wl,-lrte_meter -Wl,-lrte_sched -Wl,-lm -Wl,-lrt -Wl,--start-group
> -Wl,-lrte_kvargs -Wl,-lrte_mbuf -Wl,-lrte_ip_frag -Wl,-lethdev
> -Wl,-lrte_malloc -Wl,-lrte_mempool -Wl,-lrte_ring -Wl,-lrte_eal
> -Wl,-lrte_cmdline -Wl,-lrte_cfgfile -Wl,-lrte_pmd_bond -Wl,-lrt -Wl,-lm
> -Wl,-lgcc_s -Wl,-ldl -Wl,--end-group -Wl,--no-whole-archive -v
> Using built-in specs.
> COLLECT_GCC=gcc
> COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
> Target: x86_64-linux-gnu
> Configured with: ../src/configure -v --with-pkgversion='Ubuntu
> 4.8.2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs
> --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr
> --program-suffix=-4.8 --enable-shared --enable-linker-build-id
> --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
> --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib
> --enable-nls --with-sysroot=/ --enable-clocale=gnu
> --enable-libstdcxx-debug --enable-libstdcxx-time=yes
> --enable-gnu-unique-object --disable-libmudflap --enable-plugin
> --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk
> --enable-gtk-cairo
> --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre
> --enable-java-home
> --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64
> --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64
> --with-arch-directory=amd64
> --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc
> --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64
> --with-multilib-list=m32,m64,mx32 --with-tune=generic
> --enable-checking=release --build=x86_64-linux-gnu
> --host=x86_64-linux-gnu --target=x86_64-linux-gnu
> Thread model: posix
> gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
> COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/
> LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../:/lib/:/usr/lib/
> COLLECT_GCC_OPTIONS='-m64' '-pthread' '-fPIC' '-march=native' '-D'
> 'RTE_MACHINE_CPUFLAG_SSE' '-D' 'RTE_MACHINE_CPUFLAG_SSE2' '-D'
> 'RTE_MACHINE_CPUFLAG_SSE3' '-D' 'RTE_MACHINE_CPUFLAG_SSSE3' '-D'
> 'RTE_MACHINE_CPUFLAG_SSE4_1' '-D' 'RTE_MACHINE_CPUFLAG_SSE4_2' '-D'
> 'RTE_MACHINE_CPUFLAG_AES' '-D' 'RTE_MACHINE_CPUFLAG_PCLMULQDQ' '-D'
> 'RTE_MACHINE_CPUFLAG_AVX' '-D' 'RTE_MACHINE_CPUFLAG_F16C' '-D'
> 'RTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C'
> '-I' '/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include'
> '-include'
> '/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h'
> '-Wextra' '-Wall' '-Werror' '-Wstrict-prototypes' '-Wmissing-prototypes'
> '-Wmissing-declarations' '-Wold-style-definition' '-Wpointer-arith'
> '-Wcast-align' '-Wnested-externs' '-Wcast-qual' '-Wformat-nonliteral'
> '-Wformat-security' '-Wundef' '-Wwrite-strings' '-o' 'testacl'
> '-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib'
> '-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib' '-v'

We have been looking at this issue over the last couple of days.
It seems to be an Ubuntu GCC related bug as it works on other distros.
GCC is passing incorrectly the option '--as-needed' to LD resulting in wrong linking.

>  /usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 --sysroot=/ --build-id
> --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed

The '--as-needed' just at the end of the above line is incorrect and not matching
a closing '--no-as-needed'.
You may get away with it by adding 'EXTRA_LDFLAGS=--no-as-needed'. 
ie. $ make install T=x86_64-native-linuxapp-gcc EXTRA_LDFLAGS=--no-as-needed

Sergio

> -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o testacl
> /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o
> /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o
> /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o
> -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib
> -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib
> -L/usr/lib/gcc/x86_64-linux-gnu/4.8
> -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu
> -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib
> -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu
> -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../..
> -Map=testacl.map --cref main.o -export-dynamic --whole-archive
> -lrte_distributor -lrte_kni -lrte_pipeline -lrte_table -lrte_port
> -lrte_timer -lrte_hash -lrte_lpm -lrte_power -lrte_acl -lrte_meter
> -lrte_sched -lm -lrt --start-group -lrte_kvargs -lrte_mbuf -lrte_ip_frag
> -lethdev -lrte_malloc -lrte_mempool -lrte_ring -lrte_eal -lrte_cmdline
> -lrte_cfgfile -lrte_pmd_bond -lrt -lm -lgcc_s -ldl --end-group
> --no-whole-archive -lgcc --as-needed -lgcc_s --no-as-needed -lpthread
> -lc -lgcc --as-needed -lgcc_s --no-as-needed
> /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o
> /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o
> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
> undefined reference to `rte_mempool_lookup'
> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
> undefined reference to `rte_mempool_create'
> collect2: error: ld returned 1 exit status
> 
> Regards,
> Tetsuya
> 
> > Sergio
> >
> >
> >> ----------------------------------------------------------------------
> >>
> >> I just enabled the following option, then compile DPDK.
> >> CONFIG_RTE_BUILD_SHARED_LIB
> >> Is this collect to compile PMDs as dynamic link libraries?
> >>
> >> With the option, all libraries include are compiled as dynamic link library.
> >> Does "--start-group/--end-group" options work with dynamic link libraries?
> >>
> >> Regards,
> >> Tetsuya
> >>
> 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] Fix linking errors when CONFIG_RTE_BUILD_SHARED_LIB is enabled
  2014-10-02  8:12  0%       ` Sergio Gonzalez Monroy
@ 2014-10-02  8:28  2%         ` Tetsuya Mukawa
  2014-10-02  8:53  0%           ` Sergio Gonzalez Monroy
  0 siblings, 1 reply; 200+ results
From: Tetsuya Mukawa @ 2014-10-02  8:28 UTC (permalink / raw)
  To: Sergio Gonzalez Monroy; +Cc: dev

(2014/10/02 17:12), Sergio Gonzalez Monroy wrote:
> On Thu, Oct 02, 2014 at 11:48:37AM +0900, Tetsuya Mukawa wrote:
>
>> $ gcc -m64 -pthread -fPIC -march=native -DRTE_MACHINE_CPUFLAG_SSE
>> -DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3
>> -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1
>> -DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES
>> -DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX
>> -DRTE_MACHINE_CPUFLAG_F16C
>> -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C
>> -I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include
>> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h
>> -W -Wall -Werror -Wstrict-prototypes -Wmissing-prototypes
>> -Wmissing-declarations -Wold-style-definition -Wpointer-arith
>> -Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral
>> -Wformat-security -Wundef -Wwrite-strings -Wl,-Map=testacl.map,--cref
>> -o testacl main.o -Wl,-export-dynamic
>> -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib
>> -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib
>> -Wl,--whole-archive -Wl,-lrte_distributor -Wl,-lrte_kni
>> -Wl,-lrte_pipeline -Wl,-lrte_table -Wl,-lrte_port -Wl,-lrte_timer
>> -Wl,-lrte_hash -Wl,-lrte_lpm -Wl,-lrte_power -Wl,-lrte_acl
>> -Wl,-lrte_meter -Wl,-lrte_sched -Wl,-lm -Wl,-lrt -Wl,--start-group
>> -Wl,-lrte_kvargs -Wl,-lrte_mbuf -Wl,-lrte_ip_frag -Wl,-lethdev
>> -Wl,-lrte_malloc -Wl,-lrte_mempool -Wl,-lrte_ring -Wl,-lrte_eal
>> -Wl,-lrte_cmdline -Wl,-lrte_cfgfile -Wl,-lrte_pmd_bond -Wl,-lrt
>> -Wl,-lm -Wl,-lgcc_s -Wl,-ldl -Wl,--end-group -Wl,--no-whole-archive
>> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
>> undefined reference to `rte_mempool_lookup'
>> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
>> undefined reference to `rte_mempool_create' collect2: error: ld
>> returned 1 exit status 
> Hi Tetsuya,
>
> Would you mind posting the output of the last command adding the option '-v'?
Sure, here is.

$ gcc -m64 -pthread -fPIC  -march=native -DRTE_MACHINE_CPUFLAG_SSE
-DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3
-DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1
-DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES
-DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX
-DRTE_MACHINE_CPUFLAG_F16C
-DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C 
-I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h -W
-Wall -Werror -Wstrict-prototypes -Wmissing-prototypes
-Wmissing-declarations -Wold-style-definition -Wpointer-arith
-Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral
-Wformat-security -Wundef -Wwrite-strings  -Wl,-Map=testacl.map,--cref
-o testacl main.o -Wl,-export-dynamic
-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib 
-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib
-Wl,--whole-archive -Wl,-lrte_distributor -Wl,-lrte_kni
-Wl,-lrte_pipeline -Wl,-lrte_table -Wl,-lrte_port -Wl,-lrte_timer
-Wl,-lrte_hash -Wl,-lrte_lpm -Wl,-lrte_power -Wl,-lrte_acl
-Wl,-lrte_meter -Wl,-lrte_sched -Wl,-lm -Wl,-lrt -Wl,--start-group
-Wl,-lrte_kvargs -Wl,-lrte_mbuf -Wl,-lrte_ip_frag -Wl,-lethdev
-Wl,-lrte_malloc -Wl,-lrte_mempool -Wl,-lrte_ring -Wl,-lrte_eal
-Wl,-lrte_cmdline -Wl,-lrte_cfgfile -Wl,-lrte_pmd_bond -Wl,-lrt -Wl,-lm
-Wl,-lgcc_s -Wl,-ldl -Wl,--end-group -Wl,--no-whole-archive -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu
4.8.2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs
--enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr
--program-suffix=-4.8 --enable-shared --enable-linker-build-id
--libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
--with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib
--enable-nls --with-sysroot=/ --enable-clocale=gnu
--enable-libstdcxx-debug --enable-libstdcxx-time=yes
--enable-gnu-unique-object --disable-libmudflap --enable-plugin
--with-system-zlib --disable-browser-plugin --enable-java-awt=gtk
--enable-gtk-cairo
--with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre
--enable-java-home
--with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64
--with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64
--with-arch-directory=amd64
--with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc
--enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64
--with-multilib-list=m32,m64,mx32 --with-tune=generic
--enable-checking=release --build=x86_64-linux-gnu
--host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-m64' '-pthread' '-fPIC' '-march=native' '-D'
'RTE_MACHINE_CPUFLAG_SSE' '-D' 'RTE_MACHINE_CPUFLAG_SSE2' '-D'
'RTE_MACHINE_CPUFLAG_SSE3' '-D' 'RTE_MACHINE_CPUFLAG_SSSE3' '-D'
'RTE_MACHINE_CPUFLAG_SSE4_1' '-D' 'RTE_MACHINE_CPUFLAG_SSE4_2' '-D'
'RTE_MACHINE_CPUFLAG_AES' '-D' 'RTE_MACHINE_CPUFLAG_PCLMULQDQ' '-D'
'RTE_MACHINE_CPUFLAG_AVX' '-D' 'RTE_MACHINE_CPUFLAG_F16C' '-D'
'RTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C'
'-I' '/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include'
'-include'
'/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h'
'-Wextra' '-Wall' '-Werror' '-Wstrict-prototypes' '-Wmissing-prototypes'
'-Wmissing-declarations' '-Wold-style-definition' '-Wpointer-arith'
'-Wcast-align' '-Wnested-externs' '-Wcast-qual' '-Wformat-nonliteral'
'-Wformat-security' '-Wundef' '-Wwrite-strings' '-o' 'testacl'
'-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib'
'-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib' '-v'
 /usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 --sysroot=/ --build-id
--eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed
-dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o testacl
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o
/usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o
-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib
-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib
-L/usr/lib/gcc/x86_64-linux-gnu/4.8
-L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu
-L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib
-L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu
-L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../..
-Map=testacl.map --cref main.o -export-dynamic --whole-archive
-lrte_distributor -lrte_kni -lrte_pipeline -lrte_table -lrte_port
-lrte_timer -lrte_hash -lrte_lpm -lrte_power -lrte_acl -lrte_meter
-lrte_sched -lm -lrt --start-group -lrte_kvargs -lrte_mbuf -lrte_ip_frag
-lethdev -lrte_malloc -lrte_mempool -lrte_ring -lrte_eal -lrte_cmdline
-lrte_cfgfile -lrte_pmd_bond -lrt -lm -lgcc_s -ldl --end-group
--no-whole-archive -lgcc --as-needed -lgcc_s --no-as-needed -lpthread
-lc -lgcc --as-needed -lgcc_s --no-as-needed
/usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
undefined reference to `rte_mempool_lookup'
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
undefined reference to `rte_mempool_create'
collect2: error: ld returned 1 exit status

Regards,
Tetsuya

> Sergio
>
>
>> ----------------------------------------------------------------------
>>
>> I just enabled the following option, then compile DPDK.
>> CONFIG_RTE_BUILD_SHARED_LIB
>> Is this collect to compile PMDs as dynamic link libraries?
>>
>> With the option, all libraries include are compiled as dynamic link library.
>> Does "--start-group/--end-group" options work with dynamic link libraries?
>>
>> Regards,
>> Tetsuya
>>

^ permalink raw reply	[relevance 2%]

* Re: [dpdk-dev] [PATCH] Fix linking errors when CONFIG_RTE_BUILD_SHARED_LIB is enabled
  2014-10-02  2:48  2%     ` Tetsuya Mukawa
@ 2014-10-02  8:12  0%       ` Sergio Gonzalez Monroy
  2014-10-02  8:28  2%         ` Tetsuya Mukawa
  0 siblings, 1 reply; 200+ results
From: Sergio Gonzalez Monroy @ 2014-10-02  8:12 UTC (permalink / raw)
  To: Tetsuya Mukawa; +Cc: dev

On Thu, Oct 02, 2014 at 11:48:37AM +0900, Tetsuya Mukawa wrote:
> (2014/10/01 20:56), Thomas Monjalon wrote:
> > 2014-10-01 06:50, Neil Horman:
> >> On Wed, Oct 01, 2014 at 01:27:03PM +0900, mukawa@igel.co.jp wrote:
> >>> When CONFIG_RTE_BUILD_SHARED_LIB is enabled, linking errors occured
> >>> while compiling. It seems those errors are caused by wrong link order
> >>> of some libraries. The patch fixes it like following.
> >>>
> >>> 1. librte_eal
> >>> 2. librte_malloc
> >>> 3. librte_mempool
> >>> 4. librte_ring
> >>> 5. librte_pmd_bond
> >>> 6. librte_kvargs
> >>>
> >> I'm not sure why thats necesecary.  We add a --start-group/--end-group pair
> >> halfway through this makefile.  If we just encompassed the entire set of
> >> libraries in that group, order would be irrelevant.
> > I don't see any error.
> > Please Tetsuya, could you describe how you test and what is the error message?
> >
> > Thanks
> Thank you for testing.
> I have confirmed '--start-group/--end-groups' is specified while
> compiling, but I am still seeing the error.
> 
> Here is what I actually did.
> 
> ----------------------------------------------------------------------
> 
> << Show my environment >>
> $ uname -a
> Linux eris 3.13.0-29-generic #53-Ubuntu SMP Wed Jun 4 21:00:20 UTC 2014
> x86_64 x86_64 x86_64 GNU/Linux
> $ lsb_release -a
> No LSB modules are available.
> Distributor ID:    Ubuntu
> Description:    Ubuntu 14.04.1 LTS
> Release:    14.04
> Codename:    trusty
> $ gcc -v
> Using built-in specs.
> COLLECT_GCC=gcc
> COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
> Target: x86_64-linux-gnu
> Configured with: ../src/configure -v --with-pkgversion='Ubuntu
> 4.8.2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs
> --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr
> --program-suffix=-4.8 --enable-shared --enable-linker-build-id
> --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
> --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib
> --enable-nls --with-sysroot=/ --enable-clocale=gnu
> --enable-libstdcxx-debug --enable-libstdcxx-time=yes
> --enable-gnu-unique-object --disable-libmudflap --enable-plugin
> --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk
> --enable-gtk-cairo
> --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre
> --enable-java-home
> --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64
> --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64
> --with-arch-directory=amd64
> --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc
> --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64
> --with-multilib-list=m32,m64,mx32 --with-tune=generic
> --enable-checking=release --build=x86_64-linux-gnu
> --host=x86_64-linux-gnu --target=x86_64-linux-gnu
> Thread model: posix
> gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
> 
> << Compile DPDK >>
> $ git clone git://dpdk.org/dpdk
> $ cd dpdk
> $ vi config/common_linuxapp
> CONFIG_RTE_BUILD_SHARED_LIB=y
> $ T=x86_64-native-linuxapp-gcc make install V=1
> 
> .......
> 
> == Build app/test-acl
> gcc -Wp,-MD,./.main.o.d.tmp -m64 -pthread -fPIC  -march=native
> -DRTE_MACHINE_CPUFLAG_SSE -DRTE_MACHINE_CPUFLAG_SSE2
> -DRTE_MACHINE_CPUFLAG_SSE3 -DRTE_MACHINE_CPUFLAG_SSSE3
> -DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2
> -DRTE_MACHINE_CPUFLAG_AES -DRTE_MACHINE_CPUFLAG_PCLMULQDQ
> -DRTE_MACHINE_CPUFLAG_AVX -DRTE_MACHINE_CPUFLAG_F16C
> -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C 
> -I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include
> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h -W
> -Wall -Werror -Wstrict-prototypes -Wmissing-prototypes
> -Wmissing-declarations -Wold-style-definition -Wpointer-arith
> -Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral
> -Wformat-security -Wundef -Wwrite-strings   -o main.o -c
> /home/mukawa/tmp/dpdk/app/test-acl/main.c
> gcc -m64 -pthread -fPIC  -march=native -DRTE_MACHINE_CPUFLAG_SSE
> -DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3
> -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1
> -DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES
> -DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX
> -DRTE_MACHINE_CPUFLAG_F16C
> -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C 
> -I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include
> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h -W
> -Wall -Werror -Wstrict-prototypes -Wmissing-prototypes
> -Wmissing-declarations -Wold-style-definition -Wpointer-arith
> -Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral
> -Wformat-security -Wundef -Wwrite-strings  -Wl,-Map=testacl.map,--cref
> -o testacl main.o -Wl,-export-dynamic
> -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib 
> -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib
> -Wl,--whole-archive -Wl,-lrte_distributor -Wl,-lrte_kni
> -Wl,-lrte_pipeline -Wl,-lrte_table -Wl,-lrte_port -Wl,-lrte_timer
> -Wl,-lrte_hash -Wl,-lrte_lpm -Wl,-lrte_power -Wl,-lrte_acl
> -Wl,-lrte_meter -Wl,-lrte_sched -Wl,-lm -Wl,-lrt -Wl,--start-group
> -Wl,-lrte_kvargs -Wl,-lrte_mbuf -Wl,-lrte_ip_frag -Wl,-lethdev
> -Wl,-lrte_malloc -Wl,-lrte_mempool -Wl,-lrte_ring -Wl,-lrte_eal
> -Wl,-lrte_cmdline -Wl,-lrte_cfgfile -Wl,-lrte_pmd_bond -Wl,-lrt -Wl,-lm
> -Wl,-lgcc_s -Wl,-ldl -Wl,--end-group -Wl,--no-whole-archive
> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
> undefined reference to `rte_mempool_lookup'
> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
> undefined reference to `rte_mempool_create'
> 
> << Reproduce the issue with same options >>
> $ cd x86_64-native-linuxapp-gcc/build/app/test-acl/
> $ gcc -Wp,-MD,./.main.o.d.tmp -m64 -pthread -fPIC  -march=native
> -DRTE_MACHINE_CPUFLAG_SSE -DRTE_MACHINE_CPUFLAG_SSE2
> -DRTE_MACHINE_CPUFLAG_SSE3 -DRTE_MACHINE_CPUFLAG_SSSE3
> -DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2
> -DRTE_MACHINE_CPUFLAG_AES -DRTE_MACHINE_CPUFLAG_PCLMULQDQ
> -DRTE_MACHINE_CPUFLAG_AVX -DRTE_MACHINE_CPUFLAG_F16C
> -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C 
> -I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include
> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h -W
> -Wall -Werror -Wstrict-prototypes -Wmissing-prototypes
> -Wmissing-declarations -Wold-style-definition -Wpointer-arith
> -Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral
> -Wformat-security -Wundef -Wwrite-strings   -o main.o -c
> /home/mukawa/tmp/dpdk/app/test-acl/main.c
> mukawa@eris:~/tmp/dpdk/x86_64-native-linuxapp-gcc/build/app/test-acl$
> gcc -m64 -pthread -fPIC  -march=native -DRTE_MACHINE_CPUFLAG_SSE
> -DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3
> -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1
> -DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES
> -DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX
> -DRTE_MACHINE_CPUFLAG_F16C
> -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C 
> -I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include
> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h -W
> -Wall -Werror -Wstrict-prototypes -Wmissing-prototypes
> -Wmissing-declarations -Wold-style-definition -Wpointer-arith
> -Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral
> -Wformat-security -Wundef -Wwrite-strings  -Wl,-Map=testacl.map,--cref
> -o testacl main.o -Wl,-export-dynamic
> -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib 
> -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib
> -Wl,--whole-archive -Wl,-lrte_distributor -Wl,-lrte_kni
> -Wl,-lrte_pipeline -Wl,-lrte_table -Wl,-lrte_port -Wl,-lrte_timer
> -Wl,-lrte_hash -Wl,-lrte_lpm -Wl,-lrte_power -Wl,-lrte_acl
> -Wl,-lrte_meter -Wl,-lrte_sched -Wl,-lm -Wl,-lrt -Wl,--start-group
> -Wl,-lrte_kvargs -Wl,-lrte_mbuf -Wl,-lrte_ip_frag -Wl,-lethdev
> -Wl,-lrte_malloc -Wl,-lrte_mempool -Wl,-lrte_ring -Wl,-lrte_eal
> -Wl,-lrte_cmdline -Wl,-lrte_cfgfile -Wl,-lrte_pmd_bond -Wl,-lrt -Wl,-lm
> -Wl,-lgcc_s -Wl,-ldl -Wl,--end-group -Wl,--no-whole-archive
> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
> undefined reference to `rte_mempool_lookup'
> /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
> undefined reference to `rte_mempool_create'
> collect2: error: ld returned 1 exit status
> 

Hi Tetsuya,

Would you mind posting the output of the last command adding the option '-v'?

Sergio


> ----------------------------------------------------------------------
> 
> I just enabled the following option, then compile DPDK.
> CONFIG_RTE_BUILD_SHARED_LIB
> Is this collect to compile PMDs as dynamic link libraries?
> 
> With the option, all libraries include are compiled as dynamic link library.
> Does "--start-group/--end-group" options work with dynamic link libraries?
> 
> Regards,
> Tetsuya
> 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] Fix linking errors when CONFIG_RTE_BUILD_SHARED_LIB is enabled
  @ 2014-10-02  2:48  2%     ` Tetsuya Mukawa
  2014-10-02  8:12  0%       ` Sergio Gonzalez Monroy
  0 siblings, 1 reply; 200+ results
From: Tetsuya Mukawa @ 2014-10-02  2:48 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

(2014/10/01 20:56), Thomas Monjalon wrote:
> 2014-10-01 06:50, Neil Horman:
>> On Wed, Oct 01, 2014 at 01:27:03PM +0900, mukawa@igel.co.jp wrote:
>>> When CONFIG_RTE_BUILD_SHARED_LIB is enabled, linking errors occured
>>> while compiling. It seems those errors are caused by wrong link order
>>> of some libraries. The patch fixes it like following.
>>>
>>> 1. librte_eal
>>> 2. librte_malloc
>>> 3. librte_mempool
>>> 4. librte_ring
>>> 5. librte_pmd_bond
>>> 6. librte_kvargs
>>>
>> I'm not sure why thats necesecary.  We add a --start-group/--end-group pair
>> halfway through this makefile.  If we just encompassed the entire set of
>> libraries in that group, order would be irrelevant.
> I don't see any error.
> Please Tetsuya, could you describe how you test and what is the error message?
>
> Thanks
Thank you for testing.
I have confirmed '--start-group/--end-groups' is specified while
compiling, but I am still seeing the error.

Here is what I actually did.

----------------------------------------------------------------------

<< Show my environment >>
$ uname -a
Linux eris 3.13.0-29-generic #53-Ubuntu SMP Wed Jun 4 21:00:20 UTC 2014
x86_64 x86_64 x86_64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID:    Ubuntu
Description:    Ubuntu 14.04.1 LTS
Release:    14.04
Codename:    trusty
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu
4.8.2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs
--enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr
--program-suffix=-4.8 --enable-shared --enable-linker-build-id
--libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
--with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib
--enable-nls --with-sysroot=/ --enable-clocale=gnu
--enable-libstdcxx-debug --enable-libstdcxx-time=yes
--enable-gnu-unique-object --disable-libmudflap --enable-plugin
--with-system-zlib --disable-browser-plugin --enable-java-awt=gtk
--enable-gtk-cairo
--with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre
--enable-java-home
--with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64
--with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64
--with-arch-directory=amd64
--with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc
--enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64
--with-multilib-list=m32,m64,mx32 --with-tune=generic
--enable-checking=release --build=x86_64-linux-gnu
--host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)

<< Compile DPDK >>
$ git clone git://dpdk.org/dpdk
$ cd dpdk
$ vi config/common_linuxapp
CONFIG_RTE_BUILD_SHARED_LIB=y
$ T=x86_64-native-linuxapp-gcc make install V=1

.......

== Build app/test-acl
gcc -Wp,-MD,./.main.o.d.tmp -m64 -pthread -fPIC  -march=native
-DRTE_MACHINE_CPUFLAG_SSE -DRTE_MACHINE_CPUFLAG_SSE2
-DRTE_MACHINE_CPUFLAG_SSE3 -DRTE_MACHINE_CPUFLAG_SSSE3
-DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2
-DRTE_MACHINE_CPUFLAG_AES -DRTE_MACHINE_CPUFLAG_PCLMULQDQ
-DRTE_MACHINE_CPUFLAG_AVX -DRTE_MACHINE_CPUFLAG_F16C
-DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C 
-I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h -W
-Wall -Werror -Wstrict-prototypes -Wmissing-prototypes
-Wmissing-declarations -Wold-style-definition -Wpointer-arith
-Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral
-Wformat-security -Wundef -Wwrite-strings   -o main.o -c
/home/mukawa/tmp/dpdk/app/test-acl/main.c
gcc -m64 -pthread -fPIC  -march=native -DRTE_MACHINE_CPUFLAG_SSE
-DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3
-DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1
-DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES
-DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX
-DRTE_MACHINE_CPUFLAG_F16C
-DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C 
-I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h -W
-Wall -Werror -Wstrict-prototypes -Wmissing-prototypes
-Wmissing-declarations -Wold-style-definition -Wpointer-arith
-Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral
-Wformat-security -Wundef -Wwrite-strings  -Wl,-Map=testacl.map,--cref
-o testacl main.o -Wl,-export-dynamic
-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib 
-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib
-Wl,--whole-archive -Wl,-lrte_distributor -Wl,-lrte_kni
-Wl,-lrte_pipeline -Wl,-lrte_table -Wl,-lrte_port -Wl,-lrte_timer
-Wl,-lrte_hash -Wl,-lrte_lpm -Wl,-lrte_power -Wl,-lrte_acl
-Wl,-lrte_meter -Wl,-lrte_sched -Wl,-lm -Wl,-lrt -Wl,--start-group
-Wl,-lrte_kvargs -Wl,-lrte_mbuf -Wl,-lrte_ip_frag -Wl,-lethdev
-Wl,-lrte_malloc -Wl,-lrte_mempool -Wl,-lrte_ring -Wl,-lrte_eal
-Wl,-lrte_cmdline -Wl,-lrte_cfgfile -Wl,-lrte_pmd_bond -Wl,-lrt -Wl,-lm
-Wl,-lgcc_s -Wl,-ldl -Wl,--end-group -Wl,--no-whole-archive
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
undefined reference to `rte_mempool_lookup'
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
undefined reference to `rte_mempool_create'

<< Reproduce the issue with same options >>
$ cd x86_64-native-linuxapp-gcc/build/app/test-acl/
$ gcc -Wp,-MD,./.main.o.d.tmp -m64 -pthread -fPIC  -march=native
-DRTE_MACHINE_CPUFLAG_SSE -DRTE_MACHINE_CPUFLAG_SSE2
-DRTE_MACHINE_CPUFLAG_SSE3 -DRTE_MACHINE_CPUFLAG_SSSE3
-DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2
-DRTE_MACHINE_CPUFLAG_AES -DRTE_MACHINE_CPUFLAG_PCLMULQDQ
-DRTE_MACHINE_CPUFLAG_AVX -DRTE_MACHINE_CPUFLAG_F16C
-DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C 
-I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h -W
-Wall -Werror -Wstrict-prototypes -Wmissing-prototypes
-Wmissing-declarations -Wold-style-definition -Wpointer-arith
-Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral
-Wformat-security -Wundef -Wwrite-strings   -o main.o -c
/home/mukawa/tmp/dpdk/app/test-acl/main.c
mukawa@eris:~/tmp/dpdk/x86_64-native-linuxapp-gcc/build/app/test-acl$
gcc -m64 -pthread -fPIC  -march=native -DRTE_MACHINE_CPUFLAG_SSE
-DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3
-DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1
-DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES
-DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX
-DRTE_MACHINE_CPUFLAG_F16C
-DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C 
-I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h -W
-Wall -Werror -Wstrict-prototypes -Wmissing-prototypes
-Wmissing-declarations -Wold-style-definition -Wpointer-arith
-Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral
-Wformat-security -Wundef -Wwrite-strings  -Wl,-Map=testacl.map,--cref
-o testacl main.o -Wl,-export-dynamic
-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib 
-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib
-Wl,--whole-archive -Wl,-lrte_distributor -Wl,-lrte_kni
-Wl,-lrte_pipeline -Wl,-lrte_table -Wl,-lrte_port -Wl,-lrte_timer
-Wl,-lrte_hash -Wl,-lrte_lpm -Wl,-lrte_power -Wl,-lrte_acl
-Wl,-lrte_meter -Wl,-lrte_sched -Wl,-lm -Wl,-lrt -Wl,--start-group
-Wl,-lrte_kvargs -Wl,-lrte_mbuf -Wl,-lrte_ip_frag -Wl,-lethdev
-Wl,-lrte_malloc -Wl,-lrte_mempool -Wl,-lrte_ring -Wl,-lrte_eal
-Wl,-lrte_cmdline -Wl,-lrte_cfgfile -Wl,-lrte_pmd_bond -Wl,-lrt -Wl,-lm
-Wl,-lgcc_s -Wl,-ldl -Wl,--end-group -Wl,--no-whole-archive
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
undefined reference to `rte_mempool_lookup'
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
undefined reference to `rte_mempool_create'
collect2: error: ld returned 1 exit status

----------------------------------------------------------------------

I just enabled the following option, then compile DPDK.
CONFIG_RTE_BUILD_SHARED_LIB
Is this collect to compile PMDs as dynamic link libraries?

With the option, all libraries include are compiled as dynamic link library.
Does "--start-group/--end-group" options work with dynamic link libraries?

Regards,
Tetsuya

^ permalink raw reply	[relevance 2%]

* Re: [dpdk-dev] [PATCH 0/4] Add DSO symbol versioning to support backwards compatibility
  @ 2014-10-01 18:59  0%         ` Neil Horman
  2014-10-07 21:01  0%           ` Neil Horman
  0 siblings, 1 reply; 200+ results
From: Neil Horman @ 2014-10-01 18:59 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Fri, Sep 26, 2014 at 10:45:49AM -0400, Neil Horman wrote:
> On Fri, Sep 26, 2014 at 12:41:33PM +0200, Thomas Monjalon wrote:
> > Hi Neil,
> > 
> > 2014-09-24 14:19, Neil Horman:
> > > Ping Thomas. I know you're busy, but I would like this to not fall off anyones
> > > radar.  You alluded to concerns regarding what, for lack of a better term,
> > > ABI/API lockin.  I had asked you to enuumerate/elaborate on specifics, but never
> > > heard back.  Are there further specifics you wish to discuss, or are you
> > > satisfied with the above answers?
> > 
> > Sorry for not being very reactive on this thread.
> > All this discussion is very interesting but it's really not the proper
> > time to apply it. As you said, it requires an extra effort. I'm not saying
> > it will never be integrated. I'm just saying that we cannot change
> > everything at the same time.
> > 
> > Let me sum up the situation. This community project has been very active
> > for few months now. First, we learnt how to make some releases together
> > and we are improving the process to be able to deliver a new major release
> > every 4 months while having some good quality process.
> > But these releases are still not complete because documentation is not
> > integrated yet. Then developers should have a role in documentation updates.
> > We also need to integrate and learn how to use more tools to be more
> > efficient and improve quality.
> > 
> > So the question is "when should we care about API compatibility"?
> > And the answer is: ASAP, but not now. I feel next year is a better target.
> > Because the most important priority is to move together at a pace which
> > allow most of us to stay in the race.
> > 
> 
> 
> I'm sorry Thomas, I don't accept this.  I asked you for details as to your
> concerns regarding this patch series, and you've provided more vague comments.
> I need details to address
> 
> You say it requires extra effort, you're right it does.  Any feature that you
> integreate requires some additional effort.  How is this patch any different
> from adding the acl library or any other new API?  Everything requires
> maintenence, thats how software works.  What specfically about this patch series
> makes the effort insurmountable to you?
> 
> You say you're improving your process.  Great, this patch aids in that process
> by ensuring backwards compatibility for a period of time.  Given that the API
> and ABI can still evolve within this framework, as I've described, how is this
> patch series not a significant step forward toward your goal of quality process.
> 
> You say documentation isn't integrated.  So, what does getting documentation
> integrated have to do with this patch set, or any other?  I don't see you
> holding any other patches based on documentation.  Again, nothing in this series
> prevents evolution of the API or ABI.  If you're hope is to wait until
> everything is perfect, then apply some control to the public facing API, and get
> it all documented, none of thosse things will ever happen, I promise you.
> 
> You say you also need to learn to use more tools to be more efficient and
> improve quality.  Great!  Thats exactly what this is. If we mandate even a short
> term commitment to ABI stability (1 single relese worth of time), we will
> quickly identify what API's change quickly and where we need to be cautious with
> our API design.  If you just assume that developers will get better of their own
> volition, it will never happen.
> 
> You say this should go in next year, but not now.  When exactly?  What event do
> you forsee occuring in the next 12-18 months that will change everything such
> that we can start supporing an ABI for more than just a few weeks at the head of
> the tree?  
> 
> To this end, I just did a quick search through the git history for dpdk to look
> at the histories of all the header files that are exposed via the makefile
> SYMLINK command (given that that provides a list of header files that
> applications can include, and embodies all the function symbols and data types
> applications have access to.
> 
> There are 179 total commits in that list
> Of those, a bit of spot checking suggests that about 10-15% of them actually
> change ABI, and many of those came from Bruce's rework of the mbuf structure.
> That about 17-20 instances over the last 2 years where an ABI update would have
> been needed.  That seems pretty reasonable to me.  Where exactly is your concern
> here?
> 
> Neil
> 

Ping Thomas, I'd like to continue this debate to a conclusion.  Could you please
provide specific details and/or concerns that you have with this patch series?

Thanks
Neil

> > -- 
> > Thomas
> > 
> 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 4/4] docs: Add ABI documentation
  @ 2014-10-01 16:06  4%   ` Sergio Gonzalez Monroy
  0 siblings, 0 replies; 200+ results
From: Sergio Gonzalez Monroy @ 2014-10-01 16:06 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

Acked-by: Sergio Gonzalez Monroy <sergio.gonzalez.monroy@intel.com>

On Mon, Sep 15, 2014 at 03:23:51PM -0400, Neil Horman wrote:
> Adding a document describing rudimentary ABI policy and adding notice space for
> any deprecation announcements
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> ---
>  doc/abi.txt | 17 +++++++++++++++++
>  1 file changed, 17 insertions(+)
>  create mode 100644 doc/abi.txt
> 
> diff --git a/doc/abi.txt b/doc/abi.txt
> new file mode 100644
> index 0000000..b6dcc7d
> --- /dev/null
> +++ b/doc/abi.txt
> @@ -0,0 +1,17 @@
> +ABI policy:
> +	ABI versions are set at the time of major release labeling, and ABI may
> +change multiple times between the last labeling and the HEAD label of the git
> +tree without warning
> +
> +	ABI versions, once released are available until such time as their
> +deprecation has been noted here for at least one major release cycle, after it
> +has been tagged.  E.g. the ABI for DPDK 1.8 is shipped, and then the decision to
> +remove it is made during the development of DPDK 1.9.  The decision will be
> +recorded here, shipped with the DPDK 1.9 release, and actually removed when DPDK
> +1.10 ships.
> +
> +	ABI versions may be deprecated in whole, or in part as needed by a given
> +update.
> +
> +Deprecation Notices:
> +
> -- 
> 1.9.3
> 

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH 1/4 v4] compat: Add infrastructure to support symbol versioning
  2014-09-30 15:18  3% ` [dpdk-dev] [PATCH 1/4 v4] " Neil Horman
  2014-10-01 10:15  0%   ` Sergio Gonzalez Monroy
@ 2014-10-01 11:28  0%   ` Sergio Gonzalez Monroy
  1 sibling, 0 replies; 200+ results
From: Sergio Gonzalez Monroy @ 2014-10-01 11:28 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

Acked-by: Sergio Gonzalez Monroy <sergio.gonzalez.monroy@intel.com>

On Tue, Sep 30, 2014 at 11:18:00AM -0400, Neil Horman wrote:
> Add initial pass header files to support symbol versioning.
> 
> ---
> Change notes
> v2)
> * Fixed ifdef in rte_compat.h to test for RTE_BUILD_SHARED_LIB instead of the
> non-existant RTE_SYMBOL_VERSIONING
> 
> * Fixed VERSION_SYMBOL macro to add the needed extra @ to make versioning work
> properly
> 
> * Improved/Clarified documentation
> 
> v3)
> * Added missing macros to fully export the symver directive specification
> 
> v4)
> * Added macro definitions for !SHARED_LIB case
> * Improved documentation
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> CC: "Gonzalez Monroy, Sergio" <sergio.gonzalez.monroy@intel.com>
> ---
>  lib/Makefile                   |  1 +
>  lib/librte_compat/Makefile     | 38 +++++++++++++++++
>  lib/librte_compat/rte_compat.h | 96 ++++++++++++++++++++++++++++++++++++++++++
>  mk/rte.lib.mk                  |  6 +++
>  4 files changed, 141 insertions(+)
>  create mode 100644 lib/librte_compat/Makefile
>  create mode 100644 lib/librte_compat/rte_compat.h
> 
> diff --git a/lib/Makefile b/lib/Makefile
> index 10c5bb3..a85b55b 100644
> --- a/lib/Makefile
> +++ b/lib/Makefile
> @@ -32,6 +32,7 @@
>  include $(RTE_SDK)/mk/rte.vars.mk
>  
>  DIRS-$(CONFIG_RTE_LIBC) += libc
> +DIRS-y += librte_compat
>  DIRS-$(CONFIG_RTE_LIBRTE_EAL) += librte_eal
>  DIRS-$(CONFIG_RTE_LIBRTE_MALLOC) += librte_malloc
>  DIRS-$(CONFIG_RTE_LIBRTE_RING) += librte_ring
> diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
> new file mode 100644
> index 0000000..3415c7b
> --- /dev/null
> +++ b/lib/librte_compat/Makefile
> @@ -0,0 +1,38 @@
> +#   BSD LICENSE
> +#
> +#   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>
> +#   All rights reserved.
> +#
> +#   Redistribution and use in source and binary forms, with or without
> +#   modification, are permitted provided that the following conditions
> +#   are met:
> +#
> +#     * Redistributions of source code must retain the above copyright
> +#       notice, this list of conditions and the following disclaimer.
> +#     * Redistributions in binary form must reproduce the above copyright
> +#       notice, this list of conditions and the following disclaimer in
> +#       the documentation and/or other materials provided with the
> +#       distribution.
> +#     * Neither the name of Intel Corporation nor the names of its
> +#       contributors may be used to endorse or promote products derived
> +#       from this software without specific prior written permission.
> +#
> +#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> +#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> +#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
> +#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
> +#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> +#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> +#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> +#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> +#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> +#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> +#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> +
> +include $(RTE_SDK)/mk/rte.vars.mk
> +
> +
> +# install includes
> +SYMLINK-y-include := rte_compat.h
> +
> +include $(RTE_SDK)/mk/rte.lib.mk
> diff --git a/lib/librte_compat/rte_compat.h b/lib/librte_compat/rte_compat.h
> new file mode 100644
> index 0000000..d99e362
> --- /dev/null
> +++ b/lib/librte_compat/rte_compat.h
> @@ -0,0 +1,96 @@
> +/*-
> + *   BSD LICENSE
> + *
> + *   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>.
> + *   All rights reserved.
> + *
> + *   Redistribution and use in source and binary forms, with or without
> + *   modification, are permitted provided that the following conditions
> + *   are met:
> + *
> + *     * Redistributions of source code must retain the above copyright
> + *       notice, this list of conditions and the following disclaimer.
> + *     * Redistributions in binary form must reproduce the above copyright
> + *       notice, this list of conditions and the following disclaimer in
> + *       the documentation and/or other materials provided with the
> + *       distribution.
> + *     * Neither the name of Intel Corporation nor the names of its
> + *       contributors may be used to endorse or promote products derived
> + *       from this software without specific prior written permission.
> + *
> + *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> + *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> + *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
> + *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
> + *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> + *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> + *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> + *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#ifndef _RTE_COMPAT_H_
> +#define _RTE_COMPAT_H_
> +
> +/*
> + * This is just a stringification macro for use below.
> + */
> +#define SA(x) #x
> +
> +#ifdef RTE_BUILD_SHARED_LIB
> +
> +/*
> + * Provides backwards compatibility when updating exported functions.
> + * When a symol is exported from a library to provide an API, it also provides a
> + * calling convention (ABI) that is embodied in its name, return type,
> + * arguments, etc.  On occasion that function may need to change to accomodate
> + * new functionality, behavior, etc.  When that occurs, it is desireable to
> + * allow for backwards compatibility for a time with older binaries that are
> + * dynamically linked to the dpdk.  to support that the __vsym and
> + * VERSION_SYMBOL macros are created.  They, in conjunction with the
> + * <library>_version.map file for a given library allow for multiple versions of
> + * a symbol to exist in a shared library so that older binaries need not be
> + * immediately recompiled. Their use is outlined in the following example:
> + * Assumptions: DPDK 1.(X) contains a function int foo(char *string)
> + *              DPDK 1.(X+1) needs to change foo to be int foo(int index)
> + *
> + * To accomplish this:
> + * 1) Edit lib/<library>/library_version.map to add a DPDK_1.(X+1) node, in which
> + * foo is exported as a global symbol.
> + *
> + * 2) rename the existing function int foo(char *string) to 
> + * 	int __vsym foo_v18(char *string)
> + *
> + * 3) Add this macro immediately below the function
> + * 	VERSION_SYMBOL(foo, _v18, 1.8);
> + *
> + * 4) Implement a new version of foo.
> + * 	char foo(int value, int otherval) { ...}
> + *
> + * 5) Mark the newest version as the default version
> + * 	BIND_DEFAULT_SYMBOL(foo, 1.9);
> + *
> + */
> +#define VERSION_SYMBOL(b, e, v) __asm__(".symver " SA(b) SA(e) ", "SA(b)"@DPDK_"SA(v))
> +#define BASE_SYMBOL(b, n) __asm__(".symver " SA(n) ", "SA(b)"@")
> +#define BIND_DEFAULT_SYMBOL(b, v) __asm__(".symver " SA(b) ", "SA(b)"@@DPDK_"SA(v))
> +#define __vsym __attribute__((used))
> +
> +#else
> +/*
> + * No symbol versioning in use
> + */
> +#define VERSION_SYMBOL(b, e, v)
> +#define __vsym
> +#define BASE_SYMBOL(b, n)
> +#define BIND_DEFAULT_SYMBOL(b, v)
> +
> +/*
> + * RTE_BUILD_SHARED_LIB
> + */
> +#endif
> +
> +
> +#endif /* _RTE_COMPAT_H_ */
> diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
> index f458258..82ac309 100644
> --- a/mk/rte.lib.mk
> +++ b/mk/rte.lib.mk
> @@ -40,8 +40,12 @@ VPATH += $(SRCDIR)
>  
>  ifeq ($(RTE_BUILD_SHARED_LIB),y)
>  LIB := $(patsubst %.a,%.so,$(LIB))
> +
> +CPU_LDFLAGS += --version-script=$(EXPORT_MAP)
> +
>  endif
>  
> +
>  _BUILD = $(LIB)
>  _INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) $(RTE_OUTPUT)/lib/$(LIB)
>  _CLEAN = doclean
> @@ -160,7 +164,9 @@ endif
>  $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
>  	@echo "  INSTALL-LIB $(LIB)"
>  	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
> +ifneq ($(LIB),)
>  	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
> +endif
>  
>  #
>  # Clean all generated files
> -- 
> 1.9.3
> 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 3/4] Add library version extenstion
  @ 2014-10-01 11:27  0%   ` Sergio Gonzalez Monroy
  0 siblings, 0 replies; 200+ results
From: Sergio Gonzalez Monroy @ 2014-10-01 11:27 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

Acked-by: Sergio Gonzalez Monroy <sergio.gonzalez.monroy@intel.com>

On Mon, Sep 15, 2014 at 03:23:50PM -0400, Neil Horman wrote:
> To differentiate libraries that break ABI, we add a library version number
> suffix to the library, which must be incremented when a given libraries ABI is
> broken.  This patch enforces that addition, sets the initial abi soname
> extension to 1 for each library and creates a symlink to the base SONAME so that
> the test applications will link properly.
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> ---
>  lib/librte_acl/Makefile              |  2 ++
>  lib/librte_cfgfile/Makefile          |  2 ++
>  lib/librte_cmdline/Makefile          |  2 ++
>  lib/librte_compat/Makefile           |  2 ++
>  lib/librte_distributor/Makefile      |  2 ++
>  lib/librte_eal/bsdapp/eal/Makefile   |  2 ++
>  lib/librte_eal/linuxapp/eal/Makefile |  2 ++
>  lib/librte_ether/Makefile            |  2 ++
>  lib/librte_hash/Makefile             |  2 ++
>  lib/librte_ip_frag/Makefile          |  2 ++
>  lib/librte_ivshmem/Makefile          |  2 ++
>  lib/librte_kni/Makefile              |  2 ++
>  lib/librte_kvargs/Makefile           |  2 ++
>  lib/librte_lpm/Makefile              |  2 ++
>  lib/librte_malloc/Makefile           |  2 ++
>  lib/librte_mbuf/Makefile             |  2 ++
>  lib/librte_mempool/Makefile          |  2 ++
>  lib/librte_meter/Makefile            |  2 ++
>  lib/librte_pipeline/Makefile         |  2 ++
>  lib/librte_pmd_bond/Makefile         |  2 ++
>  lib/librte_pmd_e1000/Makefile        |  2 ++
>  lib/librte_pmd_i40e/Makefile         |  2 ++
>  lib/librte_pmd_ixgbe/Makefile        |  2 ++
>  lib/librte_pmd_pcap/Makefile         |  2 ++
>  lib/librte_pmd_ring/Makefile         |  2 ++
>  lib/librte_pmd_virtio/Makefile       |  2 ++
>  lib/librte_pmd_vmxnet3/Makefile      |  2 ++
>  lib/librte_pmd_xenvirt/Makefile      |  2 ++
>  lib/librte_port/Makefile             |  2 ++
>  lib/librte_power/Makefile            |  2 ++
>  lib/librte_ring/Makefile             |  2 ++
>  lib/librte_sched/Makefile            |  2 ++
>  lib/librte_table/Makefile            |  2 ++
>  lib/librte_timer/Makefile            |  2 ++
>  mk/rte.lib.mk                        | 12 +++++++++---
>  35 files changed, 77 insertions(+), 3 deletions(-)
> 
> diff --git a/lib/librte_acl/Makefile b/lib/librte_acl/Makefile
> index 1f96645..4db403b 100644
> --- a/lib/librte_acl/Makefile
> +++ b/lib/librte_acl/Makefile
> @@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_acl/rte_acl_version.map
>  
> +LIBABIVER := 1
> +
>  # all source are stored in SRCS-y
>  SRCS-$(CONFIG_RTE_LIBRTE_ACL) += tb_mem.c
>  
> diff --git a/lib/librte_cfgfile/Makefile b/lib/librte_cfgfile/Makefile
> index e655098..1c81579 100644
> --- a/lib/librte_cfgfile/Makefile
> +++ b/lib/librte_cfgfile/Makefile
> @@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_cfgfile/rte_cfgfile_version.map
>  
> +LIBABIVER := 1
> +
>  #
>  # all source are stored in SRCS-y
>  #
> diff --git a/lib/librte_cmdline/Makefile b/lib/librte_cmdline/Makefile
> index 1a47173..b0ab5b6 100644
> --- a/lib/librte_cmdline/Makefile
> +++ b/lib/librte_cmdline/Makefile
> @@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_cmdline/rte_cmdline_version.map
>  
> +LIBABIVER := 1
> +
>  # all source are stored in SRCS-y
>  SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) := cmdline.c
>  SRCS-$(CONFIG_RTE_LIBRTE_CMDLINE) += cmdline_cirbuf.c
> diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
> index a61511a..5f369e5 100644
> --- a/lib/librte_compat/Makefile
> +++ b/lib/librte_compat/Makefile
> @@ -32,6 +32,8 @@
>  include $(RTE_SDK)/mk/rte.vars.mk
>  
>  
> +LIBABIVER := 1
> +
>  # install includes
>  SYMLINK-y-include := rte_compat.h
>  
> diff --git a/lib/librte_distributor/Makefile b/lib/librte_distributor/Makefile
> index 97d8bbb..12d9df1 100644
> --- a/lib/librte_distributor/Makefile
> +++ b/lib/librte_distributor/Makefile
> @@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_distributor/rte_distributor_version.map
>  
> +LIBABIVER := 1
> +
>  # all source are stored in SRCS-y
>  SRCS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) := rte_distributor.c
>  
> diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
> index 2caaf00..2edd880 100644
> --- a/lib/librte_eal/bsdapp/eal/Makefile
> +++ b/lib/librte_eal/bsdapp/eal/Makefile
> @@ -47,6 +47,8 @@ CFLAGS += $(WERROR_FLAGS) -O3
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_eal/bsdapp/eal/rte_eal_version.map
>  
> +LIBABIVER := 1
> +
>  # specific to linuxapp exec-env
>  SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) := eal.c
>  SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_memory.c
> diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
> index 254d59c..267f2c7 100644
> --- a/lib/librte_eal/linuxapp/eal/Makefile
> +++ b/lib/librte_eal/linuxapp/eal/Makefile
> @@ -35,6 +35,8 @@ LIB = librte_eal.a
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_eal/linuxapp/eal/rte_eal_version.map
>  
> +LIBABIVER := 1
> +
>  VPATH += $(RTE_SDK)/lib/librte_eal/common
>  
>  CFLAGS += -I$(SRCDIR)/include
> diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
> index f40b5cc..62bcf0c 100644
> --- a/lib/librte_ether/Makefile
> +++ b/lib/librte_ether/Makefile
> @@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_ether/rte_ether_version.map
>  
> +LIBABIVER := 1
> +
>  SRCS-y += rte_ethdev.c
>  
>  #
> diff --git a/lib/librte_hash/Makefile b/lib/librte_hash/Makefile
> index a449ec2..17778ba 100644
> --- a/lib/librte_hash/Makefile
> +++ b/lib/librte_hash/Makefile
> @@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_hash/rte_hash_version.map
>  
> +LIBABIVER := 1
> +
>  # all source are stored in SRCS-y
>  SRCS-$(CONFIG_RTE_LIBRTE_HASH) := rte_hash.c
>  SRCS-$(CONFIG_RTE_LIBRTE_HASH) += rte_fbk_hash.c
> diff --git a/lib/librte_ip_frag/Makefile b/lib/librte_ip_frag/Makefile
> index ede5a89..6b496dc 100644
> --- a/lib/librte_ip_frag/Makefile
> +++ b/lib/librte_ip_frag/Makefile
> @@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_ip_frag/rte_ipfrag_version.map
>  
> +LIBABIVER := 1
> +
>  #source files
>  SRCS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += rte_ipv4_fragmentation.c
>  SRCS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += rte_ipv4_reassembly.c
> diff --git a/lib/librte_ivshmem/Makefile b/lib/librte_ivshmem/Makefile
> index be6f21a..7c8dc17 100644
> --- a/lib/librte_ivshmem/Makefile
> +++ b/lib/librte_ivshmem/Makefile
> @@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
>  
>  EXPORT_MAPS := $(RTE_SDK)/lib/librte_ivshmem/rte_ivshmem_version.map
>  
> +LIBABIVER := 1
> +
>  # all source are stored in SRCS-y
>  SRCS-$(CONFIG_RTE_LIBRTE_IVSHMEM) := rte_ivshmem.c
>  
> diff --git a/lib/librte_kni/Makefile b/lib/librte_kni/Makefile
> index c119fc1..59abd85 100644
> --- a/lib/librte_kni/Makefile
> +++ b/lib/librte_kni/Makefile
> @@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_kni/rte_kni_version.map
>  
> +LIBABIVER := 1
> +
>  # all source are stored in SRCS-y
>  SRCS-$(CONFIG_RTE_LIBRTE_KNI) := rte_kni.c
>  
> diff --git a/lib/librte_kvargs/Makefile b/lib/librte_kvargs/Makefile
> index 83a42b1..10713db 100644
> --- a/lib/librte_kvargs/Makefile
> +++ b/lib/librte_kvargs/Makefile
> @@ -40,6 +40,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_kvargs/rte_kvargs_version.map
>  
> +LIBABIVER := 1
> +
>  # all source are stored in SRCS-y
>  SRCS-$(CONFIG_RTE_LIBRTE_KVARGS) := rte_kvargs.c
>  
> diff --git a/lib/librte_lpm/Makefile b/lib/librte_lpm/Makefile
> index 05de8d9..c99bfbd 100644
> --- a/lib/librte_lpm/Makefile
> +++ b/lib/librte_lpm/Makefile
> @@ -39,6 +39,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_lpm/rte_lpm_version.map
>  
> +LIBABIVER := 1
> +
>  # all source are stored in SRCS-y
>  SRCS-$(CONFIG_RTE_LIBRTE_LPM) := rte_lpm.c rte_lpm6.c
>  
> diff --git a/lib/librte_malloc/Makefile b/lib/librte_malloc/Makefile
> index 1a5c288..3bb7a99 100644
> --- a/lib/librte_malloc/Makefile
> +++ b/lib/librte_malloc/Makefile
> @@ -34,6 +34,8 @@ include $(RTE_SDK)/mk/rte.vars.mk
>  # library name
>  LIB = librte_malloc.a
>  
> +LIBABIVER := 1
> +
>  CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_malloc/rte_malloc_version.map
> diff --git a/lib/librte_mbuf/Makefile b/lib/librte_mbuf/Makefile
> index 5cd4941..3cf94d1 100644
> --- a/lib/librte_mbuf/Makefile
> +++ b/lib/librte_mbuf/Makefile
> @@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_mbuf/rte_mbuf_version.map
>  
> +LIBABIVER := 1
> +
>  # all source are stored in SRCS-y
>  SRCS-$(CONFIG_RTE_LIBRTE_MBUF) := rte_mbuf.c
>  
> diff --git a/lib/librte_mempool/Makefile b/lib/librte_mempool/Makefile
> index 07b5b4e..2c2a6e8 100644
> --- a/lib/librte_mempool/Makefile
> +++ b/lib/librte_mempool/Makefile
> @@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_mempool/rte_mempool_version.map
>  
> +LIBABIVER := 1
> +
>  # all source are stored in SRCS-y
>  SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) +=  rte_mempool.c
>  ifeq ($(CONFIG_RTE_LIBRTE_XEN_DOM0),y)
> diff --git a/lib/librte_meter/Makefile b/lib/librte_meter/Makefile
> index 0778690..f58822e 100644
> --- a/lib/librte_meter/Makefile
> +++ b/lib/librte_meter/Makefile
> @@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_meter/rte_meter_version.map
>  
> +LIBABIVER := 1
> +
>  #
>  # all source are stored in SRCS-y
>  #
> diff --git a/lib/librte_pipeline/Makefile b/lib/librte_pipeline/Makefile
> index 5465d00..df44f51 100644
> --- a/lib/librte_pipeline/Makefile
> +++ b/lib/librte_pipeline/Makefile
> @@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_pipeline/rte_pipeline_version.map
>  
> +LIBABIVER := 1
> +
>  #
>  # all source are stored in SRCS-y
>  #
> diff --git a/lib/librte_pmd_bond/Makefile b/lib/librte_pmd_bond/Makefile
> index 5b14ce2..2f1e83b 100644
> --- a/lib/librte_pmd_bond/Makefile
> +++ b/lib/librte_pmd_bond/Makefile
> @@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_bond/rte_eth_bond_version.map
>  
> +LIBABIVER := 1
> +
>  #
>  # all source are stored in SRCS-y
>  #
> diff --git a/lib/librte_pmd_e1000/Makefile b/lib/librte_pmd_e1000/Makefile
> index e225bfe..a5e3b66 100644
> --- a/lib/librte_pmd_e1000/Makefile
> +++ b/lib/librte_pmd_e1000/Makefile
> @@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_e1000/rte_pmd_e1000_version.map
>  
> +LIBABIVER := 1
> +
>  ifeq ($(CC), icc)
>  #
>  # CFLAGS for icc
> diff --git a/lib/librte_pmd_i40e/Makefile b/lib/librte_pmd_i40e/Makefile
> index cfbe816..d59967a 100644
> --- a/lib/librte_pmd_i40e/Makefile
> +++ b/lib/librte_pmd_i40e/Makefile
> @@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_i40e/rte_pmd_i40e_version.map
>  
> +LIBABIVER := 1
> +
>  #
>  # Add extra flags for base driver files (also known as shared code)
>  # to disable warnings
> diff --git a/lib/librte_pmd_ixgbe/Makefile b/lib/librte_pmd_ixgbe/Makefile
> index 1dd14a6..fd17c09 100644
> --- a/lib/librte_pmd_ixgbe/Makefile
> +++ b/lib/librte_pmd_ixgbe/Makefile
> @@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_ixgbe/rte_pmd_ixgbe_version.map
>  
> +LIBABIVER := 1
> +
>  ifeq ($(CC), icc)
>  #
>  # CFLAGS for icc
> diff --git a/lib/librte_pmd_pcap/Makefile b/lib/librte_pmd_pcap/Makefile
> index fff5572..8f05c2c 100644
> --- a/lib/librte_pmd_pcap/Makefile
> +++ b/lib/librte_pmd_pcap/Makefile
> @@ -42,6 +42,8 @@ CFLAGS += $(WERROR_FLAGS)
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_pcap/rte_pmd_pcap_version.map
>  
> +LIBABIVER := 1
> +
>  #
>  # all source are stored in SRCS-y
>  #
> diff --git a/lib/librte_pmd_ring/Makefile b/lib/librte_pmd_ring/Makefile
> index 25ad27f..24c57fc 100644
> --- a/lib/librte_pmd_ring/Makefile
> +++ b/lib/librte_pmd_ring/Makefile
> @@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_ring/rte_eth_ring_version.map
>  
> +LIBABIVER := 1
> +
>  #
>  # all source are stored in SRCS-y
>  #
> diff --git a/lib/librte_pmd_virtio/Makefile b/lib/librte_pmd_virtio/Makefile
> index bf51bd9..d0bec84 100644
> --- a/lib/librte_pmd_virtio/Makefile
> +++ b/lib/librte_pmd_virtio/Makefile
> @@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_virtio/rte_pmd_virtio_version.map
>  
> +LIBABIVER := 1
> +
>  #
>  # all source are stored in SRCS-y
>  #
> diff --git a/lib/librte_pmd_vmxnet3/Makefile b/lib/librte_pmd_vmxnet3/Makefile
> index e5a1c6b..2b418f4 100644
> --- a/lib/librte_pmd_vmxnet3/Makefile
> +++ b/lib/librte_pmd_vmxnet3/Makefile
> @@ -68,6 +68,8 @@ VPATH += $(RTE_SDK)/lib/librte_pmd_vmxnet3/vmxnet3
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_vmxnet3/rte_pmd_vmxnet3_version.map
>  
> +LIBABIVER := 1
> +
>  #
>  # all source are stored in SRCS-y
>  #
> diff --git a/lib/librte_pmd_xenvirt/Makefile b/lib/librte_pmd_xenvirt/Makefile
> index 0a08b1b..6132c1c 100644
> --- a/lib/librte_pmd_xenvirt/Makefile
> +++ b/lib/librte_pmd_xenvirt/Makefile
> @@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_pmd_xenvirt/rte_eth_xenvirt_version.map
>  
> +LIBABIVER := 1
> +
>  #
>  # all source are stored in SRCS-y
>  #
> diff --git a/lib/librte_port/Makefile b/lib/librte_port/Makefile
> index e812bda..828692f 100644
> --- a/lib/librte_port/Makefile
> +++ b/lib/librte_port/Makefile
> @@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_port/rte_port_version.map
>  
> +LIBABIVER := 1
> +
>  #
>  # all source are stored in SRCS-y
>  #
> diff --git a/lib/librte_power/Makefile b/lib/librte_power/Makefile
> index 26ee542..3261176 100644
> --- a/lib/librte_power/Makefile
> +++ b/lib/librte_power/Makefile
> @@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 -fno-strict-aliasing
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_power/rte_power_version.map
>  
> +LIBABIVER := 1
> +
>  # all source are stored in SRCS-y
>  SRCS-$(CONFIG_RTE_LIBRTE_POWER) := rte_power.c
>  
> diff --git a/lib/librte_ring/Makefile b/lib/librte_ring/Makefile
> index 0adaa00..fa697ea 100644
> --- a/lib/librte_ring/Makefile
> +++ b/lib/librte_ring/Makefile
> @@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_ring/rte_ring_version.map
>  
> +LIBABIVER := 1
> +
>  # all source are stored in SRCS-y
>  SRCS-$(CONFIG_RTE_LIBRTE_RING) := rte_ring.c
>  
> diff --git a/lib/librte_sched/Makefile b/lib/librte_sched/Makefile
> index 205fb7a..1a54bf9 100644
> --- a/lib/librte_sched/Makefile
> +++ b/lib/librte_sched/Makefile
> @@ -43,6 +43,8 @@ CFLAGS_rte_red.o := -D_GNU_SOURCE
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_sched/rte_sched_version.map
>  
> +LIBABIVER := 1
> +
>  #
>  # all source are stored in SRCS-y
>  #
> diff --git a/lib/librte_table/Makefile b/lib/librte_table/Makefile
> index 5b54acc..29b768c 100644
> --- a/lib/librte_table/Makefile
> +++ b/lib/librte_table/Makefile
> @@ -41,6 +41,8 @@ CFLAGS += $(WERROR_FLAGS)
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_table/rte_table_version.map
>  
> +LIBABIVER := 1
> +
>  #
>  # all source are stored in SRCS-y
>  #
> diff --git a/lib/librte_timer/Makefile b/lib/librte_timer/Makefile
> index f703e5f..01772c7 100644
> --- a/lib/librte_timer/Makefile
> +++ b/lib/librte_timer/Makefile
> @@ -38,6 +38,8 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
>  
>  EXPORT_MAP := $(RTE_SDK)/lib/librte_timer/rte_timer_version.map
>  
> +LIBABIVER := 1
> +
>  # all source are stored in SRCS-y
>  SRCS-$(CONFIG_RTE_LIBRTE_TIMER) := rte_timer.c
>  
> diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
> index 82ac309..4d55cc9 100644
> --- a/mk/rte.lib.mk
> +++ b/mk/rte.lib.mk
> @@ -37,10 +37,8 @@ include $(RTE_SDK)/mk/internal/rte.depdirs-pre.mk
>  
>  # VPATH contains at least SRCDIR
>  VPATH += $(SRCDIR)
> -
>  ifeq ($(RTE_BUILD_SHARED_LIB),y)
> -LIB := $(patsubst %.a,%.so,$(LIB))
> -
> +LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB))
>  CPU_LDFLAGS += --version-script=$(EXPORT_MAP)
>  
>  endif
> @@ -63,6 +61,7 @@ build: _postbuild
>  
>  exe2cmd = $(strip $(call dotfile,$(patsubst %,%.cmd,$(1))))
>  
> +
>  ifeq ($(LINK_USING_CC),1)
>  # Override the definition of LD here, since we're linking with CC
>  LD := $(CC)
> @@ -112,6 +111,10 @@ lib_dir = [ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib;
>  #
>  ifeq ($(RTE_BUILD_SHARED_LIB),y)
>  $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
> +ifeq ($(LIBABIVER),)
> +	@echo "Must Specify a $(LIB) ABI version"
> +	@exit 1
> +endif
>  	@[ -d $(dir $@) ] || mkdir -p $(dir $@)
>  	$(if $(D),\
>  		@echo -n "$< -> $@ " ; \
> @@ -125,6 +128,7 @@ $(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
>  		$(depfile_missing),\
>  		$(depfile_newer)),\
>  		$(O_TO_S_DO))
> +
>  ifeq ($(RTE_BUILD_COMBINE_LIBS),y)
>  	$(if $(or \
>          $(file_missing),\
> @@ -162,10 +166,12 @@ endif
>  # install lib in $(RTE_OUTPUT)/lib
>  #
>  $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
> +	$(eval LIBSONAME := $(basename $(LIB)))
>  	@echo "  INSTALL-LIB $(LIB)"
>  	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
>  ifneq ($(LIB),)
>  	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
> +	$(Q)ln -s -f $(RTE_OUTPUT)/lib/$(LIB) $(RTE_OUTPUT)/lib/$(LIBSONAME)
>  endif
>  
>  #
> -- 
> 1.9.3
> 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH RFC] mbuf: Adjust TX flags to start at bit 32
  2014-10-01  8:47  0%   ` Bruce Richardson
@ 2014-10-01 11:14  0%     ` Neil Horman
  0 siblings, 0 replies; 200+ results
From: Neil Horman @ 2014-10-01 11:14 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: dev

On Wed, Oct 01, 2014 at 09:47:21AM +0100, Bruce Richardson wrote:
> On Tue, Sep 30, 2014 at 01:06:32PM -0400, Neil Horman wrote:
> > On Tue, Sep 30, 2014 at 04:26:02PM +0100, Bruce Richardson wrote:
> > > This patch takes the existing TX flags defined for the mbuf and shifts
> > > each uniquely defined one left so that additional RX flags can be
> > > defined without having RX and TX flags mixed together.
> > > 
> > > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> > > ---
> > >  lib/librte_mbuf/rte_mbuf.h | 26 +++++++++++++-------------
> > >  1 file changed, 13 insertions(+), 13 deletions(-)
> > > 
> > > diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
> > > index 1c6e115..c9fc4ec 100644
> > > --- a/lib/librte_mbuf/rte_mbuf.h
> > > +++ b/lib/librte_mbuf/rte_mbuf.h
> > > @@ -86,26 +86,26 @@ extern "C" {
> > >  #define PKT_RX_IEEE1588_PTP  0x0200 /**< RX IEEE1588 L2 Ethernet PT Packet. */
> > >  #define PKT_RX_IEEE1588_TMST 0x0400 /**< RX IEEE1588 L2/L4 timestamped packet.*/
> > >  
> > > -#define PKT_TX_VLAN_PKT      0x0800 /**< TX packet is a 802.1q VLAN packet. */
> > > -#define PKT_TX_IP_CKSUM      0x1000 /**< IP cksum of TX pkt. computed by NIC. */
> > > -#define PKT_TX_IPV4_CSUM     0x1000 /**< Alias of PKT_TX_IP_CKSUM. */
> > > -#define PKT_TX_IPV4          PKT_RX_IPV4_HDR /**< IPv4 with no IP checksum offload. */
> > > -#define PKT_TX_IPV6          PKT_RX_IPV6_HDR /**< IPv6 packet */
> > > +#define PKT_TX_VLAN_PKT  (0x0001 << 32) /**< TX packet is a 802.1q VLAN packet. */
> > > +#define PKT_TX_IP_CKSUM  (0x0002 << 32) /**< IP cksum of TX pkt. computed by NIC. */
> > > +#define PKT_TX_IPV4_CSUM PKT_TX_IP_CKSUM /**< Alias of PKT_TX_IP_CKSUM. */
> > > +#define PKT_TX_IPV4      PKT_RX_IPV4_HDR /**< IPv4 with no IP checksum offload. */
> > > +#define PKT_TX_IPV6      PKT_RX_IPV6_HDR /**< IPv6 packet */
> > >  
> > >  /*
> > > - * Bit 14~13 used for L4 packet type with checksum enabled.
> > > + * Bit 35~34 used for L4 packet type with checksum enabled.
> > >   *     00: Reserved
> > >   *     01: TCP checksum
> > >   *     10: SCTP checksum
> > >   *     11: UDP checksum
> > >   */
> > > -#define PKT_TX_L4_MASK       0x6000 /**< Mask bits for L4 checksum offload request. */
> > > -#define PKT_TX_L4_NO_CKSUM   0x0000 /**< Disable L4 cksum of TX pkt. */
> > > -#define PKT_TX_TCP_CKSUM     0x2000 /**< TCP cksum of TX pkt. computed by NIC. */
> > > -#define PKT_TX_SCTP_CKSUM    0x4000 /**< SCTP cksum of TX pkt. computed by NIC. */
> > > -#define PKT_TX_UDP_CKSUM     0x6000 /**< UDP cksum of TX pkt. computed by NIC. */
> > > -/* Bit 15 */
> > > -#define PKT_TX_IEEE1588_TMST 0x8000 /**< TX IEEE1588 packet to timestamp. */
> > > +#define PKT_TX_L4_NO_CKSUM   (0x0000 << 32) /**< Disable L4 cksum of TX pkt. */
> > > +#define PKT_TX_TCP_CKSUM     (0x0004 << 32) /**< TCP cksum of TX pkt. computed by NIC. */
> > > +#define PKT_TX_SCTP_CKSUM    (0x0008 << 32) /**< SCTP cksum of TX pkt. computed by NIC. */
> > > +#define PKT_TX_UDP_CKSUM     (0x000C << 32) /**< UDP cksum of TX pkt. computed by NIC. */
> > > +#define PKT_TX_L4_MASK       (0x000C << 32) /**< Mask for L4 cksum offload request. */
> > > +/* Bit 36 */
> > > +#define PKT_TX_IEEE1588_TMST (0x0010 << 32) /**< TX IEEE1588 packet to timestamp. */
> > >  
> > >  /* Use final bit of flags to indicate a control mbuf */
> > >  #define CTRL_MBUF_FLAG       (1ULL << 63)
> > > -- 
> > > 1.9.3
> > > 
> > > 
> > 
> > I'm not opposed to the patch at all, but I would like to point out that this is
> > the sort of change that breaks ABI very easily (which is fine right now given
> > the mbuf changes already staged for the release, but still something to be aware
> > of).  As such, are there advantages to this patch (other than the niceness of
> > human readability)?
> > 
> > If we're going to reshuffle these flags now, it might be nice to start tx flags
> > at the most significant bit and count back, and start rx flags at the least
> > significant bit and count up.  That would ensure that we don't reserve flags for
> > a direction without need.
> > 
> > Best
> > Neil
> >
> Good idea, though currently the most significant bit is being used as a flag 
> to indicate a control mbuf. My thinking is that we may potentially need 
> other flags that are not just for RX or TX, and to have those at the end.  
> However, given that that is likely to be the exception case, perhaps we 
> could reserve the last byte for non-RX/TX flags and then implement the 
> scheme you suggest. What do you think?
> 
Sure, seems reasonable
Neil

> /Bruce 
> 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 1/4 v4] compat: Add infrastructure to support symbol versioning
  2014-10-01 10:15  0%   ` Sergio Gonzalez Monroy
@ 2014-10-01 10:38  0%     ` Neil Horman
  0 siblings, 0 replies; 200+ results
From: Neil Horman @ 2014-10-01 10:38 UTC (permalink / raw)
  To: Sergio Gonzalez Monroy; +Cc: dev

On Wed, Oct 01, 2014 at 11:15:31AM +0100, Sergio Gonzalez Monroy wrote:
> On Tue, Sep 30, 2014 at 11:18:00AM -0400, Neil Horman wrote:
> > Add initial pass header files to support symbol versioning.
> > 
> > ---
> > Change notes
> > v2)
> > * Fixed ifdef in rte_compat.h to test for RTE_BUILD_SHARED_LIB instead of the
> > non-existant RTE_SYMBOL_VERSIONING
> > 
> > * Fixed VERSION_SYMBOL macro to add the needed extra @ to make versioning work
> > properly
> > 
> > * Improved/Clarified documentation
> > 
> > v3)
> > * Added missing macros to fully export the symver directive specification
> > 
> > v4)
> > * Added macro definitions for !SHARED_LIB case
> > * Improved documentation
> > 
> > Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> > CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> > CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> > CC: "Gonzalez Monroy, Sergio" <sergio.gonzalez.monroy@intel.com>
> > ---
> >  lib/Makefile                   |  1 +
> >  lib/librte_compat/Makefile     | 38 +++++++++++++++++
> >  lib/librte_compat/rte_compat.h | 96 ++++++++++++++++++++++++++++++++++++++++++
> >  mk/rte.lib.mk                  |  6 +++
> >  4 files changed, 141 insertions(+)
> >  create mode 100644 lib/librte_compat/Makefile
> >  create mode 100644 lib/librte_compat/rte_compat.h
> > 
> > diff --git a/lib/Makefile b/lib/Makefile
> > index 10c5bb3..a85b55b 100644
> > --- a/lib/Makefile
> > +++ b/lib/Makefile
> > @@ -32,6 +32,7 @@
> >  include $(RTE_SDK)/mk/rte.vars.mk
> >  
> >  DIRS-$(CONFIG_RTE_LIBC) += libc
> > +DIRS-y += librte_compat
> >  DIRS-$(CONFIG_RTE_LIBRTE_EAL) += librte_eal
> >  DIRS-$(CONFIG_RTE_LIBRTE_MALLOC) += librte_malloc
> >  DIRS-$(CONFIG_RTE_LIBRTE_RING) += librte_ring
> > diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
> > new file mode 100644
> > index 0000000..3415c7b
> > --- /dev/null
> > +++ b/lib/librte_compat/Makefile
> > @@ -0,0 +1,38 @@
> > +#   BSD LICENSE
> > +#
> > +#   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>
> > +#   All rights reserved.
> > +#
> > +#   Redistribution and use in source and binary forms, with or without
> > +#   modification, are permitted provided that the following conditions
> > +#   are met:
> > +#
> > +#     * Redistributions of source code must retain the above copyright
> > +#       notice, this list of conditions and the following disclaimer.
> > +#     * Redistributions in binary form must reproduce the above copyright
> > +#       notice, this list of conditions and the following disclaimer in
> > +#       the documentation and/or other materials provided with the
> > +#       distribution.
> > +#     * Neither the name of Intel Corporation nor the names of its
> > +#       contributors may be used to endorse or promote products derived
> > +#       from this software without specific prior written permission.
> > +#
> > +#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> > +#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> > +#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
> > +#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
> > +#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> > +#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> > +#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> > +#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> > +#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> > +#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> > +#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> > +
> > +include $(RTE_SDK)/mk/rte.vars.mk
> > +
> > +
> > +# install includes
> > +SYMLINK-y-include := rte_compat.h
> > +
> > +include $(RTE_SDK)/mk/rte.lib.mk
> > diff --git a/lib/librte_compat/rte_compat.h b/lib/librte_compat/rte_compat.h
> > new file mode 100644
> > index 0000000..d99e362
> > --- /dev/null
> > +++ b/lib/librte_compat/rte_compat.h
> > @@ -0,0 +1,96 @@
> > +/*-
> > + *   BSD LICENSE
> > + *
> > + *   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>.
> > + *   All rights reserved.
> > + *
> > + *   Redistribution and use in source and binary forms, with or without
> > + *   modification, are permitted provided that the following conditions
> > + *   are met:
> > + *
> > + *     * Redistributions of source code must retain the above copyright
> > + *       notice, this list of conditions and the following disclaimer.
> > + *     * Redistributions in binary form must reproduce the above copyright
> > + *       notice, this list of conditions and the following disclaimer in
> > + *       the documentation and/or other materials provided with the
> > + *       distribution.
> > + *     * Neither the name of Intel Corporation nor the names of its
> > + *       contributors may be used to endorse or promote products derived
> > + *       from this software without specific prior written permission.
> > + *
> > + *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> > + *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> > + *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
> > + *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
> > + *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> > + *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> > + *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> > + *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> > + *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> > + *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> > + *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> > + */
> > +
> > +#ifndef _RTE_COMPAT_H_
> > +#define _RTE_COMPAT_H_
> > +
> > +/*
> > + * This is just a stringification macro for use below.
> > + */
> > +#define SA(x) #x
> > +
> > +#ifdef RTE_BUILD_SHARED_LIB
> > +
> > +/*
> > + * Provides backwards compatibility when updating exported functions.
> > + * When a symol is exported from a library to provide an API, it also provides a
> > + * calling convention (ABI) that is embodied in its name, return type,
> > + * arguments, etc.  On occasion that function may need to change to accomodate
> > + * new functionality, behavior, etc.  When that occurs, it is desireable to
> > + * allow for backwards compatibility for a time with older binaries that are
> > + * dynamically linked to the dpdk.  to support that the __vsym and
> > + * VERSION_SYMBOL macros are created.  They, in conjunction with the
> > + * <library>_version.map file for a given library allow for multiple versions of
> > + * a symbol to exist in a shared library so that older binaries need not be
> > + * immediately recompiled. Their use is outlined in the following example:
> > + * Assumptions: DPDK 1.(X) contains a function int foo(char *string)
> > + *              DPDK 1.(X+1) needs to change foo to be int foo(int index)
> > + *
> > + * To accomplish this:
> > + * 1) Edit lib/<library>/library_version.map to add a DPDK_1.(X+1) node, in which
> > + * foo is exported as a global symbol.
> > + *
> > + * 2) rename the existing function int foo(char *string) to 
> > + * 	int __vsym foo_v18(char *string)
> > + *
> > + * 3) Add this macro immediately below the function
> > + * 	VERSION_SYMBOL(foo, _v18, 1.8);
> > + *
> > + * 4) Implement a new version of foo.
> > + * 	char foo(int value, int otherval) { ...}
> > + *
> > + * 5) Mark the newest version as the default version
> > + * 	BIND_DEFAULT_SYMBOL(foo, 1.9);
> > + *
> > + */
> > +#define VERSION_SYMBOL(b, e, v) __asm__(".symver " SA(b) SA(e) ", "SA(b)"@DPDK_"SA(v))
> > +#define BASE_SYMBOL(b, n) __asm__(".symver " SA(n) ", "SA(b)"@")
> 
> Hi Neil,
> 
> I was wondering about the use of BASE_SYMBOL macro (as you left it out of the example/doc).
> 
> From what I understood (according to ld documentation on versioning), that macro would 
> bound the symbol to the unspecified base version of the symbol.
> You would want that to provide backward compatibility to apps linked against DSOs pre-versioning.
> I was under the impression that there would not be support for such apps (therefore no need
> for BASE_SYMBOL macro).
> 

You are correct, there really is no need for it in our immediate purpose.  I
only provided it for completeness of the versioning specification language
(hence the lack of example).  We can remove it if you like, but I figured it was
potentially useful to include.

Neil

> Sergio
> 
> 
> > +#define BIND_DEFAULT_SYMBOL(b, v) __asm__(".symver " SA(b) ", "SA(b)"@@DPDK_"SA(v))
> > +#define __vsym __attribute__((used))
> > +
> > +#else
> > +/*
> > + * No symbol versioning in use
> > + */
> > +#define VERSION_SYMBOL(b, e, v)
> > +#define __vsym
> > +#define BASE_SYMBOL(b, n)
> > +#define BIND_DEFAULT_SYMBOL(b, v)
> > +
> > +/*
> > + * RTE_BUILD_SHARED_LIB
> > + */
> > +#endif
> > +
> > +
> > +#endif /* _RTE_COMPAT_H_ */
> > diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
> > index f458258..82ac309 100644
> > --- a/mk/rte.lib.mk
> > +++ b/mk/rte.lib.mk
> > @@ -40,8 +40,12 @@ VPATH += $(SRCDIR)
> >  
> >  ifeq ($(RTE_BUILD_SHARED_LIB),y)
> >  LIB := $(patsubst %.a,%.so,$(LIB))
> > +
> > +CPU_LDFLAGS += --version-script=$(EXPORT_MAP)
> > +
> >  endif
> >  
> > +
> >  _BUILD = $(LIB)
> >  _INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) $(RTE_OUTPUT)/lib/$(LIB)
> >  _CLEAN = doclean
> > @@ -160,7 +164,9 @@ endif
> >  $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
> >  	@echo "  INSTALL-LIB $(LIB)"
> >  	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
> > +ifneq ($(LIB),)
> >  	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
> > +endif
> >  
> >  #
> >  # Clean all generated files
> > -- 
> > 1.9.3
> > 
> Looks good.
> 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 1/4 v4] compat: Add infrastructure to support symbol versioning
  2014-09-30 15:18  3% ` [dpdk-dev] [PATCH 1/4 v4] " Neil Horman
@ 2014-10-01 10:15  0%   ` Sergio Gonzalez Monroy
  2014-10-01 10:38  0%     ` Neil Horman
  2014-10-01 11:28  0%   ` Sergio Gonzalez Monroy
  1 sibling, 1 reply; 200+ results
From: Sergio Gonzalez Monroy @ 2014-10-01 10:15 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

On Tue, Sep 30, 2014 at 11:18:00AM -0400, Neil Horman wrote:
> Add initial pass header files to support symbol versioning.
> 
> ---
> Change notes
> v2)
> * Fixed ifdef in rte_compat.h to test for RTE_BUILD_SHARED_LIB instead of the
> non-existant RTE_SYMBOL_VERSIONING
> 
> * Fixed VERSION_SYMBOL macro to add the needed extra @ to make versioning work
> properly
> 
> * Improved/Clarified documentation
> 
> v3)
> * Added missing macros to fully export the symver directive specification
> 
> v4)
> * Added macro definitions for !SHARED_LIB case
> * Improved documentation
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> CC: "Gonzalez Monroy, Sergio" <sergio.gonzalez.monroy@intel.com>
> ---
>  lib/Makefile                   |  1 +
>  lib/librte_compat/Makefile     | 38 +++++++++++++++++
>  lib/librte_compat/rte_compat.h | 96 ++++++++++++++++++++++++++++++++++++++++++
>  mk/rte.lib.mk                  |  6 +++
>  4 files changed, 141 insertions(+)
>  create mode 100644 lib/librte_compat/Makefile
>  create mode 100644 lib/librte_compat/rte_compat.h
> 
> diff --git a/lib/Makefile b/lib/Makefile
> index 10c5bb3..a85b55b 100644
> --- a/lib/Makefile
> +++ b/lib/Makefile
> @@ -32,6 +32,7 @@
>  include $(RTE_SDK)/mk/rte.vars.mk
>  
>  DIRS-$(CONFIG_RTE_LIBC) += libc
> +DIRS-y += librte_compat
>  DIRS-$(CONFIG_RTE_LIBRTE_EAL) += librte_eal
>  DIRS-$(CONFIG_RTE_LIBRTE_MALLOC) += librte_malloc
>  DIRS-$(CONFIG_RTE_LIBRTE_RING) += librte_ring
> diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
> new file mode 100644
> index 0000000..3415c7b
> --- /dev/null
> +++ b/lib/librte_compat/Makefile
> @@ -0,0 +1,38 @@
> +#   BSD LICENSE
> +#
> +#   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>
> +#   All rights reserved.
> +#
> +#   Redistribution and use in source and binary forms, with or without
> +#   modification, are permitted provided that the following conditions
> +#   are met:
> +#
> +#     * Redistributions of source code must retain the above copyright
> +#       notice, this list of conditions and the following disclaimer.
> +#     * Redistributions in binary form must reproduce the above copyright
> +#       notice, this list of conditions and the following disclaimer in
> +#       the documentation and/or other materials provided with the
> +#       distribution.
> +#     * Neither the name of Intel Corporation nor the names of its
> +#       contributors may be used to endorse or promote products derived
> +#       from this software without specific prior written permission.
> +#
> +#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> +#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> +#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
> +#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
> +#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> +#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> +#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> +#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> +#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> +#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> +#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> +
> +include $(RTE_SDK)/mk/rte.vars.mk
> +
> +
> +# install includes
> +SYMLINK-y-include := rte_compat.h
> +
> +include $(RTE_SDK)/mk/rte.lib.mk
> diff --git a/lib/librte_compat/rte_compat.h b/lib/librte_compat/rte_compat.h
> new file mode 100644
> index 0000000..d99e362
> --- /dev/null
> +++ b/lib/librte_compat/rte_compat.h
> @@ -0,0 +1,96 @@
> +/*-
> + *   BSD LICENSE
> + *
> + *   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>.
> + *   All rights reserved.
> + *
> + *   Redistribution and use in source and binary forms, with or without
> + *   modification, are permitted provided that the following conditions
> + *   are met:
> + *
> + *     * Redistributions of source code must retain the above copyright
> + *       notice, this list of conditions and the following disclaimer.
> + *     * Redistributions in binary form must reproduce the above copyright
> + *       notice, this list of conditions and the following disclaimer in
> + *       the documentation and/or other materials provided with the
> + *       distribution.
> + *     * Neither the name of Intel Corporation nor the names of its
> + *       contributors may be used to endorse or promote products derived
> + *       from this software without specific prior written permission.
> + *
> + *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> + *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> + *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
> + *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
> + *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> + *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> + *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> + *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#ifndef _RTE_COMPAT_H_
> +#define _RTE_COMPAT_H_
> +
> +/*
> + * This is just a stringification macro for use below.
> + */
> +#define SA(x) #x
> +
> +#ifdef RTE_BUILD_SHARED_LIB
> +
> +/*
> + * Provides backwards compatibility when updating exported functions.
> + * When a symol is exported from a library to provide an API, it also provides a
> + * calling convention (ABI) that is embodied in its name, return type,
> + * arguments, etc.  On occasion that function may need to change to accomodate
> + * new functionality, behavior, etc.  When that occurs, it is desireable to
> + * allow for backwards compatibility for a time with older binaries that are
> + * dynamically linked to the dpdk.  to support that the __vsym and
> + * VERSION_SYMBOL macros are created.  They, in conjunction with the
> + * <library>_version.map file for a given library allow for multiple versions of
> + * a symbol to exist in a shared library so that older binaries need not be
> + * immediately recompiled. Their use is outlined in the following example:
> + * Assumptions: DPDK 1.(X) contains a function int foo(char *string)
> + *              DPDK 1.(X+1) needs to change foo to be int foo(int index)
> + *
> + * To accomplish this:
> + * 1) Edit lib/<library>/library_version.map to add a DPDK_1.(X+1) node, in which
> + * foo is exported as a global symbol.
> + *
> + * 2) rename the existing function int foo(char *string) to 
> + * 	int __vsym foo_v18(char *string)
> + *
> + * 3) Add this macro immediately below the function
> + * 	VERSION_SYMBOL(foo, _v18, 1.8);
> + *
> + * 4) Implement a new version of foo.
> + * 	char foo(int value, int otherval) { ...}
> + *
> + * 5) Mark the newest version as the default version
> + * 	BIND_DEFAULT_SYMBOL(foo, 1.9);
> + *
> + */
> +#define VERSION_SYMBOL(b, e, v) __asm__(".symver " SA(b) SA(e) ", "SA(b)"@DPDK_"SA(v))
> +#define BASE_SYMBOL(b, n) __asm__(".symver " SA(n) ", "SA(b)"@")

Hi Neil,

I was wondering about the use of BASE_SYMBOL macro (as you left it out of the example/doc).

>From what I understood (according to ld documentation on versioning), that macro would 
bound the symbol to the unspecified base version of the symbol.
You would want that to provide backward compatibility to apps linked against DSOs pre-versioning.
I was under the impression that there would not be support for such apps (therefore no need
for BASE_SYMBOL macro).

Sergio


> +#define BIND_DEFAULT_SYMBOL(b, v) __asm__(".symver " SA(b) ", "SA(b)"@@DPDK_"SA(v))
> +#define __vsym __attribute__((used))
> +
> +#else
> +/*
> + * No symbol versioning in use
> + */
> +#define VERSION_SYMBOL(b, e, v)
> +#define __vsym
> +#define BASE_SYMBOL(b, n)
> +#define BIND_DEFAULT_SYMBOL(b, v)
> +
> +/*
> + * RTE_BUILD_SHARED_LIB
> + */
> +#endif
> +
> +
> +#endif /* _RTE_COMPAT_H_ */
> diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
> index f458258..82ac309 100644
> --- a/mk/rte.lib.mk
> +++ b/mk/rte.lib.mk
> @@ -40,8 +40,12 @@ VPATH += $(SRCDIR)
>  
>  ifeq ($(RTE_BUILD_SHARED_LIB),y)
>  LIB := $(patsubst %.a,%.so,$(LIB))
> +
> +CPU_LDFLAGS += --version-script=$(EXPORT_MAP)
> +
>  endif
>  
> +
>  _BUILD = $(LIB)
>  _INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) $(RTE_OUTPUT)/lib/$(LIB)
>  _CLEAN = doclean
> @@ -160,7 +164,9 @@ endif
>  $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
>  	@echo "  INSTALL-LIB $(LIB)"
>  	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
> +ifneq ($(LIB),)
>  	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
> +endif
>  
>  #
>  # Clean all generated files
> -- 
> 1.9.3
> 
Looks good.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH RFC] mbuf: Adjust TX flags to start at bit 32
  2014-09-30 17:06  3% ` Neil Horman
@ 2014-10-01  8:47  0%   ` Bruce Richardson
  2014-10-01 11:14  0%     ` Neil Horman
  0 siblings, 1 reply; 200+ results
From: Bruce Richardson @ 2014-10-01  8:47 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

On Tue, Sep 30, 2014 at 01:06:32PM -0400, Neil Horman wrote:
> On Tue, Sep 30, 2014 at 04:26:02PM +0100, Bruce Richardson wrote:
> > This patch takes the existing TX flags defined for the mbuf and shifts
> > each uniquely defined one left so that additional RX flags can be
> > defined without having RX and TX flags mixed together.
> > 
> > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> > ---
> >  lib/librte_mbuf/rte_mbuf.h | 26 +++++++++++++-------------
> >  1 file changed, 13 insertions(+), 13 deletions(-)
> > 
> > diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
> > index 1c6e115..c9fc4ec 100644
> > --- a/lib/librte_mbuf/rte_mbuf.h
> > +++ b/lib/librte_mbuf/rte_mbuf.h
> > @@ -86,26 +86,26 @@ extern "C" {
> >  #define PKT_RX_IEEE1588_PTP  0x0200 /**< RX IEEE1588 L2 Ethernet PT Packet. */
> >  #define PKT_RX_IEEE1588_TMST 0x0400 /**< RX IEEE1588 L2/L4 timestamped packet.*/
> >  
> > -#define PKT_TX_VLAN_PKT      0x0800 /**< TX packet is a 802.1q VLAN packet. */
> > -#define PKT_TX_IP_CKSUM      0x1000 /**< IP cksum of TX pkt. computed by NIC. */
> > -#define PKT_TX_IPV4_CSUM     0x1000 /**< Alias of PKT_TX_IP_CKSUM. */
> > -#define PKT_TX_IPV4          PKT_RX_IPV4_HDR /**< IPv4 with no IP checksum offload. */
> > -#define PKT_TX_IPV6          PKT_RX_IPV6_HDR /**< IPv6 packet */
> > +#define PKT_TX_VLAN_PKT  (0x0001 << 32) /**< TX packet is a 802.1q VLAN packet. */
> > +#define PKT_TX_IP_CKSUM  (0x0002 << 32) /**< IP cksum of TX pkt. computed by NIC. */
> > +#define PKT_TX_IPV4_CSUM PKT_TX_IP_CKSUM /**< Alias of PKT_TX_IP_CKSUM. */
> > +#define PKT_TX_IPV4      PKT_RX_IPV4_HDR /**< IPv4 with no IP checksum offload. */
> > +#define PKT_TX_IPV6      PKT_RX_IPV6_HDR /**< IPv6 packet */
> >  
> >  /*
> > - * Bit 14~13 used for L4 packet type with checksum enabled.
> > + * Bit 35~34 used for L4 packet type with checksum enabled.
> >   *     00: Reserved
> >   *     01: TCP checksum
> >   *     10: SCTP checksum
> >   *     11: UDP checksum
> >   */
> > -#define PKT_TX_L4_MASK       0x6000 /**< Mask bits for L4 checksum offload request. */
> > -#define PKT_TX_L4_NO_CKSUM   0x0000 /**< Disable L4 cksum of TX pkt. */
> > -#define PKT_TX_TCP_CKSUM     0x2000 /**< TCP cksum of TX pkt. computed by NIC. */
> > -#define PKT_TX_SCTP_CKSUM    0x4000 /**< SCTP cksum of TX pkt. computed by NIC. */
> > -#define PKT_TX_UDP_CKSUM     0x6000 /**< UDP cksum of TX pkt. computed by NIC. */
> > -/* Bit 15 */
> > -#define PKT_TX_IEEE1588_TMST 0x8000 /**< TX IEEE1588 packet to timestamp. */
> > +#define PKT_TX_L4_NO_CKSUM   (0x0000 << 32) /**< Disable L4 cksum of TX pkt. */
> > +#define PKT_TX_TCP_CKSUM     (0x0004 << 32) /**< TCP cksum of TX pkt. computed by NIC. */
> > +#define PKT_TX_SCTP_CKSUM    (0x0008 << 32) /**< SCTP cksum of TX pkt. computed by NIC. */
> > +#define PKT_TX_UDP_CKSUM     (0x000C << 32) /**< UDP cksum of TX pkt. computed by NIC. */
> > +#define PKT_TX_L4_MASK       (0x000C << 32) /**< Mask for L4 cksum offload request. */
> > +/* Bit 36 */
> > +#define PKT_TX_IEEE1588_TMST (0x0010 << 32) /**< TX IEEE1588 packet to timestamp. */
> >  
> >  /* Use final bit of flags to indicate a control mbuf */
> >  #define CTRL_MBUF_FLAG       (1ULL << 63)
> > -- 
> > 1.9.3
> > 
> > 
> 
> I'm not opposed to the patch at all, but I would like to point out that this is
> the sort of change that breaks ABI very easily (which is fine right now given
> the mbuf changes already staged for the release, but still something to be aware
> of).  As such, are there advantages to this patch (other than the niceness of
> human readability)?
> 
> If we're going to reshuffle these flags now, it might be nice to start tx flags
> at the most significant bit and count back, and start rx flags at the least
> significant bit and count up.  That would ensure that we don't reserve flags for
> a direction without need.
> 
> Best
> Neil
>
Good idea, though currently the most significant bit is being used as a flag 
to indicate a control mbuf. My thinking is that we may potentially need 
other flags that are not just for RX or TX, and to have those at the end.  
However, given that that is likely to be the exception case, perhaps we 
could reserve the last byte for non-RX/TX flags and then implement the 
scheme you suggest. What do you think?

/Bruce 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH RFC] mbuf: Adjust TX flags to start at bit 32
    2014-09-30 15:33  3% ` Bruce Richardson
@ 2014-09-30 17:06  3% ` Neil Horman
  2014-10-01  8:47  0%   ` Bruce Richardson
  1 sibling, 1 reply; 200+ results
From: Neil Horman @ 2014-09-30 17:06 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: dev

On Tue, Sep 30, 2014 at 04:26:02PM +0100, Bruce Richardson wrote:
> This patch takes the existing TX flags defined for the mbuf and shifts
> each uniquely defined one left so that additional RX flags can be
> defined without having RX and TX flags mixed together.
> 
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> ---
>  lib/librte_mbuf/rte_mbuf.h | 26 +++++++++++++-------------
>  1 file changed, 13 insertions(+), 13 deletions(-)
> 
> diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
> index 1c6e115..c9fc4ec 100644
> --- a/lib/librte_mbuf/rte_mbuf.h
> +++ b/lib/librte_mbuf/rte_mbuf.h
> @@ -86,26 +86,26 @@ extern "C" {
>  #define PKT_RX_IEEE1588_PTP  0x0200 /**< RX IEEE1588 L2 Ethernet PT Packet. */
>  #define PKT_RX_IEEE1588_TMST 0x0400 /**< RX IEEE1588 L2/L4 timestamped packet.*/
>  
> -#define PKT_TX_VLAN_PKT      0x0800 /**< TX packet is a 802.1q VLAN packet. */
> -#define PKT_TX_IP_CKSUM      0x1000 /**< IP cksum of TX pkt. computed by NIC. */
> -#define PKT_TX_IPV4_CSUM     0x1000 /**< Alias of PKT_TX_IP_CKSUM. */
> -#define PKT_TX_IPV4          PKT_RX_IPV4_HDR /**< IPv4 with no IP checksum offload. */
> -#define PKT_TX_IPV6          PKT_RX_IPV6_HDR /**< IPv6 packet */
> +#define PKT_TX_VLAN_PKT  (0x0001 << 32) /**< TX packet is a 802.1q VLAN packet. */
> +#define PKT_TX_IP_CKSUM  (0x0002 << 32) /**< IP cksum of TX pkt. computed by NIC. */
> +#define PKT_TX_IPV4_CSUM PKT_TX_IP_CKSUM /**< Alias of PKT_TX_IP_CKSUM. */
> +#define PKT_TX_IPV4      PKT_RX_IPV4_HDR /**< IPv4 with no IP checksum offload. */
> +#define PKT_TX_IPV6      PKT_RX_IPV6_HDR /**< IPv6 packet */
>  
>  /*
> - * Bit 14~13 used for L4 packet type with checksum enabled.
> + * Bit 35~34 used for L4 packet type with checksum enabled.
>   *     00: Reserved
>   *     01: TCP checksum
>   *     10: SCTP checksum
>   *     11: UDP checksum
>   */
> -#define PKT_TX_L4_MASK       0x6000 /**< Mask bits for L4 checksum offload request. */
> -#define PKT_TX_L4_NO_CKSUM   0x0000 /**< Disable L4 cksum of TX pkt. */
> -#define PKT_TX_TCP_CKSUM     0x2000 /**< TCP cksum of TX pkt. computed by NIC. */
> -#define PKT_TX_SCTP_CKSUM    0x4000 /**< SCTP cksum of TX pkt. computed by NIC. */
> -#define PKT_TX_UDP_CKSUM     0x6000 /**< UDP cksum of TX pkt. computed by NIC. */
> -/* Bit 15 */
> -#define PKT_TX_IEEE1588_TMST 0x8000 /**< TX IEEE1588 packet to timestamp. */
> +#define PKT_TX_L4_NO_CKSUM   (0x0000 << 32) /**< Disable L4 cksum of TX pkt. */
> +#define PKT_TX_TCP_CKSUM     (0x0004 << 32) /**< TCP cksum of TX pkt. computed by NIC. */
> +#define PKT_TX_SCTP_CKSUM    (0x0008 << 32) /**< SCTP cksum of TX pkt. computed by NIC. */
> +#define PKT_TX_UDP_CKSUM     (0x000C << 32) /**< UDP cksum of TX pkt. computed by NIC. */
> +#define PKT_TX_L4_MASK       (0x000C << 32) /**< Mask for L4 cksum offload request. */
> +/* Bit 36 */
> +#define PKT_TX_IEEE1588_TMST (0x0010 << 32) /**< TX IEEE1588 packet to timestamp. */
>  
>  /* Use final bit of flags to indicate a control mbuf */
>  #define CTRL_MBUF_FLAG       (1ULL << 63)
> -- 
> 1.9.3
> 
> 

I'm not opposed to the patch at all, but I would like to point out that this is
the sort of change that breaks ABI very easily (which is fine right now given
the mbuf changes already staged for the release, but still something to be aware
of).  As such, are there advantages to this patch (other than the niceness of
human readability)?

If we're going to reshuffle these flags now, it might be nice to start tx flags
at the most significant bit and count back, and start rx flags at the least
significant bit and count up.  That would ensure that we don't reserve flags for
a direction without need.

Best
Neil

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH RFC] mbuf: Adjust TX flags to start at bit 32
  2014-09-30 16:00  0%   ` Wiles, Roger Keith
@ 2014-09-30 16:03  0%     ` Bruce Richardson
  0 siblings, 0 replies; 200+ results
From: Bruce Richardson @ 2014-09-30 16:03 UTC (permalink / raw)
  To: Wiles, Roger Keith; +Cc: dev

On Tue, Sep 30, 2014 at 05:00:04PM +0100, Wiles, Roger Keith wrote:
> Hi Bruce,
> 
> I like the idea of the split, which should make it easier to do the testing of those bits.
> One comment below.
> 
> On Sep 30, 2014, at 10:33 AM, Bruce Richardson <bruce.richardson@intel.com> wrote:
> 
> > On Tue, Sep 30, 2014 at 04:26:02PM +0100, Bruce Richardson wrote:
> >> This patch takes the existing TX flags defined for the mbuf and shifts
> >> each uniquely defined one left so that additional RX flags can be
> >> defined without having RX and TX flags mixed together.
> >>
> >> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> >> ---
> >
> > This is just an RFC patch for now, as I'm looking for input to make sure
> > this is done right. Couple of opens, if people have input:
> > * is a 32/32 split for RX/TX flags appropriate? Are we likely to have about
> >  equal numbers of each?
> > * Doing a grep for the TX flag use, it seems the defines are commonly used,
> >  but if anyone is aware of anywhere where the code depends on the flags
> > having a particular value, please let me know.
> >
> > If I have time, I also hope to look at doing rework on the testpmd flag
> > handling based off Olivier's previous patches, but since that is not
> > affecting the public ABI, I consider it a bit lower priority.
> >
> > Thanks,
> > /Bruce
> >
> >> lib/librte_mbuf/rte_mbuf.h | 26 +++++++++++++-------------
> >> 1 file changed, 13 insertions(+), 13 deletions(-)
> >>
> >> diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
> >> index 1c6e115..c9fc4ec 100644
> >> --- a/lib/librte_mbuf/rte_mbuf.h
> >> +++ b/lib/librte_mbuf/rte_mbuf.h
> >> @@ -86,26 +86,26 @@ extern "C" {
> >> #define PKT_RX_IEEE1588_PTP  0x0200 /**< RX IEEE1588 L2 Ethernet PT Packet. */
> >> #define PKT_RX_IEEE1588_TMST 0x0400 /**< RX IEEE1588 L2/L4 timestamped packet.*/
> >>
> >> -#define PKT_TX_VLAN_PKT      0x0800 /**< TX packet is a 802.1q VLAN packet. */
> >> -#define PKT_TX_IP_CKSUM      0x1000 /**< IP cksum of TX pkt. computed by NIC. */
> >> -#define PKT_TX_IPV4_CSUM     0x1000 /**< Alias of PKT_TX_IP_CKSUM. */
> >> -#define PKT_TX_IPV4          PKT_RX_IPV4_HDR /**< IPv4 with no IP checksum offload. */
> >> -#define PKT_TX_IPV6          PKT_RX_IPV6_HDR /**< IPv6 packet */
> >> +#define PKT_TX_VLAN_PKT  (0x0001 << 32) /**< TX packet is a 802.1q VLAN packet. */
> >> +#define PKT_TX_IP_CKSUM  (0x0002 << 32) /**< IP cksum of TX pkt. computed by NIC. */
> 
> One little nit in the patch is does (0x0001 << 32) need to be (0x0001ULL << 32)? I have not tested it and just a thought.

Yes, indeed it does, good catch!

/Bruce

> 
> Thanks
> ++Keith
> >> +#define PKT_TX_IPV4_CSUM PKT_TX_IP_CKSUM /**< Alias of PKT_TX_IP_CKSUM. */
> >> +#define PKT_TX_IPV4      PKT_RX_IPV4_HDR /**< IPv4 with no IP checksum offload. */
> >> +#define PKT_TX_IPV6      PKT_RX_IPV6_HDR /**< IPv6 packet */
> >>
> >> /*
> >> - * Bit 14~13 used for L4 packet type with checksum enabled.
> >> + * Bit 35~34 used for L4 packet type with checksum enabled.
> >>  *     00: Reserved
> >>  *     01: TCP checksum
> >>  *     10: SCTP checksum
> >>  *     11: UDP checksum
> >>  */
> >> -#define PKT_TX_L4_MASK       0x6000 /**< Mask bits for L4 checksum offload request. */
> >> -#define PKT_TX_L4_NO_CKSUM   0x0000 /**< Disable L4 cksum of TX pkt. */
> >> -#define PKT_TX_TCP_CKSUM     0x2000 /**< TCP cksum of TX pkt. computed by NIC. */
> >> -#define PKT_TX_SCTP_CKSUM    0x4000 /**< SCTP cksum of TX pkt. computed by NIC. */
> >> -#define PKT_TX_UDP_CKSUM     0x6000 /**< UDP cksum of TX pkt. computed by NIC. */
> >> -/* Bit 15 */
> >> -#define PKT_TX_IEEE1588_TMST 0x8000 /**< TX IEEE1588 packet to timestamp. */
> >> +#define PKT_TX_L4_NO_CKSUM   (0x0000 << 32) /**< Disable L4 cksum of TX pkt. */
> >> +#define PKT_TX_TCP_CKSUM     (0x0004 << 32) /**< TCP cksum of TX pkt. computed by NIC. */
> >> +#define PKT_TX_SCTP_CKSUM    (0x0008 << 32) /**< SCTP cksum of TX pkt. computed by NIC. */
> >> +#define PKT_TX_UDP_CKSUM     (0x000C << 32) /**< UDP cksum of TX pkt. computed by NIC. */
> >> +#define PKT_TX_L4_MASK       (0x000C << 32) /**< Mask for L4 cksum offload request. */
> >> +/* Bit 36 */
> >> +#define PKT_TX_IEEE1588_TMST (0x0010 << 32) /**< TX IEEE1588 packet to timestamp. */
> >>
> >> /* Use final bit of flags to indicate a control mbuf */
> >> #define CTRL_MBUF_FLAG       (1ULL << 63)
> >> --
> >> 1.9.3
> >>
> 
> Keith Wiles, Principal Technologist with CTO office, Wind River mobile 972-213-5533
> 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH RFC] mbuf: Adjust TX flags to start at bit 32
  2014-09-30 15:33  3% ` Bruce Richardson
@ 2014-09-30 16:00  0%   ` Wiles, Roger Keith
  2014-09-30 16:03  0%     ` Bruce Richardson
  0 siblings, 1 reply; 200+ results
From: Wiles, Roger Keith @ 2014-09-30 16:00 UTC (permalink / raw)
  To: RICHARDSON, BRUCE; +Cc: dev

Hi Bruce,

I like the idea of the split, which should make it easier to do the testing of those bits.
One comment below.

On Sep 30, 2014, at 10:33 AM, Bruce Richardson <bruce.richardson@intel.com> wrote:

> On Tue, Sep 30, 2014 at 04:26:02PM +0100, Bruce Richardson wrote:
>> This patch takes the existing TX flags defined for the mbuf and shifts
>> each uniquely defined one left so that additional RX flags can be
>> defined without having RX and TX flags mixed together.
>> 
>> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
>> ---
> 
> This is just an RFC patch for now, as I'm looking for input to make sure 
> this is done right. Couple of opens, if people have input:
> * is a 32/32 split for RX/TX flags appropriate? Are we likely to have about 
>  equal numbers of each?
> * Doing a grep for the TX flag use, it seems the defines are commonly used, 
>  but if anyone is aware of anywhere where the code depends on the flags  
> having a particular value, please let me know.
> 
> If I have time, I also hope to look at doing rework on the testpmd flag 
> handling based off Olivier's previous patches, but since that is not 
> affecting the public ABI, I consider it a bit lower priority.
> 
> Thanks,
> /Bruce
> 
>> lib/librte_mbuf/rte_mbuf.h | 26 +++++++++++++-------------
>> 1 file changed, 13 insertions(+), 13 deletions(-)
>> 
>> diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
>> index 1c6e115..c9fc4ec 100644
>> --- a/lib/librte_mbuf/rte_mbuf.h
>> +++ b/lib/librte_mbuf/rte_mbuf.h
>> @@ -86,26 +86,26 @@ extern "C" {
>> #define PKT_RX_IEEE1588_PTP  0x0200 /**< RX IEEE1588 L2 Ethernet PT Packet. */
>> #define PKT_RX_IEEE1588_TMST 0x0400 /**< RX IEEE1588 L2/L4 timestamped packet.*/
>> 
>> -#define PKT_TX_VLAN_PKT      0x0800 /**< TX packet is a 802.1q VLAN packet. */
>> -#define PKT_TX_IP_CKSUM      0x1000 /**< IP cksum of TX pkt. computed by NIC. */
>> -#define PKT_TX_IPV4_CSUM     0x1000 /**< Alias of PKT_TX_IP_CKSUM. */
>> -#define PKT_TX_IPV4          PKT_RX_IPV4_HDR /**< IPv4 with no IP checksum offload. */
>> -#define PKT_TX_IPV6          PKT_RX_IPV6_HDR /**< IPv6 packet */
>> +#define PKT_TX_VLAN_PKT  (0x0001 << 32) /**< TX packet is a 802.1q VLAN packet. */
>> +#define PKT_TX_IP_CKSUM  (0x0002 << 32) /**< IP cksum of TX pkt. computed by NIC. */

One little nit in the patch is does (0x0001 << 32) need to be (0x0001ULL << 32)? I have not tested it and just a thought.

Thanks
++Keith
>> +#define PKT_TX_IPV4_CSUM PKT_TX_IP_CKSUM /**< Alias of PKT_TX_IP_CKSUM. */
>> +#define PKT_TX_IPV4      PKT_RX_IPV4_HDR /**< IPv4 with no IP checksum offload. */
>> +#define PKT_TX_IPV6      PKT_RX_IPV6_HDR /**< IPv6 packet */
>> 
>> /*
>> - * Bit 14~13 used for L4 packet type with checksum enabled.
>> + * Bit 35~34 used for L4 packet type with checksum enabled.
>>  *     00: Reserved
>>  *     01: TCP checksum
>>  *     10: SCTP checksum
>>  *     11: UDP checksum
>>  */
>> -#define PKT_TX_L4_MASK       0x6000 /**< Mask bits for L4 checksum offload request. */
>> -#define PKT_TX_L4_NO_CKSUM   0x0000 /**< Disable L4 cksum of TX pkt. */
>> -#define PKT_TX_TCP_CKSUM     0x2000 /**< TCP cksum of TX pkt. computed by NIC. */
>> -#define PKT_TX_SCTP_CKSUM    0x4000 /**< SCTP cksum of TX pkt. computed by NIC. */
>> -#define PKT_TX_UDP_CKSUM     0x6000 /**< UDP cksum of TX pkt. computed by NIC. */
>> -/* Bit 15 */
>> -#define PKT_TX_IEEE1588_TMST 0x8000 /**< TX IEEE1588 packet to timestamp. */
>> +#define PKT_TX_L4_NO_CKSUM   (0x0000 << 32) /**< Disable L4 cksum of TX pkt. */
>> +#define PKT_TX_TCP_CKSUM     (0x0004 << 32) /**< TCP cksum of TX pkt. computed by NIC. */
>> +#define PKT_TX_SCTP_CKSUM    (0x0008 << 32) /**< SCTP cksum of TX pkt. computed by NIC. */
>> +#define PKT_TX_UDP_CKSUM     (0x000C << 32) /**< UDP cksum of TX pkt. computed by NIC. */
>> +#define PKT_TX_L4_MASK       (0x000C << 32) /**< Mask for L4 cksum offload request. */
>> +/* Bit 36 */
>> +#define PKT_TX_IEEE1588_TMST (0x0010 << 32) /**< TX IEEE1588 packet to timestamp. */
>> 
>> /* Use final bit of flags to indicate a control mbuf */
>> #define CTRL_MBUF_FLAG       (1ULL << 63)
>> -- 
>> 1.9.3
>> 

Keith Wiles, Principal Technologist with CTO office, Wind River mobile 972-213-5533

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH RFC] mbuf: Adjust TX flags to start at bit 32
  @ 2014-09-30 15:33  3% ` Bruce Richardson
  2014-09-30 16:00  0%   ` Wiles, Roger Keith
  2014-09-30 17:06  3% ` Neil Horman
  1 sibling, 1 reply; 200+ results
From: Bruce Richardson @ 2014-09-30 15:33 UTC (permalink / raw)
  To: dev

On Tue, Sep 30, 2014 at 04:26:02PM +0100, Bruce Richardson wrote:
> This patch takes the existing TX flags defined for the mbuf and shifts
> each uniquely defined one left so that additional RX flags can be
> defined without having RX and TX flags mixed together.
> 
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> ---

This is just an RFC patch for now, as I'm looking for input to make sure 
this is done right. Couple of opens, if people have input:
* is a 32/32 split for RX/TX flags appropriate? Are we likely to have about 
  equal numbers of each?
* Doing a grep for the TX flag use, it seems the defines are commonly used, 
  but if anyone is aware of anywhere where the code depends on the flags  
having a particular value, please let me know.

If I have time, I also hope to look at doing rework on the testpmd flag 
handling based off Olivier's previous patches, but since that is not 
affecting the public ABI, I consider it a bit lower priority.

Thanks,
/Bruce

>  lib/librte_mbuf/rte_mbuf.h | 26 +++++++++++++-------------
>  1 file changed, 13 insertions(+), 13 deletions(-)
> 
> diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
> index 1c6e115..c9fc4ec 100644
> --- a/lib/librte_mbuf/rte_mbuf.h
> +++ b/lib/librte_mbuf/rte_mbuf.h
> @@ -86,26 +86,26 @@ extern "C" {
>  #define PKT_RX_IEEE1588_PTP  0x0200 /**< RX IEEE1588 L2 Ethernet PT Packet. */
>  #define PKT_RX_IEEE1588_TMST 0x0400 /**< RX IEEE1588 L2/L4 timestamped packet.*/
>  
> -#define PKT_TX_VLAN_PKT      0x0800 /**< TX packet is a 802.1q VLAN packet. */
> -#define PKT_TX_IP_CKSUM      0x1000 /**< IP cksum of TX pkt. computed by NIC. */
> -#define PKT_TX_IPV4_CSUM     0x1000 /**< Alias of PKT_TX_IP_CKSUM. */
> -#define PKT_TX_IPV4          PKT_RX_IPV4_HDR /**< IPv4 with no IP checksum offload. */
> -#define PKT_TX_IPV6          PKT_RX_IPV6_HDR /**< IPv6 packet */
> +#define PKT_TX_VLAN_PKT  (0x0001 << 32) /**< TX packet is a 802.1q VLAN packet. */
> +#define PKT_TX_IP_CKSUM  (0x0002 << 32) /**< IP cksum of TX pkt. computed by NIC. */
> +#define PKT_TX_IPV4_CSUM PKT_TX_IP_CKSUM /**< Alias of PKT_TX_IP_CKSUM. */
> +#define PKT_TX_IPV4      PKT_RX_IPV4_HDR /**< IPv4 with no IP checksum offload. */
> +#define PKT_TX_IPV6      PKT_RX_IPV6_HDR /**< IPv6 packet */
>  
>  /*
> - * Bit 14~13 used for L4 packet type with checksum enabled.
> + * Bit 35~34 used for L4 packet type with checksum enabled.
>   *     00: Reserved
>   *     01: TCP checksum
>   *     10: SCTP checksum
>   *     11: UDP checksum
>   */
> -#define PKT_TX_L4_MASK       0x6000 /**< Mask bits for L4 checksum offload request. */
> -#define PKT_TX_L4_NO_CKSUM   0x0000 /**< Disable L4 cksum of TX pkt. */
> -#define PKT_TX_TCP_CKSUM     0x2000 /**< TCP cksum of TX pkt. computed by NIC. */
> -#define PKT_TX_SCTP_CKSUM    0x4000 /**< SCTP cksum of TX pkt. computed by NIC. */
> -#define PKT_TX_UDP_CKSUM     0x6000 /**< UDP cksum of TX pkt. computed by NIC. */
> -/* Bit 15 */
> -#define PKT_TX_IEEE1588_TMST 0x8000 /**< TX IEEE1588 packet to timestamp. */
> +#define PKT_TX_L4_NO_CKSUM   (0x0000 << 32) /**< Disable L4 cksum of TX pkt. */
> +#define PKT_TX_TCP_CKSUM     (0x0004 << 32) /**< TCP cksum of TX pkt. computed by NIC. */
> +#define PKT_TX_SCTP_CKSUM    (0x0008 << 32) /**< SCTP cksum of TX pkt. computed by NIC. */
> +#define PKT_TX_UDP_CKSUM     (0x000C << 32) /**< UDP cksum of TX pkt. computed by NIC. */
> +#define PKT_TX_L4_MASK       (0x000C << 32) /**< Mask for L4 cksum offload request. */
> +/* Bit 36 */
> +#define PKT_TX_IEEE1588_TMST (0x0010 << 32) /**< TX IEEE1588 packet to timestamp. */
>  
>  /* Use final bit of flags to indicate a control mbuf */
>  #define CTRL_MBUF_FLAG       (1ULL << 63)
> -- 
> 1.9.3
> 

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH 1/4 v4] compat: Add infrastructure to support symbol versioning
    2014-09-29 15:44  4% ` [dpdk-dev] [PATCH 1/4 v3] " Neil Horman
@ 2014-09-30 15:18  3% ` Neil Horman
  2014-10-01 10:15  0%   ` Sergio Gonzalez Monroy
  2014-10-01 11:28  0%   ` Sergio Gonzalez Monroy
  1 sibling, 2 replies; 200+ results
From: Neil Horman @ 2014-09-30 15:18 UTC (permalink / raw)
  To: dev

Add initial pass header files to support symbol versioning.

---
Change notes
v2)
* Fixed ifdef in rte_compat.h to test for RTE_BUILD_SHARED_LIB instead of the
non-existant RTE_SYMBOL_VERSIONING

* Fixed VERSION_SYMBOL macro to add the needed extra @ to make versioning work
properly

* Improved/Clarified documentation

v3)
* Added missing macros to fully export the symver directive specification

v4)
* Added macro definitions for !SHARED_LIB case
* Improved documentation

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
CC: "Gonzalez Monroy, Sergio" <sergio.gonzalez.monroy@intel.com>
---
 lib/Makefile                   |  1 +
 lib/librte_compat/Makefile     | 38 +++++++++++++++++
 lib/librte_compat/rte_compat.h | 96 ++++++++++++++++++++++++++++++++++++++++++
 mk/rte.lib.mk                  |  6 +++
 4 files changed, 141 insertions(+)
 create mode 100644 lib/librte_compat/Makefile
 create mode 100644 lib/librte_compat/rte_compat.h

diff --git a/lib/Makefile b/lib/Makefile
index 10c5bb3..a85b55b 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -32,6 +32,7 @@
 include $(RTE_SDK)/mk/rte.vars.mk
 
 DIRS-$(CONFIG_RTE_LIBC) += libc
+DIRS-y += librte_compat
 DIRS-$(CONFIG_RTE_LIBRTE_EAL) += librte_eal
 DIRS-$(CONFIG_RTE_LIBRTE_MALLOC) += librte_malloc
 DIRS-$(CONFIG_RTE_LIBRTE_RING) += librte_ring
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
new file mode 100644
index 0000000..3415c7b
--- /dev/null
+++ b/lib/librte_compat/Makefile
@@ -0,0 +1,38 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+
+# install includes
+SYMLINK-y-include := rte_compat.h
+
+include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/lib/librte_compat/rte_compat.h b/lib/librte_compat/rte_compat.h
new file mode 100644
index 0000000..d99e362
--- /dev/null
+++ b/lib/librte_compat/rte_compat.h
@@ -0,0 +1,96 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _RTE_COMPAT_H_
+#define _RTE_COMPAT_H_
+
+/*
+ * This is just a stringification macro for use below.
+ */
+#define SA(x) #x
+
+#ifdef RTE_BUILD_SHARED_LIB
+
+/*
+ * Provides backwards compatibility when updating exported functions.
+ * When a symol is exported from a library to provide an API, it also provides a
+ * calling convention (ABI) that is embodied in its name, return type,
+ * arguments, etc.  On occasion that function may need to change to accomodate
+ * new functionality, behavior, etc.  When that occurs, it is desireable to
+ * allow for backwards compatibility for a time with older binaries that are
+ * dynamically linked to the dpdk.  to support that the __vsym and
+ * VERSION_SYMBOL macros are created.  They, in conjunction with the
+ * <library>_version.map file for a given library allow for multiple versions of
+ * a symbol to exist in a shared library so that older binaries need not be
+ * immediately recompiled. Their use is outlined in the following example:
+ * Assumptions: DPDK 1.(X) contains a function int foo(char *string)
+ *              DPDK 1.(X+1) needs to change foo to be int foo(int index)
+ *
+ * To accomplish this:
+ * 1) Edit lib/<library>/library_version.map to add a DPDK_1.(X+1) node, in which
+ * foo is exported as a global symbol.
+ *
+ * 2) rename the existing function int foo(char *string) to 
+ * 	int __vsym foo_v18(char *string)
+ *
+ * 3) Add this macro immediately below the function
+ * 	VERSION_SYMBOL(foo, _v18, 1.8);
+ *
+ * 4) Implement a new version of foo.
+ * 	char foo(int value, int otherval) { ...}
+ *
+ * 5) Mark the newest version as the default version
+ * 	BIND_DEFAULT_SYMBOL(foo, 1.9);
+ *
+ */
+#define VERSION_SYMBOL(b, e, v) __asm__(".symver " SA(b) SA(e) ", "SA(b)"@DPDK_"SA(v))
+#define BASE_SYMBOL(b, n) __asm__(".symver " SA(n) ", "SA(b)"@")
+#define BIND_DEFAULT_SYMBOL(b, v) __asm__(".symver " SA(b) ", "SA(b)"@@DPDK_"SA(v))
+#define __vsym __attribute__((used))
+
+#else
+/*
+ * No symbol versioning in use
+ */
+#define VERSION_SYMBOL(b, e, v)
+#define __vsym
+#define BASE_SYMBOL(b, n)
+#define BIND_DEFAULT_SYMBOL(b, v)
+
+/*
+ * RTE_BUILD_SHARED_LIB
+ */
+#endif
+
+
+#endif /* _RTE_COMPAT_H_ */
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index f458258..82ac309 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -40,8 +40,12 @@ VPATH += $(SRCDIR)
 
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 LIB := $(patsubst %.a,%.so,$(LIB))
+
+CPU_LDFLAGS += --version-script=$(EXPORT_MAP)
+
 endif
 
+
 _BUILD = $(LIB)
 _INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) $(RTE_OUTPUT)/lib/$(LIB)
 _CLEAN = doclean
@@ -160,7 +164,9 @@ endif
 $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
 	@echo "  INSTALL-LIB $(LIB)"
 	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
+ifneq ($(LIB),)
 	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
+endif
 
 #
 # Clean all generated files
-- 
1.9.3

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH 1/4 v3] compat: Add infrastructure to support symbol versioning
  2014-09-29 15:44  4% ` [dpdk-dev] [PATCH 1/4 v3] " Neil Horman
@ 2014-09-30  8:13  0%   ` Sergio Gonzalez Monroy
  0 siblings, 0 replies; 200+ results
From: Sergio Gonzalez Monroy @ 2014-09-30  8:13 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

On Mon, Sep 29, 2014 at 11:44:03AM -0400, Neil Horman wrote:
> Add initial pass header files to support symbol versioning.
> 
> ---
> Change notes
> v2)
> * Fixed ifdef in rte_compat.h to test for RTE_BUILD_SHARED_LIB instead of the
> non-existant RTE_SYMBOL_VERSIONING
> 
> * Fixed VERSION_SYMBOL macro to add the needed extra @ to make versioning work
> properly
> 
> * Improved/Clarified documentation
> 
> v3)
> * Added missing macros to fully export the symver directive specification
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
> CC: Thomas Monjalon <thomas.monjalon@6wind.com>
> CC: "Richardson, Bruce" <bruce.richardson@intel.com>
> CC: "Gonzalez Monroy, Sergio" <sergio.gonzalez.monroy@intel.com>
> ---
>  lib/Makefile                   |  1 +
>  lib/librte_compat/Makefile     | 38 ++++++++++++++++++
>  lib/librte_compat/rte_compat.h | 90 ++++++++++++++++++++++++++++++++++++++++++
>  mk/rte.lib.mk                  |  6 +++
>  4 files changed, 135 insertions(+)
>  create mode 100644 lib/librte_compat/Makefile
>  create mode 100644 lib/librte_compat/rte_compat.h
> 
> diff --git a/lib/Makefile b/lib/Makefile
> index 10c5bb3..a85b55b 100644
> --- a/lib/Makefile
> +++ b/lib/Makefile
> @@ -32,6 +32,7 @@
>  include $(RTE_SDK)/mk/rte.vars.mk
>  
>  DIRS-$(CONFIG_RTE_LIBC) += libc
> +DIRS-y += librte_compat
>  DIRS-$(CONFIG_RTE_LIBRTE_EAL) += librte_eal
>  DIRS-$(CONFIG_RTE_LIBRTE_MALLOC) += librte_malloc
>  DIRS-$(CONFIG_RTE_LIBRTE_RING) += librte_ring
> diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
> new file mode 100644
> index 0000000..3415c7b
> --- /dev/null
> +++ b/lib/librte_compat/Makefile
> @@ -0,0 +1,38 @@
> +#   BSD LICENSE
> +#
> +#   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>
> +#   All rights reserved.
> +#
> +#   Redistribution and use in source and binary forms, with or without
> +#   modification, are permitted provided that the following conditions
> +#   are met:
> +#
> +#     * Redistributions of source code must retain the above copyright
> +#       notice, this list of conditions and the following disclaimer.
> +#     * Redistributions in binary form must reproduce the above copyright
> +#       notice, this list of conditions and the following disclaimer in
> +#       the documentation and/or other materials provided with the
> +#       distribution.
> +#     * Neither the name of Intel Corporation nor the names of its
> +#       contributors may be used to endorse or promote products derived
> +#       from this software without specific prior written permission.
> +#
> +#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> +#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> +#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
> +#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
> +#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> +#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> +#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> +#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> +#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> +#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> +#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> +
> +include $(RTE_SDK)/mk/rte.vars.mk
> +
> +
> +# install includes
> +SYMLINK-y-include := rte_compat.h
> +
> +include $(RTE_SDK)/mk/rte.lib.mk
> diff --git a/lib/librte_compat/rte_compat.h b/lib/librte_compat/rte_compat.h
> new file mode 100644
> index 0000000..0b76771
> --- /dev/null
> +++ b/lib/librte_compat/rte_compat.h
> @@ -0,0 +1,90 @@
> +/*-
> + *   BSD LICENSE
> + *
> + *   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>.
> + *   All rights reserved.
> + *
> + *   Redistribution and use in source and binary forms, with or without
> + *   modification, are permitted provided that the following conditions
> + *   are met:
> + *
> + *     * Redistributions of source code must retain the above copyright
> + *       notice, this list of conditions and the following disclaimer.
> + *     * Redistributions in binary form must reproduce the above copyright
> + *       notice, this list of conditions and the following disclaimer in
> + *       the documentation and/or other materials provided with the
> + *       distribution.
> + *     * Neither the name of Intel Corporation nor the names of its
> + *       contributors may be used to endorse or promote products derived
> + *       from this software without specific prior written permission.
> + *
> + *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> + *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> + *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
> + *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
> + *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> + *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> + *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> + *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#ifndef _RTE_COMPAT_H_
> +#define _RTE_COMPAT_H_
> +
> +/*
> + * This is just a stringification macro for use below.
> + */
> +#define SA(x) #x
> +
> +#ifdef RTE_BUILD_SHARED_LIB
> +
> +/*
> + * Provides backwards compatibility when updating exported functions.
> + * When a symol is exported from a library to provide an API, it also provides a
> + * calling convention (ABI) that is embodied in its name, return type,
> + * arguments, etc.  On occasion that function may need to change to accomodate
> + * new functionality, behavior, etc.  When that occurs, it is desireable to
> + * allow for backwards compatibility for a time with older binaries that are
> + * dynamically linked to the dpdk.  to support that the __vsym and
> + * VERSION_SYMBOL macros are created.  They, in conjunction with the
> + * <library>_version.map file for a given library allow for multiple versions of
> + * a symbol to exist in a shared library so that older binaries need not be
> + * immediately recompiled. Their use is outlined in the following example:
> + * Assumptions: DPDK 1.(X) contains a function int foo(char *string)
> + *              DPDK 1.(X+1) needs to change foo to be int foo(int index)
> + *
> + * To accomplish this:
> + * 1) Edit lib/<library>/library_version.map to add a DPDK_1.(X+1) node, in which
> + * foo is exported as a global symbol.
> + *
> + * 2) rename the existing function int foo(char *string) to 
> + * 	int __vsym foo_v18(char *string)
> + *
> + * 3) Add this macro immediately below the function
> + * 	VERSION_SYMBOL(foo, _v18, 1.8);
> + *
> + * 4) Implement a new version of foo.
> + *
> + */
> +#define VERSION_SYMBOL(b, e, v) __asm__(".symver " SA(b) SA(e) ", "SA(b)"@DPDK_"SA(v))
> +#define BASE_SYMBOL(b, n) __asm__(".symver " SA(n) ", "SA(b)"@")
> +#define BIND_DEFAULT_SYMBOL(b, v) __asm__(".symver " SA(b) ", "SA(b)"@@DPDK_"SA(v))
> +#define __vsym __attribute__((used))

I think it would be useful to provide an example for the new macros.

> +
> +#else
> +/*
> + * No symbol versioning in use
> + */
> +#define VERSION_SYMBOL(b, e, v)
> +#define __vsym

Both new macros missing for non shared lib build.

Sergio

> +
> +/*
> + * RTE_BUILD_SHARED_LIB
> + */
> +#endif
> +
> +
> +#endif /* _RTE_COMPAT_H_ */
> diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
> index f458258..82ac309 100644
> --- a/mk/rte.lib.mk
> +++ b/mk/rte.lib.mk
> @@ -40,8 +40,12 @@ VPATH += $(SRCDIR)
>  
>  ifeq ($(RTE_BUILD_SHARED_LIB),y)
>  LIB := $(patsubst %.a,%.so,$(LIB))
> +
> +CPU_LDFLAGS += --version-script=$(EXPORT_MAP)
> +
>  endif
>  
> +
>  _BUILD = $(LIB)
>  _INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) $(RTE_OUTPUT)/lib/$(LIB)
>  _CLEAN = doclean
> @@ -160,7 +164,9 @@ endif
>  $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
>  	@echo "  INSTALL-LIB $(LIB)"
>  	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
> +ifneq ($(LIB),)
>  	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
> +endif
>  
>  #
>  # Clean all generated files
> -- 
> 1.9.3
> 

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH 1/4 v3] compat: Add infrastructure to support symbol versioning
  @ 2014-09-29 15:44  4% ` Neil Horman
  2014-09-30  8:13  0%   ` Sergio Gonzalez Monroy
  2014-09-30 15:18  3% ` [dpdk-dev] [PATCH 1/4 v4] " Neil Horman
  1 sibling, 1 reply; 200+ results
From: Neil Horman @ 2014-09-29 15:44 UTC (permalink / raw)
  To: dev

Add initial pass header files to support symbol versioning.

---
Change notes
v2)
* Fixed ifdef in rte_compat.h to test for RTE_BUILD_SHARED_LIB instead of the
non-existant RTE_SYMBOL_VERSIONING

* Fixed VERSION_SYMBOL macro to add the needed extra @ to make versioning work
properly

* Improved/Clarified documentation

v3)
* Added missing macros to fully export the symver directive specification

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
CC: Thomas Monjalon <thomas.monjalon@6wind.com>
CC: "Richardson, Bruce" <bruce.richardson@intel.com>
CC: "Gonzalez Monroy, Sergio" <sergio.gonzalez.monroy@intel.com>
---
 lib/Makefile                   |  1 +
 lib/librte_compat/Makefile     | 38 ++++++++++++++++++
 lib/librte_compat/rte_compat.h | 90 ++++++++++++++++++++++++++++++++++++++++++
 mk/rte.lib.mk                  |  6 +++
 4 files changed, 135 insertions(+)
 create mode 100644 lib/librte_compat/Makefile
 create mode 100644 lib/librte_compat/rte_compat.h

diff --git a/lib/Makefile b/lib/Makefile
index 10c5bb3..a85b55b 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -32,6 +32,7 @@
 include $(RTE_SDK)/mk/rte.vars.mk
 
 DIRS-$(CONFIG_RTE_LIBC) += libc
+DIRS-y += librte_compat
 DIRS-$(CONFIG_RTE_LIBRTE_EAL) += librte_eal
 DIRS-$(CONFIG_RTE_LIBRTE_MALLOC) += librte_malloc
 DIRS-$(CONFIG_RTE_LIBRTE_RING) += librte_ring
diff --git a/lib/librte_compat/Makefile b/lib/librte_compat/Makefile
new file mode 100644
index 0000000..3415c7b
--- /dev/null
+++ b/lib/librte_compat/Makefile
@@ -0,0 +1,38 @@
+#   BSD LICENSE
+#
+#   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>
+#   All rights reserved.
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
+#   are met:
+#
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
+#       distribution.
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+include $(RTE_SDK)/mk/rte.vars.mk
+
+
+# install includes
+SYMLINK-y-include := rte_compat.h
+
+include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/lib/librte_compat/rte_compat.h b/lib/librte_compat/rte_compat.h
new file mode 100644
index 0000000..0b76771
--- /dev/null
+++ b/lib/librte_compat/rte_compat.h
@@ -0,0 +1,90 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright(c) 2010-2014 Neil Horman <nhorman@tuxdriver.com>.
+ *   All rights reserved.
+ *
+ *   Redistribution and use in source and binary forms, with or without
+ *   modification, are permitted provided that the following conditions
+ *   are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided with the
+ *       distribution.
+ *     * Neither the name of Intel Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _RTE_COMPAT_H_
+#define _RTE_COMPAT_H_
+
+/*
+ * This is just a stringification macro for use below.
+ */
+#define SA(x) #x
+
+#ifdef RTE_BUILD_SHARED_LIB
+
+/*
+ * Provides backwards compatibility when updating exported functions.
+ * When a symol is exported from a library to provide an API, it also provides a
+ * calling convention (ABI) that is embodied in its name, return type,
+ * arguments, etc.  On occasion that function may need to change to accomodate
+ * new functionality, behavior, etc.  When that occurs, it is desireable to
+ * allow for backwards compatibility for a time with older binaries that are
+ * dynamically linked to the dpdk.  to support that the __vsym and
+ * VERSION_SYMBOL macros are created.  They, in conjunction with the
+ * <library>_version.map file for a given library allow for multiple versions of
+ * a symbol to exist in a shared library so that older binaries need not be
+ * immediately recompiled. Their use is outlined in the following example:
+ * Assumptions: DPDK 1.(X) contains a function int foo(char *string)
+ *              DPDK 1.(X+1) needs to change foo to be int foo(int index)
+ *
+ * To accomplish this:
+ * 1) Edit lib/<library>/library_version.map to add a DPDK_1.(X+1) node, in which
+ * foo is exported as a global symbol.
+ *
+ * 2) rename the existing function int foo(char *string) to 
+ * 	int __vsym foo_v18(char *string)
+ *
+ * 3) Add this macro immediately below the function
+ * 	VERSION_SYMBOL(foo, _v18, 1.8);
+ *
+ * 4) Implement a new version of foo.
+ *
+ */
+#define VERSION_SYMBOL(b, e, v) __asm__(".symver " SA(b) SA(e) ", "SA(b)"@DPDK_"SA(v))
+#define BASE_SYMBOL(b, n) __asm__(".symver " SA(n) ", "SA(b)"@")
+#define BIND_DEFAULT_SYMBOL(b, v) __asm__(".symver " SA(b) ", "SA(b)"@@DPDK_"SA(v))
+#define __vsym __attribute__((used))
+
+#else
+/*
+ * No symbol versioning in use
+ */
+#define VERSION_SYMBOL(b, e, v)
+#define __vsym
+
+/*
+ * RTE_BUILD_SHARED_LIB
+ */
+#endif
+
+
+#endif /* _RTE_COMPAT_H_ */
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index f458258..82ac309 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -40,8 +40,12 @@ VPATH += $(SRCDIR)
 
 ifeq ($(RTE_BUILD_SHARED_LIB),y)
 LIB := $(patsubst %.a,%.so,$(LIB))
+
+CPU_LDFLAGS += --version-script=$(EXPORT_MAP)
+
 endif
 
+
 _BUILD = $(LIB)
 _INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) $(RTE_OUTPUT)/lib/$(LIB)
 _CLEAN = doclean
@@ -160,7 +164,9 @@ endif
 $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
 	@echo "  INSTALL-LIB $(LIB)"
 	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
+ifneq ($(LIB),)
 	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
+endif
 
 #
 # Clean all generated files
-- 
1.9.3

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] Bulk dequeue of packets and the returned values, question
  2014-09-29 12:30  0%       ` Ananyev, Konstantin
@ 2014-09-29 14:57  0%         ` Wiles, Roger Keith
  0 siblings, 0 replies; 200+ results
From: Wiles, Roger Keith @ 2014-09-29 14:57 UTC (permalink / raw)
  To: ANANYEV, KONSTANTIN; +Cc: dev


On Sep 29, 2014, at 7:30 AM, Ananyev, Konstantin <konstantin.ananyev@intel.com> wrote:

> 
> 
>> -----Original Message-----
>> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Bruce Richardson
>> Sent: Monday, September 29, 2014 1:10 PM
>> To: Wiles, Roger Keith (Wind River)
>> Cc: dev@dpdk.org
>> Subject: Re: [dpdk-dev] Bulk dequeue of packets and the returned values, question
>> 
>> On Sun, Sep 28, 2014 at 11:06:17PM +0000, Wiles, Roger Keith wrote:
>>> Thanks Venky,
>>> On Sep 28, 2014, at 5:23 PM, Venkatesan, Venky <venky.venkatesan@intel.com> wrote:
>>> 
>>>> Keith,
>>>> 
>>>> On 9/28/2014 11:04 AM, Wiles, Roger Keith wrote:
>>>>> I am also looking at the bulk dequeue routines, which the ring can be fixed or variable. On fixed  < 0 on error is returned and 0 if
>> successful. On a variable ring < 0 on error or n on success, but I think n can be zero in the variable case, correct?
>>>>> 
>>>>> If these are true then why not have the routines return  < 0 on error and >= 0 on success. Which means a dequeue from a fixed
>> ring would return only ’requested size n’ or < 0 if you error off the 0 case. The 0 case could be OK, if you allow zero to be return on a
>> empty ring for the fixed ring case.
>>>>> 
>>>>> Does this make sense to anyone?
>>>> It won't make sense unless you're aware of the history behind these functions. The original functions that were implemented for
>> the ring were only the bulk functions (i.e. FIXED). They would return exactly the number of items requested for dequeue (0 if success,
>> negative if error), and not return any if the required number were not available.
>>>> 
>>>> The burst (i.e. VARIABLE) functions came in much later (think it was r1.3 where we introduced them), and by that time, there were
>> already quite a number of deployments of DPDK in the field using the legacy ring functions. Therefore we made the decision to keep
>> the legacy behavior intact & not impacting deployed code - and merging the burst functions into the code. Given that there was no
>> "versioning" of the API/ABI in those releases :).
>>> 
>>> I see why the code is this way. If the developers used ‘if ( ret == 0 ) { /* do something */ }’ then it would break if it returned a
>> positive value on success. I would expect the normal behavior to be ‘if ( ret < 0 ) { /* error case */ }’ and fall thru for the success case. I
>> would love to change the code to just return <0 on error or >= 0 on success. I wonder how many customers code would break
>> changing the code to do just just the two steps. I think it will remove some code in a couple places that were testing for FIXED or
>> VARIABLE?
>>>> 
>>>> Hope that helps.
>>>> -Venky
>>>> 
>>>>> 
>>>>> Thanks
>>>>> ++Keith
>>>>> 
>>>>> Keith Wiles, Principal Technologist with CTO office, Wind River mobile 972-213-5533
>>> 
>>> Keith Wiles, Principal Technologist with CTO office, Wind River mobile 972-213-5533
>>> 
>> 
>> Since we are looking at making considerable ABI changes in this release and
>> (hopefully) also looking to version our ABI going forward, I would be in
>> favour of making any changes to these APIs in this current release if
>> possible. While the current behaviour makes sense for historical reason, I
>> think an overall change to the behaviour as Keith describes would be more
>> sensible long-term.
> 
> It is doable, I suppose, but might become quite messy:
> Don't know how many people are using  rte_ring_dequeue_bulk() all over the place.
> I suspect quite a lot.
> From other side - what the real gain we'll have from it?
> I don't see much so far.
> Konstantin
> 
I see two possible gains one is a consistent return method for Fixed/Variable and some code reduction in a few places. Let me see if I can create a patch we can review and see if it seems reasonable.

>> 
>> (Also to note my previous suggestion about upping the major version to 2.0
>> if we continue to increase the number of ABI/API changes in this release.
>> Anyone else any thoughts on that?)

Keith Wiles, Principal Technologist with CTO office, Wind River mobile 972-213-5533

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] Bulk dequeue of packets and the returned values, question
  2014-09-29 12:10  4%     ` Bruce Richardson
  2014-09-29 12:26  0%       ` Neil Horman
@ 2014-09-29 12:30  0%       ` Ananyev, Konstantin
  2014-09-29 14:57  0%         ` Wiles, Roger Keith
  1 sibling, 1 reply; 200+ results
From: Ananyev, Konstantin @ 2014-09-29 12:30 UTC (permalink / raw)
  To: Richardson, Bruce, Wiles, Roger Keith (Wind River); +Cc: dev



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Bruce Richardson
> Sent: Monday, September 29, 2014 1:10 PM
> To: Wiles, Roger Keith (Wind River)
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] Bulk dequeue of packets and the returned values, question
> 
> On Sun, Sep 28, 2014 at 11:06:17PM +0000, Wiles, Roger Keith wrote:
> > Thanks Venky,
> > On Sep 28, 2014, at 5:23 PM, Venkatesan, Venky <venky.venkatesan@intel.com> wrote:
> >
> > > Keith,
> > >
> > > On 9/28/2014 11:04 AM, Wiles, Roger Keith wrote:
> > >> I am also looking at the bulk dequeue routines, which the ring can be fixed or variable. On fixed  < 0 on error is returned and 0 if
> successful. On a variable ring < 0 on error or n on success, but I think n can be zero in the variable case, correct?
> > >>
> > >> If these are true then why not have the routines return  < 0 on error and >= 0 on success. Which means a dequeue from a fixed
> ring would return only ’requested size n’ or < 0 if you error off the 0 case. The 0 case could be OK, if you allow zero to be return on a
> empty ring for the fixed ring case.
> > >>
> > >> Does this make sense to anyone?
> > > It won't make sense unless you're aware of the history behind these functions. The original functions that were implemented for
> the ring were only the bulk functions (i.e. FIXED). They would return exactly the number of items requested for dequeue (0 if success,
> negative if error), and not return any if the required number were not available.
> > >
> > > The burst (i.e. VARIABLE) functions came in much later (think it was r1.3 where we introduced them), and by that time, there were
> already quite a number of deployments of DPDK in the field using the legacy ring functions. Therefore we made the decision to keep
> the legacy behavior intact & not impacting deployed code - and merging the burst functions into the code. Given that there was no
> "versioning" of the API/ABI in those releases :).
> >
> > I see why the code is this way. If the developers used ‘if ( ret == 0 ) { /* do something */ }’ then it would break if it returned a
> positive value on success. I would expect the normal behavior to be ‘if ( ret < 0 ) { /* error case */ }’ and fall thru for the success case. I
> would love to change the code to just return <0 on error or >= 0 on success. I wonder how many customers code would break
> changing the code to do just just the two steps. I think it will remove some code in a couple places that were testing for FIXED or
> VARIABLE?
> > >
> > > Hope that helps.
> > > -Venky
> > >
> > >>
> > >> Thanks
> > >> ++Keith
> > >>
> > >> Keith Wiles, Principal Technologist with CTO office, Wind River mobile 972-213-5533
> >
> > Keith Wiles, Principal Technologist with CTO office, Wind River mobile 972-213-5533
> >
> 
> Since we are looking at making considerable ABI changes in this release and
> (hopefully) also looking to version our ABI going forward, I would be in
> favour of making any changes to these APIs in this current release if
> possible. While the current behaviour makes sense for historical reason, I
> think an overall change to the behaviour as Keith describes would be more
> sensible long-term.

It is doable, I suppose, but might become quite messy:
Don't know how many people are using  rte_ring_dequeue_bulk() all over the place.
I suspect quite a lot.
From other side - what the real gain we'll have from it?
I don't see much so far. 
Konstantin

> 
> (Also to note my previous suggestion about upping the major version to 2.0
> if we continue to increase the number of ABI/API changes in this release.
> Anyone else any thoughts on that?)
> 
>

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] Bulk dequeue of packets and the returned values, question
  2014-09-29 12:10  4%     ` Bruce Richardson
@ 2014-09-29 12:26  0%       ` Neil Horman
  2014-09-29 12:30  0%       ` Ananyev, Konstantin
  1 sibling, 0 replies; 200+ results
From: Neil Horman @ 2014-09-29 12:26 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: dev

On Mon, Sep 29, 2014 at 01:10:22PM +0100, Bruce Richardson wrote:
> On Sun, Sep 28, 2014 at 11:06:17PM +0000, Wiles, Roger Keith wrote:
> > Thanks Venky,
> > On Sep 28, 2014, at 5:23 PM, Venkatesan, Venky <venky.venkatesan@intel.com> wrote:
> > 
> > > Keith,
> > > 
> > > On 9/28/2014 11:04 AM, Wiles, Roger Keith wrote:
> > >> I am also looking at the bulk dequeue routines, which the ring can be fixed or variable. On fixed  < 0 on error is returned and 0 if successful. On a variable ring < 0 on error or n on success, but I think n can be zero in the variable case, correct?
> > >> 
> > >> If these are true then why not have the routines return  < 0 on error and >= 0 on success. Which means a dequeue from a fixed ring would return only ’requested size n’ or < 0 if you error off the 0 case. The 0 case could be OK, if you allow zero to be return on a empty ring for the fixed ring case.
> > >> 
> > >> Does this make sense to anyone?
> > > It won't make sense unless you're aware of the history behind these functions. The original functions that were implemented for the ring were only the bulk functions (i.e. FIXED). They would return exactly the number of items requested for dequeue (0 if success, negative if error), and not return any if the required number were not available.
> > > 
> > > The burst (i.e. VARIABLE) functions came in much later (think it was r1.3 where we introduced them), and by that time, there were already quite a number of deployments of DPDK in the field using the legacy ring functions. Therefore we made the decision to keep the legacy behavior intact & not impacting deployed code - and merging the burst functions into the code. Given that there was no "versioning" of the API/ABI in those releases :).
> > 
> > I see why the code is this way. If the developers used ‘if ( ret == 0 ) { /* do something */ }’ then it would break if it returned a positive value on success. I would expect the normal behavior to be ‘if ( ret < 0 ) { /* error case */ }’ and fall thru for the success case. I would love to change the code to just return <0 on error or >= 0 on success. I wonder how many customers code would break changing the code to do just just the two steps. I think it will remove some code in a couple places that were testing for FIXED or VARIABLE?
> > > 
> > > Hope that helps.
> > > -Venky
> > > 
> > >> 
> > >> Thanks
> > >> ++Keith
> > >> 
> > >> Keith Wiles, Principal Technologist with CTO office, Wind River mobile 972-213-5533
> > 
> > Keith Wiles, Principal Technologist with CTO office, Wind River mobile 972-213-5533
> > 
> 
> Since we are looking at making considerable ABI changes in this release and 
> (hopefully) also looking to version our ABI going forward, I would be in 
> favour of making any changes to these APIs in this current release if 
> possible. While the current behaviour makes sense for historical reason, I 
> think an overall change to the behaviour as Keith describes would be more 
> sensible long-term. 
> 
I agree, this seems like a sensible time to make these sorts of changes as we
identify them.

> (Also to note my previous suggestion about upping the major version to 2.0 
> if we continue to increase the number of ABI/API changes in this release.  
> Anyone else any thoughts on that?)
> 
I feel like this is a policy decision, as I vew the versioning as arbitrary.
I'm really fine with it either way.  Presumably moving to 2.0 would represent a
major shift in design, and I suppose adding versioning does amount to something
like that, so I could be supportive.
Neil

> /Bruce
> 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] Bulk dequeue of packets and the returned values, question
  2014-09-28 23:06  0%   ` Wiles, Roger Keith
@ 2014-09-29 12:10  4%     ` Bruce Richardson
  2014-09-29 12:26  0%       ` Neil Horman
  2014-09-29 12:30  0%       ` Ananyev, Konstantin
  0 siblings, 2 replies; 200+ results
From: Bruce Richardson @ 2014-09-29 12:10 UTC (permalink / raw)
  To: Wiles, Roger Keith; +Cc: dev

On Sun, Sep 28, 2014 at 11:06:17PM +0000, Wiles, Roger Keith wrote:
> Thanks Venky,
> On Sep 28, 2014, at 5:23 PM, Venkatesan, Venky <venky.venkatesan@intel.com> wrote:
> 
> > Keith,
> > 
> > On 9/28/2014 11:04 AM, Wiles, Roger Keith wrote:
> >> I am also looking at the bulk dequeue routines, which the ring can be fixed or variable. On fixed  < 0 on error is returned and 0 if successful. On a variable ring < 0 on error or n on success, but I think n can be zero in the variable case, correct?
> >> 
> >> If these are true then why not have the routines return  < 0 on error and >= 0 on success. Which means a dequeue from a fixed ring would return only ’requested size n’ or < 0 if you error off the 0 case. The 0 case could be OK, if you allow zero to be return on a empty ring for the fixed ring case.
> >> 
> >> Does this make sense to anyone?
> > It won't make sense unless you're aware of the history behind these functions. The original functions that were implemented for the ring were only the bulk functions (i.e. FIXED). They would return exactly the number of items requested for dequeue (0 if success, negative if error), and not return any if the required number were not available.
> > 
> > The burst (i.e. VARIABLE) functions came in much later (think it was r1.3 where we introduced them), and by that time, there were already quite a number of deployments of DPDK in the field using the legacy ring functions. Therefore we made the decision to keep the legacy behavior intact & not impacting deployed code - and merging the burst functions into the code. Given that there was no "versioning" of the API/ABI in those releases :).
> 
> I see why the code is this way. If the developers used ‘if ( ret == 0 ) { /* do something */ }’ then it would break if it returned a positive value on success. I would expect the normal behavior to be ‘if ( ret < 0 ) { /* error case */ }’ and fall thru for the success case. I would love to change the code to just return <0 on error or >= 0 on success. I wonder how many customers code would break changing the code to do just just the two steps. I think it will remove some code in a couple places that were testing for FIXED or VARIABLE?
> > 
> > Hope that helps.
> > -Venky
> > 
> >> 
> >> Thanks
> >> ++Keith
> >> 
> >> Keith Wiles, Principal Technologist with CTO office, Wind River mobile 972-213-5533
> 
> Keith Wiles, Principal Technologist with CTO office, Wind River mobile 972-213-5533
> 

Since we are looking at making considerable ABI changes in this release and 
(hopefully) also looking to version our ABI going forward, I would be in 
favour of making any changes to these APIs in this current release if 
possible. While the current behaviour makes sense for historical reason, I 
think an overall change to the behaviour as Keith describes would be more 
sensible long-term. 

(Also to note my previous suggestion about upping the major version to 2.0 
if we continue to increase the number of ABI/API changes in this release.  
Anyone else any thoughts on that?)

/Bruce

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] Bulk dequeue of packets and the returned values, question
  2014-09-28 22:23  3% ` Venkatesan, Venky
  2014-09-28 22:36  0%   ` Neil Horman
@ 2014-09-28 23:06  0%   ` Wiles, Roger Keith
  2014-09-29 12:10  4%     ` Bruce Richardson
  1 sibling, 1 reply; 200+ results
From: Wiles, Roger Keith @ 2014-09-28 23:06 UTC (permalink / raw)
  To: VENKATESAN, NAMAKKAL; +Cc: dev

Thanks Venky,
On Sep 28, 2014, at 5:23 PM, Venkatesan, Venky <venky.venkatesan@intel.com> wrote:

> Keith,
> 
> On 9/28/2014 11:04 AM, Wiles, Roger Keith wrote:
>> I am also looking at the bulk dequeue routines, which the ring can be fixed or variable. On fixed  < 0 on error is returned and 0 if successful. On a variable ring < 0 on error or n on success, but I think n can be zero in the variable case, correct?
>> 
>> If these are true then why not have the routines return  < 0 on error and >= 0 on success. Which means a dequeue from a fixed ring would return only ’requested size n’ or < 0 if you error off the 0 case. The 0 case could be OK, if you allow zero to be return on a empty ring for the fixed ring case.
>> 
>> Does this make sense to anyone?
> It won't make sense unless you're aware of the history behind these functions. The original functions that were implemented for the ring were only the bulk functions (i.e. FIXED). They would return exactly the number of items requested for dequeue (0 if success, negative if error), and not return any if the required number were not available.
> 
> The burst (i.e. VARIABLE) functions came in much later (think it was r1.3 where we introduced them), and by that time, there were already quite a number of deployments of DPDK in the field using the legacy ring functions. Therefore we made the decision to keep the legacy behavior intact & not impacting deployed code - and merging the burst functions into the code. Given that there was no "versioning" of the API/ABI in those releases :).

I see why the code is this way. If the developers used ‘if ( ret == 0 ) { /* do something */ }’ then it would break if it returned a positive value on success. I would expect the normal behavior to be ‘if ( ret < 0 ) { /* error case */ }’ and fall thru for the success case. I would love to change the code to just return <0 on error or >= 0 on success. I wonder how many customers code would break changing the code to do just just the two steps. I think it will remove some code in a couple places that were testing for FIXED or VARIABLE?
> 
> Hope that helps.
> -Venky
> 
>> 
>> Thanks
>> ++Keith
>> 
>> Keith Wiles, Principal Technologist with CTO office, Wind River mobile 972-213-5533

Keith Wiles, Principal Technologist with CTO office, Wind River mobile 972-213-5533

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] Bulk dequeue of packets and the returned values, question
  2014-09-28 22:23  3% ` Venkatesan, Venky
@ 2014-09-28 22:36  0%   ` Neil Horman
  2014-09-28 23:06  0%   ` Wiles, Roger Keith
  1 sibling, 0 replies; 200+ results
From: Neil Horman @ 2014-09-28 22:36 UTC (permalink / raw)
  To: Venkatesan, Venky; +Cc: dev

On Sun, Sep 28, 2014 at 03:23:44PM -0700, Venkatesan, Venky wrote:
> Keith,
> 
> On 9/28/2014 11:04 AM, Wiles, Roger Keith wrote:
> >I am also looking at the bulk dequeue routines, which the ring can be fixed or variable. On fixed  < 0 on error is returned and 0 if successful. On a variable ring < 0 on error or n on success, but I think n can be zero in the variable case, correct?
> >
> >If these are true then why not have the routines return  < 0 on error and >= 0 on success. Which means a dequeue from a fixed ring would return only ’requested size n’ or < 0 if you error off the 0 case. The 0 case could be OK, if you allow zero to be return on a empty ring for the fixed ring case.
> >
> >Does this make sense to anyone?
> It won't make sense unless you're aware of the history behind these
> functions. The original functions that were implemented for the ring were
> only the bulk functions (i.e. FIXED). They would return exactly the number
> of items requested for dequeue (0 if success, negative if error), and not
> return any if the required number were not available.
> 
> The burst (i.e. VARIABLE) functions came in much later (think it was r1.3
> where we introduced them), and by that time, there were already quite a
> number of deployments of DPDK in the field using the legacy ring functions.
> Therefore we made the decision to keep the legacy behavior intact & not
> impacting deployed code - and merging the burst functions into the code.
> Given that there was no "versioning" of the API/ABI in those releases :).
> 
Hehe :)

Yes, API versioning would be a great benefit to this sort of problem.  If only
there were a patchset available to create that ability ;)

Neil

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] Bulk dequeue of packets and the returned values, question
  @ 2014-09-28 22:23  3% ` Venkatesan, Venky
  2014-09-28 22:36  0%   ` Neil Horman
  2014-09-28 23:06  0%   ` Wiles, Roger Keith
  0 siblings, 2 replies; 200+ results
From: Venkatesan, Venky @ 2014-09-28 22:23 UTC (permalink / raw)
  To: dev

Keith,

On 9/28/2014 11:04 AM, Wiles, Roger Keith wrote:
> I am also looking at the bulk dequeue routines, which the ring can be fixed or variable. On fixed  < 0 on error is returned and 0 if successful. On a variable ring < 0 on error or n on success, but I think n can be zero in the variable case, correct?
>
> If these are true then why not have the routines return  < 0 on error and >= 0 on success. Which means a dequeue from a fixed ring would return only ’requested size n’ or < 0 if you error off the 0 case. The 0 case could be OK, if you allow zero to be return on a empty ring for the fixed ring case.
>
> Does this make sense to anyone?
It won't make sense unless you're aware of the history behind these 
functions. The original functions that were implemented for the ring 
were only the bulk functions (i.e. FIXED). They would return exactly the 
number of items requested for dequeue (0 if success, negative if error), 
and not return any if the required number were not available.

The burst (i.e. VARIABLE) functions came in much later (think it was 
r1.3 where we introduced them), and by that time, there were already 
quite a number of deployments of DPDK in the field using the legacy ring 
functions. Therefore we made the decision to keep the legacy behavior 
intact & not impacting deployed code - and merging the burst functions 
into the code. Given that there was no "versioning" of the API/ABI in 
those releases :).

Hope that helps.
-Venky

>
> Thanks
> ++Keith
>
> Keith Wiles, Principal Technologist with CTO office, Wind River mobile 972-213-5533
>

^ permalink raw reply	[relevance 3%]

Results 13801-14000 of ~18000   |  | reverse | sort options + mbox downloads above
-- links below jump to the message on this page --
2014-09-15 19:23     [dpdk-dev] [PATCH 0/4] Add DSO symbol versioning to support backwards compatibility Neil Horman
2014-09-15 19:23     ` [dpdk-dev] [PATCH 3/4] Add library version extenstion Neil Horman
2014-10-01 11:27  0%   ` Sergio Gonzalez Monroy
2014-09-15 19:23     ` [dpdk-dev] [PATCH 4/4] docs: Add ABI documentation Neil Horman
2014-10-01 16:06  4%   ` Sergio Gonzalez Monroy
2014-09-18 19:14     ` [dpdk-dev] [PATCH 0/4] Add DSO symbol versioning to support backwards compatibility Neil Horman
2014-09-24 18:19       ` Neil Horman
2014-09-26 10:41         ` Thomas Monjalon
2014-09-26 14:45           ` Neil Horman
2014-10-01 18:59  0%         ` Neil Horman
2014-10-07 21:01  0%           ` Neil Horman
2014-10-08 15:57  0%             ` Thomas Monjalon
2014-10-08 18:46  3%               ` Butler, Siobhan A
2014-10-08 19:09  4%               ` Neil Horman
2014-09-15 19:23     [dpdk-dev] [PATCH 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
2014-09-29 15:44  4% ` [dpdk-dev] [PATCH 1/4 v3] " Neil Horman
2014-09-30  8:13  0%   ` Sergio Gonzalez Monroy
2014-09-30 15:18  3% ` [dpdk-dev] [PATCH 1/4 v4] " Neil Horman
2014-10-01 10:15  0%   ` Sergio Gonzalez Monroy
2014-10-01 10:38  0%     ` Neil Horman
2014-10-01 11:28  0%   ` Sergio Gonzalez Monroy
2014-09-28 18:04     [dpdk-dev] Bulk dequeue of packets and the returned values, question Wiles, Roger Keith
2014-09-28 22:23  3% ` Venkatesan, Venky
2014-09-28 22:36  0%   ` Neil Horman
2014-09-28 23:06  0%   ` Wiles, Roger Keith
2014-09-29 12:10  4%     ` Bruce Richardson
2014-09-29 12:26  0%       ` Neil Horman
2014-09-29 12:30  0%       ` Ananyev, Konstantin
2014-09-29 14:57  0%         ` Wiles, Roger Keith
2014-09-30 15:26     [dpdk-dev] [PATCH RFC] mbuf: Adjust TX flags to start at bit 32 Bruce Richardson
2014-09-30 15:33  3% ` Bruce Richardson
2014-09-30 16:00  0%   ` Wiles, Roger Keith
2014-09-30 16:03  0%     ` Bruce Richardson
2014-09-30 17:06  3% ` Neil Horman
2014-10-01  8:47  0%   ` Bruce Richardson
2014-10-01 11:14  0%     ` Neil Horman
2014-10-01  4:27     [dpdk-dev] [PATCH] Fix linking errors when CONFIG_RTE_BUILD_SHARED_LIB is enabled mukawa
2014-10-01 10:50     ` Neil Horman
2014-10-01 11:56       ` Thomas Monjalon
2014-10-02  2:48  2%     ` Tetsuya Mukawa
2014-10-02  8:12  0%       ` Sergio Gonzalez Monroy
2014-10-02  8:28  2%         ` Tetsuya Mukawa
2014-10-02  8:53  0%           ` Sergio Gonzalez Monroy
2014-10-02  9:05  0%             ` Tetsuya Mukawa
2014-10-03 11:11  0%               ` Sergio Gonzalez Monroy
2014-10-02 15:56     [dpdk-dev] [PATCH 0/4] Fix build issues with CONFIG_RTE_BUILD_COMBINE_LIBS=y Sergio Gonzalez Monroy
2014-10-02 17:26     ` Neil Horman
2014-10-02 20:04       ` Matthew Hall
2014-10-02 20:24         ` Neil Horman
2014-10-03 10:31           ` Sergio Gonzalez Monroy
2014-10-03 11:28             ` Neil Horman
2014-10-03 23:52               ` Stephen Hemminger
2014-10-04  2:30  3%             ` Neil Horman
2014-10-06 10:52     ` [dpdk-dev] [PATCH v2 0/4] Update build process Sergio Gonzalez Monroy
2014-10-06 10:52       ` [dpdk-dev] [PATCH v2 3/4] Update library " Sergio Gonzalez Monroy
2014-10-06 20:46         ` Matthew Hall
2014-10-07  9:55  3%       ` Sergio Gonzalez Monroy
2014-10-08 22:36  0%         ` Matthew Hall
2014-10-09  9:44  0%           ` Sergio Gonzalez Monroy
2014-10-22 13:48  2% [dpdk-dev] [dpdk-announce] DPDK Features for Q1 2015 O'driscoll, Tim
2014-10-22 16:10  3% ` Luke Gorrie
2014-10-24  9:22     [dpdk-dev] DPDK Community Conference Call - Friday 31st October O'driscoll, Tim
2014-10-31 15:34     ` O'driscoll, Tim
2014-10-31 17:36       ` O'driscoll, Tim
2014-11-01 12:59  3%     ` Neil Horman
2014-11-01 14:05  0%       ` Vincent JARDIN
2014-11-11 10:16     [dpdk-dev] Community conference call - Tuesday 18th November O'driscoll, Tim
2014-11-14 10:52  4% ` O'driscoll, Tim
2014-11-18 12:56  0%   ` O'driscoll, Tim
2014-11-19 12:33  3%     ` O'driscoll, Tim
2014-11-20  9:27  0%       ` Walukiewicz, Miroslaw
2014-11-13 12:01  8% [dpdk-dev] [PATCH] x32 ABI support, first iteration Daniel Mrzyglod
2014-11-13 12:20  9% ` Mrzyglod, DanielX T
2014-11-14  0:45  4% ` Neil Horman
     [not found]     ` <86228AFD5BCD8E4EBFD2B90117B5E81E10D789EA@SHSMSX103.ccr.corp.intel.com>
2015-02-09  5:29  4%   ` Tang, HaifengX
2014-11-19 11:22     [dpdk-dev] versioning and maintenance Thomas Monjalon
2014-11-19 11:35     ` Bruce Richardson
2014-11-19 15:13  4%   ` Neil Horman
2014-11-20 17:09  4%     ` Thomas Monjalon
2014-11-20 18:25  5%       ` Neil Horman
2014-11-20 21:08  3%         ` Thomas Monjalon
2014-11-21  1:05  4%           ` Neil Horman
2014-11-21 13:23  4%             ` Thomas Monjalon
2014-11-21 20:17  4%               ` Neil Horman
2014-12-20 21:01  4% [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
2014-12-20 21:01  4% ` [dpdk-dev] [PATCH 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
2014-12-20 21:01  7% ` [dpdk-dev] [PATCH 3/4] Add library version extenstion Neil Horman
2014-12-20 21:01 23% ` [dpdk-dev] [PATCH 4/4] docs: Add ABI documentation Neil Horman
2014-12-22 20:24  4% ` [dpdk-dev] [PATCH v2 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
2014-12-22 20:24  7%   ` [dpdk-dev] [PATCH v2 3/4] Add library version extenstion Neil Horman
2014-12-22 20:24 23%   ` [dpdk-dev] [PATCH v2 4/4] docs: Add ABI documentation Neil Horman
2014-12-23  9:48  4%     ` Iremonger, Bernard
2014-12-23 13:01  4%       ` Neil Horman
2014-12-23 15:51  4% ` [dpdk-dev] [PATCH v3 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
2014-12-23 15:51  7%   ` [dpdk-dev] [PATCH v3 3/4] Add library version extenstion Neil Horman
2014-12-29 16:23  0%     ` Sergio Gonzalez Monroy
2015-01-14 15:48  0%     ` Thomas Monjalon
2014-12-23 15:51 23%   ` [dpdk-dev] [PATCH v3 4/4] docs: Add ABI documentation Neil Horman
2014-12-29 16:24  4%     ` Sergio Gonzalez Monroy
2015-01-14 15:59  4%     ` Thomas Monjalon
2015-01-14 20:07  7%       ` Neil Horman
2015-01-16 13:34  7%         ` Thomas Monjalon
2015-01-14 15:25  0%   ` [dpdk-dev] [PATCH v3 1/4] compat: Add infrastructure to support symbol versioning Thomas Monjalon
2015-01-14 20:29  0%     ` Neil Horman
2015-01-09 12:35  0% ` [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Neil Horman
2015-01-15 19:35  3% ` [dpdk-dev] [PATCH v4 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
2015-01-15 19:35  7%   ` [dpdk-dev] [PATCH v4 3/4] Add library version extenstion Neil Horman
2015-01-15 19:35 23%   ` [dpdk-dev] [PATCH v4 4/4] docs: Add ABI documentation Neil Horman
2015-01-30 17:13  3%   ` [dpdk-dev] [PATCH v4 1/4] compat: Add infrastructure to support symbol versioning Gray, Mark D
2015-01-16 15:33  3% ` [dpdk-dev] [PATCH v5 " Neil Horman
2015-01-16 15:33  7%   ` [dpdk-dev] [PATCH v5 3/4] Add library version extenstion Neil Horman
2015-01-16 15:33 23%   ` [dpdk-dev] [PATCH v5 4/4] docs: Add ABI documentation Neil Horman
2015-01-20  7:14  4%     ` Thomas Monjalon
2015-01-20 10:47  4%       ` Bruce Richardson
2015-01-20 13:37  4%       ` Iremonger, Bernard
2015-01-20 13:46  4%         ` Thomas Monjalon
2015-01-20 14:24  4%         ` Neil Horman
2015-01-20 14:29  4%           ` Butler, Siobhan A
2015-01-20 14:41  4%             ` Neil Horman
2015-01-20 14:50  4%               ` Butler, Siobhan A
2015-01-20 15:30  4%                 ` Neil Horman
2015-01-20 14:32  4%           ` O'driscoll, Tim
2015-01-20 14:00  8%     ` Thomas Monjalon
2015-01-20 14:37  7%       ` Neil Horman
2015-01-20 15:06  9%         ` Thomas Monjalon
2015-01-20 15:35  4%           ` Neil Horman
2015-01-20 21:17  3% ` [dpdk-dev] [PATCH v6 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
2015-01-20 21:17  7%   ` [dpdk-dev] [PATCH v6 3/4] Add library version extenstion Neil Horman
2015-01-20 21:17 24%   ` [dpdk-dev] [PATCH v6 4/4] docs: Add ABI documentation Neil Horman
2015-01-21 10:13  8%     ` Iremonger, Bernard
2015-01-21 10:25 10%     ` Thomas Monjalon
2015-01-21 14:59  8%       ` Neil Horman
2015-01-21 16:05  8%         ` Thomas Monjalon
2015-01-21 19:43  4%           ` Neil Horman
2015-01-21 22:24  9%             ` Thomas Monjalon
2015-01-22 19:21  4%               ` Neil Horman
2015-01-21 20:59  3% ` [dpdk-dev] [PATCH v7 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
2015-01-21 20:59  7%   ` [dpdk-dev] [PATCH v7 3/4] Add library version extenstion Neil Horman
2015-01-21 20:59 23%   ` [dpdk-dev] [PATCH v7 4/4] docs: Add ABI documentation Neil Horman
2015-01-22 10:56  8%     ` Iremonger, Bernard
2015-01-22 15:37  7%       ` Neil Horman
2015-01-22 15:49  3% ` [dpdk-dev] [PATCH v8 1/4] compat: Add infrastructure to support symbol versioning Neil Horman
2015-01-22 15:49  7%   ` [dpdk-dev] [PATCH v8 3/4] Add library version extenstion Neil Horman
2015-01-22 15:49 23%   ` [dpdk-dev] [PATCH v8 4/4] docs: Add ABI documentation Neil Horman
2015-01-22 16:46  4%     ` Butler, Siobhan A
     [not found]     ` <1422898822-16422-1-git-send-email-nhorman@tuxdriver.com>
     [not found]       ` <1422898822-16422-4-git-send-email-nhorman@tuxdriver.com>
2015-02-03 15:24  8%     ` [dpdk-dev] [PATCH v9 " Thomas Monjalon
2015-02-03 16:01  0% ` [dpdk-dev] Add DSO symbol versioning to supportbackwards compatibility Thomas Monjalon
2015-02-03 20:20  0%   ` Neil Horman
2014-12-22 16:47     [dpdk-dev] [PATCH RFC 0/3] DPDK ethdev callback support Bruce Richardson
2015-02-12 19:57     ` [dpdk-dev] [PATCH " John McNamara
2015-02-12 19:57       ` [dpdk-dev] [PATCH 2/3] ethdev: Add in data rxtx " John McNamara
2015-02-12 21:12  3%     ` Neil Horman
2015-02-13 14:54  3%   ` [dpdk-dev] [PATCH 0/3] DPDK ethdev " Declan Doherty
2015-02-13 15:39  4% ` [dpdk-dev] [PATCH v2 0/4] " John McNamara
2015-02-13 15:39  5%   ` [dpdk-dev] [PATCH v2 4/4] abi: Added rxtx callback functions to ABI versioning John McNamara
2015-02-13 15:59  5%     ` Thomas Monjalon
2015-02-13 15:48  0%   ` [dpdk-dev] [PATCH v2 0/4] DPDK ethdev callback support Declan Doherty
2015-02-18 17:42  4% ` [dpdk-dev] [PATCH v3 0/3] " John McNamara
2015-02-19 17:56  4%   ` [dpdk-dev] [PATCH v4 " John McNamara
2015-02-20 17:03  4%   ` [dpdk-dev] [PATCH v5 " John McNamara
2015-01-29 15:20     [dpdk-dev] [PATCH 0/8] Improve build process Sergio Gonzalez Monroy
2015-01-29 16:38  3% ` Neil Horman
2015-01-29 17:02  0%   ` Thomas Monjalon
2015-01-29 17:04  0%   ` Gonzalez Monroy, Sergio
2015-01-29 19:45  0%     ` Neil Horman
2015-01-30 13:39  0%       ` Gonzalez Monroy, Sergio
2015-01-30 14:05  0%         ` Neil Horman
2015-01-30 17:38  0%           ` Gonzalez Monroy, Sergio
2015-01-30 18:12  0%             ` Neil Horman
2015-02-11 11:11                   ` Gonzalez Monroy, Sergio
2015-02-12  9:22                     ` Panu Matilainen
2015-02-12 10:03                       ` Gonzalez Monroy, Sergio
2015-02-12 12:23                         ` Neil Horman
2015-02-12 14:07                           ` Panu Matilainen
2015-02-12 15:52  3%                         ` Neil Horman
2015-02-13 10:14  0%                           ` Panu Matilainen
2015-02-13 11:08  0%                             ` Gonzalez Monroy, Sergio
2015-02-13 12:51  0%                               ` Neil Horman
2015-02-20 14:31  0%                                 ` Gonzalez Monroy, Sergio
2015-02-22 23:37  0%                                   ` Neil Horman
2015-02-23 10:25  0%                                     ` Gonzalez Monroy, Sergio
2015-02-23 13:52  0%                                       ` Neil Horman
2015-02-23 14:58  0%                                         ` Gonzalez Monroy, Sergio
2015-02-23 18:23  0%                                           ` Neil Horman
2015-01-30 21:16 17% [dpdk-dev] [PATCH] ABI: Add abi checking utility Neil Horman
2015-02-02 18:18 17% ` [dpdk-dev] [PATCH v2] " Neil Horman
2015-02-04 22:23  4% [dpdk-dev] [PATCH 0/3] update maintainers areas Thomas Monjalon
2015-02-04 22:23 14% ` [dpdk-dev] [PATCH 2/3] maintainers: add ABI versioning Thomas Monjalon
2015-02-05  1:39  4%   ` Neil Horman
2015-02-09 14:20  7%     ` Thomas Monjalon
2015-02-09 14:21  0% ` [dpdk-dev] [PATCH 0/3] update maintainers areas Thomas Monjalon
2015-02-05  1:13     [dpdk-dev] [PATCH 0/7] Hyper-v driver and infrastructure Stephen Hemminger
2015-02-05  1:13  1% ` [dpdk-dev] [PATCH 3/7] hv: add basic vmbus support Stephen Hemminger
2015-02-05  1:50  0%   ` Neil Horman
2015-02-09  8:30     [dpdk-dev] [PATCH v7 01/14] eal_pci: Add flag to hold kernel driver type Tetsuya Mukawa
2015-02-17  0:36     ` [dpdk-dev] [PATCH v8 03/14] eal/pci, ethdev: Remove assumption that port will not be detached Thomas Monjalon
2015-02-17  6:14       ` Tetsuya Mukawa
2015-02-18  0:31  3%     ` Thomas Monjalon
2015-02-18  1:54  0%       ` Tetsuya Mukawa
2015-02-18  6:10  0%         ` Tetsuya Mukawa
2015-02-18  9:27  0%           ` Iremonger, Bernard
2015-02-18  9:57  0%           ` Thomas Monjalon
2015-02-18 10:03  3%             ` Bruce Richardson
2015-02-18 10:58  0%               ` Tetsuya Mukawa
2015-02-18 12:23  0%                 ` Bruce Richardson
2015-02-18 12:38  0%                   ` Tetsuya Mukawa
2015-02-18 12:33  0%                 ` Iremonger, Bernard
2015-02-18 12:41  0%                   ` Tetsuya Mukawa
     [not found]     <2601191342CEEE43887BDE71AB977258213E4175@irsmsx105.ger.corp.intel.com>
2015-02-09 10:22  4% ` [dpdk-dev] [PATCH] x32 ABI support, first iteration Ananyev, Konstantin
2015-02-12 13:18  4%   ` De Lara Guarch, Pablo
2015-02-18 19:32  4%     ` Thomas Monjalon
2015-02-11  1:31     [dpdk-dev] [PATCH v4 01/15] fm10k: add base driver Chen Jing D(Mark)
2015-02-13  8:19  4% ` [dpdk-dev] [PATCH v5 00/17] lib/librte_pmd_fm10k : fm10k pmd driver Chen Jing D(Mark)
2015-02-13  8:19  7%   ` [dpdk-dev] [PATCH v5 17/17] fm10k: Add ABI version of librte_pmd_fm10k Chen Jing D(Mark)
2015-02-13  8:37  0%   ` [dpdk-dev] [PATCH v5 00/17] lib/librte_pmd_fm10k : fm10k pmd driver Zhang, Helin
2015-02-15  5:07  0%   ` Qiu, Michael
2015-02-13  8:19     [dpdk-dev] [PATCH v5 01/17] fm10k: add base driver Chen Jing D(Mark)
2015-02-17 14:18  4% ` [dpdk-dev] [PATCH v6 00/16] lib/librte_pmd_fm10k : fm10k pmd driver Chen Jing D(Mark)
2015-02-17 14:18  1%   ` [dpdk-dev] [PATCH v6 03/16] fm10k: register fm10k pmd PF driver Chen Jing D(Mark)
2015-02-18  0:13  0%   ` [dpdk-dev] [PATCH v6 00/16] lib/librte_pmd_fm10k : fm10k pmd driver Thomas Monjalon
2015-02-13 15:58 11% [dpdk-dev] [PATCH] doc: Add requirements for x32 ABI Daniel Mrzyglod
2015-02-16 16:09  4% ` De Lara Guarch, Pablo
2015-02-16 16:27 11% ` [dpdk-dev] [PATCH v2] " Daniel Mrzyglod
2015-02-16 16:29  4%   ` De Lara Guarch, Pablo
2015-02-18 19:33  4%     ` Thomas Monjalon
2015-02-16 10:18  4% [dpdk-dev] [PULL REQUEST] fm10k: new polling mode driver for PF/VF Chen Jing D(Mark)
2015-02-16 12:24  0% ` Thomas Monjalon
2015-02-17 13:47     [dpdk-dev] [PATCH v3 0/5] Interrupt mode PMD Zhou Danny
2015-02-17 13:47     ` [dpdk-dev] [PATCH v3 1/5] ethdev: add rx interrupt enable/disable functions Zhou Danny
2015-02-17 15:54  3%   ` Neil Horman
2015-02-19  7:58  3%     ` Zhou, Danny
2015-02-19 13:02  3%       ` Neil Horman
2015-02-17 13:47     ` [dpdk-dev] [PATCH v3 4/5] eal: add per rx queue interrupt handling based on VFIO Zhou Danny
2015-02-17 15:58       ` Neil Horman
2015-02-19  8:10  3%     ` Zhou, Danny
2015-02-19 13:04  3%       ` Neil Horman
2015-02-18 11:02  1% [dpdk-dev] [RFC PATCH] lib/librte_ethdev: Expand port identifier Tetsuya Mukawa
2015-02-18 12:30  0% ` Bruce Richardson
2015-02-18 12:31  0%   ` Bruce Richardson
2015-02-18 13:05  0%     ` Wodkowski, PawelX
2015-02-18 14:10  0%       ` Bruce Richardson
2015-02-18 13:10  0%     ` Marc Sune
2015-02-18 13:49  0%       ` Bruce Richardson
2015-02-19 13:48  3% [dpdk-dev] [PATCH v4 0/5] Interrupt mode PMD Zhou Danny
2015-02-19 13:48  3% ` [dpdk-dev] [PATCH v4 1/5] ethdev: add rx interrupt enable/disable functions Zhou Danny
2015-02-20  8:50  0% ` [dpdk-dev] [PATCH v4 0/5] Interrupt mode PMD Gonzalez Monroy, Sergio
2015-02-23 16:55  3% [dpdk-dev] [PATCH v5 0/6] " Zhou Danny
2015-02-23 16:55  3% ` [dpdk-dev] [PATCH v5 1/6] ethdev: add rx interrupt enable/disable functions Zhou Danny

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).