DPDK patches and discussions
 help / color / mirror / Atom feed
Search results ordered by [date|relevance]  view[summary|nested|Atom feed]
thread overview below | download: 
* [dpdk-dev] [PATCH v2 05/10] eal: remove deprecated function
  2015-09-02 13:16  3% ` [dpdk-dev] [PATCH v2 00/10] clean deprecated code Thomas Monjalon
                     ` (3 preceding siblings ...)
  2015-09-02 13:16 15%   ` [dpdk-dev] [PATCH v2 04/10] ethdev: remove SCTP flow entries switch Thomas Monjalon
@ 2015-09-02 13:16  4%   ` Thomas Monjalon
  4 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-09-02 13:16 UTC (permalink / raw)
  To: dev

The function rte_eal_pci_close_one() was renamed rte_eal_pci_detach().

Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
---
 doc/guides/rel_notes/deprecation.rst            | 3 ---
 doc/guides/rel_notes/release_2_2.rst            | 3 +++
 lib/librte_eal/bsdapp/eal/rte_eal_version.map   | 1 -
 lib/librte_eal/common/eal_common_pci.c          | 6 ------
 lib/librte_eal/common/include/rte_pci.h         | 2 --
 lib/librte_eal/linuxapp/eal/rte_eal_version.map | 1 -
 6 files changed, 3 insertions(+), 13 deletions(-)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index cf5cd17..604a899 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -13,9 +13,6 @@ Deprecation Notices
   There is no backward compatibility planned from release 2.2.
   All binaries will need to be rebuilt from release 2.2.
 
-* The EAL function rte_eal_pci_close_one is deprecated because renamed to
-  rte_eal_pci_detach.
-
 * The Macros RTE_HASH_BUCKET_ENTRIES_MAX and RTE_HASH_KEY_LENGTH_MAX are
   deprecated and will be removed with version 2.2.
 
diff --git a/doc/guides/rel_notes/release_2_2.rst b/doc/guides/rel_notes/release_2_2.rst
index 825c612..8a5b29a 100644
--- a/doc/guides/rel_notes/release_2_2.rst
+++ b/doc/guides/rel_notes/release_2_2.rst
@@ -16,6 +16,9 @@ Known Issues
 API Changes
 -----------
 
+* The function rte_eal_pci_close_one() is removed.
+  It was replaced by rte_eal_pci_detach().
+
 
 ABI Changes
 -----------
diff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
index 2758848..64fdfb1 100644
--- a/lib/librte_eal/bsdapp/eal/rte_eal_version.map
+++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
@@ -40,7 +40,6 @@ DPDK_2.0 {
 	rte_eal_mp_remote_launch;
 	rte_eal_mp_wait_lcore;
 	rte_eal_parse_devargs_str;
-	rte_eal_pci_close_one;
 	rte_eal_pci_dump;
 	rte_eal_pci_probe;
 	rte_eal_pci_probe_one;
diff --git a/lib/librte_eal/common/eal_common_pci.c b/lib/librte_eal/common/eal_common_pci.c
index 16e8629..dcfe947 100644
--- a/lib/librte_eal/common/eal_common_pci.c
+++ b/lib/librte_eal/common/eal_common_pci.c
@@ -348,12 +348,6 @@ err_return:
 	return -1;
 }
 
-int __attribute__ ((deprecated))
-rte_eal_pci_close_one(const struct rte_pci_addr *addr)
-{
-	return rte_eal_pci_detach(addr);
-}
-
 /*
  * Detach device specified by its pci address.
  */
diff --git a/lib/librte_eal/common/include/rte_pci.h b/lib/librte_eal/common/include/rte_pci.h
index 3fb2d3a..83e3c28 100644
--- a/lib/librte_eal/common/include/rte_pci.h
+++ b/lib/librte_eal/common/include/rte_pci.h
@@ -426,8 +426,6 @@ int rte_eal_pci_probe_one(const struct rte_pci_addr *addr);
  *   - Negative on error.
  */
 int rte_eal_pci_detach(const struct rte_pci_addr *addr);
-int __attribute__ ((deprecated))
-rte_eal_pci_close_one(const struct rte_pci_addr *addr);
 
 /**
  * Dump the content of the PCI bus.
diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
index 59b1717..dbb8fa1 100644
--- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map
+++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
@@ -40,7 +40,6 @@ DPDK_2.0 {
 	rte_eal_mp_remote_launch;
 	rte_eal_mp_wait_lcore;
 	rte_eal_parse_devargs_str;
-	rte_eal_pci_close_one;
 	rte_eal_pci_dump;
 	rte_eal_pci_probe;
 	rte_eal_pci_probe_one;
-- 
2.5.1

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v2 04/10] ethdev: remove SCTP flow entries switch
  2015-09-02 13:16  3% ` [dpdk-dev] [PATCH v2 00/10] clean deprecated code Thomas Monjalon
                     ` (2 preceding siblings ...)
  2015-09-02 13:16  4%   ` [dpdk-dev] [PATCH v2 03/10] mbuf: remove packet type from offload flags Thomas Monjalon
@ 2015-09-02 13:16 15%   ` Thomas Monjalon
  2015-09-02 13:16  4%   ` [dpdk-dev] [PATCH v2 05/10] eal: remove deprecated function Thomas Monjalon
  4 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-09-02 13:16 UTC (permalink / raw)
  To: dev

The extended SCTP flow entries are now part of the standard API.

Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
---
 app/test-pmd/cmdline.c               | 4 ----
 doc/guides/rel_notes/deprecation.rst | 3 ---
 doc/guides/rel_notes/release_2_2.rst | 3 +++
 drivers/net/i40e/i40e_fdir.c         | 4 ----
 lib/librte_ether/rte_eth_ctrl.h      | 4 ----
 5 files changed, 3 insertions(+), 15 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 5799c9c..0f8f48f 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -7888,12 +7888,10 @@ cmd_flow_director_filter_parsed(void *parsed_result,
 		IPV4_ADDR_TO_UINT(res->ip_src,
 			entry.input.flow.sctp4_flow.ip.src_ip);
 		/* need convert to big endian. */
-#ifdef RTE_NEXT_ABI
 		entry.input.flow.sctp4_flow.dst_port =
 				rte_cpu_to_be_16(res->port_dst);
 		entry.input.flow.sctp4_flow.src_port =
 				rte_cpu_to_be_16(res->port_src);
-#endif
 		entry.input.flow.sctp4_flow.verify_tag =
 				rte_cpu_to_be_32(res->verify_tag_value);
 		break;
@@ -7917,12 +7915,10 @@ cmd_flow_director_filter_parsed(void *parsed_result,
 		IPV6_ADDR_TO_ARRAY(res->ip_src,
 			entry.input.flow.sctp6_flow.ip.src_ip);
 		/* need convert to big endian. */
-#ifdef RTE_NEXT_ABI
 		entry.input.flow.sctp6_flow.dst_port =
 				rte_cpu_to_be_16(res->port_dst);
 		entry.input.flow.sctp6_flow.src_port =
 				rte_cpu_to_be_16(res->port_src);
-#endif
 		entry.input.flow.sctp6_flow.verify_tag =
 				rte_cpu_to_be_32(res->verify_tag_value);
 		break;
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 639ab18..cf5cd17 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -44,9 +44,6 @@ Deprecation Notices
   flow director filtering in VF. The release 2.1 does not contain these ABI
   changes, but release 2.2 will, and no backwards compatibility is planned.
 
-* ABI change is planned to extend the SCTP flow's key input from release 2.1.
-  The change may be enabled in the release 2.1 with CONFIG_RTE_NEXT_ABI.
-
 * ABI changes are planned for struct rte_eth_fdir_filter and
   rte_eth_fdir_masks in order to support new flow director modes,
   MAC VLAN and Cloud, on x550. The MAC VLAN mode means the MAC and
diff --git a/doc/guides/rel_notes/release_2_2.rst b/doc/guides/rel_notes/release_2_2.rst
index 3a6d2cc..825c612 100644
--- a/doc/guides/rel_notes/release_2_2.rst
+++ b/doc/guides/rel_notes/release_2_2.rst
@@ -23,6 +23,9 @@ ABI Changes
 * The EAL and ethdev structures rte_intr_handle and rte_eth_conf were changed
   to support Rx interrupt. It was already done in 2.1 for CONFIG_RTE_NEXT_ABI.
 
+* The ethdev flow director entries for SCTP were changed.
+  It was already done in 2.1 for CONFIG_RTE_NEXT_ABI.
+
 * The mbuf structure was changed to support unified packet type.
   It was already done in 2.1 for CONFIG_RTE_NEXT_ABI.
 
diff --git a/drivers/net/i40e/i40e_fdir.c b/drivers/net/i40e/i40e_fdir.c
index 8208273..c9ce98f 100644
--- a/drivers/net/i40e/i40e_fdir.c
+++ b/drivers/net/i40e/i40e_fdir.c
@@ -822,7 +822,6 @@ i40e_fdir_construct_pkt(struct i40e_pf *pf,
 		sctp = (struct sctp_hdr *)(raw_pkt + sizeof(struct ether_hdr) +
 					   sizeof(struct ipv4_hdr));
 		payload = (unsigned char *)sctp + sizeof(struct sctp_hdr);
-#ifdef RTE_NEXT_ABI
 		/*
 		 * The source and destination fields in the transmitted packet
 		 * need to be presented in a reversed order with respect
@@ -830,7 +829,6 @@ i40e_fdir_construct_pkt(struct i40e_pf *pf,
 		 */
 		sctp->src_port = fdir_input->flow.sctp4_flow.dst_port;
 		sctp->dst_port = fdir_input->flow.sctp4_flow.src_port;
-#endif
 		sctp->tag = fdir_input->flow.sctp4_flow.verify_tag;
 		break;
 
@@ -873,7 +871,6 @@ i40e_fdir_construct_pkt(struct i40e_pf *pf,
 		sctp = (struct sctp_hdr *)(raw_pkt + sizeof(struct ether_hdr) +
 					   sizeof(struct ipv6_hdr));
 		payload = (unsigned char *)sctp + sizeof(struct sctp_hdr);
-#ifdef RTE_NEXT_ABI
 		/*
 		 * The source and destination fields in the transmitted packet
 		 * need to be presented in a reversed order with respect
@@ -881,7 +878,6 @@ i40e_fdir_construct_pkt(struct i40e_pf *pf,
 		 */
 		sctp->src_port = fdir_input->flow.sctp6_flow.dst_port;
 		sctp->dst_port = fdir_input->flow.sctp6_flow.src_port;
-#endif
 		sctp->tag = fdir_input->flow.sctp6_flow.verify_tag;
 		break;
 
diff --git a/lib/librte_ether/rte_eth_ctrl.h b/lib/librte_ether/rte_eth_ctrl.h
index 4beb981..26b7b33 100644
--- a/lib/librte_ether/rte_eth_ctrl.h
+++ b/lib/librte_ether/rte_eth_ctrl.h
@@ -335,10 +335,8 @@ struct rte_eth_tcpv4_flow {
  */
 struct rte_eth_sctpv4_flow {
 	struct rte_eth_ipv4_flow ip; /**< IPv4 fields to match. */
-#ifdef RTE_NEXT_ABI
 	uint16_t src_port;           /**< SCTP source port to match. */
 	uint16_t dst_port;           /**< SCTP destination port to match. */
-#endif
 	uint32_t verify_tag;         /**< Verify tag to match */
 };
 
@@ -373,10 +371,8 @@ struct rte_eth_tcpv6_flow {
  */
 struct rte_eth_sctpv6_flow {
 	struct rte_eth_ipv6_flow ip; /**< IPv6 fields to match. */
-#ifdef RTE_NEXT_ABI
 	uint16_t src_port;           /**< SCTP source port to match. */
 	uint16_t dst_port;           /**< SCTP destination port to match. */
-#endif
 	uint32_t verify_tag;         /**< Verify tag to match */
 };
 
-- 
2.5.1

^ permalink raw reply	[relevance 15%]

* [dpdk-dev] [PATCH v2 03/10] mbuf: remove packet type from offload flags
  2015-09-02 13:16  3% ` [dpdk-dev] [PATCH v2 00/10] clean deprecated code Thomas Monjalon
  2015-09-02 13:16  5%   ` [dpdk-dev] [PATCH v2 01/10] doc: init next release notes Thomas Monjalon
  2015-09-02 13:16  7%   ` [dpdk-dev] [PATCH v2 02/10] ethdev: remove Rx interrupt switch Thomas Monjalon
@ 2015-09-02 13:16  4%   ` Thomas Monjalon
  2015-09-02 13:16 15%   ` [dpdk-dev] [PATCH v2 04/10] ethdev: remove SCTP flow entries switch Thomas Monjalon
  2015-09-02 13:16  4%   ` [dpdk-dev] [PATCH v2 05/10] eal: remove deprecated function Thomas Monjalon
  4 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-09-02 13:16 UTC (permalink / raw)
  To: dev

The extended unified packet type is now part of the standard ABI.
As mbuf struct is changed, the mbuf library version is incremented.

Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
---
 app/test-pipeline/pipeline_hash.c                  |  12 -
 app/test-pmd/csumonly.c                            |  14 -
 app/test-pmd/rxonly.c                              |  16 --
 app/test/packet_burst_generator.c                  |  12 -
 doc/guides/rel_notes/deprecation.rst               |   5 -
 doc/guides/rel_notes/release_2_2.rst               |   5 +-
 drivers/net/cxgbe/sge.c                            |  16 --
 drivers/net/e1000/igb_rxtx.c                       |  34 ---
 drivers/net/enic/enic_main.c                       |  25 --
 drivers/net/fm10k/fm10k_rxtx.c                     |  15 --
 drivers/net/i40e/i40e_rxtx.c                       | 293 ---------------------
 drivers/net/ixgbe/ixgbe_rxtx.c                     |  87 ------
 drivers/net/ixgbe/ixgbe_rxtx_vec.c                 | 111 --------
 drivers/net/mlx4/mlx4.c                            |  29 --
 drivers/net/vmxnet3/vmxnet3_rxtx.c                 |   8 -
 examples/ip_fragmentation/main.c                   |  10 -
 examples/ip_reassembly/main.c                      |  10 -
 examples/l3fwd-acl/main.c                          |  27 --
 examples/l3fwd-power/main.c                        |   9 -
 examples/l3fwd/main.c                              | 114 --------
 examples/tep_termination/vxlan.c                   |   5 -
 .../linuxapp/eal/include/exec-env/rte_kni_common.h |   6 -
 lib/librte_mbuf/Makefile                           |   2 +-
 lib/librte_mbuf/rte_mbuf.c                         |  10 -
 lib/librte_mbuf/rte_mbuf.h                         |  28 +-
 25 files changed, 6 insertions(+), 897 deletions(-)

diff --git a/app/test-pipeline/pipeline_hash.c b/app/test-pipeline/pipeline_hash.c
index aa3f9e5..548615f 100644
--- a/app/test-pipeline/pipeline_hash.c
+++ b/app/test-pipeline/pipeline_hash.c
@@ -459,33 +459,21 @@ app_main_loop_rx_metadata(void) {
 			signature = RTE_MBUF_METADATA_UINT32_PTR(m, 0);
 			key = RTE_MBUF_METADATA_UINT8_PTR(m, 32);
 
-#ifdef RTE_NEXT_ABI
 			if (RTE_ETH_IS_IPV4_HDR(m->packet_type)) {
-#else
-			if (m->ol_flags & PKT_RX_IPV4_HDR) {
-#endif
 				ip_hdr = (struct ipv4_hdr *)
 					&m_data[sizeof(struct ether_hdr)];
 				ip_dst = ip_hdr->dst_addr;
 
 				k32 = (uint32_t *) key;
 				k32[0] = ip_dst & 0xFFFFFF00;
-#ifdef RTE_NEXT_ABI
 			} else if (RTE_ETH_IS_IPV6_HDR(m->packet_type)) {
-#else
-			} else {
-#endif
 				ipv6_hdr = (struct ipv6_hdr *)
 					&m_data[sizeof(struct ether_hdr)];
 				ipv6_dst = ipv6_hdr->dst_addr;
 
 				memcpy(key, ipv6_dst, 16);
-#ifdef RTE_NEXT_ABI
 			} else
 				continue;
-#else
-			}
-#endif
 
 			*signature = test_hash(key, 0, 0);
 		}
diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c
index 1bf3485..e561dde 100644
--- a/app/test-pmd/csumonly.c
+++ b/app/test-pmd/csumonly.c
@@ -202,14 +202,9 @@ parse_ethernet(struct ether_hdr *eth_hdr, struct testpmd_offload_info *info)
 
 /* Parse a vxlan header */
 static void
-#ifdef RTE_NEXT_ABI
 parse_vxlan(struct udp_hdr *udp_hdr,
 	    struct testpmd_offload_info *info,
 	    uint32_t pkt_type)
-#else
-parse_vxlan(struct udp_hdr *udp_hdr, struct testpmd_offload_info *info,
-	uint64_t mbuf_olflags)
-#endif
 {
 	struct ether_hdr *eth_hdr;
 
@@ -217,12 +212,7 @@ parse_vxlan(struct udp_hdr *udp_hdr, struct testpmd_offload_info *info,
 	 * (rfc7348) or that the rx offload flag is set (i40e only
 	 * currently) */
 	if (udp_hdr->dst_port != _htons(4789) &&
-#ifdef RTE_NEXT_ABI
 		RTE_ETH_IS_TUNNEL_PKT(pkt_type) == 0)
-#else
-		(mbuf_olflags & (PKT_RX_TUNNEL_IPV4_HDR |
-			PKT_RX_TUNNEL_IPV6_HDR)) == 0)
-#endif
 		return;
 
 	info->is_tunnel = 1;
@@ -559,11 +549,7 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
 				struct udp_hdr *udp_hdr;
 				udp_hdr = (struct udp_hdr *)((char *)l3_hdr +
 					info.l3_len);
-#ifdef RTE_NEXT_ABI
 				parse_vxlan(udp_hdr, &info, m->packet_type);
-#else
-				parse_vxlan(udp_hdr, &info, m->ol_flags);
-#endif
 			} else if (info.l4_proto == IPPROTO_GRE) {
 				struct simple_gre_hdr *gre_hdr;
 				gre_hdr = (struct simple_gre_hdr *)
diff --git a/app/test-pmd/rxonly.c b/app/test-pmd/rxonly.c
index ee7fd8d..14555ab 100644
--- a/app/test-pmd/rxonly.c
+++ b/app/test-pmd/rxonly.c
@@ -91,11 +91,7 @@ pkt_burst_receive(struct fwd_stream *fs)
 	uint64_t ol_flags;
 	uint16_t nb_rx;
 	uint16_t i, packet_type;
-#ifdef RTE_NEXT_ABI
 	uint16_t is_encapsulation;
-#else
-	uint64_t is_encapsulation;
-#endif
 
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
 	uint64_t start_tsc;
@@ -138,13 +134,7 @@ pkt_burst_receive(struct fwd_stream *fs)
 		eth_type = RTE_BE_TO_CPU_16(eth_hdr->ether_type);
 		ol_flags = mb->ol_flags;
 		packet_type = mb->packet_type;
-
-#ifdef RTE_NEXT_ABI
 		is_encapsulation = RTE_ETH_IS_TUNNEL_PKT(packet_type);
-#else
-		is_encapsulation = ol_flags & (PKT_RX_TUNNEL_IPV4_HDR |
-				PKT_RX_TUNNEL_IPV6_HDR);
-#endif
 
 		print_ether_addr("  src=", &eth_hdr->s_addr);
 		print_ether_addr(" - dst=", &eth_hdr->d_addr);
@@ -171,7 +161,6 @@ pkt_burst_receive(struct fwd_stream *fs)
 		if (ol_flags & PKT_RX_QINQ_PKT)
 			printf(" - QinQ VLAN tci=0x%x, VLAN tci outer=0x%x",
 					mb->vlan_tci, mb->vlan_tci_outer);
-#ifdef RTE_NEXT_ABI
 		if (mb->packet_type) {
 			uint32_t ptype;
 
@@ -341,7 +330,6 @@ pkt_burst_receive(struct fwd_stream *fs)
 			printf("\n");
 		} else
 			printf("Unknown packet type\n");
-#endif /* RTE_NEXT_ABI */
 		if (is_encapsulation) {
 			struct ipv4_hdr *ipv4_hdr;
 			struct ipv6_hdr *ipv6_hdr;
@@ -355,11 +343,7 @@ pkt_burst_receive(struct fwd_stream *fs)
 			l2_len  = sizeof(struct ether_hdr);
 
 			 /* Do not support ipv4 option field */
-#ifdef RTE_NEXT_ABI
 			if (RTE_ETH_IS_IPV4_HDR(packet_type)) {
-#else
-			if (ol_flags & PKT_RX_TUNNEL_IPV4_HDR) {
-#endif
 				l3_len = sizeof(struct ipv4_hdr);
 				ipv4_hdr = rte_pktmbuf_mtod_offset(mb,
 								   struct ipv4_hdr *,
diff --git a/app/test/packet_burst_generator.c b/app/test/packet_burst_generator.c
index d9d808b..a93c3b5 100644
--- a/app/test/packet_burst_generator.c
+++ b/app/test/packet_burst_generator.c
@@ -273,21 +273,9 @@ nomore_mbuf:
 		if (ipv4) {
 			pkt->vlan_tci  = ETHER_TYPE_IPv4;
 			pkt->l3_len = sizeof(struct ipv4_hdr);
-#ifndef RTE_NEXT_ABI
-			if (vlan_enabled)
-				pkt->ol_flags = PKT_RX_IPV4_HDR | PKT_RX_VLAN_PKT;
-			else
-				pkt->ol_flags = PKT_RX_IPV4_HDR;
-#endif
 		} else {
 			pkt->vlan_tci  = ETHER_TYPE_IPv6;
 			pkt->l3_len = sizeof(struct ipv6_hdr);
-#ifndef RTE_NEXT_ABI
-			if (vlan_enabled)
-				pkt->ol_flags = PKT_RX_IPV6_HDR | PKT_RX_VLAN_PKT;
-			else
-				pkt->ol_flags = PKT_RX_IPV6_HDR;
-#endif
 		}
 
 		pkts_burst[nb_pkt] = pkt;
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 991a777..639ab18 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -24,11 +24,6 @@ Deprecation Notices
 * The field mem_location of the rte_lpm structure is deprecated and should be
   removed as well as the macros RTE_LPM_HEAP and RTE_LPM_MEMZONE.
 
-* Significant ABI changes are planned for struct rte_mbuf, struct rte_kni_mbuf,
-  and several ``PKT_RX_`` flags will be removed, to support unified packet type
-  from release 2.1. Those changes may be enabled in the upcoming release 2.1
-  with CONFIG_RTE_NEXT_ABI.
-
 * librte_malloc library has been integrated into librte_eal. The 2.1 release
   creates a dummy/empty malloc library to fulfill binaries with dynamic linking
   dependencies on librte_malloc.so. Such dummy library will not be created from
diff --git a/doc/guides/rel_notes/release_2_2.rst b/doc/guides/rel_notes/release_2_2.rst
index 388d2e3..3a6d2cc 100644
--- a/doc/guides/rel_notes/release_2_2.rst
+++ b/doc/guides/rel_notes/release_2_2.rst
@@ -23,6 +23,9 @@ ABI Changes
 * The EAL and ethdev structures rte_intr_handle and rte_eth_conf were changed
   to support Rx interrupt. It was already done in 2.1 for CONFIG_RTE_NEXT_ABI.
 
+* The mbuf structure was changed to support unified packet type.
+  It was already done in 2.1 for CONFIG_RTE_NEXT_ABI.
+
 
 Shared Library Versions
 -----------------------
@@ -45,7 +48,7 @@ The libraries prepended with a plus sign were incremented in this version.
      librte_kvargs.so.1
      librte_lpm.so.1
      librte_malloc.so.1
-     librte_mbuf.so.1
+   + librte_mbuf.so.2
      librte_mempool.so.1
      librte_meter.so.1
      librte_pipeline.so.1
diff --git a/drivers/net/cxgbe/sge.c b/drivers/net/cxgbe/sge.c
index d570d33..6eb1244 100644
--- a/drivers/net/cxgbe/sge.c
+++ b/drivers/net/cxgbe/sge.c
@@ -1299,22 +1299,14 @@ int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp,
 
 	mbuf->port = pkt->iff;
 	if (pkt->l2info & htonl(F_RXF_IP)) {
-#ifdef RTE_NEXT_ABI
 		mbuf->packet_type = RTE_PTYPE_L3_IPV4;
-#else
-		mbuf->ol_flags |= PKT_RX_IPV4_HDR;
-#endif
 		if (unlikely(!csum_ok))
 			mbuf->ol_flags |= PKT_RX_IP_CKSUM_BAD;
 
 		if ((pkt->l2info & htonl(F_RXF_UDP | F_RXF_TCP)) && !csum_ok)
 			mbuf->ol_flags |= PKT_RX_L4_CKSUM_BAD;
 	} else if (pkt->l2info & htonl(F_RXF_IP6)) {
-#ifdef RTE_NEXT_ABI
 		mbuf->packet_type = RTE_PTYPE_L3_IPV6;
-#else
-		mbuf->ol_flags |= PKT_RX_IPV6_HDR;
-#endif
 	}
 
 	mbuf->port = pkt->iff;
@@ -1419,11 +1411,7 @@ static int process_responses(struct sge_rspq *q, int budget,
 			unmap_rx_buf(&rxq->fl);
 
 			if (cpl->l2info & htonl(F_RXF_IP)) {
-#ifdef RTE_NEXT_ABI
 				pkt->packet_type = RTE_PTYPE_L3_IPV4;
-#else
-				pkt->ol_flags |= PKT_RX_IPV4_HDR;
-#endif
 				if (unlikely(!csum_ok))
 					pkt->ol_flags |= PKT_RX_IP_CKSUM_BAD;
 
@@ -1431,11 +1419,7 @@ static int process_responses(struct sge_rspq *q, int budget,
 				     htonl(F_RXF_UDP | F_RXF_TCP)) && !csum_ok)
 					pkt->ol_flags |= PKT_RX_L4_CKSUM_BAD;
 			} else if (cpl->l2info & htonl(F_RXF_IP6)) {
-#ifdef RTE_NEXT_ABI
 				pkt->packet_type = RTE_PTYPE_L3_IPV6;
-#else
-				pkt->ol_flags |= PKT_RX_IPV6_HDR;
-#endif
 			}
 
 			if (!rss_hdr->filter_tid && rss_hdr->hash_type) {
diff --git a/drivers/net/e1000/igb_rxtx.c b/drivers/net/e1000/igb_rxtx.c
index b13930e..19905fd 100644
--- a/drivers/net/e1000/igb_rxtx.c
+++ b/drivers/net/e1000/igb_rxtx.c
@@ -590,7 +590,6 @@ eth_igb_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
  *  RX functions
  *
  **********************************************************************/
-#ifdef RTE_NEXT_ABI
 #define IGB_PACKET_TYPE_IPV4              0X01
 #define IGB_PACKET_TYPE_IPV4_TCP          0X11
 #define IGB_PACKET_TYPE_IPV4_UDP          0X21
@@ -684,35 +683,6 @@ rx_desc_hlen_type_rss_to_pkt_flags(uint32_t hl_tp_rs)
 
 	return pkt_flags;
 }
-#else /* RTE_NEXT_ABI */
-static inline uint64_t
-rx_desc_hlen_type_rss_to_pkt_flags(uint32_t hl_tp_rs)
-{
-	uint64_t pkt_flags;
-
-	static uint64_t ip_pkt_types_map[16] = {
-		0, PKT_RX_IPV4_HDR, PKT_RX_IPV4_HDR_EXT, PKT_RX_IPV4_HDR_EXT,
-		PKT_RX_IPV6_HDR, 0, 0, 0,
-		PKT_RX_IPV6_HDR_EXT, 0, 0, 0,
-		PKT_RX_IPV6_HDR_EXT, 0, 0, 0,
-	};
-
-#if defined(RTE_LIBRTE_IEEE1588)
-	static uint32_t ip_pkt_etqf_map[8] = {
-		0, 0, 0, PKT_RX_IEEE1588_PTP,
-		0, 0, 0, 0,
-	};
-
-	pkt_flags = (hl_tp_rs & E1000_RXDADV_PKTTYPE_ETQF) ?
-				ip_pkt_etqf_map[(hl_tp_rs >> 4) & 0x07] :
-				ip_pkt_types_map[(hl_tp_rs >> 4) & 0x0F];
-#else
-	pkt_flags = (hl_tp_rs & E1000_RXDADV_PKTTYPE_ETQF) ? 0 :
-				ip_pkt_types_map[(hl_tp_rs >> 4) & 0x0F];
-#endif
-	return pkt_flags | (((hl_tp_rs & 0x0F) == 0) ?  0 : PKT_RX_RSS_HASH);
-}
-#endif /* RTE_NEXT_ABI */
 
 static inline uint64_t
 rx_desc_status_to_pkt_flags(uint32_t rx_status)
@@ -886,10 +856,8 @@ eth_igb_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 		pkt_flags = pkt_flags | rx_desc_status_to_pkt_flags(staterr);
 		pkt_flags = pkt_flags | rx_desc_error_to_pkt_flags(staterr);
 		rxm->ol_flags = pkt_flags;
-#ifdef RTE_NEXT_ABI
 		rxm->packet_type = igb_rxd_pkt_info_to_pkt_type(rxd.wb.lower.
 						lo_dword.hs_rss.pkt_info);
-#endif
 
 		/*
 		 * Store the mbuf address into the next entry of the array
@@ -1124,10 +1092,8 @@ eth_igb_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 		pkt_flags = pkt_flags | rx_desc_status_to_pkt_flags(staterr);
 		pkt_flags = pkt_flags | rx_desc_error_to_pkt_flags(staterr);
 		first_seg->ol_flags = pkt_flags;
-#ifdef RTE_NEXT_ABI
 		first_seg->packet_type = igb_rxd_pkt_info_to_pkt_type(rxd.wb.
 					lower.lo_dword.hs_rss.pkt_info);
-#endif
 
 		/* Prefetch data of first segment, if configured to do so. */
 		rte_packet_prefetch((char *)first_seg->buf_addr +
diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c
index f47e96c..3b8719f 100644
--- a/drivers/net/enic/enic_main.c
+++ b/drivers/net/enic/enic_main.c
@@ -423,11 +423,7 @@ static int enic_rq_indicate_buf(struct vnic_rq *rq,
 		rx_pkt->pkt_len = bytes_written;
 
 		if (ipv4) {
-#ifdef RTE_NEXT_ABI
 			rx_pkt->packet_type = RTE_PTYPE_L3_IPV4;
-#else
-			rx_pkt->ol_flags |= PKT_RX_IPV4_HDR;
-#endif
 			if (!csum_not_calc) {
 				if (unlikely(!ipv4_csum_ok))
 					rx_pkt->ol_flags |= PKT_RX_IP_CKSUM_BAD;
@@ -436,11 +432,7 @@ static int enic_rq_indicate_buf(struct vnic_rq *rq,
 					rx_pkt->ol_flags |= PKT_RX_L4_CKSUM_BAD;
 			}
 		} else if (ipv6)
-#ifdef RTE_NEXT_ABI
 			rx_pkt->packet_type = RTE_PTYPE_L3_IPV6;
-#else
-			rx_pkt->ol_flags |= PKT_RX_IPV6_HDR;
-#endif
 	} else {
 		/* Header split */
 		if (sop && !eop) {
@@ -453,11 +445,7 @@ static int enic_rq_indicate_buf(struct vnic_rq *rq,
 				*rx_pkt_bucket = rx_pkt;
 				rx_pkt->pkt_len = bytes_written;
 				if (ipv4) {
-#ifdef RTE_NEXT_ABI
 					rx_pkt->packet_type = RTE_PTYPE_L3_IPV4;
-#else
-					rx_pkt->ol_flags |= PKT_RX_IPV4_HDR;
-#endif
 					if (!csum_not_calc) {
 						if (unlikely(!ipv4_csum_ok))
 							rx_pkt->ol_flags |=
@@ -469,22 +457,14 @@ static int enic_rq_indicate_buf(struct vnic_rq *rq,
 							    PKT_RX_L4_CKSUM_BAD;
 					}
 				} else if (ipv6)
-#ifdef RTE_NEXT_ABI
 					rx_pkt->packet_type = RTE_PTYPE_L3_IPV6;
-#else
-					rx_pkt->ol_flags |= PKT_RX_IPV6_HDR;
-#endif
 			} else {
 				/* Payload */
 				hdr_rx_pkt = *rx_pkt_bucket;
 				hdr_rx_pkt->pkt_len += bytes_written;
 				if (ipv4) {
-#ifdef RTE_NEXT_ABI
 					hdr_rx_pkt->packet_type =
 						RTE_PTYPE_L3_IPV4;
-#else
-					hdr_rx_pkt->ol_flags |= PKT_RX_IPV4_HDR;
-#endif
 					if (!csum_not_calc) {
 						if (unlikely(!ipv4_csum_ok))
 							hdr_rx_pkt->ol_flags |=
@@ -496,13 +476,8 @@ static int enic_rq_indicate_buf(struct vnic_rq *rq,
 							    PKT_RX_L4_CKSUM_BAD;
 					}
 				} else if (ipv6)
-#ifdef RTE_NEXT_ABI
 					hdr_rx_pkt->packet_type =
 						RTE_PTYPE_L3_IPV6;
-#else
-					hdr_rx_pkt->ol_flags |= PKT_RX_IPV6_HDR;
-#endif
-
 			}
 		}
 	}
diff --git a/drivers/net/fm10k/fm10k_rxtx.c b/drivers/net/fm10k/fm10k_rxtx.c
index b5fa2e6..d3f7b89 100644
--- a/drivers/net/fm10k/fm10k_rxtx.c
+++ b/drivers/net/fm10k/fm10k_rxtx.c
@@ -68,7 +68,6 @@ static inline void dump_rxd(union fm10k_rx_desc *rxd)
 static inline void
 rx_desc_to_ol_flags(struct rte_mbuf *m, const union fm10k_rx_desc *d)
 {
-#ifdef RTE_NEXT_ABI
 	static const uint32_t
 		ptype_table[FM10K_RXD_PKTTYPE_MASK >> FM10K_RXD_PKTTYPE_SHIFT]
 			__rte_cache_aligned = {
@@ -91,14 +90,6 @@ rx_desc_to_ol_flags(struct rte_mbuf *m, const union fm10k_rx_desc *d)
 
 	m->packet_type = ptype_table[(d->w.pkt_info & FM10K_RXD_PKTTYPE_MASK)
 						>> FM10K_RXD_PKTTYPE_SHIFT];
-#else /* RTE_NEXT_ABI */
-	uint16_t ptype;
-	static const uint16_t pt_lut[] = { 0,
-		PKT_RX_IPV4_HDR, PKT_RX_IPV4_HDR_EXT,
-		PKT_RX_IPV6_HDR, PKT_RX_IPV6_HDR_EXT,
-		0, 0, 0
-	};
-#endif /* RTE_NEXT_ABI */
 
 	if (d->w.pkt_info & FM10K_RXD_RSSTYPE_MASK)
 		m->ol_flags |= PKT_RX_RSS_HASH;
@@ -121,12 +112,6 @@ rx_desc_to_ol_flags(struct rte_mbuf *m, const union fm10k_rx_desc *d)
 
 	if (unlikely(d->d.staterr & FM10K_RXD_STATUS_RXE))
 		m->ol_flags |= PKT_RX_RECIP_ERR;
-
-#ifndef RTE_NEXT_ABI
-	ptype = (d->d.data & FM10K_RXD_PKTTYPE_MASK_L3) >>
-						FM10K_RXD_PKTTYPE_SHIFT;
-	m->ol_flags |= pt_lut[(uint8_t)ptype];
-#endif
 }
 
 uint16_t
diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index eae4ab0..fd656d5 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -188,11 +188,9 @@ i40e_get_iee15888_flags(struct rte_mbuf *mb, uint64_t qword)
 				  | I40E_RXD_QW1_STATUS_TSYNINDX_MASK))
 				    >> I40E_RX_DESC_STATUS_TSYNINDX_SHIFT;
 
-#ifdef RTE_NEXT_ABI
 	if ((mb->packet_type & RTE_PTYPE_L2_MASK)
 			== RTE_PTYPE_L2_ETHER_TIMESYNC)
 		pkt_flags = PKT_RX_IEEE1588_PTP;
-#endif
 	if (tsyn & 0x04) {
 		pkt_flags |= PKT_RX_IEEE1588_TMST;
 		mb->timesync = tsyn & 0x03;
@@ -202,7 +200,6 @@ i40e_get_iee15888_flags(struct rte_mbuf *mb, uint64_t qword)
 }
 #endif
 
-#ifdef RTE_NEXT_ABI
 /* For each value it means, datasheet of hardware can tell more details */
 static inline uint32_t
 i40e_rxd_pkt_type_mapping(uint8_t ptype)
@@ -735,275 +732,6 @@ i40e_rxd_pkt_type_mapping(uint8_t ptype)
 
 	return ptype_table[ptype];
 }
-#else /* RTE_NEXT_ABI */
-/* Translate pkt types to pkt flags */
-static inline uint64_t
-i40e_rxd_ptype_to_pkt_flags(uint64_t qword)
-{
-	uint8_t ptype = (uint8_t)((qword & I40E_RXD_QW1_PTYPE_MASK) >>
-					I40E_RXD_QW1_PTYPE_SHIFT);
-	static const uint64_t ip_ptype_map[I40E_MAX_PKT_TYPE] = {
-		0, /* PTYPE 0 */
-		0, /* PTYPE 1 */
-		PKT_RX_IEEE1588_PTP, /* PTYPE 2 */
-		0, /* PTYPE 3 */
-		0, /* PTYPE 4 */
-		0, /* PTYPE 5 */
-		0, /* PTYPE 6 */
-		0, /* PTYPE 7 */
-		0, /* PTYPE 8 */
-		0, /* PTYPE 9 */
-		0, /* PTYPE 10 */
-		0, /* PTYPE 11 */
-		0, /* PTYPE 12 */
-		0, /* PTYPE 13 */
-		0, /* PTYPE 14 */
-		0, /* PTYPE 15 */
-		0, /* PTYPE 16 */
-		0, /* PTYPE 17 */
-		0, /* PTYPE 18 */
-		0, /* PTYPE 19 */
-		0, /* PTYPE 20 */
-		0, /* PTYPE 21 */
-		PKT_RX_IPV4_HDR, /* PTYPE 22 */
-		PKT_RX_IPV4_HDR, /* PTYPE 23 */
-		PKT_RX_IPV4_HDR, /* PTYPE 24 */
-		0, /* PTYPE 25 */
-		PKT_RX_IPV4_HDR, /* PTYPE 26 */
-		PKT_RX_IPV4_HDR, /* PTYPE 27 */
-		PKT_RX_IPV4_HDR, /* PTYPE 28 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 29 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 30 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 31 */
-		0, /* PTYPE 32 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 33 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 34 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 35 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 36 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 37 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 38 */
-		0, /* PTYPE 39 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 40 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 41 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 42 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 43 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 44 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 45 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 46 */
-		0, /* PTYPE 47 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 48 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 49 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 50 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 51 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 52 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 53 */
-		0, /* PTYPE 54 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 55 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 56 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 57 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 58 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 59 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 60 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 61 */
-		0, /* PTYPE 62 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 63 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 64 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 65 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 66 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 67 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 68 */
-		0, /* PTYPE 69 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 70 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 71 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 72 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 73 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 74 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 75 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 76 */
-		0, /* PTYPE 77 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 78 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 79 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 80 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 81 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 82 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 83 */
-		0, /* PTYPE 84 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 85 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 86 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 87 */
-		PKT_RX_IPV6_HDR, /* PTYPE 88 */
-		PKT_RX_IPV6_HDR, /* PTYPE 89 */
-		PKT_RX_IPV6_HDR, /* PTYPE 90 */
-		0, /* PTYPE 91 */
-		PKT_RX_IPV6_HDR, /* PTYPE 92 */
-		PKT_RX_IPV6_HDR, /* PTYPE 93 */
-		PKT_RX_IPV6_HDR, /* PTYPE 94 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 95 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 96 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 97 */
-		0, /* PTYPE 98 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 99 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 100 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 101 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 102 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 103 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 104 */
-		0, /* PTYPE 105 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 106 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 107 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 108 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 109 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 110 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 111 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 112 */
-		0, /* PTYPE 113 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 114 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 115 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 116 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 117 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 118 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 119 */
-		0, /* PTYPE 120 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 121 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 122 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 123 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 124 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 125 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 126 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 127 */
-		0, /* PTYPE 128 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 129 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 130 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 131 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 132 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 133 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 134 */
-		0, /* PTYPE 135 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 136 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 137 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 138 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 139 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 140 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 141 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 142 */
-		0, /* PTYPE 143 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 144 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 145 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 146 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 147 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 148 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 149 */
-		0, /* PTYPE 150 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 151 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 152 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 153 */
-		0, /* PTYPE 154 */
-		0, /* PTYPE 155 */
-		0, /* PTYPE 156 */
-		0, /* PTYPE 157 */
-		0, /* PTYPE 158 */
-		0, /* PTYPE 159 */
-		0, /* PTYPE 160 */
-		0, /* PTYPE 161 */
-		0, /* PTYPE 162 */
-		0, /* PTYPE 163 */
-		0, /* PTYPE 164 */
-		0, /* PTYPE 165 */
-		0, /* PTYPE 166 */
-		0, /* PTYPE 167 */
-		0, /* PTYPE 168 */
-		0, /* PTYPE 169 */
-		0, /* PTYPE 170 */
-		0, /* PTYPE 171 */
-		0, /* PTYPE 172 */
-		0, /* PTYPE 173 */
-		0, /* PTYPE 174 */
-		0, /* PTYPE 175 */
-		0, /* PTYPE 176 */
-		0, /* PTYPE 177 */
-		0, /* PTYPE 178 */
-		0, /* PTYPE 179 */
-		0, /* PTYPE 180 */
-		0, /* PTYPE 181 */
-		0, /* PTYPE 182 */
-		0, /* PTYPE 183 */
-		0, /* PTYPE 184 */
-		0, /* PTYPE 185 */
-		0, /* PTYPE 186 */
-		0, /* PTYPE 187 */
-		0, /* PTYPE 188 */
-		0, /* PTYPE 189 */
-		0, /* PTYPE 190 */
-		0, /* PTYPE 191 */
-		0, /* PTYPE 192 */
-		0, /* PTYPE 193 */
-		0, /* PTYPE 194 */
-		0, /* PTYPE 195 */
-		0, /* PTYPE 196 */
-		0, /* PTYPE 197 */
-		0, /* PTYPE 198 */
-		0, /* PTYPE 199 */
-		0, /* PTYPE 200 */
-		0, /* PTYPE 201 */
-		0, /* PTYPE 202 */
-		0, /* PTYPE 203 */
-		0, /* PTYPE 204 */
-		0, /* PTYPE 205 */
-		0, /* PTYPE 206 */
-		0, /* PTYPE 207 */
-		0, /* PTYPE 208 */
-		0, /* PTYPE 209 */
-		0, /* PTYPE 210 */
-		0, /* PTYPE 211 */
-		0, /* PTYPE 212 */
-		0, /* PTYPE 213 */
-		0, /* PTYPE 214 */
-		0, /* PTYPE 215 */
-		0, /* PTYPE 216 */
-		0, /* PTYPE 217 */
-		0, /* PTYPE 218 */
-		0, /* PTYPE 219 */
-		0, /* PTYPE 220 */
-		0, /* PTYPE 221 */
-		0, /* PTYPE 222 */
-		0, /* PTYPE 223 */
-		0, /* PTYPE 224 */
-		0, /* PTYPE 225 */
-		0, /* PTYPE 226 */
-		0, /* PTYPE 227 */
-		0, /* PTYPE 228 */
-		0, /* PTYPE 229 */
-		0, /* PTYPE 230 */
-		0, /* PTYPE 231 */
-		0, /* PTYPE 232 */
-		0, /* PTYPE 233 */
-		0, /* PTYPE 234 */
-		0, /* PTYPE 235 */
-		0, /* PTYPE 236 */
-		0, /* PTYPE 237 */
-		0, /* PTYPE 238 */
-		0, /* PTYPE 239 */
-		0, /* PTYPE 240 */
-		0, /* PTYPE 241 */
-		0, /* PTYPE 242 */
-		0, /* PTYPE 243 */
-		0, /* PTYPE 244 */
-		0, /* PTYPE 245 */
-		0, /* PTYPE 246 */
-		0, /* PTYPE 247 */
-		0, /* PTYPE 248 */
-		0, /* PTYPE 249 */
-		0, /* PTYPE 250 */
-		0, /* PTYPE 251 */
-		0, /* PTYPE 252 */
-		0, /* PTYPE 253 */
-		0, /* PTYPE 254 */
-		0, /* PTYPE 255 */
-	};
-
-	return ip_ptype_map[ptype];
-}
-#endif /* RTE_NEXT_ABI */
 
 #define I40E_RX_DESC_EXT_STATUS_FLEXBH_MASK   0x03
 #define I40E_RX_DESC_EXT_STATUS_FLEXBH_FD_ID  0x01
@@ -1292,18 +1020,10 @@ i40e_rx_scan_hw_ring(struct i40e_rx_queue *rxq)
 			i40e_rxd_to_vlan_tci(mb, &rxdp[j]);
 			pkt_flags = i40e_rxd_status_to_pkt_flags(qword1);
 			pkt_flags |= i40e_rxd_error_to_pkt_flags(qword1);
-#ifdef RTE_NEXT_ABI
 			mb->packet_type =
 				i40e_rxd_pkt_type_mapping((uint8_t)((qword1 &
 						I40E_RXD_QW1_PTYPE_MASK) >>
 						I40E_RXD_QW1_PTYPE_SHIFT));
-#else
-			pkt_flags |= i40e_rxd_ptype_to_pkt_flags(qword1);
-
-			mb->packet_type = (uint16_t)((qword1 &
-					I40E_RXD_QW1_PTYPE_MASK) >>
-					I40E_RXD_QW1_PTYPE_SHIFT);
-#endif /* RTE_NEXT_ABI */
 			if (pkt_flags & PKT_RX_RSS_HASH)
 				mb->hash.rss = rte_le_to_cpu_32(\
 					rxdp[j].wb.qword0.hi_dword.rss);
@@ -1549,15 +1269,9 @@ i40e_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 		i40e_rxd_to_vlan_tci(rxm, &rxd);
 		pkt_flags = i40e_rxd_status_to_pkt_flags(qword1);
 		pkt_flags |= i40e_rxd_error_to_pkt_flags(qword1);
-#ifdef RTE_NEXT_ABI
 		rxm->packet_type =
 			i40e_rxd_pkt_type_mapping((uint8_t)((qword1 &
 			I40E_RXD_QW1_PTYPE_MASK) >> I40E_RXD_QW1_PTYPE_SHIFT));
-#else
-		pkt_flags |= i40e_rxd_ptype_to_pkt_flags(qword1);
-		rxm->packet_type = (uint16_t)((qword1 & I40E_RXD_QW1_PTYPE_MASK) >>
-				I40E_RXD_QW1_PTYPE_SHIFT);
-#endif /* RTE_NEXT_ABI */
 		if (pkt_flags & PKT_RX_RSS_HASH)
 			rxm->hash.rss =
 				rte_le_to_cpu_32(rxd.wb.qword0.hi_dword.rss);
@@ -1717,16 +1431,9 @@ i40e_recv_scattered_pkts(void *rx_queue,
 		i40e_rxd_to_vlan_tci(first_seg, &rxd);
 		pkt_flags = i40e_rxd_status_to_pkt_flags(qword1);
 		pkt_flags |= i40e_rxd_error_to_pkt_flags(qword1);
-#ifdef RTE_NEXT_ABI
 		first_seg->packet_type =
 			i40e_rxd_pkt_type_mapping((uint8_t)((qword1 &
 			I40E_RXD_QW1_PTYPE_MASK) >> I40E_RXD_QW1_PTYPE_SHIFT));
-#else
-		pkt_flags |= i40e_rxd_ptype_to_pkt_flags(qword1);
-		first_seg->packet_type = (uint16_t)((qword1 &
-					I40E_RXD_QW1_PTYPE_MASK) >>
-					I40E_RXD_QW1_PTYPE_SHIFT);
-#endif /* RTE_NEXT_ABI */
 		if (pkt_flags & PKT_RX_RSS_HASH)
 			rxm->hash.rss =
 				rte_le_to_cpu_32(rxd.wb.qword0.hi_dword.rss);
diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c
index 91023b9..a710102 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx.c
@@ -864,7 +864,6 @@ end_of_tx:
  *  RX functions
  *
  **********************************************************************/
-#ifdef RTE_NEXT_ABI
 #define IXGBE_PACKET_TYPE_IPV4              0X01
 #define IXGBE_PACKET_TYPE_IPV4_TCP          0X11
 #define IXGBE_PACKET_TYPE_IPV4_UDP          0X21
@@ -967,43 +966,6 @@ ixgbe_rxd_pkt_info_to_pkt_flags(uint16_t pkt_info)
 	return ip_rss_types_map[pkt_info & 0XF];
 #endif
 }
-#else /* RTE_NEXT_ABI */
-static inline uint64_t
-rx_desc_hlen_type_rss_to_pkt_flags(uint32_t hl_tp_rs)
-{
-	uint64_t pkt_flags;
-
-	static const uint64_t ip_pkt_types_map[16] = {
-		0, PKT_RX_IPV4_HDR, PKT_RX_IPV4_HDR_EXT, PKT_RX_IPV4_HDR_EXT,
-		PKT_RX_IPV6_HDR, 0, 0, 0,
-		PKT_RX_IPV6_HDR_EXT, 0, 0, 0,
-		PKT_RX_IPV6_HDR_EXT, 0, 0, 0,
-	};
-
-	static const uint64_t ip_rss_types_map[16] = {
-		0, PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, PKT_RX_RSS_HASH,
-		0, PKT_RX_RSS_HASH, 0, PKT_RX_RSS_HASH,
-		PKT_RX_RSS_HASH, 0, 0, 0,
-		0, 0, 0,  PKT_RX_FDIR,
-	};
-
-#ifdef RTE_LIBRTE_IEEE1588
-	static uint64_t ip_pkt_etqf_map[8] = {
-		0, 0, 0, PKT_RX_IEEE1588_PTP,
-		0, 0, 0, 0,
-	};
-
-	pkt_flags = (hl_tp_rs & IXGBE_RXDADV_PKTTYPE_ETQF) ?
-			ip_pkt_etqf_map[(hl_tp_rs >> 4) & 0x07] :
-			ip_pkt_types_map[(hl_tp_rs >> 4) & 0x0F];
-#else
-	pkt_flags = (hl_tp_rs & IXGBE_RXDADV_PKTTYPE_ETQF) ? 0 :
-			ip_pkt_types_map[(hl_tp_rs >> 4) & 0x0F];
-
-#endif
-	return pkt_flags | ip_rss_types_map[hl_tp_rs & 0xF];
-}
-#endif /* RTE_NEXT_ABI */
 
 static inline uint64_t
 rx_desc_status_to_pkt_flags(uint32_t rx_status)
@@ -1058,13 +1020,9 @@ ixgbe_rx_scan_hw_ring(struct ixgbe_rx_queue *rxq)
 	struct rte_mbuf *mb;
 	uint16_t pkt_len;
 	uint64_t pkt_flags;
-#ifdef RTE_NEXT_ABI
 	int nb_dd;
 	uint32_t s[LOOK_AHEAD];
 	uint16_t pkt_info[LOOK_AHEAD];
-#else
-	int s[LOOK_AHEAD], nb_dd;
-#endif /* RTE_NEXT_ABI */
 	int i, j, nb_rx = 0;
 	uint32_t status;
 
@@ -1088,11 +1046,9 @@ ixgbe_rx_scan_hw_ring(struct ixgbe_rx_queue *rxq)
 		for (j = LOOK_AHEAD-1; j >= 0; --j)
 			s[j] = rte_le_to_cpu_32(rxdp[j].wb.upper.status_error);
 
-#ifdef RTE_NEXT_ABI
 		for (j = LOOK_AHEAD - 1; j >= 0; --j)
 			pkt_info[j] = rxdp[j].wb.lower.lo_dword.
 						hs_rss.pkt_info;
-#endif /* RTE_NEXT_ABI */
 
 		/* Compute how many status bits were set */
 		nb_dd = 0;
@@ -1111,7 +1067,6 @@ ixgbe_rx_scan_hw_ring(struct ixgbe_rx_queue *rxq)
 			mb->vlan_tci = rte_le_to_cpu_16(rxdp[j].wb.upper.vlan);
 
 			/* convert descriptor fields to rte mbuf flags */
-#ifdef RTE_NEXT_ABI
 			pkt_flags = rx_desc_status_to_pkt_flags(s[j]);
 			pkt_flags |= rx_desc_error_to_pkt_flags(s[j]);
 			pkt_flags |=
@@ -1119,15 +1074,6 @@ ixgbe_rx_scan_hw_ring(struct ixgbe_rx_queue *rxq)
 			mb->ol_flags = pkt_flags;
 			mb->packet_type =
 				ixgbe_rxd_pkt_info_to_pkt_type(pkt_info[j]);
-#else /* RTE_NEXT_ABI */
-			pkt_flags  = rx_desc_hlen_type_rss_to_pkt_flags(
-					rte_le_to_cpu_32(
-					rxdp[j].wb.lower.lo_dword.data));
-			/* reuse status field from scan list */
-			pkt_flags |= rx_desc_status_to_pkt_flags(s[j]);
-			pkt_flags |= rx_desc_error_to_pkt_flags(s[j]);
-			mb->ol_flags = pkt_flags;
-#endif /* RTE_NEXT_ABI */
 
 			if (likely(pkt_flags & PKT_RX_RSS_HASH))
 				mb->hash.rss = rte_le_to_cpu_32(
@@ -1328,11 +1274,7 @@ ixgbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 	union ixgbe_adv_rx_desc rxd;
 	uint64_t dma_addr;
 	uint32_t staterr;
-#ifdef RTE_NEXT_ABI
 	uint32_t pkt_info;
-#else
-	uint32_t hlen_type_rss;
-#endif
 	uint16_t pkt_len;
 	uint16_t rx_id;
 	uint16_t nb_rx;
@@ -1450,7 +1392,6 @@ ixgbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 		rxm->data_len = pkt_len;
 		rxm->port = rxq->port_id;
 
-#ifdef RTE_NEXT_ABI
 		pkt_info = rte_le_to_cpu_32(rxd.wb.lower.lo_dword.hs_rss.
 								pkt_info);
 		/* Only valid if PKT_RX_VLAN_PKT set in pkt_flags */
@@ -1462,16 +1403,6 @@ ixgbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 			ixgbe_rxd_pkt_info_to_pkt_flags(pkt_info);
 		rxm->ol_flags = pkt_flags;
 		rxm->packet_type = ixgbe_rxd_pkt_info_to_pkt_type(pkt_info);
-#else /* RTE_NEXT_ABI */
-		hlen_type_rss = rte_le_to_cpu_32(rxd.wb.lower.lo_dword.data);
-		/* Only valid if PKT_RX_VLAN_PKT set in pkt_flags */
-		rxm->vlan_tci = rte_le_to_cpu_16(rxd.wb.upper.vlan);
-
-		pkt_flags = rx_desc_hlen_type_rss_to_pkt_flags(hlen_type_rss);
-		pkt_flags = pkt_flags | rx_desc_status_to_pkt_flags(staterr);
-		pkt_flags = pkt_flags | rx_desc_error_to_pkt_flags(staterr);
-		rxm->ol_flags = pkt_flags;
-#endif /* RTE_NEXT_ABI */
 
 		if (likely(pkt_flags & PKT_RX_RSS_HASH))
 			rxm->hash.rss = rte_le_to_cpu_32(
@@ -1547,7 +1478,6 @@ ixgbe_fill_cluster_head_buf(
 	uint8_t port_id,
 	uint32_t staterr)
 {
-#ifdef RTE_NEXT_ABI
 	uint16_t pkt_info;
 	uint64_t pkt_flags;
 
@@ -1563,23 +1493,6 @@ ixgbe_fill_cluster_head_buf(
 	pkt_flags |= ixgbe_rxd_pkt_info_to_pkt_flags(pkt_info);
 	head->ol_flags = pkt_flags;
 	head->packet_type = ixgbe_rxd_pkt_info_to_pkt_type(pkt_info);
-#else /* RTE_NEXT_ABI */
-	uint32_t hlen_type_rss;
-	uint64_t pkt_flags;
-
-	head->port = port_id;
-
-	/*
-	 * The vlan_tci field is only valid when PKT_RX_VLAN_PKT is
-	 * set in the pkt_flags field.
-	 */
-	head->vlan_tci = rte_le_to_cpu_16(desc->wb.upper.vlan);
-	hlen_type_rss = rte_le_to_cpu_32(desc->wb.lower.lo_dword.data);
-	pkt_flags = rx_desc_hlen_type_rss_to_pkt_flags(hlen_type_rss);
-	pkt_flags |= rx_desc_status_to_pkt_flags(staterr);
-	pkt_flags |= rx_desc_error_to_pkt_flags(staterr);
-	head->ol_flags = pkt_flags;
-#endif /* RTE_NEXT_ABI */
 
 	if (likely(pkt_flags & PKT_RX_RSS_HASH))
 		head->hash.rss = rte_le_to_cpu_32(desc->wb.lower.hi_dword.rss);
diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec.c b/drivers/net/ixgbe/ixgbe_rxtx_vec.c
index cf25a53..6979b1e 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx_vec.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx_vec.c
@@ -140,19 +140,11 @@ ixgbe_rxq_rearm(struct ixgbe_rx_queue *rxq)
  */
 #ifdef RTE_IXGBE_RX_OLFLAGS_ENABLE
 
-#ifndef RTE_NEXT_ABI
-#define OLFLAGS_MASK	((uint16_t)(PKT_RX_VLAN_PKT | PKT_RX_IPV4_HDR |\
-			PKT_RX_IPV4_HDR_EXT | PKT_RX_IPV6_HDR |\
-			PKT_RX_IPV6_HDR_EXT))
-#define PTYPE_SHIFT    (1)
-#endif /* RTE_NEXT_ABI */
-
 #define VTAG_SHIFT     (3)
 
 static inline void
 desc_to_olflags_v(__m128i descs[4], struct rte_mbuf **rx_pkts)
 {
-#ifdef RTE_NEXT_ABI
 	__m128i ptype0, ptype1, vtag0, vtag1;
 	union {
 		uint16_t e[4];
@@ -190,50 +182,6 @@ desc_to_olflags_v(__m128i descs[4], struct rte_mbuf **rx_pkts)
 
 	vtag1 = _mm_or_si128(ptype0, vtag1);
 	vol.dword = _mm_cvtsi128_si64(vtag1);
-#else
-	__m128i ptype0, ptype1, vtag0, vtag1;
-	union {
-		uint16_t e[4];
-		uint64_t dword;
-	} vol;
-
-	/* pkt type + vlan olflags mask */
-	const __m128i pkttype_msk = _mm_set_epi16(
-			0x0000, 0x0000, 0x0000, 0x0000,
-			OLFLAGS_MASK, OLFLAGS_MASK, OLFLAGS_MASK, OLFLAGS_MASK);
-
-	/* mask everything except rss type */
-	const __m128i rsstype_msk = _mm_set_epi16(
-			0x0000, 0x0000, 0x0000, 0x0000,
-			0x000F, 0x000F, 0x000F, 0x000F);
-
-	/* rss type to PKT_RX_RSS_HASH translation */
-	const __m128i rss_flags = _mm_set_epi8(PKT_RX_FDIR, 0, 0, 0,
-			0, 0, 0, PKT_RX_RSS_HASH,
-			PKT_RX_RSS_HASH, 0, PKT_RX_RSS_HASH, 0,
-			PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, 0);
-
-	ptype0 = _mm_unpacklo_epi16(descs[0], descs[1]);
-	ptype1 = _mm_unpacklo_epi16(descs[2], descs[3]);
-	vtag0 = _mm_unpackhi_epi16(descs[0], descs[1]);
-	vtag1 = _mm_unpackhi_epi16(descs[2], descs[3]);
-
-	ptype1 = _mm_unpacklo_epi32(ptype0, ptype1);
-	vtag1 = _mm_unpacklo_epi32(vtag0, vtag1);
-
-	ptype0 = _mm_and_si128(ptype1, rsstype_msk);
-	ptype0 = _mm_shuffle_epi8(rss_flags, ptype0);
-
-	ptype1 = _mm_slli_epi16(ptype1, PTYPE_SHIFT);
-	vtag1 = _mm_srli_epi16(vtag1, VTAG_SHIFT);
-
-	ptype1 = _mm_or_si128(ptype1, vtag1);
-	ptype1 = _mm_and_si128(ptype1, pkttype_msk);
-
-	ptype0 = _mm_or_si128(ptype0, ptype1);
-
-	vol.dword = _mm_cvtsi128_si64(ptype0);
-#endif /* RTE_NEXT_ABI */
 
 	rx_pkts[0]->ol_flags = vol.e[0];
 	rx_pkts[1]->ol_flags = vol.e[1];
@@ -264,7 +212,6 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 	int pos;
 	uint64_t var;
 	__m128i shuf_msk;
-#ifdef RTE_NEXT_ABI
 	__m128i crc_adjust = _mm_set_epi16(
 				0, 0, 0,    /* ignore non-length fields */
 				-rxq->crc_len, /* sub crc on data_len */
@@ -275,16 +222,6 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 	__m128i dd_check, eop_check;
 	__m128i desc_mask = _mm_set_epi32(0xFFFFFFFF, 0xFFFFFFFF,
 					  0xFFFFFFFF, 0xFFFF07F0);
-#else
-	__m128i crc_adjust = _mm_set_epi16(
-				0, 0, 0, 0, /* ignore non-length fields */
-				0,          /* ignore high-16bits of pkt_len */
-				-rxq->crc_len, /* sub crc on pkt_len */
-				-rxq->crc_len, /* sub crc on data_len */
-				0            /* ignore pkt_type field */
-			);
-	__m128i dd_check, eop_check;
-#endif /* RTE_NEXT_ABI */
 
 	if (unlikely(nb_pkts < RTE_IXGBE_VPMD_RX_BURST))
 		return 0;
@@ -313,7 +250,6 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 	eop_check = _mm_set_epi64x(0x0000000200000002LL, 0x0000000200000002LL);
 
 	/* mask to shuffle from desc. to mbuf */
-#ifdef RTE_NEXT_ABI
 	shuf_msk = _mm_set_epi8(
 		7, 6, 5, 4,  /* octet 4~7, 32bits rss */
 		15, 14,      /* octet 14~15, low 16 bits vlan_macip */
@@ -324,23 +260,11 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 		1,           /* octet 1, 8 bits pkt_type field */
 		0            /* octet 0, 4 bits offset 4 pkt_type field */
 		);
-#else
-	shuf_msk = _mm_set_epi8(
-		7, 6, 5, 4,  /* octet 4~7, 32bits rss */
-		0xFF, 0xFF,  /* skip high 16 bits vlan_macip, zero out */
-		15, 14,      /* octet 14~15, low 16 bits vlan_macip */
-		0xFF, 0xFF,  /* skip high 16 bits pkt_len, zero out */
-		13, 12,      /* octet 12~13, low 16 bits pkt_len */
-		13, 12,      /* octet 12~13, 16 bits data_len */
-		0xFF, 0xFF   /* skip pkt_type field */
-		);
-#endif /* RTE_NEXT_ABI */
 
 	/* Cache is empty -> need to scan the buffer rings, but first move
 	 * the next 'n' mbufs into the cache */
 	sw_ring = &rxq->sw_ring[rxq->rx_tail];
 
-#ifdef RTE_NEXT_ABI
 	/* A. load 4 packet in one loop
 	 * [A*. mask out 4 unused dirty field in desc]
 	 * B. copy 4 mbuf point from swring to rx_pkts
@@ -348,20 +272,10 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 	 * [C*. extract the end-of-packet bit, if requested]
 	 * D. fill info. from desc to mbuf
 	 */
-#else
-	/* A. load 4 packet in one loop
-	 * B. copy 4 mbuf point from swring to rx_pkts
-	 * C. calc the number of DD bits among the 4 packets
-	 * [C*. extract the end-of-packet bit, if requested]
-	 * D. fill info. from desc to mbuf
-	 */
-#endif /* RTE_NEXT_ABI */
 	for (pos = 0, nb_pkts_recd = 0; pos < RTE_IXGBE_VPMD_RX_BURST;
 			pos += RTE_IXGBE_DESCS_PER_LOOP,
 			rxdp += RTE_IXGBE_DESCS_PER_LOOP) {
-#ifdef RTE_NEXT_ABI
 		__m128i descs0[RTE_IXGBE_DESCS_PER_LOOP];
-#endif /* RTE_NEXT_ABI */
 		__m128i descs[RTE_IXGBE_DESCS_PER_LOOP];
 		__m128i pkt_mb1, pkt_mb2, pkt_mb3, pkt_mb4;
 		__m128i zero, staterr, sterr_tmp1, sterr_tmp2;
@@ -377,7 +291,6 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 		/* B.1 load 1 mbuf point */
 		mbp1 = _mm_loadu_si128((__m128i *)&sw_ring[pos]);
 
-#ifdef RTE_NEXT_ABI
 		/* Read desc statuses backwards to avoid race condition */
 		/* A.1 load 4 pkts desc */
 		descs0[3] = _mm_loadu_si128((__m128i *)(rxdp + 3));
@@ -403,25 +316,6 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 		/* A* mask out 0~3 bits RSS type */
 		descs[1] = _mm_and_si128(descs0[1], desc_mask);
 		descs[0] = _mm_and_si128(descs0[0], desc_mask);
-#else
-		/* Read desc statuses backwards to avoid race condition */
-		/* A.1 load 4 pkts desc */
-		descs[3] = _mm_loadu_si128((__m128i *)(rxdp + 3));
-
-		/* B.2 copy 2 mbuf point into rx_pkts  */
-		_mm_storeu_si128((__m128i *)&rx_pkts[pos], mbp1);
-
-		/* B.1 load 1 mbuf point */
-		mbp2 = _mm_loadu_si128((__m128i *)&sw_ring[pos + 2]);
-
-		descs[2] = _mm_loadu_si128((__m128i *)(rxdp + 2));
-		/* B.1 load 2 mbuf point */
-		descs[1] = _mm_loadu_si128((__m128i *)(rxdp + 1));
-		descs[0] = _mm_loadu_si128((__m128i *)(rxdp));
-
-		/* B.2 copy 2 mbuf point into rx_pkts  */
-		_mm_storeu_si128((__m128i *)&rx_pkts[pos + 2], mbp2);
-#endif /* RTE_NEXT_ABI */
 
 		/* avoid compiler reorder optimization */
 		rte_compiler_barrier();
@@ -435,13 +329,8 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 		/* C.1 4=>2 filter staterr info only */
 		sterr_tmp1 = _mm_unpackhi_epi32(descs[1], descs[0]);
 
-#ifdef RTE_NEXT_ABI
 		/* set ol_flags with vlan packet type */
 		desc_to_olflags_v(descs0, &rx_pkts[pos]);
-#else
-		/* set ol_flags with packet type and vlan tag */
-		desc_to_olflags_v(descs, &rx_pkts[pos]);
-#endif /* RTE_NEXT_ABI */
 
 		/* D.2 pkt 3,4 set in_port/nb_seg and remove crc */
 		pkt_mb4 = _mm_add_epi16(pkt_mb4, crc_adjust);
diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c
index fa3cb7e..6c6342f 100644
--- a/drivers/net/mlx4/mlx4.c
+++ b/drivers/net/mlx4/mlx4.c
@@ -1264,16 +1264,7 @@ mlx4_tx_burst(void *dpdk_txq, struct rte_mbuf **pkts, uint16_t pkts_n)
 			 * offsets but automatically recognizes the packet
 			 * type. For inner L3/L4 checksums, only VXLAN (UDP)
 			 * tunnels are currently supported. */
-#ifdef RTE_NEXT_ABI
 			if (RTE_ETH_IS_TUNNEL_PKT(buf->packet_type))
-#else
-			/* FIXME: since PKT_TX_UDP_TUNNEL_PKT has been removed,
-			 * the outer packet type is unknown. All we know is
-			 * that the L2 header is of unusual length (not
-			 * ETHER_HDR_LEN with or without 802.1Q header). */
-			if ((buf->l2_len != ETHER_HDR_LEN) &&
-			    (buf->l2_len != (ETHER_HDR_LEN + 4)))
-#endif
 				send_flags |= IBV_EXP_QP_BURST_TUNNEL;
 		}
 		if (likely(segs == 1)) {
@@ -2488,7 +2479,6 @@ rxq_cleanup(struct rxq *rxq)
 	memset(rxq, 0, sizeof(*rxq));
 }
 
-#ifdef RTE_NEXT_ABI
 /**
  * Translate RX completion flags to packet type.
  *
@@ -2521,7 +2511,6 @@ rxq_cq_to_pkt_type(uint32_t flags)
 			          IBV_EXP_CQ_RX_IPV6_PACKET, RTE_PTYPE_L3_IPV6);
 	return pkt_type;
 }
-#endif /* RTE_NEXT_ABI */
 
 /**
  * Translate RX completion flags to offload flags.
@@ -2539,11 +2528,6 @@ rxq_cq_to_ol_flags(const struct rxq *rxq, uint32_t flags)
 {
 	uint32_t ol_flags = 0;
 
-#ifndef RTE_NEXT_ABI
-	ol_flags =
-		TRANSPOSE(flags, IBV_EXP_CQ_RX_IPV4_PACKET, PKT_RX_IPV4_HDR) |
-		TRANSPOSE(flags, IBV_EXP_CQ_RX_IPV6_PACKET, PKT_RX_IPV6_HDR);
-#endif
 	if (rxq->csum)
 		ol_flags |=
 			TRANSPOSE(~flags,
@@ -2559,14 +2543,6 @@ rxq_cq_to_ol_flags(const struct rxq *rxq, uint32_t flags)
 	 */
 	if ((flags & IBV_EXP_CQ_RX_TUNNEL_PACKET) && (rxq->csum_l2tun))
 		ol_flags |=
-#ifndef RTE_NEXT_ABI
-			TRANSPOSE(flags,
-				  IBV_EXP_CQ_RX_OUTER_IPV4_PACKET,
-				  PKT_RX_TUNNEL_IPV4_HDR) |
-			TRANSPOSE(flags,
-				  IBV_EXP_CQ_RX_OUTER_IPV6_PACKET,
-				  PKT_RX_TUNNEL_IPV6_HDR) |
-#endif
 			TRANSPOSE(~flags,
 				  IBV_EXP_CQ_RX_OUTER_IP_CSUM_OK,
 				  PKT_RX_IP_CKSUM_BAD) |
@@ -2758,10 +2734,7 @@ mlx4_rx_burst_sp(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
 		NB_SEGS(pkt_buf) = j;
 		PORT(pkt_buf) = rxq->port_id;
 		PKT_LEN(pkt_buf) = pkt_buf_len;
-#ifdef RTE_NEXT_ABI
 		pkt_buf->packet_type = rxq_cq_to_pkt_type(flags);
-#endif
-		pkt_buf->ol_flags = rxq_cq_to_ol_flags(rxq, flags);
 
 		/* Return packet. */
 		*(pkts++) = pkt_buf;
@@ -2921,9 +2894,7 @@ mlx4_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
 		NEXT(seg) = NULL;
 		PKT_LEN(seg) = len;
 		DATA_LEN(seg) = len;
-#ifdef RTE_NEXT_ABI
 		seg->packet_type = rxq_cq_to_pkt_type(flags);
-#endif
 		seg->ol_flags = rxq_cq_to_ol_flags(rxq, flags);
 
 		/* Return packet. */
diff --git a/drivers/net/vmxnet3/vmxnet3_rxtx.c b/drivers/net/vmxnet3/vmxnet3_rxtx.c
index 39ad6ef..4de5d89 100644
--- a/drivers/net/vmxnet3/vmxnet3_rxtx.c
+++ b/drivers/net/vmxnet3/vmxnet3_rxtx.c
@@ -520,17 +520,9 @@ vmxnet3_rx_offload(const Vmxnet3_RxCompDesc *rcd, struct rte_mbuf *rxm)
 		struct ipv4_hdr *ip = (struct ipv4_hdr *)(eth + 1);
 
 		if (((ip->version_ihl & 0xf) << 2) > (int)sizeof(struct ipv4_hdr))
-#ifdef RTE_NEXT_ABI
 			rxm->packet_type = RTE_PTYPE_L3_IPV4_EXT;
-#else
-			rxm->ol_flags |= PKT_RX_IPV4_HDR_EXT;
-#endif
 		else
-#ifdef RTE_NEXT_ABI
 			rxm->packet_type = RTE_PTYPE_L3_IPV4;
-#else
-			rxm->ol_flags |= PKT_RX_IPV4_HDR;
-#endif
 
 		if (!rcd->cnc) {
 			if (!rcd->ipc)
diff --git a/examples/ip_fragmentation/main.c b/examples/ip_fragmentation/main.c
index b71d05f..fbc0b8d 100644
--- a/examples/ip_fragmentation/main.c
+++ b/examples/ip_fragmentation/main.c
@@ -283,11 +283,7 @@ l3fwd_simple_forward(struct rte_mbuf *m, struct lcore_queue_conf *qconf,
 	len = qconf->tx_mbufs[port_out].len;
 
 	/* if this is an IPv4 packet */
-#ifdef RTE_NEXT_ABI
 	if (RTE_ETH_IS_IPV4_HDR(m->packet_type)) {
-#else
-	if (m->ol_flags & PKT_RX_IPV4_HDR) {
-#endif
 		struct ipv4_hdr *ip_hdr;
 		uint32_t ip_dst;
 		/* Read the lookup key (i.e. ip_dst) from the input packet */
@@ -321,14 +317,8 @@ l3fwd_simple_forward(struct rte_mbuf *m, struct lcore_queue_conf *qconf,
 			if (unlikely (len2 < 0))
 				return;
 		}
-#ifdef RTE_NEXT_ABI
 	} else if (RTE_ETH_IS_IPV6_HDR(m->packet_type)) {
 		/* if this is an IPv6 packet */
-#else
-	}
-	/* if this is an IPv6 packet */
-	else if (m->ol_flags & PKT_RX_IPV6_HDR) {
-#endif
 		struct ipv6_hdr *ip_hdr;
 
 		ipv6 = 1;
diff --git a/examples/ip_reassembly/main.c b/examples/ip_reassembly/main.c
index f1c47ad..741c398 100644
--- a/examples/ip_reassembly/main.c
+++ b/examples/ip_reassembly/main.c
@@ -356,11 +356,7 @@ reassemble(struct rte_mbuf *m, uint8_t portid, uint32_t queue,
 	dst_port = portid;
 
 	/* if packet is IPv4 */
-#ifdef RTE_NEXT_ABI
 	if (RTE_ETH_IS_IPV4_HDR(m->packet_type)) {
-#else
-	if (m->ol_flags & (PKT_RX_IPV4_HDR)) {
-#endif
 		struct ipv4_hdr *ip_hdr;
 		uint32_t ip_dst;
 
@@ -400,14 +396,8 @@ reassemble(struct rte_mbuf *m, uint8_t portid, uint32_t queue,
 		}
 
 		eth_hdr->ether_type = rte_be_to_cpu_16(ETHER_TYPE_IPv4);
-#ifdef RTE_NEXT_ABI
 	} else if (RTE_ETH_IS_IPV6_HDR(m->packet_type)) {
 		/* if packet is IPv6 */
-#else
-	}
-	/* if packet is IPv6 */
-	else if (m->ol_flags & (PKT_RX_IPV6_HDR | PKT_RX_IPV6_HDR_EXT)) {
-#endif
 		struct ipv6_extension_fragment *frag_hdr;
 		struct ipv6_hdr *ip_hdr;
 
diff --git a/examples/l3fwd-acl/main.c b/examples/l3fwd-acl/main.c
index b2bdf2f..f612671 100644
--- a/examples/l3fwd-acl/main.c
+++ b/examples/l3fwd-acl/main.c
@@ -645,13 +645,7 @@ prepare_one_packet(struct rte_mbuf **pkts_in, struct acl_search_t *acl,
 	struct ipv4_hdr *ipv4_hdr;
 	struct rte_mbuf *pkt = pkts_in[index];
 
-#ifdef RTE_NEXT_ABI
 	if (RTE_ETH_IS_IPV4_HDR(pkt->packet_type)) {
-#else
-	int type = pkt->ol_flags & (PKT_RX_IPV4_HDR | PKT_RX_IPV6_HDR);
-
-	if (type == PKT_RX_IPV4_HDR) {
-#endif
 		ipv4_hdr = rte_pktmbuf_mtod_offset(pkt, struct ipv4_hdr *,
 						   sizeof(struct ether_hdr));
 
@@ -670,11 +664,7 @@ prepare_one_packet(struct rte_mbuf **pkts_in, struct acl_search_t *acl,
 			/* Not a valid IPv4 packet */
 			rte_pktmbuf_free(pkt);
 		}
-#ifdef RTE_NEXT_ABI
 	} else if (RTE_ETH_IS_IPV6_HDR(pkt->packet_type)) {
-#else
-	} else if (type == PKT_RX_IPV6_HDR) {
-#endif
 		/* Fill acl structure */
 		acl->data_ipv6[acl->num_ipv6] = MBUF_IPV6_2PROTO(pkt);
 		acl->m_ipv6[(acl->num_ipv6)++] = pkt;
@@ -692,22 +682,12 @@ prepare_one_packet(struct rte_mbuf **pkts_in, struct acl_search_t *acl,
 {
 	struct rte_mbuf *pkt = pkts_in[index];
 
-#ifdef RTE_NEXT_ABI
 	if (RTE_ETH_IS_IPV4_HDR(pkt->packet_type)) {
-#else
-	int type = pkt->ol_flags & (PKT_RX_IPV4_HDR | PKT_RX_IPV6_HDR);
-
-	if (type == PKT_RX_IPV4_HDR) {
-#endif
 		/* Fill acl structure */
 		acl->data_ipv4[acl->num_ipv4] = MBUF_IPV4_2PROTO(pkt);
 		acl->m_ipv4[(acl->num_ipv4)++] = pkt;
 
-#ifdef RTE_NEXT_ABI
 	} else if (RTE_ETH_IS_IPV6_HDR(pkt->packet_type)) {
-#else
-	} else if (type == PKT_RX_IPV6_HDR) {
-#endif
 		/* Fill acl structure */
 		acl->data_ipv6[acl->num_ipv6] = MBUF_IPV6_2PROTO(pkt);
 		acl->m_ipv6[(acl->num_ipv6)++] = pkt;
@@ -755,17 +735,10 @@ send_one_packet(struct rte_mbuf *m, uint32_t res)
 		/* in the ACL list, drop it */
 #ifdef L3FWDACL_DEBUG
 		if ((res & ACL_DENY_SIGNATURE) != 0) {
-#ifdef RTE_NEXT_ABI
 			if (RTE_ETH_IS_IPV4_HDR(m->packet_type))
 				dump_acl4_rule(m, res);
 			else if (RTE_ETH_IS_IPV6_HDR(m->packet_type))
 				dump_acl6_rule(m, res);
-#else
-			if (m->ol_flags & PKT_RX_IPV4_HDR)
-				dump_acl4_rule(m, res);
-			else
-				dump_acl6_rule(m, res);
-#endif /* RTE_NEXT_ABI */
 		}
 #endif
 		rte_pktmbuf_free(m);
diff --git a/examples/l3fwd-power/main.c b/examples/l3fwd-power/main.c
index 086f29b..8bb88ce 100644
--- a/examples/l3fwd-power/main.c
+++ b/examples/l3fwd-power/main.c
@@ -650,11 +650,7 @@ l3fwd_simple_forward(struct rte_mbuf *m, uint8_t portid,
 
 	eth_hdr = rte_pktmbuf_mtod(m, struct ether_hdr *);
 
-#ifdef RTE_NEXT_ABI
 	if (RTE_ETH_IS_IPV4_HDR(m->packet_type)) {
-#else
-	if (m->ol_flags & PKT_RX_IPV4_HDR) {
-#endif
 		/* Handle IPv4 headers.*/
 		ipv4_hdr =
 			rte_pktmbuf_mtod_offset(m, struct ipv4_hdr *,
@@ -689,12 +685,7 @@ l3fwd_simple_forward(struct rte_mbuf *m, uint8_t portid,
 		ether_addr_copy(&ports_eth_addr[dst_port], &eth_hdr->s_addr);
 
 		send_single_packet(m, dst_port);
-#ifdef RTE_NEXT_ABI
 	} else if (RTE_ETH_IS_IPV6_HDR(m->packet_type)) {
-#else
-	}
-	else {
-#endif
 		/* Handle IPv6 headers.*/
 #if (APP_LOOKUP_METHOD == APP_LOOKUP_EXACT_MATCH)
 		struct ipv6_hdr *ipv6_hdr;
diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c
index fe5a257..1f3e5c6 100644
--- a/examples/l3fwd/main.c
+++ b/examples/l3fwd/main.c
@@ -1073,11 +1073,7 @@ l3fwd_simple_forward(struct rte_mbuf *m, uint8_t portid, struct lcore_conf *qcon
 
 	eth_hdr = rte_pktmbuf_mtod(m, struct ether_hdr *);
 
-#ifdef RTE_NEXT_ABI
 	if (RTE_ETH_IS_IPV4_HDR(m->packet_type)) {
-#else
-	if (m->ol_flags & PKT_RX_IPV4_HDR) {
-#endif
 		/* Handle IPv4 headers.*/
 		ipv4_hdr = rte_pktmbuf_mtod_offset(m, struct ipv4_hdr *,
 						   sizeof(struct ether_hdr));
@@ -1108,11 +1104,7 @@ l3fwd_simple_forward(struct rte_mbuf *m, uint8_t portid, struct lcore_conf *qcon
 		ether_addr_copy(&ports_eth_addr[dst_port], &eth_hdr->s_addr);
 
 		send_single_packet(m, dst_port);
-#ifdef RTE_NEXT_ABI
 	} else if (RTE_ETH_IS_IPV6_HDR(m->packet_type)) {
-#else
-	} else {
-#endif
 		/* Handle IPv6 headers.*/
 		struct ipv6_hdr *ipv6_hdr;
 
@@ -1131,13 +1123,9 @@ l3fwd_simple_forward(struct rte_mbuf *m, uint8_t portid, struct lcore_conf *qcon
 		ether_addr_copy(&ports_eth_addr[dst_port], &eth_hdr->s_addr);
 
 		send_single_packet(m, dst_port);
-#ifdef RTE_NEXT_ABI
 	} else
 		/* Free the mbuf that contains non-IPV4/IPV6 packet */
 		rte_pktmbuf_free(m);
-#else
-	}
-#endif
 }
 
 #if ((APP_LOOKUP_METHOD == APP_LOOKUP_LPM) && \
@@ -1163,19 +1151,11 @@ l3fwd_simple_forward(struct rte_mbuf *m, uint8_t portid, struct lcore_conf *qcon
  * to BAD_PORT value.
  */
 static inline __attribute__((always_inline)) void
-#ifdef RTE_NEXT_ABI
 rfc1812_process(struct ipv4_hdr *ipv4_hdr, uint16_t *dp, uint32_t ptype)
-#else
-rfc1812_process(struct ipv4_hdr *ipv4_hdr, uint16_t *dp, uint32_t flags)
-#endif
 {
 	uint8_t ihl;
 
-#ifdef RTE_NEXT_ABI
 	if (RTE_ETH_IS_IPV4_HDR(ptype)) {
-#else
-	if ((flags & PKT_RX_IPV4_HDR) != 0) {
-#endif
 		ihl = ipv4_hdr->version_ihl - IPV4_MIN_VER_IHL;
 
 		ipv4_hdr->time_to_live--;
@@ -1206,19 +1186,11 @@ get_dst_port(const struct lcore_conf *qconf, struct rte_mbuf *pkt,
 	struct ipv6_hdr *ipv6_hdr;
 	struct ether_hdr *eth_hdr;
 
-#ifdef RTE_NEXT_ABI
 	if (RTE_ETH_IS_IPV4_HDR(pkt->packet_type)) {
-#else
-	if (pkt->ol_flags & PKT_RX_IPV4_HDR) {
-#endif
 		if (rte_lpm_lookup(qconf->ipv4_lookup_struct, dst_ipv4,
 				&next_hop) != 0)
 			next_hop = portid;
-#ifdef RTE_NEXT_ABI
 	} else if (RTE_ETH_IS_IPV6_HDR(pkt->packet_type)) {
-#else
-	} else if (pkt->ol_flags & PKT_RX_IPV6_HDR) {
-#endif
 		eth_hdr = rte_pktmbuf_mtod(pkt, struct ether_hdr *);
 		ipv6_hdr = (struct ipv6_hdr *)(eth_hdr + 1);
 		if (rte_lpm6_lookup(qconf->ipv6_lookup_struct,
@@ -1252,17 +1224,12 @@ process_packet(struct lcore_conf *qconf, struct rte_mbuf *pkt,
 	ve = val_eth[dp];
 
 	dst_port[0] = dp;
-#ifdef RTE_NEXT_ABI
 	rfc1812_process(ipv4_hdr, dst_port, pkt->packet_type);
-#else
-	rfc1812_process(ipv4_hdr, dst_port, pkt->ol_flags);
-#endif
 
 	te =  _mm_blend_epi16(te, ve, MASK_ETH);
 	_mm_store_si128((__m128i *)eth_hdr, te);
 }
 
-#ifdef RTE_NEXT_ABI
 /*
  * Read packet_type and destination IPV4 addresses from 4 mbufs.
  */
@@ -1297,57 +1264,18 @@ processx4_step1(struct rte_mbuf *pkt[FWDSTEP],
 
 	dip[0] = _mm_set_epi32(x3, x2, x1, x0);
 }
-#else /* RTE_NEXT_ABI */
-/*
- * Read ol_flags and destination IPV4 addresses from 4 mbufs.
- */
-static inline void
-processx4_step1(struct rte_mbuf *pkt[FWDSTEP], __m128i *dip, uint32_t *flag)
-{
-	struct ipv4_hdr *ipv4_hdr;
-	struct ether_hdr *eth_hdr;
-	uint32_t x0, x1, x2, x3;
-
-	eth_hdr = rte_pktmbuf_mtod(pkt[0], struct ether_hdr *);
-	ipv4_hdr = (struct ipv4_hdr *)(eth_hdr + 1);
-	x0 = ipv4_hdr->dst_addr;
-	flag[0] = pkt[0]->ol_flags & PKT_RX_IPV4_HDR;
-
-	eth_hdr = rte_pktmbuf_mtod(pkt[1], struct ether_hdr *);
-	ipv4_hdr = (struct ipv4_hdr *)(eth_hdr + 1);
-	x1 = ipv4_hdr->dst_addr;
-	flag[0] &= pkt[1]->ol_flags;
-
-	eth_hdr = rte_pktmbuf_mtod(pkt[2], struct ether_hdr *);
-	ipv4_hdr = (struct ipv4_hdr *)(eth_hdr + 1);
-	x2 = ipv4_hdr->dst_addr;
-	flag[0] &= pkt[2]->ol_flags;
-
-	eth_hdr = rte_pktmbuf_mtod(pkt[3], struct ether_hdr *);
-	ipv4_hdr = (struct ipv4_hdr *)(eth_hdr + 1);
-	x3 = ipv4_hdr->dst_addr;
-	flag[0] &= pkt[3]->ol_flags;
-
-	dip[0] = _mm_set_epi32(x3, x2, x1, x0);
-}
-#endif /* RTE_NEXT_ABI */
 
 /*
  * Lookup into LPM for destination port.
  * If lookup fails, use incoming port (portid) as destination port.
  */
 static inline void
-#ifdef RTE_NEXT_ABI
 processx4_step2(const struct lcore_conf *qconf,
 		__m128i dip,
 		uint32_t ipv4_flag,
 		uint8_t portid,
 		struct rte_mbuf *pkt[FWDSTEP],
 		uint16_t dprt[FWDSTEP])
-#else
-processx4_step2(const struct lcore_conf *qconf, __m128i dip, uint32_t flag,
-	uint8_t portid, struct rte_mbuf *pkt[FWDSTEP], uint16_t dprt[FWDSTEP])
-#endif /* RTE_NEXT_ABI */
 {
 	rte_xmm_t dst;
 	const  __m128i bswap_mask = _mm_set_epi8(12, 13, 14, 15, 8, 9, 10, 11,
@@ -1357,11 +1285,7 @@ processx4_step2(const struct lcore_conf *qconf, __m128i dip, uint32_t flag,
 	dip = _mm_shuffle_epi8(dip, bswap_mask);
 
 	/* if all 4 packets are IPV4. */
-#ifdef RTE_NEXT_ABI
 	if (likely(ipv4_flag)) {
-#else
-	if (likely(flag != 0)) {
-#endif
 		rte_lpm_lookupx4(qconf->ipv4_lookup_struct, dip, dprt, portid);
 	} else {
 		dst.x = dip;
@@ -1411,7 +1335,6 @@ processx4_step3(struct rte_mbuf *pkt[FWDSTEP], uint16_t dst_port[FWDSTEP])
 	_mm_store_si128(p[2], te[2]);
 	_mm_store_si128(p[3], te[3]);
 
-#ifdef RTE_NEXT_ABI
 	rfc1812_process((struct ipv4_hdr *)((struct ether_hdr *)p[0] + 1),
 		&dst_port[0], pkt[0]->packet_type);
 	rfc1812_process((struct ipv4_hdr *)((struct ether_hdr *)p[1] + 1),
@@ -1420,16 +1343,6 @@ processx4_step3(struct rte_mbuf *pkt[FWDSTEP], uint16_t dst_port[FWDSTEP])
 		&dst_port[2], pkt[2]->packet_type);
 	rfc1812_process((struct ipv4_hdr *)((struct ether_hdr *)p[3] + 1),
 		&dst_port[3], pkt[3]->packet_type);
-#else /* RTE_NEXT_ABI */
-	rfc1812_process((struct ipv4_hdr *)((struct ether_hdr *)p[0] + 1),
-		&dst_port[0], pkt[0]->ol_flags);
-	rfc1812_process((struct ipv4_hdr *)((struct ether_hdr *)p[1] + 1),
-		&dst_port[1], pkt[1]->ol_flags);
-	rfc1812_process((struct ipv4_hdr *)((struct ether_hdr *)p[2] + 1),
-		&dst_port[2], pkt[2]->ol_flags);
-	rfc1812_process((struct ipv4_hdr *)((struct ether_hdr *)p[3] + 1),
-		&dst_port[3], pkt[3]->ol_flags);
-#endif /* RTE_NEXT_ABI */
 }
 
 /*
@@ -1616,11 +1529,7 @@ main_loop(__attribute__((unused)) void *dummy)
 	uint16_t *lp;
 	uint16_t dst_port[MAX_PKT_BURST];
 	__m128i dip[MAX_PKT_BURST / FWDSTEP];
-#ifdef RTE_NEXT_ABI
 	uint32_t ipv4_flag[MAX_PKT_BURST / FWDSTEP];
-#else
-	uint32_t flag[MAX_PKT_BURST / FWDSTEP];
-#endif
 	uint16_t pnum[MAX_PKT_BURST + 1];
 #endif
 
@@ -1690,7 +1599,6 @@ main_loop(__attribute__((unused)) void *dummy)
 				 */
 				int32_t n = RTE_ALIGN_FLOOR(nb_rx, 8);
 				for (j = 0; j < n; j += 8) {
-#ifdef RTE_NEXT_ABI
 					uint32_t pkt_type =
 						pkts_burst[j]->packet_type &
 						pkts_burst[j+1]->packet_type &
@@ -1705,20 +1613,6 @@ main_loop(__attribute__((unused)) void *dummy)
 						&pkts_burst[j], portid, qconf);
 					} else if (pkt_type &
 						RTE_PTYPE_L3_IPV6) {
-#else /* RTE_NEXT_ABI */
-					uint32_t ol_flag = pkts_burst[j]->ol_flags
-							& pkts_burst[j+1]->ol_flags
-							& pkts_burst[j+2]->ol_flags
-							& pkts_burst[j+3]->ol_flags
-							& pkts_burst[j+4]->ol_flags
-							& pkts_burst[j+5]->ol_flags
-							& pkts_burst[j+6]->ol_flags
-							& pkts_burst[j+7]->ol_flags;
-					if (ol_flag & PKT_RX_IPV4_HDR ) {
-						simple_ipv4_fwd_8pkts(&pkts_burst[j],
-									portid, qconf);
-					} else if (ol_flag & PKT_RX_IPV6_HDR) {
-#endif /* RTE_NEXT_ABI */
 						simple_ipv6_fwd_8pkts(&pkts_burst[j],
 									portid, qconf);
 					} else {
@@ -1751,21 +1645,13 @@ main_loop(__attribute__((unused)) void *dummy)
 			for (j = 0; j != k; j += FWDSTEP) {
 				processx4_step1(&pkts_burst[j],
 					&dip[j / FWDSTEP],
-#ifdef RTE_NEXT_ABI
 					&ipv4_flag[j / FWDSTEP]);
-#else
-					&flag[j / FWDSTEP]);
-#endif
 			}
 
 			k = RTE_ALIGN_FLOOR(nb_rx, FWDSTEP);
 			for (j = 0; j != k; j += FWDSTEP) {
 				processx4_step2(qconf, dip[j / FWDSTEP],
-#ifdef RTE_NEXT_ABI
 					ipv4_flag[j / FWDSTEP], portid,
-#else
-					flag[j / FWDSTEP], portid,
-#endif
 					&pkts_burst[j], &dst_port[j]);
 			}
 
diff --git a/examples/tep_termination/vxlan.c b/examples/tep_termination/vxlan.c
index e98a29f..5ee1f95 100644
--- a/examples/tep_termination/vxlan.c
+++ b/examples/tep_termination/vxlan.c
@@ -180,12 +180,7 @@ decapsulation(struct rte_mbuf *pkt)
 	 * (rfc7348) or that the rx offload flag is set (i40e only
 	 * currently)*/
 	if (udp_hdr->dst_port != rte_cpu_to_be_16(DEFAULT_VXLAN_PORT) &&
-#ifdef RTE_NEXT_ABI
 		(pkt->packet_type & RTE_PTYPE_TUNNEL_MASK) == 0)
-#else
-			(pkt->ol_flags & (PKT_RX_TUNNEL_IPV4_HDR |
-				PKT_RX_TUNNEL_IPV6_HDR)) == 0)
-#endif
 		return -1;
 	outer_header_len = info.outer_l2_len + info.outer_l3_len
 		+ sizeof(struct udp_hdr) + sizeof(struct vxlan_hdr);
diff --git a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
index e9f38bd..bd1cc09 100644
--- a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
+++ b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
@@ -117,15 +117,9 @@ struct rte_kni_mbuf {
 	uint16_t data_off;      /**< Start address of data in segment buffer. */
 	char pad1[4];
 	uint64_t ol_flags;      /**< Offload features. */
-#ifdef RTE_NEXT_ABI
 	char pad2[4];
 	uint32_t pkt_len;       /**< Total pkt len: sum of all segment data_len. */
 	uint16_t data_len;      /**< Amount of data in segment buffer. */
-#else
-	char pad2[2];
-	uint16_t data_len;      /**< Amount of data in segment buffer. */
-	uint32_t pkt_len;       /**< Total pkt len: sum of all segment data_len. */
-#endif
 
 	/* fields on second cache line */
 	char pad3[8] __attribute__((__aligned__(RTE_CACHE_LINE_SIZE)));
diff --git a/lib/librte_mbuf/Makefile b/lib/librte_mbuf/Makefile
index 080f3cf..8d62b0d 100644
--- a/lib/librte_mbuf/Makefile
+++ b/lib/librte_mbuf/Makefile
@@ -38,7 +38,7 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_mbuf_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MBUF) := rte_mbuf.c
diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c
index e416312..c18b438 100644
--- a/lib/librte_mbuf/rte_mbuf.c
+++ b/lib/librte_mbuf/rte_mbuf.c
@@ -258,18 +258,8 @@ const char *rte_get_rx_ol_flag_name(uint64_t mask)
 	/* case PKT_RX_HBUF_OVERFLOW: return "PKT_RX_HBUF_OVERFLOW"; */
 	/* case PKT_RX_RECIP_ERR: return "PKT_RX_RECIP_ERR"; */
 	/* case PKT_RX_MAC_ERR: return "PKT_RX_MAC_ERR"; */
-#ifndef RTE_NEXT_ABI
-	case PKT_RX_IPV4_HDR: return "PKT_RX_IPV4_HDR";
-	case PKT_RX_IPV4_HDR_EXT: return "PKT_RX_IPV4_HDR_EXT";
-	case PKT_RX_IPV6_HDR: return "PKT_RX_IPV6_HDR";
-	case PKT_RX_IPV6_HDR_EXT: return "PKT_RX_IPV6_HDR_EXT";
-#endif /* RTE_NEXT_ABI */
 	case PKT_RX_IEEE1588_PTP: return "PKT_RX_IEEE1588_PTP";
 	case PKT_RX_IEEE1588_TMST: return "PKT_RX_IEEE1588_TMST";
-#ifndef RTE_NEXT_ABI
-	case PKT_RX_TUNNEL_IPV4_HDR: return "PKT_RX_TUNNEL_IPV4_HDR";
-	case PKT_RX_TUNNEL_IPV6_HDR: return "PKT_RX_TUNNEL_IPV6_HDR";
-#endif /* RTE_NEXT_ABI */
 	default: return NULL;
 	}
 }
diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
index 8c2db1b..d7c9030 100644
--- a/lib/librte_mbuf/rte_mbuf.h
+++ b/lib/librte_mbuf/rte_mbuf.h
@@ -93,18 +93,8 @@ extern "C" {
 #define PKT_RX_HBUF_OVERFLOW (0ULL << 0)  /**< Header buffer overflow. */
 #define PKT_RX_RECIP_ERR     (0ULL << 0)  /**< Hardware processing error. */
 #define PKT_RX_MAC_ERR       (0ULL << 0)  /**< MAC error. */
-#ifndef RTE_NEXT_ABI
-#define PKT_RX_IPV4_HDR      (1ULL << 5)  /**< RX packet with IPv4 header. */
-#define PKT_RX_IPV4_HDR_EXT  (1ULL << 6)  /**< RX packet with extended IPv4 header. */
-#define PKT_RX_IPV6_HDR      (1ULL << 7)  /**< RX packet with IPv6 header. */
-#define PKT_RX_IPV6_HDR_EXT  (1ULL << 8)  /**< RX packet with extended IPv6 header. */
-#endif /* RTE_NEXT_ABI */
 #define PKT_RX_IEEE1588_PTP  (1ULL << 9)  /**< RX IEEE1588 L2 Ethernet PT Packet. */
 #define PKT_RX_IEEE1588_TMST (1ULL << 10) /**< RX IEEE1588 L2/L4 timestamped packet.*/
-#ifndef RTE_NEXT_ABI
-#define PKT_RX_TUNNEL_IPV4_HDR (1ULL << 11) /**< RX tunnel packet with IPv4 header.*/
-#define PKT_RX_TUNNEL_IPV6_HDR (1ULL << 12) /**< RX tunnel packet with IPv6 header. */
-#endif /* RTE_NEXT_ABI */
 #define PKT_RX_FDIR_ID       (1ULL << 13) /**< FD id reported if FDIR match. */
 #define PKT_RX_FDIR_FLX      (1ULL << 14) /**< Flexible bytes reported if FDIR match. */
 #define PKT_RX_QINQ_PKT      (1ULL << 15)  /**< RX packet with double VLAN stripped. */
@@ -209,7 +199,6 @@ extern "C" {
 /* Use final bit of flags to indicate a control mbuf */
 #define CTRL_MBUF_FLAG       (1ULL << 63) /**< Mbuf contains control data */
 
-#ifdef RTE_NEXT_ABI
 /*
  * 32 bits are divided into several fields to mark packet types. Note that
  * each field is indexical.
@@ -696,7 +685,6 @@ extern "C" {
                                                  RTE_PTYPE_INNER_L2_MASK | \
                                                  RTE_PTYPE_INNER_L3_MASK | \
                                                  RTE_PTYPE_INNER_L4_MASK))
-#endif /* RTE_NEXT_ABI */
 
 /** Alignment constraint of mbuf private area. */
 #define RTE_MBUF_PRIV_ALIGN 8
@@ -775,7 +763,6 @@ struct rte_mbuf {
 	/* remaining bytes are set on RX when pulling packet from descriptor */
 	MARKER rx_descriptor_fields1;
 
-#ifdef RTE_NEXT_ABI
 	/*
 	 * The packet type, which is the combination of outer/inner L2, L3, L4
 	 * and tunnel types.
@@ -796,19 +783,7 @@ struct rte_mbuf {
 	uint32_t pkt_len;         /**< Total pkt len: sum of all segments. */
 	uint16_t data_len;        /**< Amount of data in segment buffer. */
 	uint16_t vlan_tci;        /**< VLAN Tag Control Identifier (CPU order) */
-#else /* RTE_NEXT_ABI */
-	/**
-	 * The packet type, which is used to indicate ordinary packet and also
-	 * tunneled packet format, i.e. each number is represented a type of
-	 * packet.
-	 */
-	uint16_t packet_type;
 
-	uint16_t data_len;        /**< Amount of data in segment buffer. */
-	uint32_t pkt_len;         /**< Total pkt len: sum of all segments. */
-	uint16_t vlan_tci;        /**< VLAN Tag Control Identifier (CPU order) */
-	uint16_t vlan_tci_outer;  /**< Outer VLAN Tag Control Identifier (CPU order) */
-#endif /* RTE_NEXT_ABI */
 	union {
 		uint32_t rss;     /**< RSS hash result if RSS enabled */
 		struct {
@@ -829,9 +804,8 @@ struct rte_mbuf {
 	} hash;                   /**< hash information */
 
 	uint32_t seqn; /**< Sequence number. See also rte_reorder_insert() */
-#ifdef RTE_NEXT_ABI
+
 	uint16_t vlan_tci_outer;  /**< Outer VLAN Tag Control Identifier (CPU order) */
-#endif /* RTE_NEXT_ABI */
 
 	/* second cache line - fields only used in slow path or on TX */
 	MARKER cacheline1 __rte_cache_aligned;
-- 
2.5.1

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v2 02/10] ethdev: remove Rx interrupt switch
  2015-09-02 13:16  3% ` [dpdk-dev] [PATCH v2 00/10] clean deprecated code Thomas Monjalon
  2015-09-02 13:16  5%   ` [dpdk-dev] [PATCH v2 01/10] doc: init next release notes Thomas Monjalon
@ 2015-09-02 13:16  7%   ` Thomas Monjalon
  2015-09-02 13:16  4%   ` [dpdk-dev] [PATCH v2 03/10] mbuf: remove packet type from offload flags Thomas Monjalon
                     ` (2 subsequent siblings)
  4 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-09-02 13:16 UTC (permalink / raw)
  To: dev

The Rx interrupt feature is now part of the standard ABI.
Because of changes in rte_intr_handle and struct rte_eth_conf,
the eal and ethdev library versions are incremented.

Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
---
 doc/guides/rel_notes/deprecation.rst               |  4 --
 doc/guides/rel_notes/release_2_2.rst               |  7 ++-
 drivers/net/e1000/igb_ethdev.c                     | 26 -----------
 drivers/net/ixgbe/ixgbe_ethdev.c                   | 40 ----------------
 examples/l3fwd-power/main.c                        |  2 -
 lib/librte_eal/bsdapp/eal/Makefile                 |  2 +-
 .../bsdapp/eal/include/exec-env/rte_interrupts.h   |  2 -
 lib/librte_eal/linuxapp/eal/Makefile               |  2 +-
 lib/librte_eal/linuxapp/eal/eal_interrupts.c       | 53 ----------------------
 .../linuxapp/eal/include/exec-env/rte_interrupts.h |  2 -
 lib/librte_ether/Makefile                          |  2 +-
 lib/librte_ether/rte_ethdev.c                      | 40 ----------------
 lib/librte_ether/rte_ethdev.h                      |  4 --
 13 files changed, 8 insertions(+), 178 deletions(-)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index da17880..991a777 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -13,10 +13,6 @@ Deprecation Notices
   There is no backward compatibility planned from release 2.2.
   All binaries will need to be rebuilt from release 2.2.
 
-* ABI changes are planned for struct rte_intr_handle, struct rte_eth_conf
-  and struct eth_dev_ops to support interrupt mode feature from release 2.1.
-  Those changes may be enabled in the release 2.1 with CONFIG_RTE_NEXT_ABI.
-
 * The EAL function rte_eal_pci_close_one is deprecated because renamed to
   rte_eal_pci_detach.
 
diff --git a/doc/guides/rel_notes/release_2_2.rst b/doc/guides/rel_notes/release_2_2.rst
index 494b4eb..388d2e3 100644
--- a/doc/guides/rel_notes/release_2_2.rst
+++ b/doc/guides/rel_notes/release_2_2.rst
@@ -20,6 +20,9 @@ API Changes
 ABI Changes
 -----------
 
+* The EAL and ethdev structures rte_intr_handle and rte_eth_conf were changed
+  to support Rx interrupt. It was already done in 2.1 for CONFIG_RTE_NEXT_ABI.
+
 
 Shared Library Versions
 -----------------------
@@ -28,12 +31,12 @@ The libraries prepended with a plus sign were incremented in this version.
 
 .. code-block:: diff
 
-     libethdev.so.1
+   + libethdev.so.2
      librte_acl.so.1
      librte_cfgfile.so.1
      librte_cmdline.so.1
      librte_distributor.so.1
-     librte_eal.so.1
+   + librte_eal.so.2
      librte_hash.so.1
      librte_ip_frag.so.1
      librte_ivshmem.so.1
diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c
index c7e6d55..848ef6e 100644
--- a/drivers/net/e1000/igb_ethdev.c
+++ b/drivers/net/e1000/igb_ethdev.c
@@ -106,9 +106,7 @@ static int  eth_igb_flow_ctrl_get(struct rte_eth_dev *dev,
 static int  eth_igb_flow_ctrl_set(struct rte_eth_dev *dev,
 				struct rte_eth_fc_conf *fc_conf);
 static int eth_igb_lsc_interrupt_setup(struct rte_eth_dev *dev);
-#ifdef RTE_NEXT_ABI
 static int eth_igb_rxq_interrupt_setup(struct rte_eth_dev *dev);
-#endif
 static int eth_igb_interrupt_get_status(struct rte_eth_dev *dev);
 static int eth_igb_interrupt_action(struct rte_eth_dev *dev);
 static void eth_igb_interrupt_handler(struct rte_intr_handle *handle,
@@ -232,7 +230,6 @@ static int igb_timesync_read_rx_timestamp(struct rte_eth_dev *dev,
 					  uint32_t flags);
 static int igb_timesync_read_tx_timestamp(struct rte_eth_dev *dev,
 					  struct timespec *timestamp);
-#ifdef RTE_NEXT_ABI
 static int eth_igb_rx_queue_intr_enable(struct rte_eth_dev *dev,
 					uint16_t queue_id);
 static int eth_igb_rx_queue_intr_disable(struct rte_eth_dev *dev,
@@ -241,7 +238,6 @@ static void eth_igb_assign_msix_vector(struct e1000_hw *hw, int8_t direction,
 				       uint8_t queue, uint8_t msix_vector);
 static void eth_igb_write_ivar(struct e1000_hw *hw, uint8_t msix_vector,
 			       uint8_t index, uint8_t offset);
-#endif
 static void eth_igb_configure_msix_intr(struct rte_eth_dev *dev);
 
 /*
@@ -303,10 +299,8 @@ static const struct eth_dev_ops eth_igb_ops = {
 	.vlan_tpid_set        = eth_igb_vlan_tpid_set,
 	.vlan_offload_set     = eth_igb_vlan_offload_set,
 	.rx_queue_setup       = eth_igb_rx_queue_setup,
-#ifdef RTE_NEXT_ABI
 	.rx_queue_intr_enable = eth_igb_rx_queue_intr_enable,
 	.rx_queue_intr_disable = eth_igb_rx_queue_intr_disable,
-#endif
 	.rx_queue_release     = eth_igb_rx_queue_release,
 	.rx_queue_count       = eth_igb_rx_queue_count,
 	.rx_descriptor_done   = eth_igb_rx_descriptor_done,
@@ -893,9 +887,7 @@ eth_igb_start(struct rte_eth_dev *dev)
 		E1000_DEV_PRIVATE(dev->data->dev_private);
 	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
 	int ret, mask;
-#ifdef RTE_NEXT_ABI
 	uint32_t intr_vector = 0;
-#endif
 	uint32_t ctrl_ext;
 
 	PMD_INIT_FUNC_TRACE();
@@ -936,7 +928,6 @@ eth_igb_start(struct rte_eth_dev *dev)
 	/* configure PF module if SRIOV enabled */
 	igb_pf_host_configure(dev);
 
-#ifdef RTE_NEXT_ABI
 	/* check and configure queue intr-vector mapping */
 	if (dev->data->dev_conf.intr_conf.rxq != 0)
 		intr_vector = dev->data->nb_rx_queues;
@@ -954,7 +945,6 @@ eth_igb_start(struct rte_eth_dev *dev)
 			return -ENOMEM;
 		}
 	}
-#endif
 
 	/* confiugre msix for rx interrupt */
 	eth_igb_configure_msix_intr(dev);
@@ -1050,11 +1040,9 @@ eth_igb_start(struct rte_eth_dev *dev)
 				     " no intr multiplex\n");
 	}
 
-#ifdef RTE_NEXT_ABI
 	/* check if rxq interrupt is enabled */
 	if (dev->data->dev_conf.intr_conf.rxq != 0)
 		eth_igb_rxq_interrupt_setup(dev);
-#endif
 
 	/* enable uio/vfio intr/eventfd mapping */
 	rte_intr_enable(intr_handle);
@@ -1146,14 +1134,12 @@ eth_igb_stop(struct rte_eth_dev *dev)
 	}
 	filter_info->twotuple_mask = 0;
 
-#ifdef RTE_NEXT_ABI
 	/* Clean datapath event and queue/vec mapping */
 	rte_intr_efd_disable(intr_handle);
 	if (intr_handle->intr_vec != NULL) {
 		rte_free(intr_handle->intr_vec);
 		intr_handle->intr_vec = NULL;
 	}
-#endif
 }
 
 static void
@@ -1163,9 +1149,7 @@ eth_igb_close(struct rte_eth_dev *dev)
 	struct e1000_adapter *adapter =
 		E1000_DEV_PRIVATE(dev->data->dev_private);
 	struct rte_eth_link link;
-#ifdef RTE_NEXT_ABI
 	struct rte_pci_device *pci_dev;
-#endif
 
 	eth_igb_stop(dev);
 	adapter->stopped = 1;
@@ -1185,13 +1169,11 @@ eth_igb_close(struct rte_eth_dev *dev)
 
 	igb_dev_free_queues(dev);
 
-#ifdef RTE_NEXT_ABI
 	pci_dev = dev->pci_dev;
 	if (pci_dev->intr_handle.intr_vec) {
 		rte_free(pci_dev->intr_handle.intr_vec);
 		pci_dev->intr_handle.intr_vec = NULL;
 	}
-#endif
 
 	memset(&link, 0, sizeof(link));
 	rte_igb_dev_atomic_write_link_status(dev, &link);
@@ -2017,7 +1999,6 @@ eth_igb_lsc_interrupt_setup(struct rte_eth_dev *dev)
 	return 0;
 }
 
-#ifdef RTE_NEXT_ABI
 /* It clears the interrupt causes and enables the interrupt.
  * It will be called once only during nic initialized.
  *
@@ -2044,7 +2025,6 @@ static int eth_igb_rxq_interrupt_setup(struct rte_eth_dev *dev)
 
 	return 0;
 }
-#endif
 
 /*
  * It reads ICR and gets interrupt causes, check it and set a bit flag
@@ -4144,7 +4124,6 @@ static struct rte_driver pmd_igbvf_drv = {
 	.init = rte_igbvf_pmd_init,
 };
 
-#ifdef RTE_NEXT_ABI
 static int
 eth_igb_rx_queue_intr_disable(struct rte_eth_dev *dev, uint16_t queue_id)
 {
@@ -4219,7 +4198,6 @@ eth_igb_assign_msix_vector(struct e1000_hw *hw, int8_t direction,
 					   8 * direction);
 	}
 }
-#endif
 
 /* Sets up the hardware to generate MSI-X interrupts properly
  * @hw
@@ -4228,13 +4206,11 @@ eth_igb_assign_msix_vector(struct e1000_hw *hw, int8_t direction,
 static void
 eth_igb_configure_msix_intr(struct rte_eth_dev *dev)
 {
-#ifdef RTE_NEXT_ABI
 	int queue_id;
 	uint32_t tmpval, regval, intr_mask;
 	struct e1000_hw *hw =
 		E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	uint32_t vec = 0;
-#endif
 	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
 
 	/* won't configure msix register if no mapping is done
@@ -4243,7 +4219,6 @@ eth_igb_configure_msix_intr(struct rte_eth_dev *dev)
 	if (!rte_intr_dp_is_en(intr_handle))
 		return;
 
-#ifdef RTE_NEXT_ABI
 	/* set interrupt vector for other causes */
 	if (hw->mac.type == e1000_82575) {
 		tmpval = E1000_READ_REG(hw, E1000_CTRL_EXT);
@@ -4299,7 +4274,6 @@ eth_igb_configure_msix_intr(struct rte_eth_dev *dev)
 	}
 
 	E1000_WRITE_FLUSH(hw);
-#endif
 }
 
 PMD_REGISTER_DRIVER(pmd_igb_drv);
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index b8ee1e9..ec2918c 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -190,9 +190,7 @@ static int ixgbe_dev_rss_reta_query(struct rte_eth_dev *dev,
 			uint16_t reta_size);
 static void ixgbe_dev_link_status_print(struct rte_eth_dev *dev);
 static int ixgbe_dev_lsc_interrupt_setup(struct rte_eth_dev *dev);
-#ifdef RTE_NEXT_ABI
 static int ixgbe_dev_rxq_interrupt_setup(struct rte_eth_dev *dev);
-#endif
 static int ixgbe_dev_interrupt_get_status(struct rte_eth_dev *dev);
 static int ixgbe_dev_interrupt_action(struct rte_eth_dev *dev);
 static void ixgbe_dev_interrupt_handler(struct rte_intr_handle *handle,
@@ -227,14 +225,12 @@ static void ixgbevf_vlan_offload_set(struct rte_eth_dev *dev, int mask);
 static void ixgbevf_set_vfta_all(struct rte_eth_dev *dev, bool on);
 static void ixgbevf_dev_interrupt_handler(struct rte_intr_handle *handle,
 					  void *param);
-#ifdef RTE_NEXT_ABI
 static int ixgbevf_dev_rx_queue_intr_enable(struct rte_eth_dev *dev,
 					    uint16_t queue_id);
 static int ixgbevf_dev_rx_queue_intr_disable(struct rte_eth_dev *dev,
 					     uint16_t queue_id);
 static void ixgbevf_set_ivar_map(struct ixgbe_hw *hw, int8_t direction,
 				 uint8_t queue, uint8_t msix_vector);
-#endif
 static void ixgbevf_configure_msix(struct rte_eth_dev *dev);
 
 /* For Eth VMDQ APIs support */
@@ -252,14 +248,12 @@ static int ixgbe_mirror_rule_set(struct rte_eth_dev *dev,
 		uint8_t rule_id, uint8_t on);
 static int ixgbe_mirror_rule_reset(struct rte_eth_dev *dev,
 		uint8_t	rule_id);
-#ifdef RTE_NEXT_ABI
 static int ixgbe_dev_rx_queue_intr_enable(struct rte_eth_dev *dev,
 					  uint16_t queue_id);
 static int ixgbe_dev_rx_queue_intr_disable(struct rte_eth_dev *dev,
 					   uint16_t queue_id);
 static void ixgbe_set_ivar_map(struct ixgbe_hw *hw, int8_t direction,
 			       uint8_t queue, uint8_t msix_vector);
-#endif
 static void ixgbe_configure_msix(struct rte_eth_dev *dev);
 
 static int ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev,
@@ -420,10 +414,8 @@ static const struct eth_dev_ops ixgbe_eth_dev_ops = {
 	.tx_queue_start	      = ixgbe_dev_tx_queue_start,
 	.tx_queue_stop        = ixgbe_dev_tx_queue_stop,
 	.rx_queue_setup       = ixgbe_dev_rx_queue_setup,
-#ifdef RTE_NEXT_ABI
 	.rx_queue_intr_enable = ixgbe_dev_rx_queue_intr_enable,
 	.rx_queue_intr_disable = ixgbe_dev_rx_queue_intr_disable,
-#endif
 	.rx_queue_release     = ixgbe_dev_rx_queue_release,
 	.rx_queue_count       = ixgbe_dev_rx_queue_count,
 	.rx_descriptor_done   = ixgbe_dev_rx_descriptor_done,
@@ -497,10 +489,8 @@ static const struct eth_dev_ops ixgbevf_eth_dev_ops = {
 	.rx_descriptor_done   = ixgbe_dev_rx_descriptor_done,
 	.tx_queue_setup       = ixgbe_dev_tx_queue_setup,
 	.tx_queue_release     = ixgbe_dev_tx_queue_release,
-#ifdef RTE_NEXT_ABI
 	.rx_queue_intr_enable = ixgbevf_dev_rx_queue_intr_enable,
 	.rx_queue_intr_disable = ixgbevf_dev_rx_queue_intr_disable,
-#endif
 	.mac_addr_add         = ixgbevf_add_mac_addr,
 	.mac_addr_remove      = ixgbevf_remove_mac_addr,
 	.set_mc_addr_list     = ixgbe_dev_set_mc_addr_list,
@@ -1680,9 +1670,7 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
 	struct ixgbe_vf_info *vfinfo =
 		*IXGBE_DEV_PRIVATE_TO_P_VFDATA(dev->data->dev_private);
 	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
-#ifdef RTE_NEXT_ABI
 	uint32_t intr_vector = 0;
-#endif
 	int err, link_up = 0, negotiate = 0;
 	uint32_t speed = 0;
 	int mask = 0;
@@ -1715,7 +1703,6 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
 	/* configure PF module if SRIOV enabled */
 	ixgbe_pf_host_configure(dev);
 
-#ifdef RTE_NEXT_ABI
 	/* check and configure queue intr-vector mapping */
 	if (dev->data->dev_conf.intr_conf.rxq != 0)
 		intr_vector = dev->data->nb_rx_queues;
@@ -1734,7 +1721,6 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
 			return -ENOMEM;
 		}
 	}
-#endif
 
 	/* confiugre msix for sleep until rx interrupt */
 	ixgbe_configure_msix(dev);
@@ -1827,11 +1813,9 @@ skip_link_setup:
 				     " no intr multiplex\n");
 	}
 
-#ifdef RTE_NEXT_ABI
 	/* check if rxq interrupt is enabled */
 	if (dev->data->dev_conf.intr_conf.rxq != 0)
 		ixgbe_dev_rxq_interrupt_setup(dev);
-#endif
 
 	/* enable uio/vfio intr/eventfd mapping */
 	rte_intr_enable(intr_handle);
@@ -1942,14 +1926,12 @@ ixgbe_dev_stop(struct rte_eth_dev *dev)
 	memset(filter_info->fivetuple_mask, 0,
 		sizeof(uint32_t) * IXGBE_5TUPLE_ARRAY_SIZE);
 
-#ifdef RTE_NEXT_ABI
 	/* Clean datapath event and queue/vec mapping */
 	rte_intr_efd_disable(intr_handle);
 	if (intr_handle->intr_vec != NULL) {
 		rte_free(intr_handle->intr_vec);
 		intr_handle->intr_vec = NULL;
 	}
-#endif
 }
 
 /*
@@ -2623,7 +2605,6 @@ ixgbe_dev_lsc_interrupt_setup(struct rte_eth_dev *dev)
  *  - On success, zero.
  *  - On failure, a negative value.
  */
-#ifdef RTE_NEXT_ABI
 static int
 ixgbe_dev_rxq_interrupt_setup(struct rte_eth_dev *dev)
 {
@@ -2634,7 +2615,6 @@ ixgbe_dev_rxq_interrupt_setup(struct rte_eth_dev *dev)
 
 	return 0;
 }
-#endif
 
 /*
  * It reads ICR and sets flag (IXGBE_EICR_LSC) for the link_update.
@@ -3435,9 +3415,7 @@ ixgbevf_dev_start(struct rte_eth_dev *dev)
 {
 	struct ixgbe_hw *hw =
 		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-#ifdef RTE_NEXT_ABI
 	uint32_t intr_vector = 0;
-#endif
 	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
 
 	int err, mask = 0;
@@ -3470,7 +3448,6 @@ ixgbevf_dev_start(struct rte_eth_dev *dev)
 
 	ixgbevf_dev_rxtx_start(dev);
 
-#ifdef RTE_NEXT_ABI
 	/* check and configure queue intr-vector mapping */
 	if (dev->data->dev_conf.intr_conf.rxq != 0)
 		intr_vector = dev->data->nb_rx_queues;
@@ -3488,7 +3465,6 @@ ixgbevf_dev_start(struct rte_eth_dev *dev)
 			return -ENOMEM;
 		}
 	}
-#endif
 	ixgbevf_configure_msix(dev);
 
 	if (dev->data->dev_conf.intr_conf.lsc != 0) {
@@ -3534,23 +3510,19 @@ ixgbevf_dev_stop(struct rte_eth_dev *dev)
 	/* disable intr eventfd mapping */
 	rte_intr_disable(intr_handle);
 
-#ifdef RTE_NEXT_ABI
 	/* Clean datapath event and queue/vec mapping */
 	rte_intr_efd_disable(intr_handle);
 	if (intr_handle->intr_vec != NULL) {
 		rte_free(intr_handle->intr_vec);
 		intr_handle->intr_vec = NULL;
 	}
-#endif
 }
 
 static void
 ixgbevf_dev_close(struct rte_eth_dev *dev)
 {
 	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-#ifdef RTE_NEXT_ABI
 	struct rte_pci_device *pci_dev;
-#endif
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -3563,13 +3535,11 @@ ixgbevf_dev_close(struct rte_eth_dev *dev)
 	/* reprogram the RAR[0] in case user changed it. */
 	ixgbe_set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV);
 
-#ifdef RTE_NEXT_ABI
 	pci_dev = dev->pci_dev;
 	if (pci_dev->intr_handle.intr_vec) {
 		rte_free(pci_dev->intr_handle.intr_vec);
 		pci_dev->intr_handle.intr_vec = NULL;
 	}
-#endif
 }
 
 static void ixgbevf_set_vfta_all(struct rte_eth_dev *dev, bool on)
@@ -4087,7 +4057,6 @@ ixgbe_mirror_rule_reset(struct rte_eth_dev *dev, uint8_t rule_id)
 	return 0;
 }
 
-#ifdef RTE_NEXT_ABI
 static int
 ixgbevf_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
 {
@@ -4240,18 +4209,15 @@ ixgbe_set_ivar_map(struct ixgbe_hw *hw, int8_t direction,
 		}
 	}
 }
-#endif
 
 static void
 ixgbevf_configure_msix(struct rte_eth_dev *dev)
 {
 	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
-#ifdef RTE_NEXT_ABI
 	struct ixgbe_hw *hw =
 		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	uint32_t q_idx;
 	uint32_t vector_idx = 0;
-#endif
 
 	/* won't configure msix register if no mapping is done
 	 * between intr vector and event fd.
@@ -4259,7 +4225,6 @@ ixgbevf_configure_msix(struct rte_eth_dev *dev)
 	if (!rte_intr_dp_is_en(intr_handle))
 		return;
 
-#ifdef RTE_NEXT_ABI
 	/* Configure all RX queues of VF */
 	for (q_idx = 0; q_idx < dev->data->nb_rx_queues; q_idx++) {
 		/* Force all queue use vector 0,
@@ -4271,7 +4236,6 @@ ixgbevf_configure_msix(struct rte_eth_dev *dev)
 
 	/* Configure VF Rx queue ivar */
 	ixgbevf_set_ivar_map(hw, -1, 1, vector_idx);
-#endif
 }
 
 /**
@@ -4283,13 +4247,11 @@ static void
 ixgbe_configure_msix(struct rte_eth_dev *dev)
 {
 	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
-#ifdef RTE_NEXT_ABI
 	struct ixgbe_hw *hw =
 		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	uint32_t queue_id, vec = 0;
 	uint32_t mask;
 	uint32_t gpie;
-#endif
 
 	/* won't configure msix register if no mapping is done
 	 * between intr vector and event fd
@@ -4297,7 +4259,6 @@ ixgbe_configure_msix(struct rte_eth_dev *dev)
 	if (!rte_intr_dp_is_en(intr_handle))
 		return;
 
-#ifdef RTE_NEXT_ABI
 	/* setup GPIE for MSI-x mode */
 	gpie = IXGBE_READ_REG(hw, IXGBE_GPIE);
 	gpie |= IXGBE_GPIE_MSIX_MODE | IXGBE_GPIE_PBA_SUPPORT |
@@ -4347,7 +4308,6 @@ ixgbe_configure_msix(struct rte_eth_dev *dev)
 		  IXGBE_EIMS_LSC);
 
 	IXGBE_WRITE_REG(hw, IXGBE_EIAC, mask);
-#endif
 }
 
 static int ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev,
diff --git a/examples/l3fwd-power/main.c b/examples/l3fwd-power/main.c
index 2f205ea..086f29b 100644
--- a/examples/l3fwd-power/main.c
+++ b/examples/l3fwd-power/main.c
@@ -239,9 +239,7 @@ static struct rte_eth_conf port_conf = {
 	},
 	.intr_conf = {
 		.lsc = 1,
-#ifdef RTE_NEXT_ABI
 		.rxq = 1,
-#endif
 	},
 };
 
diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index a969435..a49dcec 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -44,7 +44,7 @@ CFLAGS += $(WERROR_FLAGS) -O3
 
 EXPORT_MAP := rte_eal_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 # specific to linuxapp exec-env
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) := eal.c
diff --git a/lib/librte_eal/bsdapp/eal/include/exec-env/rte_interrupts.h b/lib/librte_eal/bsdapp/eal/include/exec-env/rte_interrupts.h
index bffa902..88d4ae1 100644
--- a/lib/librte_eal/bsdapp/eal/include/exec-env/rte_interrupts.h
+++ b/lib/librte_eal/bsdapp/eal/include/exec-env/rte_interrupts.h
@@ -50,11 +50,9 @@ struct rte_intr_handle {
 	int fd;                          /**< file descriptor */
 	int uio_cfg_fd;                  /**< UIO config file descriptor */
 	enum rte_intr_handle_type type;  /**< handle type */
-#ifdef RTE_NEXT_ABI
 	int max_intr;                    /**< max interrupt requested */
 	uint32_t nb_efd;                 /**< number of available efds */
 	int *intr_vec;                   /**< intr vector number array */
-#endif
 };
 
 /**
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index 376d275..d62196e 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -35,7 +35,7 @@ LIB = librte_eal.a
 
 EXPORT_MAP := rte_eal_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
diff --git a/lib/librte_eal/linuxapp/eal/eal_interrupts.c b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
index 3f87875..66e1fe3 100644
--- a/lib/librte_eal/linuxapp/eal/eal_interrupts.c
+++ b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
@@ -290,26 +290,18 @@ vfio_enable_msix(struct rte_intr_handle *intr_handle) {
 
 	irq_set = (struct vfio_irq_set *) irq_set_buf;
 	irq_set->argsz = len;
-#ifdef RTE_NEXT_ABI
 	if (!intr_handle->max_intr)
 		intr_handle->max_intr = 1;
 	else if (intr_handle->max_intr > RTE_MAX_RXTX_INTR_VEC_ID)
 		intr_handle->max_intr = RTE_MAX_RXTX_INTR_VEC_ID + 1;
 
 	irq_set->count = intr_handle->max_intr;
-#else
-	irq_set->count = 1;
-#endif
 	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;
-#ifdef RTE_NEXT_ABI
 	memcpy(fd_ptr, intr_handle->efds, sizeof(intr_handle->efds));
 	fd_ptr[intr_handle->max_intr - 1] = intr_handle->fd;
-#else
-	fd_ptr[0] = intr_handle->fd;
-#endif
 
 	ret = ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, irq_set);
 
@@ -886,7 +878,6 @@ rte_eal_intr_init(void)
 	return -ret;
 }
 
-#ifdef RTE_NEXT_ABI
 static void
 eal_intr_proc_rxtx_intr(int fd, const struct rte_intr_handle *intr_handle)
 {
@@ -929,7 +920,6 @@ eal_intr_proc_rxtx_intr(int fd, const struct rte_intr_handle *intr_handle)
 		return;
 	} while (1);
 }
-#endif
 
 static int
 eal_epoll_process_event(struct epoll_event *evs, unsigned int n,
@@ -1068,7 +1058,6 @@ rte_epoll_ctl(int epfd, int op, int fd,
 	return 0;
 }
 
-#ifdef RTE_NEXT_ABI
 int
 rte_intr_rx_ctl(struct rte_intr_handle *intr_handle, int epfd,
 		int op, unsigned int vec, void *data)
@@ -1192,45 +1181,3 @@ rte_intr_allow_others(struct rte_intr_handle *intr_handle)
 {
 	return !!(intr_handle->max_intr - intr_handle->nb_efd);
 }
-
-#else
-int
-rte_intr_rx_ctl(struct rte_intr_handle *intr_handle,
-		int epfd, int op, unsigned int vec, void *data)
-{
-	RTE_SET_USED(intr_handle);
-	RTE_SET_USED(epfd);
-	RTE_SET_USED(op);
-	RTE_SET_USED(vec);
-	RTE_SET_USED(data);
-	return -ENOTSUP;
-}
-
-int
-rte_intr_efd_enable(struct rte_intr_handle *intr_handle, uint32_t nb_efd)
-{
-	RTE_SET_USED(intr_handle);
-	RTE_SET_USED(nb_efd);
-	return 0;
-}
-
-void
-rte_intr_efd_disable(struct rte_intr_handle *intr_handle)
-{
-	RTE_SET_USED(intr_handle);
-}
-
-int
-rte_intr_dp_is_en(struct rte_intr_handle *intr_handle)
-{
-	RTE_SET_USED(intr_handle);
-	return 0;
-}
-
-int
-rte_intr_allow_others(struct rte_intr_handle *intr_handle)
-{
-	RTE_SET_USED(intr_handle);
-	return 1;
-}
-#endif
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 b05f4c8..45071b7 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
@@ -86,14 +86,12 @@ struct rte_intr_handle {
 	};
 	int fd;	 /**< interrupt event file descriptor */
 	enum rte_intr_handle_type type;  /**< handle type */
-#ifdef RTE_NEXT_ABI
 	uint32_t max_intr;             /**< max interrupt requested */
 	uint32_t nb_efd;               /**< number of available efd(event fd) */
 	int efds[RTE_MAX_RXTX_INTR_VEC_ID];  /**< intr vectors/efds mapping */
 	struct rte_epoll_event elist[RTE_MAX_RXTX_INTR_VEC_ID];
 				       /**< intr vector epoll event */
 	int *intr_vec;                 /**< intr vector number array */
-#endif
 };
 
 #define RTE_EPOLL_PER_THREAD        -1  /**< to hint using per thread epfd */
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index fc45a71..3e81a0e 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -41,7 +41,7 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_ether_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 SRCS-y += rte_ethdev.c
 
diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 6b2400c..b309309 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -3033,7 +3033,6 @@ _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
 	rte_spinlock_unlock(&rte_eth_dev_cb_lock);
 }
 
-#ifdef RTE_NEXT_ABI
 int
 rte_eth_dev_rx_intr_ctl(uint8_t port_id, int epfd, int op, void *data)
 {
@@ -3139,45 +3138,6 @@ rte_eth_dev_rx_intr_disable(uint8_t port_id,
 	FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_intr_disable, -ENOTSUP);
 	return (*dev->dev_ops->rx_queue_intr_disable)(dev, queue_id);
 }
-#else
-int
-rte_eth_dev_rx_intr_enable(uint8_t port_id, uint16_t queue_id)
-{
-	RTE_SET_USED(port_id);
-	RTE_SET_USED(queue_id);
-	return -ENOTSUP;
-}
-
-int
-rte_eth_dev_rx_intr_disable(uint8_t port_id, uint16_t queue_id)
-{
-	RTE_SET_USED(port_id);
-	RTE_SET_USED(queue_id);
-	return -ENOTSUP;
-}
-
-int
-rte_eth_dev_rx_intr_ctl(uint8_t port_id, int epfd, int op, void *data)
-{
-	RTE_SET_USED(port_id);
-	RTE_SET_USED(epfd);
-	RTE_SET_USED(op);
-	RTE_SET_USED(data);
-	return -1;
-}
-
-int
-rte_eth_dev_rx_intr_ctl_q(uint8_t port_id, uint16_t queue_id,
-			  int epfd, int op, void *data)
-{
-	RTE_SET_USED(port_id);
-	RTE_SET_USED(queue_id);
-	RTE_SET_USED(epfd);
-	RTE_SET_USED(op);
-	RTE_SET_USED(data);
-	return -1;
-}
-#endif
 
 #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 544afe0..fa06554 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -845,10 +845,8 @@ struct rte_eth_fdir {
 struct rte_intr_conf {
 	/** enable/disable lsc interrupt. 0 (default) - disable, 1 enable */
 	uint16_t lsc;
-#ifdef RTE_NEXT_ABI
 	/** enable/disable rxq interrupt. 0 (default) - disable, 1 enable */
 	uint16_t rxq;
-#endif
 };
 
 /**
@@ -1392,12 +1390,10 @@ struct eth_dev_ops {
 	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 */
-#ifdef RTE_NEXT_ABI
 	/**< Enable Rx queue interrupt. */
 	eth_rx_enable_intr_t       rx_queue_intr_enable;
 	/**< Disable Rx queue interrupt.*/
 	eth_rx_disable_intr_t      rx_queue_intr_disable;
-#endif
 	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. */
-- 
2.5.1

^ permalink raw reply	[relevance 7%]

* [dpdk-dev] [PATCH v2 01/10] doc: init next release notes
  2015-09-02 13:16  3% ` [dpdk-dev] [PATCH v2 00/10] clean deprecated code Thomas Monjalon
@ 2015-09-02 13:16  5%   ` Thomas Monjalon
  2015-09-02 13:16  7%   ` [dpdk-dev] [PATCH v2 02/10] ethdev: remove Rx interrupt switch Thomas Monjalon
                     ` (3 subsequent siblings)
  4 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-09-02 13:16 UTC (permalink / raw)
  To: dev

Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
---
 doc/guides/rel_notes/index.rst       |  1 +
 doc/guides/rel_notes/release_2_2.rst | 58 ++++++++++++++++++++++++++++++++++++
 2 files changed, 59 insertions(+)
 create mode 100644 doc/guides/rel_notes/release_2_2.rst

diff --git a/doc/guides/rel_notes/index.rst b/doc/guides/rel_notes/index.rst
index d01cbc8..d8cadeb 100644
--- a/doc/guides/rel_notes/index.rst
+++ b/doc/guides/rel_notes/index.rst
@@ -40,6 +40,7 @@ Contents
     :numbered:
 
     rel_description
+    release_2_2
     release_2_1
     release_2_0
     release_1_8
diff --git a/doc/guides/rel_notes/release_2_2.rst b/doc/guides/rel_notes/release_2_2.rst
new file mode 100644
index 0000000..494b4eb
--- /dev/null
+++ b/doc/guides/rel_notes/release_2_2.rst
@@ -0,0 +1,58 @@
+DPDK Release 2.2
+================
+
+New Features
+------------
+
+
+Resolved Issues
+---------------
+
+
+Known Issues
+------------
+
+
+API Changes
+-----------
+
+
+ABI Changes
+-----------
+
+
+Shared Library Versions
+-----------------------
+
+The libraries prepended with a plus sign were incremented in this version.
+
+.. code-block:: diff
+
+     libethdev.so.1
+     librte_acl.so.1
+     librte_cfgfile.so.1
+     librte_cmdline.so.1
+     librte_distributor.so.1
+     librte_eal.so.1
+     librte_hash.so.1
+     librte_ip_frag.so.1
+     librte_ivshmem.so.1
+     librte_jobstats.so.1
+     librte_kni.so.1
+     librte_kvargs.so.1
+     librte_lpm.so.1
+     librte_malloc.so.1
+     librte_mbuf.so.1
+     librte_mempool.so.1
+     librte_meter.so.1
+     librte_pipeline.so.1
+     librte_pmd_bond.so.1
+     librte_pmd_ring.so.1
+     librte_port.so.1
+     librte_power.so.1
+     librte_reorder.so.1
+     librte_ring.so.1
+     librte_sched.so.1
+     librte_table.so.1
+     librte_timer.so.1
+     librte_vhost.so.1
-- 
2.5.1

^ permalink raw reply	[relevance 5%]

* [dpdk-dev] [PATCH v2 00/10] clean deprecated code
                     ` (3 preceding siblings ...)
  2015-09-01 21:31  4% ` [dpdk-dev] [PATCH 9/9] ring: remove deprecated functions Thomas Monjalon
@ 2015-09-02 13:16  3% ` Thomas Monjalon
  2015-09-02 13:16  5%   ` [dpdk-dev] [PATCH v2 01/10] doc: init next release notes Thomas Monjalon
                     ` (4 more replies)
  4 siblings, 5 replies; 200+ results
From: Thomas Monjalon @ 2015-09-02 13:16 UTC (permalink / raw)
  To: dev

Before starting a new integration cycle (2.2.0-rc0),
the deprecated code is removed.

The hash library is not cleaned in this patchset and would be
better done by its maintainers. Bruce, Pablo, please check the
file doc/guides/rel_notes/deprecation.rst.

Changes in v2:
- increment KNI and ring PMD versions
- list library versions in release notes
- list API/ABI changes in release notes

Stephen Hemminger (2):
  kni: remove deprecated functions
  ring: remove deprecated functions

Thomas Monjalon (8):
  doc: init next release notes
  ethdev: remove Rx interrupt switch
  mbuf: remove packet type from offload flags
  ethdev: remove SCTP flow entries switch
  eal: remove deprecated function
  mem: remove dummy malloc library
  lpm: remove deprecated field
  acl: remove old API

 MAINTAINERS                                        |   1 -
 app/test-acl/main.c                                |  17 ++
 app/test-pipeline/pipeline_hash.c                  |  12 -
 app/test-pmd/cmdline.c                             |   4 -
 app/test-pmd/csumonly.c                            |  14 -
 app/test-pmd/rxonly.c                              |  16 --
 app/test/Makefile                                  |   6 -
 app/test/packet_burst_generator.c                  |  12 -
 app/test/test_acl.c                                | 194 ++++++++++++++
 app/test/test_acl.h                                |  59 +++++
 app/test/test_func_reentrancy.c                    |   4 +-
 app/test/test_kni.c                                |  36 ---
 app/test/test_lpm.c                                |   4 +-
 doc/guides/prog_guide/dev_kit_build_system.rst     |   2 +-
 doc/guides/prog_guide/env_abstraction_layer.rst    |   2 +-
 doc/guides/prog_guide/kernel_nic_interface.rst     |   2 -
 doc/guides/prog_guide/source_org.rst               |   1 -
 .../thread_safety_intel_dpdk_functions.rst         |   2 +-
 doc/guides/rel_notes/deprecation.rst               |  33 ---
 doc/guides/rel_notes/index.rst                     |   1 +
 doc/guides/rel_notes/release_2_2.rst               |  81 ++++++
 doc/guides/sample_app_ug/kernel_nic_interface.rst  |   9 -
 drivers/net/cxgbe/sge.c                            |  16 --
 drivers/net/e1000/igb_ethdev.c                     |  26 --
 drivers/net/e1000/igb_rxtx.c                       |  34 ---
 drivers/net/enic/enic_main.c                       |  25 --
 drivers/net/fm10k/fm10k_rxtx.c                     |  15 --
 drivers/net/i40e/i40e_fdir.c                       |   4 -
 drivers/net/i40e/i40e_rxtx.c                       | 293 ---------------------
 drivers/net/ixgbe/ixgbe_ethdev.c                   |  40 ---
 drivers/net/ixgbe/ixgbe_rxtx.c                     |  87 ------
 drivers/net/ixgbe/ixgbe_rxtx_vec.c                 | 111 --------
 drivers/net/mlx4/mlx4.c                            |  29 --
 drivers/net/ring/Makefile                          |   2 +-
 drivers/net/ring/rte_eth_ring.c                    |  56 ----
 drivers/net/ring/rte_eth_ring.h                    |   3 -
 drivers/net/ring/rte_eth_ring_version.map          |   2 -
 drivers/net/vmxnet3/vmxnet3_rxtx.c                 |   8 -
 examples/ip_fragmentation/main.c                   |  10 -
 examples/ip_reassembly/main.c                      |  10 -
 examples/l3fwd-acl/main.c                          |  44 ++--
 examples/l3fwd-power/main.c                        |  11 -
 examples/l3fwd/main.c                              | 114 --------
 examples/tep_termination/vxlan.c                   |   5 -
 lib/Makefile                                       |   1 -
 lib/librte_acl/Makefile                            |   2 +-
 lib/librte_acl/rte_acl.c                           | 170 ------------
 lib/librte_acl/rte_acl.h                           | 104 --------
 lib/librte_acl/rte_acl_version.map                 |   2 -
 lib/librte_eal/bsdapp/eal/Makefile                 |   2 +-
 .../bsdapp/eal/include/exec-env/rte_interrupts.h   |   2 -
 lib/librte_eal/bsdapp/eal/rte_eal_version.map      |   1 -
 lib/librte_eal/common/eal_common_pci.c             |   6 -
 lib/librte_eal/common/include/rte_pci.h            |   2 -
 lib/librte_eal/linuxapp/eal/Makefile               |   2 +-
 lib/librte_eal/linuxapp/eal/eal_interrupts.c       |  53 ----
 .../linuxapp/eal/include/exec-env/rte_interrupts.h |   2 -
 .../linuxapp/eal/include/exec-env/rte_kni_common.h |   6 -
 lib/librte_eal/linuxapp/eal/rte_eal_version.map    |   1 -
 lib/librte_ether/Makefile                          |   2 +-
 lib/librte_ether/rte_eth_ctrl.h                    |   4 -
 lib/librte_ether/rte_ethdev.c                      |  40 ---
 lib/librte_ether/rte_ethdev.h                      |   4 -
 lib/librte_kni/Makefile                            |   2 +-
 lib/librte_kni/rte_kni.c                           |  51 ----
 lib/librte_kni/rte_kni.h                           |  54 ----
 lib/librte_kni/rte_kni_version.map                 |   3 -
 lib/librte_lpm/Makefile                            |   2 +-
 lib/librte_lpm/rte_lpm.h                           |  11 -
 lib/librte_malloc/Makefile                         |  48 ----
 lib/librte_malloc/rte_malloc_empty.c               |  34 ---
 lib/librte_malloc/rte_malloc_version.map           |   3 -
 lib/librte_mbuf/Makefile                           |   2 +-
 lib/librte_mbuf/rte_mbuf.c                         |  10 -
 lib/librte_mbuf/rte_mbuf.h                         |  28 +-
 mk/rte.app.mk                                      |   1 -
 76 files changed, 385 insertions(+), 1727 deletions(-)
 create mode 100644 doc/guides/rel_notes/release_2_2.rst
 delete mode 100644 lib/librte_malloc/Makefile
 delete mode 100644 lib/librte_malloc/rte_malloc_empty.c
 delete mode 100644 lib/librte_malloc/rte_malloc_version.map

-- 
2.5.1

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH 9/9] ring: remove deprecated functions
                     ` (2 preceding siblings ...)
  2015-09-01 21:30 11% ` [dpdk-dev] [PATCH 3/9] ethdev: remove SCTP flow entries switch Thomas Monjalon
@ 2015-09-01 21:31  4% ` Thomas Monjalon
  2015-09-02 13:16  3% ` [dpdk-dev] [PATCH v2 00/10] clean deprecated code Thomas Monjalon
  4 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-09-01 21:31 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger

From: Stephen Hemminger <shemming@brocade.com>

These were deprecated in 2.0 so remove them from 2.2

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
---
 doc/guides/rel_notes/deprecation.rst      |  3 --
 drivers/net/ring/rte_eth_ring.c           | 56 -------------------------------
 drivers/net/ring/rte_eth_ring.h           |  3 --
 drivers/net/ring/rte_eth_ring_version.map |  2 --
 4 files changed, 64 deletions(-)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 04819fa..5f6079b 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -40,9 +40,6 @@ Deprecation Notices
   the tunnel type, TNI/VNI, inner MAC and inner VLAN are monitored.
   The release 2.2 will contain these changes without backwards compatibility.
 
-* librte_pmd_ring: The deprecated functions rte_eth_ring_pair_create and
-  rte_eth_ring_pair_attach should be removed.
-
 * ABI changes are planned for struct virtio_net in order to support vhost-user
   multiple queues feature.
   It should be integrated in release 2.2 without backward compatibility.
diff --git a/drivers/net/ring/rte_eth_ring.c b/drivers/net/ring/rte_eth_ring.c
index 6fd3d0a..0ba36d5 100644
--- a/drivers/net/ring/rte_eth_ring.c
+++ b/drivers/net/ring/rte_eth_ring.c
@@ -391,62 +391,6 @@ eth_dev_ring_create(const char *name, const unsigned numa_node,
 	return 0;
 }
 
-
-static int
-eth_dev_ring_pair_create(const char *name, const unsigned numa_node,
-		enum dev_action action)
-{
-	/* rx and tx are so-called from point of view of first port.
-	 * They are inverted from the point of view of second port
-	 */
-	struct rte_ring *rx[RTE_PMD_RING_MAX_RX_RINGS];
-	struct rte_ring *tx[RTE_PMD_RING_MAX_TX_RINGS];
-	unsigned i;
-	char rx_rng_name[RTE_RING_NAMESIZE];
-	char tx_rng_name[RTE_RING_NAMESIZE];
-	unsigned num_rings = RTE_MIN(RTE_PMD_RING_MAX_RX_RINGS,
-			RTE_PMD_RING_MAX_TX_RINGS);
-
-	for (i = 0; i < num_rings; i++) {
-		snprintf(rx_rng_name, sizeof(rx_rng_name), "ETH_RX%u_%s", i, name);
-		rx[i] = (action == DEV_CREATE) ?
-				rte_ring_create(rx_rng_name, 1024, numa_node,
-						RING_F_SP_ENQ|RING_F_SC_DEQ) :
-				rte_ring_lookup(rx_rng_name);
-		if (rx[i] == NULL)
-			return -1;
-		snprintf(tx_rng_name, sizeof(tx_rng_name), "ETH_TX%u_%s", i, name);
-		tx[i] = (action == DEV_CREATE) ?
-				rte_ring_create(tx_rng_name, 1024, numa_node,
-						RING_F_SP_ENQ|RING_F_SC_DEQ):
-				rte_ring_lookup(tx_rng_name);
-		if (tx[i] == NULL)
-			return -1;
-	}
-
-	if (rte_eth_from_rings(rx_rng_name, rx, num_rings, tx, num_rings,
-				numa_node) < 0 ||
-			rte_eth_from_rings(tx_rng_name, tx, num_rings, rx,
-				num_rings, numa_node) < 0)
-		return -1;
-
-	return 0;
-}
-
-int
-rte_eth_ring_pair_create(const char *name, const unsigned numa_node)
-{
-	RTE_LOG(WARNING, PMD, "rte_eth_ring_pair_create is deprecated\n");
-	return eth_dev_ring_pair_create(name, numa_node, DEV_CREATE);
-}
-
-int
-rte_eth_ring_pair_attach(const char *name, const unsigned numa_node)
-{
-	RTE_LOG(WARNING, PMD, "rte_eth_ring_pair_attach is deprecated\n");
-	return eth_dev_ring_pair_create(name, numa_node, DEV_ATTACH);
-}
-
 struct node_action_pair {
 	char name[PATH_MAX];
 	unsigned node;
diff --git a/drivers/net/ring/rte_eth_ring.h b/drivers/net/ring/rte_eth_ring.h
index 2262249..5a69bff 100644
--- a/drivers/net/ring/rte_eth_ring.h
+++ b/drivers/net/ring/rte_eth_ring.h
@@ -65,9 +65,6 @@ int rte_eth_from_rings(const char *name,
 		const unsigned nb_tx_queues,
 		const unsigned numa_node);
 
-int rte_eth_ring_pair_create(const char *name, const unsigned numa_node);
-int rte_eth_ring_pair_attach(const char *name, const unsigned numa_node);
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/drivers/net/ring/rte_eth_ring_version.map b/drivers/net/ring/rte_eth_ring_version.map
index 8ad107d..0875e25 100644
--- a/drivers/net/ring/rte_eth_ring_version.map
+++ b/drivers/net/ring/rte_eth_ring_version.map
@@ -2,8 +2,6 @@ DPDK_2.0 {
 	global:
 
 	rte_eth_from_rings;
-	rte_eth_ring_pair_attach;
-	rte_eth_ring_pair_create;
 
 	local: *;
 };
-- 
2.5.1

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH 3/9] ethdev: remove SCTP flow entries switch
    2015-09-01 21:30  5% ` [dpdk-dev] [PATCH 1/9] ethdev: remove Rx interrupt switch Thomas Monjalon
  2015-09-01 21:30  2% ` [dpdk-dev] [PATCH 2/9] mbuf: remove packet type from offload flags Thomas Monjalon
@ 2015-09-01 21:30 11% ` Thomas Monjalon
  2015-09-01 21:31  4% ` [dpdk-dev] [PATCH 9/9] ring: remove deprecated functions Thomas Monjalon
  2015-09-02 13:16  3% ` [dpdk-dev] [PATCH v2 00/10] clean deprecated code Thomas Monjalon
  4 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-09-01 21:30 UTC (permalink / raw)
  To: dev

The extended SCTP flow entries are now part of the standard API.

Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
---
 app/test-pmd/cmdline.c               | 4 ----
 doc/guides/rel_notes/deprecation.rst | 3 ---
 drivers/net/i40e/i40e_fdir.c         | 4 ----
 lib/librte_ether/rte_eth_ctrl.h      | 4 ----
 4 files changed, 15 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 5799c9c..0f8f48f 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -7888,12 +7888,10 @@ cmd_flow_director_filter_parsed(void *parsed_result,
 		IPV4_ADDR_TO_UINT(res->ip_src,
 			entry.input.flow.sctp4_flow.ip.src_ip);
 		/* need convert to big endian. */
-#ifdef RTE_NEXT_ABI
 		entry.input.flow.sctp4_flow.dst_port =
 				rte_cpu_to_be_16(res->port_dst);
 		entry.input.flow.sctp4_flow.src_port =
 				rte_cpu_to_be_16(res->port_src);
-#endif
 		entry.input.flow.sctp4_flow.verify_tag =
 				rte_cpu_to_be_32(res->verify_tag_value);
 		break;
@@ -7917,12 +7915,10 @@ cmd_flow_director_filter_parsed(void *parsed_result,
 		IPV6_ADDR_TO_ARRAY(res->ip_src,
 			entry.input.flow.sctp6_flow.ip.src_ip);
 		/* need convert to big endian. */
-#ifdef RTE_NEXT_ABI
 		entry.input.flow.sctp6_flow.dst_port =
 				rte_cpu_to_be_16(res->port_dst);
 		entry.input.flow.sctp6_flow.src_port =
 				rte_cpu_to_be_16(res->port_src);
-#endif
 		entry.input.flow.sctp6_flow.verify_tag =
 				rte_cpu_to_be_32(res->verify_tag_value);
 		break;
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 639ab18..cf5cd17 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -44,9 +44,6 @@ Deprecation Notices
   flow director filtering in VF. The release 2.1 does not contain these ABI
   changes, but release 2.2 will, and no backwards compatibility is planned.
 
-* ABI change is planned to extend the SCTP flow's key input from release 2.1.
-  The change may be enabled in the release 2.1 with CONFIG_RTE_NEXT_ABI.
-
 * ABI changes are planned for struct rte_eth_fdir_filter and
   rte_eth_fdir_masks in order to support new flow director modes,
   MAC VLAN and Cloud, on x550. The MAC VLAN mode means the MAC and
diff --git a/drivers/net/i40e/i40e_fdir.c b/drivers/net/i40e/i40e_fdir.c
index 8208273..c9ce98f 100644
--- a/drivers/net/i40e/i40e_fdir.c
+++ b/drivers/net/i40e/i40e_fdir.c
@@ -822,7 +822,6 @@ i40e_fdir_construct_pkt(struct i40e_pf *pf,
 		sctp = (struct sctp_hdr *)(raw_pkt + sizeof(struct ether_hdr) +
 					   sizeof(struct ipv4_hdr));
 		payload = (unsigned char *)sctp + sizeof(struct sctp_hdr);
-#ifdef RTE_NEXT_ABI
 		/*
 		 * The source and destination fields in the transmitted packet
 		 * need to be presented in a reversed order with respect
@@ -830,7 +829,6 @@ i40e_fdir_construct_pkt(struct i40e_pf *pf,
 		 */
 		sctp->src_port = fdir_input->flow.sctp4_flow.dst_port;
 		sctp->dst_port = fdir_input->flow.sctp4_flow.src_port;
-#endif
 		sctp->tag = fdir_input->flow.sctp4_flow.verify_tag;
 		break;
 
@@ -873,7 +871,6 @@ i40e_fdir_construct_pkt(struct i40e_pf *pf,
 		sctp = (struct sctp_hdr *)(raw_pkt + sizeof(struct ether_hdr) +
 					   sizeof(struct ipv6_hdr));
 		payload = (unsigned char *)sctp + sizeof(struct sctp_hdr);
-#ifdef RTE_NEXT_ABI
 		/*
 		 * The source and destination fields in the transmitted packet
 		 * need to be presented in a reversed order with respect
@@ -881,7 +878,6 @@ i40e_fdir_construct_pkt(struct i40e_pf *pf,
 		 */
 		sctp->src_port = fdir_input->flow.sctp6_flow.dst_port;
 		sctp->dst_port = fdir_input->flow.sctp6_flow.src_port;
-#endif
 		sctp->tag = fdir_input->flow.sctp6_flow.verify_tag;
 		break;
 
diff --git a/lib/librte_ether/rte_eth_ctrl.h b/lib/librte_ether/rte_eth_ctrl.h
index 4beb981..26b7b33 100644
--- a/lib/librte_ether/rte_eth_ctrl.h
+++ b/lib/librte_ether/rte_eth_ctrl.h
@@ -335,10 +335,8 @@ struct rte_eth_tcpv4_flow {
  */
 struct rte_eth_sctpv4_flow {
 	struct rte_eth_ipv4_flow ip; /**< IPv4 fields to match. */
-#ifdef RTE_NEXT_ABI
 	uint16_t src_port;           /**< SCTP source port to match. */
 	uint16_t dst_port;           /**< SCTP destination port to match. */
-#endif
 	uint32_t verify_tag;         /**< Verify tag to match */
 };
 
@@ -373,10 +371,8 @@ struct rte_eth_tcpv6_flow {
  */
 struct rte_eth_sctpv6_flow {
 	struct rte_eth_ipv6_flow ip; /**< IPv6 fields to match. */
-#ifdef RTE_NEXT_ABI
 	uint16_t src_port;           /**< SCTP source port to match. */
 	uint16_t dst_port;           /**< SCTP destination port to match. */
-#endif
 	uint32_t verify_tag;         /**< Verify tag to match */
 };
 
-- 
2.5.1

^ permalink raw reply	[relevance 11%]

* [dpdk-dev] [PATCH 2/9] mbuf: remove packet type from offload flags
    2015-09-01 21:30  5% ` [dpdk-dev] [PATCH 1/9] ethdev: remove Rx interrupt switch Thomas Monjalon
@ 2015-09-01 21:30  2% ` Thomas Monjalon
  2015-09-01 21:30 11% ` [dpdk-dev] [PATCH 3/9] ethdev: remove SCTP flow entries switch Thomas Monjalon
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-09-01 21:30 UTC (permalink / raw)
  To: dev

The extended unified packet type is now part of the standard ABI.
As mbuf struct is changed, the mbuf library version is bumped.

Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
---
 app/test-pipeline/pipeline_hash.c                  |  12 -
 app/test-pmd/csumonly.c                            |  14 -
 app/test-pmd/rxonly.c                              |  16 --
 app/test/packet_burst_generator.c                  |  12 -
 doc/guides/rel_notes/deprecation.rst               |   5 -
 drivers/net/cxgbe/sge.c                            |  16 --
 drivers/net/e1000/igb_rxtx.c                       |  34 ---
 drivers/net/enic/enic_main.c                       |  25 --
 drivers/net/fm10k/fm10k_rxtx.c                     |  15 --
 drivers/net/i40e/i40e_rxtx.c                       | 293 ---------------------
 drivers/net/ixgbe/ixgbe_rxtx.c                     |  87 ------
 drivers/net/ixgbe/ixgbe_rxtx_vec.c                 | 111 --------
 drivers/net/mlx4/mlx4.c                            |  29 --
 drivers/net/vmxnet3/vmxnet3_rxtx.c                 |   8 -
 examples/ip_fragmentation/main.c                   |  10 -
 examples/ip_reassembly/main.c                      |  10 -
 examples/l3fwd-acl/main.c                          |  27 --
 examples/l3fwd-power/main.c                        |   9 -
 examples/l3fwd/main.c                              | 114 --------
 examples/tep_termination/vxlan.c                   |   5 -
 .../linuxapp/eal/include/exec-env/rte_kni_common.h |   6 -
 lib/librte_mbuf/Makefile                           |   2 +-
 lib/librte_mbuf/rte_mbuf.c                         |  10 -
 lib/librte_mbuf/rte_mbuf.h                         |  28 +-
 24 files changed, 2 insertions(+), 896 deletions(-)

diff --git a/app/test-pipeline/pipeline_hash.c b/app/test-pipeline/pipeline_hash.c
index aa3f9e5..548615f 100644
--- a/app/test-pipeline/pipeline_hash.c
+++ b/app/test-pipeline/pipeline_hash.c
@@ -459,33 +459,21 @@ app_main_loop_rx_metadata(void) {
 			signature = RTE_MBUF_METADATA_UINT32_PTR(m, 0);
 			key = RTE_MBUF_METADATA_UINT8_PTR(m, 32);
 
-#ifdef RTE_NEXT_ABI
 			if (RTE_ETH_IS_IPV4_HDR(m->packet_type)) {
-#else
-			if (m->ol_flags & PKT_RX_IPV4_HDR) {
-#endif
 				ip_hdr = (struct ipv4_hdr *)
 					&m_data[sizeof(struct ether_hdr)];
 				ip_dst = ip_hdr->dst_addr;
 
 				k32 = (uint32_t *) key;
 				k32[0] = ip_dst & 0xFFFFFF00;
-#ifdef RTE_NEXT_ABI
 			} else if (RTE_ETH_IS_IPV6_HDR(m->packet_type)) {
-#else
-			} else {
-#endif
 				ipv6_hdr = (struct ipv6_hdr *)
 					&m_data[sizeof(struct ether_hdr)];
 				ipv6_dst = ipv6_hdr->dst_addr;
 
 				memcpy(key, ipv6_dst, 16);
-#ifdef RTE_NEXT_ABI
 			} else
 				continue;
-#else
-			}
-#endif
 
 			*signature = test_hash(key, 0, 0);
 		}
diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c
index 1bf3485..e561dde 100644
--- a/app/test-pmd/csumonly.c
+++ b/app/test-pmd/csumonly.c
@@ -202,14 +202,9 @@ parse_ethernet(struct ether_hdr *eth_hdr, struct testpmd_offload_info *info)
 
 /* Parse a vxlan header */
 static void
-#ifdef RTE_NEXT_ABI
 parse_vxlan(struct udp_hdr *udp_hdr,
 	    struct testpmd_offload_info *info,
 	    uint32_t pkt_type)
-#else
-parse_vxlan(struct udp_hdr *udp_hdr, struct testpmd_offload_info *info,
-	uint64_t mbuf_olflags)
-#endif
 {
 	struct ether_hdr *eth_hdr;
 
@@ -217,12 +212,7 @@ parse_vxlan(struct udp_hdr *udp_hdr, struct testpmd_offload_info *info,
 	 * (rfc7348) or that the rx offload flag is set (i40e only
 	 * currently) */
 	if (udp_hdr->dst_port != _htons(4789) &&
-#ifdef RTE_NEXT_ABI
 		RTE_ETH_IS_TUNNEL_PKT(pkt_type) == 0)
-#else
-		(mbuf_olflags & (PKT_RX_TUNNEL_IPV4_HDR |
-			PKT_RX_TUNNEL_IPV6_HDR)) == 0)
-#endif
 		return;
 
 	info->is_tunnel = 1;
@@ -559,11 +549,7 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
 				struct udp_hdr *udp_hdr;
 				udp_hdr = (struct udp_hdr *)((char *)l3_hdr +
 					info.l3_len);
-#ifdef RTE_NEXT_ABI
 				parse_vxlan(udp_hdr, &info, m->packet_type);
-#else
-				parse_vxlan(udp_hdr, &info, m->ol_flags);
-#endif
 			} else if (info.l4_proto == IPPROTO_GRE) {
 				struct simple_gre_hdr *gre_hdr;
 				gre_hdr = (struct simple_gre_hdr *)
diff --git a/app/test-pmd/rxonly.c b/app/test-pmd/rxonly.c
index ee7fd8d..14555ab 100644
--- a/app/test-pmd/rxonly.c
+++ b/app/test-pmd/rxonly.c
@@ -91,11 +91,7 @@ pkt_burst_receive(struct fwd_stream *fs)
 	uint64_t ol_flags;
 	uint16_t nb_rx;
 	uint16_t i, packet_type;
-#ifdef RTE_NEXT_ABI
 	uint16_t is_encapsulation;
-#else
-	uint64_t is_encapsulation;
-#endif
 
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
 	uint64_t start_tsc;
@@ -138,13 +134,7 @@ pkt_burst_receive(struct fwd_stream *fs)
 		eth_type = RTE_BE_TO_CPU_16(eth_hdr->ether_type);
 		ol_flags = mb->ol_flags;
 		packet_type = mb->packet_type;
-
-#ifdef RTE_NEXT_ABI
 		is_encapsulation = RTE_ETH_IS_TUNNEL_PKT(packet_type);
-#else
-		is_encapsulation = ol_flags & (PKT_RX_TUNNEL_IPV4_HDR |
-				PKT_RX_TUNNEL_IPV6_HDR);
-#endif
 
 		print_ether_addr("  src=", &eth_hdr->s_addr);
 		print_ether_addr(" - dst=", &eth_hdr->d_addr);
@@ -171,7 +161,6 @@ pkt_burst_receive(struct fwd_stream *fs)
 		if (ol_flags & PKT_RX_QINQ_PKT)
 			printf(" - QinQ VLAN tci=0x%x, VLAN tci outer=0x%x",
 					mb->vlan_tci, mb->vlan_tci_outer);
-#ifdef RTE_NEXT_ABI
 		if (mb->packet_type) {
 			uint32_t ptype;
 
@@ -341,7 +330,6 @@ pkt_burst_receive(struct fwd_stream *fs)
 			printf("\n");
 		} else
 			printf("Unknown packet type\n");
-#endif /* RTE_NEXT_ABI */
 		if (is_encapsulation) {
 			struct ipv4_hdr *ipv4_hdr;
 			struct ipv6_hdr *ipv6_hdr;
@@ -355,11 +343,7 @@ pkt_burst_receive(struct fwd_stream *fs)
 			l2_len  = sizeof(struct ether_hdr);
 
 			 /* Do not support ipv4 option field */
-#ifdef RTE_NEXT_ABI
 			if (RTE_ETH_IS_IPV4_HDR(packet_type)) {
-#else
-			if (ol_flags & PKT_RX_TUNNEL_IPV4_HDR) {
-#endif
 				l3_len = sizeof(struct ipv4_hdr);
 				ipv4_hdr = rte_pktmbuf_mtod_offset(mb,
 								   struct ipv4_hdr *,
diff --git a/app/test/packet_burst_generator.c b/app/test/packet_burst_generator.c
index d9d808b..a93c3b5 100644
--- a/app/test/packet_burst_generator.c
+++ b/app/test/packet_burst_generator.c
@@ -273,21 +273,9 @@ nomore_mbuf:
 		if (ipv4) {
 			pkt->vlan_tci  = ETHER_TYPE_IPv4;
 			pkt->l3_len = sizeof(struct ipv4_hdr);
-#ifndef RTE_NEXT_ABI
-			if (vlan_enabled)
-				pkt->ol_flags = PKT_RX_IPV4_HDR | PKT_RX_VLAN_PKT;
-			else
-				pkt->ol_flags = PKT_RX_IPV4_HDR;
-#endif
 		} else {
 			pkt->vlan_tci  = ETHER_TYPE_IPv6;
 			pkt->l3_len = sizeof(struct ipv6_hdr);
-#ifndef RTE_NEXT_ABI
-			if (vlan_enabled)
-				pkt->ol_flags = PKT_RX_IPV6_HDR | PKT_RX_VLAN_PKT;
-			else
-				pkt->ol_flags = PKT_RX_IPV6_HDR;
-#endif
 		}
 
 		pkts_burst[nb_pkt] = pkt;
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 991a777..639ab18 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -24,11 +24,6 @@ Deprecation Notices
 * The field mem_location of the rte_lpm structure is deprecated and should be
   removed as well as the macros RTE_LPM_HEAP and RTE_LPM_MEMZONE.
 
-* Significant ABI changes are planned for struct rte_mbuf, struct rte_kni_mbuf,
-  and several ``PKT_RX_`` flags will be removed, to support unified packet type
-  from release 2.1. Those changes may be enabled in the upcoming release 2.1
-  with CONFIG_RTE_NEXT_ABI.
-
 * librte_malloc library has been integrated into librte_eal. The 2.1 release
   creates a dummy/empty malloc library to fulfill binaries with dynamic linking
   dependencies on librte_malloc.so. Such dummy library will not be created from
diff --git a/drivers/net/cxgbe/sge.c b/drivers/net/cxgbe/sge.c
index d570d33..6eb1244 100644
--- a/drivers/net/cxgbe/sge.c
+++ b/drivers/net/cxgbe/sge.c
@@ -1299,22 +1299,14 @@ int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp,
 
 	mbuf->port = pkt->iff;
 	if (pkt->l2info & htonl(F_RXF_IP)) {
-#ifdef RTE_NEXT_ABI
 		mbuf->packet_type = RTE_PTYPE_L3_IPV4;
-#else
-		mbuf->ol_flags |= PKT_RX_IPV4_HDR;
-#endif
 		if (unlikely(!csum_ok))
 			mbuf->ol_flags |= PKT_RX_IP_CKSUM_BAD;
 
 		if ((pkt->l2info & htonl(F_RXF_UDP | F_RXF_TCP)) && !csum_ok)
 			mbuf->ol_flags |= PKT_RX_L4_CKSUM_BAD;
 	} else if (pkt->l2info & htonl(F_RXF_IP6)) {
-#ifdef RTE_NEXT_ABI
 		mbuf->packet_type = RTE_PTYPE_L3_IPV6;
-#else
-		mbuf->ol_flags |= PKT_RX_IPV6_HDR;
-#endif
 	}
 
 	mbuf->port = pkt->iff;
@@ -1419,11 +1411,7 @@ static int process_responses(struct sge_rspq *q, int budget,
 			unmap_rx_buf(&rxq->fl);
 
 			if (cpl->l2info & htonl(F_RXF_IP)) {
-#ifdef RTE_NEXT_ABI
 				pkt->packet_type = RTE_PTYPE_L3_IPV4;
-#else
-				pkt->ol_flags |= PKT_RX_IPV4_HDR;
-#endif
 				if (unlikely(!csum_ok))
 					pkt->ol_flags |= PKT_RX_IP_CKSUM_BAD;
 
@@ -1431,11 +1419,7 @@ static int process_responses(struct sge_rspq *q, int budget,
 				     htonl(F_RXF_UDP | F_RXF_TCP)) && !csum_ok)
 					pkt->ol_flags |= PKT_RX_L4_CKSUM_BAD;
 			} else if (cpl->l2info & htonl(F_RXF_IP6)) {
-#ifdef RTE_NEXT_ABI
 				pkt->packet_type = RTE_PTYPE_L3_IPV6;
-#else
-				pkt->ol_flags |= PKT_RX_IPV6_HDR;
-#endif
 			}
 
 			if (!rss_hdr->filter_tid && rss_hdr->hash_type) {
diff --git a/drivers/net/e1000/igb_rxtx.c b/drivers/net/e1000/igb_rxtx.c
index b13930e..19905fd 100644
--- a/drivers/net/e1000/igb_rxtx.c
+++ b/drivers/net/e1000/igb_rxtx.c
@@ -590,7 +590,6 @@ eth_igb_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
  *  RX functions
  *
  **********************************************************************/
-#ifdef RTE_NEXT_ABI
 #define IGB_PACKET_TYPE_IPV4              0X01
 #define IGB_PACKET_TYPE_IPV4_TCP          0X11
 #define IGB_PACKET_TYPE_IPV4_UDP          0X21
@@ -684,35 +683,6 @@ rx_desc_hlen_type_rss_to_pkt_flags(uint32_t hl_tp_rs)
 
 	return pkt_flags;
 }
-#else /* RTE_NEXT_ABI */
-static inline uint64_t
-rx_desc_hlen_type_rss_to_pkt_flags(uint32_t hl_tp_rs)
-{
-	uint64_t pkt_flags;
-
-	static uint64_t ip_pkt_types_map[16] = {
-		0, PKT_RX_IPV4_HDR, PKT_RX_IPV4_HDR_EXT, PKT_RX_IPV4_HDR_EXT,
-		PKT_RX_IPV6_HDR, 0, 0, 0,
-		PKT_RX_IPV6_HDR_EXT, 0, 0, 0,
-		PKT_RX_IPV6_HDR_EXT, 0, 0, 0,
-	};
-
-#if defined(RTE_LIBRTE_IEEE1588)
-	static uint32_t ip_pkt_etqf_map[8] = {
-		0, 0, 0, PKT_RX_IEEE1588_PTP,
-		0, 0, 0, 0,
-	};
-
-	pkt_flags = (hl_tp_rs & E1000_RXDADV_PKTTYPE_ETQF) ?
-				ip_pkt_etqf_map[(hl_tp_rs >> 4) & 0x07] :
-				ip_pkt_types_map[(hl_tp_rs >> 4) & 0x0F];
-#else
-	pkt_flags = (hl_tp_rs & E1000_RXDADV_PKTTYPE_ETQF) ? 0 :
-				ip_pkt_types_map[(hl_tp_rs >> 4) & 0x0F];
-#endif
-	return pkt_flags | (((hl_tp_rs & 0x0F) == 0) ?  0 : PKT_RX_RSS_HASH);
-}
-#endif /* RTE_NEXT_ABI */
 
 static inline uint64_t
 rx_desc_status_to_pkt_flags(uint32_t rx_status)
@@ -886,10 +856,8 @@ eth_igb_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 		pkt_flags = pkt_flags | rx_desc_status_to_pkt_flags(staterr);
 		pkt_flags = pkt_flags | rx_desc_error_to_pkt_flags(staterr);
 		rxm->ol_flags = pkt_flags;
-#ifdef RTE_NEXT_ABI
 		rxm->packet_type = igb_rxd_pkt_info_to_pkt_type(rxd.wb.lower.
 						lo_dword.hs_rss.pkt_info);
-#endif
 
 		/*
 		 * Store the mbuf address into the next entry of the array
@@ -1124,10 +1092,8 @@ eth_igb_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 		pkt_flags = pkt_flags | rx_desc_status_to_pkt_flags(staterr);
 		pkt_flags = pkt_flags | rx_desc_error_to_pkt_flags(staterr);
 		first_seg->ol_flags = pkt_flags;
-#ifdef RTE_NEXT_ABI
 		first_seg->packet_type = igb_rxd_pkt_info_to_pkt_type(rxd.wb.
 					lower.lo_dword.hs_rss.pkt_info);
-#endif
 
 		/* Prefetch data of first segment, if configured to do so. */
 		rte_packet_prefetch((char *)first_seg->buf_addr +
diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c
index f47e96c..3b8719f 100644
--- a/drivers/net/enic/enic_main.c
+++ b/drivers/net/enic/enic_main.c
@@ -423,11 +423,7 @@ static int enic_rq_indicate_buf(struct vnic_rq *rq,
 		rx_pkt->pkt_len = bytes_written;
 
 		if (ipv4) {
-#ifdef RTE_NEXT_ABI
 			rx_pkt->packet_type = RTE_PTYPE_L3_IPV4;
-#else
-			rx_pkt->ol_flags |= PKT_RX_IPV4_HDR;
-#endif
 			if (!csum_not_calc) {
 				if (unlikely(!ipv4_csum_ok))
 					rx_pkt->ol_flags |= PKT_RX_IP_CKSUM_BAD;
@@ -436,11 +432,7 @@ static int enic_rq_indicate_buf(struct vnic_rq *rq,
 					rx_pkt->ol_flags |= PKT_RX_L4_CKSUM_BAD;
 			}
 		} else if (ipv6)
-#ifdef RTE_NEXT_ABI
 			rx_pkt->packet_type = RTE_PTYPE_L3_IPV6;
-#else
-			rx_pkt->ol_flags |= PKT_RX_IPV6_HDR;
-#endif
 	} else {
 		/* Header split */
 		if (sop && !eop) {
@@ -453,11 +445,7 @@ static int enic_rq_indicate_buf(struct vnic_rq *rq,
 				*rx_pkt_bucket = rx_pkt;
 				rx_pkt->pkt_len = bytes_written;
 				if (ipv4) {
-#ifdef RTE_NEXT_ABI
 					rx_pkt->packet_type = RTE_PTYPE_L3_IPV4;
-#else
-					rx_pkt->ol_flags |= PKT_RX_IPV4_HDR;
-#endif
 					if (!csum_not_calc) {
 						if (unlikely(!ipv4_csum_ok))
 							rx_pkt->ol_flags |=
@@ -469,22 +457,14 @@ static int enic_rq_indicate_buf(struct vnic_rq *rq,
 							    PKT_RX_L4_CKSUM_BAD;
 					}
 				} else if (ipv6)
-#ifdef RTE_NEXT_ABI
 					rx_pkt->packet_type = RTE_PTYPE_L3_IPV6;
-#else
-					rx_pkt->ol_flags |= PKT_RX_IPV6_HDR;
-#endif
 			} else {
 				/* Payload */
 				hdr_rx_pkt = *rx_pkt_bucket;
 				hdr_rx_pkt->pkt_len += bytes_written;
 				if (ipv4) {
-#ifdef RTE_NEXT_ABI
 					hdr_rx_pkt->packet_type =
 						RTE_PTYPE_L3_IPV4;
-#else
-					hdr_rx_pkt->ol_flags |= PKT_RX_IPV4_HDR;
-#endif
 					if (!csum_not_calc) {
 						if (unlikely(!ipv4_csum_ok))
 							hdr_rx_pkt->ol_flags |=
@@ -496,13 +476,8 @@ static int enic_rq_indicate_buf(struct vnic_rq *rq,
 							    PKT_RX_L4_CKSUM_BAD;
 					}
 				} else if (ipv6)
-#ifdef RTE_NEXT_ABI
 					hdr_rx_pkt->packet_type =
 						RTE_PTYPE_L3_IPV6;
-#else
-					hdr_rx_pkt->ol_flags |= PKT_RX_IPV6_HDR;
-#endif
-
 			}
 		}
 	}
diff --git a/drivers/net/fm10k/fm10k_rxtx.c b/drivers/net/fm10k/fm10k_rxtx.c
index b5fa2e6..d3f7b89 100644
--- a/drivers/net/fm10k/fm10k_rxtx.c
+++ b/drivers/net/fm10k/fm10k_rxtx.c
@@ -68,7 +68,6 @@ static inline void dump_rxd(union fm10k_rx_desc *rxd)
 static inline void
 rx_desc_to_ol_flags(struct rte_mbuf *m, const union fm10k_rx_desc *d)
 {
-#ifdef RTE_NEXT_ABI
 	static const uint32_t
 		ptype_table[FM10K_RXD_PKTTYPE_MASK >> FM10K_RXD_PKTTYPE_SHIFT]
 			__rte_cache_aligned = {
@@ -91,14 +90,6 @@ rx_desc_to_ol_flags(struct rte_mbuf *m, const union fm10k_rx_desc *d)
 
 	m->packet_type = ptype_table[(d->w.pkt_info & FM10K_RXD_PKTTYPE_MASK)
 						>> FM10K_RXD_PKTTYPE_SHIFT];
-#else /* RTE_NEXT_ABI */
-	uint16_t ptype;
-	static const uint16_t pt_lut[] = { 0,
-		PKT_RX_IPV4_HDR, PKT_RX_IPV4_HDR_EXT,
-		PKT_RX_IPV6_HDR, PKT_RX_IPV6_HDR_EXT,
-		0, 0, 0
-	};
-#endif /* RTE_NEXT_ABI */
 
 	if (d->w.pkt_info & FM10K_RXD_RSSTYPE_MASK)
 		m->ol_flags |= PKT_RX_RSS_HASH;
@@ -121,12 +112,6 @@ rx_desc_to_ol_flags(struct rte_mbuf *m, const union fm10k_rx_desc *d)
 
 	if (unlikely(d->d.staterr & FM10K_RXD_STATUS_RXE))
 		m->ol_flags |= PKT_RX_RECIP_ERR;
-
-#ifndef RTE_NEXT_ABI
-	ptype = (d->d.data & FM10K_RXD_PKTTYPE_MASK_L3) >>
-						FM10K_RXD_PKTTYPE_SHIFT;
-	m->ol_flags |= pt_lut[(uint8_t)ptype];
-#endif
 }
 
 uint16_t
diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index eae4ab0..fd656d5 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -188,11 +188,9 @@ i40e_get_iee15888_flags(struct rte_mbuf *mb, uint64_t qword)
 				  | I40E_RXD_QW1_STATUS_TSYNINDX_MASK))
 				    >> I40E_RX_DESC_STATUS_TSYNINDX_SHIFT;
 
-#ifdef RTE_NEXT_ABI
 	if ((mb->packet_type & RTE_PTYPE_L2_MASK)
 			== RTE_PTYPE_L2_ETHER_TIMESYNC)
 		pkt_flags = PKT_RX_IEEE1588_PTP;
-#endif
 	if (tsyn & 0x04) {
 		pkt_flags |= PKT_RX_IEEE1588_TMST;
 		mb->timesync = tsyn & 0x03;
@@ -202,7 +200,6 @@ i40e_get_iee15888_flags(struct rte_mbuf *mb, uint64_t qword)
 }
 #endif
 
-#ifdef RTE_NEXT_ABI
 /* For each value it means, datasheet of hardware can tell more details */
 static inline uint32_t
 i40e_rxd_pkt_type_mapping(uint8_t ptype)
@@ -735,275 +732,6 @@ i40e_rxd_pkt_type_mapping(uint8_t ptype)
 
 	return ptype_table[ptype];
 }
-#else /* RTE_NEXT_ABI */
-/* Translate pkt types to pkt flags */
-static inline uint64_t
-i40e_rxd_ptype_to_pkt_flags(uint64_t qword)
-{
-	uint8_t ptype = (uint8_t)((qword & I40E_RXD_QW1_PTYPE_MASK) >>
-					I40E_RXD_QW1_PTYPE_SHIFT);
-	static const uint64_t ip_ptype_map[I40E_MAX_PKT_TYPE] = {
-		0, /* PTYPE 0 */
-		0, /* PTYPE 1 */
-		PKT_RX_IEEE1588_PTP, /* PTYPE 2 */
-		0, /* PTYPE 3 */
-		0, /* PTYPE 4 */
-		0, /* PTYPE 5 */
-		0, /* PTYPE 6 */
-		0, /* PTYPE 7 */
-		0, /* PTYPE 8 */
-		0, /* PTYPE 9 */
-		0, /* PTYPE 10 */
-		0, /* PTYPE 11 */
-		0, /* PTYPE 12 */
-		0, /* PTYPE 13 */
-		0, /* PTYPE 14 */
-		0, /* PTYPE 15 */
-		0, /* PTYPE 16 */
-		0, /* PTYPE 17 */
-		0, /* PTYPE 18 */
-		0, /* PTYPE 19 */
-		0, /* PTYPE 20 */
-		0, /* PTYPE 21 */
-		PKT_RX_IPV4_HDR, /* PTYPE 22 */
-		PKT_RX_IPV4_HDR, /* PTYPE 23 */
-		PKT_RX_IPV4_HDR, /* PTYPE 24 */
-		0, /* PTYPE 25 */
-		PKT_RX_IPV4_HDR, /* PTYPE 26 */
-		PKT_RX_IPV4_HDR, /* PTYPE 27 */
-		PKT_RX_IPV4_HDR, /* PTYPE 28 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 29 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 30 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 31 */
-		0, /* PTYPE 32 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 33 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 34 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 35 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 36 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 37 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 38 */
-		0, /* PTYPE 39 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 40 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 41 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 42 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 43 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 44 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 45 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 46 */
-		0, /* PTYPE 47 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 48 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 49 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 50 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 51 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 52 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 53 */
-		0, /* PTYPE 54 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 55 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 56 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 57 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 58 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 59 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 60 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 61 */
-		0, /* PTYPE 62 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 63 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 64 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 65 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 66 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 67 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 68 */
-		0, /* PTYPE 69 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 70 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 71 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 72 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 73 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 74 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 75 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 76 */
-		0, /* PTYPE 77 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 78 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 79 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 80 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 81 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 82 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 83 */
-		0, /* PTYPE 84 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 85 */
-		PKT_RX_TUNNEL_IPV4_HDR, /* PTYPE 86 */
-		PKT_RX_IPV4_HDR_EXT, /* PTYPE 87 */
-		PKT_RX_IPV6_HDR, /* PTYPE 88 */
-		PKT_RX_IPV6_HDR, /* PTYPE 89 */
-		PKT_RX_IPV6_HDR, /* PTYPE 90 */
-		0, /* PTYPE 91 */
-		PKT_RX_IPV6_HDR, /* PTYPE 92 */
-		PKT_RX_IPV6_HDR, /* PTYPE 93 */
-		PKT_RX_IPV6_HDR, /* PTYPE 94 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 95 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 96 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 97 */
-		0, /* PTYPE 98 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 99 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 100 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 101 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 102 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 103 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 104 */
-		0, /* PTYPE 105 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 106 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 107 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 108 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 109 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 110 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 111 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 112 */
-		0, /* PTYPE 113 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 114 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 115 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 116 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 117 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 118 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 119 */
-		0, /* PTYPE 120 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 121 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 122 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 123 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 124 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 125 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 126 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 127 */
-		0, /* PTYPE 128 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 129 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 130 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 131 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 132 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 133 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 134 */
-		0, /* PTYPE 135 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 136 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 137 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 138 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 139 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 140 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 141 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 142 */
-		0, /* PTYPE 143 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 144 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 145 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 146 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 147 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 148 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 149 */
-		0, /* PTYPE 150 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 151 */
-		PKT_RX_TUNNEL_IPV6_HDR, /* PTYPE 152 */
-		PKT_RX_IPV6_HDR_EXT, /* PTYPE 153 */
-		0, /* PTYPE 154 */
-		0, /* PTYPE 155 */
-		0, /* PTYPE 156 */
-		0, /* PTYPE 157 */
-		0, /* PTYPE 158 */
-		0, /* PTYPE 159 */
-		0, /* PTYPE 160 */
-		0, /* PTYPE 161 */
-		0, /* PTYPE 162 */
-		0, /* PTYPE 163 */
-		0, /* PTYPE 164 */
-		0, /* PTYPE 165 */
-		0, /* PTYPE 166 */
-		0, /* PTYPE 167 */
-		0, /* PTYPE 168 */
-		0, /* PTYPE 169 */
-		0, /* PTYPE 170 */
-		0, /* PTYPE 171 */
-		0, /* PTYPE 172 */
-		0, /* PTYPE 173 */
-		0, /* PTYPE 174 */
-		0, /* PTYPE 175 */
-		0, /* PTYPE 176 */
-		0, /* PTYPE 177 */
-		0, /* PTYPE 178 */
-		0, /* PTYPE 179 */
-		0, /* PTYPE 180 */
-		0, /* PTYPE 181 */
-		0, /* PTYPE 182 */
-		0, /* PTYPE 183 */
-		0, /* PTYPE 184 */
-		0, /* PTYPE 185 */
-		0, /* PTYPE 186 */
-		0, /* PTYPE 187 */
-		0, /* PTYPE 188 */
-		0, /* PTYPE 189 */
-		0, /* PTYPE 190 */
-		0, /* PTYPE 191 */
-		0, /* PTYPE 192 */
-		0, /* PTYPE 193 */
-		0, /* PTYPE 194 */
-		0, /* PTYPE 195 */
-		0, /* PTYPE 196 */
-		0, /* PTYPE 197 */
-		0, /* PTYPE 198 */
-		0, /* PTYPE 199 */
-		0, /* PTYPE 200 */
-		0, /* PTYPE 201 */
-		0, /* PTYPE 202 */
-		0, /* PTYPE 203 */
-		0, /* PTYPE 204 */
-		0, /* PTYPE 205 */
-		0, /* PTYPE 206 */
-		0, /* PTYPE 207 */
-		0, /* PTYPE 208 */
-		0, /* PTYPE 209 */
-		0, /* PTYPE 210 */
-		0, /* PTYPE 211 */
-		0, /* PTYPE 212 */
-		0, /* PTYPE 213 */
-		0, /* PTYPE 214 */
-		0, /* PTYPE 215 */
-		0, /* PTYPE 216 */
-		0, /* PTYPE 217 */
-		0, /* PTYPE 218 */
-		0, /* PTYPE 219 */
-		0, /* PTYPE 220 */
-		0, /* PTYPE 221 */
-		0, /* PTYPE 222 */
-		0, /* PTYPE 223 */
-		0, /* PTYPE 224 */
-		0, /* PTYPE 225 */
-		0, /* PTYPE 226 */
-		0, /* PTYPE 227 */
-		0, /* PTYPE 228 */
-		0, /* PTYPE 229 */
-		0, /* PTYPE 230 */
-		0, /* PTYPE 231 */
-		0, /* PTYPE 232 */
-		0, /* PTYPE 233 */
-		0, /* PTYPE 234 */
-		0, /* PTYPE 235 */
-		0, /* PTYPE 236 */
-		0, /* PTYPE 237 */
-		0, /* PTYPE 238 */
-		0, /* PTYPE 239 */
-		0, /* PTYPE 240 */
-		0, /* PTYPE 241 */
-		0, /* PTYPE 242 */
-		0, /* PTYPE 243 */
-		0, /* PTYPE 244 */
-		0, /* PTYPE 245 */
-		0, /* PTYPE 246 */
-		0, /* PTYPE 247 */
-		0, /* PTYPE 248 */
-		0, /* PTYPE 249 */
-		0, /* PTYPE 250 */
-		0, /* PTYPE 251 */
-		0, /* PTYPE 252 */
-		0, /* PTYPE 253 */
-		0, /* PTYPE 254 */
-		0, /* PTYPE 255 */
-	};
-
-	return ip_ptype_map[ptype];
-}
-#endif /* RTE_NEXT_ABI */
 
 #define I40E_RX_DESC_EXT_STATUS_FLEXBH_MASK   0x03
 #define I40E_RX_DESC_EXT_STATUS_FLEXBH_FD_ID  0x01
@@ -1292,18 +1020,10 @@ i40e_rx_scan_hw_ring(struct i40e_rx_queue *rxq)
 			i40e_rxd_to_vlan_tci(mb, &rxdp[j]);
 			pkt_flags = i40e_rxd_status_to_pkt_flags(qword1);
 			pkt_flags |= i40e_rxd_error_to_pkt_flags(qword1);
-#ifdef RTE_NEXT_ABI
 			mb->packet_type =
 				i40e_rxd_pkt_type_mapping((uint8_t)((qword1 &
 						I40E_RXD_QW1_PTYPE_MASK) >>
 						I40E_RXD_QW1_PTYPE_SHIFT));
-#else
-			pkt_flags |= i40e_rxd_ptype_to_pkt_flags(qword1);
-
-			mb->packet_type = (uint16_t)((qword1 &
-					I40E_RXD_QW1_PTYPE_MASK) >>
-					I40E_RXD_QW1_PTYPE_SHIFT);
-#endif /* RTE_NEXT_ABI */
 			if (pkt_flags & PKT_RX_RSS_HASH)
 				mb->hash.rss = rte_le_to_cpu_32(\
 					rxdp[j].wb.qword0.hi_dword.rss);
@@ -1549,15 +1269,9 @@ i40e_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 		i40e_rxd_to_vlan_tci(rxm, &rxd);
 		pkt_flags = i40e_rxd_status_to_pkt_flags(qword1);
 		pkt_flags |= i40e_rxd_error_to_pkt_flags(qword1);
-#ifdef RTE_NEXT_ABI
 		rxm->packet_type =
 			i40e_rxd_pkt_type_mapping((uint8_t)((qword1 &
 			I40E_RXD_QW1_PTYPE_MASK) >> I40E_RXD_QW1_PTYPE_SHIFT));
-#else
-		pkt_flags |= i40e_rxd_ptype_to_pkt_flags(qword1);
-		rxm->packet_type = (uint16_t)((qword1 & I40E_RXD_QW1_PTYPE_MASK) >>
-				I40E_RXD_QW1_PTYPE_SHIFT);
-#endif /* RTE_NEXT_ABI */
 		if (pkt_flags & PKT_RX_RSS_HASH)
 			rxm->hash.rss =
 				rte_le_to_cpu_32(rxd.wb.qword0.hi_dword.rss);
@@ -1717,16 +1431,9 @@ i40e_recv_scattered_pkts(void *rx_queue,
 		i40e_rxd_to_vlan_tci(first_seg, &rxd);
 		pkt_flags = i40e_rxd_status_to_pkt_flags(qword1);
 		pkt_flags |= i40e_rxd_error_to_pkt_flags(qword1);
-#ifdef RTE_NEXT_ABI
 		first_seg->packet_type =
 			i40e_rxd_pkt_type_mapping((uint8_t)((qword1 &
 			I40E_RXD_QW1_PTYPE_MASK) >> I40E_RXD_QW1_PTYPE_SHIFT));
-#else
-		pkt_flags |= i40e_rxd_ptype_to_pkt_flags(qword1);
-		first_seg->packet_type = (uint16_t)((qword1 &
-					I40E_RXD_QW1_PTYPE_MASK) >>
-					I40E_RXD_QW1_PTYPE_SHIFT);
-#endif /* RTE_NEXT_ABI */
 		if (pkt_flags & PKT_RX_RSS_HASH)
 			rxm->hash.rss =
 				rte_le_to_cpu_32(rxd.wb.qword0.hi_dword.rss);
diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c
index 91023b9..a710102 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx.c
@@ -864,7 +864,6 @@ end_of_tx:
  *  RX functions
  *
  **********************************************************************/
-#ifdef RTE_NEXT_ABI
 #define IXGBE_PACKET_TYPE_IPV4              0X01
 #define IXGBE_PACKET_TYPE_IPV4_TCP          0X11
 #define IXGBE_PACKET_TYPE_IPV4_UDP          0X21
@@ -967,43 +966,6 @@ ixgbe_rxd_pkt_info_to_pkt_flags(uint16_t pkt_info)
 	return ip_rss_types_map[pkt_info & 0XF];
 #endif
 }
-#else /* RTE_NEXT_ABI */
-static inline uint64_t
-rx_desc_hlen_type_rss_to_pkt_flags(uint32_t hl_tp_rs)
-{
-	uint64_t pkt_flags;
-
-	static const uint64_t ip_pkt_types_map[16] = {
-		0, PKT_RX_IPV4_HDR, PKT_RX_IPV4_HDR_EXT, PKT_RX_IPV4_HDR_EXT,
-		PKT_RX_IPV6_HDR, 0, 0, 0,
-		PKT_RX_IPV6_HDR_EXT, 0, 0, 0,
-		PKT_RX_IPV6_HDR_EXT, 0, 0, 0,
-	};
-
-	static const uint64_t ip_rss_types_map[16] = {
-		0, PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, PKT_RX_RSS_HASH,
-		0, PKT_RX_RSS_HASH, 0, PKT_RX_RSS_HASH,
-		PKT_RX_RSS_HASH, 0, 0, 0,
-		0, 0, 0,  PKT_RX_FDIR,
-	};
-
-#ifdef RTE_LIBRTE_IEEE1588
-	static uint64_t ip_pkt_etqf_map[8] = {
-		0, 0, 0, PKT_RX_IEEE1588_PTP,
-		0, 0, 0, 0,
-	};
-
-	pkt_flags = (hl_tp_rs & IXGBE_RXDADV_PKTTYPE_ETQF) ?
-			ip_pkt_etqf_map[(hl_tp_rs >> 4) & 0x07] :
-			ip_pkt_types_map[(hl_tp_rs >> 4) & 0x0F];
-#else
-	pkt_flags = (hl_tp_rs & IXGBE_RXDADV_PKTTYPE_ETQF) ? 0 :
-			ip_pkt_types_map[(hl_tp_rs >> 4) & 0x0F];
-
-#endif
-	return pkt_flags | ip_rss_types_map[hl_tp_rs & 0xF];
-}
-#endif /* RTE_NEXT_ABI */
 
 static inline uint64_t
 rx_desc_status_to_pkt_flags(uint32_t rx_status)
@@ -1058,13 +1020,9 @@ ixgbe_rx_scan_hw_ring(struct ixgbe_rx_queue *rxq)
 	struct rte_mbuf *mb;
 	uint16_t pkt_len;
 	uint64_t pkt_flags;
-#ifdef RTE_NEXT_ABI
 	int nb_dd;
 	uint32_t s[LOOK_AHEAD];
 	uint16_t pkt_info[LOOK_AHEAD];
-#else
-	int s[LOOK_AHEAD], nb_dd;
-#endif /* RTE_NEXT_ABI */
 	int i, j, nb_rx = 0;
 	uint32_t status;
 
@@ -1088,11 +1046,9 @@ ixgbe_rx_scan_hw_ring(struct ixgbe_rx_queue *rxq)
 		for (j = LOOK_AHEAD-1; j >= 0; --j)
 			s[j] = rte_le_to_cpu_32(rxdp[j].wb.upper.status_error);
 
-#ifdef RTE_NEXT_ABI
 		for (j = LOOK_AHEAD - 1; j >= 0; --j)
 			pkt_info[j] = rxdp[j].wb.lower.lo_dword.
 						hs_rss.pkt_info;
-#endif /* RTE_NEXT_ABI */
 
 		/* Compute how many status bits were set */
 		nb_dd = 0;
@@ -1111,7 +1067,6 @@ ixgbe_rx_scan_hw_ring(struct ixgbe_rx_queue *rxq)
 			mb->vlan_tci = rte_le_to_cpu_16(rxdp[j].wb.upper.vlan);
 
 			/* convert descriptor fields to rte mbuf flags */
-#ifdef RTE_NEXT_ABI
 			pkt_flags = rx_desc_status_to_pkt_flags(s[j]);
 			pkt_flags |= rx_desc_error_to_pkt_flags(s[j]);
 			pkt_flags |=
@@ -1119,15 +1074,6 @@ ixgbe_rx_scan_hw_ring(struct ixgbe_rx_queue *rxq)
 			mb->ol_flags = pkt_flags;
 			mb->packet_type =
 				ixgbe_rxd_pkt_info_to_pkt_type(pkt_info[j]);
-#else /* RTE_NEXT_ABI */
-			pkt_flags  = rx_desc_hlen_type_rss_to_pkt_flags(
-					rte_le_to_cpu_32(
-					rxdp[j].wb.lower.lo_dword.data));
-			/* reuse status field from scan list */
-			pkt_flags |= rx_desc_status_to_pkt_flags(s[j]);
-			pkt_flags |= rx_desc_error_to_pkt_flags(s[j]);
-			mb->ol_flags = pkt_flags;
-#endif /* RTE_NEXT_ABI */
 
 			if (likely(pkt_flags & PKT_RX_RSS_HASH))
 				mb->hash.rss = rte_le_to_cpu_32(
@@ -1328,11 +1274,7 @@ ixgbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 	union ixgbe_adv_rx_desc rxd;
 	uint64_t dma_addr;
 	uint32_t staterr;
-#ifdef RTE_NEXT_ABI
 	uint32_t pkt_info;
-#else
-	uint32_t hlen_type_rss;
-#endif
 	uint16_t pkt_len;
 	uint16_t rx_id;
 	uint16_t nb_rx;
@@ -1450,7 +1392,6 @@ ixgbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 		rxm->data_len = pkt_len;
 		rxm->port = rxq->port_id;
 
-#ifdef RTE_NEXT_ABI
 		pkt_info = rte_le_to_cpu_32(rxd.wb.lower.lo_dword.hs_rss.
 								pkt_info);
 		/* Only valid if PKT_RX_VLAN_PKT set in pkt_flags */
@@ -1462,16 +1403,6 @@ ixgbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 			ixgbe_rxd_pkt_info_to_pkt_flags(pkt_info);
 		rxm->ol_flags = pkt_flags;
 		rxm->packet_type = ixgbe_rxd_pkt_info_to_pkt_type(pkt_info);
-#else /* RTE_NEXT_ABI */
-		hlen_type_rss = rte_le_to_cpu_32(rxd.wb.lower.lo_dword.data);
-		/* Only valid if PKT_RX_VLAN_PKT set in pkt_flags */
-		rxm->vlan_tci = rte_le_to_cpu_16(rxd.wb.upper.vlan);
-
-		pkt_flags = rx_desc_hlen_type_rss_to_pkt_flags(hlen_type_rss);
-		pkt_flags = pkt_flags | rx_desc_status_to_pkt_flags(staterr);
-		pkt_flags = pkt_flags | rx_desc_error_to_pkt_flags(staterr);
-		rxm->ol_flags = pkt_flags;
-#endif /* RTE_NEXT_ABI */
 
 		if (likely(pkt_flags & PKT_RX_RSS_HASH))
 			rxm->hash.rss = rte_le_to_cpu_32(
@@ -1547,7 +1478,6 @@ ixgbe_fill_cluster_head_buf(
 	uint8_t port_id,
 	uint32_t staterr)
 {
-#ifdef RTE_NEXT_ABI
 	uint16_t pkt_info;
 	uint64_t pkt_flags;
 
@@ -1563,23 +1493,6 @@ ixgbe_fill_cluster_head_buf(
 	pkt_flags |= ixgbe_rxd_pkt_info_to_pkt_flags(pkt_info);
 	head->ol_flags = pkt_flags;
 	head->packet_type = ixgbe_rxd_pkt_info_to_pkt_type(pkt_info);
-#else /* RTE_NEXT_ABI */
-	uint32_t hlen_type_rss;
-	uint64_t pkt_flags;
-
-	head->port = port_id;
-
-	/*
-	 * The vlan_tci field is only valid when PKT_RX_VLAN_PKT is
-	 * set in the pkt_flags field.
-	 */
-	head->vlan_tci = rte_le_to_cpu_16(desc->wb.upper.vlan);
-	hlen_type_rss = rte_le_to_cpu_32(desc->wb.lower.lo_dword.data);
-	pkt_flags = rx_desc_hlen_type_rss_to_pkt_flags(hlen_type_rss);
-	pkt_flags |= rx_desc_status_to_pkt_flags(staterr);
-	pkt_flags |= rx_desc_error_to_pkt_flags(staterr);
-	head->ol_flags = pkt_flags;
-#endif /* RTE_NEXT_ABI */
 
 	if (likely(pkt_flags & PKT_RX_RSS_HASH))
 		head->hash.rss = rte_le_to_cpu_32(desc->wb.lower.hi_dword.rss);
diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec.c b/drivers/net/ixgbe/ixgbe_rxtx_vec.c
index cf25a53..6979b1e 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx_vec.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx_vec.c
@@ -140,19 +140,11 @@ ixgbe_rxq_rearm(struct ixgbe_rx_queue *rxq)
  */
 #ifdef RTE_IXGBE_RX_OLFLAGS_ENABLE
 
-#ifndef RTE_NEXT_ABI
-#define OLFLAGS_MASK	((uint16_t)(PKT_RX_VLAN_PKT | PKT_RX_IPV4_HDR |\
-			PKT_RX_IPV4_HDR_EXT | PKT_RX_IPV6_HDR |\
-			PKT_RX_IPV6_HDR_EXT))
-#define PTYPE_SHIFT    (1)
-#endif /* RTE_NEXT_ABI */
-
 #define VTAG_SHIFT     (3)
 
 static inline void
 desc_to_olflags_v(__m128i descs[4], struct rte_mbuf **rx_pkts)
 {
-#ifdef RTE_NEXT_ABI
 	__m128i ptype0, ptype1, vtag0, vtag1;
 	union {
 		uint16_t e[4];
@@ -190,50 +182,6 @@ desc_to_olflags_v(__m128i descs[4], struct rte_mbuf **rx_pkts)
 
 	vtag1 = _mm_or_si128(ptype0, vtag1);
 	vol.dword = _mm_cvtsi128_si64(vtag1);
-#else
-	__m128i ptype0, ptype1, vtag0, vtag1;
-	union {
-		uint16_t e[4];
-		uint64_t dword;
-	} vol;
-
-	/* pkt type + vlan olflags mask */
-	const __m128i pkttype_msk = _mm_set_epi16(
-			0x0000, 0x0000, 0x0000, 0x0000,
-			OLFLAGS_MASK, OLFLAGS_MASK, OLFLAGS_MASK, OLFLAGS_MASK);
-
-	/* mask everything except rss type */
-	const __m128i rsstype_msk = _mm_set_epi16(
-			0x0000, 0x0000, 0x0000, 0x0000,
-			0x000F, 0x000F, 0x000F, 0x000F);
-
-	/* rss type to PKT_RX_RSS_HASH translation */
-	const __m128i rss_flags = _mm_set_epi8(PKT_RX_FDIR, 0, 0, 0,
-			0, 0, 0, PKT_RX_RSS_HASH,
-			PKT_RX_RSS_HASH, 0, PKT_RX_RSS_HASH, 0,
-			PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, 0);
-
-	ptype0 = _mm_unpacklo_epi16(descs[0], descs[1]);
-	ptype1 = _mm_unpacklo_epi16(descs[2], descs[3]);
-	vtag0 = _mm_unpackhi_epi16(descs[0], descs[1]);
-	vtag1 = _mm_unpackhi_epi16(descs[2], descs[3]);
-
-	ptype1 = _mm_unpacklo_epi32(ptype0, ptype1);
-	vtag1 = _mm_unpacklo_epi32(vtag0, vtag1);
-
-	ptype0 = _mm_and_si128(ptype1, rsstype_msk);
-	ptype0 = _mm_shuffle_epi8(rss_flags, ptype0);
-
-	ptype1 = _mm_slli_epi16(ptype1, PTYPE_SHIFT);
-	vtag1 = _mm_srli_epi16(vtag1, VTAG_SHIFT);
-
-	ptype1 = _mm_or_si128(ptype1, vtag1);
-	ptype1 = _mm_and_si128(ptype1, pkttype_msk);
-
-	ptype0 = _mm_or_si128(ptype0, ptype1);
-
-	vol.dword = _mm_cvtsi128_si64(ptype0);
-#endif /* RTE_NEXT_ABI */
 
 	rx_pkts[0]->ol_flags = vol.e[0];
 	rx_pkts[1]->ol_flags = vol.e[1];
@@ -264,7 +212,6 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 	int pos;
 	uint64_t var;
 	__m128i shuf_msk;
-#ifdef RTE_NEXT_ABI
 	__m128i crc_adjust = _mm_set_epi16(
 				0, 0, 0,    /* ignore non-length fields */
 				-rxq->crc_len, /* sub crc on data_len */
@@ -275,16 +222,6 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 	__m128i dd_check, eop_check;
 	__m128i desc_mask = _mm_set_epi32(0xFFFFFFFF, 0xFFFFFFFF,
 					  0xFFFFFFFF, 0xFFFF07F0);
-#else
-	__m128i crc_adjust = _mm_set_epi16(
-				0, 0, 0, 0, /* ignore non-length fields */
-				0,          /* ignore high-16bits of pkt_len */
-				-rxq->crc_len, /* sub crc on pkt_len */
-				-rxq->crc_len, /* sub crc on data_len */
-				0            /* ignore pkt_type field */
-			);
-	__m128i dd_check, eop_check;
-#endif /* RTE_NEXT_ABI */
 
 	if (unlikely(nb_pkts < RTE_IXGBE_VPMD_RX_BURST))
 		return 0;
@@ -313,7 +250,6 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 	eop_check = _mm_set_epi64x(0x0000000200000002LL, 0x0000000200000002LL);
 
 	/* mask to shuffle from desc. to mbuf */
-#ifdef RTE_NEXT_ABI
 	shuf_msk = _mm_set_epi8(
 		7, 6, 5, 4,  /* octet 4~7, 32bits rss */
 		15, 14,      /* octet 14~15, low 16 bits vlan_macip */
@@ -324,23 +260,11 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 		1,           /* octet 1, 8 bits pkt_type field */
 		0            /* octet 0, 4 bits offset 4 pkt_type field */
 		);
-#else
-	shuf_msk = _mm_set_epi8(
-		7, 6, 5, 4,  /* octet 4~7, 32bits rss */
-		0xFF, 0xFF,  /* skip high 16 bits vlan_macip, zero out */
-		15, 14,      /* octet 14~15, low 16 bits vlan_macip */
-		0xFF, 0xFF,  /* skip high 16 bits pkt_len, zero out */
-		13, 12,      /* octet 12~13, low 16 bits pkt_len */
-		13, 12,      /* octet 12~13, 16 bits data_len */
-		0xFF, 0xFF   /* skip pkt_type field */
-		);
-#endif /* RTE_NEXT_ABI */
 
 	/* Cache is empty -> need to scan the buffer rings, but first move
 	 * the next 'n' mbufs into the cache */
 	sw_ring = &rxq->sw_ring[rxq->rx_tail];
 
-#ifdef RTE_NEXT_ABI
 	/* A. load 4 packet in one loop
 	 * [A*. mask out 4 unused dirty field in desc]
 	 * B. copy 4 mbuf point from swring to rx_pkts
@@ -348,20 +272,10 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 	 * [C*. extract the end-of-packet bit, if requested]
 	 * D. fill info. from desc to mbuf
 	 */
-#else
-	/* A. load 4 packet in one loop
-	 * B. copy 4 mbuf point from swring to rx_pkts
-	 * C. calc the number of DD bits among the 4 packets
-	 * [C*. extract the end-of-packet bit, if requested]
-	 * D. fill info. from desc to mbuf
-	 */
-#endif /* RTE_NEXT_ABI */
 	for (pos = 0, nb_pkts_recd = 0; pos < RTE_IXGBE_VPMD_RX_BURST;
 			pos += RTE_IXGBE_DESCS_PER_LOOP,
 			rxdp += RTE_IXGBE_DESCS_PER_LOOP) {
-#ifdef RTE_NEXT_ABI
 		__m128i descs0[RTE_IXGBE_DESCS_PER_LOOP];
-#endif /* RTE_NEXT_ABI */
 		__m128i descs[RTE_IXGBE_DESCS_PER_LOOP];
 		__m128i pkt_mb1, pkt_mb2, pkt_mb3, pkt_mb4;
 		__m128i zero, staterr, sterr_tmp1, sterr_tmp2;
@@ -377,7 +291,6 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 		/* B.1 load 1 mbuf point */
 		mbp1 = _mm_loadu_si128((__m128i *)&sw_ring[pos]);
 
-#ifdef RTE_NEXT_ABI
 		/* Read desc statuses backwards to avoid race condition */
 		/* A.1 load 4 pkts desc */
 		descs0[3] = _mm_loadu_si128((__m128i *)(rxdp + 3));
@@ -403,25 +316,6 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 		/* A* mask out 0~3 bits RSS type */
 		descs[1] = _mm_and_si128(descs0[1], desc_mask);
 		descs[0] = _mm_and_si128(descs0[0], desc_mask);
-#else
-		/* Read desc statuses backwards to avoid race condition */
-		/* A.1 load 4 pkts desc */
-		descs[3] = _mm_loadu_si128((__m128i *)(rxdp + 3));
-
-		/* B.2 copy 2 mbuf point into rx_pkts  */
-		_mm_storeu_si128((__m128i *)&rx_pkts[pos], mbp1);
-
-		/* B.1 load 1 mbuf point */
-		mbp2 = _mm_loadu_si128((__m128i *)&sw_ring[pos + 2]);
-
-		descs[2] = _mm_loadu_si128((__m128i *)(rxdp + 2));
-		/* B.1 load 2 mbuf point */
-		descs[1] = _mm_loadu_si128((__m128i *)(rxdp + 1));
-		descs[0] = _mm_loadu_si128((__m128i *)(rxdp));
-
-		/* B.2 copy 2 mbuf point into rx_pkts  */
-		_mm_storeu_si128((__m128i *)&rx_pkts[pos + 2], mbp2);
-#endif /* RTE_NEXT_ABI */
 
 		/* avoid compiler reorder optimization */
 		rte_compiler_barrier();
@@ -435,13 +329,8 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
 		/* C.1 4=>2 filter staterr info only */
 		sterr_tmp1 = _mm_unpackhi_epi32(descs[1], descs[0]);
 
-#ifdef RTE_NEXT_ABI
 		/* set ol_flags with vlan packet type */
 		desc_to_olflags_v(descs0, &rx_pkts[pos]);
-#else
-		/* set ol_flags with packet type and vlan tag */
-		desc_to_olflags_v(descs, &rx_pkts[pos]);
-#endif /* RTE_NEXT_ABI */
 
 		/* D.2 pkt 3,4 set in_port/nb_seg and remove crc */
 		pkt_mb4 = _mm_add_epi16(pkt_mb4, crc_adjust);
diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c
index fa3cb7e..6c6342f 100644
--- a/drivers/net/mlx4/mlx4.c
+++ b/drivers/net/mlx4/mlx4.c
@@ -1264,16 +1264,7 @@ mlx4_tx_burst(void *dpdk_txq, struct rte_mbuf **pkts, uint16_t pkts_n)
 			 * offsets but automatically recognizes the packet
 			 * type. For inner L3/L4 checksums, only VXLAN (UDP)
 			 * tunnels are currently supported. */
-#ifdef RTE_NEXT_ABI
 			if (RTE_ETH_IS_TUNNEL_PKT(buf->packet_type))
-#else
-			/* FIXME: since PKT_TX_UDP_TUNNEL_PKT has been removed,
-			 * the outer packet type is unknown. All we know is
-			 * that the L2 header is of unusual length (not
-			 * ETHER_HDR_LEN with or without 802.1Q header). */
-			if ((buf->l2_len != ETHER_HDR_LEN) &&
-			    (buf->l2_len != (ETHER_HDR_LEN + 4)))
-#endif
 				send_flags |= IBV_EXP_QP_BURST_TUNNEL;
 		}
 		if (likely(segs == 1)) {
@@ -2488,7 +2479,6 @@ rxq_cleanup(struct rxq *rxq)
 	memset(rxq, 0, sizeof(*rxq));
 }
 
-#ifdef RTE_NEXT_ABI
 /**
  * Translate RX completion flags to packet type.
  *
@@ -2521,7 +2511,6 @@ rxq_cq_to_pkt_type(uint32_t flags)
 			          IBV_EXP_CQ_RX_IPV6_PACKET, RTE_PTYPE_L3_IPV6);
 	return pkt_type;
 }
-#endif /* RTE_NEXT_ABI */
 
 /**
  * Translate RX completion flags to offload flags.
@@ -2539,11 +2528,6 @@ rxq_cq_to_ol_flags(const struct rxq *rxq, uint32_t flags)
 {
 	uint32_t ol_flags = 0;
 
-#ifndef RTE_NEXT_ABI
-	ol_flags =
-		TRANSPOSE(flags, IBV_EXP_CQ_RX_IPV4_PACKET, PKT_RX_IPV4_HDR) |
-		TRANSPOSE(flags, IBV_EXP_CQ_RX_IPV6_PACKET, PKT_RX_IPV6_HDR);
-#endif
 	if (rxq->csum)
 		ol_flags |=
 			TRANSPOSE(~flags,
@@ -2559,14 +2543,6 @@ rxq_cq_to_ol_flags(const struct rxq *rxq, uint32_t flags)
 	 */
 	if ((flags & IBV_EXP_CQ_RX_TUNNEL_PACKET) && (rxq->csum_l2tun))
 		ol_flags |=
-#ifndef RTE_NEXT_ABI
-			TRANSPOSE(flags,
-				  IBV_EXP_CQ_RX_OUTER_IPV4_PACKET,
-				  PKT_RX_TUNNEL_IPV4_HDR) |
-			TRANSPOSE(flags,
-				  IBV_EXP_CQ_RX_OUTER_IPV6_PACKET,
-				  PKT_RX_TUNNEL_IPV6_HDR) |
-#endif
 			TRANSPOSE(~flags,
 				  IBV_EXP_CQ_RX_OUTER_IP_CSUM_OK,
 				  PKT_RX_IP_CKSUM_BAD) |
@@ -2758,10 +2734,7 @@ mlx4_rx_burst_sp(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
 		NB_SEGS(pkt_buf) = j;
 		PORT(pkt_buf) = rxq->port_id;
 		PKT_LEN(pkt_buf) = pkt_buf_len;
-#ifdef RTE_NEXT_ABI
 		pkt_buf->packet_type = rxq_cq_to_pkt_type(flags);
-#endif
-		pkt_buf->ol_flags = rxq_cq_to_ol_flags(rxq, flags);
 
 		/* Return packet. */
 		*(pkts++) = pkt_buf;
@@ -2921,9 +2894,7 @@ mlx4_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
 		NEXT(seg) = NULL;
 		PKT_LEN(seg) = len;
 		DATA_LEN(seg) = len;
-#ifdef RTE_NEXT_ABI
 		seg->packet_type = rxq_cq_to_pkt_type(flags);
-#endif
 		seg->ol_flags = rxq_cq_to_ol_flags(rxq, flags);
 
 		/* Return packet. */
diff --git a/drivers/net/vmxnet3/vmxnet3_rxtx.c b/drivers/net/vmxnet3/vmxnet3_rxtx.c
index 39ad6ef..4de5d89 100644
--- a/drivers/net/vmxnet3/vmxnet3_rxtx.c
+++ b/drivers/net/vmxnet3/vmxnet3_rxtx.c
@@ -520,17 +520,9 @@ vmxnet3_rx_offload(const Vmxnet3_RxCompDesc *rcd, struct rte_mbuf *rxm)
 		struct ipv4_hdr *ip = (struct ipv4_hdr *)(eth + 1);
 
 		if (((ip->version_ihl & 0xf) << 2) > (int)sizeof(struct ipv4_hdr))
-#ifdef RTE_NEXT_ABI
 			rxm->packet_type = RTE_PTYPE_L3_IPV4_EXT;
-#else
-			rxm->ol_flags |= PKT_RX_IPV4_HDR_EXT;
-#endif
 		else
-#ifdef RTE_NEXT_ABI
 			rxm->packet_type = RTE_PTYPE_L3_IPV4;
-#else
-			rxm->ol_flags |= PKT_RX_IPV4_HDR;
-#endif
 
 		if (!rcd->cnc) {
 			if (!rcd->ipc)
diff --git a/examples/ip_fragmentation/main.c b/examples/ip_fragmentation/main.c
index b71d05f..fbc0b8d 100644
--- a/examples/ip_fragmentation/main.c
+++ b/examples/ip_fragmentation/main.c
@@ -283,11 +283,7 @@ l3fwd_simple_forward(struct rte_mbuf *m, struct lcore_queue_conf *qconf,
 	len = qconf->tx_mbufs[port_out].len;
 
 	/* if this is an IPv4 packet */
-#ifdef RTE_NEXT_ABI
 	if (RTE_ETH_IS_IPV4_HDR(m->packet_type)) {
-#else
-	if (m->ol_flags & PKT_RX_IPV4_HDR) {
-#endif
 		struct ipv4_hdr *ip_hdr;
 		uint32_t ip_dst;
 		/* Read the lookup key (i.e. ip_dst) from the input packet */
@@ -321,14 +317,8 @@ l3fwd_simple_forward(struct rte_mbuf *m, struct lcore_queue_conf *qconf,
 			if (unlikely (len2 < 0))
 				return;
 		}
-#ifdef RTE_NEXT_ABI
 	} else if (RTE_ETH_IS_IPV6_HDR(m->packet_type)) {
 		/* if this is an IPv6 packet */
-#else
-	}
-	/* if this is an IPv6 packet */
-	else if (m->ol_flags & PKT_RX_IPV6_HDR) {
-#endif
 		struct ipv6_hdr *ip_hdr;
 
 		ipv6 = 1;
diff --git a/examples/ip_reassembly/main.c b/examples/ip_reassembly/main.c
index f1c47ad..741c398 100644
--- a/examples/ip_reassembly/main.c
+++ b/examples/ip_reassembly/main.c
@@ -356,11 +356,7 @@ reassemble(struct rte_mbuf *m, uint8_t portid, uint32_t queue,
 	dst_port = portid;
 
 	/* if packet is IPv4 */
-#ifdef RTE_NEXT_ABI
 	if (RTE_ETH_IS_IPV4_HDR(m->packet_type)) {
-#else
-	if (m->ol_flags & (PKT_RX_IPV4_HDR)) {
-#endif
 		struct ipv4_hdr *ip_hdr;
 		uint32_t ip_dst;
 
@@ -400,14 +396,8 @@ reassemble(struct rte_mbuf *m, uint8_t portid, uint32_t queue,
 		}
 
 		eth_hdr->ether_type = rte_be_to_cpu_16(ETHER_TYPE_IPv4);
-#ifdef RTE_NEXT_ABI
 	} else if (RTE_ETH_IS_IPV6_HDR(m->packet_type)) {
 		/* if packet is IPv6 */
-#else
-	}
-	/* if packet is IPv6 */
-	else if (m->ol_flags & (PKT_RX_IPV6_HDR | PKT_RX_IPV6_HDR_EXT)) {
-#endif
 		struct ipv6_extension_fragment *frag_hdr;
 		struct ipv6_hdr *ip_hdr;
 
diff --git a/examples/l3fwd-acl/main.c b/examples/l3fwd-acl/main.c
index b2bdf2f..f612671 100644
--- a/examples/l3fwd-acl/main.c
+++ b/examples/l3fwd-acl/main.c
@@ -645,13 +645,7 @@ prepare_one_packet(struct rte_mbuf **pkts_in, struct acl_search_t *acl,
 	struct ipv4_hdr *ipv4_hdr;
 	struct rte_mbuf *pkt = pkts_in[index];
 
-#ifdef RTE_NEXT_ABI
 	if (RTE_ETH_IS_IPV4_HDR(pkt->packet_type)) {
-#else
-	int type = pkt->ol_flags & (PKT_RX_IPV4_HDR | PKT_RX_IPV6_HDR);
-
-	if (type == PKT_RX_IPV4_HDR) {
-#endif
 		ipv4_hdr = rte_pktmbuf_mtod_offset(pkt, struct ipv4_hdr *,
 						   sizeof(struct ether_hdr));
 
@@ -670,11 +664,7 @@ prepare_one_packet(struct rte_mbuf **pkts_in, struct acl_search_t *acl,
 			/* Not a valid IPv4 packet */
 			rte_pktmbuf_free(pkt);
 		}
-#ifdef RTE_NEXT_ABI
 	} else if (RTE_ETH_IS_IPV6_HDR(pkt->packet_type)) {
-#else
-	} else if (type == PKT_RX_IPV6_HDR) {
-#endif
 		/* Fill acl structure */
 		acl->data_ipv6[acl->num_ipv6] = MBUF_IPV6_2PROTO(pkt);
 		acl->m_ipv6[(acl->num_ipv6)++] = pkt;
@@ -692,22 +682,12 @@ prepare_one_packet(struct rte_mbuf **pkts_in, struct acl_search_t *acl,
 {
 	struct rte_mbuf *pkt = pkts_in[index];
 
-#ifdef RTE_NEXT_ABI
 	if (RTE_ETH_IS_IPV4_HDR(pkt->packet_type)) {
-#else
-	int type = pkt->ol_flags & (PKT_RX_IPV4_HDR | PKT_RX_IPV6_HDR);
-
-	if (type == PKT_RX_IPV4_HDR) {
-#endif
 		/* Fill acl structure */
 		acl->data_ipv4[acl->num_ipv4] = MBUF_IPV4_2PROTO(pkt);
 		acl->m_ipv4[(acl->num_ipv4)++] = pkt;
 
-#ifdef RTE_NEXT_ABI
 	} else if (RTE_ETH_IS_IPV6_HDR(pkt->packet_type)) {
-#else
-	} else if (type == PKT_RX_IPV6_HDR) {
-#endif
 		/* Fill acl structure */
 		acl->data_ipv6[acl->num_ipv6] = MBUF_IPV6_2PROTO(pkt);
 		acl->m_ipv6[(acl->num_ipv6)++] = pkt;
@@ -755,17 +735,10 @@ send_one_packet(struct rte_mbuf *m, uint32_t res)
 		/* in the ACL list, drop it */
 #ifdef L3FWDACL_DEBUG
 		if ((res & ACL_DENY_SIGNATURE) != 0) {
-#ifdef RTE_NEXT_ABI
 			if (RTE_ETH_IS_IPV4_HDR(m->packet_type))
 				dump_acl4_rule(m, res);
 			else if (RTE_ETH_IS_IPV6_HDR(m->packet_type))
 				dump_acl6_rule(m, res);
-#else
-			if (m->ol_flags & PKT_RX_IPV4_HDR)
-				dump_acl4_rule(m, res);
-			else
-				dump_acl6_rule(m, res);
-#endif /* RTE_NEXT_ABI */
 		}
 #endif
 		rte_pktmbuf_free(m);
diff --git a/examples/l3fwd-power/main.c b/examples/l3fwd-power/main.c
index 086f29b..8bb88ce 100644
--- a/examples/l3fwd-power/main.c
+++ b/examples/l3fwd-power/main.c
@@ -650,11 +650,7 @@ l3fwd_simple_forward(struct rte_mbuf *m, uint8_t portid,
 
 	eth_hdr = rte_pktmbuf_mtod(m, struct ether_hdr *);
 
-#ifdef RTE_NEXT_ABI
 	if (RTE_ETH_IS_IPV4_HDR(m->packet_type)) {
-#else
-	if (m->ol_flags & PKT_RX_IPV4_HDR) {
-#endif
 		/* Handle IPv4 headers.*/
 		ipv4_hdr =
 			rte_pktmbuf_mtod_offset(m, struct ipv4_hdr *,
@@ -689,12 +685,7 @@ l3fwd_simple_forward(struct rte_mbuf *m, uint8_t portid,
 		ether_addr_copy(&ports_eth_addr[dst_port], &eth_hdr->s_addr);
 
 		send_single_packet(m, dst_port);
-#ifdef RTE_NEXT_ABI
 	} else if (RTE_ETH_IS_IPV6_HDR(m->packet_type)) {
-#else
-	}
-	else {
-#endif
 		/* Handle IPv6 headers.*/
 #if (APP_LOOKUP_METHOD == APP_LOOKUP_EXACT_MATCH)
 		struct ipv6_hdr *ipv6_hdr;
diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c
index fe5a257..1f3e5c6 100644
--- a/examples/l3fwd/main.c
+++ b/examples/l3fwd/main.c
@@ -1073,11 +1073,7 @@ l3fwd_simple_forward(struct rte_mbuf *m, uint8_t portid, struct lcore_conf *qcon
 
 	eth_hdr = rte_pktmbuf_mtod(m, struct ether_hdr *);
 
-#ifdef RTE_NEXT_ABI
 	if (RTE_ETH_IS_IPV4_HDR(m->packet_type)) {
-#else
-	if (m->ol_flags & PKT_RX_IPV4_HDR) {
-#endif
 		/* Handle IPv4 headers.*/
 		ipv4_hdr = rte_pktmbuf_mtod_offset(m, struct ipv4_hdr *,
 						   sizeof(struct ether_hdr));
@@ -1108,11 +1104,7 @@ l3fwd_simple_forward(struct rte_mbuf *m, uint8_t portid, struct lcore_conf *qcon
 		ether_addr_copy(&ports_eth_addr[dst_port], &eth_hdr->s_addr);
 
 		send_single_packet(m, dst_port);
-#ifdef RTE_NEXT_ABI
 	} else if (RTE_ETH_IS_IPV6_HDR(m->packet_type)) {
-#else
-	} else {
-#endif
 		/* Handle IPv6 headers.*/
 		struct ipv6_hdr *ipv6_hdr;
 
@@ -1131,13 +1123,9 @@ l3fwd_simple_forward(struct rte_mbuf *m, uint8_t portid, struct lcore_conf *qcon
 		ether_addr_copy(&ports_eth_addr[dst_port], &eth_hdr->s_addr);
 
 		send_single_packet(m, dst_port);
-#ifdef RTE_NEXT_ABI
 	} else
 		/* Free the mbuf that contains non-IPV4/IPV6 packet */
 		rte_pktmbuf_free(m);
-#else
-	}
-#endif
 }
 
 #if ((APP_LOOKUP_METHOD == APP_LOOKUP_LPM) && \
@@ -1163,19 +1151,11 @@ l3fwd_simple_forward(struct rte_mbuf *m, uint8_t portid, struct lcore_conf *qcon
  * to BAD_PORT value.
  */
 static inline __attribute__((always_inline)) void
-#ifdef RTE_NEXT_ABI
 rfc1812_process(struct ipv4_hdr *ipv4_hdr, uint16_t *dp, uint32_t ptype)
-#else
-rfc1812_process(struct ipv4_hdr *ipv4_hdr, uint16_t *dp, uint32_t flags)
-#endif
 {
 	uint8_t ihl;
 
-#ifdef RTE_NEXT_ABI
 	if (RTE_ETH_IS_IPV4_HDR(ptype)) {
-#else
-	if ((flags & PKT_RX_IPV4_HDR) != 0) {
-#endif
 		ihl = ipv4_hdr->version_ihl - IPV4_MIN_VER_IHL;
 
 		ipv4_hdr->time_to_live--;
@@ -1206,19 +1186,11 @@ get_dst_port(const struct lcore_conf *qconf, struct rte_mbuf *pkt,
 	struct ipv6_hdr *ipv6_hdr;
 	struct ether_hdr *eth_hdr;
 
-#ifdef RTE_NEXT_ABI
 	if (RTE_ETH_IS_IPV4_HDR(pkt->packet_type)) {
-#else
-	if (pkt->ol_flags & PKT_RX_IPV4_HDR) {
-#endif
 		if (rte_lpm_lookup(qconf->ipv4_lookup_struct, dst_ipv4,
 				&next_hop) != 0)
 			next_hop = portid;
-#ifdef RTE_NEXT_ABI
 	} else if (RTE_ETH_IS_IPV6_HDR(pkt->packet_type)) {
-#else
-	} else if (pkt->ol_flags & PKT_RX_IPV6_HDR) {
-#endif
 		eth_hdr = rte_pktmbuf_mtod(pkt, struct ether_hdr *);
 		ipv6_hdr = (struct ipv6_hdr *)(eth_hdr + 1);
 		if (rte_lpm6_lookup(qconf->ipv6_lookup_struct,
@@ -1252,17 +1224,12 @@ process_packet(struct lcore_conf *qconf, struct rte_mbuf *pkt,
 	ve = val_eth[dp];
 
 	dst_port[0] = dp;
-#ifdef RTE_NEXT_ABI
 	rfc1812_process(ipv4_hdr, dst_port, pkt->packet_type);
-#else
-	rfc1812_process(ipv4_hdr, dst_port, pkt->ol_flags);
-#endif
 
 	te =  _mm_blend_epi16(te, ve, MASK_ETH);
 	_mm_store_si128((__m128i *)eth_hdr, te);
 }
 
-#ifdef RTE_NEXT_ABI
 /*
  * Read packet_type and destination IPV4 addresses from 4 mbufs.
  */
@@ -1297,57 +1264,18 @@ processx4_step1(struct rte_mbuf *pkt[FWDSTEP],
 
 	dip[0] = _mm_set_epi32(x3, x2, x1, x0);
 }
-#else /* RTE_NEXT_ABI */
-/*
- * Read ol_flags and destination IPV4 addresses from 4 mbufs.
- */
-static inline void
-processx4_step1(struct rte_mbuf *pkt[FWDSTEP], __m128i *dip, uint32_t *flag)
-{
-	struct ipv4_hdr *ipv4_hdr;
-	struct ether_hdr *eth_hdr;
-	uint32_t x0, x1, x2, x3;
-
-	eth_hdr = rte_pktmbuf_mtod(pkt[0], struct ether_hdr *);
-	ipv4_hdr = (struct ipv4_hdr *)(eth_hdr + 1);
-	x0 = ipv4_hdr->dst_addr;
-	flag[0] = pkt[0]->ol_flags & PKT_RX_IPV4_HDR;
-
-	eth_hdr = rte_pktmbuf_mtod(pkt[1], struct ether_hdr *);
-	ipv4_hdr = (struct ipv4_hdr *)(eth_hdr + 1);
-	x1 = ipv4_hdr->dst_addr;
-	flag[0] &= pkt[1]->ol_flags;
-
-	eth_hdr = rte_pktmbuf_mtod(pkt[2], struct ether_hdr *);
-	ipv4_hdr = (struct ipv4_hdr *)(eth_hdr + 1);
-	x2 = ipv4_hdr->dst_addr;
-	flag[0] &= pkt[2]->ol_flags;
-
-	eth_hdr = rte_pktmbuf_mtod(pkt[3], struct ether_hdr *);
-	ipv4_hdr = (struct ipv4_hdr *)(eth_hdr + 1);
-	x3 = ipv4_hdr->dst_addr;
-	flag[0] &= pkt[3]->ol_flags;
-
-	dip[0] = _mm_set_epi32(x3, x2, x1, x0);
-}
-#endif /* RTE_NEXT_ABI */
 
 /*
  * Lookup into LPM for destination port.
  * If lookup fails, use incoming port (portid) as destination port.
  */
 static inline void
-#ifdef RTE_NEXT_ABI
 processx4_step2(const struct lcore_conf *qconf,
 		__m128i dip,
 		uint32_t ipv4_flag,
 		uint8_t portid,
 		struct rte_mbuf *pkt[FWDSTEP],
 		uint16_t dprt[FWDSTEP])
-#else
-processx4_step2(const struct lcore_conf *qconf, __m128i dip, uint32_t flag,
-	uint8_t portid, struct rte_mbuf *pkt[FWDSTEP], uint16_t dprt[FWDSTEP])
-#endif /* RTE_NEXT_ABI */
 {
 	rte_xmm_t dst;
 	const  __m128i bswap_mask = _mm_set_epi8(12, 13, 14, 15, 8, 9, 10, 11,
@@ -1357,11 +1285,7 @@ processx4_step2(const struct lcore_conf *qconf, __m128i dip, uint32_t flag,
 	dip = _mm_shuffle_epi8(dip, bswap_mask);
 
 	/* if all 4 packets are IPV4. */
-#ifdef RTE_NEXT_ABI
 	if (likely(ipv4_flag)) {
-#else
-	if (likely(flag != 0)) {
-#endif
 		rte_lpm_lookupx4(qconf->ipv4_lookup_struct, dip, dprt, portid);
 	} else {
 		dst.x = dip;
@@ -1411,7 +1335,6 @@ processx4_step3(struct rte_mbuf *pkt[FWDSTEP], uint16_t dst_port[FWDSTEP])
 	_mm_store_si128(p[2], te[2]);
 	_mm_store_si128(p[3], te[3]);
 
-#ifdef RTE_NEXT_ABI
 	rfc1812_process((struct ipv4_hdr *)((struct ether_hdr *)p[0] + 1),
 		&dst_port[0], pkt[0]->packet_type);
 	rfc1812_process((struct ipv4_hdr *)((struct ether_hdr *)p[1] + 1),
@@ -1420,16 +1343,6 @@ processx4_step3(struct rte_mbuf *pkt[FWDSTEP], uint16_t dst_port[FWDSTEP])
 		&dst_port[2], pkt[2]->packet_type);
 	rfc1812_process((struct ipv4_hdr *)((struct ether_hdr *)p[3] + 1),
 		&dst_port[3], pkt[3]->packet_type);
-#else /* RTE_NEXT_ABI */
-	rfc1812_process((struct ipv4_hdr *)((struct ether_hdr *)p[0] + 1),
-		&dst_port[0], pkt[0]->ol_flags);
-	rfc1812_process((struct ipv4_hdr *)((struct ether_hdr *)p[1] + 1),
-		&dst_port[1], pkt[1]->ol_flags);
-	rfc1812_process((struct ipv4_hdr *)((struct ether_hdr *)p[2] + 1),
-		&dst_port[2], pkt[2]->ol_flags);
-	rfc1812_process((struct ipv4_hdr *)((struct ether_hdr *)p[3] + 1),
-		&dst_port[3], pkt[3]->ol_flags);
-#endif /* RTE_NEXT_ABI */
 }
 
 /*
@@ -1616,11 +1529,7 @@ main_loop(__attribute__((unused)) void *dummy)
 	uint16_t *lp;
 	uint16_t dst_port[MAX_PKT_BURST];
 	__m128i dip[MAX_PKT_BURST / FWDSTEP];
-#ifdef RTE_NEXT_ABI
 	uint32_t ipv4_flag[MAX_PKT_BURST / FWDSTEP];
-#else
-	uint32_t flag[MAX_PKT_BURST / FWDSTEP];
-#endif
 	uint16_t pnum[MAX_PKT_BURST + 1];
 #endif
 
@@ -1690,7 +1599,6 @@ main_loop(__attribute__((unused)) void *dummy)
 				 */
 				int32_t n = RTE_ALIGN_FLOOR(nb_rx, 8);
 				for (j = 0; j < n; j += 8) {
-#ifdef RTE_NEXT_ABI
 					uint32_t pkt_type =
 						pkts_burst[j]->packet_type &
 						pkts_burst[j+1]->packet_type &
@@ -1705,20 +1613,6 @@ main_loop(__attribute__((unused)) void *dummy)
 						&pkts_burst[j], portid, qconf);
 					} else if (pkt_type &
 						RTE_PTYPE_L3_IPV6) {
-#else /* RTE_NEXT_ABI */
-					uint32_t ol_flag = pkts_burst[j]->ol_flags
-							& pkts_burst[j+1]->ol_flags
-							& pkts_burst[j+2]->ol_flags
-							& pkts_burst[j+3]->ol_flags
-							& pkts_burst[j+4]->ol_flags
-							& pkts_burst[j+5]->ol_flags
-							& pkts_burst[j+6]->ol_flags
-							& pkts_burst[j+7]->ol_flags;
-					if (ol_flag & PKT_RX_IPV4_HDR ) {
-						simple_ipv4_fwd_8pkts(&pkts_burst[j],
-									portid, qconf);
-					} else if (ol_flag & PKT_RX_IPV6_HDR) {
-#endif /* RTE_NEXT_ABI */
 						simple_ipv6_fwd_8pkts(&pkts_burst[j],
 									portid, qconf);
 					} else {
@@ -1751,21 +1645,13 @@ main_loop(__attribute__((unused)) void *dummy)
 			for (j = 0; j != k; j += FWDSTEP) {
 				processx4_step1(&pkts_burst[j],
 					&dip[j / FWDSTEP],
-#ifdef RTE_NEXT_ABI
 					&ipv4_flag[j / FWDSTEP]);
-#else
-					&flag[j / FWDSTEP]);
-#endif
 			}
 
 			k = RTE_ALIGN_FLOOR(nb_rx, FWDSTEP);
 			for (j = 0; j != k; j += FWDSTEP) {
 				processx4_step2(qconf, dip[j / FWDSTEP],
-#ifdef RTE_NEXT_ABI
 					ipv4_flag[j / FWDSTEP], portid,
-#else
-					flag[j / FWDSTEP], portid,
-#endif
 					&pkts_burst[j], &dst_port[j]);
 			}
 
diff --git a/examples/tep_termination/vxlan.c b/examples/tep_termination/vxlan.c
index e98a29f..5ee1f95 100644
--- a/examples/tep_termination/vxlan.c
+++ b/examples/tep_termination/vxlan.c
@@ -180,12 +180,7 @@ decapsulation(struct rte_mbuf *pkt)
 	 * (rfc7348) or that the rx offload flag is set (i40e only
 	 * currently)*/
 	if (udp_hdr->dst_port != rte_cpu_to_be_16(DEFAULT_VXLAN_PORT) &&
-#ifdef RTE_NEXT_ABI
 		(pkt->packet_type & RTE_PTYPE_TUNNEL_MASK) == 0)
-#else
-			(pkt->ol_flags & (PKT_RX_TUNNEL_IPV4_HDR |
-				PKT_RX_TUNNEL_IPV6_HDR)) == 0)
-#endif
 		return -1;
 	outer_header_len = info.outer_l2_len + info.outer_l3_len
 		+ sizeof(struct udp_hdr) + sizeof(struct vxlan_hdr);
diff --git a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
index e9f38bd..bd1cc09 100644
--- a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
+++ b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h
@@ -117,15 +117,9 @@ struct rte_kni_mbuf {
 	uint16_t data_off;      /**< Start address of data in segment buffer. */
 	char pad1[4];
 	uint64_t ol_flags;      /**< Offload features. */
-#ifdef RTE_NEXT_ABI
 	char pad2[4];
 	uint32_t pkt_len;       /**< Total pkt len: sum of all segment data_len. */
 	uint16_t data_len;      /**< Amount of data in segment buffer. */
-#else
-	char pad2[2];
-	uint16_t data_len;      /**< Amount of data in segment buffer. */
-	uint32_t pkt_len;       /**< Total pkt len: sum of all segment data_len. */
-#endif
 
 	/* fields on second cache line */
 	char pad3[8] __attribute__((__aligned__(RTE_CACHE_LINE_SIZE)));
diff --git a/lib/librte_mbuf/Makefile b/lib/librte_mbuf/Makefile
index 080f3cf..8d62b0d 100644
--- a/lib/librte_mbuf/Makefile
+++ b/lib/librte_mbuf/Makefile
@@ -38,7 +38,7 @@ CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3
 
 EXPORT_MAP := rte_mbuf_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 # all source are stored in SRCS-y
 SRCS-$(CONFIG_RTE_LIBRTE_MBUF) := rte_mbuf.c
diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c
index e416312..c18b438 100644
--- a/lib/librte_mbuf/rte_mbuf.c
+++ b/lib/librte_mbuf/rte_mbuf.c
@@ -258,18 +258,8 @@ const char *rte_get_rx_ol_flag_name(uint64_t mask)
 	/* case PKT_RX_HBUF_OVERFLOW: return "PKT_RX_HBUF_OVERFLOW"; */
 	/* case PKT_RX_RECIP_ERR: return "PKT_RX_RECIP_ERR"; */
 	/* case PKT_RX_MAC_ERR: return "PKT_RX_MAC_ERR"; */
-#ifndef RTE_NEXT_ABI
-	case PKT_RX_IPV4_HDR: return "PKT_RX_IPV4_HDR";
-	case PKT_RX_IPV4_HDR_EXT: return "PKT_RX_IPV4_HDR_EXT";
-	case PKT_RX_IPV6_HDR: return "PKT_RX_IPV6_HDR";
-	case PKT_RX_IPV6_HDR_EXT: return "PKT_RX_IPV6_HDR_EXT";
-#endif /* RTE_NEXT_ABI */
 	case PKT_RX_IEEE1588_PTP: return "PKT_RX_IEEE1588_PTP";
 	case PKT_RX_IEEE1588_TMST: return "PKT_RX_IEEE1588_TMST";
-#ifndef RTE_NEXT_ABI
-	case PKT_RX_TUNNEL_IPV4_HDR: return "PKT_RX_TUNNEL_IPV4_HDR";
-	case PKT_RX_TUNNEL_IPV6_HDR: return "PKT_RX_TUNNEL_IPV6_HDR";
-#endif /* RTE_NEXT_ABI */
 	default: return NULL;
 	}
 }
diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
index 8c2db1b..d7c9030 100644
--- a/lib/librte_mbuf/rte_mbuf.h
+++ b/lib/librte_mbuf/rte_mbuf.h
@@ -93,18 +93,8 @@ extern "C" {
 #define PKT_RX_HBUF_OVERFLOW (0ULL << 0)  /**< Header buffer overflow. */
 #define PKT_RX_RECIP_ERR     (0ULL << 0)  /**< Hardware processing error. */
 #define PKT_RX_MAC_ERR       (0ULL << 0)  /**< MAC error. */
-#ifndef RTE_NEXT_ABI
-#define PKT_RX_IPV4_HDR      (1ULL << 5)  /**< RX packet with IPv4 header. */
-#define PKT_RX_IPV4_HDR_EXT  (1ULL << 6)  /**< RX packet with extended IPv4 header. */
-#define PKT_RX_IPV6_HDR      (1ULL << 7)  /**< RX packet with IPv6 header. */
-#define PKT_RX_IPV6_HDR_EXT  (1ULL << 8)  /**< RX packet with extended IPv6 header. */
-#endif /* RTE_NEXT_ABI */
 #define PKT_RX_IEEE1588_PTP  (1ULL << 9)  /**< RX IEEE1588 L2 Ethernet PT Packet. */
 #define PKT_RX_IEEE1588_TMST (1ULL << 10) /**< RX IEEE1588 L2/L4 timestamped packet.*/
-#ifndef RTE_NEXT_ABI
-#define PKT_RX_TUNNEL_IPV4_HDR (1ULL << 11) /**< RX tunnel packet with IPv4 header.*/
-#define PKT_RX_TUNNEL_IPV6_HDR (1ULL << 12) /**< RX tunnel packet with IPv6 header. */
-#endif /* RTE_NEXT_ABI */
 #define PKT_RX_FDIR_ID       (1ULL << 13) /**< FD id reported if FDIR match. */
 #define PKT_RX_FDIR_FLX      (1ULL << 14) /**< Flexible bytes reported if FDIR match. */
 #define PKT_RX_QINQ_PKT      (1ULL << 15)  /**< RX packet with double VLAN stripped. */
@@ -209,7 +199,6 @@ extern "C" {
 /* Use final bit of flags to indicate a control mbuf */
 #define CTRL_MBUF_FLAG       (1ULL << 63) /**< Mbuf contains control data */
 
-#ifdef RTE_NEXT_ABI
 /*
  * 32 bits are divided into several fields to mark packet types. Note that
  * each field is indexical.
@@ -696,7 +685,6 @@ extern "C" {
                                                  RTE_PTYPE_INNER_L2_MASK | \
                                                  RTE_PTYPE_INNER_L3_MASK | \
                                                  RTE_PTYPE_INNER_L4_MASK))
-#endif /* RTE_NEXT_ABI */
 
 /** Alignment constraint of mbuf private area. */
 #define RTE_MBUF_PRIV_ALIGN 8
@@ -775,7 +763,6 @@ struct rte_mbuf {
 	/* remaining bytes are set on RX when pulling packet from descriptor */
 	MARKER rx_descriptor_fields1;
 
-#ifdef RTE_NEXT_ABI
 	/*
 	 * The packet type, which is the combination of outer/inner L2, L3, L4
 	 * and tunnel types.
@@ -796,19 +783,7 @@ struct rte_mbuf {
 	uint32_t pkt_len;         /**< Total pkt len: sum of all segments. */
 	uint16_t data_len;        /**< Amount of data in segment buffer. */
 	uint16_t vlan_tci;        /**< VLAN Tag Control Identifier (CPU order) */
-#else /* RTE_NEXT_ABI */
-	/**
-	 * The packet type, which is used to indicate ordinary packet and also
-	 * tunneled packet format, i.e. each number is represented a type of
-	 * packet.
-	 */
-	uint16_t packet_type;
 
-	uint16_t data_len;        /**< Amount of data in segment buffer. */
-	uint32_t pkt_len;         /**< Total pkt len: sum of all segments. */
-	uint16_t vlan_tci;        /**< VLAN Tag Control Identifier (CPU order) */
-	uint16_t vlan_tci_outer;  /**< Outer VLAN Tag Control Identifier (CPU order) */
-#endif /* RTE_NEXT_ABI */
 	union {
 		uint32_t rss;     /**< RSS hash result if RSS enabled */
 		struct {
@@ -829,9 +804,8 @@ struct rte_mbuf {
 	} hash;                   /**< hash information */
 
 	uint32_t seqn; /**< Sequence number. See also rte_reorder_insert() */
-#ifdef RTE_NEXT_ABI
+
 	uint16_t vlan_tci_outer;  /**< Outer VLAN Tag Control Identifier (CPU order) */
-#endif /* RTE_NEXT_ABI */
 
 	/* second cache line - fields only used in slow path or on TX */
 	MARKER cacheline1 __rte_cache_aligned;
-- 
2.5.1

^ permalink raw reply	[relevance 2%]

* [dpdk-dev] [PATCH 1/9] ethdev: remove Rx interrupt switch
  @ 2015-09-01 21:30  5% ` Thomas Monjalon
  2015-09-01 21:30  2% ` [dpdk-dev] [PATCH 2/9] mbuf: remove packet type from offload flags Thomas Monjalon
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-09-01 21:30 UTC (permalink / raw)
  To: dev

The Rx interrupt feature is now part of the standard ABI.
Because of changes in rte_intr_handle and struct rte_eth_conf,
the eal and ethdev library versions are bumped.

Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
---
 doc/guides/rel_notes/deprecation.rst               |  4 --
 drivers/net/e1000/igb_ethdev.c                     | 26 -----------
 drivers/net/ixgbe/ixgbe_ethdev.c                   | 40 ----------------
 examples/l3fwd-power/main.c                        |  2 -
 lib/librte_eal/bsdapp/eal/Makefile                 |  2 +-
 .../bsdapp/eal/include/exec-env/rte_interrupts.h   |  2 -
 lib/librte_eal/linuxapp/eal/Makefile               |  2 +-
 lib/librte_eal/linuxapp/eal/eal_interrupts.c       | 53 ----------------------
 .../linuxapp/eal/include/exec-env/rte_interrupts.h |  2 -
 lib/librte_ether/Makefile                          |  2 +-
 lib/librte_ether/rte_ethdev.c                      | 40 ----------------
 lib/librte_ether/rte_ethdev.h                      |  4 --
 12 files changed, 3 insertions(+), 176 deletions(-)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index da17880..991a777 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -13,10 +13,6 @@ Deprecation Notices
   There is no backward compatibility planned from release 2.2.
   All binaries will need to be rebuilt from release 2.2.
 
-* ABI changes are planned for struct rte_intr_handle, struct rte_eth_conf
-  and struct eth_dev_ops to support interrupt mode feature from release 2.1.
-  Those changes may be enabled in the release 2.1 with CONFIG_RTE_NEXT_ABI.
-
 * The EAL function rte_eal_pci_close_one is deprecated because renamed to
   rte_eal_pci_detach.
 
diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c
index c7e6d55..848ef6e 100644
--- a/drivers/net/e1000/igb_ethdev.c
+++ b/drivers/net/e1000/igb_ethdev.c
@@ -106,9 +106,7 @@ static int  eth_igb_flow_ctrl_get(struct rte_eth_dev *dev,
 static int  eth_igb_flow_ctrl_set(struct rte_eth_dev *dev,
 				struct rte_eth_fc_conf *fc_conf);
 static int eth_igb_lsc_interrupt_setup(struct rte_eth_dev *dev);
-#ifdef RTE_NEXT_ABI
 static int eth_igb_rxq_interrupt_setup(struct rte_eth_dev *dev);
-#endif
 static int eth_igb_interrupt_get_status(struct rte_eth_dev *dev);
 static int eth_igb_interrupt_action(struct rte_eth_dev *dev);
 static void eth_igb_interrupt_handler(struct rte_intr_handle *handle,
@@ -232,7 +230,6 @@ static int igb_timesync_read_rx_timestamp(struct rte_eth_dev *dev,
 					  uint32_t flags);
 static int igb_timesync_read_tx_timestamp(struct rte_eth_dev *dev,
 					  struct timespec *timestamp);
-#ifdef RTE_NEXT_ABI
 static int eth_igb_rx_queue_intr_enable(struct rte_eth_dev *dev,
 					uint16_t queue_id);
 static int eth_igb_rx_queue_intr_disable(struct rte_eth_dev *dev,
@@ -241,7 +238,6 @@ static void eth_igb_assign_msix_vector(struct e1000_hw *hw, int8_t direction,
 				       uint8_t queue, uint8_t msix_vector);
 static void eth_igb_write_ivar(struct e1000_hw *hw, uint8_t msix_vector,
 			       uint8_t index, uint8_t offset);
-#endif
 static void eth_igb_configure_msix_intr(struct rte_eth_dev *dev);
 
 /*
@@ -303,10 +299,8 @@ static const struct eth_dev_ops eth_igb_ops = {
 	.vlan_tpid_set        = eth_igb_vlan_tpid_set,
 	.vlan_offload_set     = eth_igb_vlan_offload_set,
 	.rx_queue_setup       = eth_igb_rx_queue_setup,
-#ifdef RTE_NEXT_ABI
 	.rx_queue_intr_enable = eth_igb_rx_queue_intr_enable,
 	.rx_queue_intr_disable = eth_igb_rx_queue_intr_disable,
-#endif
 	.rx_queue_release     = eth_igb_rx_queue_release,
 	.rx_queue_count       = eth_igb_rx_queue_count,
 	.rx_descriptor_done   = eth_igb_rx_descriptor_done,
@@ -893,9 +887,7 @@ eth_igb_start(struct rte_eth_dev *dev)
 		E1000_DEV_PRIVATE(dev->data->dev_private);
 	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
 	int ret, mask;
-#ifdef RTE_NEXT_ABI
 	uint32_t intr_vector = 0;
-#endif
 	uint32_t ctrl_ext;
 
 	PMD_INIT_FUNC_TRACE();
@@ -936,7 +928,6 @@ eth_igb_start(struct rte_eth_dev *dev)
 	/* configure PF module if SRIOV enabled */
 	igb_pf_host_configure(dev);
 
-#ifdef RTE_NEXT_ABI
 	/* check and configure queue intr-vector mapping */
 	if (dev->data->dev_conf.intr_conf.rxq != 0)
 		intr_vector = dev->data->nb_rx_queues;
@@ -954,7 +945,6 @@ eth_igb_start(struct rte_eth_dev *dev)
 			return -ENOMEM;
 		}
 	}
-#endif
 
 	/* confiugre msix for rx interrupt */
 	eth_igb_configure_msix_intr(dev);
@@ -1050,11 +1040,9 @@ eth_igb_start(struct rte_eth_dev *dev)
 				     " no intr multiplex\n");
 	}
 
-#ifdef RTE_NEXT_ABI
 	/* check if rxq interrupt is enabled */
 	if (dev->data->dev_conf.intr_conf.rxq != 0)
 		eth_igb_rxq_interrupt_setup(dev);
-#endif
 
 	/* enable uio/vfio intr/eventfd mapping */
 	rte_intr_enable(intr_handle);
@@ -1146,14 +1134,12 @@ eth_igb_stop(struct rte_eth_dev *dev)
 	}
 	filter_info->twotuple_mask = 0;
 
-#ifdef RTE_NEXT_ABI
 	/* Clean datapath event and queue/vec mapping */
 	rte_intr_efd_disable(intr_handle);
 	if (intr_handle->intr_vec != NULL) {
 		rte_free(intr_handle->intr_vec);
 		intr_handle->intr_vec = NULL;
 	}
-#endif
 }
 
 static void
@@ -1163,9 +1149,7 @@ eth_igb_close(struct rte_eth_dev *dev)
 	struct e1000_adapter *adapter =
 		E1000_DEV_PRIVATE(dev->data->dev_private);
 	struct rte_eth_link link;
-#ifdef RTE_NEXT_ABI
 	struct rte_pci_device *pci_dev;
-#endif
 
 	eth_igb_stop(dev);
 	adapter->stopped = 1;
@@ -1185,13 +1169,11 @@ eth_igb_close(struct rte_eth_dev *dev)
 
 	igb_dev_free_queues(dev);
 
-#ifdef RTE_NEXT_ABI
 	pci_dev = dev->pci_dev;
 	if (pci_dev->intr_handle.intr_vec) {
 		rte_free(pci_dev->intr_handle.intr_vec);
 		pci_dev->intr_handle.intr_vec = NULL;
 	}
-#endif
 
 	memset(&link, 0, sizeof(link));
 	rte_igb_dev_atomic_write_link_status(dev, &link);
@@ -2017,7 +1999,6 @@ eth_igb_lsc_interrupt_setup(struct rte_eth_dev *dev)
 	return 0;
 }
 
-#ifdef RTE_NEXT_ABI
 /* It clears the interrupt causes and enables the interrupt.
  * It will be called once only during nic initialized.
  *
@@ -2044,7 +2025,6 @@ static int eth_igb_rxq_interrupt_setup(struct rte_eth_dev *dev)
 
 	return 0;
 }
-#endif
 
 /*
  * It reads ICR and gets interrupt causes, check it and set a bit flag
@@ -4144,7 +4124,6 @@ static struct rte_driver pmd_igbvf_drv = {
 	.init = rte_igbvf_pmd_init,
 };
 
-#ifdef RTE_NEXT_ABI
 static int
 eth_igb_rx_queue_intr_disable(struct rte_eth_dev *dev, uint16_t queue_id)
 {
@@ -4219,7 +4198,6 @@ eth_igb_assign_msix_vector(struct e1000_hw *hw, int8_t direction,
 					   8 * direction);
 	}
 }
-#endif
 
 /* Sets up the hardware to generate MSI-X interrupts properly
  * @hw
@@ -4228,13 +4206,11 @@ eth_igb_assign_msix_vector(struct e1000_hw *hw, int8_t direction,
 static void
 eth_igb_configure_msix_intr(struct rte_eth_dev *dev)
 {
-#ifdef RTE_NEXT_ABI
 	int queue_id;
 	uint32_t tmpval, regval, intr_mask;
 	struct e1000_hw *hw =
 		E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	uint32_t vec = 0;
-#endif
 	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
 
 	/* won't configure msix register if no mapping is done
@@ -4243,7 +4219,6 @@ eth_igb_configure_msix_intr(struct rte_eth_dev *dev)
 	if (!rte_intr_dp_is_en(intr_handle))
 		return;
 
-#ifdef RTE_NEXT_ABI
 	/* set interrupt vector for other causes */
 	if (hw->mac.type == e1000_82575) {
 		tmpval = E1000_READ_REG(hw, E1000_CTRL_EXT);
@@ -4299,7 +4274,6 @@ eth_igb_configure_msix_intr(struct rte_eth_dev *dev)
 	}
 
 	E1000_WRITE_FLUSH(hw);
-#endif
 }
 
 PMD_REGISTER_DRIVER(pmd_igb_drv);
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index b8ee1e9..ec2918c 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -190,9 +190,7 @@ static int ixgbe_dev_rss_reta_query(struct rte_eth_dev *dev,
 			uint16_t reta_size);
 static void ixgbe_dev_link_status_print(struct rte_eth_dev *dev);
 static int ixgbe_dev_lsc_interrupt_setup(struct rte_eth_dev *dev);
-#ifdef RTE_NEXT_ABI
 static int ixgbe_dev_rxq_interrupt_setup(struct rte_eth_dev *dev);
-#endif
 static int ixgbe_dev_interrupt_get_status(struct rte_eth_dev *dev);
 static int ixgbe_dev_interrupt_action(struct rte_eth_dev *dev);
 static void ixgbe_dev_interrupt_handler(struct rte_intr_handle *handle,
@@ -227,14 +225,12 @@ static void ixgbevf_vlan_offload_set(struct rte_eth_dev *dev, int mask);
 static void ixgbevf_set_vfta_all(struct rte_eth_dev *dev, bool on);
 static void ixgbevf_dev_interrupt_handler(struct rte_intr_handle *handle,
 					  void *param);
-#ifdef RTE_NEXT_ABI
 static int ixgbevf_dev_rx_queue_intr_enable(struct rte_eth_dev *dev,
 					    uint16_t queue_id);
 static int ixgbevf_dev_rx_queue_intr_disable(struct rte_eth_dev *dev,
 					     uint16_t queue_id);
 static void ixgbevf_set_ivar_map(struct ixgbe_hw *hw, int8_t direction,
 				 uint8_t queue, uint8_t msix_vector);
-#endif
 static void ixgbevf_configure_msix(struct rte_eth_dev *dev);
 
 /* For Eth VMDQ APIs support */
@@ -252,14 +248,12 @@ static int ixgbe_mirror_rule_set(struct rte_eth_dev *dev,
 		uint8_t rule_id, uint8_t on);
 static int ixgbe_mirror_rule_reset(struct rte_eth_dev *dev,
 		uint8_t	rule_id);
-#ifdef RTE_NEXT_ABI
 static int ixgbe_dev_rx_queue_intr_enable(struct rte_eth_dev *dev,
 					  uint16_t queue_id);
 static int ixgbe_dev_rx_queue_intr_disable(struct rte_eth_dev *dev,
 					   uint16_t queue_id);
 static void ixgbe_set_ivar_map(struct ixgbe_hw *hw, int8_t direction,
 			       uint8_t queue, uint8_t msix_vector);
-#endif
 static void ixgbe_configure_msix(struct rte_eth_dev *dev);
 
 static int ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev,
@@ -420,10 +414,8 @@ static const struct eth_dev_ops ixgbe_eth_dev_ops = {
 	.tx_queue_start	      = ixgbe_dev_tx_queue_start,
 	.tx_queue_stop        = ixgbe_dev_tx_queue_stop,
 	.rx_queue_setup       = ixgbe_dev_rx_queue_setup,
-#ifdef RTE_NEXT_ABI
 	.rx_queue_intr_enable = ixgbe_dev_rx_queue_intr_enable,
 	.rx_queue_intr_disable = ixgbe_dev_rx_queue_intr_disable,
-#endif
 	.rx_queue_release     = ixgbe_dev_rx_queue_release,
 	.rx_queue_count       = ixgbe_dev_rx_queue_count,
 	.rx_descriptor_done   = ixgbe_dev_rx_descriptor_done,
@@ -497,10 +489,8 @@ static const struct eth_dev_ops ixgbevf_eth_dev_ops = {
 	.rx_descriptor_done   = ixgbe_dev_rx_descriptor_done,
 	.tx_queue_setup       = ixgbe_dev_tx_queue_setup,
 	.tx_queue_release     = ixgbe_dev_tx_queue_release,
-#ifdef RTE_NEXT_ABI
 	.rx_queue_intr_enable = ixgbevf_dev_rx_queue_intr_enable,
 	.rx_queue_intr_disable = ixgbevf_dev_rx_queue_intr_disable,
-#endif
 	.mac_addr_add         = ixgbevf_add_mac_addr,
 	.mac_addr_remove      = ixgbevf_remove_mac_addr,
 	.set_mc_addr_list     = ixgbe_dev_set_mc_addr_list,
@@ -1680,9 +1670,7 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
 	struct ixgbe_vf_info *vfinfo =
 		*IXGBE_DEV_PRIVATE_TO_P_VFDATA(dev->data->dev_private);
 	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
-#ifdef RTE_NEXT_ABI
 	uint32_t intr_vector = 0;
-#endif
 	int err, link_up = 0, negotiate = 0;
 	uint32_t speed = 0;
 	int mask = 0;
@@ -1715,7 +1703,6 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
 	/* configure PF module if SRIOV enabled */
 	ixgbe_pf_host_configure(dev);
 
-#ifdef RTE_NEXT_ABI
 	/* check and configure queue intr-vector mapping */
 	if (dev->data->dev_conf.intr_conf.rxq != 0)
 		intr_vector = dev->data->nb_rx_queues;
@@ -1734,7 +1721,6 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
 			return -ENOMEM;
 		}
 	}
-#endif
 
 	/* confiugre msix for sleep until rx interrupt */
 	ixgbe_configure_msix(dev);
@@ -1827,11 +1813,9 @@ skip_link_setup:
 				     " no intr multiplex\n");
 	}
 
-#ifdef RTE_NEXT_ABI
 	/* check if rxq interrupt is enabled */
 	if (dev->data->dev_conf.intr_conf.rxq != 0)
 		ixgbe_dev_rxq_interrupt_setup(dev);
-#endif
 
 	/* enable uio/vfio intr/eventfd mapping */
 	rte_intr_enable(intr_handle);
@@ -1942,14 +1926,12 @@ ixgbe_dev_stop(struct rte_eth_dev *dev)
 	memset(filter_info->fivetuple_mask, 0,
 		sizeof(uint32_t) * IXGBE_5TUPLE_ARRAY_SIZE);
 
-#ifdef RTE_NEXT_ABI
 	/* Clean datapath event and queue/vec mapping */
 	rte_intr_efd_disable(intr_handle);
 	if (intr_handle->intr_vec != NULL) {
 		rte_free(intr_handle->intr_vec);
 		intr_handle->intr_vec = NULL;
 	}
-#endif
 }
 
 /*
@@ -2623,7 +2605,6 @@ ixgbe_dev_lsc_interrupt_setup(struct rte_eth_dev *dev)
  *  - On success, zero.
  *  - On failure, a negative value.
  */
-#ifdef RTE_NEXT_ABI
 static int
 ixgbe_dev_rxq_interrupt_setup(struct rte_eth_dev *dev)
 {
@@ -2634,7 +2615,6 @@ ixgbe_dev_rxq_interrupt_setup(struct rte_eth_dev *dev)
 
 	return 0;
 }
-#endif
 
 /*
  * It reads ICR and sets flag (IXGBE_EICR_LSC) for the link_update.
@@ -3435,9 +3415,7 @@ ixgbevf_dev_start(struct rte_eth_dev *dev)
 {
 	struct ixgbe_hw *hw =
 		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-#ifdef RTE_NEXT_ABI
 	uint32_t intr_vector = 0;
-#endif
 	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
 
 	int err, mask = 0;
@@ -3470,7 +3448,6 @@ ixgbevf_dev_start(struct rte_eth_dev *dev)
 
 	ixgbevf_dev_rxtx_start(dev);
 
-#ifdef RTE_NEXT_ABI
 	/* check and configure queue intr-vector mapping */
 	if (dev->data->dev_conf.intr_conf.rxq != 0)
 		intr_vector = dev->data->nb_rx_queues;
@@ -3488,7 +3465,6 @@ ixgbevf_dev_start(struct rte_eth_dev *dev)
 			return -ENOMEM;
 		}
 	}
-#endif
 	ixgbevf_configure_msix(dev);
 
 	if (dev->data->dev_conf.intr_conf.lsc != 0) {
@@ -3534,23 +3510,19 @@ ixgbevf_dev_stop(struct rte_eth_dev *dev)
 	/* disable intr eventfd mapping */
 	rte_intr_disable(intr_handle);
 
-#ifdef RTE_NEXT_ABI
 	/* Clean datapath event and queue/vec mapping */
 	rte_intr_efd_disable(intr_handle);
 	if (intr_handle->intr_vec != NULL) {
 		rte_free(intr_handle->intr_vec);
 		intr_handle->intr_vec = NULL;
 	}
-#endif
 }
 
 static void
 ixgbevf_dev_close(struct rte_eth_dev *dev)
 {
 	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-#ifdef RTE_NEXT_ABI
 	struct rte_pci_device *pci_dev;
-#endif
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -3563,13 +3535,11 @@ ixgbevf_dev_close(struct rte_eth_dev *dev)
 	/* reprogram the RAR[0] in case user changed it. */
 	ixgbe_set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV);
 
-#ifdef RTE_NEXT_ABI
 	pci_dev = dev->pci_dev;
 	if (pci_dev->intr_handle.intr_vec) {
 		rte_free(pci_dev->intr_handle.intr_vec);
 		pci_dev->intr_handle.intr_vec = NULL;
 	}
-#endif
 }
 
 static void ixgbevf_set_vfta_all(struct rte_eth_dev *dev, bool on)
@@ -4087,7 +4057,6 @@ ixgbe_mirror_rule_reset(struct rte_eth_dev *dev, uint8_t rule_id)
 	return 0;
 }
 
-#ifdef RTE_NEXT_ABI
 static int
 ixgbevf_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
 {
@@ -4240,18 +4209,15 @@ ixgbe_set_ivar_map(struct ixgbe_hw *hw, int8_t direction,
 		}
 	}
 }
-#endif
 
 static void
 ixgbevf_configure_msix(struct rte_eth_dev *dev)
 {
 	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
-#ifdef RTE_NEXT_ABI
 	struct ixgbe_hw *hw =
 		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	uint32_t q_idx;
 	uint32_t vector_idx = 0;
-#endif
 
 	/* won't configure msix register if no mapping is done
 	 * between intr vector and event fd.
@@ -4259,7 +4225,6 @@ ixgbevf_configure_msix(struct rte_eth_dev *dev)
 	if (!rte_intr_dp_is_en(intr_handle))
 		return;
 
-#ifdef RTE_NEXT_ABI
 	/* Configure all RX queues of VF */
 	for (q_idx = 0; q_idx < dev->data->nb_rx_queues; q_idx++) {
 		/* Force all queue use vector 0,
@@ -4271,7 +4236,6 @@ ixgbevf_configure_msix(struct rte_eth_dev *dev)
 
 	/* Configure VF Rx queue ivar */
 	ixgbevf_set_ivar_map(hw, -1, 1, vector_idx);
-#endif
 }
 
 /**
@@ -4283,13 +4247,11 @@ static void
 ixgbe_configure_msix(struct rte_eth_dev *dev)
 {
 	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
-#ifdef RTE_NEXT_ABI
 	struct ixgbe_hw *hw =
 		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	uint32_t queue_id, vec = 0;
 	uint32_t mask;
 	uint32_t gpie;
-#endif
 
 	/* won't configure msix register if no mapping is done
 	 * between intr vector and event fd
@@ -4297,7 +4259,6 @@ ixgbe_configure_msix(struct rte_eth_dev *dev)
 	if (!rte_intr_dp_is_en(intr_handle))
 		return;
 
-#ifdef RTE_NEXT_ABI
 	/* setup GPIE for MSI-x mode */
 	gpie = IXGBE_READ_REG(hw, IXGBE_GPIE);
 	gpie |= IXGBE_GPIE_MSIX_MODE | IXGBE_GPIE_PBA_SUPPORT |
@@ -4347,7 +4308,6 @@ ixgbe_configure_msix(struct rte_eth_dev *dev)
 		  IXGBE_EIMS_LSC);
 
 	IXGBE_WRITE_REG(hw, IXGBE_EIAC, mask);
-#endif
 }
 
 static int ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev,
diff --git a/examples/l3fwd-power/main.c b/examples/l3fwd-power/main.c
index 2f205ea..086f29b 100644
--- a/examples/l3fwd-power/main.c
+++ b/examples/l3fwd-power/main.c
@@ -239,9 +239,7 @@ static struct rte_eth_conf port_conf = {
 	},
 	.intr_conf = {
 		.lsc = 1,
-#ifdef RTE_NEXT_ABI
 		.rxq = 1,
-#endif
 	},
 };
 
diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index a969435..a49dcec 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -44,7 +44,7 @@ CFLAGS += $(WERROR_FLAGS) -O3
 
 EXPORT_MAP := rte_eal_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 # specific to linuxapp exec-env
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) := eal.c
diff --git a/lib/librte_eal/bsdapp/eal/include/exec-env/rte_interrupts.h b/lib/librte_eal/bsdapp/eal/include/exec-env/rte_interrupts.h
index bffa902..88d4ae1 100644
--- a/lib/librte_eal/bsdapp/eal/include/exec-env/rte_interrupts.h
+++ b/lib/librte_eal/bsdapp/eal/include/exec-env/rte_interrupts.h
@@ -50,11 +50,9 @@ struct rte_intr_handle {
 	int fd;                          /**< file descriptor */
 	int uio_cfg_fd;                  /**< UIO config file descriptor */
 	enum rte_intr_handle_type type;  /**< handle type */
-#ifdef RTE_NEXT_ABI
 	int max_intr;                    /**< max interrupt requested */
 	uint32_t nb_efd;                 /**< number of available efds */
 	int *intr_vec;                   /**< intr vector number array */
-#endif
 };
 
 /**
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index 376d275..d62196e 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -35,7 +35,7 @@ LIB = librte_eal.a
 
 EXPORT_MAP := rte_eal_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 VPATH += $(RTE_SDK)/lib/librte_eal/common
 
diff --git a/lib/librte_eal/linuxapp/eal/eal_interrupts.c b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
index 3f87875..66e1fe3 100644
--- a/lib/librte_eal/linuxapp/eal/eal_interrupts.c
+++ b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
@@ -290,26 +290,18 @@ vfio_enable_msix(struct rte_intr_handle *intr_handle) {
 
 	irq_set = (struct vfio_irq_set *) irq_set_buf;
 	irq_set->argsz = len;
-#ifdef RTE_NEXT_ABI
 	if (!intr_handle->max_intr)
 		intr_handle->max_intr = 1;
 	else if (intr_handle->max_intr > RTE_MAX_RXTX_INTR_VEC_ID)
 		intr_handle->max_intr = RTE_MAX_RXTX_INTR_VEC_ID + 1;
 
 	irq_set->count = intr_handle->max_intr;
-#else
-	irq_set->count = 1;
-#endif
 	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;
-#ifdef RTE_NEXT_ABI
 	memcpy(fd_ptr, intr_handle->efds, sizeof(intr_handle->efds));
 	fd_ptr[intr_handle->max_intr - 1] = intr_handle->fd;
-#else
-	fd_ptr[0] = intr_handle->fd;
-#endif
 
 	ret = ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, irq_set);
 
@@ -886,7 +878,6 @@ rte_eal_intr_init(void)
 	return -ret;
 }
 
-#ifdef RTE_NEXT_ABI
 static void
 eal_intr_proc_rxtx_intr(int fd, const struct rte_intr_handle *intr_handle)
 {
@@ -929,7 +920,6 @@ eal_intr_proc_rxtx_intr(int fd, const struct rte_intr_handle *intr_handle)
 		return;
 	} while (1);
 }
-#endif
 
 static int
 eal_epoll_process_event(struct epoll_event *evs, unsigned int n,
@@ -1068,7 +1058,6 @@ rte_epoll_ctl(int epfd, int op, int fd,
 	return 0;
 }
 
-#ifdef RTE_NEXT_ABI
 int
 rte_intr_rx_ctl(struct rte_intr_handle *intr_handle, int epfd,
 		int op, unsigned int vec, void *data)
@@ -1192,45 +1181,3 @@ rte_intr_allow_others(struct rte_intr_handle *intr_handle)
 {
 	return !!(intr_handle->max_intr - intr_handle->nb_efd);
 }
-
-#else
-int
-rte_intr_rx_ctl(struct rte_intr_handle *intr_handle,
-		int epfd, int op, unsigned int vec, void *data)
-{
-	RTE_SET_USED(intr_handle);
-	RTE_SET_USED(epfd);
-	RTE_SET_USED(op);
-	RTE_SET_USED(vec);
-	RTE_SET_USED(data);
-	return -ENOTSUP;
-}
-
-int
-rte_intr_efd_enable(struct rte_intr_handle *intr_handle, uint32_t nb_efd)
-{
-	RTE_SET_USED(intr_handle);
-	RTE_SET_USED(nb_efd);
-	return 0;
-}
-
-void
-rte_intr_efd_disable(struct rte_intr_handle *intr_handle)
-{
-	RTE_SET_USED(intr_handle);
-}
-
-int
-rte_intr_dp_is_en(struct rte_intr_handle *intr_handle)
-{
-	RTE_SET_USED(intr_handle);
-	return 0;
-}
-
-int
-rte_intr_allow_others(struct rte_intr_handle *intr_handle)
-{
-	RTE_SET_USED(intr_handle);
-	return 1;
-}
-#endif
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 b05f4c8..45071b7 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
@@ -86,14 +86,12 @@ struct rte_intr_handle {
 	};
 	int fd;	 /**< interrupt event file descriptor */
 	enum rte_intr_handle_type type;  /**< handle type */
-#ifdef RTE_NEXT_ABI
 	uint32_t max_intr;             /**< max interrupt requested */
 	uint32_t nb_efd;               /**< number of available efd(event fd) */
 	int efds[RTE_MAX_RXTX_INTR_VEC_ID];  /**< intr vectors/efds mapping */
 	struct rte_epoll_event elist[RTE_MAX_RXTX_INTR_VEC_ID];
 				       /**< intr vector epoll event */
 	int *intr_vec;                 /**< intr vector number array */
-#endif
 };
 
 #define RTE_EPOLL_PER_THREAD        -1  /**< to hint using per thread epfd */
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
index fc45a71..3e81a0e 100644
--- a/lib/librte_ether/Makefile
+++ b/lib/librte_ether/Makefile
@@ -41,7 +41,7 @@ CFLAGS += $(WERROR_FLAGS)
 
 EXPORT_MAP := rte_ether_version.map
 
-LIBABIVER := 1
+LIBABIVER := 2
 
 SRCS-y += rte_ethdev.c
 
diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 6b2400c..b309309 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -3033,7 +3033,6 @@ _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
 	rte_spinlock_unlock(&rte_eth_dev_cb_lock);
 }
 
-#ifdef RTE_NEXT_ABI
 int
 rte_eth_dev_rx_intr_ctl(uint8_t port_id, int epfd, int op, void *data)
 {
@@ -3139,45 +3138,6 @@ rte_eth_dev_rx_intr_disable(uint8_t port_id,
 	FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_intr_disable, -ENOTSUP);
 	return (*dev->dev_ops->rx_queue_intr_disable)(dev, queue_id);
 }
-#else
-int
-rte_eth_dev_rx_intr_enable(uint8_t port_id, uint16_t queue_id)
-{
-	RTE_SET_USED(port_id);
-	RTE_SET_USED(queue_id);
-	return -ENOTSUP;
-}
-
-int
-rte_eth_dev_rx_intr_disable(uint8_t port_id, uint16_t queue_id)
-{
-	RTE_SET_USED(port_id);
-	RTE_SET_USED(queue_id);
-	return -ENOTSUP;
-}
-
-int
-rte_eth_dev_rx_intr_ctl(uint8_t port_id, int epfd, int op, void *data)
-{
-	RTE_SET_USED(port_id);
-	RTE_SET_USED(epfd);
-	RTE_SET_USED(op);
-	RTE_SET_USED(data);
-	return -1;
-}
-
-int
-rte_eth_dev_rx_intr_ctl_q(uint8_t port_id, uint16_t queue_id,
-			  int epfd, int op, void *data)
-{
-	RTE_SET_USED(port_id);
-	RTE_SET_USED(queue_id);
-	RTE_SET_USED(epfd);
-	RTE_SET_USED(op);
-	RTE_SET_USED(data);
-	return -1;
-}
-#endif
 
 #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 544afe0..fa06554 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -845,10 +845,8 @@ struct rte_eth_fdir {
 struct rte_intr_conf {
 	/** enable/disable lsc interrupt. 0 (default) - disable, 1 enable */
 	uint16_t lsc;
-#ifdef RTE_NEXT_ABI
 	/** enable/disable rxq interrupt. 0 (default) - disable, 1 enable */
 	uint16_t rxq;
-#endif
 };
 
 /**
@@ -1392,12 +1390,10 @@ struct eth_dev_ops {
 	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 */
-#ifdef RTE_NEXT_ABI
 	/**< Enable Rx queue interrupt. */
 	eth_rx_enable_intr_t       rx_queue_intr_enable;
 	/**< Disable Rx queue interrupt.*/
 	eth_rx_disable_intr_t      rx_queue_intr_disable;
-#endif
 	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. */
-- 
2.5.1

^ permalink raw reply	[relevance 5%]

* [dpdk-dev] [PATCH v2] Move common functions in eal_thread.c
@ 2015-08-19 20:46  2% Ravi Kerur
  0 siblings, 0 replies; 200+ results
From: Ravi Kerur @ 2015-08-19 20:46 UTC (permalink / raw)
  To: dev

v2:
   > Remove un-needed header file eal_private.h from freeBSD
     eal_thread.c after code movement.

v1:
Changes include
   > Moving common functions in eal_thread.c in
     linuxapp and bsdapp into common/eal_common_thread.c file.
   > Rearrange eal_common_thread.c compilation in Makefile
     for ABI.

Compiled successfully for following targets
   > x86_64-native-linuxapp-clang
   > x86_64-native-linuxapp-gcc
   > x86_x32-native-linuxapp-gcc
   > i686-native-linuxapp-gcc
   > x86_64-native-bsdapp-clang
   > x86_64-native-bsdapp-gcc

Tested on
   > Ubuntu 14.04, testpmd functionality
   > FreeBSD 10.1, testpmd functionality

Signed-off-by: Ravi Kerur <rkerur@gmail.com>
---
 lib/librte_eal/bsdapp/eal/Makefile        |   3 +-
 lib/librte_eal/bsdapp/eal/eal_thread.c    | 153 ------------------------------
 lib/librte_eal/common/eal_common_thread.c | 147 +++++++++++++++++++++++++++-
 lib/librte_eal/linuxapp/eal/Makefile      |   3 +-
 lib/librte_eal/linuxapp/eal/eal_thread.c  | 153 ------------------------------
 5 files changed, 150 insertions(+), 309 deletions(-)

diff --git a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile
index a969435..93d76bb 100644
--- a/lib/librte_eal/bsdapp/eal/Makefile
+++ b/lib/librte_eal/bsdapp/eal/Makefile
@@ -51,6 +51,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) := eal.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_memory.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_hugepage_info.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_thread.c
+SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_thread.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_log.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_pci.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_debug.c
@@ -76,7 +77,6 @@ SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_hexdump.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_devargs.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_dev.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_options.c
-SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += eal_common_thread.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += rte_malloc.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += malloc_elem.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_BSDAPP) += malloc_heap.c
@@ -90,6 +90,7 @@ CFLAGS_eal_common_log.o := -D_GNU_SOURCE
 # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12603
 ifeq ($(CONFIG_RTE_TOOLCHAIN_GCC),y)
 CFLAGS_eal_thread.o += -Wno-return-type
+CFLAGS_eal_common_thread.o += -Wno-return-type
 CFLAGS_eal_hpet.o += -Wno-return-type
 endif
 
diff --git a/lib/librte_eal/bsdapp/eal/eal_thread.c b/lib/librte_eal/bsdapp/eal/eal_thread.c
index 9a03437..4036d21 100644
--- a/lib/librte_eal/bsdapp/eal/eal_thread.c
+++ b/lib/librte_eal/bsdapp/eal/eal_thread.c
@@ -35,163 +35,10 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdint.h>
-#include <unistd.h>
-#include <sched.h>
-#include <pthread_np.h>
-#include <sys/queue.h>
 #include <sys/thr.h>
 
-#include <rte_debug.h>
-#include <rte_atomic.h>
-#include <rte_launch.h>
-#include <rte_log.h>
-#include <rte_memory.h>
-#include <rte_memzone.h>
-#include <rte_per_lcore.h>
-#include <rte_eal.h>
-#include <rte_per_lcore.h>
-#include <rte_lcore.h>
-
-#include "eal_private.h"
 #include "eal_thread.h"
 
-RTE_DEFINE_PER_LCORE(unsigned, _lcore_id) = LCORE_ID_ANY;
-RTE_DEFINE_PER_LCORE(unsigned, _socket_id) = (unsigned)SOCKET_ID_ANY;
-RTE_DEFINE_PER_LCORE(rte_cpuset_t, _cpuset);
-
-/*
- * Send a message to a slave lcore identified by slave_id to call a
- * function f with argument arg. Once the execution is done, the
- * remote lcore switch in FINISHED state.
- */
-int
-rte_eal_remote_launch(int (*f)(void *), void *arg, unsigned slave_id)
-{
-	int n;
-	char c = 0;
-	int m2s = lcore_config[slave_id].pipe_master2slave[1];
-	int s2m = lcore_config[slave_id].pipe_slave2master[0];
-
-	if (lcore_config[slave_id].state != WAIT)
-		return -EBUSY;
-
-	lcore_config[slave_id].f = f;
-	lcore_config[slave_id].arg = arg;
-
-	/* send message */
-	n = 0;
-	while (n == 0 || (n < 0 && errno == EINTR))
-		n = write(m2s, &c, 1);
-	if (n < 0)
-		rte_panic("cannot write on configuration pipe\n");
-
-	/* wait ack */
-	do {
-		n = read(s2m, &c, 1);
-	} while (n < 0 && errno == EINTR);
-
-	if (n <= 0)
-		rte_panic("cannot read on configuration pipe\n");
-
-	return 0;
-}
-
-/* set affinity for current thread */
-static int
-eal_thread_set_affinity(void)
-{
-	unsigned lcore_id = rte_lcore_id();
-
-	/* acquire system unique id  */
-	rte_gettid();
-
-	/* update EAL thread core affinity */
-	return rte_thread_set_affinity(&lcore_config[lcore_id].cpuset);
-}
-
-void eal_thread_init_master(unsigned lcore_id)
-{
-	/* set the lcore ID in per-lcore memory area */
-	RTE_PER_LCORE(_lcore_id) = lcore_id;
-
-	/* set CPU affinity */
-	if (eal_thread_set_affinity() < 0)
-		rte_panic("cannot set affinity\n");
-}
-
-/* main loop of threads */
-__attribute__((noreturn)) void *
-eal_thread_loop(__attribute__((unused)) void *arg)
-{
-	char c;
-	int n, ret;
-	unsigned lcore_id;
-	pthread_t thread_id;
-	int m2s, s2m;
-	char cpuset[RTE_CPU_AFFINITY_STR_LEN];
-
-	thread_id = pthread_self();
-
-	/* retrieve our lcore_id from the configuration structure */
-	RTE_LCORE_FOREACH_SLAVE(lcore_id) {
-		if (thread_id == lcore_config[lcore_id].thread_id)
-			break;
-	}
-	if (lcore_id == RTE_MAX_LCORE)
-		rte_panic("cannot retrieve lcore id\n");
-
-	m2s = lcore_config[lcore_id].pipe_master2slave[0];
-	s2m = lcore_config[lcore_id].pipe_slave2master[1];
-
-	/* set the lcore ID in per-lcore memory area */
-	RTE_PER_LCORE(_lcore_id) = lcore_id;
-
-	/* set CPU affinity */
-	if (eal_thread_set_affinity() < 0)
-		rte_panic("cannot set affinity\n");
-
-	ret = eal_thread_dump_affinity(cpuset, RTE_CPU_AFFINITY_STR_LEN);
-
-	RTE_LOG(DEBUG, EAL, "lcore %u is ready (tid=%p;cpuset=[%s%s])\n",
-		lcore_id, thread_id, cpuset, ret == 0 ? "" : "...");
-
-	/* read on our pipe to get commands */
-	while (1) {
-		void *fct_arg;
-
-		/* wait command */
-		do {
-			n = read(m2s, &c, 1);
-		} while (n < 0 && errno == EINTR);
-
-		if (n <= 0)
-			rte_panic("cannot read on configuration pipe\n");
-
-		lcore_config[lcore_id].state = RUNNING;
-
-		/* send ack */
-		n = 0;
-		while (n == 0 || (n < 0 && errno == EINTR))
-			n = write(s2m, &c, 1);
-		if (n < 0)
-			rte_panic("cannot write on configuration pipe\n");
-
-		if (lcore_config[lcore_id].f == NULL)
-			rte_panic("NULL function pointer\n");
-
-		/* call the function and store the return value */
-		fct_arg = lcore_config[lcore_id].arg;
-		ret = lcore_config[lcore_id].f(fct_arg);
-		lcore_config[lcore_id].ret = ret;
-		rte_wmb();
-		lcore_config[lcore_id].state = FINISHED;
-	}
-
-	/* never reached */
-	/* pthread_exit(NULL); */
-	/* return NULL; */
-}
-
 /* require calling thread tid by gettid() */
 int rte_sys_gettid(void)
 {
diff --git a/lib/librte_eal/common/eal_common_thread.c b/lib/librte_eal/common/eal_common_thread.c
index 2405e93..5e55401 100644
--- a/lib/librte_eal/common/eal_common_thread.c
+++ b/lib/librte_eal/common/eal_common_thread.c
@@ -31,11 +31,12 @@
  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdint.h>
 #include <unistd.h>
-#include <pthread.h>
+#include <sys/queue.h>
 #include <sched.h>
 #include <assert.h>
 #include <string.h>
@@ -43,10 +44,21 @@
 #include <rte_lcore.h>
 #include <rte_memory.h>
 #include <rte_log.h>
+#include <rte_debug.h>
+#include <rte_atomic.h>
+#include <rte_launch.h>
+#include <rte_memzone.h>
+#include <rte_per_lcore.h>
+#include <rte_eal.h>
+#include <rte_per_lcore.h>
 
+#include "eal_private.h"
 #include "eal_thread.h"
 
 RTE_DECLARE_PER_LCORE(unsigned , _socket_id);
+RTE_DEFINE_PER_LCORE(unsigned, _lcore_id) = LCORE_ID_ANY;
+RTE_DEFINE_PER_LCORE(unsigned, _socket_id) = (unsigned)SOCKET_ID_ANY;
+RTE_DEFINE_PER_LCORE(rte_cpuset_t, _cpuset);
 
 unsigned rte_socket_id(void)
 {
@@ -155,3 +167,136 @@ exit:
 
 	return ret;
 }
+
+/*
+ * Send a message to a slave lcore identified by slave_id to call a
+ * function f with argument arg. Once the execution is done, the
+ * remote lcore switch in FINISHED state.
+ */
+int
+rte_eal_remote_launch(int (*f)(void *), void *arg, unsigned slave_id)
+{
+	int n;
+	char c = 0;
+	int m2s = lcore_config[slave_id].pipe_master2slave[1];
+	int s2m = lcore_config[slave_id].pipe_slave2master[0];
+
+	if (lcore_config[slave_id].state != WAIT)
+		return -EBUSY;
+
+	lcore_config[slave_id].f = f;
+	lcore_config[slave_id].arg = arg;
+
+	/* send message */
+	n = 0;
+	while (n == 0 || (n < 0 && errno == EINTR))
+		n = write(m2s, &c, 1);
+	if (n < 0)
+		rte_panic("cannot write on configuration pipe\n");
+
+	/* wait ack */
+	do {
+		n = read(s2m, &c, 1);
+	} while (n < 0 && errno == EINTR);
+
+	if (n <= 0)
+		rte_panic("cannot read on configuration pipe\n");
+
+	return 0;
+}
+
+/* set affinity for current EAL thread */
+static int
+eal_thread_set_affinity(void)
+{
+	unsigned lcore_id = rte_lcore_id();
+
+	/* acquire system unique id  */
+	rte_gettid();
+
+	/* update EAL thread core affinity */
+	return rte_thread_set_affinity(&lcore_config[lcore_id].cpuset);
+}
+
+void eal_thread_init_master(unsigned lcore_id)
+{
+	/* set the lcore ID in per-lcore memory area */
+	RTE_PER_LCORE(_lcore_id) = lcore_id;
+
+	/* set CPU affinity */
+	if (eal_thread_set_affinity() < 0)
+		rte_panic("cannot set affinity\n");
+}
+
+/* main loop of threads */
+__attribute__((noreturn)) void *
+eal_thread_loop(__attribute__((unused)) void *arg)
+{
+	char c;
+	int n, ret;
+	unsigned lcore_id;
+	pthread_t thread_id;
+	int m2s, s2m;
+	char cpuset[RTE_CPU_AFFINITY_STR_LEN];
+
+	thread_id = pthread_self();
+
+	/* retrieve our lcore_id from the configuration structure */
+	RTE_LCORE_FOREACH_SLAVE(lcore_id) {
+		if (thread_id == lcore_config[lcore_id].thread_id)
+			break;
+	}
+	if (lcore_id == RTE_MAX_LCORE)
+		rte_panic("cannot retrieve lcore id\n");
+
+	m2s = lcore_config[lcore_id].pipe_master2slave[0];
+	s2m = lcore_config[lcore_id].pipe_slave2master[1];
+
+	/* set the lcore ID in per-lcore memory area */
+	RTE_PER_LCORE(_lcore_id) = lcore_id;
+
+	/* set CPU affinity */
+	if (eal_thread_set_affinity() < 0)
+		rte_panic("cannot set affinity\n");
+
+	ret = eal_thread_dump_affinity(cpuset, RTE_CPU_AFFINITY_STR_LEN);
+
+	RTE_LOG(DEBUG, EAL, "lcore %u is ready (thread=%d;cpuset=[%s%s])\n",
+		lcore_id, rte_gettid(), cpuset, ret == 0 ? "" : "...");
+
+	/* read on our pipe to get commands */
+	while (1) {
+		void *fct_arg;
+
+		/* wait command */
+		do {
+			n = read(m2s, &c, 1);
+		} while (n < 0 && errno == EINTR);
+
+		if (n <= 0)
+			rte_panic("cannot read on configuration pipe\n");
+
+		lcore_config[lcore_id].state = RUNNING;
+
+		/* send ack */
+		n = 0;
+		while (n == 0 || (n < 0 && errno == EINTR))
+			n = write(s2m, &c, 1);
+		if (n < 0)
+			rte_panic("cannot write on configuration pipe\n");
+
+		if (lcore_config[lcore_id].f == NULL)
+			rte_panic("NULL function pointer\n");
+
+		/* call the function and store the return value */
+		fct_arg = lcore_config[lcore_id].arg;
+		ret = lcore_config[lcore_id].f(fct_arg);
+		lcore_config[lcore_id].ret = ret;
+		rte_wmb();
+		lcore_config[lcore_id].state = FINISHED;
+	}
+
+	/* never reached */
+	/* pthread_exit(NULL); */
+	/* return NULL; */
+}
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index 376d275..79beb90 100644
--- a/lib/librte_eal/linuxapp/eal/Makefile
+++ b/lib/librte_eal/linuxapp/eal/Makefile
@@ -55,6 +55,7 @@ ifeq ($(CONFIG_RTE_LIBRTE_XEN_DOM0),y)
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_xen_memory.c
 endif
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_thread.c
+SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_thread.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_log.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_pci.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_pci_uio.c
@@ -86,7 +87,6 @@ SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_hexdump.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_devargs.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_dev.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_options.c
-SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_thread.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += rte_malloc.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += malloc_elem.c
 SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += malloc_heap.c
@@ -110,6 +110,7 @@ CFLAGS_eal_common_lcore.o := -D_GNU_SOURCE
 # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12603
 ifeq ($(CONFIG_RTE_TOOLCHAIN_GCC),y)
 CFLAGS_eal_thread.o += -Wno-return-type
+CFLAGS_eal_common_thread.o += -Wno-return-type
 endif
 
 INC := rte_interrupts.h rte_kni_common.h rte_dom0_common.h
diff --git a/lib/librte_eal/linuxapp/eal/eal_thread.c b/lib/librte_eal/linuxapp/eal/eal_thread.c
index 18bd8e0..413ab0e 100644
--- a/lib/librte_eal/linuxapp/eal/eal_thread.c
+++ b/lib/librte_eal/linuxapp/eal/eal_thread.c
@@ -34,164 +34,11 @@
 #include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <stdint.h>
 #include <unistd.h>
-#include <pthread.h>
-#include <sched.h>
-#include <sys/queue.h>
 #include <sys/syscall.h>
 
-#include <rte_debug.h>
-#include <rte_atomic.h>
-#include <rte_launch.h>
-#include <rte_log.h>
-#include <rte_memory.h>
-#include <rte_memzone.h>
-#include <rte_per_lcore.h>
-#include <rte_eal.h>
-#include <rte_per_lcore.h>
-#include <rte_lcore.h>
-
-#include "eal_private.h"
 #include "eal_thread.h"
 
-RTE_DEFINE_PER_LCORE(unsigned, _lcore_id) = LCORE_ID_ANY;
-RTE_DEFINE_PER_LCORE(unsigned, _socket_id) = (unsigned)SOCKET_ID_ANY;
-RTE_DEFINE_PER_LCORE(rte_cpuset_t, _cpuset);
-
-/*
- * Send a message to a slave lcore identified by slave_id to call a
- * function f with argument arg. Once the execution is done, the
- * remote lcore switch in FINISHED state.
- */
-int
-rte_eal_remote_launch(int (*f)(void *), void *arg, unsigned slave_id)
-{
-	int n;
-	char c = 0;
-	int m2s = lcore_config[slave_id].pipe_master2slave[1];
-	int s2m = lcore_config[slave_id].pipe_slave2master[0];
-
-	if (lcore_config[slave_id].state != WAIT)
-		return -EBUSY;
-
-	lcore_config[slave_id].f = f;
-	lcore_config[slave_id].arg = arg;
-
-	/* send message */
-	n = 0;
-	while (n == 0 || (n < 0 && errno == EINTR))
-		n = write(m2s, &c, 1);
-	if (n < 0)
-		rte_panic("cannot write on configuration pipe\n");
-
-	/* wait ack */
-	do {
-		n = read(s2m, &c, 1);
-	} while (n < 0 && errno == EINTR);
-
-	if (n <= 0)
-		rte_panic("cannot read on configuration pipe\n");
-
-	return 0;
-}
-
-/* set affinity for current EAL thread */
-static int
-eal_thread_set_affinity(void)
-{
-	unsigned lcore_id = rte_lcore_id();
-
-	/* acquire system unique id  */
-	rte_gettid();
-
-	/* update EAL thread core affinity */
-	return rte_thread_set_affinity(&lcore_config[lcore_id].cpuset);
-}
-
-void eal_thread_init_master(unsigned lcore_id)
-{
-	/* set the lcore ID in per-lcore memory area */
-	RTE_PER_LCORE(_lcore_id) = lcore_id;
-
-	/* set CPU affinity */
-	if (eal_thread_set_affinity() < 0)
-		rte_panic("cannot set affinity\n");
-}
-
-/* main loop of threads */
-__attribute__((noreturn)) void *
-eal_thread_loop(__attribute__((unused)) void *arg)
-{
-	char c;
-	int n, ret;
-	unsigned lcore_id;
-	pthread_t thread_id;
-	int m2s, s2m;
-	char cpuset[RTE_CPU_AFFINITY_STR_LEN];
-
-	thread_id = pthread_self();
-
-	/* retrieve our lcore_id from the configuration structure */
-	RTE_LCORE_FOREACH_SLAVE(lcore_id) {
-		if (thread_id == lcore_config[lcore_id].thread_id)
-			break;
-	}
-	if (lcore_id == RTE_MAX_LCORE)
-		rte_panic("cannot retrieve lcore id\n");
-
-	m2s = lcore_config[lcore_id].pipe_master2slave[0];
-	s2m = lcore_config[lcore_id].pipe_slave2master[1];
-
-	/* set the lcore ID in per-lcore memory area */
-	RTE_PER_LCORE(_lcore_id) = lcore_id;
-
-	/* set CPU affinity */
-	if (eal_thread_set_affinity() < 0)
-		rte_panic("cannot set affinity\n");
-
-	ret = eal_thread_dump_affinity(cpuset, RTE_CPU_AFFINITY_STR_LEN);
-
-	RTE_LOG(DEBUG, EAL, "lcore %u is ready (tid=%x;cpuset=[%s%s])\n",
-		lcore_id, (int)thread_id, cpuset, ret == 0 ? "" : "...");
-
-	/* read on our pipe to get commands */
-	while (1) {
-		void *fct_arg;
-
-		/* wait command */
-		do {
-			n = read(m2s, &c, 1);
-		} while (n < 0 && errno == EINTR);
-
-		if (n <= 0)
-			rte_panic("cannot read on configuration pipe\n");
-
-		lcore_config[lcore_id].state = RUNNING;
-
-		/* send ack */
-		n = 0;
-		while (n == 0 || (n < 0 && errno == EINTR))
-			n = write(s2m, &c, 1);
-		if (n < 0)
-			rte_panic("cannot write on configuration pipe\n");
-
-		if (lcore_config[lcore_id].f == NULL)
-			rte_panic("NULL function pointer\n");
-
-		/* call the function and store the return value */
-		fct_arg = lcore_config[lcore_id].arg;
-		ret = lcore_config[lcore_id].f(fct_arg);
-		lcore_config[lcore_id].ret = ret;
-		rte_wmb();
-		lcore_config[lcore_id].state = FINISHED;
-	}
-
-	/* never reached */
-	/* pthread_exit(NULL); */
-	/* return NULL; */
-}
-
 /* require calling thread tid by gettid() */
 int rte_sys_gettid(void)
 {
-- 
1.9.1

^ permalink raw reply	[relevance 2%]

* Re: [dpdk-dev] [PATCH v6 4/9] ethdev: remove HW specific stats in stats structs
  2015-08-17 14:53  0%   ` Olivier MATZ
@ 2015-08-19 12:53  0%     ` Tahhan, Maryam
  0 siblings, 0 replies; 200+ results
From: Tahhan, Maryam @ 2015-08-19 12:53 UTC (permalink / raw)
  To: Olivier MATZ, dev

> From: Olivier MATZ [mailto:olivier.matz@6wind.com]
> Sent: Monday, August 17, 2015 3:54 PM
> To: Tahhan, Maryam; dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v6 4/9] ethdev: remove HW specific stats in
> stats structs
> 
> Hi Maryam,
> 
> On 07/15/2015 03:11 PM, Maryam Tahhan wrote:
> > Remove non generic stats in rte_stats_strings and mark the relevant
> > fields in struct rte_eth_stats as deprecated.
> >
> > Signed-off-by: Maryam Tahhan <maryam.tahhan@intel.com>
> > ---
> >  doc/guides/rel_notes/abi.rst  | 12 ++++++++++++
> > lib/librte_ether/rte_ethdev.c |  9 ---------
> > lib/librte_ether/rte_ethdev.h | 30 ++++++++++++++++++++----------
> >  3 files changed, 32 insertions(+), 19 deletions(-)
> >
> > diff --git a/doc/guides/rel_notes/abi.rst
> > b/doc/guides/rel_notes/abi.rst index 931e785..d5bf625 100644
> > --- a/doc/guides/rel_notes/abi.rst
> > +++ b/doc/guides/rel_notes/abi.rst
> > @@ -24,3 +24,15 @@ Deprecation Notices
> >
> >  * The Macros RTE_HASH_BUCKET_ENTRIES_MAX and
> RTE_HASH_KEY_LENGTH_MAX are
> >    deprecated and will be removed with version 2.2.
> > +
> > +* The following fields have been deprecated in rte_eth_stats:
> > +  * uint64_t imissed
> > +  * uint64_t ibadcrc
> > +  * uint64_t ibadlen
> > +  * uint64_t imcasts
> > +  * uint64_t fdirmatch
> > +  * uint64_t fdirmiss
> > +  * uint64_t tx_pause_xon
> > +  * uint64_t rx_pause_xon
> > +  * uint64_t tx_pause_xoff
> > +  * uint64_t rx_pause_xoff
> 
> Looking again at this patch, I'm wondering if "imissed" should be kept instead
> of beeing deprecated. I think it could be useful to differentiate ierrors from
> imissed, and it's not a hw-specific statistic. What do you think?
> 
> One more comment: it seems these fields are marked as deprecated but they
> are still used on other drivers (e1000, i40e, ...).
> 
> Regards,
> Olivier
> 


Hi Olivier
I can remove the deprecated status for imissed to leave the differentiation between errors and missed packets.
igb and i40e will be updated soon to reflect this. I marked them as deprecated to deter their use in the future. Older instances/use will need to be resolved.

Regards
Maryam
<snip>

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v6 4/9] ethdev: remove HW specific stats in stats structs
  2015-07-15 13:11  9% ` [dpdk-dev] [PATCH v6 4/9] ethdev: remove HW specific stats in stats structs Maryam Tahhan
@ 2015-08-17 14:53  0%   ` Olivier MATZ
  2015-08-19 12:53  0%     ` Tahhan, Maryam
  0 siblings, 1 reply; 200+ results
From: Olivier MATZ @ 2015-08-17 14:53 UTC (permalink / raw)
  To: Maryam Tahhan, dev

Hi Maryam,

On 07/15/2015 03:11 PM, Maryam Tahhan wrote:
> Remove non generic stats in rte_stats_strings and mark the relevant
> fields in struct rte_eth_stats as deprecated.
> 
> Signed-off-by: Maryam Tahhan <maryam.tahhan@intel.com>
> ---
>  doc/guides/rel_notes/abi.rst  | 12 ++++++++++++
>  lib/librte_ether/rte_ethdev.c |  9 ---------
>  lib/librte_ether/rte_ethdev.h | 30 ++++++++++++++++++++----------
>  3 files changed, 32 insertions(+), 19 deletions(-)
> 
> diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst
> index 931e785..d5bf625 100644
> --- a/doc/guides/rel_notes/abi.rst
> +++ b/doc/guides/rel_notes/abi.rst
> @@ -24,3 +24,15 @@ Deprecation Notices
>  
>  * The Macros RTE_HASH_BUCKET_ENTRIES_MAX and RTE_HASH_KEY_LENGTH_MAX are
>    deprecated and will be removed with version 2.2.
> +
> +* The following fields have been deprecated in rte_eth_stats:
> +  * uint64_t imissed
> +  * uint64_t ibadcrc
> +  * uint64_t ibadlen
> +  * uint64_t imcasts
> +  * uint64_t fdirmatch
> +  * uint64_t fdirmiss
> +  * uint64_t tx_pause_xon
> +  * uint64_t rx_pause_xon
> +  * uint64_t tx_pause_xoff
> +  * uint64_t rx_pause_xoff

Looking again at this patch, I'm wondering if "imissed" should
be kept instead of beeing deprecated. I think it could be useful to
differentiate ierrors from imissed, and it's not a hw-specific
statistic. What do you think?

One more comment: it seems these fields are marked as deprecated but
they are still used on other drivers (e1000, i40e, ...).

Regards,
Olivier


> diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
> index 7689328..c8f0e9a 100755
> --- a/lib/librte_ether/rte_ethdev.c
> +++ b/lib/librte_ether/rte_ethdev.c
> @@ -142,17 +142,8 @@ static const struct rte_eth_xstats_name_off rte_stats_strings[] = {
>  	{"rx_bytes", offsetof(struct rte_eth_stats, ibytes)},
>  	{"tx_bytes", offsetof(struct rte_eth_stats, obytes)},
>  	{"tx_errors", offsetof(struct rte_eth_stats, oerrors)},
> -	{"rx_missed_errors", offsetof(struct rte_eth_stats, imissed)},
> -	{"rx_crc_errors", offsetof(struct rte_eth_stats, ibadcrc)},
> -	{"rx_bad_length_errors", offsetof(struct rte_eth_stats, ibadlen)},
>  	{"rx_errors", offsetof(struct rte_eth_stats, ierrors)},
>  	{"alloc_rx_buff_failed", offsetof(struct rte_eth_stats, rx_nombuf)},
> -	{"fdir_match", offsetof(struct rte_eth_stats, fdirmatch)},
> -	{"fdir_miss", offsetof(struct rte_eth_stats, fdirmiss)},
> -	{"tx_flow_control_xon", offsetof(struct rte_eth_stats, tx_pause_xon)},
> -	{"rx_flow_control_xon", offsetof(struct rte_eth_stats, rx_pause_xon)},
> -	{"tx_flow_control_xoff", offsetof(struct rte_eth_stats, tx_pause_xoff)},
> -	{"rx_flow_control_xoff", offsetof(struct rte_eth_stats, rx_pause_xoff)},
>  };
>  #define RTE_NB_STATS (sizeof(rte_stats_strings) / sizeof(rte_stats_strings[0]))
>  
> diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
> index d76bbb3..a862027 100644
> --- a/lib/librte_ether/rte_ethdev.h
> +++ b/lib/librte_ether/rte_ethdev.h
> @@ -193,19 +193,29 @@ struct rte_eth_stats {
>  	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. */
> +	/**< Deprecated; Total of RX missed packets (e.g full FIFO). */
> +	uint64_t imissed;
> +	/**< Deprecated; Total of RX packets with CRC error. */
> +	uint64_t ibadcrc;
> +	/**< Deprecated; Total of RX packets with bad length. */
> +	uint64_t ibadlen;
>  	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 imcasts;
> +	/**< Deprecated; 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 fdirmatch;
> +	/**< Deprecated; Total number of RX packets matching a filter. */
> +	uint64_t fdirmiss;
> +	/**< Deprecated; Total number of RX packets not matching any filter. */
> +	uint64_t tx_pause_xon;
> +	 /**< Deprecated; Total nb. of XON pause frame sent. */
> +	uint64_t rx_pause_xon;
> +	/**< Deprecated; Total nb. of XON pause frame received. */
> +	uint64_t tx_pause_xoff;
> +	/**< Deprecated; Total nb. of XOFF pause frame sent. */
> +	uint64_t rx_pause_xoff;
> +	/**< Deprecated; 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];
> 

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH 2/2] doc: announce removal of LPM memory location
  2015-08-17 14:39  4% [dpdk-dev] [PATCH 1/2] doc: announce removal of jhash2 function Thomas Monjalon
@ 2015-08-17 14:39  4% ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-08-17 14:39 UTC (permalink / raw)
  To: John McNamara; +Cc: dev

This field is deprecated for a long time and should be removed.

Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
---
 doc/guides/rel_notes/deprecation.rst | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index bf0ac95..da17880 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -25,6 +25,9 @@ Deprecation Notices
 
 * The function rte_jhash2 is deprecated and should be removed.
 
+* The field mem_location of the rte_lpm structure is deprecated and should be
+  removed as well as the macros RTE_LPM_HEAP and RTE_LPM_MEMZONE.
+
 * Significant ABI changes are planned for struct rte_mbuf, struct rte_kni_mbuf,
   and several ``PKT_RX_`` flags will be removed, to support unified packet type
   from release 2.1. Those changes may be enabled in the upcoming release 2.1
-- 
2.4.2

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH 1/2] doc: announce removal of jhash2 function
@ 2015-08-17 14:39  4% Thomas Monjalon
  2015-08-17 14:39  4% ` [dpdk-dev] [PATCH 2/2] doc: announce removal of LPM memory location Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2015-08-17 14:39 UTC (permalink / raw)
  To: John McNamara; +Cc: dev

Fixes: 7530c9eea7d9 ("hash: rename a jhash function")

Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
---
 doc/guides/rel_notes/deprecation.rst | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 46a88ca..bf0ac95 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -23,6 +23,8 @@ Deprecation Notices
 * The Macros RTE_HASH_BUCKET_ENTRIES_MAX and RTE_HASH_KEY_LENGTH_MAX are
   deprecated and will be removed with version 2.2.
 
+* The function rte_jhash2 is deprecated and should be removed.
+
 * Significant ABI changes are planned for struct rte_mbuf, struct rte_kni_mbuf,
   and several ``PKT_RX_`` flags will be removed, to support unified packet type
   from release 2.1. Those changes may be enabled in the upcoming release 2.1
-- 
2.4.2

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH 3/3] doc: announce ring PMD functions removal
    2015-08-16 22:51  4%   ` [dpdk-dev] [PATCH 2/3] doc: announce removal of kni functions using port id Thomas Monjalon
@ 2015-08-16 22:51  4%   ` Thomas Monjalon
  1 sibling, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-08-16 22:51 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev

These functions are marked as deprecated for a long time:
	61934c0956d4 ("ring: convert to use of PMD_REGISTER_DRIVER and fix linking")
As suggested in this patch, it should be removed:
	http://dpdk.org/ml/archives/dev/2015-June/019253.html

Suggested-by: Stephen Hemminger <stephen@networkplumber.org>
Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
---
 doc/guides/rel_notes/deprecation.rst | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 2424c61..46a88ca 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -61,6 +61,9 @@ Deprecation Notices
 * librte_kni: Functions based on port id are deprecated for a long time and
   should be removed (rte_kni_create, rte_kni_get_port_id and rte_kni_info_get).
 
+* librte_pmd_ring: The deprecated functions rte_eth_ring_pair_create and
+  rte_eth_ring_pair_attach should be removed.
+
 * ABI changes are planned for struct virtio_net in order to support vhost-user
   multiple queues feature.
   It should be integrated in release 2.2 without backward compatibility.
-- 
2.4.2

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH 2/3] doc: announce removal of kni functions using port id
  @ 2015-08-16 22:51  4%   ` Thomas Monjalon
  2015-08-16 22:51  4%   ` [dpdk-dev] [PATCH 3/3] doc: announce ring PMD functions removal Thomas Monjalon
  1 sibling, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-08-16 22:51 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev

These functions are marked as deprecated for a long time:
	fbf895d44cfe ("kni: identify device by name")
As suggested in this patch, it should be removed:
	http://dpdk.org/ml/archives/dev/2015-June/019254.html

Suggested-by: Stephen Hemminger <stephen@networkplumber.org>
Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
---
 doc/guides/rel_notes/deprecation.rst | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index a9a12c6..2424c61 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -58,6 +58,9 @@ Deprecation Notices
   the tunnel type, TNI/VNI, inner MAC and inner VLAN are monitored.
   The release 2.2 will contain these changes without backwards compatibility.
 
+* librte_kni: Functions based on port id are deprecated for a long time and
+  should be removed (rte_kni_create, rte_kni_get_port_id and rte_kni_info_get).
+
 * ABI changes are planned for struct virtio_net in order to support vhost-user
   multiple queues feature.
   It should be integrated in release 2.2 without backward compatibility.
-- 
2.4.2

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for librte_pipeline
  2015-07-17 12:03  4% ` Singh, Jasvinder
@ 2015-08-15 21:49  4%   ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-08-15 21:49 UTC (permalink / raw)
  To: Dumitrescu, Cristian; +Cc: dev

> > Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
> 
> Acked-by: Jasvinder Singh <jasvinder.singh@intel.com>

Applied, thanks

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v2] announce ABI change for librte_table
  2015-07-23 11:05  4% ` Singh, Jasvinder
@ 2015-08-15 21:48  4%   ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-08-15 21:48 UTC (permalink / raw)
  To: Dumitrescu, Cristian; +Cc: dev

> > v2 changes:
> > -changed item on LPM table to add LPM IPv6 -removed item for ACL table
> > and replaced with item on table ops -added item for hash tables
> > 
> > Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
> > ---
> 
> Acked-by: Jasvinder Singh <jasvinder.singh@intel.com>

Applied, thanks

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for librte_cfgfile
  2015-07-16 12:49  4% ` Singh, Jasvinder
@ 2015-08-15  9:09  4%   ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-08-15  9:09 UTC (permalink / raw)
  To: Dumitrescu, Cristian; +Cc: dev

> > Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
> 
> Acked-by: Jasvinder Singh <jasvinder.singh@intel.com>

Applied, thanks

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for librte_sched
  2015-07-16 21:28  4% ` Neil Horman
@ 2015-08-15  8:58  4%   ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-08-15  8:58 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev

> > Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>

> > +* librte_sched (rte_sched.h): The scheduler hierarchy structure
> > +  (rte_sched_port_hierarchy) will change to allow for a larger number of subport
> > +  entries. The number of available traffic_classes and queues may also change.
> > +  The mbuf structure element for sched hierarchy will also change from a single
> > +  32 bit to a 64 bit structure.
> > +
> > +* librte_sched (rte_sched.h): The scheduler statistics structure will change
> > +  to allow keeping track of RED actions.
> ACK

Applied, thanks

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH] doc: updated release notes for r2.1
  @ 2015-08-13 11:04  5% ` John McNamara
  0 siblings, 0 replies; 200+ results
From: John McNamara @ 2015-08-13 11:04 UTC (permalink / raw)
  To: dev

Added release notes for the DPDK R2.1 release.

Signed-off-by: John McNamara <john.mcnamara@intel.com>
---
 doc/guides/rel_notes/release_2_1.rst | 980 ++++++++++++++++++++++++++++++++++-
 1 file changed, 970 insertions(+), 10 deletions(-)

diff --git a/doc/guides/rel_notes/release_2_1.rst b/doc/guides/rel_notes/release_2_1.rst
index c39418c..2bcc719 100644
--- a/doc/guides/rel_notes/release_2_1.rst
+++ b/doc/guides/rel_notes/release_2_1.rst
@@ -1,5 +1,5 @@
 ..  BSD LICENSE
-    Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+    Copyright(c) 2010-2015 Intel Corporation. All rights reserved.
     All rights reserved.
 
     Redistribution and use in source and binary forms, with or without
@@ -36,34 +36,994 @@ DPDK Release 2.1
 New Features
 ------------
 
-*   TODO.
+* **Enabled cloning of indirect mbufs.**
+
+  This feature removes a limitation of ``rte_pktmbuf_attach()`` which
+  generated the warning: "mbuf we're attaching to must be direct".
+
+  Now, when attaching to an indirect mbuf it is possible to:
+
+   * Copy all relevant fields (address, length, offload, ...) as before.
+
+   * Get the pointer to the mbuf that embeds the data buffer (direct mbuf),
+     and increase the reference counter.
+
+   When detaching the mbuf, we can now retrieve this direct mbuf as the
+   pointer is determined from the buffer address.
+
+
+* **Extended packet type support.**
+
+  In previous releases mbuf packet types were indicated by 6 bits in the
+  ``ol_flags``. This was not enough for some supported NICs. For example i40e
+  hardware can recognize more than 150 packet types. Not being able to
+  identify these additional packet types limits access to hardware offload
+  capabilities
+
+  So an extended "unified" packet type was added to support all possible
+  PMDs. The 16 bit packet_type in the mbuf structure was changed to 32 bits
+  and used for this purpose.
+
+  To avoid breaking ABI compatibility, the code changes this feature are
+  enclosed in a ``RTE_NEXT_ABI`` ifdef. This is enabled by default but can be
+  turned off for ABI compatibility with DPDK R2.0.
+
+
+* **Reworked memzone to be allocated by malloc and also support freeing.**
+
+  In the memory hierarchy, memsegs are groups of physically contiguous
+  hugepages, memzones are slices of memsegs, and malloc slices memzones
+  into smaller memory chunks.
+
+  This feature modifies ``malloc()`` so it partitions memsegs instead of
+  memzones. Now  memzones allocate their memory from the malloc heap.
+
+  Backward compatibility with API and ABI are maintained.
+
+  This also memzones, and any other structure based on memzones, for example
+  mempools, to be freed. Currently only the API from freeing memzones is
+  supported.
+
+
+* **Interrupt mode PMD.**
+
+  This feature introduces a low-latency one-shot RX interrupt into DPDK. It
+  also adds a polling and interrupt mode switch control example.
+
+  DPDK userspace interrupt notification and handling mechanism is based on
+  UIO/VFIO with the following limitations:
+
+  * Per queue RX interrupt events are only allowed in VFIO which supports
+    multiple MSI-X vectors.
+  * In UIO, the RX interrupt shares the same vector with other
+    interrupts. When the RX interrupt and LSC interrupt are both enabled, only
+    the former is available.
+  * RX interrupt is only implemented for the linuxapp target.
+  * The feature is only currently enabled for tow PMDs: ixgbe and igb.
+
+
+* **Packet Framework enhancements.**
+
+  Several enhancements were made to the Packet Framework:
+
+  * A new configuration file syntax has been introduced for IP pipeline
+    applications. Parsing of the configuration file is changed.
+  * Implementation of the IP pipeline application is modified to make it more
+    structured and user friendly.
+  * Implementation of the command line interface (CLI) for each pipeline type
+    has been moved to the separate compilation unit. Syntax of pipeline CLI
+    commands has been changed.
+  * Initialization of IP pipeline is modified to match the new parameters
+    structure.
+  * New implementation of pass-through pipeline, firewall pipeline, routing
+    pipeline, and flow classification has been added.
+  * Master pipeline with CLI interface has been added.
+  * Added extended documentation of the IP Pipeline.
+
+
+* **Added API for IEEE1588 timestamping.**
+
+  This feature adds an ethdev API to enable, disable and read IEEE1588/802.1AS
+  PTP timestamps from devices that support it. The following functions were
+  added:
+
+  * ``rte_eth_timesync_enable()``
+  * ``rte_eth_timesync_disable()``
+  * ``rte_eth_timesync_read_rx_timestamp()``
+  * ``rte_eth_timesync_read_tx_timestamp()``
+
+  The "ieee1588" forwarding mode in testpmd was also refactored to demonstrate
+  the new API.
+
+
+* **Added multicast address filtering.**
+
+  Added multicast address filtering via a new ethdev function
+  ``set_mc_addr_list()``.
+
+  This overcomes a limitation in previous releases where the receipt of
+  multicast packets on a given port could only be enabled by invoking the
+  ``rte_eth_allmulticast_enable()`` function. This method did not work for VFs
+  in SR-IOV architectures when the host PF driver does not allow these
+  operation on VFs. In such cases, joined multicast addresses had to be added
+  individually to the set of multicast addresses that are filtered by the [VF]
+  port.
+
+
+* **Added Flow Director extensions.**
+
+  Several Flow Director extensions were added such as:
+
+  * Support for RSS and Flow Director hashes in vector RX.
+  * Added Flow Director for L2 payload.
+
+
+* **Added RSS hash key size query per port.**
+
+  This feature supports querying the RSS hash key size of each port. A new
+  field ``hash_key_size`` has been added in the ``rte_eth_dev_info`` struct
+  for storing hash key size in bytes.
+
+
+* **Added userspace ethtool support.**
+
+  Added userspace ethtool support to provide a familiar interface for
+  applications that manage devices via kernel-space ``ethtool_op`` and
+  ``net_device_op``.
+
+  The initial implementation focuses on operations that can be implemented
+  through existing ``netdev`` APIs. More operations will be supported in later
+  releases.
+
+
+* **Updated the ixgbe base driver.**
+
+  The ixgbe base driver was updated with several changes including the
+  following:
+
+  * Added a new 82599 device id.
+  * Added new X550 PHY ids.
+  * Added SFP+ dual-speed support.
+  * Added wait helper for X550 IOSF accesses.
+  * Added X550em features.
+  * Added X557 PHY LEDs support.
+  * Commands for flow director.
+  * Issue firmware command when resetting X550em.
+
+  See the git log for full details of the ixgbe/base changes.
+
+
+* **Added additional hotplug support.**
+
+  Port hotplug support was added to the following PMDs:
+
+  * e1000/igb.
+  * ixgbe.
+  * i40e.
+  * fm10k.
+  * Ring.
+  * Bonding.
+  * Virtio.
+
+  Port hotplug support was added to BSD.
+
+
+* **Added ixgbe LRO support.**
+
+  Added LRO support for x540 and 82599 devices.
+
+
+* **Added extended statistics for ixgbe.**
+
+  Implemented ``xstats_get()`` and ``xstats_reset()`` in dev_ops for
+  ixgbe to expose detailed error statistics to DPDK applications.
+
+  These will be implemented for other PMDs in later releases.
+
+
+* **Added proc_info application.**
+
+  Created a new ``proc_info`` application, by refactoring the existing
+  ``dump_cfg`` application, to demonstrate the usage of retrieving statistics,
+  and the new extended statistics (see above), for DPDK interfaces.
+
+
+* **Updated the i40e base driver.**
+
+  The i40e base driver was updated with several changes including the
+  following:
+
+  *  Support for building both PF and VF driver together.
+  *  Support for CEE DCBX on recent firmware versions.
+  *  Replacement of ``i40e_debug_read_register()``.
+  *  Rework of ``i40e_hmc_get_object_va``.
+  *  Update of shadow RAM read/write functions.
+  *  Enhancement of polling NVM semaphore.
+  *  Enhancements on adminq init and sending asq command.
+  *  Update of get/set LED functions.
+  *  Addition of AOC phy types to case statement in get_media_type.
+  *  Support for iSCSI capability.
+  *  Setting of FLAG_RD when sending driver version to FW.
+
+  See the git log for full details of the i40e/base changes.
+
+
+* **Added support for port mirroring in i40e.**
+
+  Enabled mirror functionality in the i40e driver.
+
+
+* **Added support for i40e double VLAN, QinQ, stripping and insertion.**
+
+  Added support to the i40e driver for offloading double VLAN (QinQ) tags to
+  the mbuf header, and inserting double vlan tags by hardware to the packets
+  to be transmitted.  Added a new field ``vlan_tci_outer`` in the ``rte_mbuf``
+  struct, and new flags in ``ol_flags`` to support this feature.
+
+
+
+* **Added fm10k promiscuous mode support.**
+
+  Added support for promiscuous/allmulticast enable and disable in the fm10k PF
+  function. VF is not supported yet.
+
+
+* **Added fm10k jumbo frame support.**
+
+  Added support for jumbo frame less than 15K in both VF and PF functions in the
+  fm10k pmd.
+
+
+* **Added fm10k mac vlan filtering support.**
+
+  Added support for the fm10k MAC filter, only available in PF. Updated the
+  VLAN filter to add/delete one static entry in the MAC table for each
+  combination of VLAN and MAC address.
+
+
+* **Added support for the Broadcom bnx2x driver.**
+
+  Added support for the Broadcom NetXtreme II bnx2x driver.
+
+
+* **Added support for the Chelsio CXGBE driver.**
+
+  Added support for the CXGBE Poll Mode Driver for the Chelsio Terminator 5
+  series of 10G/40G adapters.
+
+
+* **Enabled VMXNET3 vlan filtering.**
+
+  Added support for the VLAN filter functionality of the VMXNET3 interface.
+
+
+* **Added support for vhost live migration.**
+
+  Added support to allow live migration of vhost. Without this feature, qemu
+  will report the following error: "migrate: Migration disabled: vhost lacks
+  VHOST_F_LOG_ALL feature".
+
+
+* **Added support for pcap jumbo frames.**
+
+  Extended the PCAP PMD to support jumbo frames for RX and TX.
+
+
+* **Added support for the TILE-Gx architecture.**
+
+  Added support for the EZchip TILE-Gx family of SoCs.
+
+
+* **Added hardware memory transactions/lock elision for x86.**
+
+  Added the use of hardware memory transactions (HTM) on fast-path for rwlock
+  and spinlock (a.k.a. lock elision). The methods are implemented for x86
+  using Restricted Transactional Memory instructions (Intel(r) Transactional
+  Synchronization Extensions). The implementation fall-backs to the normal
+  rwlock if HTM is not available or memory transactions fail. This is not a
+  replacement for all rwlock usages since not all critical sections protected
+  by locks are friendly to HTM. For example, an attempt to perform a HW I/O
+  operation inside a hardware memory transaction always aborts the transaction
+  since the CPU is not able to roll-back should the transaction
+  fail. Therefore, hardware transactional locks are not advised to be used
+  around ``rte_eth_rx_burst()`` and ``rte_eth_tx_burst()`` calls.
+
+
+* **Updated Jenkins Hash function**
+
+  Updated the version of the Jenkins Hash (jhash) function used in DPDK from
+  the 1996 version to the 2006 version. This gives up to 35% better
+  performance, compared to the original one.
+
+  Note, the hashes generated by the updated version differ from the hashes
+  generated by the previous version.
+
+
+* **Added software implementation of the Toeplitz RSS hash**
+
+  Added a software implementation of the Toeplitz hash function used by RSS. It
+  can be used either for packet distribution on a single queue NIC or for
+  simulating RSS computation on a specific NIC (for example after GRE header
+  de-encapsulation).
+
+
+* **Replaced the existing hash library with a Cuckoo hash implementation.**
+
+  Replaced the existing hash library with another approach, using the Cuckoo
+  Hash method to resolve collisions (open addressing). This method pushes
+  items from a full bucket when a new entry must be added to it, storing the
+  evicted entry in an alternative location, using a secondary hash function.
+
+  This gives the user the ability to store more entries when a bucket is full,
+  in comparison with the previous implementation.
+
+  The API has not been changed, although new fields have been added in the
+  ``rte_hash`` structure, which has been changed to internal use only.
+
+  The main change when creating a new table is that the number of entries per
+  bucket is now fixed, so its parameter is ignored now (it is still there to
+  maintain the same parameters structure).
+
+  Also, the maximum burst size in lookup_burst function hash been increased to
+  64, to improve performance.
+
+
+* **Optimized KNI RX burst size computation.**
+
+  Optimized KNI RX burst size computation by avoiding checking how many
+  entries are in ``kni->rx_q`` prior to actually pulling them from the fifo.
+
+
+* **Added KNI multicast.**
+
+  Enabled adding multicast addresses to KNI interfaces by adding an empty
+  callback for ``set_rx_mode`` (typically used for setting up hardware) so
+  that the ioctl succeeds. This is the same thing as the Linux tap interface
+  does.
+
+
+* **Added cmdline polling mode.**
+
+  Added the ability to process console input in the same thread as packet
+  processing by using the ``poll()`` function.
+
+* **Added VXLAN Tunnel End point sample application.**
+
+  Added a Tunnel End point (TEP) sample application that simulates a VXLAN
+  Tunnel Endpoint (VTEP) termination in DPDK. It is used to demonstrate the
+  offload and filtering capabilities of Intel XL710 10/40 GbE NICsfor VXLAN
+  packets.
+
+
+* **Enabled combining of the ``-m`` and ``--no-huge`` EAL options.**
+
+  Added option to allow combining of the ``-m`` and ``--no-huge`` EAL command
+  line options.
+
+  This allows user application to run as non-root but with higher memory
+  allocations, and removes a constraint on ``--no-huge`` mode being limited to
+  64M.
+
 
 
 Resolved Issues
 ---------------
 
-*   TODO.
+* **acl: Fix ambiguity between test rules.**
+
+  Some test rules had equal priority for the same category. That could cause
+  an ambiguity in building the trie and test results.
+
+
+* **acl: Fix invalid rule wildness calculation for bitmask field type.**
+
+
+* **acl: Fix matching rule.**
+
+
+* **acl: Fix unneeded trie splitting for subset of rules.**
+
+  When rebuilding a trie for limited rule-set, don't try to split the rule-set
+  even further.
+
+
+* **app/testpmd: Fix crash when port id out of bound.**
+
+  Fixed issues in testpmd where using a port greater than 32 would cause a seg
+  fault.
+
+  Fixes: edab33b1c01d ("app/testpmd: support port hotplug")
+
+
+* **app/testpmd: Fix reply to a multicast ICMP request.**
+
+  Set the IP source and destination addresses in the IP header of the ICMP
+  reply.
+
+
+* **app/testpmd: fix MAC address in ARP reply.**
+
+  Fixed issue where in the ``icmpecho`` forwarding mode, ARP replies from
+  testpmd contain invalid zero-filled MAC addresses.
+
+  Fixes: 31db4d38de72 ("net: change arp header struct declaration")
+
+
+* **app/testpmd: fix default flow control values.**
+
+  Fixes: 422a20a4e62d ("app/testpmd: fix uninitialized flow control variables")
+
+
+* **bonding: Fix crash when stopping inactive slave.**
+
+
+* **bonding: Fix device initialization error handling.**
+
+
+* **bonding: Fix initial link status of slave.**
+
+  On Fortville NIC, link status change interrupt callback was not executed
+  when slave in bonding was (re-)started.
+
+
+* **bonding: Fix socket id for LACP slave.**
+
+  Fixes: 46fb43683679 ("bond: add mode 4")
+
+
+* **bonding: Fix device initialization error handling.**
+
+
+* **cmdline: Fix small memory leak.**
+
+  A function in ``cmdline.c`` had a return that did not free the buf properly.
+
+
+* **config: Enable same drivers options for Linux and BSD.**
+
+  Enabled vector ixgbe and i40e bulk alloc for BSD as it is already done for
+  Linux.
+
+  Fixes: 304caba12643 ("config: fix bsd options")
+  Fixes: 0ff3324da2eb ("ixgbe: rework vector pmd following mbuf changes")
+
+
+* **devargs: Fix crash on failure.**
+
+  This problem occurred when passing an invalid PCI id to the blacklist API in
+  devargs.
+
+
+* **e1000/i40e: Fix descriptor done flag with odd address.**
+
+
+* **e1000/igb: fix ieee1588 timestamping initialization.**
+
+  Fixed issue with e1000 ieee1588 timestamp initialization. On initialization
+  the IEEE1588 functions read the system time to set their timestamp. However,
+  on some 1G NICs, for example, i350, system time is disabled by default and
+  the IEEE1588 timestamp was always 0.
+
+
+* **eal/Linux: Fix irq handling with igb_uio.**
+
+  Fixed an issue where the the introduction of ``uio_pci_generic`` broke
+  interrupt handling with igb_uio.
+
+  Fixes: c112df6875a5 ("eal/Linux: toggle interrupt for uio_pci_generic")
+
+
+* **eal/bsd: Fix inappropriate header guards.**
+
+
+* **eal/bsd: Fix virtio on FreeBSD.**
+
+  Closing the ``/dev/io`` fd caused a SIGBUS in inb/outb instructions as the
+  process lost the IOPL privileges once the fd is closed.
+
+  Fixes: 8a312224bcde ("eal/bsd: fix fd leak")
+
+
+* **eal/linux: Fix comments on vfio MSI.**
+
+
+* **eal/linux: Fix numa node detection.**
+
+
+* **eal/linux: Fix socket value for undetermined numa node.**
+
+  Sets zero as the default value of pci device numa_node if the socket could
+  not be determined. This provides the same default value as FreeBSD which has
+  no NUMA support, and makes the return value of ``rte_eth_dev_socket_id()``
+  be consistent with the API description.
+
+
+* **eal/ppc: Fix cpu cycle count for little endian.**
+
+  On IBM POWER8 PPC64 little endian architecture, the definition of tsc union
+  will be different. This fix enables the right output from ``rte_rdtsc()``.
+
+
+* **ethdev: Fix check of threshold for TX freeing.**
+
+  Fixed issue where the parameter to ``tx_free_thresh`` was not consistent
+  between the drivers.
+
+
+* **ethdev: Fix crash if malloc of user callback fails.**
+
+  If ``rte_zmalloc()`` failed in ``rte_eth_dev_callback_register`` then the
+  NULL pointer would be dereferenced.
+
+
+* **ethdev: Fix illegal port access.**
+
+  To obtain a detachable flag, ``pci_drv`` is accessed in
+  ``rte_eth_dev_is_detachable()``. However ``pci_drv`` is only valid if port
+  is enabled. Fixed by checking ``rte_eth_dev_is_valid_port()`` first.
+
+
+* **ethdev: Make tables const.**
+
+
+* **ethdev: Rename and extend the mirror type.**
+
+
+* **examples/distributor: Fix debug macro.**
+
+  The macro to turn on additional debug output when the app was compiled with
+  ``-DDEBUG`` was broken.
+
+  Fixes: 07db4a975094 ("examples/distributor: new sample app")
+
+
+* **examples/kni: Fix crash on exit.**
+
+
+* **examples/vhost: Fix build with debug enabled.**
+
+  Fixes: 72ec8d77ac68 ("examples/vhost: rework duplicated code")
+
+
+* **fm10k: Fix RETA table initialization.**
+
+  The fm10k driver has 128 RETA entries in 32 registers, but it only
+  initialized the first 32 when doing multiple RX queue configurations. This
+  fix initializes all 128 entries.
+
+
+* **fm10k: Fix RX buffer size.**
+
+
+* **fm10k: Fix TX multi-segment frame.**
+
+
+* **fm10k: Fix TX queue cleaning after start error.**
+
+
+* **fm10k: Fix Tx queue cleaning after start error.**
+
+
+* **fm10k: Fix default mac/vlan in switch.**
+
+
+* **fm10k: Fix interrupt fault handling.**
+
+
+* **fm10k: Fix jumbo frame issue.**
+
+
+* **fm10k: Fix mac/vlan filtering.**
+
+
+* **fm10k: Fix maximum VF number.**
+
+
+* **fm10k: Fix maximum queue number for VF.**
+
+  Both PF and VF shared code in function ``fm10k_stats_get()``. The function
+  worked with PF, but had problems with VF since it has less queues than PF.
+
+  Fixes: a6061d9e7075 ("fm10k: register PF driver")
+
+
+* **fm10k: Fix queue disabling.**
+
+
+* **fm10k: Fix switch synchronization.**
+
+
+* **i40e/base: Fix error handling of NVM state update.**
+
+
+* **i40e/base: Fix hardware port number for pass-through.**
+
+
+* **i40e/base: Rework virtual address retrieval for lan queue.**
+
+
+* **i40e/base: Update LED blinking.**
+
+
+* **i40e/base: Workaround for PHY type with firmware < 4.4.**
+
+
+* **i40e: Disable setting of PHY configuration.**
+
+
+* **i40e: Fix SCTP flow director.**
+
+
+* **i40e: Fix check of descriptor done flag.**
+
+  Fixes: 4861cde46116 ("i40e: new poll mode driver")
+  Fixes: 05999aab4ca6 ("i40e: add or delete flow director")
+
+
+* **i40e: Fix condition to get VMDQ info.**
+
+
+* **i40e: Fix registers access from big endian CPU.**
+
+
+* **i40evf: Clear command when error occurs.**
+
+
+* **i40evf: Fix RSS with less RX queues than TX queues.**
+
+
+* **i40evf: Fix crash when setup TX queues.**
+
+
+* **i40evf: Fix jumbo frame support.**
+
+
+* **i40evf: Fix offload capability flags.**
+
+  Added checksum offload capability flags which have already been supported
+  for a long time.
+
+
+* **ivshmem: Fix crash in corner case.**
+
+  Fixed issues where depending on the configured segments it was possible to
+  hit a segmentation fault as a result of decrementing an unsigned index with
+  value 0.
+
+
+  Fixes: 40b966a211ab ("ivshmem: library changes for mmaping using ivshmem")
+
+
+* **ixgbe/base: Fix SFP probing.**
+
+
+* **ixgbe/base: Fix TX pending clearing.**
+
+
+* **ixgbe/base: Fix X550 CS4227 address.**
+
+
+* **ixgbe/base: Fix X550 PCIe master disabling.**
+
+
+* **ixgbe/base: Fix X550 check.**
+
+
+* **ixgbe/base: Fix X550 init early return.**
+
+
+* **ixgbe/base: Fix X550 link speed.**
+
+
+* **ixgbe/base: Fix X550em CS4227 speed mode.**
+
+
+* **ixgbe/base: Fix X550em SFP+ link stability.**
+
+
+* **ixgbe/base: Fix X550em UniPHY link configuration.**
+
+
+* **ixgbe/base: Fix X550em flow control for KR backplane.**
+
+
+* **ixgbe/base: Fix X550em flow control to be KR only.**
+
+
+* **ixgbe/base: Fix X550em link setup without SFP.**
+
+
+* **ixgbe/base: Fix X550em mux after MAC reset.**
+
+  Fixes: d2e72774e58c ("ixgbe/base: support X550")
+
+
+* **ixgbe/base: Fix bus type overwrite.**
+
+
+* **ixgbe/base: Fix init handling of X550em link down.**
+
+
+* **ixgbe/base: Fix lan id before first i2c access.**
+
+
+* **ixgbe/base: Fix mac type checks.**
+
+
+* **ixgbe/base: Fix tunneled UDP and TCP frames in flow director.**
+
+
+* **ixgbe: Check mbuf refcnt when clearing a ring.**
+
+  The function to clear the TX ring when a port was being closed, e.g. on exit
+  in testpmd, was not checking the mbuf refcnt before freeing it. Since the
+  function in the vector driver to clear the ring after TX does not setting
+  the pointer to NULL post-free, this caused crashes if mbuf debugging was
+  turned on.
+
+
+* **ixgbe: Fix RX with buffer address not word aligned.**
+
+  Niantic HW expects the Header Buffer Address in the RXD must be word
+  aligned.
+
+
+* **ixgbe: Fix RX with buffer address not word aligned.**
+
+
+* **ixgbe: Fix Rx queue reset.**
+
+  Fix to reset vector related RX queue fields to their initial values.
+
+  Fixes: c95584dc2b18 ("ixgbe: new vectorized functions for Rx/Tx")
+
+
+* **ixgbe: Fix TSO in IPv6.**
+
+  When TSO was used with IPv6, the generated frames were incorrect. The L4
+  frame was OK, but the length field of IPv6 header was not populated
+  correctly.
+
+
+* **ixgbe: Fix X550 flow director check.**
+
+
+* **ixgbe: Fix check for split packets.**
+
+  The check for split packets to be reassembled in the vector ixgbe PMD was
+  incorrectly only checking the first 16 elements of the array instead of
+  all 32.
+
+  Fixes: cf4b4708a88a ("ixgbe: improve slow-path perf with vector scattered Rx")
+
+
+* **ixgbe: Fix data access on big endian cpu.**
+
+
+* **ixgbe: Fix flow director flexbytes offset.**
+
+
+  Fixes: d54a9888267c ("ixgbe: support flexpayload configuration of flow director")
+
+
+* **ixgbe: Fix number of segments with vector scattered Rx.**
+
+  Fixes: cf4b4708a88a (ixgbe: improve slow-path perf with vector scattered Rx)
+
+
+* **ixgbe: Fix offload config option name.**
+
+  The RX_OLFLAGS option was renamed from DISABLE to ENABLE in the driver code
+  and Linux config. It is now renamed also in the BSD config and
+  documentation.
+
+  Fixes: 359f106a69a9 ("ixgbe: prefer enabling olflags rather than not disabling")
+
+
+* **ixgbe: Fix release queue mbufs.**
+
+  The calculations of what mbufs were valid in the RX and TX queues were
+  incorrect when freeing the mbufs for the vector PMD. This led to crashes due
+  to invalid reference counts when mbuf debugging was turned on, and possibly
+  other more subtle problems (such as mbufs being freed when in use) in other
+  cases.
+
+
+  Fixes: c95584dc2b18 ("ixgbe: new vectorized functions for Rx/Tx")
+
+
+* **ixgbe: Move PMD specific fields out of base driver.**
+
+  Move ``rx_bulk_alloc_allowed`` and ``rx_vec_allowed`` from ``ixgbe_hw`` to
+  ``ixgbe_adapter``.
+
+  Fixes: 01fa1d6215fa ("ixgbe: unify Rx setup")
+
+
+* **ixgbe: Rename TX queue release function.**
+
+
+* **ixgbevf: Fix RX function selection.**
+
+  The logic to select ixgbe the VF RX function is different than the PF.
+
+
+* **ixgbevf: Fix link status for PF up/down events.**
+
+
+* **kni: Fix RX loop limit.**
+
+  Loop processing packets dequeued from rx_q was using the number of packets
+  requested, not how many it actually received.
+
+
+* **kni: Fix ioctl in containers, like Docker.**
+
+
+* **kni: Fix multicast ioctl handling.**
+
+
+* **log: Fix crash after log_history dump.**
+
+
+* **lpm: Fix big endian support.**
+
+
+* **lpm: Fix depth small entry add.**
+
+
+* **mbuf: Fix cloning with private mbuf data.**
+
+  Added a new ``priv_size`` field in mbuf structure that should be initialized
+  at mbuf pool creation. This field contains the size of the application
+  private data in mbufs.
+
+  Introduced new static inline functions ``rte_mbuf_from_indirect()`` and
+  ``rte_mbuf_to_baddr()`` to replace the existing macros, which take the
+  private size into account when attaching and detaching mbufs.
+
+
+* **mbuf: Fix data room size calculation in pool init.**
+
+  Deduct the mbuf data room size from ``mempool->elt_size`` and ``priv_size``,
+  instead of using an hardcoded value that is not related to the real buffer
+  size.
+
+  To use ``rte_pktmbuf_pool_init()``, the user can either:
+
+  * Give a NULL parameter to rte_pktmbuf_pool_init(): in this case, the
+    private size is assumed to be 0, and the room size is ``mp->elt_size`` -
+    ``sizeof(struct rte_mbuf)``.
+  * Give the ``rte_pktmbuf_pool_private`` filled with appropriate
+    data_room_size and priv_size values.
+
+
+* **mbuf: Fix init when private size is not zero.**
+
+  Allow the user to use the default ``rte_pktmbuf_init()`` function even if
+  the mbuf private size is not 0.
+
+
+* **mempool: Add structure for object headers.**
+
+  Each object stored in mempools are prefixed by a header, allowing for
+  instance to retrieve the mempool pointer from the object. When debug is
+  enabled, a cookie is also added in this header that helps to detect
+  corruptions and double-frees.
+
+  Introduced a structure that materializes the content of this header,
+  and will simplify future patches adding things in this header.
+
+
+* **mempool: Fix pages computation to determine number of objects.**
+
+
+* **mempool: Fix returned value after counting objects.**
+
+  Fixes: 148f963fb532 ("xen: core library changes")
+
+
+* **mlx4: Avoid requesting TX completion events to improve performance.**
+
+  Instead of requesting a completion event for each TX burst, request it on a
+  fixed schedule once every MLX4_PMD_TX_PER_COMP_REQ (currently 64) packets to
+  improve performance.
+
+
+* **mlx4: Fix possible crash on scattered mbuf allocation failure.**
+
+  Fixes issue where failing to allocate a segment, ``mlx4_rx_burst_sp()``
+  could call ``rte_pktmbuf_free()`` on an incomplete scattered mbuf whose next
+  pointer in the last segment is not set.
+
+
+* **mlx4: Fix support for multiple vlan filters.**
+
+  This fixes the "Multiple RX VLAN filters can be configured, but only the
+  first one works" bug.
+
+
+* **pcap: Fix storage of name and type in queues.**
+
+  pcap_rx_queue/pcap_tx_queue should store it's own copy of name/type values,
+  not the pointer to temporary allocated space.
+
+
+* **pci: Fix memory leaks and needless increment of map address.**
+
+
+* **pci: Fix uio mapping differences between linux and bsd.**
+
+
+* **port: Fix unaligned access to metadata.**
+
+  Fix RTE_MBUF_METADATA macros to allow for unaligned accesses to meta-data
+  fields.
+
+
+* **ring: Fix return of new port id on creation.**
+
+
+* **timer: Fix race condition.**
+
+  Eliminate problematic race condition in ``rte_timer_manage()`` that can lead
+  to corruption of per-lcore pending-lists (implemented as skip-lists).
+
+
+* **vfio: Fix overflow of BAR region offset and size.**
+
+  Fixes: 90a1633b2347 ("eal/Linux: allow to map BARs with MSI-X tables")
+
+
+* **vhost: Fix enqueue/dequeue to handle chained vring descriptors.**
+
+
+* **vhost: Fix race for connection fd.**
+
+
+* **vhost: Fix virtio freeze due to missed interrupt.**
+
+
+* **virtio: Fix crash if CQ is not negotiated.**
+
+  Fix NULL dereference if virtio control queue is not negotiated.
+
+
+* **virtio: Fix ring size negotiation.**
+
+  Negotiate the virtio ring size. The host may allow for very large rings but
+  application may only want a smaller ring. Conversely, if the number of
+  descriptors requested exceeds the virtio host queue size, then just silently
+  use the smaller host size.
+
+  This fixes issues with virtio in non-QEMU environments. For example Google
+  Compute Engine allows up to 16K elements in ring.
+
+
+* **vmxnet3: Fix link state handling.**
 
 
 Known Issues
 ------------
 
-*   TODO.
+* When running the ``vmdq`` sample or ``vhost`` sample applications with the
+  Intel(R) XL710 (i40e) NIC, the configuration option
+  ``CONFIG_RTE_MAX_QUEUES_PER_PORT`` should be increased from 256 to 1024.
 
 
-API Changes
------------
-
-*   TODO.
+* VM power manager may not work on systems with more than 64 cores.
 
 
 API Changes
 -----------
 
-*   TODO.
+* The order that user supplied RX and TX callbacks are called in has been
+  changed to the order that they were added (fifo) in line with end-user
+  expectations. The previous calling order was the reverse of this (lifo) and
+  was counter intuitive for users. The actual API is unchanged.
 
 
 ABI Changes
 -----------
 
-*   TODO.
+* The ``rte_hash`` structure has been changed to internal use only.
-- 
1.8.1.4

^ permalink raw reply	[relevance 5%]

* Re: [dpdk-dev] [PATCH] abi: Announce abi changes plan for vhost-user multiple queues
  @ 2015-08-12 14:57  5% ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-08-12 14:57 UTC (permalink / raw)
  To: Ouyang Changchun; +Cc: dev

> It announces the planned ABI changes for vhost-user multiple queues feature on v2.2.
> 
> Signed-off-by: Changchun Ouyang <changchun.ouyang@intel.com>
> ---
> +* The ABI changes are planned for struct virtio_net in order to support vhost-user multiple queues feature. The upcoming release 2.1 will not contain these ABI changes, but release 2.2 will, and no backwards compatibility is planed due to the vhost-user multiple queues feature enabling. Binaries using this library build prior to version 2.2 will require updating and recompilation.

Applied with this rewording:
It should be integrated in release 2.2 without backward compatibility.

It *should* be in next release but we have to wait that the feature is
stable/integrated in Qemu.

^ permalink raw reply	[relevance 5%]

* Re: [dpdk-dev] [PATCH v2] doc: announce ABI change of rte_eth_fdir_filter, rte_eth_fdir_masks
  2015-08-04  8:56  4%   ` Mcnamara, John
@ 2015-08-12 14:19  4%     ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-08-12 14:19 UTC (permalink / raw)
  To: Lu, Wenzhuo; +Cc: dev

> > For x550 supports 2 new flow director modes, MAC VLAN and Cloud. The MAC
> > VLAN mode means the MAC and VLAN are monitored. The Cloud mode is for
> > VxLAN and NVGRE, and the tunnel type, TNI/VNI, inner MAC and inner VLAN
> > are monitored. So, there're a few new lookup fields for these 2 new modes,
> > like MAC, tunnel type, TNI/VNI. We have to change the ABI to support these
> > new lookup fields.
> > 
> > v2 changes:
> > * Correct the names of the structures.
> > * Wrap the words.
> > * Add explanation for the new modes.
> > 
> > Signed-off-by: Wenzhuo Lu <wenzhuo.lu@intel.com>
> 
> Acked-by: John McNamara <john.mcnamara@intel.com>

Applied, thanks

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for rte_eth_fdir_filter
  2015-08-04  8:52  4% ` Mcnamara, John
@ 2015-08-12 10:38  4%   ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-08-12 10:38 UTC (permalink / raw)
  To: Wu, Jingjing; +Cc: dev

> > To fix the FVL's flow director issue for SCTP flow, rte_eth_fdir_filter
> > need to be change to support SCTP flow keys extension. Here announce the
> > ABI deprecation.
> > 
> > Signed-off-by: jingjing.wu <jingjing.wu@intel.com>
> 
> Acked-by: John McNamara <john.mcnamara@intel.com>

Reworded and applied, thanks

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] abi: announce abi changes plan for struct rte_eth_fdir_flow_ext
  @ 2015-08-12 10:25  5% ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-08-12 10:25 UTC (permalink / raw)
  To: Jingjing Wu; +Cc: dev

2015-06-17 11:36, Jingjing Wu:
> It announces the planned ABI change to support flow director filtering in VF on v2.2.
> 
> Signed-off-by: Jingjing Wu <jingjing.wu@intel.com>

Reworded and applied, thanks

^ permalink raw reply	[relevance 5%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for old flow director APIs removing
  2015-08-11  3:01  4% ` Zhang, Helin
@ 2015-08-12  9:02  4%   ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-08-12  9:02 UTC (permalink / raw)
  To: Wu, Jingjing; +Cc: dev

> > APIs for flow director filters has been replaced by rte_eth_dev_filter_ctrl by
> > previous releases. Enic, ixgbe and i40e are switched to support filter_ctrl APIs, so
> > the old APIs are useless, and ready to be removed now.
> > This patch announces the ABI change for these APIs removing.
> > 
> > Signed-off-by: Jingjing Wu <jingjing.wu@intel.com>
> Acked-by: Helin Zhang <helin.zhang@intel.com>

Reworded and applied, thanks

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v3] doc: announce abi change for interrupt mode
  2015-07-31  1:00  4%     ` Zhang, Helin
@ 2015-08-12  8:51  4%       ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-08-12  8:51 UTC (permalink / raw)
  To: Liang, Cunming; +Cc: dev

> > The patch announces the planned ABI changes for interrupt mode.
> > 
> > Signed-off-by: Cunming Liang <cunming.liang@intel.com>
> Acked-by: Helin Zhang <helin.zhang@intel.com>

Applied, thanks

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH] doc: simplify release notes cover
@ 2015-08-11 22:58  4% Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-08-11 22:58 UTC (permalink / raw)
  To: John McNamara; +Cc: dev

One hierarchical level is enough for this table of content.

Use generated release number.

Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
---
 doc/guides/rel_notes/index.rst           | 2 +-
 doc/guides/rel_notes/rel_description.rst | 5 ++---
 2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/doc/guides/rel_notes/index.rst b/doc/guides/rel_notes/index.rst
index f0f97d1..d01cbc8 100644
--- a/doc/guides/rel_notes/index.rst
+++ b/doc/guides/rel_notes/index.rst
@@ -36,7 +36,7 @@ DPDK Release Notes
 Contents
 
 .. toctree::
-    :maxdepth: 2
+    :maxdepth: 1
     :numbered:
 
     rel_description
diff --git a/doc/guides/rel_notes/rel_description.rst b/doc/guides/rel_notes/rel_description.rst
index f240db1..994845f 100644
--- a/doc/guides/rel_notes/rel_description.rst
+++ b/doc/guides/rel_notes/rel_description.rst
@@ -32,10 +32,9 @@
 Description of Release
 ======================
 
-
-This document contains the release notes for Data Plane Development Kit (DPDK) release version 2.0.0 and previous releases.
+This document contains the release notes for Data Plane Development Kit (DPDK)
+release version |release| and previous releases.
 
 It lists new features, fixed bugs, API and ABI changes and known issues.
 
 For instructions on compiling and running the release, see the :ref:`DPDK Getting Started Guide <linux_gsg>`.
-
-- 
2.4.2

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH] doc: add missing API headers
@ 2015-08-11 16:29  4% Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-08-11 16:29 UTC (permalink / raw)
  To: John McNamara; +Cc: dev

Some libraries were not included in doxygen documentation.
Other ones were included but not listed in the index.

The malloc library is now included in EAL.

The libraries compat and jobstats are added but not doxygen compliant.

Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
---
 doc/api/doxy-api-index.md | 16 ++++++++++++++--
 doc/api/doxy-api.conf     |  4 +++-
 2 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/doc/api/doxy-api-index.md b/doc/api/doxy-api-index.md
index 6958f8f..72ac3c4 100644
--- a/doc/api/doxy-api-index.md
+++ b/doc/api/doxy-api-index.md
@@ -36,7 +36,9 @@ API {#index}
 There are many libraries, so their headers may be grouped by topics:
 
 - **device**:
+  [dev]                (@ref rte_dev.h),
   [ethdev]             (@ref rte_ethdev.h),
+  [ethctrl]            (@ref rte_eth_ctrl.h),
   [devargs]            (@ref rte_devargs.h),
   [bond]               (@ref rte_eth_bond.h),
   [vhost]              (@ref rte_virtio_net.h),
@@ -76,12 +78,15 @@ There are many libraries, so their headers may be grouped by topics:
 
 - **layers**:
   [ethernet]           (@ref rte_ether.h),
+  [ARP]                (@ref rte_arp.h),
+  [ICMP]               (@ref rte_icmp.h),
   [IP]                 (@ref rte_ip.h),
   [SCTP]               (@ref rte_sctp.h),
   [TCP]                (@ref rte_tcp.h),
   [UDP]                (@ref rte_udp.h),
   [frag/reass]         (@ref rte_ip_frag.h),
-  [LPM route]          (@ref rte_lpm.h),
+  [LPM IPv4 route]     (@ref rte_lpm.h),
+  [LPM IPv6 route]     (@ref rte_lpm6.h),
   [ACL]                (@ref rte_acl.h)
 
 - **QoS**:
@@ -92,6 +97,7 @@ There are many libraries, so their headers may be grouped by topics:
 - **hashes**:
   [hash]               (@ref rte_hash.h),
   [jhash]              (@ref rte_jhash.h),
+  [thash]              (@ref rte_thash.h),
   [FBK hash]           (@ref rte_fbk_hash.h),
   [CRC hash]           (@ref rte_hash_crc.h)
 
@@ -99,8 +105,10 @@ There are many libraries, so their headers may be grouped by topics:
   [mbuf]               (@ref rte_mbuf.h),
   [ring]               (@ref rte_ring.h),
   [distributor]        (@ref rte_distributor.h),
+  [reorder]            (@ref rte_reorder.h),
   [tailq]              (@ref rte_tailq.h),
-  [bitmap]             (@ref rte_bitmap.h)
+  [bitmap]             (@ref rte_bitmap.h),
+  [ivshmem]            (@ref rte_ivshmem.h)
 
 - **packet framework**:
   * [port]             (@ref rte_port.h):
@@ -122,10 +130,13 @@ There are many libraries, so their headers may be grouped by topics:
 - **basic**:
   [approx fraction]    (@ref rte_approx.h),
   [random]             (@ref rte_random.h),
+  [config file]        (@ref rte_cfgfile.h),
   [key/value args]     (@ref rte_kvargs.h),
   [string]             (@ref rte_string_fns.h)
 
 - **debug**:
+  [jobstats]           (@ref rte_jobstats.h),
+  [hexdump]            (@ref rte_hexdump.h),
   [debug]              (@ref rte_debug.h),
   [log]                (@ref rte_log.h),
   [warnings]           (@ref rte_warnings.h),
@@ -134,4 +145,5 @@ There are many libraries, so their headers may be grouped by topics:
 - **misc**:
   [EAL config]         (@ref rte_eal.h),
   [common]             (@ref rte_common.h),
+  [ABI compat]         (@ref rte_compat.h),
   [version]            (@ref rte_version.h)
diff --git a/doc/api/doxy-api.conf b/doc/api/doxy-api.conf
index de32af1..cfb4627 100644
--- a/doc/api/doxy-api.conf
+++ b/doc/api/doxy-api.conf
@@ -34,16 +34,18 @@ INPUT                   = doc/api/doxy-api-index.md \
                           lib/librte_eal/common/include \
                           lib/librte_eal/common/include/generic \
                           lib/librte_acl \
+                          lib/librte_cfgfile \
                           lib/librte_cmdline \
+                          lib/librte_compat \
                           lib/librte_distributor \
                           lib/librte_ether \
                           lib/librte_hash \
                           lib/librte_ip_frag \
+                          lib/librte_ivshmem \
                           lib/librte_jobstats \
                           lib/librte_kni \
                           lib/librte_kvargs \
                           lib/librte_lpm \
-                          lib/librte_malloc \
                           lib/librte_mbuf \
                           lib/librte_mempool \
                           lib/librte_meter \
-- 
2.4.2

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH] doc: restructured release notes documentation
@ 2015-08-11 11:57  3% John McNamara
  0 siblings, 0 replies; 200+ results
From: John McNamara @ 2015-08-11 11:57 UTC (permalink / raw)
  To: dev

Restructured the Release Notes documentation into a more useful structure
that is easier to use and to update between releases.

The main changes are:

  * Each release version has it's own section with New Features,
    Resolved Issues, Known Issues and API/ABI Changes.
  * Redundant sections have been removed.
  * The FAQ section have been moved to a standalone document.
  * The Known Issues tables have been changed to definition lists.

Signed-off-by: John McNamara <john.mcnamara@intel.com>
---
 doc/guides/faq/faq.rst                      |  240 +++++
 doc/guides/faq/index.rst                    |   42 +
 doc/guides/index.rst                        |    1 +
 doc/guides/rel_notes/deprecation.rst        |    7 +-
 doc/guides/rel_notes/faq.rst                |  228 -----
 doc/guides/rel_notes/index.rst              |   14 +-
 doc/guides/rel_notes/known_issues.rst       | 1232 ++++++++++-------------
 doc/guides/rel_notes/new_features.rst       |  129 ---
 doc/guides/rel_notes/rel_description.rst    |  145 +--
 doc/guides/rel_notes/release_1_8.rst        |   64 ++
 doc/guides/rel_notes/release_2_0.rst        |  133 +++
 doc/guides/rel_notes/release_2_1.rst        |   69 ++
 doc/guides/rel_notes/resolved_issues.rst    | 1395 ---------------------------
 doc/guides/rel_notes/supported_features.rst |  396 --------
 doc/guides/rel_notes/supported_os.rst       |   14 +-
 doc/guides/rel_notes/updating_apps.rst      |  136 ---
 16 files changed, 1061 insertions(+), 3184 deletions(-)
 create mode 100644 doc/guides/faq/faq.rst
 create mode 100644 doc/guides/faq/index.rst
 delete mode 100644 doc/guides/rel_notes/faq.rst
 delete mode 100644 doc/guides/rel_notes/new_features.rst
 create mode 100644 doc/guides/rel_notes/release_1_8.rst
 create mode 100644 doc/guides/rel_notes/release_2_0.rst
 create mode 100644 doc/guides/rel_notes/release_2_1.rst
 delete mode 100644 doc/guides/rel_notes/resolved_issues.rst
 delete mode 100644 doc/guides/rel_notes/supported_features.rst
 delete mode 100644 doc/guides/rel_notes/updating_apps.rst

diff --git a/doc/guides/faq/faq.rst b/doc/guides/faq/faq.rst
new file mode 100644
index 0000000..7b2394c
--- /dev/null
+++ b/doc/guides/faq/faq.rst
@@ -0,0 +1,240 @@
+..  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.
+
+
+What does "EAL: map_all_hugepages(): open failed: Permission denied Cannot init memory" mean?
+---------------------------------------------------------------------------------------------
+
+This is most likely due to the test application not being run with sudo to promote the user to a superuser.
+Alternatively, applications can also be run as regular user.
+For more information, please refer to :doc:`DPDK Getting Started Guide </linux_gsg/index>`.
+
+
+If I want to change the number of TLB Hugepages allocated, how do I remove the original pages allocated?
+--------------------------------------------------------------------------------------------------------
+
+The number of pages allocated can be seen by executing the following command::
+
+   grep Huge /proc/meminfo
+
+Once all the pages are mmapped by an application, they stay that way.
+If you start a test application with less than the maximum, then you have free pages.
+When you stop and restart the test application, it looks to see if the pages are available in the ``/dev/huge`` directory and mmaps them.
+If you look in the directory, you will see ``n`` number of 2M pages files. If you specified 1024, you will see 1024 page files.
+These are then placed in memory segments to get contiguous memory.
+
+If you need to change the number of pages, it is easier to first remove the pages. The tools/setup.sh script provides an option to do this.
+See the "Quick Start Setup Script" section in the :doc:`DPDK Getting Started Guide </linux_gsg/index>` for more information.
+
+
+If I execute "l2fwd -c f -m 64 -n 3 -- -p 3", I get the following output, indicating that there are no socket 0 hugepages to allocate the mbuf and ring structures to?
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+I have set up a total of 1024 Hugepages (that is, allocated 512 2M pages to each NUMA node).
+
+The -m command line parameter does not guarantee that huge pages will be reserved on specific sockets. Therefore, allocated huge pages may not be on socket 0.
+To request memory to be reserved on a specific socket, please use the --socket-mem command-line parameter instead of -m.
+
+
+I am running a 32-bit DPDK application on a NUMA system, and sometimes the application initializes fine but cannot allocate memory. Why is that happening?
+----------------------------------------------------------------------------------------------------------------------------------------------------------
+
+32-bit applications have limitations in terms of how much virtual memory is available, hence the number of hugepages they are able to allocate is also limited (1 GB per page size).
+If your system has a lot (>1 GB per page size) of hugepage memory, not all of it will be allocated.
+Due to hugepages typically being allocated on a local NUMA node, the hugepages allocation the application gets during the initialization depends on which
+NUMA node it is running on (the EAL does not affinitize cores until much later in the initialization process).
+Sometimes, the Linux OS runs the DPDK application on a core that is located on a different NUMA node from DPDK master core and
+therefore all the hugepages are allocated on the wrong socket.
+
+To avoid this scenario, either lower the amount of hugepage memory available to 1 GB per page size (or less), or run the application with taskset
+affinitizing the application to a would-be master core.
+
+For example, if your EAL coremask is 0xff0, the master core will usually be the first core in the coremask (0x10); this is what you have to supply to taskset::
+
+   taskset 0x10 ./l2fwd -c 0xff0 -n 2
+
+In this way, the hugepages have a greater chance of being allocated to the correct socket.
+Additionally, a ``--socket-mem`` option could be used to ensure the availability of memory for each socket, so that if hugepages were allocated on
+the wrong socket, the application simply will not start.
+
+
+On application startup, there is a lot of EAL information printed. Is there any way to reduce this?
+---------------------------------------------------------------------------------------------------
+
+Yes, each EAL has a configuration file that is located in the /config directory. Within each configuration file, you will find CONFIG_RTE_LOG_LEVEL=8.
+You can change this to a lower value, such as 6 to reduce this printout of debug information. The following is a list of LOG levels that can be found in the rte_log.h file.
+You must remove, then rebuild, the EAL directory for the change to become effective as the configuration file creates the rte_config.h file in the EAL directory.
+
+.. code-block:: c
+
+    #define RTE_LOG_EMERG 1U    /* System is unusable. */
+    #define RTE_LOG_ALERT 2U    /* Action must be taken immediately. */
+    #define RTE_LOG_CRIT 3U     /* Critical conditions. */
+    #define RTE_LOG_ERR 4U      /* Error conditions. */
+    #define RTE_LOG_WARNING 5U  /* Warning conditions. */
+    #define RTE_LOG_NOTICE 6U   /* Normal but significant condition. */
+    #define RTE_LOG_INFO 7U     /* Informational. */
+    #define RTE_LOG_DEBUG 8U    /* Debug-level messages. */
+
+
+How can I tune my network application to achieve lower latency?
+---------------------------------------------------------------
+
+Traditionally, there is a trade-off between throughput and latency. An application can be tuned to achieve a high throughput,
+but the end-to-end latency of an average packet typically increases as a result.
+Similarly, the application can be tuned to have, on average, a low end-to-end latency at the cost of lower throughput.
+
+To achieve higher throughput, the DPDK attempts to aggregate the cost of processing each packet individually by processing packets in bursts.
+Using the testpmd application as an example, the "burst" size can be set on the command line to a value of 16 (also the default value).
+This allows the application to request 16 packets at a time from the PMD.
+The testpmd application then immediately attempts to transmit all the packets that were received, in this case, all 16 packets.
+The packets are not transmitted until the tail pointer is updated on the corresponding TX queue of the network port.
+This behavior is desirable when tuning for high throughput because the cost of tail pointer updates to both the RX and TX queues
+can be spread across 16 packets, effectively hiding the relatively slow MMIO cost of writing to the PCIe* device.
+
+However, this is not very desirable when tuning for low latency, because the first packet that was received must also wait for the other 15 packets to be received.
+It cannot be transmitted until the other 15 packets have also been processed because the NIC will not know to transmit the packets until the TX tail pointer has been updated,
+which is not done until all 16 packets have been processed for transmission.
+
+To consistently achieve low latency even under heavy system load, the application developer should avoid processing packets in bunches.
+The testpmd application can be configured from the command line to use a burst value of 1.
+This allows a single packet to be processed at a time, providing lower latency, but with the added cost of lower throughput.
+
+
+Without NUMA enabled, my network throughput is low, why?
+--------------------------------------------------------
+
+I have a dual Intel® Xeon® E5645 processors 2.40 GHz with four Intel® 82599 10 Gigabit Ethernet NICs.
+Using eight logical cores on each processor with RSS set to distribute network load from two 10 GbE interfaces to the cores on each processor.
+
+Without NUMA enabled, memory is allocated from both sockets, since memory is interleaved.
+Therefore, each 64B chunk is interleaved across both memory domains.
+
+The first 64B chunk is mapped to node 0, the second 64B chunk is mapped to node 1, the third to node 0, the fourth to node 1.
+If you allocated 256B, you would get memory that looks like this:
+
+.. code-block:: console
+
+    256B buffer
+    Offset 0x00 - Node 0
+    Offset 0x40 - Node 1
+    Offset 0x80 - Node 0
+    Offset 0xc0 - Node 1
+
+Therefore, packet buffers and descriptor rings are allocated from both memory domains, thus incurring QPI bandwidth accessing the other memory and much higher latency.
+For best performance with NUMA disabled, only one socket should be populated.
+
+
+I am getting errors about not being able to open files. Why?
+------------------------------------------------------------
+
+As the DPDK operates, it opens a lot of files, which can result in reaching the open files limits, which is set using the ulimit command or in the limits.conf file.
+This is especially true when using a large number (>512) of 2 MB huge pages. Please increase the open file limit if your application is not able to open files.
+This can be done either by issuing a ulimit command or editing the limits.conf file. Please consult Linux* manpages for usage information.
+
+
+Does my kernel require patching to run the DPDK?
+------------------------------------------------
+
+Any kernel greater than version 2.6.33 can be used without any patches applied. The following kernels may require patches to provide hugepage support:
+
+*   Kernel version 2.6.32 requires the following patches applied:
+
+    *   `mm: hugetlb: add hugepage support to pagemap <http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=5dc37642cbce34619e4588a9f0bdad1d2f870956>`_
+
+    *   `mm: hugetlb: fix hugepage memory leak in walk_page_range() <http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=d33b9f45bd24a6391bc05e2b5a13c1b5787ca9c2>`_
+
+    *   `hugetlb: add nodemask arg to huge page alloc, free and surplus adjust functions <http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=6ae11b278bca1cd41651bae49a8c69de2f6a6262>`_
+        (not mandatory, but recommended on a NUMA system to support per-NUMA node hugepages allocation)
+
+*   Kernel version 2.6.31, requires the above patches plus the following:
+
+    *   `UIO: Add name attributes for mappings and port regions <http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=8205779114e8f612549d191f8e151526a74ab9f2>`_
+
+
+VF driver for IXGBE devices cannot be initialized
+-------------------------------------------------
+
+Some versions of Linux* IXGBE driver do not assign a random MAC address to VF devices at initialization.
+In this case, this has to be done manually on the VM host, using the following command:
+
+.. code-block:: console
+
+    ip link set <interface> vf <VF function> mac <MAC address>
+
+where <interface> being the interface providing the virtual functions for example, eth0, <VF function> being the virtual function number, for example 0,
+and <MAC address> being the desired MAC address.
+
+
+Is it safe to add an entry to the hash table while running?
+------------------------------------------------------------
+Currently the table implementation is not a thread safe implementation and assumes that locking between threads and processes is handled by the user's application.
+This is likely to be supported in future releases.
+
+
+What is the purpose of setting iommu=pt?
+----------------------------------------
+DPDK uses a 1:1 mapping and does not support IOMMU. IOMMU allows for simpler VM physical address translation.
+The second role of IOMMU is to allow protection from unwanted memory access by an unsafe device that has DMA privileges.
+Unfortunately, the protection comes with an extremely high performance cost for high speed NICs.
+
+Setting ``iommu=pt`` disables IOMMU support for the hypervisor.
+
+
+When trying to send packets from an application to itself, meaning smac==dmac, using Intel(R) 82599 VF packets are lost.
+------------------------------------------------------------------------------------------------------------------------
+
+Check on register ``LLE(PFVMTXSSW[n])``, which allows an individual pool to send traffic and have it looped back to itself.
+
+
+Can I split packet RX to use DPDK and have an application's higher order functions continue using Linux* pthread?
+-----------------------------------------------------------------------------------------------------------------
+
+The DPDK's lcore threads are Linux* pthreads bound onto specific cores. Configure the DPDK to do work on the same
+cores and run the application's other work on other cores using the DPDK's "coremask" setting to specify which
+cores it should launch itself on.
+
+
+Is it possible to exchange data between DPDK processes and regular userspace processes via some shared memory or IPC mechanism?
+-------------------------------------------------------------------------------------------------------------------------------
+
+Yes - DPDK processes are regular Linux/BSD processes, and can use all OS provided IPC mechanisms.
+
+
+Can the multiple queues in Intel(R) I350 be used with DPDK?
+-----------------------------------------------------------
+
+I350 has RSS support and 8 queue pairs can be used in RSS mode. It should work with multi-queue DPDK applications using RSS.
+
+
+How can hugepage-backed memory be shared among multiple processes?
+------------------------------------------------------------------
+
+See the Primary and Secondary examples in the multi-process sample application, see :doc:`/sample_app_ug/multi_process`.
diff --git a/doc/guides/faq/index.rst b/doc/guides/faq/index.rst
new file mode 100644
index 0000000..5bc84ac
--- /dev/null
+++ b/doc/guides/faq/index.rst
@@ -0,0 +1,42 @@
+..  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.
+
+DPDK FAQ
+========
+
+This document contains some Frequently Asked Questions that arise when working with DPDK.
+
+Contents
+
+.. toctree::
+    :maxdepth: 2
+    :numbered:
+
+    faq
diff --git a/doc/guides/index.rst b/doc/guides/index.rst
index 0a89efd..ebcde22 100644
--- a/doc/guides/index.rst
+++ b/doc/guides/index.rst
@@ -46,3 +46,4 @@ Contents:
    testpmd_app_ug/index
    rel_notes/index
    guidelines/index
+   faq/index
diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 5330d3b..3db782a 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -1,12 +1,9 @@
-Deprecation
-===========
+ABI and API Deprecation
+=======================
 
 See the :doc:`guidelines document for details of the ABI policy </guidelines/versioning>`.
 API and ABI deprecation notices are to be posted here.
 
-Help to update from a previous release is provided in
-:doc:`another section </rel_notes/updating_apps>`.
-
 
 Deprecation Notices
 -------------------
diff --git a/doc/guides/rel_notes/faq.rst b/doc/guides/rel_notes/faq.rst
deleted file mode 100644
index d87230a..0000000
--- a/doc/guides/rel_notes/faq.rst
+++ /dev/null
@@ -1,228 +0,0 @@
-..  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.
-
-Frequently Asked Questions (FAQ)
-================================
-
-When running the test application, I get “EAL: map_all_hugepages(): open failed: Permission denied Cannot init memory”?
------------------------------------------------------------------------------------------------------------------------
-
-This is most likely due to the test application not being run with sudo to promote the user to a superuser.
-Alternatively, applications can also be run as regular user.
-For more information, please refer to *DPDK Getting Started Guide*.
-
-If I want to change the number of TLB Hugepages allocated, how do I remove the original pages allocated?
---------------------------------------------------------------------------------------------------------
-
-The number of pages allocated can be seen by executing the cat /proc/meminfo|grep Huge command.
-Once all the pages are mmapped by an application, they stay that way.
-If you start a test application with less than the maximum, then you have free pages.
-When you stop and restart the test application, it looks to see if the pages are available in the /dev/huge directory and mmaps them.
-If you look in the directory, you will see n number of 2M pages files. If you specified 1024, you will see 1024 files.
-These are then placed in memory segments to get contiguous memory.
-
-If you need to change the number of pages, it is easier to first remove the pages. The tools/setup.sh script provides an option to do this.
-See the “Quick Start Setup Script” section in the *DPDK Getting Started Guide* for more information.
-
-If I execute “l2fwd -c f -m 64 –n 3 -- -p 3”, I get the following output, indicating that there are no socket 0 hugepages to allocate the mbuf and ring structures to?
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-I have set up a total of 1024 Hugepages (that is, allocated 512 2M pages to each NUMA node).
-
-The -m command line parameter does not guarantee that huge pages will be reserved on specific sockets. Therefore, allocated huge pages may not be on socket 0.
-To request memory to be reserved on a specific socket, please use the --socket-mem command-line parameter instead of -m.
-
-I am running a 32-bit DPDK application on a NUMA system, and sometimes the application initializes fine but cannot allocate memory. Why is that happening?
------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-32-bit applications have limitations in terms of how much virtual memory is available, hence the number of hugepages they are able to allocate is also limited (1 GB per page size).
-If your system has a lot (>1 GB per page size) of hugepage memory, not all of it will be allocated.
-Due to hugepages typically being allocated on a local NUMA node, the hugepages allocation the application gets during the initialization depends on which
-NUMA node it is running on (the EAL does not affinitize cores until much later in the initialization process).
-Sometimes, the Linux OS runs the DPDK application on a core that is located on a different NUMA node from DPDK master core and
-therefore all the hugepages are allocated on the wrong socket.
-
-To avoid this scenario, either lower the amount of hugepage memory available to 1 GB per page size (or less), or run the application with taskset
-affinitizing the application to a would-be master core.
-For example, if your EAL coremask is 0xff0, the master core will usually be the first core in the coremask (0x10); this is what you have to supply to taskset, for example,
-taskset 0x10 ./l2fwd -c 0xff0 -n 2.
-In this way, the hugepages have a greater chance of being allocated to the correct socket.
-Additionally, a --socket-mem option could be used to ensure the availability of memory for each socket, so that if hugepages were allocated on
-the wrong socket, the application simply will not start.
-
-On application startup, there is a lot of EAL information printed. Is there any way to reduce this?
----------------------------------------------------------------------------------------------------
-
-Yes, each EAL has a configuration file that is located in the /config directory. Within each configuration file, you will find CONFIG_RTE_LOG_LEVEL=8.
-You can change this to a lower value, such as 6 to reduce this printout of debug information. The following is a list of LOG levels that can be found in the rte_log.h file.
-You must remove, then rebuild, the EAL directory for the change to become effective as the configuration file creates the rte_config.h file in the EAL directory.
-
-.. code-block:: c
-
-    #define RTE_LOG_EMERG 1U    /* System is unusable. */
-    #define RTE_LOG_ALERT 2U    /* Action must be taken immediately. */
-    #define RTE_LOG_CRIT 3U     /* Critical conditions. */
-    #define RTE_LOG_ERR 4U      /* Error conditions. */
-    #define RTE_LOG_WARNING 5U  /* Warning conditions. */
-    #define RTE_LOG_NOTICE 6U   /* Normal but significant condition. */
-    #define RTE_LOG_INFO 7U     /* Informational. */
-    #define RTE_LOG_DEBUG 8U    /* Debug-level messages. */
-
-How can I tune my network application to achieve lower latency?
----------------------------------------------------------------
-
-Traditionally, there is a trade-off between throughput and latency. An application can be tuned to achieve a high throughput,
-but the end-to-end latency of an average packet typically increases as a result.
-Similarly, the application can be tuned to have, on average, a low end-to-end latency at the cost of lower throughput.
-
-To achieve higher throughput, the DPDK attempts to aggregate the cost of processing each packet individually by processing packets in bursts.
-Using the testpmd application as an example, the “burst” size can be set on the command line to a value of 16 (also the default value).
-This allows the application to request 16 packets at a time from the PMD.
-The testpmd application then immediately attempts to transmit all the packets that were received, in this case, all 16 packets.
-The packets are not transmitted until the tail pointer is updated on the corresponding TX queue of the network port.
-This behavior is desirable when tuning for high throughput because the cost of tail pointer updates to both the RX and TX queues
-can be spread across 16 packets, effectively hiding the relatively slow MMIO cost of writing to the PCIe* device.
-
-However, this is not very desirable when tuning for low latency, because the first packet that was received must also wait for the other 15 packets to be received.
-It cannot be transmitted until the other 15 packets have also been processed because the NIC will not know to transmit the packets until the TX tail pointer has been updated,
-which is not done until all 16 packets have been processed for transmission.
-
-To consistently achieve low latency even under heavy system load, the application developer should avoid processing packets in bunches.
-The testpmd application can be configured from the command line to use a burst value of 1.
-This allows a single packet to be processed at a time, providing lower latency, but with the added cost of lower throughput.
-
-Without NUMA enabled, my network throughput is low, why?
---------------------------------------------------------
-
-I have a dual Intel® Xeon® E5645 processors @2.40 GHz with four Intel® 82599 10 Gigabit Ethernet NICs.
-Using eight logical cores on each processor with RSS set to distribute network load from two 10 GbE interfaces to the cores on each processor.
-
-Without NUMA enabled, memory is allocated from both sockets, since memory is interleaved.
-Therefore, each 64B chunk is interleaved across both memory domains.
-
-The first 64B chunk is mapped to node 0, the second 64B chunk is mapped to node 1, the third to node 0, the fourth to node 1.
-If you allocated 256B, you would get memory that looks like this:
-
-.. code-block:: console
-
-    256B buffer
-    Offset 0x00 - Node 0
-    Offset 0x40 - Node 1
-    Offset 0x80 - Node 0
-    Offset 0xc0 - Node 1
-
-Therefore, packet buffers and descriptor rings are allocated from both memory domains, thus incurring QPI bandwidth accessing the other memory and much higher latency.
-For best performance with NUMA disabled, only one socket should be populated.
-
-I am getting errors about not being able to open files. Why?
-------------------------------------------------------------
-
-As the DPDK operates, it opens a lot of files, which can result in reaching the open files limits, which is set using the ulimit command or in the limits.conf file.
-This is especially true when using a large number (>512) of 2 MB huge pages. Please increase the open file limit if your application is not able to open files.
-This can be done either by issuing a ulimit command or editing the limits.conf file. Please consult Linux* manpages for usage information.
-
-Does my kernel require patching to run the DPDK?
--------------------------------------------------------
-
-Any kernel greater than version 2.6.33 can be used without any patches applied. The following kernels may require patches to provide hugepage support:
-
-*   kernel version 2.6.32 requires the following patches applied:
-
-    *   `addhugepage support to pagemap <http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=5dc37642cbce34619e4588a9f0bdad1d2f870956>`_
-
-    *   `fix hugepage memory leak <http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=d33b9f45bd24a6391bc05e2b5a13c1b5787ca9c2>`_
-
-    *   `add nodemask arg to huge page alloc <http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=6ae11b278bca1cd41651bae49a8c69de2f6a6262>`_
-
-        (not mandatory, but recommended on a NUMA system to support per-NUMA node hugepages allocation)
-
-*   kernel version 2.6.31, requires the following patches applied:
-
-    *   `fix hugepage memory leak <http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=d33b9f45bd24a6391bc05e2b5a13c1b5787ca9c2>`_
-
-    *   `add hugepage support to pagemap <http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=5dc37642cbce34619e4588a9f0bdad1d2f870956>`_
-
-    *   `add uio name attributes and port regions <http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=8205779114e8f612549d191f8e151526a74ab9f2>`_
-
-    *   `add nodemask arg to huge page alloc <http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=6ae11b278bca1cd41651bae49a8c69de2f6a6262>`_
-
-        (not mandatory, but recommended on a NUMA system to support per-NUMA node hugepages allocation)
-
-.. note::
-
-    Blue text in the lists above are direct links to the patch downloads.
-
-VF driver for IXGBE devices cannot be initialized.
---------------------------------------------------
-
-Some versions of Linux* IXGBE driver do not assign a random MAC address to VF devices at initialization.
-In this case, this has to be done manually on the VM host, using the following command:
-
-.. code-block:: console
-
-    ip link set <interface> vf <VF function> mac <MAC address>
-
-where <interface> being the interface providing the virtual functions for example, eth0, <VF function> being the virtual function number, for example 0,
-and <MAC address> being the desired MAC address.
-
-Is it safe to add an entry to the hash table while running?
-------------------------------------------------------------
-Currently the table implementation is not a thread safe implementation and assumes that locking between threads and processes is handled by the user's application.
-This is likely to be supported in future releases.
-
-What is the purpose of setting iommu=pt?
-----------------------------------------
-DPDK uses a 1:1 mapping and does not support IOMMU. IOMMU allows for simpler VM physical address translation.
-The second role of IOMMU is to allow protection from unwanted memory access by an unsafe device that has DMA privileges.
-Unfortunately, the protection comes with an extremely high performance cost for high speed NICs.
-
-iommu=pt disables IOMMU support for the hypervisor.
-
-When trying to send packets from an application to itself, meaning smac==dmac, using Intel(R) 82599 VF packets are lost.
-------------------------------------------------------------------------------------------------------------------------
-Check on register LLE(PFVMTXSSW[n]), which allows an individual pool to send traffic and have it looped back to itself.
-
-Can I split packet RX to use DPDK and have an application's higher order functions continue using Linux* pthread?
------------------------------------------------------------------------------------------------------------------
-The DPDK's lcore threads are Linux* pthreads bound onto specific cores. Configure the DPDK to do work on the same
-cores and run the application's other work on other cores using the DPDK's "coremask" setting to specify which
-cores it should launch itself on.
-
-Is it possible to exchange data between DPDK processes and regular userspace processes via some shared memory or IPC mechanism?
--------------------------------------------------------------------------------------------------------------------------------
-Yes - DPDK processes are regular Linux/BSD processes, and can use all OS provided IPC mechanisms.
-
-Can the multiple queues in Intel(R) I350 be used with DPDK?
------------------------------------------------------------
-I350 has RSS support and 8 queue pairs can be used in RSS mode. It should work with multi-queue DPDK applications using RSS.
-
-How can hugepage-backed memory be shared among multiple processes?
-------------------------------------------------------------------
-See the Primary and Secondary examples in the multi-process sample application.
diff --git a/doc/guides/rel_notes/index.rst b/doc/guides/rel_notes/index.rst
index 9d66cd8..f0f97d1 100644
--- a/doc/guides/rel_notes/index.rst
+++ b/doc/guides/rel_notes/index.rst
@@ -28,10 +28,8 @@
     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-Release Notes
-=============
-
-Package Version: 2.0
+DPDK Release Notes
+==================
 
 |today|
 
@@ -42,11 +40,9 @@ Contents
     :numbered:
 
     rel_description
-    new_features
-    supported_features
+    release_2_1
+    release_2_0
+    release_1_8
     supported_os
-    updating_apps
     known_issues
-    resolved_issues
     deprecation
-    faq
diff --git a/doc/guides/rel_notes/known_issues.rst b/doc/guides/rel_notes/known_issues.rst
index a39c714..b9a52d0 100644
--- a/doc/guides/rel_notes/known_issues.rst
+++ b/doc/guides/rel_notes/known_issues.rst
@@ -28,836 +28,592 @@
     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-Known Issues and Limitations
-============================
 
-This section describes known issues with the DPDK software.
+Known Issues and Limitations in Legacy Releases
+===============================================
+
+This section describes known issues with the DPDK software that aren't covered in the version specific release
+notes sections.
+
 
 Unit Test for Link Bonding may fail at test_tlb_tx_burst()
 ----------------------------------------------------------
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | Unit Test for Link Bonding may fail at test_tlb_tx_burst()                           |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | IXA00390304                                                                          |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | Unit tests will fail at test_tlb_tx_burst function with error for uneven distribution|
-|                                | of packets.                                                                          |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | Unit test link_bonding_autotest will fail                                            |
-|                                |                                                                                      |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution/ Workaround         | There is no workaround available.                                                    |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | Fedora 20                                                                            |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | Link Bonding                                                                         |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
+
+**Description**:
+   Unit tests will fail in ``test_tlb_tx_burst()`` function with error for uneven distribution of packets.
+
+**Implication**:
+   Unit test link_bonding_autotest will fail.
+
+**Resolution/Workaround**:
+   There is no workaround available.
+
+**Affected Environment/Platform**:
+   Fedora 20.
+
+**Driver/Module**:
+   Link Bonding.
 
 
 Pause Frame Forwarding does not work properly on igb
 ----------------------------------------------------
 
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | Pause Frame forwarding does not work properly on igb                                 |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | IXA00384637                                                                          |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | For igb  devices rte_eth_flow_ctrl_set is not working as expected.                   |
-|                                | Pause frames are always forwarded on igb, regardless of the RFCE, MPMCF and DPF      |
-|                                | registers.                                                                           |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | Pause frames will never be rejected by the host on 1G NICs and they will always be   |
-|                                | forwarded.                                                                           |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution/ Workaround         | There is no workaround available.                                                    |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | All                                                                                  |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | Poll Mode Driver (PMD)                                                               |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
+**Description**:
+   For igb devices rte_eth_flow_ctrl_set does not work as expected.
+   Pause frames are always forwarded on igb, regardless of the ``RFCE``, ``MPMCF`` and ``DPF`` registers.
+
+**Implication**:
+   Pause frames will never be rejected by the host on 1G NICs and they will always be forwarded.
+
+**Resolution/Workaround**:
+   There is no workaround available.
+
+**Affected Environment/Platform**:
+   All.
+
+**Driver/Module**:
+   Poll Mode Driver (PMD).
+
 
 In packets provided by the PMD, some flags are missing
 ------------------------------------------------------
 
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | In packets provided by the PMD, some flags are missing                               |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | 3                                                                                    |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | In packets provided by the PMD, some flags are missing.                              |
-|                                | The application does not have access to information provided by the hardware         |
-|                                | (packet is broadcast, packet is multicast, packet is IPv4 and so on).                |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | The “ol_flags” field in the “rte_mbuf” structure is not correct and should not be    |
-|                                | used.                                                                                |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution                     | The application has to parse the Ethernet header itself to get the information,      |
-|                                | which is slower.                                                                     |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | All                                                                                  |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | Poll Mode Driver (PMD)                                                               |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
+**Description**:
+   In packets provided by the PMD, some flags are missing.
+   The application does not have access to information provided by the hardware
+   (packet is broadcast, packet is multicast, packet is IPv4 and so on).
+
+**Implication**:
+   The ``ol_flags`` field in the ``rte_mbuf`` structure is not correct and should not be used.
+
+**Resolution/Workaround**:
+   The application has to parse the Ethernet header itself to get the information, which is slower.
+
+**Affected Environment/Platform**:
+   All.
+
+**Driver/Module**:
+   Poll Mode Driver (PMD).
 
 The rte_malloc library is not fully implemented
 -----------------------------------------------
 
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | The rte_malloc library is not fully implemented                                      |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | 6                                                                                    |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | The rte_malloc library is not fully implemented.                                     |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | All debugging features of rte_malloc library described in architecture documentation |
-|                                | are not yet implemented.                                                             |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution                     | No workaround available.                                                             |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | All                                                                                  |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | rte_malloc                                                                           |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
+**Description**:
+   The ``rte_malloc`` library is not fully implemented.
+
+**Implication**:
+   All debugging features of rte_malloc library described in architecture documentation are not yet implemented.
+
+**Resolution/Workaround**:
+   No workaround available.
+
+**Affected Environment/Platform**:
+   All.
+
+**Driver/Module**:
+   ``rte_malloc``.
+
 
 HPET reading is slow
 --------------------
 
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | HPET reading is slow                                                                 |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | 7                                                                                    |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | Reading the HPET chip is slow.                                                       |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | An application that calls “rte_get_hpet_cycles()” or “rte_timer_manage()” runs       |
-|                                | slower.                                                                              |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution                     | The application should not call these functions too often in the main loop.          |
-|                                | An alternative is to use the TSC register through “rte_rdtsc()” which is faster,     |
-|                                | but specific to an lcore and is a cycle reference, not a time reference.             |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | All                                                                                  |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | Environment Abstraction Layer (EAL)                                                  |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
+**Description**:
+   Reading the HPET chip is slow.
+
+**Implication**:
+   An application that calls ``rte_get_hpet_cycles()`` or ``rte_timer_manage()`` runs slower.
+
+**Resolution/Workaround**:
+   The application should not call these functions too often in the main loop.
+   An alternative is to use the TSC register through ``rte_rdtsc()`` which is faster,
+   but specific to an lcore and is a cycle reference, not a time reference.
+
+**Affected Environment/Platform**:
+   All.
+
+**Driver/Module**:
+   Environment Abstraction Layer (EAL).
+
 
 HPET timers do not work on the Osage customer reference platform
 ----------------------------------------------------------------
 
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | HPET timers do not work on the Osage customer reference platform                     |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | 17                                                                                   |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | HPET timers do not work on the Osage customer reference platform                     |
-|                                | which includes an Intel® Xeon® processor 5500 series processor) using the            |
-|                                | released BIOS from Intel.                                                            |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | On Osage boards, the implementation of the “rte_delay_us()” function must be changed |
-|                                | to not use the HPET timer.                                                           |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution                     | This can be addressed by building the system with the “CONFIG_RTE_LIBEAL_USE_HPET=n” |
-|                                | configuration option or by using the --no-hpet EAL option.                           |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | The Osage customer reference platform.                                               |
-|                                |                                                                                      |
-|                                | Other vendor platforms with Intel®  Xeon® processor 5500 series processors should    |
-|                                | work correctly, provided the BIOS supports HPET.                                     |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | lib/librte_eal/common/include/rte_cycles.h                                           |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
+**Description**:
+   HPET timers do not work on the Osage customer reference platform which includes an Intel® Xeon® processor 5500
+   series processor) using the released BIOS from Intel.
+
+**Implication**:
+   On Osage boards, the implementation of the ``rte_delay_us()`` function must be changed to not use the HPET timer.
+
+**Resolution/Workaround**:
+   This can be addressed by building the system with the ``CONFIG_RTE_LIBEAL_USE_HPET=n``
+   configuration option or by using the ``--no-hpet`` EAL option.
+
+**Affected Environment/Platform**:
+   The Osage customer reference platform.
+   Other vendor platforms with Intel®  Xeon® processor 5500 series processors should
+   work correctly, provided the BIOS supports HPET.
+
+**Driver/Module**:
+   ``lib/librte_eal/common/include/rte_cycles.h``
+
 
 Not all variants of supported NIC types have been used in testing
 -----------------------------------------------------------------
 
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | Not all variants of supported NIC types have been used in testing                    |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | 28                                                                                   |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | The supported network interface cards can come in a number of variants with          |
-|                                | different device ID's. Not all of these variants have been tested with the Intel®    |
-|                                | DPDK.                                                                                |
-|                                |                                                                                      |
-|                                | The NIC device identifiers used during testing:                                      |
-|                                |                                                                                      |
-|                                | *   Intel® Ethernet Controller XL710 for 40GbE QSFP+ [8086:1584]                     |
-|                                |                                                                                      |
-|                                | *   Intel® Ethernet Controller XL710 for 40GbE QSFP+ [8086:1583]                     |
-|                                |                                                                                      |
-|                                | *   Intel® Ethernet Controller X710 for 10GbE SFP+ [8086:1572]                       |
-|                                |                                                                                      |
-|                                | *   Intel® 82576 Gigabit Ethernet Controller [8086:10c9]                             |
-|                                |                                                                                      |
-|                                | *   Intel® 82576 Quad Copper Gigabit Ethernet Controller [8086:10e8]                 |
-|                                |                                                                                      |
-|                                | *   Intel® 82580 Dual Copper Gigabit Ethernet Controller [8086:150e]                 |
-|                                |                                                                                      |
-|                                | *   Intel® I350 Quad Copper Gigabit Ethernet Controller [8086:1521]                  |
-|                                |                                                                                      |
-|                                | *   Intel® 82599 Dual Fibre 10 Gigabit Ethernet Controller [8086:10fb]               |
-|                                |                                                                                      |
-|                                | *   Intel® Ethernet Server Adapter X520-T2 [8086: 151c]                              |
-|                                |                                                                                      |
-|                                | *   Intel® Ethernet Controller X540-T2 [8086:1528]                                   |
-|                                |                                                                                      |
-|                                | *   Intel® 82574L Gigabit Network Connection [8086:10d3]                             |
-|                                |                                                                                      |
-|                                | *   Emulated Intel® 82540EM Gigabit Ethernet Controller [8086:100e]                  |
-|                                |                                                                                      |
-|                                | *   Emulated Intel® 82545EM Gigabit Ethernet Controller [8086:100f]                  |
-|                                |                                                                                      |
-|                                | *   Intel® Ethernet Server Adapter X520-4 [8086:154a]                                |
-|                                |                                                                                      |
-|                                | *   Intel® Ethernet Controller I210 [8086:1533]                                      |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | Risk of issues with untested variants.                                               |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution                     | Use tested NIC variants. For those supported Ethernet controllers, additional device |
-|                                | IDs may be added to the software if required.                                        |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | All                                                                                  |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | Poll-mode drivers                                                                    |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
+**Description**:
+   The supported network interface cards can come in a number of variants with different device ID's.
+   Not all of these variants have been tested with the Intel® DPDK.
+
+   The NIC device identifiers used during testing:
+
+   * Intel® Ethernet Controller XL710 for 40GbE QSFP+ [8086:1584]
+   * Intel® Ethernet Controller XL710 for 40GbE QSFP+ [8086:1583]
+   * Intel® Ethernet Controller X710 for 10GbE SFP+ [8086:1572]
+   * Intel® 82576 Gigabit Ethernet Controller [8086:10c9]
+   * Intel® 82576 Quad Copper Gigabit Ethernet Controller [8086:10e8]
+   * Intel® 82580 Dual Copper Gigabit Ethernet Controller [8086:150e]
+   * Intel® I350 Quad Copper Gigabit Ethernet Controller [8086:1521]
+   * Intel® 82599 Dual Fibre 10 Gigabit Ethernet Controller [8086:10fb]
+   * Intel® Ethernet Server Adapter X520-T2 [8086: 151c]
+   * Intel® Ethernet Controller X540-T2 [8086:1528]
+   * Intel® 82574L Gigabit Network Connection [8086:10d3]
+   * Emulated Intel® 82540EM Gigabit Ethernet Controller [8086:100e]
+   * Emulated Intel® 82545EM Gigabit Ethernet Controller [8086:100f]
+   * Intel® Ethernet Server Adapter X520-4 [8086:154a]
+   * Intel® Ethernet Controller I210 [8086:1533]
+
+**Implication**:
+   Risk of issues with untested variants.
+
+**Resolution/Workaround**:
+   Use tested NIC variants. For those supported Ethernet controllers, additional device
+   IDs may be added to the software if required.
+
+**Affected Environment/Platform**:
+   All.
+
+**Driver/Module**:
+   Poll-mode drivers
+
 
 Multi-process sample app requires exact memory mapping
 ------------------------------------------------------
 
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | Multi-process sample app requires exact memory mapping                               |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | 30                                                                                   |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | The multi-process example application assumes that                                   |
-|                                | it is possible to map the hugepage memory to the same virtual addresses in client    |
-|                                | and server applications. Occasionally, very rarely with 64-bit, this does not occur  |
-|                                | and a client application will fail on startup. The Linux                             |
-|                                | “address-space layout randomization” security feature can sometimes cause this to    |
-|                                | occur.                                                                               |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | A multi-process client application fails to initialize.                              |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution                     | See the “Multi-process Limitations” section in the Intel®  DPDK Programmer’s Guide   |
-|                                | for more information.                                                                |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | All                                                                                  |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | Multi-process example application                                                    |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-
-Packets are not sent by the 1 GbE/10 GbE SR-IOV driver when the source MAC address is not the MAC address assigned to the VF NIC
---------------------------------------------------------------------------------------------------------------------------------
-
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | Packets are not sent by the 1 GbE/10 GbE SR-IOV driver when the source MAC address   |
-|                                | is not the MAC address assigned to the VF NIC                                        |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | IXA00168379                                                                          |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | The 1 GbE/10 GbE SR-IOV driver can only send packets when the Ethernet header’s      |
-|                                | source MAC address is the same as that of the VF NIC. The reason for this is that    |
-|                                | the Linux “ixgbe” driver module in the host OS has its anti-spoofing feature enabled.|
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | Packets sent using the 1 GbE/10 GbE SR-IOV driver must have the source MAC address   |
-|                                | correctly set to that of the VF NIC. Packets with other source address values are    |
-|                                | dropped by the NIC if the application attempts to transmit them.                     |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution/ Workaround         | Configure the Ethernet source address in each packet to match that of the VF NIC.    |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | All                                                                                  |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | 1 GbE/10 GbE VF Poll Mode Driver (PMD)                                               |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
+**Description**:
+   The multi-process example application assumes that
+   it is possible to map the hugepage memory to the same virtual addresses in client and server applications.
+   Occasionally, very rarely with 64-bit, this does not occur and a client application will fail on startup.
+   The Linux "address-space layout randomization" security feature can sometimes cause this to occur.
+
+**Implication**:
+   A multi-process client application fails to initialize.
+
+**Resolution/Workaround**:
+   See the "Multi-process Limitations" section in the Intel®  DPDK Programmer's Guide for more information.
+
+**Affected Environment/Platform**:
+   All.
+
+**Driver/Module**:
+   Multi-process example application
+
+
+Packets are not sent by the 1 GbE/10 GbE SR-IOV driver when the source MAC is not the MAC assigned to the VF NIC
+----------------------------------------------------------------------------------------------------------------
+
+**Description**:
+   The 1 GbE/10 GbE SR-IOV driver can only send packets when the Ethernet header's source MAC address is the same as
+   that of the VF NIC.
+   The reason for this is that the Linux ``ixgbe`` driver module in the host OS has its anti-spoofing feature enabled.
+
+**Implication**:
+   Packets sent using the 1 GbE/10 GbE SR-IOV driver must have the source MAC address correctly set to that of the VF NIC.
+   Packets with other source address values are dropped by the NIC if the application attempts to transmit them.
+
+**Resolution/Workaround**:
+   Configure the Ethernet source address in each packet to match that of the VF NIC.
+
+**Affected Environment/Platform**:
+   All.
+
+**Driver/Module**:
+   1 GbE/10 GbE VF Poll Mode Driver (PMD).
+
 
 SR-IOV drivers do not fully implement the rte_ethdev API
 --------------------------------------------------------
 
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | SR-IOV drivers do not fully implement the rte_ethdev API                             |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | 59                                                                                   |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | The SR-IOV drivers only supports the following rte_ethdev API functions:             |
-|                                |                                                                                      |
-|                                | *   rte_eth_dev_configure()                                                          |
-|                                |                                                                                      |
-|                                | *   rte_eth_tx_queue_setup()                                                         |
-|                                |                                                                                      |
-|                                | *   rte_eth_rx_queue_setup()                                                         |
-|                                |                                                                                      |
-|                                | *   rte_eth_dev_info_get()                                                           |
-|                                |                                                                                      |
-|                                | *   rte_eth_dev_start()                                                              |
-|                                |                                                                                      |
-|                                | *   rte_eth_tx_burst()                                                               |
-|                                |                                                                                      |
-|                                | *   rte_eth_rx_burst()                                                               |
-|                                |                                                                                      |
-|                                | *   rte_eth_dev_stop()                                                               |
-|                                |                                                                                      |
-|                                | *   rte_eth_stats_get()                                                              |
-|                                |                                                                                      |
-|                                | *   rte_eth_stats_reset()                                                            |
-|                                |                                                                                      |
-|                                | *   rte_eth_link_get()                                                               |
-|                                |                                                                                      |
-|                                | *   rte_eth_link_get_no_wait()                                                       |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | Calling an unsupported function will result in an application error.                 |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution/ Workaround         | Do not use other rte_ethdev API functions in applications that use the SR-IOV        |
-|                                | drivers.                                                                             |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | All                                                                                  |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | VF Poll Mode Driver (PMD)                                                            |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
+**Description**:
+   The SR-IOV drivers only supports the following rte_ethdev API functions:
+
+   * rte_eth_dev_configure()
+   * rte_eth_tx_queue_setup()
+   * rte_eth_rx_queue_setup()
+   * rte_eth_dev_info_get()
+   * rte_eth_dev_start()
+   * rte_eth_tx_burst()
+   * rte_eth_rx_burst()
+   * rte_eth_dev_stop()
+   * rte_eth_stats_get()
+   * rte_eth_stats_reset()
+   * rte_eth_link_get()
+   * rte_eth_link_get_no_wait()
+
+**Implication**:
+   Calling an unsupported function will result in an application error.
+
+**Resolution/Workaround**:
+   Do not use other rte_ethdev API functions in applications that use the SR-IOV drivers.
+
+**Affected Environment/Platform**:
+   All.
+
+**Driver/Module**:
+   VF Poll Mode Driver (PMD).
+
 
 PMD does not work with --no-huge EAL command line parameter
 -----------------------------------------------------------
 
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | PMD does not work with --no-huge EAL command line parameter                          |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | IXA00373461                                                                          |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | Currently, the DPDK does not store any information about memory allocated by         |
-|                                | malloc() (for example, NUMA node, physical address), hence PMD drivers do not work   |
-|                                | when the --no-huge command line parameter is supplied to EAL.                        |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | Sending and receiving data with PMD will not work.                                   |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution/ Workaround         | Use huge page memory or use VFIO to map devices.                                     |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | Systems running the DPDK on Linux                                                    |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | Poll Mode Driver (PMD)                                                               |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
+**Description**:
+   Currently, the DPDK does not store any information about memory allocated by ``malloc()` (for example, NUMA node,
+   physical address), hence PMD drivers do not work when the ``--no-huge`` command line parameter is supplied to EAL.
+
+**Implication**:
+   Sending and receiving data with PMD will not work.
+
+**Resolution/Workaround**:
+   Use huge page memory or use VFIO to map devices.
+
+**Affected Environment/Platform**:
+   Systems running the DPDK on Linux
+
+**Driver/Module**:
+   Poll Mode Driver (PMD).
+
 
 Some hardware off-load functions are not supported by the VF Driver
 -------------------------------------------------------------------
 
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | Some hardware off-load functions are not supported by the VF Driver                  |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | IXA00378813                                                                          |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | Currently, configuration of the following items is not supported by the VF driver:   |
-|                                |                                                                                      |
-|                                | *   IP/UDP/TCP checksum offload                                                      |
-|                                |                                                                                      |
-|                                | *   Jumbo Frame Receipt                                                              |
-|                                |                                                                                      |
-|                                | *   HW Strip CRC                                                                     |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | Any configuration for these items in the VF register will be ignored. The behavior   |
-|                                | is dependent on the current PF setting.                                              |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution/ Workaround         | For the PF (Physical Function) status on which the VF driver depends, there is an    |
-|                                | option item under PMD in the config file. For others, the VF will keep the same      |
-|                                | behavior as PF setting.                                                              |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | All                                                                                  |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | VF (SR-IOV) Poll Mode Driver (PMD)                                                   |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
+**Description**:
+   Currently, configuration of the following items is not supported by the VF driver:
+
+   * IP/UDP/TCP checksum offload
+   * Jumbo Frame Receipt
+   * HW Strip CRC
+
+**Implication**:
+   Any configuration for these items in the VF register will be ignored.
+   The behavior is dependent on the current PF setting.
+
+**Resolution/Workaround**:
+   For the PF (Physical Function) status on which the VF driver depends, there is an option item under PMD in the
+   config file.
+   For others, the VF will keep the same behavior as PF setting.
+
+**Affected Environment/Platform**:
+   All.
+
+**Driver/Module**:
+   VF (SR-IOV) Poll Mode Driver (PMD).
+
 
 Kernel crash on IGB port unbinding
 ----------------------------------
 
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | Kernel crash on IGB port unbinding                                                   |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | 74                                                                                   |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | Kernel crash may occur                                                               |
-|                                | when unbinding 1G ports from the igb_uio driver, on 2.6.3x kernels such as shipped   |
-|                                | with Fedora 14.                                                                      |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | Kernel crash occurs.                                                                 |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution/ Workaround         | Use newer kernels or do not unbind ports.                                            |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | 2.6.3x kernels such as  shipped with Fedora 14                                       |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | IGB Poll Mode Driver (PMD)                                                           |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
+**Description**:
+   Kernel crash may occur when unbinding 1G ports from the igb_uio driver, on 2.6.3x kernels such as shipped
+   with Fedora 14.
+
+**Implication**:
+   Kernel crash occurs.
+
+**Resolution/Workaround**:
+   Use newer kernels or do not unbind ports.
+
+**Affected Environment/Platform**:
+   2.6.3x kernels such as  shipped with Fedora 14
+
+**Driver/Module**:
+   IGB Poll Mode Driver (PMD).
+
 
 Twinpond and Ironpond NICs do not report link status correctly
 --------------------------------------------------------------
 
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | Twinpond and Ironpond NICs do not report link status correctly                       |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | IXA00378800                                                                          |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | Twin Pond/Iron Pond NICs do not bring the physical link down when shutting down the  |
-|                                | port.                                                                                |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | The link is reported as up even after issuing "shutdown" command unless the cable is |
-|                                | physically disconnected.                                                             |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution/ Workaround         | None.                                                                                |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | Twin Pond and Iron Pond NICs                                                         |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | Poll Mode Driver (PMD)                                                               |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
+**Description**:
+   Twin Pond/Iron Pond NICs do not bring the physical link down when shutting down the port.
+
+**Implication**:
+   The link is reported as up even after issuing ``shutdown`` command unless the cable is physically disconnected.
+
+**Resolution/Workaround**:
+   None.
+
+**Affected Environment/Platform**:
+   Twin Pond and Iron Pond NICs
+
+**Driver/Module**:
+   Poll Mode Driver (PMD).
+
 
 Discrepancies between statistics reported by different NICs
 -----------------------------------------------------------
 
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | Discrepancies between statistics reported by different NICs                          |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | IXA00378113                                                                          |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | Gigabit Ethernet devices from Intel include CRC bytes when calculating packet        |
-|                                | reception statistics regardless of hardware CRC stripping state, while 10-Gigabit    |
-|                                | Ethernet devices from Intel do so only when hardware CRC stripping is disabled.      |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | There may be a  discrepancy in how different NICs display packet reception           |
-|                                | statistics.                                                                          |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution/ Workaround         | None                                                                                 |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | All                                                                                  |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | Poll Mode Driver (PMD)                                                               |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
+**Description**:
+   Gigabit Ethernet devices from Intel include CRC bytes when calculating packet reception statistics regardless
+   of hardware CRC stripping state, while 10-Gigabit Ethernet devices from Intel do so only when hardware CRC
+   stripping is disabled.
+
+**Implication**:
+   There may be a  discrepancy in how different NICs display packet reception statistics.
+
+**Resolution/Workaround**:
+   None
+
+**Affected Environment/Platform**:
+   All.
+
+**Driver/Module**:
+   Poll Mode Driver (PMD).
+
 
 Error reported opening files on DPDK initialization
 ---------------------------------------------------
 
+**Description**:
+   On DPDK application startup, errors may be reported when opening files as part of the initialization process.
+   This occurs if a large number, for example, 500 or more, or if hugepages are used, due to the per-process
+   limit on the number of open files.
+
+**Implication**:
+   The DPDK application may fail to run.
+
+**Resolution/Workaround**:
+   If using 2 MB hugepages, consider switching to a fewer number of 1 GB pages.
+   Alternatively, use the ``ulimit`` command to increase the number of files which can be opened by a process.
+
+**Affected Environment/Platform**:
+   All.
+
+**Driver/Module**:
+   Environment Abstraction Layer (EAL).
 
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | Error reported opening files on DPDK initialization                                  |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | 91                                                                                   |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | On DPDK application startup, errors may be reported when opening files as            |
-|                                | part of the initialization process. This occurs if a large number, for example, 500  |
-|                                | or more, or if hugepages are used, due to the per-process limit on the number of     |
-|                                | open files.                                                                          |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | The DPDK application may fail to run.                                                |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution/ Workaround         | If using 2 MB hugepages, consider switching to a fewer number of 1 GB pages.         |
-|                                | Alternatively, use the “ulimit” command to increase the number of files which can be |
-|                                | opened by a process.                                                                 |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | All                                                                                  |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | Environment Abstraction Layer (EAL)                                                  |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
 
 Intel® QuickAssist Technology sample application does not work on a 32-bit OS on Shumway
 ----------------------------------------------------------------------------------------
 
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | Intel® QuickAssist Technology sample applications does not work on a 32- bit OS on   |
-|                                | Shumway                                                                              |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | 93                                                                                   |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | The Intel® Communications Chipset 89xx Series device does not fully support NUMA on  |
-|                                | a 32-bit OS. Consequently, the sample application cannot work properly on Shumway,   |
-|                                | since it requires NUMA on both nodes.                                                |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | The sample application cannot work in 32-bit mode with emulated NUMA, on             |
-|                                | multi-socket boards.                                                                 |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution/ Workaround         | There is no workaround available.                                                    |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | Shumway                                                                              |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | All                                                                                  |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
+**Description**:
+   The Intel® Communications Chipset 89xx Series device does not fully support NUMA on a 32-bit OS.
+   Consequently, the sample application cannot work properly on Shumway, since it requires NUMA on both nodes.
+
+**Implication**:
+   The sample application cannot work in 32-bit mode with emulated NUMA, on multi-socket boards.
+
+**Resolution/Workaround**:
+   There is no workaround available.
+
+**Affected Environment/Platform**:
+   Shumway
+
+**Driver/Module**:
+   All.
+
 
 IEEE1588 support possibly not working with an Intel® Ethernet Controller I210 NIC
 ---------------------------------------------------------------------------------
 
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | IEEE1588 support may not work with an Intel® Ethernet Controller I210 NIC            |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | IXA00380285                                                                          |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | IEEE1588 support is not working with an Intel® Ethernet Controller I210 NIC.         |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | IEEE1588 packets are not forwarded correctly by the Intel® Ethernet Controller I210  |
-|                                | NIC.                                                                                 |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution/ Workaround         | There is no workaround available.                                                    |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | All                                                                                  |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | IGB Poll Mode Driver                                                                 |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
+**Description**:
+   IEEE1588 support is not working with an Intel® Ethernet Controller I210 NIC.
+
+**Implication**:
+   IEEE1588 packets are not forwarded correctly by the Intel® Ethernet Controller I210 NIC.
+
+**Resolution/Workaround**:
+   There is no workaround available.
+
+**Affected Environment/Platform**:
+   All.
+
+**Driver/Module**:
+   IGB Poll Mode Driver
+
 
 Differences in how different Intel NICs handle maximum packet length for jumbo frame
 ------------------------------------------------------------------------------------
 
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | Differences in how different Intel NICs handle maximum packet length for jumbo frame |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | 96                                                                                   |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | 10 Gigabit Ethernet devices from Intel do not take VLAN tags into account when       |
-|                                | calculating packet size while Gigabit Ethernet devices do so for jumbo frames.       |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | When receiving packets with VLAN tags, the actual maximum size of useful payload     |
-|                                | that Intel Gigabit Ethernet devices are able to receive is 4 bytes (or 8 bytes in    |
-|                                | the case of packets with extended VLAN tags) less than that of Intel 10 Gigabit      |
-|                                | Ethernet devices.                                                                    |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution/ Workaround         | Increase the configured maximum packet size when using Intel Gigabit Ethernet        |
-|                                | devices.                                                                             |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | All                                                                                  |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | Poll Mode Driver (PMD)                                                               |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-
-Binding PCI devices to igb_uio fails on Linux* kernel 3.9 when more than one device is used
--------------------------------------------------------------------------------------------
-
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | Binding PCI devices to igb_uio fails on Linux* kernel 3.9 when more than one device  |
-|                                | is used                                                                              |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | 97                                                                                   |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | A known bug in the uio driver included in Linux* kernel version 3.9 prevents more    |
-|                                | than one PCI device to be bound to the igb_uio driver.                               |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | The Poll Mode Driver (PMD) will crash on initialization.                             |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution/ Workaround         | Use earlier or later kernel versions, or apply the following                         |
-|                                | `patch                                                                               |
-|                                | <https://github.com/torvalds/linux/commit/5ed0505c713805f89473cdc0bbfb5110dfd840cb>`_|
-|                                | .                                                                                    |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | Linux* systems with kernel version 3.9                                               |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | igb_uio module                                                                       |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
+**Description**:
+   10 Gigabit Ethernet devices from Intel do not take VLAN tags into account when calculating packet size
+   while Gigabit Ethernet devices do so for jumbo frames.
+
+**Implication**:
+   When receiving packets with VLAN tags, the actual maximum size of useful payload that Intel Gigabit Ethernet
+   devices are able to receive is 4 bytes (or 8 bytes in the case of packets with extended VLAN tags) less than
+   that of Intel 10 Gigabit Ethernet devices.
+
+**Resolution/Workaround**:
+   Increase the configured maximum packet size when using Intel Gigabit Ethernet devices.
+
+**Affected Environment/Platform**:
+   All.
+
+**Driver/Module**:
+   Poll Mode Driver (PMD).
+
+
+Binding PCI devices to igb_uio fails on Linux kernel 3.9 when more than one device is used
+------------------------------------------------------------------------------------------
+
+**Description**:
+   A known bug in the uio driver included in Linux kernel version 3.9 prevents more than one PCI device to be
+   bound to the igb_uio driver.
+
+**Implication**:
+   The Poll Mode Driver (PMD) will crash on initialization.
+
+**Resolution/Workaround**:
+   Use earlier or later kernel versions, or apply the following
+   `patch  <https://github.com/torvalds/linux/commit/5ed0505c713805f89473cdc0bbfb5110dfd840cb>`_.
+
+**Affected Environment/Platform**:
+   Linux systems with kernel version 3.9
+
+**Driver/Module**:
+   igb_uio module
+
 
 GCC might generate Intel® AVX instructions for processors without Intel® AVX support
 ------------------------------------------------------------------------------------
 
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | Gcc might generate Intel® AVX instructions for processors without Intel® AVX support |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | IXA00382439                                                                          |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | When compiling Intel®  DPDK (and any DPDK app), gcc may generate Intel® AVX          |
-|                                | instructions, even when the processor does not support Intel® AVX.                   |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | Any DPDK app might crash while starting up.                                          |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution/ Workaround         | Either compile using icc or set EXTRA_CFLAGS=’-O3’ prior to compilation.             |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | Platforms which processor does not support Intel® AVX.                               |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | Environment Abstraction Layer (EAL)                                                  |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
+**Description**:
+   When compiling Intel®  DPDK (and any DPDK app), gcc may generate Intel® AVX instructions, even when the
+   processor does not support Intel® AVX.
+
+**Implication**:
+   Any DPDK app might crash while starting up.
+
+**Resolution/Workaround**:
+   Either compile using icc or set ``EXTRA_CFLAGS='-O3'`` prior to compilation.
+
+**Affected Environment/Platform**:
+   Platforms which processor does not support Intel® AVX.
+
+**Driver/Module**:
+   Environment Abstraction Layer (EAL).
 
 Ethertype filter could receive other packets (non-assigned) in Niantic
 ----------------------------------------------------------------------
 
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | Ethertype filter could receive other packets (non-assigned) in Niantic               |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | IXA00169017                                                                          |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | On Intel®  Ethernet Controller 82599EB:                                              |
-|                                |                                                                                      |
-|                                | When Ethertype filter (priority enable) was set, unmatched packets also could be     |
-|                                | received on the assigned queue, such as ARP packets without 802.1q tags or with the  |
-|                                | user priority not equal to set value.                                                |
-|                                |                                                                                      |
-|                                | Launch the testpmd by disabling RSS and with multiply queues, then add the ethertype |
-|                                | filter like: “add_ethertype_filter 0 ethertype 0x0806 priority enable 3 queue 2      |
-|                                | index 1”, and then start forwarding.                                                 |
-|                                |                                                                                      |
-|                                | When sending ARP packets without 802.1q tag and with user priority as non-3 by       |
-|                                | tester, all the ARP packets can be received on the assigned queue.                   |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | The user priority comparing in Ethertype filter cannot work probably.                |
-|                                | It is the NIC's issue due to the response from PAE: “In fact, ETQF.UP is not         |
-|                                | functional, and the information will be added in errata of 82599 and X540.”          |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution/ Workaround         | None                                                                                 |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | All                                                                                  |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | Poll Mode Driver (PMD)                                                               |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
+**Description**:
+   On Intel®  Ethernet Controller 82599EB When Ethertype filter (priority enable) was set, unmatched packets also
+   could be received on the assigned queue, such as ARP packets without 802.1q tags or with the user priority not
+   equal to set value.
+   Launch the testpmd by disabling RSS and with multiply queues, then add the ethertype filter like the following
+   and then start forwarding::
+
+      add_ethertype_filter 0 ethertype 0x0806 priority enable 3 queue 2 index 1
+
+   When sending ARP packets without 802.1q tag and with user priority as non-3 by tester, all the ARP packets can
+   be received on the assigned queue.
+
+**Implication**:
+   The user priority comparing in Ethertype filter cannot work probably.
+   It is a NIC's issue due to the following: "In fact, ETQF.UP is not functional, and the information will
+   be added in errata of 82599 and X540."
+
+**Resolution/Workaround**:
+   None
+
+**Affected Environment/Platform**:
+   All.
+
+**Driver/Module**:
+   Poll Mode Driver (PMD).
+
 
 Cannot set link speed on Intel® 40G Ethernet controller
 -------------------------------------------------------
 
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | Cannot set link speed on Intel® 40G Ethernet controller                              |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | IXA00386379                                                                          |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | On Intel® 40G Ethernet Controller:                                                   |
-|                                |                                                                                      |
-|                                | It cannot set the link to specific speed.                                            |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | The link speed cannot be changed forcibly, though it can be configured by            |
-|                                | application.                                                                         |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution/ Workaround         | None                                                                                 |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | All                                                                                  |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | Poll Mode Driver (PMD)                                                               |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
+**Description**:
+   On Intel® 40G Ethernet Controller you cannot set the link to specific speed.
+
+**Implication**:
+   The link speed cannot be changed forcibly, though it can be configured by application.
+
+**Resolution/Workaround**:
+   None
+
+**Affected Environment/Platform**:
+   All.
+
+**Driver/Module**:
+   Poll Mode Driver (PMD).
+
 
 Stopping the port does not down the link on Intel® 40G Ethernet controller
 --------------------------------------------------------------------------
 
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | Stopping the port does not down the link on Intel® 40G Ethernet controller           |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | IXA00386380                                                                          |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | On Intel® 40G Ethernet Controller:                                                   |
-|                                |                                                                                      |
-|                                | Stopping the port does not really down the port link.                                |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | The port link will be still up after stopping the port.                              |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution/ Workaround         | None                                                                                 |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | All                                                                                  |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | Poll Mode Driver (PMD)                                                               |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-
-Devices bound to igb_uio with VT-d enabled do not work on Linux* kernel 3.15-3.17
----------------------------------------------------------------------------------
+**Description**:
+   On Intel® 40G Ethernet Controller stopping the port does not really down the port link.
+
+**Implication**:
+   The port link will be still up after stopping the port.
+
+**Resolution/Workaround**:
+   None
+
+**Affected Environment/Platform**:
+   All.
+
+**Driver/Module**:
+   Poll Mode Driver (PMD).
+
+
+Devices bound to igb_uio with VT-d enabled do not work on Linux kernel 3.15-3.17
+--------------------------------------------------------------------------------
+
+**Description**:
+   When VT-d is enabled (``iommu=pt intel_iommu=on``), devices are 1:1 mapped.
+   In the Linux kernel unbinding devices from drivers removes that mapping which result in IOMMU errors.
+   Introduced in Linux `kernel 3.15 commit
+   <https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/drivers/iommu/intel-iommu.c?id=816997d03bca9fabcee65f3481eb0297103eceb7>`_,
+   solved in Linux `kernel 3.18 commit
+   <https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/drivers/iommu/intel-iommu.c?id=1196c2fb0407683c2df92d3d09f9144d42830894>`_.
+
+**Implication**:
+   Devices will not be allowed to access memory, resulting in following kernel errors::
+
+      dmar: DRHD: handling fault status reg 2
+      dmar: DMAR:[DMA Read] Request device [02:00.0] fault addr a0c58000
+      DMAR:[fault reason 02] Present bit in context entry is clear
+
+**Resolution/Workaround**:
+   Use earlier or later kernel versions, or avoid driver binding on boot by blacklisting the driver modules.
+   I.e., in the case of ``ixgbe``, we can pass the kernel command line option: ``modprobe.blacklist=ixgbe``.
+   This way we do not need to unbind the device to bind it to igb_uio.
+
+**Affected Environment/Platform**:
+   Linux systems with kernel versions 3.15 to 3.17.
+
+**Driver/Module**:
+   ``igb_uio`` module.
 
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | Devices bound to igb_uio with VT-d enabled do not work on Linux* kernel 3.15-3.17    |
-+================================+======================================================================================+
-| Description                    | | When VT-d is enabled (iommu=pt intel_iommu=on), devices are 1:1 mapped.            |
-|                                |   In the Linux* kernel unbinding devices from drivers removes that mapping which     |
-|                                |   result in IOMMU errors.                                                            |
-|                                | | Introduced in Linux `kernel 3.15 commit <https://git.kernel.org/cgit/linux/kernel/ |
-|                                |   git/torvalds/linux.git/commit/drivers/iommu/                                       |
-|                                |   intel-iommu.c?id=816997d03bca9fabcee65f3481eb0297103eceb7>`_,                      |
-|                                |   solved in Linux `kernel 3.18 commit <https://git.kernel.org/cgit/linux/kernel/git/ |
-|                                |   torvalds/linux.git/commit/drivers/iommu/                                           |
-|                                |   intel-iommu.c?id=1196c2fb0407683c2df92d3d09f9144d42830894>`_.                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | | Devices will not be allowed to access memory, resulting in following kernel errors:|
-|                                | | ``dmar: DRHD: handling fault status reg 2``                                        |
-|                                | | ``dmar: DMAR:[DMA Read] Request device [02:00.0] fault addr a0c58000``             |
-|                                | | ``DMAR:[fault reason 02] Present bit in context entry is clear``                   |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution/ Workaround         | | Use earlier or later kernel versions, or avoid driver binding on boot by           |
-|                                |   blacklisting the driver modules.                                                   |
-|                                | | ie. in the case of ixgbe, we can pass the kernel command line option:              |
-|                                | | ``modprobe.blacklist=ixgbe``                                                       |
-|                                | | This way we do not need to unbind the device to bind it to igb_uio.                |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | Linux* systems with kernel versions 3.15 to 3.17                                     |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | igb_uio module                                                                       |
-+--------------------------------+--------------------------------------------------------------------------------------+
 
 VM power manager may not work on systems with more than 64 cores
 ----------------------------------------------------------------
 
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | VM power manager may not work on systems with more than 64 cores                     |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Description                    | When using VM power manager on a system with more than 64 cores,                     |
-|                                | VM(s) should not use cores 64 or higher.                                             |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | VM power manager should not be used with VM(s) that are using cores 64 or above.     |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution/ Workaround         | Do not use cores 64 or above.                                                        |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | Platforms with more than 64 cores.                                                   |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | VM power manager application                                                         |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
+**Description**:
+   When using VM power manager on a system with more than 64 cores, VM(s) should not use cores 64 or higher.
+
+**Implication**:
+   VM power manager should not be used with VM(s) that are using cores 64 or above.
+
+**Resolution/Workaround**:
+   Do not use cores 64 or above.
+
+**Affected Environment/Platform**:
+   Platforms with more than 64 cores.
+
+**Driver/Module**:
+   VM power manager application.
diff --git a/doc/guides/rel_notes/new_features.rst b/doc/guides/rel_notes/new_features.rst
deleted file mode 100644
index 5b724ab..0000000
--- a/doc/guides/rel_notes/new_features.rst
+++ /dev/null
@@ -1,129 +0,0 @@
-..  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.
-
-New Features
-============
-*   Poll-mode driver support for an early release of the PCIE host interface of the Intel(R) Ethernet Switch FM10000.
-
-    *   Basic Rx/Tx functions for PF/VF
-
-    *   Interrupt handling support for PF/VF
-
-    *   Per queue start/stop functions for PF/VF
-
-    *   Support Mailbox handling between PF/VF and PF/Switch Manager
-
-    *   Receive Side Scaling (RSS) for PF/VF
-
-    *   Scatter receive function for PF/VF
-
-    *   Reta update/query for PF/VF
-
-    *   VLAN filter set for PF
-
-    *   Link status query for PF/VF
-
-.. note:: The software is intended to run on pre-release hardware and may contain unknown or unresolved defects or
-          issues related to functionality and performance.
-          The poll mode driver is also pre-release and will be updated to a released version post hardware and base driver release.
-          Should the official hardware release be made between DPDK releases an updated poll-mode driver will be made available.
-
-*   Link Bonding
-
-    *   Support for adaptive load balancing (mode 6) to the link bonding library.
-
-    *   Support for registration of link status change callbacks with link bonding devices.
-
-    *   Support for slaves devices which do not support link status change interrupts in the link bonding library via a link status polling mechanism.
-
-*   PCI Hotplug with NULL PMD sample application
-
-*   ABI versioning
-
-*   x32 ABI
-
-*   Non-EAL Thread Support
-
-*   Multi-pthread Support
-
-*   Re-order Library
-
-*   ACL for AVX2
-
-*   Architecture Independent CRC Hash
-
-*   uio_pci_generic Support
-
-*   KNI Optimizations
-
-*   Vhost-user support
-
-*   Virtio (link, vlan, mac, port IO, perf)
-
-*   IXGBE-VF RSS
-
-*   RX/TX Callbacks
-
-*   Unified Flow Types
-
-*   Indirect Attached MBUF Flag
-
-*   Use default port configuration in TestPMD
-
-*   Tunnel offloading in TestPMD
-
-*   Poll Mode Driver - 40 GbE Controllers (librte_pmd_i40e)
-
-    *   Support for Flow Director
-
-    *   Support for ethertype filter
-
-    *   Support RSS in VF
-
-    *   Support configuring redirection table with different size from 1GbE and 10 GbE
-
-       -   128/512 entries of 40GbE PF
-
-       -   64 entries of 40GbE VF
-
-    *   Support configuring hash functions
-
-    *   Support for VXLAN packet on Intel® 40GbE Controllers
-
-*   Packet Distributor Sample Application
-
-*   Job Stats library and Sample Application.
-
-*   Enhanced Jenkins hash (jhash) library
-
-.. note:: The hash values returned by the new jhash library are different
-          from the ones returned by the previous library.
-
-For further features supported in this release, see Chapter 3 Supported Features.
diff --git a/doc/guides/rel_notes/rel_description.rst b/doc/guides/rel_notes/rel_description.rst
index 9b1fb7f..a31d696 100644
--- a/doc/guides/rel_notes/rel_description.rst
+++ b/doc/guides/rel_notes/rel_description.rst
@@ -28,151 +28,14 @@
     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+
 Description of Release
 ======================
 
-These release notes cover the new features,
-fixed bugs and known issues for Data Plane Development Kit (DPDK) release version 2.0.0.
-
-For instructions on compiling and running the release, see the *DPDK Getting Started Guide*.
-
-Using DPDK Upgrade Patches
---------------------------
-
-For minor updates to the main DPDK releases, the software may be made available both as a new full package and as a patch file to be applied to the previously released package.
-In the latter case, the following commands should be used to apply the patch on top of the already-installed package for the previous release:
-
-.. code-block:: console
-
-    # cd $RTE_SDK
-    # patch –p1 < /path/to/patch/file
-
-Once the patch has been applied cleanly, the DPDK can be recompiled and used as before (described in the *DPDK Getting Started Guide*).
-
-.. note::
-
-    If the patch does not apply cleanly, perhaps because of modifications made locally to the software,
-    it is recommended to use the full release package for the minor update, instead of using the patch.
-
-Documentation Roadmap
----------------------
-
-The following is a list of DPDK documents in the suggested reading order:
-
-*   **Release Notes**
-    (this document): Provides release-specific information, including supported features, limitations, fixed issues, known issues and so on.
-    Also, provides the answers to frequently asked questions in FAQ format.
-
-*   **Getting Started Guide**
-    : Describes how to install and configure the DPDK software; designed to get users up and running quickly with the software.
-
-*   **FreeBSD* Getting Started Guide**
-    : A document describing the use of the DPDK with FreeBSD* has been added in DPDK Release 1.6.0.
-    Refer to this guide for installation and configuration instructions to get started using the DPDK with FreeBSD*.
-
-*   **Programmer's Guide**
-    : Describes:
-
-    *   The software architecture and how to use it (through examples), specifically in a Linux* application (linuxapp) environment
-
-    *   The content of the DPDK, the build system (including the commands that can be used in the root DPDK Makefile to build the development kit and an application)
-        and guidelines for porting an application
-
-    *   Optimizations used in the software and those that should be considered for new development
-
-    A glossary of terms is also provided.
-
-*   **API Reference**
-    : Provides detailed information about DPDK functions, data structures and other programming constructs.
-
-*   **Sample Applications User Guide**
-    : Describes a set of sample applications. Each chapter describes a sample application that showcases specific functionality and provides instructions on how to compile,
-    run and use the sample application.
-
-    The following sample applications are included:
-
-    *   Command Line
-
-    *   Exception Path (into Linux* for packets using the Linux TUN/TAP driver)
-
-    *   Hello World
-
-    *   Integration with Intel® QuickAssist Technology
-
-    *   Link Status Interrupt (Ethernet* Link Status Detection)
-
-    *   IP Reassembly
-
-    *   IP Pipeline
-
-    *   IP Fragmentation
-
-    *   IPv4 Multicast
-
-    *   L2 Forwarding (supports virtualized and non-virtualized environments)
-
-    *   L2 Forwarding IVSHMEM
-
-    *   L2 Forwarding Jobstats
-
-    *   L3 Forwarding
-
-    *   L3 Forwarding with Access Control
-
-    *   L3 Forwarding with Power Management
-
-    *   L3 Forwarding in a Virtualized Environment
-
-    *   Link Bonding
-
-    *   Link Status Interrupt
-
-    *   Load Balancing
-
-    *   Multi-process
-
-    *   QoS Scheduler + Dropper
-
-    *   QoS Metering
-
-    *   Quota & Watermarks
-
-    *   Timer
-
-    *   VMDQ and DCB L2 Forwarding
-
-    *   VMDQ L2 Forwarding
-
-    *   Userspace vhost
-
-    *   Userspace vhost switch
-
-    *   Netmap
-
-    *   Kernel NIC Interface (KNI)
-
-    *   VM Power Management
-
-    *   Distributor
-
-    *   RX-TX Callbacks
-
-    *   Skeleton
-
-    In addition, there are some other applications that are built when the libraries are created.
-    The source for these applications is in the DPDK/app directory and are called:
-
-    *   test
-
-    *   testpmd
 
-    Once the libraries are created, they can be found in the build/app directory.
+This document contains the release notes for Data Plane Development Kit (DPDK) release version 2.0.0 and previous releases.
 
-    *   The test application provides a variety of specific tests for the various functions in the DPDK.
+It lists new features, fixed bugs, API and ABI changes and known issues.
 
-    *   The testpmd application provides a number of different packet throughput tests and examples of features such as
-        how to use the Flow Director found in the Intel® 82599 10 Gigabit Ethernet Controller.
+For instructions on compiling and running the release, see the :doc:`DPDK Getting Started Guide </linux_gsg/index>`.
 
-    The testpmd application is documented in the *DPDK Testpmd Application Note*.
-    The test application is not currently documented.
-    However, you should be able to run and use test application with the command line help that is provided in the application.
diff --git a/doc/guides/rel_notes/release_1_8.rst b/doc/guides/rel_notes/release_1_8.rst
new file mode 100644
index 0000000..39e6611
--- /dev/null
+++ b/doc/guides/rel_notes/release_1_8.rst
@@ -0,0 +1,64 @@
+..  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.
+
+
+DPDK Release 1.8
+================
+
+New Features
+------------
+
+*   Link Bonding
+
+    *   Support for 802.3ad link aggregation (mode 4) and transmit load balancing (mode 5) to the link bonding library.
+
+    *   Support for registration of link status change callbacks with link bonding devices.
+
+    *   Support for slaves devices which do not support link status change interrupts in the link bonding library via a link status polling mechanism.
+
+*   Poll Mode Driver - 40 GbE Controllers (librte_pmd_i40e)
+
+    *   Support for Flow Director
+
+    *   Support for ethertype filter
+
+    *   Support RSS in VF
+
+    *   Support configuring redirection table with different size from 1GbE and 10 GbE
+
+       -   128/512 entries of 40GbE PF
+
+       -   64 entries of 40GbE VF
+
+    *   Support configuring hash functions
+
+    *   Support for VXLAN packet on Intel® 40GbE Controllers
+
+*   Packet Distributor Sample Application
diff --git a/doc/guides/rel_notes/release_2_0.rst b/doc/guides/rel_notes/release_2_0.rst
new file mode 100644
index 0000000..4341a0c
--- /dev/null
+++ b/doc/guides/rel_notes/release_2_0.rst
@@ -0,0 +1,133 @@
+..  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.
+
+
+DPDK Release 2.0
+================
+
+
+New Features
+------------
+
+*   Poll-mode driver support for an early release of the PCIE host interface of the Intel(R) Ethernet Switch FM10000.
+
+    *   Basic Rx/Tx functions for PF/VF
+
+    *   Interrupt handling support for PF/VF
+
+    *   Per queue start/stop functions for PF/VF
+
+    *   Support Mailbox handling between PF/VF and PF/Switch Manager
+
+    *   Receive Side Scaling (RSS) for PF/VF
+
+    *   Scatter receive function for PF/VF
+
+    *   Reta update/query for PF/VF
+
+    *   VLAN filter set for PF
+
+    *   Link status query for PF/VF
+
+.. note:: The software is intended to run on pre-release hardware and may contain unknown or unresolved defects or
+          issues related to functionality and performance.
+          The poll mode driver is also pre-release and will be updated to a released version post hardware and base driver release.
+          Should the official hardware release be made between DPDK releases an updated poll-mode driver will be made available.
+
+*   Link Bonding
+
+    *   Support for adaptive load balancing (mode 6) to the link bonding library.
+
+    *   Support for registration of link status change callbacks with link bonding devices.
+
+    *   Support for slaves devices which do not support link status change interrupts in the link bonding library via a link status polling mechanism.
+
+*   PCI Hotplug with NULL PMD sample application
+
+*   ABI versioning
+
+*   x32 ABI
+
+*   Non-EAL Thread Support
+
+*   Multi-pthread Support
+
+*   Re-order Library
+
+*   ACL for AVX2
+
+*   Architecture Independent CRC Hash
+
+*   uio_pci_generic Support
+
+*   KNI Optimizations
+
+*   Vhost-user support
+
+*   Virtio (link, vlan, mac, port IO, perf)
+
+*   IXGBE-VF RSS
+
+*   RX/TX Callbacks
+
+*   Unified Flow Types
+
+*   Indirect Attached MBUF Flag
+
+*   Use default port configuration in TestPMD
+
+*   Tunnel offloading in TestPMD
+
+*   Poll Mode Driver - 40 GbE Controllers (librte_pmd_i40e)
+
+    *   Support for Flow Director
+
+    *   Support for ethertype filter
+
+    *   Support RSS in VF
+
+    *   Support configuring redirection table with different size from 1GbE and 10 GbE
+
+       -   128/512 entries of 40GbE PF
+
+       -   64 entries of 40GbE VF
+
+    *   Support configuring hash functions
+
+    *   Support for VXLAN packet on Intel® 40GbE Controllers
+
+*   Packet Distributor Sample Application
+
+*   Job Stats library and Sample Application.
+
+*   Enhanced Jenkins hash (jhash) library
+
+.. note:: The hash values returned by the new jhash library are different
+          from the ones returned by the previous library.
diff --git a/doc/guides/rel_notes/release_2_1.rst b/doc/guides/rel_notes/release_2_1.rst
new file mode 100644
index 0000000..c39418c
--- /dev/null
+++ b/doc/guides/rel_notes/release_2_1.rst
@@ -0,0 +1,69 @@
+..  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.
+
+
+DPDK Release 2.1
+================
+
+
+New Features
+------------
+
+*   TODO.
+
+
+Resolved Issues
+---------------
+
+*   TODO.
+
+
+Known Issues
+------------
+
+*   TODO.
+
+
+API Changes
+-----------
+
+*   TODO.
+
+
+API Changes
+-----------
+
+*   TODO.
+
+
+ABI Changes
+-----------
+
+*   TODO.
diff --git a/doc/guides/rel_notes/resolved_issues.rst b/doc/guides/rel_notes/resolved_issues.rst
deleted file mode 100644
index 8d6bbfa..0000000
--- a/doc/guides/rel_notes/resolved_issues.rst
+++ /dev/null
@@ -1,1395 +0,0 @@
-..  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 TOR
-    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-Resolved Issues
-===============
-
-This section describes previously known issues that have been resolved since release version 1.2.
-
-Running TestPMD with SRIOV in Domain U may cause it to hang when XENVIRT switch is on
--------------------------------------------------------------------------------------
-
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | Running TestPMD with SRIOV in Domain U may cause it to hang when XENVIRT switch is on|
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | IXA00168949                                                                          |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | When TestPMD is run with only SRIOV port /testpmd -c f -n 4 -- -i, the following     |
-|                                | error occurs:                                                                        |
-|                                |                                                                                      |
-|                                | PMD: gntalloc: ioctl error                                                           |
-|                                |                                                                                      |
-|                                | EAL: Error - exiting with code: 1                                                    |
-|                                |                                                                                      |
-|                                | Cause: Creation of mbuf pool for socket 0 failed                                     |
-|                                |                                                                                      |
-|                                | Then, alternately run SRIOV port and virtIO with testpmd:                            |
-|                                |                                                                                      |
-|                                | testpmd -c f -n 4 -- -i                                                              |
-|                                |                                                                                      |
-|                                | testpmd -c f -n 4 --use-dev="eth_xenvirt0" -- -i                                     |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | DomU will not be accessible after you repeat this action some times                  |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution/ Workaround         | Run testpmd with a "--total-num-mbufs=N(N<=3500)"                                    |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | Fedora 16, 64 bits + Xen hypervisor 4.2.3 + Domain 0 kernel 3.10.0                   |
-|                                | +Domain U kernel 3.6.11                                                              |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | TestPMD Sample Application                                                           |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-
-Vhost-xen cannot detect Domain U application exit on Xen version 4.0.1
-----------------------------------------------------------------------
-
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | Vhost-xen cannot detect Domain U application exit on Xen 4.0.1.                      |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | IXA00168947                                                                          |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | When using DPDK applications on Xen 4.0.1, e.g. TestPMD Sample Application,          |
-|                                | on killing the application (e.g. killall testpmd) vhost-switch cannot detect         |
-|                                | the domain U exited and does not free the Virtio device.                             |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | Virtio device not freed after application is killed when using vhost-switch on Xen   |
-|                                |                                                                           4.0.1      |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution                     | Resolved in DPDK 1.8                                                                 |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | Xen 4.0.1                                                                            |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | Vhost-switch                                                                         |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-
-Virtio incorrect header length used if MSI-X is disabled by kernel driver
--------------------------------------------------------------------------
-
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | Virtio incorrect header length used if MSI-X is disabled by kernel driver or         |
-|                                | if VIRTIO_NET_F_MAC is not negotiated.                                               |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | IXA00384256                                                                          |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | The Virtio header for host-guest communication is of variable length and             |
-|                                | is dependent on whether MSI-X has been enabled by the kernel driver for the network  |
-|                                | device.                                                                              |
-|                                |                                                                                      |
-|                                | The base header length of 20 bytes will be extended by 4 bytes to accommodate MSI-X  |
-|                                | vectors and the Virtio Network Device header will appear at byte offset 24.          |
-|                                |                                                                                      |
-|                                | The Userspace Virtio Poll Mode Driver tests the guest feature bits for the presence  |
-|                                | of VIRTIO_PCI_FLAG_MISIX, however this bit field is not part of the Virtio           |
-|                                | specification and resolves to the VIRTIO_NET_F_MAC feature instead.                  |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | The DPDK kernel driver will enable MSI-X by default,                                 |
-|                                | however if loaded with "intr_mode=legacy" on a guest with a Virtio Network Device,   |
-|                                | a KVM-Qemu guest may crash with the following error: "virtio-net header not in first |
-|                                | element".                                                                            |
-|                                |                                                                                      |
-|                                | If VIRTIO_NET_F_MAC feature has not been negotiated, then the Userspace Poll Mode    |
-|                                | Driver will assume that MSI-X has been disabled and will prevent the proper          |
-|                                | functioning of the driver.                                                           |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution                     | Ensure #define VIRTIO_PCI_CONFIG(hw) returns the correct offset (20 or 24 bytes) for |
-|                                | the devices where in rare cases MSI-X is disabled or VIRTIO_NET_F_MAC has not been   |
-|                                | negotiated.                                                                          |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | Virtio devices where  MSI-X is disabled or VIRTIO_NET_F_MAC feature has not been     |
-|                                | negotiated.                                                                          |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | librte_pmd_virtio                                                                    |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-
-Unstable system performance across application executions with 2MB pages
-------------------------------------------------------------------------
-
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | Unstable system performance across application executions with 2MB pages             |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | IXA00372346                                                                          |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | The performance of an DPDK application may vary across executions of an              |
-|                                | application due to a varying number of TLB misses depending on the location of       |
-|                                | accessed structures in memory.                                                       |
-|                                | This situation occurs on rare occasions.                                             |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | Occasionally, relatively poor performance of DPDK applications is encountered.       |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution/ Workaround         | Using 1 GB pages results in lower usage of TLB entries, resolving this issue.        |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | Systems using 2 MB pages                                                             |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | All                                                                                  |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-
-Link status change not working with MSI interrupts
---------------------------------------------------
-
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Title                          | Link status change not working with MSI interrupts                                   |
-|                                |                                                                                      |
-+================================+======================================================================================+
-| Reference #                    | IXA00378191                                                                          |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Description                    | MSI interrupts are not supported by the PMD.                                         |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Implication                    | Link status change will only work with legacy or MSI-X interrupts.                   |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Resolution/ Workaround         | The igb_uio driver can now be loaded with either legacy or MSI-X interrupt support.  |
-|                                | However, this configuration is not tested.                                           |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Affected Environment/ Platform | All                                                                                  |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-| Driver/Module                  | Poll Mode Driver (PMD)                                                               |
-|                                |                                                                                      |
-+--------------------------------+--------------------------------------------------------------------------------------+
-
-KNI does not provide Ethtool support for all NICs supported by the Poll-Mode Drivers
-------------------------------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | KNI does not provide ethtool support for all NICs supported by the Poll Mode Drivers  |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00383835                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | To support ethtool functionality using the KNI, the KNI library includes separate     |
-|                                 | driver code based off the Linux kernel drivers, because this driver code is separate  |
-|                                 | from the poll-mode drivers, the set of supported NICs for these two components may    |
-|                                 | differ.                                                                               |
-|                                 |                                                                                       |
-|                                 | Because of this, in this release, the KNI driver does not provide "ethtool" support   |
-|                                 | for the Intel® Ethernet Connection I354 on the Intel Atom  Processor C2000 product    |
-|                                 | Family SoCs.                                                                          |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | Ethtool support with KNI will not work for NICs such as the Intel® Ethernet           |
-|                                 | Connection I354. Other KNI functionality, such as injecting packets into the Linux    |
-|                                 | kernel is unaffected.                                                                 |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/Workaround           | Updated for Intel® Ethernet Connection I354.                                          |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | Platforms using the Intel® Ethernet Connection I354 or other NICs unsupported by KNI  |
-|                                 | ethtool                                                                               |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | KNI                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-Linux IPv4 forwarding is not stable with vhost-switch on high packet rate
--------------------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | Linux IPv4 forwarding is not stable with vhost-switch on high packet rate.            |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00384430                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | Linux IPv4 forwarding is not stable in Guest when Tx traffic is high from traffic     |
-|                                 | generator using two virtio devices in VM with 10G in host.                            |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | Packets cannot be forwarded by user space vhost-switch and Linux IPv4 forwarding if   |
-|                                 | the rate of  incoming packets is greater than 1 Mpps.                                 |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/Workaround           | N/A                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | Sample application                                                                    |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-PCAP library overwrites mbuf data before data is used
------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | PCAP library overwrites mbuf data before data is used                                 |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00383976                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | PCAP library allocates 64 mbufs for reading packets from PCAP file, but declares them |
-|                                 | as static and reuses the same mbufs repeatedly rather than handing off to the ring    |
-|                                 | for allocation of new mbuf for each read from the PCAP file.                          |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | In multi-threaded applications ata in the mbuf is overwritten.                        |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/Workaround           | Fixed in eth_pcap_rx() in rte_eth_pcap.c                                              |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected  Environment/Platform  | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | Multi-threaded applications using PCAP library                                        |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-MP Client Example app - flushing part of TX is not working for some ports if set specific port mask with skipped ports
-----------------------------------------------------------------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | MP  Client Example app - flushing part of TX is not working for some ports if set     |
-|                                 | specific port mask with skipped ports                                                 |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | 52                                                                                    |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | When ports not in a consecutive set, for example, ports other than ports 0, 1 or      |
-|                                 | 0,1,2,3  are used with the client-service sample app, when no further packets are     |
-|                                 | received by a client, the application may not flush correctly any unsent packets      |
-|                                 | already buffered inside it.                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | Not all buffered packets are transmitted if traffic to the clients application is     |
-|                                 | stopped. While traffic is continually received for transmission on a port by a        |
-|                                 | client, buffer flushing happens normally.                                             |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/Workaround           | Changed line 284 of the client.c file:                                                |
-|                                 |                                                                                       |
-|                                 | from "send_packets(ports);" to "send_packets(ports->id[port]);"                       |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | Client - Server Multi-process Sample application                                      |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-Packet truncation with Intel® I350 Gigabit Ethernet Controller
---------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | Packet truncation with Intel I350 Gigabit Ethernet Controller                         |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00372461                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | The setting of the hw_strip_crc field in the rte_eth_conf structure passed to the     |
-|                                 | rte_eth_dev_configure() function is not respected and hardware CRC stripping is       |
-|                                 | always enabled.                                                                       |
-|                                 | If the field is set to 0, then the software also tries to strip the CRC, resulting    |
-|                                 | in packet truncation.                                                                 |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | The last 4 bytes of the packets received will be missing.                             |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/Workaround           | Fixed an omission in device initialization (setting the  STRCRC bit in the DVMOLR     |
-|                                 | register) to respect the CRC stripping selection correctly.                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | Systems using the Intel® I350 Gigabit Ethernet Controller                             |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | 1 GbE Poll Mode Driver (PMD)                                                          |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-Device initialization failure with Intel® Ethernet Server Adapter X520-T2
--------------------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | Device initialization failure with Intel® Ethernet Server Adapter X520-T2             |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | 55                                                                                    |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | If this device is bound to the Linux kernel IXGBE driver when the DPDK is             |
-|                                 | initialized, DPDK is initialized, the device initialization fails with error code -17 |
-|                                 | “IXGBE_ERR_PHY_ADDR_INVALID”.                                                         |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | The device is not initialized and cannot be used by an application.                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/Workaround           | Introduced a small delay in device initialization to allow DPDK to always find        |
-|                                 | the device.                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | Systems using the Intel® Ethernet Server Adapter X520-T2                              |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | 10 GbE Poll Mode Driver (PMD)                                                         |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-DPDK kernel module is incompatible with Linux kernel version 3.3
-----------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | DPDK kernel module is incompatible with Linux kernel version 3.3                      |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00373232                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | The igb_uio kernel module fails to compile on systems with Linux kernel version 3.3   |
-|                                 | due to API changes in kernel headers                                                  |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | The compilation fails and Ethernet controllers fail to initialize without the igb_uio |
-|                                 | module.                                                                               |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/Workaround           | Kernel functions pci_block_user_cfg_access() / pci_cfg_access_lock() and              |
-|                                 | pci_unblock_user_cfg_access() / pci_cfg_access_unlock() are automatically selected at |
-|                                 | compile time as appropriate.                                                          |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | Linux systems using kernel version 3.3 or later                                       |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | UIO module                                                                            |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-Initialization failure with Intel® Ethernet Controller X540-T2
---------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | Initialization failure with Intel®  Ethernet Controller X540-T2                       |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | 57                                                                                    |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | This device causes a failure during initialization when the software tries to read    |
-|                                 | the part number from the device EPROM.                                                |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | Device cannot be used.                                                                |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/Workaround           | Remove unnecessary check of the PBA number from the device.                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | Systems using the Intel®  Ethernet Controller X540-T2                                 |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | 10 GbE Poll Mode Driver (PMD)                                                         |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-rte_eth_dev_stop() function does not bring down the link for 1 GB NIC ports
----------------------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | rte_eth_dev_stop() function does not bring down the link for 1 GB NIC ports           |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00373183                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | When the rte_eth_dev_stop() function is used to stop a NIC port, the link is not      |
-|                                 | brought down for that port.                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | Links are still reported as up, even though the NIC device has been stopped and       |
-|                                 | cannot perform TX or RX operations on that port.                                      |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution                      | The rte_eth_dev_stop() function now brings down the link when called.                 |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | 1 GbE Poll Mode Driver (PMD)                                                          |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-It is not possible to adjust the duplex setting for 1GB NIC ports
------------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | It is not possible to adjust the duplex setting for 1 GB NIC ports                    |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | 66                                                                                    |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | The rte_eth_conf structure does not have a parameter that allows a port to be set to  |
-|                                 | half-duplex instead of full-duplex mode, therefore, 1 GB NICs cannot be configured    |
-|                                 | explicitly to a full- or half-duplex value.                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | 1 GB port duplex capability cannot be set manually.                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution                      | The PMD now uses a new field added to the rte_eth_conf structure to allow 1 GB ports  |
-|                                 | to be configured explicitly as half- or full-duplex.                                  |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | 1 GbE Poll Mode Driver (PMD)                                                          |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-Calling rte_eth_dev_stop() on a port does not free all the mbufs in use by that port
-------------------------------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | Calling rte_eth_dev_stop() on a port does not free all the mbufs in use by that port  |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | 67                                                                                    |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | The rte_eth_dev_stop() function initially frees all mbufs used by that port’s RX and  |
-|                                 | TX rings, but subsequently repopulates the RX ring again later in the function.       |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | Not all mbufs used by a port are freed when the port is stopped.                      |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution                      | The driver no longer re-populates the RX ring in the rte_eth_dev_stop() function.     |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | IGB and IXGBE Poll Mode Drivers (PMDs)                                                |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-PMD does not always create rings that are properly aligned in memory
---------------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | PMD does not always create rings that are properly aligned in memory                  |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00373158                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | The NIC hardware used by the PMD requires that the RX and TX rings used must be       |
-|                                 | aligned in memory on a 128-byte boundary. The memzone reservation function used       |
-|                                 | inside the PMD only guarantees that the rings are aligned on a 64-byte boundary, so   |
-|                                 | errors can occur if the rings are not aligned on a 128-byte boundary.                 |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | Unintended overwriting of memory can occur and PMD behavior may also be effected.     |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution                      | A new rte_memzone_reserve_aligned() API has been added to allow memory reservations   |
-|                                 | from hugepage memory at alignments other than 64-bytes. The PMD has been modified so  |
-|                                 | that the rings are allocated using this API with minimum alignment of 128-bytes.      |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | IGB and IXGBE Poll Mode Drivers (PMDs)                                                |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-Checksum offload might not work correctly when mixing VLAN-tagged and ordinary packets
---------------------------------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | Checksum offload might not work correctly when mixing VLAN-tagged and ordinary        |
-|                                 | packets                                                                               |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00378372                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | Incorrect handling of protocol header lengths in the PMD driver                       |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | The checksum for one of the packets may be incorrect.                                 |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/Workaround           | Corrected the offset calculation.                                                     |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | Poll Mode Driver (PMD)                                                                |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-Port not found issue with Intel® 82580 Gigabit Ethernet Controller
-------------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | Port not found issue with Intel® 82580 Gigabit Ethernet Controller                    |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | 50                                                                                    |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | After going through multiple driver unbind/bind cycles, an Intel® 82580               |
-|                                 | Ethernet Controller port may no longer be found and initialized by the                |
-|                                 | DPDK.                                                                                 |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | The port will be unusable.                                                            |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/Workaround           | Issue was not reproducible and therefore no longer considered an issue.               |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | 1 GbE Poll Mode Driver (PMD)                                                          |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-Packet mbufs may be leaked from mempool if rte_eth_dev_start() function fails
------------------------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | Packet mbufs may be leaked from mempool if rte_eth_dev_start() function fails         |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00373373                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | The rte_eth_dev_start() function allocates mbufs to populate the NIC RX rings. If the |
-|                                 | start function subsequently fails, these mbufs are not freed back to the memory pool  |
-|                                 | from which they came.                                                                 |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | mbufs may be lost to the system if rte_eth_dev_start() fails and the application does |
-|                                 | not terminate.                                                                        |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/Workaround           | mbufs are correctly deallocated if a call to rte_eth_dev_start() fails.               |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | Poll Mode Driver (PMD)                                                                |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-Promiscuous mode for 82580 NICs can only be enabled after a call to rte_eth_dev_start for a port
-------------------------------------------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | Promiscuous mode for 82580 NICs can only be enabled after a call to rte_eth_dev_start |
-|                                 | for a port                                                                            |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00373833                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | For 82580-based network ports, the rte_eth_dev_start() function can overwrite the     |
-|                                 | setting of the promiscuous mode for the device.                                       |
-|                                 |                                                                                       |
-|                                 | Therefore, the rte_eth_promiscuous_enable() API call should be called after           |
-|                                 | rte_eth_dev_start() for these devices.                                                |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | Promiscuous mode can only be enabled if API calls are in a specific order.            |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/Workaround           | The NIC now restores most of its configuration after a call to rte_eth_dev_start().   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | Poll Mode Driver (PMD)                                                                |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-Incorrect CPU socket information reported in /proc/cpuinfo can prevent the DPDK from running
---------------------------------------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | Incorrect CPU socket information reported in /proc/cpuinfo can prevent the Intel®     |
-|                                 | DPDK from running                                                                     |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | 63                                                                                    |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | The DPDK users information supplied by the Linux  kernel to determine the             |
-|                                 | hardware properties of the system being used. On rare occasions, information supplied |
-|                                 | by /proc/cpuinfo does not match that reported elsewhere. In some cases, it has been   |
-|                                 | observed that the CPU socket numbering given in /proc/cpuinfo is incorrect and this   |
-|                                 | can prevent DPDK from operating.                                                      |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | The DPDK cannot run on systems where /proc/cpuinfo does not report the correct        |
-|                                 | CPU socket topology.                                                                  |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/Workaround           | CPU socket information is now read from /sys/devices/cpu/pcuN/topology                |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | Environment Abstraction Layer (EAL)                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-L3FWD sample application may fail to transmit packets under extreme conditions
-------------------------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | L3FWD sample application may fail to transmit packets under extreme conditions        |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00372919                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | Under very heavy load, the L3 Forwarding sample application may fail to transmit      |
-|                                 | packets due to the system running out of free mbufs.                                  |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | Sending and receiving data with the PMD may fail.                                     |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/ Workaround          | The number of mbufs is now calculated based on application parameters.                |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | L3 Forwarding sample application                                                      |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-L3FWD-VF might lose CRC bytes
------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | L3FWD-VF might lose CRC bytes                                                         |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00373424                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | Currently, the CRC stripping configuration does not affect the VF driver.             |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | Packets transmitted by the DPDK in the VM may be lacking 4 bytes (packet CRC).        |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/ Workaround          | Set “strip_crc” to 1 in the sample applications that use the VF PMD.                  |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | IGB and IXGBE VF Poll Mode Drivers (PMDs)                                             |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-32-bit DPDK sample applications fails when using more than one 1 GB hugepage
-----------------------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | 32-bit Intel®  DPDK sample applications fails when using more than one 1 GB hugepage  |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | 31                                                                                    |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | 32-bit applications may have problems when running with multiple 1 GB pages on a      |
-|                                 | 64-bit OS. This is due to the limited address space available to 32-bit processes.    |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | 32-bit processes need to use either 2 MB pages or have their memory use constrained   |
-|                                 | to 1 GB if using 1 GB pages.                                                          |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution                      | EAL now limits virtual memory to 1 GB per page size.                                  |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | 64-bit systems running 32-bit  Intel®  DPDK with 1 GB hugepages                       |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | Environment Abstraction Layer (EAL)                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-l2fwd fails to launch if the NIC is the Intel® 82571EB Gigabit Ethernet Controller
-----------------------------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | l2fwd fails to launch if the NIC is the Intel® 82571EB Gigabit Ethernet Controller    |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00373340                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | The 82571EB NIC can handle only one TX per port. The original implementation allowed  |
-|                                 | for a more complex handling of multiple queues per port.                              |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | The l2fwd  application fails to launch if the NIC is 82571EB.                         |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution                      | l2fwd now uses only one TX queue.                                                     |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | Sample Application                                                                    |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-32-bit DPDK applications may fail to initialize on 64-bit OS
-------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | 32-bit DPDK applications may fail to initialize on 64-bit OS                          |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00378513                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | The EAL used a 32-bit pointer to deal with physical addresses. This could create      |
-|                                 | problems when the physical address of a hugepage exceeds the 4 GB limit.              |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | 32-bit applications may not initialize on a 64-bit OS.                                |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/Workaround           | The physical address pointer is now 64-bit.                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | 32-bit applications in a 64-bit Linux* environment                                    |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | Environment Abstraction Layer (EAL)                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-Lpm issue when using prefixes > 24
-----------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | Lpm issue when using prefixes > 24                                                    |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00378395                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | Extended tbl8's are overwritten by multiple lpm rule entries when the depth is        |
-|                                 | greater than 24.                                                                      |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | LPM tbl8 entries removed by additional rules.                                         |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/ Workaround          | Adding tbl8 entries to a valid group to avoid making the entire table invalid and     |
-|                                 | subsequently overwritten.                                                             |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | Sample applications                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-IXGBE PMD hangs on port shutdown when not all packets have been sent
---------------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | IXGBE PMD hangs on port shutdown when not all packets have been sent                  |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00373492                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | When the PMD is forwarding packets, and the link goes down, and port shutdown is      |
-|                                 | called, the port cannot shutdown. Instead, it hangs due to the IXGBE driver           |
-|                                 | incorrectly performing the port shutdown procedure.                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | The port cannot shutdown and does not come back up until re-initialized.              |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/Workaround           | The port shutdown procedure  has been rewritten.                                      |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | IXGBE Poll Mode Driver (PMD)                                                          |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-Config file change can cause build to fail
-------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | Config file change can cause build to fail                                            |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00369247                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | If a change in a config file results in some DPDK files that were needed no           |
-|                                 | longer being needed, the build will fail. This is because the \*.o file will still    |
-|                                 | exist, and the linker will try to link it.                                            |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | DPDK compilation failure                                                              |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution                      | The Makefile now provides instructions to clean out old kernel module object files.   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | Load balance sample application                                                       |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-rte_cmdline library should not be used in production code due to limited testing
---------------------------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | rte_cmdline library should not be used in production code due to limited testing      |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | 34                                                                                    |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | The rte_cmdline library provides a command line interface for use in sample           |
-|                                 | applications and test applications distributed as part of DPDK. However, it is        |
-|                                 | not validated to the same standard as other DPDK libraries.                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | It may contain bugs or errors that could cause issues in production applications.     |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution                      | The rte_cmdline library is now tested correctly.                                      |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | rte_cmdline                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-Some \*_INITIALIZER macros are not compatible with C++
-------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | Some \*_INITIALIZER macros are not compatible with C++                                |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00371699                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | These macros do not work with C++ compilers, since they use the C99 method of named   |
-|                                 | field initialization. The TOKEN_*_INITIALIZER macros in librte_cmdline have this      |
-|                                 | problem.                                                                              |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | C++ application using these macros will fail to compile.                              |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/ Workaround          | Macros are now compatible with C++ code.                                              |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | rte_timer, rte_cmdline                                                                |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-No traffic through bridge when using exception_path sample application
-----------------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | No traffic through bridge when using exception_path sample application                |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00168356                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | On some systems, packets are sent from the exception_path to the tap device, but are  |
-|                                 | not forwarded by the bridge.                                                          |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | The sample application does not work as described in its sample application guide.    |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/Workaround           | If you cannot get packets though the bridge, it might be because IP packet filtering  |
-|                                 | rules are up by default on the bridge. In that case you can disable it using the      |
-|                                 | following:                                                                            |
-|                                 |                                                                                       |
-|                                 | # for i in /proc/sys/net/bridge/bridge_nf-\*; do echo 0 > $i; done                    |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | Linux                                                                                 |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | Exception path sample application                                                     |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-Segmentation Fault in testpmd after config fails
-------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | Segmentation Fault in testpmd after config fails                                      |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00378638                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | Starting testpmd with a parameter that causes port queue setup to fail, for example,  |
-|                                 | set TX WTHRESH to non 0 when tx_rs_thresh is greater than 1, then doing               |
-|                                 | “port start all”.                                                                     |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | Seg fault in testpmd                                                                  |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/ Workaround          | Testpmd now forces port reconfiguration if the initial configuration  failed.         |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | Testpmd Sample Application                                                            |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-Linux kernel pci_cfg_access_lock() API can be prone to deadlock
----------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | Linux kernel pci_cfg_access_lock() API can be prone to deadlock                       |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00373232                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | The kernel APIs used for locking in the igb_uio driver can cause a deadlock in        |
-|                                 | certain situations.                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | Unknown at this time; depends on the application.                                     |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/ Workaround          | The igb_uio driver now uses the pci_cfg_access_trylock() function instead of          |
-|                                 | pci_cfg_access_lock().                                                                |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | IGB UIO Driver                                                                        |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-When running multi-process applications, “rte_malloc” functions cannot be used in secondary processes
------------------------------------------------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | When running multi-process applications, “rte_malloc” functions cannot be used in     |
-|                                 | secondary processes                                                                   |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | 35                                                                                    |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | The rte_malloc library provides a set of malloc-type functions that reserve memory    |
-|                                 | from hugepage shared memory. Since secondary processes cannot reserve memory directly |
-|                                 | from hugepage memory, rte_malloc functions cannot be used reliably.                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | The librte_malloc functions, for example, rte_malloc(), rte_zmalloc()                 |
-|                                 | and rte_realloc() cannot be used reliably in secondary processes.                     |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/ Workaround          | In addition to re-entrancy support, the Intel®  DPDK now supports the reservation of  |
-|                                 | a memzone from the primary thread or secondary threads. This is achieved by putting   |
-|                                 | the reservation-related control data structure of the memzone into shared memory.     |
-|                                 | Since rte_malloc functions request memory directly from the memzone, the limitation   |
-|                                 | for secondary threads no longer applies.                                              |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | rte_malloc                                                                            |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-Configuring maximum packet length for IGB with VLAN enabled may not take into account the length of VLAN tag
-------------------------------------------------------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | Configuring maximum packet length for IGB with VLAN enabled may not take into account |
-|                                 | the length of VLAN tag                                                                |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00379880                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | For IGB, the maximum packet length configured may not include the length of the VLAN  |
-|                                 | tag even if VLAN is enabled.                                                          |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | Packets with a VLAN tag with a size close to the maximum may be dropped.              |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/Workaround           | NIC registers are now correctly initialized.                                          |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All with IGB NICs                                                                     |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | IGB Poll Mode Driver (PMD)                                                            |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-Intel® I210 Ethernet controller always strips CRC of incoming packets
----------------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | Intel® I210 Ethernet controller always strips CRC of incoming packets                 |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00380265                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | The Intel® I210 Ethernet  controller (NIC) removes 4 bytes from the end of the packet |
-|                                 | regardless of whether it was configured to do so or not.                              |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | Packets will be missing 4 bytes if the NIC is not configured to strip CRC.            |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/ Workaround          | NIC registers are now  correctly initialized.                                         |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | IGB Poll Mode Driver (PMD)                                                            |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-EAL can silently reserve less memory than requested
----------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | EAL can silently reserve less memory than requested                                   |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00380689                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | During application initialization, the EAL can silently reserve less memory than      |
-|                                 | requested by the user through the -m application option.                              |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | The application fails to start.                                                       |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution                      | EAL will detect if this condition occurs and will give an appropriate error message   |
-|                                 | describing steps to fix the problem.                                                  |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | Environmental Abstraction Layer (EAL)                                                 |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-SSH connectivity with the board may be lost when starting a DPDK application
-----------------------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | SSH connectivity with the board may be lost when starting a DPDK application          |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | 26                                                                                    |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | Currently, the Intel®  DPDK takes over all the NICs found on the board that are       |
-|                                 | supported by the DPDK. This results in these NICs being removed from the NIC          |
-|                                 | set handled by the kernel,which has the side effect of any SSH connection being       |
-|                                 | terminated. See also issue #27.                                                       |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | Loss of network connectivity to board.                                                |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution                      | DPDK now no longer binds ports on startup. Please refer to the Getting Started        |
-|                                 | Guide for information on how to bind/unbind ports from DPDK.                          |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | Systems using a Intel®DPDK supported NIC for remote system access                     |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | Environment Abstraction Layer (EAL)                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-Remote network connections lost when running autotests or sample applications
------------------------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | Remote network connections lost when running autotests or sample applications         |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | 27                                                                                    |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | The PCI autotest and sample applications will scan for PCI devices and will remove    |
-|                                 | from Linux* control those recognized by it. This may result in the loss of network    |
-|                                 | connections to the system.                                                            |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | Loss of network connectivity to board when connected remotely.                        |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution                      | DPDK now no longer binds ports on startup.                                            |
-|                                 | Please refer to the Getting Started Guide for information on how to bind/unbind ports |
-|                                 | from DPDK.                                                                            |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | Systems using a DPDK supported NIC for remote system access                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | Sample applications                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-KNI may not work properly in a multi-process environment
---------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | KNI may not work properly in a multi-process environment                              |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00380475                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | Some of the network interface operations such as, MTU change or link UP/DOWN, when    |
-|                                 | executed on KNI interface, might fail in a multi-process environment, although they   |
-|                                 | are normally successful in the DPDK single process environment.                       |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | Some network interface operations on KNI cannot be used in a DPDK                     |
-|                                 | multi-process environment.                                                            |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution                      | The ifconfig callbacks are now explicitly set in either master or secondary process.  |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | Kernel Network Interface (KNI)                                                        |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-Hash library cannot be used in multi-process applications with multiple binaries
---------------------------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | Hash library cannot be used in multi-process applications with multiple binaries      |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00168658                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | The hash function used by a given hash-table implementation is referenced in the code |
-|                                 | by way of a function pointer. This means that it cannot work in cases where the hash  |
-|                                 | function is at a different location in the code segment in different processes, as is |
-|                                 | the case where a DPDK multi-process application uses a number of different            |
-|                                 | binaries, for example, the client-server multi-process example.                       |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | The Hash library will not work if shared by multiple processes.                       |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/Workaround           | New API was added for multiprocess scenario. Please refer to DPDK Programmer’s        |
-|                                 | Guide for more information.                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | librte_hash library                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-Unused hugepage files are not cleared after initialization
-----------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | Hugepage files are not cleared after initialization                                   |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00383462                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | EAL leaves hugepages allocated at initialization in the hugetlbfs even if they are    |
-|                                 | not used.                                                                             |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | Reserved hugepages are not freed back to the system, preventing other applications    |
-|                                 | that use hugepages from running.                                                      |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/Workaround           | Reserved and unused hugepages are now freed back to the system.                       |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | EAL                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-Packet reception issues when virtualization is enabled
-------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | Packet reception issues when virtualization is enabled                                |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00369908                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | Packets are not transmitted or received on when VT-d is enabled in the BIOS and Intel |
-|                                 | IOMMU is used. More recent kernels do not exhibit this issue.                         |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | An application requiring packet transmission or reception will not function.          |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/Workaround           | DPDK Poll Mode Driver now has the ability to map correct physical addresses to        |
-|                                 | the device structures.                                                                |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | Poll mode drivers                                                                     |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-
-
-
-Double VLAN does not work on Intel® 40GbE Ethernet controller
--------------------------------------------------------------
-
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Title                           | Double VLAN does not work on Intel® 40GbE Ethernet controller                         |
-|                                 |                                                                                       |
-+=================================+=======================================================================================+
-| Reference #                     | IXA00369908                                                                           |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Description                     | On Intel® 40 GbE Ethernet controller double VLAN does not work.                       |
-|                                 | This was confirmed as a Firmware issue which will be fixed in later versions of       |
-|                                 | firmware.                                                                             |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Implication                     | After setting double vlan to be enabled on a port, no packets can be transmitted out  |
-|                                 | on that port.                                                                         |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Resolution/Workaround           | Resolved in latest release with firmware upgrade.                                     |
-|                                 |                                                                                       |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Affected Environment/Platform   | All                                                                                   |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
-| Driver/Module                   | Poll mode drivers                                                                     |
-|                                 |                                                                                       |
-+---------------------------------+---------------------------------------------------------------------------------------+
diff --git a/doc/guides/rel_notes/supported_features.rst b/doc/guides/rel_notes/supported_features.rst
deleted file mode 100644
index 1102b66..0000000
--- a/doc/guides/rel_notes/supported_features.rst
+++ /dev/null
@@ -1,396 +0,0 @@
-..  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.
-
-Supported Features
-==================
-
-*   Packet Distributor library for dynamic, single-packet at a time, load balancing
-
-*   IP fragmentation and reassembly library
-
-*   Support for IPv6 in IP fragmentation and reassembly sample applications
-
-*   Support for VFIO for mapping BARs and setting up interrupts
-
-*   Link Bonding PMD Library supporting round-robin, active backup, balance(layer 2, layer 2+3, and layer 3+4), broadcast bonding modes
-    802.3ad link aggregation (mode 4), transmit load balancing (mode 5) and adaptive load balancing (mode 6)
-
-*   Support zero copy mode RX/TX in user space vhost sample
-
-*   Support multiple queues in virtio-net PMD
-
-*   Support for Intel 40GbE Controllers:
-
-    *   Intel® XL710 40 Gigabit Ethernet Controller
-
-    *   Intel® X710 40 Gigabit Ethernet Controller
-
-*   Support NIC filters in addition to flow director for Intel® 1GbE and 10GbE Controllers
-
-*   Virtualization (KVM)
-
-    *   Userspace vhost switch:
-
-        New sample application to support userspace virtio back-end in host and packet switching between guests.
-
-*   Virtualization (Xen)
-
-    *   Support for DPDK application running on Xen Domain0 without hugepages.
-
-    *   Para-virtualization
-
-        Support front-end Poll Mode Driver in guest domain
-
-        Support userspace packet switching back-end example in host domain
-
-*   FreeBSD* 9.2 support for librte_pmd_e1000, librte_pmd_ixgbe and Virtual Function variants.
-    Please refer to the *DPDK for FreeBSD\* Getting Started Guide*.
-    Application support has been added for the following:
-
-    *   multiprocess/symmetric_mp
-
-    *   multiprocess/simple_mp
-
-    *   l2fwd
-
-    *   l3fwd
-
-*   Support for sharing data over QEMU IVSHMEM
-
-*   Support for Intel® Communications Chipset 8925 to 8955 Series in the DPDK-QAT Sample Application
-
-*   New VMXNET3 driver for the paravirtual device presented to a VM by the VMware* ESXi Hypervisor.
-
-*   BETA: example support for basic Netmap applications on DPDK
-
-*   Support for the wireless KASUMI algorithm in the dpdk_qat sample application
-
-*   Hierarchical scheduler implementing 5-level scheduling hierarchy (port, sub-port, pipe, traffic class, queue)
-    with 64K leaf nodes (packet queues).
-
-*   Packet dropper based on Random Early Detection (RED) congestion control mechanism.
-
-*   Traffic Metering based on Single Rate Three Color Marker (srTCM) and Two Rate Three Color Marker (trTCM).
-
-*   An API for configuring RSS redirection table on the fly
-
-*   An API to support KNI in a multi-process environment
-
-*   IPv6 LPM forwarding
-
-*   Power management library and sample application using CPU frequency scaling
-
-*   IPv4 reassembly sample application
-
-*   Quota & Watermarks sample application
-
-*   PCIe Multi-BAR Mapping Support
-
-*   Support for Physical Functions in Poll Mode Driver for the following devices:
-
-    *   Intel® 82576 Gigabit Ethernet Controller
-
-    *   Intel® i350 Gigabit Ethernet Controller
-
-    *   Intel® 82599 10-Gigabit Ethernet Controller
-
-    *   Intel® XL710/X710 40-Gigabit Ethernet Controller
-
-*   Quality of Service (QoS) Hierarchical Scheduler: Sub-port Traffic Class Oversubscription
-
-*   Multi-thread Kernel NIC Interface (KNI) for performance improvement
-
-*   Virtualization (KVM)
-
-    *   Para-virtualization
-
-        Support virtio front-end poll mode driver in guest virtual machine
-        Support vHost raw socket interface as virtio back-end via KNI
-
-    *   SR-IOV Switching for the 10G Ethernet Controller
-
-        Support Physical Function to start/stop Virtual Function Traffic
-
-        Support Traffic Mirroring (Pool, VLAN, Uplink and Downlink)
-
-        Support VF multiple MAC addresses (Exact/Hash match), VLAN filtering
-
-        Support VF receive mode configuration
-
-*   Support VMDq for 1 GbE and 10 GbE NICs
-
-*   Extension for the Quality of Service (QoS) sample application to allow statistics polling
-
-*   New libpcap  -based poll-mode driver, including support for reading from 3rd Party NICs
-    using Linux kernel drivers
-
-*   New multi-process example using fork() to demonstrate application resiliency and recovery,
-    including reattachment to and re-initialization of shared data structures where necessary
-
-*   New example (vmdq) to demonstrate VLAN-based packet filtering
-
-*   Improved scalability for scheduling large numbers of timers using the rte_timer library
-
-*   Support for building the DPDK as a shared library
-
-*   Support for Intel® Ethernet Server Bypass Adapter X520-SR2
-
-*   Poll Mode Driver support for the Intel®  Ethernet Connection I354 on the Intel®  Atom™ 
-    Processor C2000 Product Family SoCs
-
-*   IPv6 exact match flow classification in the l3fwd sample application
-
-*   Support for multiple instances of the Intel®  DPDK
-
-*   Support for Intel®  82574L Gigabit Ethernet Controller - Intel®  Gigabit CT Desktop Adapter
-    (previously code named "Hartwell")
-
-*   Support for Intel® Ethernet Controller I210 (previously code named "Springville")
-
-*   Early access support for the Quad-port Intel®  Ethernet Server Adapter X520-4 and X520-DA2
-    (code named "Spring Fountain")
-
-*   Support for Intel®  X710/XL710 40 Gigabit Ethernet Controller (code named "Fortville")
-
-*   Core components:
-
-    *   rte_mempool: allocator for fixed-sized objects
-
-    *   rte_ring: single- or multi- consumer/producer queue implementation
-
-    *   rte_timer: implementation of timers
-
-    *   rte_malloc: malloc-like allocator
-
-    *   rte_mbuf: network packet buffers, including fragmented buffers
-
-    *   rte_hash: support for exact-match flow classification in software
-
-    *   rte_lpm: support for longest prefix match in software for IPv4 and IPv6
-
-    *   rte_sched: support for QoS scheduling
-
-    *   rte_meter: support for QoS traffic metering
-
-    *   rte_power: support for  power management
-
-    *   rte_ip_frag: support for IP fragmentation and reassembly
-
-*   Poll Mode Driver - Common (rte_ether)
-
-    *   VLAN support
-
-    *   Support for Receive Side Scaling (RSS)
-
-    *   IEEE1588
-
-    *   Buffer chaining; Jumbo frames
-
-    *   TX checksum calculation
-
-    *   Configuration of promiscuous mode, and multicast packet receive filtering
-
-    *   L2 Mac address filtering
-
-    *   Statistics recording
-
-*   IGB Poll Mode Driver - 1 GbE Controllers (librte_pmd_e1000)
-
-    *   Support for Intel® 82576 Gigabit Ethernet Controller (previously code named "Kawela")
-
-    *   Support for Intel® 82580 Gigabit Ethernet Controller (previously code named "Barton Hills")
-
-    *   Support for Intel®  I350 Gigabit Ethernet Controller (previously code named "Powerville")
-
-    *   Support for Intel® 82574L Gigabit Ethernet Controller - Intel® Gigabit CT Desktop Adapter
-        (previously code named "Hartwell")
-
-    *   Support for Intel® Ethernet Controller I210 (previously code named "Springville")
-
-    *   Support for L2 Ethertype filters, SYN filters, 2-tuple filters and Flex filters for 82580 and i350
-
-    *   Support for L2 Ethertype filters, SYN filters and L3/L4 5-tuple filters for 82576
-
-*   Poll Mode Driver - 10 GbE Controllers (librte_pmd_ixgbe)
-
-    *   Support for Intel® 82599 10 Gigabit Ethernet Controller (previously code named "Niantic")
-
-    *   Support for Intel® Ethernet Server Adapter X520-T2 (previously code named "Iron Pond")
-
-    *   Support for Intel® Ethernet Controller X540-T2 (previously code named "Twin Pond")
-
-    *   Support for Virtual Machine Device Queues (VMDq) and Data Center Bridging (DCB) to divide
-        incoming traffic into 128 RX queues. DCB is also supported for transmitting packets.
-
-    *   Support for auto negotiation down to 1 Gb
-
-    *   Support for Flow Director
-
-    *   Support for L2 Ethertype filters, SYN filters and L3/L4 5-tuple filters for 82599EB
-
-*   Poll Mode Driver - 40 GbE Controllers (librte_pmd_i40e)
-
-    *   Support for Intel® XL710 40 Gigabit Ethernet Controller
-
-    *   Support for Intel® X710 40 Gigabit Ethernet Controller
-
-*   Environment Abstraction Layer (librte_eal)
-
-    *   Multi-process support
-
-    *   Multi-thread support
-
-    *   1 GB and 2 MB page support
-
-    *   Atomic integer operations
-
-    *   Querying CPU support of specific features
-
-    *   High Precision Event Timer support (HPET)
-
-    *   PCI device enumeration and blacklisting
-
-    *   Spin locks and R/W locks
-
-*   Test PMD application
-
-    *   Support for PMD driver testing
-
-*   Test application
-
-    *   Support for core component tests
-
-*   Sample applications
-
-    *   Command Line
-
-    *   Exception Path (into Linux* for packets using the Linux TUN/TAP driver)
-
-    *   Hello World
-
-    *   Integration with Intel® Quick Assist Technology drivers 1.0.0, 1.0.1 and 1.1.0 on Intel® 
-        Communications Chipset 89xx Series C0 and C1 silicon.
-
-    *   Link Status Interrupt (Ethernet* Link Status Detection
-
-    *   IPv4 Fragmentation
-
-    *   IPv4 Multicast
-
-    *   IPv4 Reassembly
-
-    *   L2 Forwarding (supports virtualized and non-virtualized environments)
-
-    *   L2 Forwarding Job Stats
-
-    *   L3 Forwarding (IPv4 and IPv6)
-
-    *   L3 Forwarding in a Virtualized Environment
-
-    *   L3 Forwarding with Power Management
-
-    *   Bonding mode 6
-
-    *   QoS Scheduling
-
-    *   QoS Metering + Dropper
-
-    *   Quota & Watermarks
-
-    *   Load Balancing
-
-    *   Multi-process
-
-    *   Timer
-
-    *   VMDQ and DCB L2 Forwarding
-
-    *   Kernel NIC Interface (with ethtool support)
-
-    *   Userspace vhost switch
-
-*   Interactive command line interface (rte_cmdline)
-
-*   Updated 10 GbE Poll Mode Driver (PMD) to the latest BSD code base providing support of newer
-    ixgbe 10 GbE devices such as the Intel® X520-T2 server Ethernet adapter
-
-*   An API for configuring Ethernet flow control
-
-*   Support for interrupt-based Ethernet link status change detection
-
-*   Support for SR-IOV functions on the Intel® 82599, Intel® 82576 and Intel® i350 Ethernet
-    Controllers in a virtualized environment
-
-*   Improvements to SR-IOV switch configurability on the Intel® 82599 Ethernet Controllers in
-    a virtualized environment.
-
-*   An API for L2 Ethernet Address "whitelist" filtering
-
-*   An API for resetting statistics counters
-
-*   Support for RX L4 (UDP/TCP/SCTP) checksum validation by NIC
-
-*   Support for TX L3 (IPv4/IPv6) and L4 (UDP/TCP/SCTP) checksum calculation offloading
-
-*   Support for IPv4 packet fragmentation and reassembly
-
-*   Support for zero-copy Multicast
-
-*   New APIs to allow the "blacklisting" of specific NIC ports.
-
-*   Header files for common protocols (IP, SCTP, TCP, UDP)
-
-*   Improved multi-process application support, allowing multiple co-operating DPDK
-    processes to access the NIC port queues directly.
-
-*   CPU-specific compiler optimization
-
-*   Job stats library for load/cpu utilization measurements
-
-*   Improvements to the Load Balancing sample application
-
-*   The addition of a PAUSE instruction to tight loops for energy-usage and performance improvements
-
-*   Updated 10 GbE Transmit architecture incorporating new upstream PCIe* optimizations.
-
-*   IPv6 support:
-
-    *   Support in Flow Director Signature Filters and masks
-
-    *   RSS support in sample application that use RSS
-
-    *   Exact match flow classification in the L3 Forwarding sample application
-
-    *   Support in LPM for IPv6 addresses
-
-* Tunneling packet support:
-
-    *   Provide the APIs for VXLAN destination UDP port and VXLAN packet filter configuration
-        and support VXLAN TX checksum offload on Intel® 40GbE Controllers.
diff --git a/doc/guides/rel_notes/supported_os.rst b/doc/guides/rel_notes/supported_os.rst
index c33f731..7ccddbf 100644
--- a/doc/guides/rel_notes/supported_os.rst
+++ b/doc/guides/rel_notes/supported_os.rst
@@ -31,19 +31,19 @@
 Supported Operating Systems
 ===========================
 
-The following Linux* distributions were successfully used to generate or run DPDK.
+The following Linux distributions were successfully used to compiler or run DPDK.
 
-*   FreeBSD* 10
+*   FreeBSD 10
 
 *   Fedora release 20
 
-*   Ubuntu* 14.04 LTS
+*   Ubuntu 14.04 LTS
 
-*   Wind River* Linux* 6
+*   Wind River Linux 6
 
-*   Red Hat* Enterprise Linux 6.5
+*   Red Hat Enterprise Linux 6.5
 
-*   SUSE Enterprise Linux* 11 SP3
+*   SUSE Enterprise Linux 11 SP3
 
 These distributions may need additional packages that are not installed by default, or a specific kernel.
-Refer to the *DPDK Getting Started Guide* for details.
+Refer to the :doc:`/linux_gsg/index` and  :doc:`/freebsd_gsg/index` for details.
diff --git a/doc/guides/rel_notes/updating_apps.rst b/doc/guides/rel_notes/updating_apps.rst
deleted file mode 100644
index b49cb61..0000000
--- a/doc/guides/rel_notes/updating_apps.rst
+++ /dev/null
@@ -1,136 +0,0 @@
-Updating Applications from Previous Versions
-============================================
-
-Although backward compatibility is being maintained across DPDK releases, code written for previous versions of the DPDK
-may require some code updates to benefit from performance and user experience enhancements provided in later DPDK releases.
-
-DPDK 2.0 to DPDK 2.1
---------------------
-
-*   The second argument of rte_pktmbuf_pool_init(mempool, opaque) is now a
-    pointer to a struct rte_pktmbuf_pool_private instead of a uint16_t
-    casted into a pointer. Backward compatibility is preserved when the
-    argument was NULL which is the majority of use cases, but not if the
-    opaque pointer was not NULL, as it is not technically feasible. In
-    this case, the application has to be modified to properly fill a
-    rte_pktmbuf_pool_private structure and pass it to
-    rte_pktmbuf_pool_init().
-
-*   A simpler helper rte_pktmbuf_pool_create() can be used to create a
-    packet mbuf pool. The old way using rte_mempool_create() is still
-    supported though and is still used for more specific cases.
-
-DPDK 1.7 to DPDK 1.8
---------------------
-
-Note that in DPDK 1.8, the structure of the rte_mbuf has changed considerably from all previous versions.
-It is recommended that users familiarize themselves with the new structure defined in the file rte_mbuf.h in the release package.
-The follow are some common changes that need to be made to code using mbufs, following an update to DPDK 1.8:
-
-*   Any references to fields in the pkt or ctrl sub-structures of the mbuf, need to be replaced with references to the field
-    directly from the rte_mbuf, i.e. buf->pkt.data_len should be replace by buf->data_len.
-
-*   Any direct references to the data field of the mbuf (original buf->pkt.data) should now be replace by the macro rte_pktmbuf_mtod
-    to get a computed data address inside the mbuf buffer area.
-
-*   Any references to the in_port mbuf field should be replace by references to the port field.
-
-NOTE: The above list is not exhaustive, but only includes the most commonly required changes to code using mbufs.
-
-Intel® DPDK 1.6 to DPDK 1.7
----------------------------
-
-Note the following difference between 1.6 and 1.7:
-
-*   The "default" target has been renamed to "native"
-
-Intel® DPDK 1.5 to Intel® DPDK 1.6
-----------------------------------
-
-Note the following difference between 1.5 and 1.6:
-
-*   The CONFIG_RTE_EAL _UNBIND_PORTS configuration option, which was deprecated in Intel® DPDK 1.4.x, has been removed in Intel® DPDK 1.6.x.
-    Applications using the Intel® DPDK must be explicitly unbound to the igb_uio driver using the dpdk_nic_bind.py script included in the
-    Intel® DPDK release and documented in the *Intel® DPDK Getting Started Guide*.
-
-Intel® DPDK 1.4 to Intel® DPDK 1.5
-----------------------------------
-
-Note the following difference between 1.4 and 1.5:
-
-*   Starting with version 1.5, the top-level directory created from unzipping the release package will now contain the release version number,
-    that is, DPDK-1.5.2/ rather than just DPDK/ .
-
-Intel® DPDK 1.3 to Intel® DPDK 1.4.x
-------------------------------------
-
-Note the following difference between releases 1.3 and 1.4.x:
-
-*   In Release 1.4.x, Intel® DPDK applications will no longer unbind the network ports from the Linux* kernel driver when the application initializes.
-    Instead, any ports to be used by Intel® DPDK must be unbound from the Linux driver and bound to the igb_uio driver before the application starts.
-    This can be done using the pci_unbind.py script included with the Intel® DPDK release and documented in the *Intel® DPDK Getting Started Guide*.
-
-    If the port unbinding behavior present in previous Intel® DPDK releases is required, this can be re-enabled using the CONFIG_RTE_EAL_UNBIND_PORTS
-    setting in the appropriate Intel® DPDK compile-time configuration file.
-
-*   In Release 1.4.x, HPET support is disabled in the Intel® DPDK build configuration files, which means that the existing rte_eal_get_hpet_hz() and
-    rte_eal_get_hpet_cycles() APIs are not available by default.
-    For applications that require timing APIs, but not the HPET timer specifically, it is recommended that the API calls rte_get_timer_cycles()
-    and rte_get_timer_hz() be used instead of the HPET-specific APIs.
-    These generic APIs can work with either TSC or HPET time sources, depending on what is requested by an application,
-    and on what is available on the system at runtime.
-
-    For more details on this and how to re-enable the HPET if it is needed, please consult the *Intel® DPDK Getting Started Guide*.
-
-Intel® DPDK 1.2 to Intel® DPDK 1.3
-----------------------------------
-
-Note the following difference between releases 1.2 and 1.3:
-
-*   In release 1.3, the Intel® DPDK supports two different 1 GbE drivers: igb and em.
-    Both of them are located in the same library: lib_pmd_e1000.a.
-    Therefore, the name of the library to link with for the igb PMD has changed from librte_pmd_igb.a to librte_pmd_e1000.a.
-
-*   The rte_common.h macros, RTE_ALIGN, RTE_ALIGN_FLOOR and RTE_ALIGN_CEIL were renamed to, RTE_PTR_ALIGN, RTE_PTR_ALIGN_FLOOR
-    and RTE_PTR_ALIGN_CEIL.
-    The original macros are still available but they have different behavior.
-    Not updating the macros results in strange compilation errors.
-
-*   The rte_tailq is now defined statically. The rte_tailq APIs have also been changed from being public to internal use only.
-    The old public APIs are maintained for backward compatibility reasons. Details can be found in the *Intel® DPDK API Reference*.
-
-*   The method for managing mbufs on the NIC RX rings has been modified to improve performance.
-    To allow applications to use the newer, more optimized, code path,
-    it is recommended that the rx_free_thresh field in the rte_eth_conf structure,
-    which is passed to the Poll Mode Driver when initializing a network port, be set to a value of 32.
-
-Intel® DPDK 1.1 to Intel® DPDK 1.2
-----------------------------------
-
-Note the following difference between release 1.1 and release 1.2:
-
-*   The names of the 1G and 10G Ethernet drivers have changed between releases 1.1 and 1.2. While the old driver names still work,
-    it is recommended that code be updated to the new names, since the old names are deprecated and may be removed in a future
-    release.
-
-    The items affected are as follows:
-
-    *   Any macros referring to RTE_LIBRTE_82576_PMD should be updated to refer to RTE_LIBRTE_IGB_PMD.
-
-    *   Any macros referring to RTE_LIBRTE_82599_PMD should be updated to refer to RTE_LIBRTE_IXGBE_PMD.
-
-    *   Any calls to the rte_82576_pmd_init() function should be replaced by calls to rte_igb_pmd_init().
-
-    *   Any calls to the rte_82599_pmd_init() function should be replaced by calls to rte_ixgbe_pmd_init().
-
-*   The method used for managing mbufs on the NIC TX rings for the 10 GbE driver has been modified to improve performance.
-    As a result, different parameter values should be passed to the rte_eth_tx_queue_setup() function.
-    The recommended default values are to have tx_thresh.tx_wthresh, tx_free_thresh,
-    as well as the new parameter tx_rs_thresh (all in the struct rte_eth_txconf datatype) set to zero.
-    See the "Configuration of Transmit and Receive Queues" section in the *Intel® DPDK Programmer's Guide* for more details.
-
-.. note::
-
-    If the tx_free_thresh field is set to TX_RING_SIZE+1 , as was previously used in some cases to disable free threshold check,
-    then an error is generated at port initialization time.
-    To avoid this error, configure the TX threshold values as suggested above.
-- 
1.8.1.4

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for old flow director APIs removing
  2015-08-11  2:12  7% [dpdk-dev] [PATCH] doc: announce ABI change for old flow director APIs removing Jingjing Wu
  2015-08-11  3:01  4% ` Zhang, Helin
@ 2015-08-11  5:41  4% ` Liu, Jijiang
  1 sibling, 0 replies; 200+ results
From: Liu, Jijiang @ 2015-08-11  5:41 UTC (permalink / raw)
  To: Wu, Jingjing, dev



> -----Original Message-----
> From: Wu, Jingjing
> Sent: Tuesday, August 11, 2015 10:12 AM
> To: dev@dpdk.org
> Cc: Wu, Jingjing; Zhang, Helin; Liu, Jijiang
> Subject: [PATCH] doc: announce ABI change for old flow director APIs removing
> 
> APIs for flow director filters has been replaced by rte_eth_dev_filter_ctrl by
> previous releases. Enic, ixgbe and i40e are switched to support filter_ctrl APIs,
> so the old APIs are useless, and ready to be removed now.
> This patch announces the ABI change for these APIs removing.
> 
> Signed-off-by: Jingjing Wu <jingjing.wu@intel.com>
Acked-by: Jijiang Liu <jijiang.liu@intel.com>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for old flow director APIs removing
  2015-08-11  2:12  7% [dpdk-dev] [PATCH] doc: announce ABI change for old flow director APIs removing Jingjing Wu
@ 2015-08-11  3:01  4% ` Zhang, Helin
  2015-08-12  9:02  4%   ` Thomas Monjalon
  2015-08-11  5:41  4% ` Liu, Jijiang
  1 sibling, 1 reply; 200+ results
From: Zhang, Helin @ 2015-08-11  3:01 UTC (permalink / raw)
  To: Wu, Jingjing, dev



> -----Original Message-----
> From: Wu, Jingjing
> Sent: Monday, August 10, 2015 7:12 PM
> To: dev@dpdk.org
> Cc: Wu, Jingjing; Zhang, Helin; Liu, Jijiang
> Subject: [PATCH] doc: announce ABI change for old flow director APIs removing
> 
> APIs for flow director filters has been replaced by rte_eth_dev_filter_ctrl by
> previous releases. Enic, ixgbe and i40e are switched to support filter_ctrl APIs, so
> the old APIs are useless, and ready to be removed now.
> This patch announces the ABI change for these APIs removing.
> 
> Signed-off-by: Jingjing Wu <jingjing.wu@intel.com>
Acked-by: Helin Zhang <helin.zhang@intel.com>

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH] doc: announce ABI change for old flow director APIs removing
@ 2015-08-11  2:12  7% Jingjing Wu
  2015-08-11  3:01  4% ` Zhang, Helin
  2015-08-11  5:41  4% ` Liu, Jijiang
  0 siblings, 2 replies; 200+ results
From: Jingjing Wu @ 2015-08-11  2:12 UTC (permalink / raw)
  To: dev

APIs for flow director filters has been replaced by rte_eth_dev_filter_ctrl
by previous releases. Enic, ixgbe and i40e are switched to support filter_ctrl
APIs, so the old APIs are useless, and ready to be removed now.
This patch announces the ABI change for these APIs removing.

Signed-off-by: Jingjing Wu <jingjing.wu@intel.com>
---
 doc/guides/rel_notes/deprecation.rst | 36 ++++++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 5330d3b..b1be38f 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -35,3 +35,39 @@ Deprecation Notices
 * The following fields have been deprecated in rte_eth_stats:
   imissed, ibadcrc, ibadlen, imcasts, fdirmatch, fdirmiss,
   tx_pause_xon, rx_pause_xon, tx_pause_xoff, rx_pause_xoff
+
+* APIs for flow director filters has been replaced by rte_eth_dev_filter_ctrl.
+  Following old APIs, and data structures are deprecated and will be removed
+  with version 2.2. There is no backward compatibility planned from release 2.2.
+  APIs:
+    rte_eth_dev_fdir_add_signature_filter
+    rte_eth_dev_fdir_update_signature_filter
+    rte_eth_dev_fdir_remove_signature_filter
+    rte_eth_dev_fdir_get_infos
+    rte_eth_dev_fdir_add_perfect_filter
+    rte_eth_dev_fdir_update_perfect_filter
+    rte_eth_dev_fdir_remove_perfect_filter
+    rte_eth_dev_fdir_set_masks
+  Data structures:
+    struct rte_fdir_filter
+    struct rte_fdir_masks
+    struct rte_eth_fdir
+    fields in struct eth_dev_ops
+      fdir_add_signature_filter
+      fdir_update_signature_filter
+      fdir_remove_signature_filter
+      fdir_infos_get
+      fdir_add_perfect_filter
+      fdir_update_perfect_filter
+      fdir_remove_perfect_filter
+      fdir_set_masks
+    enum rte_l4type
+    enum rte_iptype
+    fdir_add_signature_filter_t
+    fdir_update_signature_filter_t
+    fdir_remove_signature_filter_t
+    fdir_infos_get_t
+    fdir_add_perfect_filter_t
+    fdir_update_perfect_filter_t
+    fdir_remove_perfect_filter_t
+    fdir_set_masks_t
-- 
2.4.0

^ permalink raw reply	[relevance 7%]

* Re: [dpdk-dev] [PATCH v2] doc: announce ABI change of rte_eth_fdir_filter, rte_eth_fdir_masks
    2015-08-04  8:54  7%   ` Mcnamara, John
@ 2015-08-04  8:56  4%   ` Mcnamara, John
  2015-08-12 14:19  4%     ` Thomas Monjalon
  1 sibling, 1 reply; 200+ results
From: Mcnamara, John @ 2015-08-04  8:56 UTC (permalink / raw)
  To: Lu, Wenzhuo, dev

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Wenzhuo Lu
> Sent: Friday, July 10, 2015 3:24 AM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v2] doc: announce ABI change of
> rte_eth_fdir_filter, rte_eth_fdir_masks
> 
> For x550 supports 2 new flow director modes, MAC VLAN and Cloud. The MAC
> VLAN mode means the MAC and VLAN are monitored. The Cloud mode is for
> VxLAN and NVGRE, and the tunnel type, TNI/VNI, inner MAC and inner VLAN
> are monitored. So, there're a few new lookup fields for these 2 new modes,
> like MAC, tunnel type, TNI/VNI. We have to change the ABI to support these
> new lookup fields.
> 
> v2 changes:
> * Correct the names of the structures.
> * Wrap the words.
> * Add explanation for the new modes.
> 
> Signed-off-by: Wenzhuo Lu <wenzhuo.lu@intel.com>

Acked-by: John McNamara <john.mcnamara@intel.com>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for rte_eth_fdir_filter
  2015-07-20  7:03 13% [dpdk-dev] [PATCH] doc: announce ABI change for rte_eth_fdir_filter Jingjing Wu
  2015-07-28  8:22  4% ` Lu, Wenzhuo
  2015-07-30  3:38  4% ` Liang, Cunming
@ 2015-08-04  8:52  4% ` Mcnamara, John
  2015-08-12 10:38  4%   ` Thomas Monjalon
  2015-08-04  8:53  4% ` Mcnamara, John
  3 siblings, 1 reply; 200+ results
From: Mcnamara, John @ 2015-08-04  8:52 UTC (permalink / raw)
  To: Wu, Jingjing, dev

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Jingjing Wu
> Sent: Monday, July 20, 2015 8:04 AM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH] doc: announce ABI change for
> rte_eth_fdir_filter
> 
> To fix the FVL's flow director issue for SCTP flow, rte_eth_fdir_filter
> need to be change to support SCTP flow keys extension. Here announce the
> ABI deprecation.
> 
> Signed-off-by: jingjing.wu <jingjing.wu@intel.com>

Acked-by: John McNamara <john.mcnamara@intel.com>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v2] doc: announce ABI change of rte_eth_fdir_filter, rte_eth_fdir_masks
  @ 2015-08-04  8:54  7%   ` Mcnamara, John
  2015-08-04  8:56  4%   ` Mcnamara, John
  1 sibling, 0 replies; 200+ results
From: Mcnamara, John @ 2015-08-04  8:54 UTC (permalink / raw)
  To: Lu, Wenzhuo, dev

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Wenzhuo Lu
> Sent: Friday, July 10, 2015 3:24 AM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v2] doc: announce ABI change of
> rte_eth_fdir_filter, rte_eth_fdir_masks
> 
> For x550 supports 2 new flow director modes, MAC VLAN and Cloud. The MAC
> VLAN mode means the MAC and VLAN are monitored. The Cloud mode is for
> VxLAN and NVGRE, and the tunnel type, TNI/VNI, inner MAC and inner VLAN
> are monitored. So, there're a few new lookup fields for these 2 new modes,
> like MAC, tunnel type, TNI/VNI. We have to change the ABI to support these
> new lookup fields.
> 
> v2 changes:
> * Correct the names of the structures.
> * Wrap the words.
> * Add explanation for the new modes.
> 
> Signed-off-by: Wenzhuo Lu <wenzhuo.lu@intel.com>

doc: announce ABI change of rte_eth_fdir_filter

^ permalink raw reply	[relevance 7%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for rte_eth_fdir_filter
  2015-07-20  7:03 13% [dpdk-dev] [PATCH] doc: announce ABI change for rte_eth_fdir_filter Jingjing Wu
                   ` (2 preceding siblings ...)
  2015-08-04  8:52  4% ` Mcnamara, John
@ 2015-08-04  8:53  4% ` Mcnamara, John
  3 siblings, 0 replies; 200+ results
From: Mcnamara, John @ 2015-08-04  8:53 UTC (permalink / raw)
  To: Wu, Jingjing, dev

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Jingjing Wu
> Sent: Monday, July 20, 2015 8:04 AM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH] doc: announce ABI change for
> rte_eth_fdir_filter
> 
> To fix the FVL's flow director issue for SCTP flow, rte_eth_fdir_filter
> need to be change to support SCTP flow keys extension. Here announce the
> ABI deprecation.
> 
> Signed-off-by: jingjing.wu <jingjing.wu@intel.com>

Acked-by: John McNamara <john.mcnamara@intel.com>

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [dpdk-announce] release candidate 2.1.0-rc3
@ 2015-08-03 22:47  4% Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-08-03 22:47 UTC (permalink / raw)
  To: announce

A new DPDK release candidate is ready for testing:
	http://dpdk.org/browse/dpdk/tag/?id=v2.1.0-rc3

We are very close to the major release 2.1.
The next release candidate should include mostly some doc updates,
and especially patches for the release notes.

Changelog (main changes since 2.1.0-rc2)
	- enhancements:
		* check mbuf private area alignment
		* ixgbe vector support more offload flags
	- fixes for:
		* build
		* ABI
		* logs
		* socket number without NUMA
		* hash crash
		* lpm depth small entry
		* timer race condition
		* ppc timer little endian
		* ieee1588 timestamping
		* mbuf private size odd
		* ixgbe big endian
		* ixgbe scalar Rx
		* ixgbe vector Rx
		* ixgbe stats
		* i40evf crash
		* fm10k queue disabling
		* mlx4 dependency

Please help to check the ABI and the release notes.

Thank you

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code
  2015-08-03  8:41  8%               ` Thomas Monjalon
@ 2015-08-03 12:53  7%                 ` Neil Horman
  0 siblings, 0 replies; 200+ results
From: Neil Horman @ 2015-08-03 12:53 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Mon, Aug 03, 2015 at 10:41:47AM +0200, Thomas Monjalon wrote:
> Chao,
> The original need was to check with the ABI checker tool that the ABI
> was not broken on POWER BE by this patch.
> 
Yes, its not compilation thats the concern, its ABI compatibility.

Neil

> 
> 2015-08-03 11:45, Chao Zhu:
> > Confirmed. It can compile on Power8 Big Endian.
> > Thank you!
> > 
> > On 2015/8/3 10:39, Chao Zhu wrote:
> > >
> > > Really sorry for the delay.
> > > Originally, I thought the email was to asking the ABI checking tools 
> > > on Power which I'm not so familiar with.  So this took me some time to 
> > > find solution. For Power little endian, the build is OK. I'll give 
> > > feedback when I tried Big  endian compilation.
> 
> [...]
> 
> > >>>>>> I presume the ABI checker stopped complaining about this with the
> > >>>>>> patch, yes?
> > >>>>> Hi Neil,
> > >>>>>
> > >>>>> Yes, I replied about that in the previous thread.
> > >>>>>
> > >>>> Thank you, I'll ack as soon as Chao confirms its not a problem on 
> > >>>> ppc Neil
> 
> 

^ permalink raw reply	[relevance 7%]

* Re: [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code
  2015-08-03  3:45  4%             ` Chao Zhu
@ 2015-08-03  8:41  8%               ` Thomas Monjalon
  2015-08-03 12:53  7%                 ` Neil Horman
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2015-08-03  8:41 UTC (permalink / raw)
  To: Chao Zhu; +Cc: dev

Chao,
The original need was to check with the ABI checker tool that the ABI
was not broken on POWER BE by this patch.


2015-08-03 11:45, Chao Zhu:
> Confirmed. It can compile on Power8 Big Endian.
> Thank you!
> 
> On 2015/8/3 10:39, Chao Zhu wrote:
> >
> > Really sorry for the delay.
> > Originally, I thought the email was to asking the ABI checking tools 
> > on Power which I'm not so familiar with.  So this took me some time to 
> > find solution. For Power little endian, the build is OK. I'll give 
> > feedback when I tried Big  endian compilation.

[...]

> >>>>>> I presume the ABI checker stopped complaining about this with the
> >>>>>> patch, yes?
> >>>>> Hi Neil,
> >>>>>
> >>>>> Yes, I replied about that in the previous thread.
> >>>>>
> >>>> Thank you, I'll ack as soon as Chao confirms its not a problem on 
> >>>> ppc Neil

^ permalink raw reply	[relevance 8%]

* Re: [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code
  2015-08-03  2:39  7%           ` Chao Zhu
@ 2015-08-03  3:45  4%             ` Chao Zhu
  2015-08-03  8:41  8%               ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Chao Zhu @ 2015-08-03  3:45 UTC (permalink / raw)
  To: nhorman, thomas.monjalon, Mcnamara, John; +Cc: dev

Confirmed. It can compile on Power8 Big Endian.
Thank you!

On 2015/8/3 10:39, Chao Zhu wrote:
>
> Really sorry for the delay.
> Originally, I thought the email was to asking the ABI checking tools 
> on Power which I'm not so familiar with.  So this took me some time to 
> find solution. For Power little endian, the build is OK. I'll give 
> feedback when I tried Big  endian compilation.
>
> On 2015/7/31 18:34, Neil Horman wrote:
>> On Fri, Jul 31, 2015 at 09:03:45AM +0000, Mcnamara, John wrote:
>>>> -----Original Message-----
>>>> From: Neil Horman [mailto:nhorman@tuxdriver.com]
>>>> Sent: Monday, July 13, 2015 3:00 PM
>>>> To: Mcnamara, John
>>>> Cc: dev@dpdk.org; vladz@cloudius-systems.com
>>>> Subject: Re: [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code
>>>>
>>>> On Mon, Jul 13, 2015 at 10:47:03AM +0000, Mcnamara, John wrote:
>>>>>> -----Original Message-----
>>>>>> From: Neil Horman [mailto:nhorman@tuxdriver.com]
>>>>>> Sent: Monday, July 13, 2015 11:42 AM
>>>>>> To: Mcnamara, John
>>>>>> Cc: dev@dpdk.org; vladz@cloudius-systems.com
>>>>>> Subject: Re: [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code
>>>>>>
>>>>>> On Mon, Jul 13, 2015 at 11:26:25AM +0100, John McNamara wrote:
>>>>>>> Fix for ABI breakage introduced in LRO addition. Moves lro
>>>>>>> bitfield to the end of the struct/member.
>>>>>>>
>>>>>>> Fixes: 8eecb3295aed (ixgbe: add LRO support)
>>>>>>>
>>>>>>> Signed-off-by: John McNamara <john.mcnamara@intel.com>
>>>>>>> ---
>>>>>>>   lib/librte_ether/rte_ethdev.h | 4 ++--
>>>>>>>   1 file changed, 2 insertions(+), 2 deletions(-)
>>>>>>>
>>>>>>> diff --git a/lib/librte_ether/rte_ethdev.h
>>>>>>> b/lib/librte_ether/rte_ethdev.h index 79bde89..1c3ace1 100644
>>>>>>> --- a/lib/librte_ether/rte_ethdev.h
>>>>>>> +++ b/lib/librte_ether/rte_ethdev.h
>>>>>>> @@ -1578,9 +1578,9 @@ struct rte_eth_dev_data {
>>>>>>>       uint8_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) */
>>>>>>> -        lro          : 1, /**< RX LRO 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).
>>>>>> */
>>>>>>> +        dev_started : 1, /**< Device state: STARTED(1) /
>>>> STOPPED(0).
>>>>>> */
>>>>>>> +        lro         : 1; /**< RX LRO is ON(1) / OFF(0) */
>>>>>>>   };
>>>>>>>
>>>>>>>   /**
>>>>>>> -- 
>>>>>>> 1.8.1.4
>>>>>>>
>>>>>>>
>>>>>> I presume the ABI checker stopped complaining about this with the
>>>>>> patch, yes?
>>>>> Hi Neil,
>>>>>
>>>>> Yes, I replied about that in the previous thread.
>>>>>
>>>> Thank you, I'll ack as soon as Chao confirms its not a problem on 
>>>> ppc Neil
>>> Hi Chao,
>>>
>>> Any reply on this.
>>>
>>> Neil, if there is no reply to this from the PPC maintainer do you 
>>> have any objection to this going in as is.
>>>
>>> It at least fixes the LRO ABI breakage on the platforms we can test on.
>>>
>>> John
>>>
>> Well, I suppose at this point the only thing its hurting is ppc, so 
>> no, no
>> objections.  But its pretty disheartening for an arch maintainer to 
>> dissappear
>> so soon after adding arch support.
>>
>> Neil
>>
>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code
  2015-07-31 10:34  4%         ` Neil Horman
@ 2015-08-03  2:39  7%           ` Chao Zhu
  2015-08-03  3:45  4%             ` Chao Zhu
  0 siblings, 1 reply; 200+ results
From: Chao Zhu @ 2015-08-03  2:39 UTC (permalink / raw)
  To: nhorman, thomas.monjalon, Mcnamara, John; +Cc: dev


Really sorry for the delay.
Originally, I thought the email was to asking the ABI checking tools on 
Power which I'm not so familiar with.  So this took me some time to find 
solution. For Power little endian, the build is OK. I'll give feedback 
when I tried Big  endian compilation.

On 2015/7/31 18:34, Neil Horman wrote:
> On Fri, Jul 31, 2015 at 09:03:45AM +0000, Mcnamara, John wrote:
>>> -----Original Message-----
>>> From: Neil Horman [mailto:nhorman@tuxdriver.com]
>>> Sent: Monday, July 13, 2015 3:00 PM
>>> To: Mcnamara, John
>>> Cc: dev@dpdk.org; vladz@cloudius-systems.com
>>> Subject: Re: [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code
>>>
>>> On Mon, Jul 13, 2015 at 10:47:03AM +0000, Mcnamara, John wrote:
>>>>> -----Original Message-----
>>>>> From: Neil Horman [mailto:nhorman@tuxdriver.com]
>>>>> Sent: Monday, July 13, 2015 11:42 AM
>>>>> To: Mcnamara, John
>>>>> Cc: dev@dpdk.org; vladz@cloudius-systems.com
>>>>> Subject: Re: [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code
>>>>>
>>>>> On Mon, Jul 13, 2015 at 11:26:25AM +0100, John McNamara wrote:
>>>>>> Fix for ABI breakage introduced in LRO addition. Moves lro
>>>>>> bitfield to the end of the struct/member.
>>>>>>
>>>>>> Fixes: 8eecb3295aed (ixgbe: add LRO support)
>>>>>>
>>>>>> Signed-off-by: John McNamara <john.mcnamara@intel.com>
>>>>>> ---
>>>>>>   lib/librte_ether/rte_ethdev.h | 4 ++--
>>>>>>   1 file changed, 2 insertions(+), 2 deletions(-)
>>>>>>
>>>>>> diff --git a/lib/librte_ether/rte_ethdev.h
>>>>>> b/lib/librte_ether/rte_ethdev.h index 79bde89..1c3ace1 100644
>>>>>> --- a/lib/librte_ether/rte_ethdev.h
>>>>>> +++ b/lib/librte_ether/rte_ethdev.h
>>>>>> @@ -1578,9 +1578,9 @@ struct rte_eth_dev_data {
>>>>>>   	uint8_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) */
>>>>>> -		lro          : 1,  /**< RX LRO 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).
>>>>> */
>>>>>> +		dev_started : 1,   /**< Device state: STARTED(1) /
>>> STOPPED(0).
>>>>> */
>>>>>> +		lro         : 1;   /**< RX LRO is ON(1) / OFF(0) */
>>>>>>   };
>>>>>>
>>>>>>   /**
>>>>>> --
>>>>>> 1.8.1.4
>>>>>>
>>>>>>
>>>>> I presume the ABI checker stopped complaining about this with the
>>>>> patch, yes?
>>>> Hi Neil,
>>>>
>>>> Yes, I replied about that in the previous thread.
>>>>
>>> Thank you, I'll ack as soon as Chao confirms its not a problem on ppc Neil
>> Hi Chao,
>>
>> Any reply on this.
>>
>> Neil, if there is no reply to this from the PPC maintainer do you have any objection to this going in as is.
>>
>> It at least fixes the LRO ABI breakage on the platforms we can test on.
>>
>> John
>>
> Well, I suppose at this point the only thing its hurting is ppc, so no, no
> objections.  But its pretty disheartening for an arch maintainer to dissappear
> so soon after adding arch support.
>
> Neil
>

^ permalink raw reply	[relevance 7%]

* Re: [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code
  2015-07-16 22:22  4% ` Vlad Zolotarov
@ 2015-08-02 21:06  7%   ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-08-02 21:06 UTC (permalink / raw)
  To: John McNamara; +Cc: dev

2015-07-17 01:22, Vlad Zolotarov:
> On 07/13/15 13:26, John McNamara wrote:
> > Fix for ABI breakage introduced in LRO addition. Moves
> > lro bitfield to the end of the struct/member.
> >
> > Fixes: 8eecb3295aed (ixgbe: add LRO support)
> >
> > Signed-off-by: John McNamara <john.mcnamara@intel.com>
> 
> Acked-by: Vlad Zolotarov <vladz@cloudius-systems.com>

Applied, thanks

We still don't know if POWER Big Endian ABI is broken.

^ permalink raw reply	[relevance 7%]

* Re: [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code
  2015-07-31  9:03  7%       ` Mcnamara, John
@ 2015-07-31 10:34  4%         ` Neil Horman
  2015-08-03  2:39  7%           ` Chao Zhu
  0 siblings, 1 reply; 200+ results
From: Neil Horman @ 2015-07-31 10:34 UTC (permalink / raw)
  To: Mcnamara, John; +Cc: dev

On Fri, Jul 31, 2015 at 09:03:45AM +0000, Mcnamara, John wrote:
> > -----Original Message-----
> > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > Sent: Monday, July 13, 2015 3:00 PM
> > To: Mcnamara, John
> > Cc: dev@dpdk.org; vladz@cloudius-systems.com
> > Subject: Re: [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code
> > 
> > On Mon, Jul 13, 2015 at 10:47:03AM +0000, Mcnamara, John wrote:
> > > > -----Original Message-----
> > > > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > > > Sent: Monday, July 13, 2015 11:42 AM
> > > > To: Mcnamara, John
> > > > Cc: dev@dpdk.org; vladz@cloudius-systems.com
> > > > Subject: Re: [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code
> > > >
> > > > On Mon, Jul 13, 2015 at 11:26:25AM +0100, John McNamara wrote:
> > > > > Fix for ABI breakage introduced in LRO addition. Moves lro
> > > > > bitfield to the end of the struct/member.
> > > > >
> > > > > Fixes: 8eecb3295aed (ixgbe: add LRO support)
> > > > >
> > > > > Signed-off-by: John McNamara <john.mcnamara@intel.com>
> > > > > ---
> > > > >  lib/librte_ether/rte_ethdev.h | 4 ++--
> > > > >  1 file changed, 2 insertions(+), 2 deletions(-)
> > > > >
> > > > > diff --git a/lib/librte_ether/rte_ethdev.h
> > > > > b/lib/librte_ether/rte_ethdev.h index 79bde89..1c3ace1 100644
> > > > > --- a/lib/librte_ether/rte_ethdev.h
> > > > > +++ b/lib/librte_ether/rte_ethdev.h
> > > > > @@ -1578,9 +1578,9 @@ struct rte_eth_dev_data {
> > > > >  	uint8_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) */
> > > > > -		lro          : 1,  /**< RX LRO 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).
> > > > */
> > > > > +		dev_started : 1,   /**< Device state: STARTED(1) /
> > STOPPED(0).
> > > > */
> > > > > +		lro         : 1;   /**< RX LRO is ON(1) / OFF(0) */
> > > > >  };
> > > > >
> > > > >  /**
> > > > > --
> > > > > 1.8.1.4
> > > > >
> > > > >
> > > > I presume the ABI checker stopped complaining about this with the
> > > > patch, yes?
> > >
> > > Hi Neil,
> > >
> > > Yes, I replied about that in the previous thread.
> > >
> > Thank you, I'll ack as soon as Chao confirms its not a problem on ppc Neil
> 
> Hi Chao,
> 
> Any reply on this.
> 
> Neil, if there is no reply to this from the PPC maintainer do you have any objection to this going in as is. 
> 
> It at least fixes the LRO ABI breakage on the platforms we can test on.
> 
> John
> 
Well, I suppose at this point the only thing its hurting is ppc, so no, no
objections.  But its pretty disheartening for an arch maintainer to dissappear
so soon after adding arch support.

Neil

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code
  2015-07-13 13:59  4%     ` Neil Horman
  2015-07-17 11:45  7%       ` Mcnamara, John
@ 2015-07-31  9:03  7%       ` Mcnamara, John
  2015-07-31 10:34  4%         ` Neil Horman
  1 sibling, 1 reply; 200+ results
From: Mcnamara, John @ 2015-07-31  9:03 UTC (permalink / raw)
  To: Neil Horman, Chao Zhu; +Cc: dev

> -----Original Message-----
> From: Neil Horman [mailto:nhorman@tuxdriver.com]
> Sent: Monday, July 13, 2015 3:00 PM
> To: Mcnamara, John
> Cc: dev@dpdk.org; vladz@cloudius-systems.com
> Subject: Re: [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code
> 
> On Mon, Jul 13, 2015 at 10:47:03AM +0000, Mcnamara, John wrote:
> > > -----Original Message-----
> > > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > > Sent: Monday, July 13, 2015 11:42 AM
> > > To: Mcnamara, John
> > > Cc: dev@dpdk.org; vladz@cloudius-systems.com
> > > Subject: Re: [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code
> > >
> > > On Mon, Jul 13, 2015 at 11:26:25AM +0100, John McNamara wrote:
> > > > Fix for ABI breakage introduced in LRO addition. Moves lro
> > > > bitfield to the end of the struct/member.
> > > >
> > > > Fixes: 8eecb3295aed (ixgbe: add LRO support)
> > > >
> > > > Signed-off-by: John McNamara <john.mcnamara@intel.com>
> > > > ---
> > > >  lib/librte_ether/rte_ethdev.h | 4 ++--
> > > >  1 file changed, 2 insertions(+), 2 deletions(-)
> > > >
> > > > diff --git a/lib/librte_ether/rte_ethdev.h
> > > > b/lib/librte_ether/rte_ethdev.h index 79bde89..1c3ace1 100644
> > > > --- a/lib/librte_ether/rte_ethdev.h
> > > > +++ b/lib/librte_ether/rte_ethdev.h
> > > > @@ -1578,9 +1578,9 @@ struct rte_eth_dev_data {
> > > >  	uint8_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) */
> > > > -		lro          : 1,  /**< RX LRO 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).
> > > */
> > > > +		dev_started : 1,   /**< Device state: STARTED(1) /
> STOPPED(0).
> > > */
> > > > +		lro         : 1;   /**< RX LRO is ON(1) / OFF(0) */
> > > >  };
> > > >
> > > >  /**
> > > > --
> > > > 1.8.1.4
> > > >
> > > >
> > > I presume the ABI checker stopped complaining about this with the
> > > patch, yes?
> >
> > Hi Neil,
> >
> > Yes, I replied about that in the previous thread.
> >
> Thank you, I'll ack as soon as Chao confirms its not a problem on ppc Neil

Hi Chao,

Any reply on this.

Neil, if there is no reply to this from the PPC maintainer do you have any objection to this going in as is. 

It at least fixes the LRO ABI breakage on the platforms we can test on.

John

^ permalink raw reply	[relevance 7%]

* Re: [dpdk-dev] [PATCH v3] doc: announce abi change for interrupt mode
  2015-07-30  5:04 13%   ` [dpdk-dev] [PATCH v3] " Cunming Liang
  2015-07-30  5:14  4%     ` Liu, Yong
  2015-07-30  8:31  4%     ` He, Shaopeng
@ 2015-07-31  1:00  4%     ` Zhang, Helin
  2015-08-12  8:51  4%       ` Thomas Monjalon
  2 siblings, 1 reply; 200+ results
From: Zhang, Helin @ 2015-07-31  1:00 UTC (permalink / raw)
  To: Liang, Cunming, dev



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Cunming Liang
> Sent: Wednesday, July 29, 2015 10:05 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v3] doc: announce abi change for interrupt mode
> 
> The patch announces the planned ABI changes for interrupt mode.
> 
> Signed-off-by: Cunming Liang <cunming.liang@intel.com>
Acked-by: Helin Zhang <helin.zhang@intel.com>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v3] doc: announce abi change for interrupt mode
  2015-07-30  5:14  4%     ` Liu, Yong
@ 2015-07-30 14:25  7%       ` O'Driscoll, Tim
  0 siblings, 0 replies; 200+ results
From: O'Driscoll, Tim @ 2015-07-30 14:25 UTC (permalink / raw)
  To: Liu, Yong, Liang, Cunming, dev, Neil Horman

Hi Neil,

There have been a few deprecation notices like this one submitted. Since you drove the ABI policy, it would be good to get confirmation from you that these are compliant with the policy and that you don't see any issues. Ideally, it would be great if you can review and ack them. If you don't have the time, even just a general indication that you don't see any problems would be useful.


Thanks,
Tim

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Liu, Yong
> Sent: Thursday, July 30, 2015 6:15 AM
> To: Liang, Cunming; dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v3] doc: announce abi change for
> interrupt mode
> 
> Acked-by: Marvin Liu <yong.liu@intel.com>
> 
> > -----Original Message-----
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Cunming Liang
> > Sent: Thursday, July 30, 2015 1:05 PM
> > To: dev@dpdk.org
> > Subject: [dpdk-dev] [PATCH v3] doc: announce abi change for interrupt
> mode
> >
> > The patch announces the planned ABI changes for interrupt mode.
> >
> > Signed-off-by: Cunming Liang <cunming.liang@intel.com>
> > ---
> >  v3 change:
> >    - reword for CONFIG_RTE_NEXT_ABI
> >
> >  v2 change:
> >    - rebase to recent master
> >
> >  doc/guides/rel_notes/deprecation.rst | 5 +++++
> >  1 file changed, 5 insertions(+)
> >
> > diff --git a/doc/guides/rel_notes/deprecation.rst
> > b/doc/guides/rel_notes/deprecation.rst
> > index 5330d3b..d36d267 100644
> > --- a/doc/guides/rel_notes/deprecation.rst
> > +++ b/doc/guides/rel_notes/deprecation.rst
> > @@ -35,3 +35,8 @@ Deprecation Notices
> >  * The following fields have been deprecated in rte_eth_stats:
> >    imissed, ibadcrc, ibadlen, imcasts, fdirmatch, fdirmiss,
> >    tx_pause_xon, rx_pause_xon, tx_pause_xoff, rx_pause_xoff
> > +
> > +* The ABI changes are planned for struct rte_intr_handle, struct
> > rte_eth_conf
> > +  and struct eth_dev_ops to support interrupt mode feature from
> release
> > 2.1.
> > +  Those changes may be enabled in the upcoming release 2.1
> > +  with CONFIG_RTE_NEXT_ABI.
> > --
> > 1.8.1.4

^ permalink raw reply	[relevance 7%]

* Re: [dpdk-dev] Issue with non-scattered rx in ixgbe and i40e when mbuf private area size is odd
  2015-07-30 11:22  0%             ` Olivier MATZ
@ 2015-07-30 13:47  0%               ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-07-30 13:47 UTC (permalink / raw)
  To: Olivier MATZ; +Cc: dev

2015-07-30 13:22, Olivier MATZ:
> On 07/30/2015 11:43 AM, Ananyev, Konstantin wrote:
> > From: Olivier MATZ [mailto:olivier.matz@6wind.com]
> >> On 07/30/2015 11:00 AM, Ananyev, Konstantin wrote:
> >>> From: Olivier MATZ [mailto:olivier.matz@6wind.com]
> >>>> On 07/29/2015 10:24 PM, Zhang, Helin wrote:
> >>>>> The similar situation in i40e, as explained by Konstantin.
> >>>>> As header split hasn't been supported by DPDK till now. It would be better to put the header address in RX descriptor to 0.
> >>>>> But in the future, during header split enabling. We may need to pay extra attention to that. As at least x710 datasheet said
> >>>> specifically as below.
> >>>>> "The header address should be set by the software to an even number (word aligned address)". We may need to find a way to
> >>>> ensure that during mempool/mbuf allocation.
> >>>>
> >>>> Indeed it would be good to force the priv_size to be aligned.
> >>>>
> >>>> The priv_size could be aligned automatically in
> >>>> rte_pktmbuf_pool_create(). The only possible problem I could see
> >>>> is that it would break applications that access to the data buffer
> >>>> by doing (sizeof(mbuf) + sizeof(priv)), which is probably not the
> >>>> best thing to do (I didn't find any applications like this in dpdk).
> >>>
> >>>
> >>> Might be just make rte_pktmbuf_pool_create() fail if input priv_size % MIN_ALIGN != 0?
> >>
> >> Hmm maybe it would break more applications: an odd priv_size is
> >> probably rare, but a priv_size that is not aligned to 8 bytes is
> >> maybe more common.
> >
> > My thought was that rte_mempool_create() was just introduced in 2.1,
> > so if we add extra requirement for the input parameter now -
> > there would be no ABI breakage, and not many people started to use it already.
> > For me just seems a bit easier and more straightforward then silent alignment -
> > user would not have wrong assumptions here.
> > Though if you think that a silent alignment would be more convenient
> > for most users - I wouldn't insist.
> 
> 
> Yes, I agree on the principle, but it depends whether this fix
> is integrated for 2.1 or not.
> I think it may already be a bit late for that, especially as it
> is not a very critical bug.
> 
> Thomas, what do you think?

It is a fix.
Adding a doc comment, an assert and an alignment constraint or a new automatic
alignment in the not yet released function shouldn't hurt.
A patch would be welcome for 2.1. Thanks

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] Issue with non-scattered rx in ixgbe and i40e when mbuf private area size is odd
  2015-07-30  9:43  3%           ` Ananyev, Konstantin
@ 2015-07-30 11:22  0%             ` Olivier MATZ
  2015-07-30 13:47  0%               ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Olivier MATZ @ 2015-07-30 11:22 UTC (permalink / raw)
  To: Ananyev, Konstantin, Zhang, Helin, Martin Weiser; +Cc: dev

Hi,

On 07/30/2015 11:43 AM, Ananyev, Konstantin wrote:
>
>
>> -----Original Message-----
>> From: Olivier MATZ [mailto:olivier.matz@6wind.com]
>> Sent: Thursday, July 30, 2015 10:10 AM
>> To: Ananyev, Konstantin; Zhang, Helin; Martin Weiser
>> Cc: dev@dpdk.org
>> Subject: Re: [dpdk-dev] Issue with non-scattered rx in ixgbe and i40e when mbuf private area size is odd
>>
>> Hi Konstantin,
>>
>> On 07/30/2015 11:00 AM, Ananyev, Konstantin wrote:
>>> Hi Olivier,
>>>
>>>> -----Original Message-----
>>>> From: Olivier MATZ [mailto:olivier.matz@6wind.com]
>>>> Sent: Thursday, July 30, 2015 9:12 AM
>>>> To: Zhang, Helin; Ananyev, Konstantin; Martin Weiser
>>>> Cc: dev@dpdk.org
>>>> Subject: Re: [dpdk-dev] Issue with non-scattered rx in ixgbe and i40e when mbuf private area size is odd
>>>>
>>>> Hi,
>>>>
>>>> On 07/29/2015 10:24 PM, Zhang, Helin wrote:
>>>>> Hi Martin
>>>>>
>>>>> Thank you very much for the good catch!
>>>>>
>>>>> The similar situation in i40e, as explained by Konstantin.
>>>>> As header split hasn't been supported by DPDK till now. It would be better to put the header address in RX descriptor to 0.
>>>>> But in the future, during header split enabling. We may need to pay extra attention to that. As at least x710 datasheet said
>>>> specifically as below.
>>>>> "The header address should be set by the software to an even number (word aligned address)". We may need to find a way to
>>>> ensure that during mempool/mbuf allocation.
>>>>
>>>> Indeed it would be good to force the priv_size to be aligned.
>>>>
>>>> The priv_size could be aligned automatically in
>>>> rte_pktmbuf_pool_create(). The only possible problem I could see
>>>> is that it would break applications that access to the data buffer
>>>> by doing (sizeof(mbuf) + sizeof(priv)), which is probably not the
>>>> best thing to do (I didn't find any applications like this in dpdk).
>>>
>>>
>>> Might be just make rte_pktmbuf_pool_create() fail if input priv_size % MIN_ALIGN != 0?
>>
>> Hmm maybe it would break more applications: an odd priv_size is
>> probably rare, but a priv_size that is not aligned to 8 bytes is
>> maybe more common.
>
> My thought was that rte_mempool_create() was just introduced in 2.1,
> so if we add extra requirement for the input parameter now -
> there would be no ABI breakage, and not many people started to use it already.
> For me just seems a bit easier and more straightforward then silent alignment -
> user would not have wrong assumptions here.
> Though if you think that a silent alignment would be more convenient
> for most users - I wouldn't insist.


Yes, I agree on the principle, but it depends whether this fix
is integrated for 2.1 or not.
I think it may already be a bit late for that, especially as it
is not a very critical bug.

Thomas, what do you think?


Olivier




> Konstantin
>
>> It's maybe safer to align the size transparently?
>>
>>
>> Regards,
>> Olivier
>>
>>
>>
>>>
>>>>
>>>> For applications that directly use rte_mempool_create() instead of
>>>> rte_pktmbuf_pool_create(), we could add a check using an assert in
>>>> rte_pktmbuf_init() and some words in the documentation.
>>>>
>>>> The question is: what should be the proper alignment? I would say
>>>> at least 8 bytes, but maybe cache_aligned is an option too.
>>>
>>> 8 bytes seems enough to me.
>>>
>>> Konstantin
>>>
>>>>
>>>> Regards,
>>>> Olivier
>>>>
>>>>
>>>>>
>>>>> Regards,
>>>>> Helin
>>>>>
>>>>>> -----Original Message-----
>>>>>> From: Ananyev, Konstantin
>>>>>> Sent: Wednesday, July 29, 2015 11:12 AM
>>>>>> To: Martin Weiser; Zhang, Helin; olivier.matz@6wind.com
>>>>>> Cc: dev@dpdk.org
>>>>>> Subject: RE: [dpdk-dev] Issue with non-scattered rx in ixgbe and i40e when mbuf
>>>>>> private area size is odd
>>>>>>
>>>>>> Hi Martin,
>>>>>>
>>>>>>> -----Original Message-----
>>>>>>> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Martin Weiser
>>>>>>> Sent: Wednesday, July 29, 2015 4:07 PM
>>>>>>> To: Zhang, Helin; olivier.matz@6wind.com
>>>>>>> Cc: dev@dpdk.org
>>>>>>> Subject: [dpdk-dev] Issue with non-scattered rx in ixgbe and i40e when
>>>>>>> mbuf private area size is odd
>>>>>>>
>>>>>>> Hi Helin, Hi Olivier,
>>>>>>>
>>>>>>> we are seeing an issue with the ixgbe and i40e drivers which we could
>>>>>>> track down to our setting of the private area size of the mbufs.
>>>>>>> The issue can be easily reproduced with the l2fwd example application
>>>>>>> when a small modification is done: just set the priv_size parameter in
>>>>>>> the call to the rte_pktmbuf_pool_create function to an odd number like
>>>>>>> 1. In our tests this causes every call to rte_eth_rx_burst to return
>>>>>>> 32 (which is the setting of nb_pkts) nonsense mbufs although no
>>>>>>> packets are received on the interface and the hardware counters do not
>>>>>>> report any received packets.
>>>>>>
>>>>>>    From Niantic datasheet:
>>>>>>
>>>>>> "7.1.6.1 Advanced Receive Descriptors — Read Format Table 7-15 lists the
>>>>>> advanced receive descriptor programming by the software. The ...
>>>>>> Packet Buffer Address (64)
>>>>>> This is the physical address of the packet buffer. The lowest bit is A0 (LSB of the
>>>>>> address).
>>>>>> Header Buffer Address (64)
>>>>>> The physical address of the header buffer with the lowest bit being Descriptor
>>>>>> Done (DD).
>>>>>> When a packet spans in multiple descriptors, the header buffer address is used
>>>>>> only on the first descriptor. During the programming phase, software must set
>>>>>> the DD bit to zero (see the description of the DD bit in this section). This means
>>>>>> that header buffer addresses are always word aligned."
>>>>>>
>>>>>> Right now, in ixgbe PMD we always setup  Packet Buffer Address (PBA)and
>>>>>> Header Buffer Address (HBA) to the same value:
>>>>>> buf_physaddr + RTE_PKTMBUF_HEADROOM
>>>>>> So when pirv_size==1, DD bit in RXD is always set to one by SW itself, and then
>>>>>> SW considers that HW already done with it.
>>>>>> In other words, right now for ixgbe you can't use RX buffer that is not aligned on
>>>>>> word boundary.
>>>>>>
>>>>>> So the advice would be, right now - don't set priv_size to the odd value.
>>>>>> As we don't support split header feature anyway, I think we can fix it just by
>>>>>> always setting HBA in the RXD to zero.
>>>>>> Could you try the fix for ixgbe below?
>>>>>>
>>>>>> Same story with FVL, I believe.
>>>>>> Konstantin
>>>>>>
>>>>>>
>>>>>>> Interestingly this does not happen if we force the scattered rx path.
>>>>>>>
>>>>>>> I assume the drivers have some expectations regarding the alignment of
>>>>>>> the buf_addr in the mbuf and setting an odd private are size breaks
>>>>>>> this alignment in the rte_pktmbuf_init function. If this is the case
>>>>>>> then one possible fix might be to enforce an alignment on the private area size.
>>>>>>>
>>>>>>> Best regards,
>>>>>>> Martin
>>>>>>
>>>>>> diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c
>>>>>> index a0c8847..94967c5 100644
>>>>>> --- a/drivers/net/ixgbe/ixgbe_rxtx.c
>>>>>> +++ b/drivers/net/ixgbe/ixgbe_rxtx.c
>>>>>> @@ -1183,7 +1183,7 @@ ixgbe_rx_alloc_bufs(struct ixgbe_rx_queue *rxq, bool
>>>>>> reset_mbuf)
>>>>>>
>>>>>>                    /* populate the descriptors */
>>>>>>                    dma_addr =
>>>>>> rte_cpu_to_le_64(RTE_MBUF_DATA_DMA_ADDR_DEFAULT(mb));
>>>>>> -               rxdp[i].read.hdr_addr = dma_addr;
>>>>>> +               rxdp[i].read.hdr_addr = 0;
>>>>>>                    rxdp[i].read.pkt_addr = dma_addr;
>>>>>>            }
>>>>>>
>>>>>> @@ -1414,7 +1414,7 @@ ixgbe_recv_pkts(void *rx_queue, struct rte_mbuf
>>>>>> **rx_pkts,
>>>>>>                    rxe->mbuf = nmb;
>>>>>>                    dma_addr =
>>>>>>
>>>>>> rte_cpu_to_le_64(RTE_MBUF_DATA_DMA_ADDR_DEFAULT(nmb));
>>>>>> -               rxdp->read.hdr_addr = dma_addr;
>>>>>> +               rxdp->read.hdr_addr = 0;
>>>>>>                    rxdp->read.pkt_addr = dma_addr;
>>>>>>
>>>>>>                    /*
>>>>>> @@ -1741,7 +1741,7 @@ next_desc:
>>>>>>                            rxe->mbuf = nmb;
>>>>>>
>>>>>>                            rxm->data_off = RTE_PKTMBUF_HEADROOM;
>>>>>> -                       rxdp->read.hdr_addr = dma;
>>>>>> +                       rxdp->read.hdr_addr = 0;
>>>>>>                            rxdp->read.pkt_addr = dma;
>>>>>>                    } else
>>>>>>                            rxe->mbuf = NULL; @@ -3633,7 +3633,7 @@
>>>>>> ixgbe_alloc_rx_queue_mbufs(struct ixgbe_rx_queue *rxq)
>>>>>>                    dma_addr =
>>>>>>
>>>>>> rte_cpu_to_le_64(RTE_MBUF_DATA_DMA_ADDR_DEFAULT(mbuf));
>>>>>>                    rxd = &rxq->rx_ring[i];
>>>>>> -               rxd->read.hdr_addr = dma_addr;
>>>>>> +               rxd->read.hdr_addr = 0;
>>>>>>                    rxd->read.pkt_addr = dma_addr;
>>>>>>                    rxe[i].mbuf = mbuf;
>>>>>>            }
>>>>>> diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec.c
>>>>>> b/drivers/net/ixgbe/ixgbe_rxtx_vec.c
>>>>>> index 6c1647e..16a9c64 100644
>>>>>> --- a/drivers/net/ixgbe/ixgbe_rxtx_vec.c
>>>>>> +++ b/drivers/net/ixgbe/ixgbe_rxtx_vec.c
>>>>>> @@ -56,6 +56,8 @@ ixgbe_rxq_rearm(struct ixgbe_rx_queue *rxq)
>>>>>>                            RTE_PKTMBUF_HEADROOM);
>>>>>>            __m128i dma_addr0, dma_addr1;
>>>>>>
>>>>>> +       const __m128i hba_msk = _mm_set_epi64x(0, UINT64_MAX);
>>>>>> +
>>>>>>            rxdp = rxq->rx_ring + rxq->rxrearm_start;
>>>>>>
>>>>>>            /* Pull 'n' more MBUFs into the software ring */ @@ -108,6 +110,9 @@
>>>>>> ixgbe_rxq_rearm(struct ixgbe_rx_queue *rxq)
>>>>>>                    dma_addr0 = _mm_add_epi64(dma_addr0, hdr_room);
>>>>>>                    dma_addr1 = _mm_add_epi64(dma_addr1, hdr_room);
>>>>>>
>>>>>> +               dma_addr0 =  _mm_and_si128(dma_addr0, hba_msk);
>>>>>> +               dma_addr1 =  _mm_and_si128(dma_addr1, hba_msk);
>>>>>> +
>>>>>>                    /* flush desc with pa dma_addr */
>>>>>>                    _mm_store_si128((__m128i *)&rxdp++->read, dma_addr0);
>>>>>>                    _mm_store_si128((__m128i *)&rxdp++->read, dma_addr1);
>>>>>> bash-4.2$ cat patch1 diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c
>>>>>> b/drivers/net/ixgbe/ixgbe_rxtx.c index a0c8847..94967c5 100644
>>>>>> --- a/drivers/net/ixgbe/ixgbe_rxtx.c
>>>>>> +++ b/drivers/net/ixgbe/ixgbe_rxtx.c
>>>>>> @@ -1183,7 +1183,7 @@ ixgbe_rx_alloc_bufs(struct ixgbe_rx_queue *rxq, bool
>>>>>> reset_mbuf)
>>>>>>
>>>>>>                    /* populate the descriptors */
>>>>>>                    dma_addr =
>>>>>> rte_cpu_to_le_64(RTE_MBUF_DATA_DMA_ADDR_DEFAULT(mb));
>>>>>> -               rxdp[i].read.hdr_addr = dma_addr;
>>>>>> +               rxdp[i].read.hdr_addr = 0;
>>>>>>                    rxdp[i].read.pkt_addr = dma_addr;
>>>>>>            }
>>>>>>
>>>>>> @@ -1414,7 +1414,7 @@ ixgbe_recv_pkts(void *rx_queue, struct rte_mbuf
>>>>>> **rx_pkts,
>>>>>>                    rxe->mbuf = nmb;
>>>>>>                    dma_addr =
>>>>>>
>>>>>> rte_cpu_to_le_64(RTE_MBUF_DATA_DMA_ADDR_DEFAULT(nmb));
>>>>>> -               rxdp->read.hdr_addr = dma_addr;
>>>>>> +               rxdp->read.hdr_addr = 0;
>>>>>>                    rxdp->read.pkt_addr = dma_addr;
>>>>>>
>>>>>>                    /*
>>>>>> @@ -1741,7 +1741,7 @@ next_desc:
>>>>>>                            rxe->mbuf = nmb;
>>>>>>
>>>>>>                            rxm->data_off = RTE_PKTMBUF_HEADROOM;
>>>>>> -                       rxdp->read.hdr_addr = dma;
>>>>>> +                       rxdp->read.hdr_addr = 0;
>>>>>>                            rxdp->read.pkt_addr = dma;
>>>>>>                    } else
>>>>>>                            rxe->mbuf = NULL; @@ -3633,7 +3633,7 @@
>>>>>> ixgbe_alloc_rx_queue_mbufs(struct ixgbe_rx_queue *rxq)
>>>>>>                    dma_addr =
>>>>>>
>>>>>> rte_cpu_to_le_64(RTE_MBUF_DATA_DMA_ADDR_DEFAULT(mbuf));
>>>>>>                    rxd = &rxq->rx_ring[i];
>>>>>> -               rxd->read.hdr_addr = dma_addr;
>>>>>> +               rxd->read.hdr_addr = 0;
>>>>>>                    rxd->read.pkt_addr = dma_addr;
>>>>>>                    rxe[i].mbuf = mbuf;
>>>>>>            }
>>>>>> diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec.c
>>>>>> b/drivers/net/ixgbe/ixgbe_rxtx_vec.c
>>>>>> index 6c1647e..16a9c64 100644
>>>>>> --- a/drivers/net/ixgbe/ixgbe_rxtx_vec.c
>>>>>> +++ b/drivers/net/ixgbe/ixgbe_rxtx_vec.c
>>>>>> @@ -56,6 +56,8 @@ ixgbe_rxq_rearm(struct ixgbe_rx_queue *rxq)
>>>>>>                            RTE_PKTMBUF_HEADROOM);
>>>>>>            __m128i dma_addr0, dma_addr1;
>>>>>>
>>>>>> +       const __m128i hba_msk = _mm_set_epi64x(0, UINT64_MAX);
>>>>>> +
>>>>>>            rxdp = rxq->rx_ring + rxq->rxrearm_start;
>>>>>>
>>>>>>            /* Pull 'n' more MBUFs into the software ring */ @@ -108,6 +110,9 @@
>>>>>> ixgbe_rxq_rearm(struct ixgbe_rx_queue *rxq)
>>>>>>                    dma_addr0 = _mm_add_epi64(dma_addr0, hdr_room);
>>>>>>                    dma_addr1 = _mm_add_epi64(dma_addr1, hdr_room);
>>>>>>
>>>>>> +               dma_addr0 =  _mm_and_si128(dma_addr0, hba_msk);
>>>>>> +               dma_addr1 =  _mm_and_si128(dma_addr1, hba_msk);
>>>>>> +
>>>>>>                    /* flush desc with pa dma_addr */
>>>>>>                    _mm_store_si128((__m128i *)&rxdp++->read, dma_addr0);
>>>>>>                    _mm_store_si128((__m128i *)&rxdp++->read, dma_addr1);
>>>
>

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] abi change announce
  2015-07-30 10:18  4% ` Thomas Monjalon
@ 2015-07-30 10:33  8%   ` Neil Horman
  0 siblings, 0 replies; 200+ results
From: Neil Horman @ 2015-07-30 10:33 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Thu, Jul 30, 2015 at 12:18:41PM +0200, Thomas Monjalon wrote:
> 2015-07-30 09:25, Xie, Huawei:
> > Hi Thomas:
> > I am doing virtio/vhost performance optimization, so there is possibly
> > some change, for example to virtio or vhost virtqueue data structure.
> > Do i need to announce the ABI change even if the change hasn't been
> > determined?
> 
> I have no strong opinion.
> It seems strange to announce something which is not known.
> You may be able to introduce your change without previous notice by using
> NEXT_ABI if not too invasive.
> 
> Neil, an opinion?
> 

Given the process, you can't announce the change until you know what it is,
since you need to detail in the announcement what the change is going to be.

We have no method to reserve an 'ABI break to be determined later', nor should
we.  Write the code, then we figure out if ABI needs to change and there is a
need to announce.

Neil

^ permalink raw reply	[relevance 8%]

* Re: [dpdk-dev] abi change announce
  2015-07-30  9:25  7% [dpdk-dev] abi change announce Xie, Huawei
@ 2015-07-30 10:18  4% ` Thomas Monjalon
  2015-07-30 10:33  8%   ` Neil Horman
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2015-07-30 10:18 UTC (permalink / raw)
  To: Xie, Huawei, nhorman; +Cc: dev

2015-07-30 09:25, Xie, Huawei:
> Hi Thomas:
> I am doing virtio/vhost performance optimization, so there is possibly
> some change, for example to virtio or vhost virtqueue data structure.
> Do i need to announce the ABI change even if the change hasn't been
> determined?

I have no strong opinion.
It seems strange to announce something which is not known.
You may be able to introduce your change without previous notice by using
NEXT_ABI if not too invasive.

Neil, an opinion?

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] Issue with non-scattered rx in ixgbe and i40e when mbuf private area size is odd
  @ 2015-07-30  9:43  3%           ` Ananyev, Konstantin
  2015-07-30 11:22  0%             ` Olivier MATZ
  0 siblings, 1 reply; 200+ results
From: Ananyev, Konstantin @ 2015-07-30  9:43 UTC (permalink / raw)
  To: Olivier MATZ, Zhang, Helin, Martin Weiser; +Cc: dev



> -----Original Message-----
> From: Olivier MATZ [mailto:olivier.matz@6wind.com]
> Sent: Thursday, July 30, 2015 10:10 AM
> To: Ananyev, Konstantin; Zhang, Helin; Martin Weiser
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] Issue with non-scattered rx in ixgbe and i40e when mbuf private area size is odd
> 
> Hi Konstantin,
> 
> On 07/30/2015 11:00 AM, Ananyev, Konstantin wrote:
> > Hi Olivier,
> >
> >> -----Original Message-----
> >> From: Olivier MATZ [mailto:olivier.matz@6wind.com]
> >> Sent: Thursday, July 30, 2015 9:12 AM
> >> To: Zhang, Helin; Ananyev, Konstantin; Martin Weiser
> >> Cc: dev@dpdk.org
> >> Subject: Re: [dpdk-dev] Issue with non-scattered rx in ixgbe and i40e when mbuf private area size is odd
> >>
> >> Hi,
> >>
> >> On 07/29/2015 10:24 PM, Zhang, Helin wrote:
> >>> Hi Martin
> >>>
> >>> Thank you very much for the good catch!
> >>>
> >>> The similar situation in i40e, as explained by Konstantin.
> >>> As header split hasn't been supported by DPDK till now. It would be better to put the header address in RX descriptor to 0.
> >>> But in the future, during header split enabling. We may need to pay extra attention to that. As at least x710 datasheet said
> >> specifically as below.
> >>> "The header address should be set by the software to an even number (word aligned address)". We may need to find a way to
> >> ensure that during mempool/mbuf allocation.
> >>
> >> Indeed it would be good to force the priv_size to be aligned.
> >>
> >> The priv_size could be aligned automatically in
> >> rte_pktmbuf_pool_create(). The only possible problem I could see
> >> is that it would break applications that access to the data buffer
> >> by doing (sizeof(mbuf) + sizeof(priv)), which is probably not the
> >> best thing to do (I didn't find any applications like this in dpdk).
> >
> >
> > Might be just make rte_pktmbuf_pool_create() fail if input priv_size % MIN_ALIGN != 0?
> 
> Hmm maybe it would break more applications: an odd priv_size is
> probably rare, but a priv_size that is not aligned to 8 bytes is
> maybe more common.

My thought was that rte_mempool_create() was just introduced in 2.1,
so if we add extra requirement for the input parameter now -
there would be no ABI breakage, and not many people started to use it already. 
For me just seems a bit easier and more straightforward then silent alignment -
user would not have wrong assumptions here.
Though if you think that a silent alignment would be more convenient
for most users - I wouldn't insist.
Konstantin

> It's maybe safer to align the size transparently?
> 
> 
> Regards,
> Olivier
> 
> 
> 
> >
> >>
> >> For applications that directly use rte_mempool_create() instead of
> >> rte_pktmbuf_pool_create(), we could add a check using an assert in
> >> rte_pktmbuf_init() and some words in the documentation.
> >>
> >> The question is: what should be the proper alignment? I would say
> >> at least 8 bytes, but maybe cache_aligned is an option too.
> >
> > 8 bytes seems enough to me.
> >
> > Konstantin
> >
> >>
> >> Regards,
> >> Olivier
> >>
> >>
> >>>
> >>> Regards,
> >>> Helin
> >>>
> >>>> -----Original Message-----
> >>>> From: Ananyev, Konstantin
> >>>> Sent: Wednesday, July 29, 2015 11:12 AM
> >>>> To: Martin Weiser; Zhang, Helin; olivier.matz@6wind.com
> >>>> Cc: dev@dpdk.org
> >>>> Subject: RE: [dpdk-dev] Issue with non-scattered rx in ixgbe and i40e when mbuf
> >>>> private area size is odd
> >>>>
> >>>> Hi Martin,
> >>>>
> >>>>> -----Original Message-----
> >>>>> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Martin Weiser
> >>>>> Sent: Wednesday, July 29, 2015 4:07 PM
> >>>>> To: Zhang, Helin; olivier.matz@6wind.com
> >>>>> Cc: dev@dpdk.org
> >>>>> Subject: [dpdk-dev] Issue with non-scattered rx in ixgbe and i40e when
> >>>>> mbuf private area size is odd
> >>>>>
> >>>>> Hi Helin, Hi Olivier,
> >>>>>
> >>>>> we are seeing an issue with the ixgbe and i40e drivers which we could
> >>>>> track down to our setting of the private area size of the mbufs.
> >>>>> The issue can be easily reproduced with the l2fwd example application
> >>>>> when a small modification is done: just set the priv_size parameter in
> >>>>> the call to the rte_pktmbuf_pool_create function to an odd number like
> >>>>> 1. In our tests this causes every call to rte_eth_rx_burst to return
> >>>>> 32 (which is the setting of nb_pkts) nonsense mbufs although no
> >>>>> packets are received on the interface and the hardware counters do not
> >>>>> report any received packets.
> >>>>
> >>>>   From Niantic datasheet:
> >>>>
> >>>> "7.1.6.1 Advanced Receive Descriptors — Read Format Table 7-15 lists the
> >>>> advanced receive descriptor programming by the software. The ...
> >>>> Packet Buffer Address (64)
> >>>> This is the physical address of the packet buffer. The lowest bit is A0 (LSB of the
> >>>> address).
> >>>> Header Buffer Address (64)
> >>>> The physical address of the header buffer with the lowest bit being Descriptor
> >>>> Done (DD).
> >>>> When a packet spans in multiple descriptors, the header buffer address is used
> >>>> only on the first descriptor. During the programming phase, software must set
> >>>> the DD bit to zero (see the description of the DD bit in this section). This means
> >>>> that header buffer addresses are always word aligned."
> >>>>
> >>>> Right now, in ixgbe PMD we always setup  Packet Buffer Address (PBA)and
> >>>> Header Buffer Address (HBA) to the same value:
> >>>> buf_physaddr + RTE_PKTMBUF_HEADROOM
> >>>> So when pirv_size==1, DD bit in RXD is always set to one by SW itself, and then
> >>>> SW considers that HW already done with it.
> >>>> In other words, right now for ixgbe you can't use RX buffer that is not aligned on
> >>>> word boundary.
> >>>>
> >>>> So the advice would be, right now - don't set priv_size to the odd value.
> >>>> As we don't support split header feature anyway, I think we can fix it just by
> >>>> always setting HBA in the RXD to zero.
> >>>> Could you try the fix for ixgbe below?
> >>>>
> >>>> Same story with FVL, I believe.
> >>>> Konstantin
> >>>>
> >>>>
> >>>>> Interestingly this does not happen if we force the scattered rx path.
> >>>>>
> >>>>> I assume the drivers have some expectations regarding the alignment of
> >>>>> the buf_addr in the mbuf and setting an odd private are size breaks
> >>>>> this alignment in the rte_pktmbuf_init function. If this is the case
> >>>>> then one possible fix might be to enforce an alignment on the private area size.
> >>>>>
> >>>>> Best regards,
> >>>>> Martin
> >>>>
> >>>> diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c
> >>>> index a0c8847..94967c5 100644
> >>>> --- a/drivers/net/ixgbe/ixgbe_rxtx.c
> >>>> +++ b/drivers/net/ixgbe/ixgbe_rxtx.c
> >>>> @@ -1183,7 +1183,7 @@ ixgbe_rx_alloc_bufs(struct ixgbe_rx_queue *rxq, bool
> >>>> reset_mbuf)
> >>>>
> >>>>                   /* populate the descriptors */
> >>>>                   dma_addr =
> >>>> rte_cpu_to_le_64(RTE_MBUF_DATA_DMA_ADDR_DEFAULT(mb));
> >>>> -               rxdp[i].read.hdr_addr = dma_addr;
> >>>> +               rxdp[i].read.hdr_addr = 0;
> >>>>                   rxdp[i].read.pkt_addr = dma_addr;
> >>>>           }
> >>>>
> >>>> @@ -1414,7 +1414,7 @@ ixgbe_recv_pkts(void *rx_queue, struct rte_mbuf
> >>>> **rx_pkts,
> >>>>                   rxe->mbuf = nmb;
> >>>>                   dma_addr =
> >>>>
> >>>> rte_cpu_to_le_64(RTE_MBUF_DATA_DMA_ADDR_DEFAULT(nmb));
> >>>> -               rxdp->read.hdr_addr = dma_addr;
> >>>> +               rxdp->read.hdr_addr = 0;
> >>>>                   rxdp->read.pkt_addr = dma_addr;
> >>>>
> >>>>                   /*
> >>>> @@ -1741,7 +1741,7 @@ next_desc:
> >>>>                           rxe->mbuf = nmb;
> >>>>
> >>>>                           rxm->data_off = RTE_PKTMBUF_HEADROOM;
> >>>> -                       rxdp->read.hdr_addr = dma;
> >>>> +                       rxdp->read.hdr_addr = 0;
> >>>>                           rxdp->read.pkt_addr = dma;
> >>>>                   } else
> >>>>                           rxe->mbuf = NULL; @@ -3633,7 +3633,7 @@
> >>>> ixgbe_alloc_rx_queue_mbufs(struct ixgbe_rx_queue *rxq)
> >>>>                   dma_addr =
> >>>>
> >>>> rte_cpu_to_le_64(RTE_MBUF_DATA_DMA_ADDR_DEFAULT(mbuf));
> >>>>                   rxd = &rxq->rx_ring[i];
> >>>> -               rxd->read.hdr_addr = dma_addr;
> >>>> +               rxd->read.hdr_addr = 0;
> >>>>                   rxd->read.pkt_addr = dma_addr;
> >>>>                   rxe[i].mbuf = mbuf;
> >>>>           }
> >>>> diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec.c
> >>>> b/drivers/net/ixgbe/ixgbe_rxtx_vec.c
> >>>> index 6c1647e..16a9c64 100644
> >>>> --- a/drivers/net/ixgbe/ixgbe_rxtx_vec.c
> >>>> +++ b/drivers/net/ixgbe/ixgbe_rxtx_vec.c
> >>>> @@ -56,6 +56,8 @@ ixgbe_rxq_rearm(struct ixgbe_rx_queue *rxq)
> >>>>                           RTE_PKTMBUF_HEADROOM);
> >>>>           __m128i dma_addr0, dma_addr1;
> >>>>
> >>>> +       const __m128i hba_msk = _mm_set_epi64x(0, UINT64_MAX);
> >>>> +
> >>>>           rxdp = rxq->rx_ring + rxq->rxrearm_start;
> >>>>
> >>>>           /* Pull 'n' more MBUFs into the software ring */ @@ -108,6 +110,9 @@
> >>>> ixgbe_rxq_rearm(struct ixgbe_rx_queue *rxq)
> >>>>                   dma_addr0 = _mm_add_epi64(dma_addr0, hdr_room);
> >>>>                   dma_addr1 = _mm_add_epi64(dma_addr1, hdr_room);
> >>>>
> >>>> +               dma_addr0 =  _mm_and_si128(dma_addr0, hba_msk);
> >>>> +               dma_addr1 =  _mm_and_si128(dma_addr1, hba_msk);
> >>>> +
> >>>>                   /* flush desc with pa dma_addr */
> >>>>                   _mm_store_si128((__m128i *)&rxdp++->read, dma_addr0);
> >>>>                   _mm_store_si128((__m128i *)&rxdp++->read, dma_addr1);
> >>>> bash-4.2$ cat patch1 diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c
> >>>> b/drivers/net/ixgbe/ixgbe_rxtx.c index a0c8847..94967c5 100644
> >>>> --- a/drivers/net/ixgbe/ixgbe_rxtx.c
> >>>> +++ b/drivers/net/ixgbe/ixgbe_rxtx.c
> >>>> @@ -1183,7 +1183,7 @@ ixgbe_rx_alloc_bufs(struct ixgbe_rx_queue *rxq, bool
> >>>> reset_mbuf)
> >>>>
> >>>>                   /* populate the descriptors */
> >>>>                   dma_addr =
> >>>> rte_cpu_to_le_64(RTE_MBUF_DATA_DMA_ADDR_DEFAULT(mb));
> >>>> -               rxdp[i].read.hdr_addr = dma_addr;
> >>>> +               rxdp[i].read.hdr_addr = 0;
> >>>>                   rxdp[i].read.pkt_addr = dma_addr;
> >>>>           }
> >>>>
> >>>> @@ -1414,7 +1414,7 @@ ixgbe_recv_pkts(void *rx_queue, struct rte_mbuf
> >>>> **rx_pkts,
> >>>>                   rxe->mbuf = nmb;
> >>>>                   dma_addr =
> >>>>
> >>>> rte_cpu_to_le_64(RTE_MBUF_DATA_DMA_ADDR_DEFAULT(nmb));
> >>>> -               rxdp->read.hdr_addr = dma_addr;
> >>>> +               rxdp->read.hdr_addr = 0;
> >>>>                   rxdp->read.pkt_addr = dma_addr;
> >>>>
> >>>>                   /*
> >>>> @@ -1741,7 +1741,7 @@ next_desc:
> >>>>                           rxe->mbuf = nmb;
> >>>>
> >>>>                           rxm->data_off = RTE_PKTMBUF_HEADROOM;
> >>>> -                       rxdp->read.hdr_addr = dma;
> >>>> +                       rxdp->read.hdr_addr = 0;
> >>>>                           rxdp->read.pkt_addr = dma;
> >>>>                   } else
> >>>>                           rxe->mbuf = NULL; @@ -3633,7 +3633,7 @@
> >>>> ixgbe_alloc_rx_queue_mbufs(struct ixgbe_rx_queue *rxq)
> >>>>                   dma_addr =
> >>>>
> >>>> rte_cpu_to_le_64(RTE_MBUF_DATA_DMA_ADDR_DEFAULT(mbuf));
> >>>>                   rxd = &rxq->rx_ring[i];
> >>>> -               rxd->read.hdr_addr = dma_addr;
> >>>> +               rxd->read.hdr_addr = 0;
> >>>>                   rxd->read.pkt_addr = dma_addr;
> >>>>                   rxe[i].mbuf = mbuf;
> >>>>           }
> >>>> diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec.c
> >>>> b/drivers/net/ixgbe/ixgbe_rxtx_vec.c
> >>>> index 6c1647e..16a9c64 100644
> >>>> --- a/drivers/net/ixgbe/ixgbe_rxtx_vec.c
> >>>> +++ b/drivers/net/ixgbe/ixgbe_rxtx_vec.c
> >>>> @@ -56,6 +56,8 @@ ixgbe_rxq_rearm(struct ixgbe_rx_queue *rxq)
> >>>>                           RTE_PKTMBUF_HEADROOM);
> >>>>           __m128i dma_addr0, dma_addr1;
> >>>>
> >>>> +       const __m128i hba_msk = _mm_set_epi64x(0, UINT64_MAX);
> >>>> +
> >>>>           rxdp = rxq->rx_ring + rxq->rxrearm_start;
> >>>>
> >>>>           /* Pull 'n' more MBUFs into the software ring */ @@ -108,6 +110,9 @@
> >>>> ixgbe_rxq_rearm(struct ixgbe_rx_queue *rxq)
> >>>>                   dma_addr0 = _mm_add_epi64(dma_addr0, hdr_room);
> >>>>                   dma_addr1 = _mm_add_epi64(dma_addr1, hdr_room);
> >>>>
> >>>> +               dma_addr0 =  _mm_and_si128(dma_addr0, hba_msk);
> >>>> +               dma_addr1 =  _mm_and_si128(dma_addr1, hba_msk);
> >>>> +
> >>>>                   /* flush desc with pa dma_addr */
> >>>>                   _mm_store_si128((__m128i *)&rxdp++->read, dma_addr0);
> >>>>                   _mm_store_si128((__m128i *)&rxdp++->read, dma_addr1);
> >


^ permalink raw reply	[relevance 3%]

* [dpdk-dev] abi change announce
@ 2015-07-30  9:25  7% Xie, Huawei
  2015-07-30 10:18  4% ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Xie, Huawei @ 2015-07-30  9:25 UTC (permalink / raw)
  To: Thomas Monjalon, dev

Hi Thomas:
I am doing virtio/vhost performance optimization, so there is possibly
some change, for example to virtio or vhost virtqueue data structure.
Do i need to announce the ABI change even if the change hasn't been
determined?

/huawei


^ permalink raw reply	[relevance 7%]

* Re: [dpdk-dev] [PATCH v3] doc: announce abi change for interrupt mode
  2015-07-30  5:04 13%   ` [dpdk-dev] [PATCH v3] " Cunming Liang
  2015-07-30  5:14  4%     ` Liu, Yong
@ 2015-07-30  8:31  4%     ` He, Shaopeng
  2015-07-31  1:00  4%     ` Zhang, Helin
  2 siblings, 0 replies; 200+ results
From: He, Shaopeng @ 2015-07-30  8:31 UTC (permalink / raw)
  To: Liang, Cunming, dev

Hi,

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Cunming Liang
> Sent: Thursday, July 30, 2015 1:05 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v3] doc: announce abi change for interrupt
> mode
> 
> The patch announces the planned ABI changes for interrupt mode.
> 
> Signed-off-by: Cunming Liang <cunming.liang@intel.com>
Acked-by: Shaopeng He <shaopeng.he@intel.com>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v3] doc: announce abi change for interrupt mode
  2015-07-30  5:04 13%   ` [dpdk-dev] [PATCH v3] " Cunming Liang
@ 2015-07-30  5:14  4%     ` Liu, Yong
  2015-07-30 14:25  7%       ` O'Driscoll, Tim
  2015-07-30  8:31  4%     ` He, Shaopeng
  2015-07-31  1:00  4%     ` Zhang, Helin
  2 siblings, 1 reply; 200+ results
From: Liu, Yong @ 2015-07-30  5:14 UTC (permalink / raw)
  To: Liang, Cunming, dev

Acked-by: Marvin Liu <yong.liu@intel.com>

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Cunming Liang
> Sent: Thursday, July 30, 2015 1:05 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v3] doc: announce abi change for interrupt mode
> 
> The patch announces the planned ABI changes for interrupt mode.
> 
> Signed-off-by: Cunming Liang <cunming.liang@intel.com>
> ---
>  v3 change:
>    - reword for CONFIG_RTE_NEXT_ABI
> 
>  v2 change:
>    - rebase to recent master
> 
>  doc/guides/rel_notes/deprecation.rst | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/doc/guides/rel_notes/deprecation.rst
> b/doc/guides/rel_notes/deprecation.rst
> index 5330d3b..d36d267 100644
> --- a/doc/guides/rel_notes/deprecation.rst
> +++ b/doc/guides/rel_notes/deprecation.rst
> @@ -35,3 +35,8 @@ Deprecation Notices
>  * The following fields have been deprecated in rte_eth_stats:
>    imissed, ibadcrc, ibadlen, imcasts, fdirmatch, fdirmiss,
>    tx_pause_xon, rx_pause_xon, tx_pause_xoff, rx_pause_xoff
> +
> +* The ABI changes are planned for struct rte_intr_handle, struct
> rte_eth_conf
> +  and struct eth_dev_ops to support interrupt mode feature from release
> 2.1.
> +  Those changes may be enabled in the upcoming release 2.1
> +  with CONFIG_RTE_NEXT_ABI.
> --
> 1.8.1.4

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v3] doc: announce abi change for interrupt mode
  2015-07-30  1:57 14% ` [dpdk-dev] [PATCH v2] doc: announce abi change " Cunming Liang
@ 2015-07-30  5:04 13%   ` Cunming Liang
  2015-07-30  5:14  4%     ` Liu, Yong
                       ` (2 more replies)
  0 siblings, 3 replies; 200+ results
From: Cunming Liang @ 2015-07-30  5:04 UTC (permalink / raw)
  To: dev

The patch announces the planned ABI changes for interrupt mode.

Signed-off-by: Cunming Liang <cunming.liang@intel.com>
---
 v3 change:
   - reword for CONFIG_RTE_NEXT_ABI

 v2 change:
   - rebase to recent master
 
 doc/guides/rel_notes/deprecation.rst | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 5330d3b..d36d267 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -35,3 +35,8 @@ Deprecation Notices
 * The following fields have been deprecated in rte_eth_stats:
   imissed, ibadcrc, ibadlen, imcasts, fdirmatch, fdirmiss,
   tx_pause_xon, rx_pause_xon, tx_pause_xoff, rx_pause_xoff
+
+* The ABI changes are planned for struct rte_intr_handle, struct rte_eth_conf
+  and struct eth_dev_ops to support interrupt mode feature from release 2.1.
+  Those changes may be enabled in the upcoming release 2.1
+  with CONFIG_RTE_NEXT_ABI.
-- 
1.8.1.4

^ permalink raw reply	[relevance 13%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for rte_eth_fdir_filter
  2015-07-20  7:03 13% [dpdk-dev] [PATCH] doc: announce ABI change for rte_eth_fdir_filter Jingjing Wu
  2015-07-28  8:22  4% ` Lu, Wenzhuo
@ 2015-07-30  3:38  4% ` Liang, Cunming
  2015-08-04  8:52  4% ` Mcnamara, John
  2015-08-04  8:53  4% ` Mcnamara, John
  3 siblings, 0 replies; 200+ results
From: Liang, Cunming @ 2015-07-30  3:38 UTC (permalink / raw)
  To: Wu, Jingjing, dev



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Jingjing Wu
> Sent: Monday, July 20, 2015 3:04 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH] doc: announce ABI change for rte_eth_fdir_filter
> 
> To fix the FVL's flow director issue for SCTP flow, rte_eth_fdir_filter
> need to be change to support SCTP flow keys extension. Here announce
> the ABI deprecation.
> 
> Signed-off-by: jingjing.wu <jingjing.wu@intel.com>
> ---
>  doc/guides/rel_notes/deprecation.rst | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/doc/guides/rel_notes/deprecation.rst
> b/doc/guides/rel_notes/deprecation.rst
> index 5330d3b..63e19c7 100644
> --- a/doc/guides/rel_notes/deprecation.rst
> +++ b/doc/guides/rel_notes/deprecation.rst
> @@ -35,3 +35,7 @@ Deprecation Notices
>  * The following fields have been deprecated in rte_eth_stats:
>    imissed, ibadcrc, ibadlen, imcasts, fdirmatch, fdirmiss,
>    tx_pause_xon, rx_pause_xon, tx_pause_xoff, rx_pause_xoff
> +
> +* Significant ABI change is planned for struct rte_eth_fdir_filter to extend
> +  the SCTP flow's key input from release 2.1. The change may be enabled in
> +  the upcoming release 2.1 with CONFIG_RTE_NEXT_ABI.
> --
> 2.4.0

Acked-by: Cunming Liang <cunming.liang@intel.com>

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v2] doc: announce abi change for interrupt mode
  @ 2015-07-30  1:57 14% ` Cunming Liang
  2015-07-30  5:04 13%   ` [dpdk-dev] [PATCH v3] " Cunming Liang
  0 siblings, 1 reply; 200+ results
From: Cunming Liang @ 2015-07-30  1:57 UTC (permalink / raw)
  To: dev

The patch announces the planned ABI changes for interrupt mode on v2.2.

Signed-off-by: Cunming Liang <cunming.liang@intel.com>
---
 v2 change:
   - rebase to recent master

 doc/guides/rel_notes/deprecation.rst | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 5330d3b..645ce32 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -35,3 +35,11 @@ Deprecation Notices
 * The following fields have been deprecated in rte_eth_stats:
   imissed, ibadcrc, ibadlen, imcasts, fdirmatch, fdirmiss,
   tx_pause_xon, rx_pause_xon, tx_pause_xoff, rx_pause_xoff
+
+* The ABI changes are planned for struct rte_intr_handle, struct rte_eth_conf
+  and struct eth_dev_ops in order to support interrupt mode feature.
+  The upcoming release 2.1 will not contain these ABI changes by default.
+  This change will be in release 2.2. There's no backwards compatibility planed
+  due to the additional interrupt mode feature enabling.
+  Binaries using this library build prior to version 2.2 will require updating
+  and recompilation.
-- 
1.8.1.4

^ permalink raw reply	[relevance 14%]

* Re: [dpdk-dev] [PATCH 1/2] log: rte_openlog_stream should be void
  @ 2015-07-30  0:35  3%     ` Stephen Hemminger
  0 siblings, 0 replies; 200+ results
From: Stephen Hemminger @ 2015-07-30  0:35 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: dev

On Tue, 19 May 2015 11:24:03 +0100
Bruce Richardson <bruce.richardson@intel.com> wrote:

> On Fri, Apr 17, 2015 at 08:35:33AM -0700, Stephen Hemminger wrote:
> > Function always returned 0 and no one was checking anyway.
> > 
> > Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> 
> Acked-by: Bruce Richardson <bruce.richardson@intel.com>
> 
> > ---
> >  lib/librte_eal/common/eal_common_log.c  | 3 +--
> >  lib/librte_eal/common/include/rte_log.h | 5 +----
> >  2 files changed, 2 insertions(+), 6 deletions(-)
> > 
> > diff --git a/lib/librte_eal/common/eal_common_log.c b/lib/librte_eal/common/eal_common_log.c
> > index ff44d23..3802f9c 100644
> > --- a/lib/librte_eal/common/eal_common_log.c
> > +++ b/lib/librte_eal/common/eal_common_log.c
> > @@ -158,14 +158,13 @@ rte_log_set_history(int enable)
> >  }
> >  
> >  /* Change the stream that will be used by logging system */
> > -int
> > +void
> >  rte_openlog_stream(FILE *f)
> >  {
> >  	if (f == NULL)
> >  		rte_logs.file = default_log_stream;
> >  	else
> >  		rte_logs.file = f;
> > -	return 0;
> >  }
> >  
> >  /* Set global log level */
> > diff --git a/lib/librte_eal/common/include/rte_log.h b/lib/librte_eal/common/include/rte_log.h
> > index f83a0d9..888ee19 100644
> > --- a/lib/librte_eal/common/include/rte_log.h
> > +++ b/lib/librte_eal/common/include/rte_log.h
> > @@ -110,11 +110,8 @@ extern FILE *eal_default_log_stream;
> >   *
> >   * @param f
> >   *   Pointer to the stream.
> > - * @return
> > - *   - 0 on success.
> > - *   - Negative on error.
> >   */
> > -int rte_openlog_stream(FILE *f);
> > +void rte_openlog_stream(FILE *f);
> >  
> >  /**
> >   * Set the global log level.
> > -- 
> > 2.1.4
> > 

Yes it should be void, but technically this is an ABI change.
Please drop the patch.

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH] pci: make rte_pci_probe void
  @ 2015-07-30  0:34  3%   ` Stephen Hemminger
  0 siblings, 0 replies; 200+ results
From: Stephen Hemminger @ 2015-07-30  0:34 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Mon, 20 Apr 2015 15:15:36 +0200
Thomas Monjalon <thomas.monjalon@6wind.com> wrote:

> 2015-04-14 10:55, Stephen Hemminger:
> > Since rte_pci_probe always returns 0 or exits via rte_exit()
> > there is no point in having it return a value.
> > 
> > Just make it void
> > 
> > Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> 
> Seems partially superseded by this patch:
> 	http://dpdk.org/dev/patchwork/patch/4347/
> 

The patch could be redone, but it would break ABI for no good
reason. Just drop it.

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH 1/4] bnx2x: fix build as shared library
  @ 2015-07-28 15:47  3% ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-07-28 15:47 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev

Build log:
	Must Specify a librte_pmd_bnx2x.so..1 ABI version

Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
---
 drivers/net/bnx2x/Makefile | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/net/bnx2x/Makefile b/drivers/net/bnx2x/Makefile
index 0de5db9..87f31b6 100644
--- a/drivers/net/bnx2x/Makefile
+++ b/drivers/net/bnx2x/Makefile
@@ -9,6 +9,10 @@ CFLAGS += -O3 -g
 CFLAGS += $(WERROR_FLAGS)
 CFLAGS += -DZLIB_CONST
 
+EXPORT_MAP := rte_pmd_bnx2x_version.map
+
+LIBABIVER := 1
+
 #
 # all source are stored in SRCS-y
 #
-- 
2.4.2

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for rte_eth_fdir_filter
  2015-07-20  7:03 13% [dpdk-dev] [PATCH] doc: announce ABI change for rte_eth_fdir_filter Jingjing Wu
@ 2015-07-28  8:22  4% ` Lu, Wenzhuo
  2015-07-30  3:38  4% ` Liang, Cunming
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 200+ results
From: Lu, Wenzhuo @ 2015-07-28  8:22 UTC (permalink / raw)
  To: Wu, Jingjing, dev

Hi,

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Jingjing Wu
> Sent: Monday, July 20, 2015 3:04 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH] doc: announce ABI change for rte_eth_fdir_filter
> 
> To fix the FVL's flow director issue for SCTP flow, rte_eth_fdir_filter need to be
> change to support SCTP flow keys extension. Here announce the ABI
> deprecation.
> 
> Signed-off-by: jingjing.wu <jingjing.wu@intel.com>
Acked-by: Wenzhuo Lu <wenzhuo.lu@intel.com>

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [dpdk-announce] release candidate 2.1.0-rc2
@ 2015-07-27 22:55  4% Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-07-27 22:55 UTC (permalink / raw)
  To: announce

A new DPDK release candidate is ready for testing:
	http://dpdk.org/browse/dpdk/tag/?id=v2.1.0-rc2

Except some fixes, there are more features in drivers, a new bnx2x driver
and the introduction of the interrupt mode which was pending for a long time.
Having such features in a RC2 is unusual and must be unrepeatable.
>From now, only important fixes and cleanups will be accepted.

Please test it and check the documentation.

Changelog (main enhancements since 2.1.0-rc1)
	- enhancements:
		* interrupt mode
		* new bnx2x driver
		* cxgbe for FreeBSD
		* e1000 82583V jumbo
		* fm10k Tx checksum offload
		* bonding hotplug
		* ring PMD hotplug
	- fixes for:
		* build
		* ABI
		* virtio Rx
		* ixgbe scattered Rx
		* ixgbe stats
		* ixgbe stop
		* fm10k fault interrupt

You are welcome to review or rework the pending fixes for RC3 inclusion:
	http://dpdk.org/dev/patchwork
Some help is also required to check the ABI stability and to validate
the next ABI breakings.

Thank you

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v15 00/13] Interrupt mode PMD
  2015-07-23 14:18  3%       ` [dpdk-dev] [PATCH v15 00/13] Interrupt mode PMD Liang, Cunming
@ 2015-07-27 21:34  0%         ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-07-27 21:34 UTC (permalink / raw)
  To: Liang, Cunming; +Cc: shemming, dev

2015-07-23 14:18, Liang, Cunming:
> Hi Thomas and all,
> 
> This patch set postponed from v2.0, and widely reviewed during this release cycle.
> The packet I/O interrupt framework is the prerequisite of all PMDs to support packet I/O intr.
> There's no significant change since the last three version(v13~v15), the changes are about ABI and version map fixing.
> It missed the rc1 in the last minutes, I'm now asking for the exception to make it go into v2.1 rc2 if nobody will reject it.
> Again, thanks for all the comments by Stephen, David, Neil and Thomas.

As nobody rejects it, it has been applied with minor fixes (see thread comments).
BSD support is missing in this version.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 4/4] ethdev: check support for rx_queue_count and descriptor_done fns
  @ 2015-07-26 20:44  0%     ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-07-26 20:44 UTC (permalink / raw)
  To: nhorman, Bruce Richardson; +Cc: dev

Neil, Bruce,
Can we move forward?

2015-07-06 17:11, Thomas Monjalon:
> Neil, your ABI expertise is required for this patch.
> 
> 2015-06-15 11:14, Bruce Richardson:
> > On Fri, Jun 12, 2015 at 01:32:56PM -0400, Roger B. Melton wrote:
> > > Hi Bruce,  Comment in-line.  Regards, Roger
> > > 
> > > On 6/12/15 7:28 AM, Bruce Richardson wrote:
> > > >The functions rte_eth_rx_queue_count and rte_eth_descriptor_done are
> > > >supported by very few PMDs. Therefore, it is best to check for support
> > > >for the functions in the ethdev library, so as to avoid crashes
> > > >at run-time if the application goes to use those APIs. The performance
> > > >impact of this change should be very small as this is a predictable
> > > >branch in the function.
> > > >
> > > >Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> > > >---
> > > >  lib/librte_ether/rte_ethdev.h | 8 ++++++--
> > > >  1 file changed, 6 insertions(+), 2 deletions(-)
> > > >
> > > >diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
> > > >index 827ca3e..9ad1b6a 100644
> > > >--- a/lib/librte_ether/rte_ethdev.h
> > > >+++ b/lib/librte_ether/rte_ethdev.h
> > > >@@ -2496,6 +2496,8 @@ rte_eth_rx_burst(uint8_t port_id, uint16_t queue_id,
> > > >   *  The queue id on the specific port.
> > > >   * @return
> > > >   *  The number of used descriptors in the specific queue.
> > > >+ *  NOTE: if function is not supported by device this call
> > > >+ *        returns (uint32_t)-ENOTSUP
> > > >   */
> > > >  static inline uint32_t
> > > 
> > > Why not change the return type to int32_t?
> > > In this way, the caller isn't required to make the assumption that a large
> > > queue count indicates an error.  < 0 means error, other wise it's a valid
> > > queue count.
> > > 
> > > This approach would be consistent with other APIs.
> > > 
> > 
> > Yes, good point, I should see about that. One thing I'm unsure of, though, is
> > does this count as ABI breakage? I don't see how it should break any older
> > apps, since the return type is the same size, but I'm not sure as we are 
> > changing the return type of the function.
> > 
> > Neil, can you perhaps comment here? Is changing uint32_t to int32_t ok, from
> > an ABI point of view?
> > 
> > Regards,
> > /Bruce
> 
> 

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCHv4 1/5] ethdev: add new API to retrieve RX/TX queue information
  2015-07-24 10:50  3%           ` Ananyev, Konstantin
@ 2015-07-24 12:40  3%             ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-07-24 12:40 UTC (permalink / raw)
  To: Ananyev, Konstantin; +Cc: dev

2015-07-24 10:50, Ananyev, Konstantin:
> From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> > 2015-07-24 09:15, Ananyev, Konstantin:
> > > From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> > > > 2015-07-22 19:28, Konstantin Ananyev:
> > > > > +struct rte_eth_rxq_info {
> > > > > +	struct rte_mempool *mp;     /**< mempool used by that queue. */
> > > > > +	struct rte_eth_rxconf conf; /**< queue config parameters. */
> > > > > +	uint8_t scattered_rx;       /**< scattered packets RX supported. */
> > > > > +	uint16_t nb_desc;           /**< configured number of RXDs. */
> > > >
> > > > Shouldn't we move nb_desc in rte_eth_rxconf?
> > > > So rte_eth_rx_queue_setup() would have less parameters.
> > >
> > > I thought about that too, but it seems more drawbacks then pluses with that idea:
> > > 1. Right now it is possible to call rte_eth_rx_queue_setup(..., rx_conf=NULL, ...);
> > > In that case rte_eth_rx_queue_setup()will use default for that device rx_conf.
> > > If we'll move mempool into rxconf, will break that ability.
> > > 2.  A bit unclear what mempool should be returned as default_rxconf by rte_eth_dev_info_get().
> > > Should it be just NULL.
> > 
> > I was only suggesting to move nb_desc, not mempool.
> 
> Ah, sorry didn't read it properly first time.
> Yes, I think it makes sense to move nb_desc into rxconf, though that means ABI breakage,
> and that patch would definitely not make into 2.1.

You can avoid ABI breakage by using the compat macros and/or NEXT_ABI.
But it shouldn't go into 2.1 as the API shouldn't be changed after RC1.

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCHv4 1/5] ethdev: add new API to retrieve RX/TX queue information
  2015-07-24  9:24  0%         ` Thomas Monjalon
@ 2015-07-24 10:50  3%           ` Ananyev, Konstantin
  2015-07-24 12:40  3%             ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Ananyev, Konstantin @ 2015-07-24 10:50 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev



> -----Original Message-----
> From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> Sent: Friday, July 24, 2015 10:24 AM
> To: Ananyev, Konstantin
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCHv4 1/5] ethdev: add new API to retrieve RX/TX queue information
> 
> 2015-07-24 09:15, Ananyev, Konstantin:
> > From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> > > 2015-07-22 19:28, Konstantin Ananyev:
> > > > +struct rte_eth_rxq_info {
> > > > +	struct rte_mempool *mp;     /**< mempool used by that queue. */
> > > > +	struct rte_eth_rxconf conf; /**< queue config parameters. */
> > > > +	uint8_t scattered_rx;       /**< scattered packets RX supported. */
> > > > +	uint16_t nb_desc;           /**< configured number of RXDs. */
> > >
> > > Shouldn't we move nb_desc in rte_eth_rxconf?
> > > So rte_eth_rx_queue_setup() would have less parameters.
> >
> > I thought about that too, but it seems more drawbacks then pluses with that idea:
> > 1. Right now it is possible to call rte_eth_rx_queue_setup(..., rx_conf=NULL, ...);
> > In that case rte_eth_rx_queue_setup()will use default for that device rx_conf.
> > If we'll move mempool into rxconf, will break that ability.
> > 2.  A bit unclear what mempool should be returned as default_rxconf by rte_eth_dev_info_get().
> > Should it be just NULL.
> 
> I was only suggesting to move nb_desc, not mempool.

Ah, sorry didn't read it properly first time.
Yes, I think it makes sense to move nb_desc into rxconf, though that means ABI breakage,
and that patch would definitely not make into 2.1. 

> In case rx_conf==NULL, the nb_desc should be the max allowed by the driver.

In my opinion it should be 'preferable by default' PMD value.
Plus, rte_eth_dev_info should contain  min_rx_desc and max_rx_desc,
so user can select nb_rx_desc from the allowed interval, if he needs to.

Konstantin

> By the way, we should allow nb_desc==0 as it is done in virtio.
> Users shouldn't have to care about queue parameters (including nb_desc) for
> a basic usage.
> 
> > 3. ABI breakage and we (and all customers) will need  to modify each and every RX setup/configure code.
> >
> > For me it just seems like too much hassle, without any clear advanatage.
> 
> The advantage is to have a cleaner API. Seems important to me.

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCHv4 1/5] ethdev: add new API to retrieve RX/TX queue information
  2015-07-24  9:15  3%       ` Ananyev, Konstantin
@ 2015-07-24  9:24  0%         ` Thomas Monjalon
  2015-07-24 10:50  3%           ` Ananyev, Konstantin
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2015-07-24  9:24 UTC (permalink / raw)
  To: Ananyev, Konstantin; +Cc: dev

2015-07-24 09:15, Ananyev, Konstantin:
> From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> > 2015-07-22 19:28, Konstantin Ananyev:
> > > +struct rte_eth_rxq_info {
> > > +	struct rte_mempool *mp;     /**< mempool used by that queue. */
> > > +	struct rte_eth_rxconf conf; /**< queue config parameters. */
> > > +	uint8_t scattered_rx;       /**< scattered packets RX supported. */
> > > +	uint16_t nb_desc;           /**< configured number of RXDs. */
> > 
> > Shouldn't we move nb_desc in rte_eth_rxconf?
> > So rte_eth_rx_queue_setup() would have less parameters.
> 
> I thought about that too, but it seems more drawbacks then pluses with that idea:
> 1. Right now it is possible to call rte_eth_rx_queue_setup(..., rx_conf=NULL, ...);
> In that case rte_eth_rx_queue_setup()will use default for that device rx_conf.
> If we'll move mempool into rxconf, will break that ability.
> 2.  A bit unclear what mempool should be returned as default_rxconf by rte_eth_dev_info_get().
> Should it be just NULL.

I was only suggesting to move nb_desc, not mempool.
In case rx_conf==NULL, the nb_desc should be the max allowed by the driver.
By the way, we should allow nb_desc==0 as it is done in virtio.
Users shouldn't have to care about queue parameters (including nb_desc) for
a basic usage.

> 3. ABI breakage and we (and all customers) will need  to modify each and every RX setup/configure code.
> 
> For me it just seems like too much hassle, without any clear advanatage.

The advantage is to have a cleaner API. Seems important to me.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCHv4 1/5] ethdev: add new API to retrieve RX/TX queue information
  @ 2015-07-24  9:15  3%       ` Ananyev, Konstantin
  2015-07-24  9:24  0%         ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Ananyev, Konstantin @ 2015-07-24  9:15 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev



> -----Original Message-----
> From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> Sent: Thursday, July 23, 2015 5:26 PM
> To: Ananyev, Konstantin
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCHv4 1/5] ethdev: add new API to retrieve RX/TX queue information
> 
> 2015-07-22 19:28, Konstantin Ananyev:
> > +	if (!rte_eth_dev_is_valid_port(port_id)) {
> > +		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
> > +		return -EINVAL;
> > +	}
> 
> Please use VALID_PORTID_OR_ERR_RET.
> 
> > + * Ethernet device RX queue information strcuture.
> 
> Typo here (and same for TX).
> 
> > +struct rte_eth_rxq_info {
> > +	struct rte_mempool *mp;     /**< mempool used by that queue. */
> > +	struct rte_eth_rxconf conf; /**< queue config parameters. */
> > +	uint8_t scattered_rx;       /**< scattered packets RX supported. */
> > +	uint16_t nb_desc;           /**< configured number of RXDs. */
> 
> Shouldn't we move nb_desc in rte_eth_rxconf?
> So rte_eth_rx_queue_setup() would have less parameters.

I thought about that too, but it seems more drawbacks then pluses with that idea:
1. Right now it is possible to call rte_eth_rx_queue_setup(..., rx_conf=NULL, ...);
In that case rte_eth_rx_queue_setup()will use default for that device rx_conf.
If we'll move mempool into rxconf, will break that ability.
2.  A bit unclear what mempool should be returned as default_rxconf by rte_eth_dev_info_get().
Should it be just NULL.
3. ABI breakage and we (and all customers) will need  to modify each and every RX setup/configure code.

For me it just seems like too much hassle, without any clear advanatage.

> 
> > -#ifdef __cplusplus
> > -}
> > -#endif
> > -
> >  /**
> >   * Set the list of multicast addresses to filter on an Ethernet device.
> >   *
> > @@ -3882,4 +3952,9 @@ extern int rte_eth_timesync_read_rx_timestamp(uint8_t port_id,
> >   */
> >  extern int rte_eth_timesync_read_tx_timestamp(uint8_t port_id,
> >  					      struct timespec *timestamp);
> > +
> > +#ifdef __cplusplus
> > +}
> > +#endif
> > +
> >  #endif /* _RTE_ETHDEV_H_ */
> 
> Please send this change in a separate patch alone.

Ok, will do.

Konstantin

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v2 1/2] Remove ABI requierment for external library builds.
  2015-07-23 15:00  4% ` [dpdk-dev] [PATCH v2 0/2] Example: l2fwd-ethtool Liang-Min Larry Wang
@ 2015-07-23 15:00  4%   ` Liang-Min Larry Wang
  0 siblings, 0 replies; 200+ results
From: Liang-Min Larry Wang @ 2015-07-23 15:00 UTC (permalink / raw)
  To: dev

From: "Andrew G. Harvey" <agh@cisco.com>

Signed-off-by: Andrew G. Harvey <agh@cisco.com>
---
 mk/rte.extlib.mk | 2 ++
 mk/rte.lib.mk    | 6 ++++++
 2 files changed, 8 insertions(+)

diff --git a/mk/rte.extlib.mk b/mk/rte.extlib.mk
index ba066bc..d2a9b6d 100644
--- a/mk/rte.extlib.mk
+++ b/mk/rte.extlib.mk
@@ -31,6 +31,8 @@
 
 MAKEFLAGS += --no-print-directory
 
+export EXTLIB_BUILD := 1
+
 # we must create the output dir first and recall the same Makefile
 # from this directory
 ifeq ($(NOT_FIRST_CALL),)
diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index 9ff5cce..63ca640 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -40,11 +40,13 @@ VPATH += $(SRCDIR)
 
 ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),y)
 LIB := $(patsubst %.a,%.so.$(LIBABIVER),$(LIB))
+ifndef EXTLIB_BUILD
 ifeq ($(CONFIG_RTE_NEXT_ABI),y)
 LIB := $(LIB).1
 endif
 CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
 endif
+endif
 
 
 _BUILD = $(LIB)
@@ -173,12 +175,16 @@ $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
 	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
 	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
 ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),y)
+ifdef EXTLIB_BUILD
+	$(Q)ln -s -f $< $(basename $@)
+else
 ifeq ($(CONFIG_RTE_NEXT_ABI),y)
 	$(Q)ln -s -f $< $(basename $(basename $@))
 else
 	$(Q)ln -s -f $< $(basename $@)
 endif
 endif
+endif
 
 #
 # Clean all generated files
-- 
2.1.4

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v2 0/2] Example: l2fwd-ethtool
  @ 2015-07-23 15:00  4% ` Liang-Min Larry Wang
  2015-07-23 15:00  4%   ` [dpdk-dev] [PATCH v2 1/2] Remove ABI requierment for external library builds Liang-Min Larry Wang
  0 siblings, 1 reply; 200+ results
From: Liang-Min Larry Wang @ 2015-07-23 15:00 UTC (permalink / raw)
  To: dev; +Cc: Liang-Min Larry Wang

This implementation is designed to provide an example illlustrating how to create a
user-space ethtool library from existing ethdev APIs. In contrast to kernel version
of same API (such as ops defined in KNI), the user-space APIs enable a fast-path
(no kernel API calls) for device query and data return. This example implements 19 popular
used Ethtool and Netdevice ops as described in examples/l2fwd-ethtool/lib/rte_ethtool.h,
and commnity support of un-implemented Ethtool and Netdevice ops are very welcomed.

v2 change:
- Separate changes on .mk files into a separate patch file
- Remove requirement of ABI version for external library build
- Fix example/l2fwd-ethtool share object build

Andrew G. Harvey (1):
  Remove ABI requierment for external library builds.

Liang-Min Larry Wang (1):
  examples: new example: l2fwd-ethtool

 examples/Makefile                                |    1 +
 examples/l2fwd-ethtool/Makefile                  |   48 +
 examples/l2fwd-ethtool/l2fwd-app/Makefile        |   58 ++
 examples/l2fwd-ethtool/l2fwd-app/main.c          | 1025 ++++++++++++++++++++++
 examples/l2fwd-ethtool/l2fwd-app/netdev_api.h    |  770 ++++++++++++++++
 examples/l2fwd-ethtool/l2fwd-app/shared_fifo.h   |  159 ++++
 examples/l2fwd-ethtool/lib/Makefile              |   57 ++
 examples/l2fwd-ethtool/lib/rte_ethtool.c         |  336 +++++++
 examples/l2fwd-ethtool/lib/rte_ethtool.h         |  385 ++++++++
 examples/l2fwd-ethtool/nic-control/Makefile      |   55 ++
 examples/l2fwd-ethtool/nic-control/nic_control.c |  614 +++++++++++++
 mk/rte.extlib.mk                                 |    2 +
 mk/rte.lib.mk                                    |    6 +
 13 files changed, 3516 insertions(+)
 create mode 100644 examples/l2fwd-ethtool/Makefile
 create mode 100644 examples/l2fwd-ethtool/l2fwd-app/Makefile
 create mode 100644 examples/l2fwd-ethtool/l2fwd-app/main.c
 create mode 100644 examples/l2fwd-ethtool/l2fwd-app/netdev_api.h
 create mode 100644 examples/l2fwd-ethtool/l2fwd-app/shared_fifo.h
 create mode 100644 examples/l2fwd-ethtool/lib/Makefile
 create mode 100644 examples/l2fwd-ethtool/lib/rte_ethtool.c
 create mode 100644 examples/l2fwd-ethtool/lib/rte_ethtool.h
 create mode 100644 examples/l2fwd-ethtool/nic-control/Makefile
 create mode 100644 examples/l2fwd-ethtool/nic-control/nic_control.c

-- 
2.1.4

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v15 00/13] Interrupt mode PMD
  2015-07-20  3:02  4%     ` [dpdk-dev] [PATCH v15 00/13] Interrupt mode PMD Cunming Liang
                         ` (9 preceding siblings ...)
  2015-07-20  3:02  2%       ` [dpdk-dev] [PATCH v15 13/13] l3fwd-power: enable one-shot rx interrupt and polling/interrupt mode switch Cunming Liang
@ 2015-07-23 14:18  3%       ` Liang, Cunming
  2015-07-27 21:34  0%         ` Thomas Monjalon
  10 siblings, 1 reply; 200+ results
From: Liang, Cunming @ 2015-07-23 14:18 UTC (permalink / raw)
  To: dev, thomas.monjalon; +Cc: shemming

Hi Thomas and all,

This patch set postponed from v2.0, and widely reviewed during this release cycle.
The packet I/O interrupt framework is the prerequisite of all PMDs to support packet I/O intr.
There's no significant change since the last three version(v13~v15), the changes are about ABI and version map fixing.
It missed the rc1 in the last minutes, I'm now asking for the exception to make it go into v2.1 rc2 if nobody will reject it.
Again, thanks for all the comments by Stephen, David, Neil and Thomas.

Thanks,
Steve

> -----Original Message-----
> From: Liang, Cunming
> Sent: Monday, July 20, 2015 11:02 AM
> To: dev@dpdk.org; thomas.monjalon@6wind.com
> Cc: shemming@brocade.com; david.marchand@6wind.com; Zhou, Danny; Liu,
> Yong; nhorman@tuxdriver.com; Liang, Cunming
> Subject: [PATCH v15 00/13] Interrupt mode PMD
> 
> v15 changes
>  - remove unnecessary RTE_NEXT_ABI comment
>  - remove ifdef RTE_NEXT_ABI from header file
> 
> v14 changes
>  - per-patch basis ABI compatibility rework
>  - remove unnecessary 'local: *' from version map
>  - minor comments rework
> 
> v13 changes
>  - version map cleanup for v2.1
>  - replace RTE_EAL_RX_INTR by RTE_NEXT_ABI for ABI compatibility
> 
> Patch series v12
> Acked-by: Stephen Hemminger <stephen@networkplumber.org>
> Acked-by: Danny Zhou <danny.zhou@intel.com>
> 
> v12 changes
>  - bsd cleanup for unused variable warning
>  - fix awkward line split in debug message
> 
> v11 changes
>  - typo cleanup and check kernel style
> 
> v10 changes
>  - code rework to return actual error code
>  - bug fix for lsc when using uio_pci_generic
> 
> v9 changes
>  - code rework to fix open comment
>  - bug fix for igb lsc when both lsc and rxq are enabled in vfio-msix
>  - new patch to turn off the feature by default so as to avoid v2.1 abi broken
> 
> v8 changes
>  - remove condition check for only vfio-msix
>  - add multiplex intr support when only one intr vector allowed
>  - lsc and rxq interrupt runtime enable decision
>  - add safe event delete while the event wakeup execution happens
> 
> v7 changes
>  - decouple epoll event and intr operation
>  - add condition check in the case intr vector is disabled
>  - renaming some APIs
> 
> v6 changes
>  - split rte_intr_wait_rx_pkt into two APIs 'wait' and 'set'.
>  - rewrite rte_intr_rx_wait/rte_intr_rx_set.
>  - using vector number instead of queue_id as interrupt API params.
>  - patch reorder and split.
> 
> 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. [FIXED]
> 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.
> 
> Cunming Liang (13):
>   eal/linux: add interrupt vectors support in intr_handle
>   eal/linux: add rte_epoll_wait/ctl support
>   eal/linux: add API to set rx interrupt event monitor
>   eal/linux: fix comments typo on vfio msi
>   eal/linux: map eventfd to VFIO MSI-X intr vector
>   eal/linux: standalone intr event fd create support
>   eal/linux: fix lsc read error in uio_pci_generic
>   eal/bsd: dummy for new intr definition
>   eal/bsd: fix inappropriate linuxapp referred in bsd
>   ethdev: add rx intr enable, disable and ctl functions
>   ixgbe: enable rx queue interrupts for both PF and VF
>   igb: enable rx queue interrupts for PF
>   l3fwd-power: enable one-shot rx interrupt and polling/interrupt mode
>     switch
> 
>  drivers/net/e1000/igb_ethdev.c                     | 311 ++++++++++--
>  drivers/net/ixgbe/ixgbe_ethdev.c                   | 527
> ++++++++++++++++++++-
>  drivers/net/ixgbe/ixgbe_ethdev.h                   |   4 +
>  examples/l3fwd-power/main.c                        | 205 ++++++--
>  lib/librte_eal/bsdapp/eal/eal_interrupts.c         |  42 ++
>  .../bsdapp/eal/include/exec-env/rte_interrupts.h   |  74 ++-
>  lib/librte_eal/bsdapp/eal/rte_eal_version.map      |   5 +
>  lib/librte_eal/linuxapp/eal/eal_interrupts.c       | 414 ++++++++++++++--
>  .../linuxapp/eal/include/exec-env/rte_interrupts.h | 153 ++++++
>  lib/librte_eal/linuxapp/eal/rte_eal_version.map    |   8 +
>  lib/librte_ether/rte_ethdev.c                      | 147 ++++++
>  lib/librte_ether/rte_ethdev.h                      | 104 ++++
>  lib/librte_ether/rte_ether_version.map             |   4 +
>  13 files changed, 1870 insertions(+), 128 deletions(-)
> 
> --
> 1.8.1.4

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v2] announce ABI change for librte_table
  2015-07-23 10:59  4% [dpdk-dev] [PATCH v2] announce ABI change for librte_table Cristian Dumitrescu
  2015-07-23 11:05  4% ` Singh, Jasvinder
  2015-07-23 11:07  4% ` Mrzyglod, DanielX T
@ 2015-07-23 11:34  4% ` Gajdzica, MaciejX T
  2 siblings, 0 replies; 200+ results
From: Gajdzica, MaciejX T @ 2015-07-23 11:34 UTC (permalink / raw)
  To: Dumitrescu, Cristian, dev

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Cristian Dumitrescu
> Sent: Thursday, July 23, 2015 1:00 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v2] announce ABI change for librte_table
> 
> v2 changes:
> -changed item on LPM table to add LPM IPv6 -removed item for ACL table and
> replaced with item on table ops -added item for hash tables
> 
> Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
> ---

Acked-by: Maciej Gajdzica <maciejx.t.gajdzica@intel.com>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v2] announce ABI change for librte_table
  2015-07-23 10:59  4% [dpdk-dev] [PATCH v2] announce ABI change for librte_table Cristian Dumitrescu
@ 2015-07-23 11:05  4% ` Singh, Jasvinder
  2015-08-15 21:48  4%   ` Thomas Monjalon
  2015-07-23 11:07  4% ` Mrzyglod, DanielX T
  2015-07-23 11:34  4% ` Gajdzica, MaciejX T
  2 siblings, 1 reply; 200+ results
From: Singh, Jasvinder @ 2015-07-23 11:05 UTC (permalink / raw)
  To: Dumitrescu, Cristian, dev



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Cristian Dumitrescu
> Sent: Thursday, July 23, 2015 12:00 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v2] announce ABI change for librte_table
> 
> v2 changes:
> -changed item on LPM table to add LPM IPv6 -removed item for ACL table
> and replaced with item on table ops -added item for hash tables
> 
> Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
> ---

Acked-by: Jasvinder Singh <jasvinder.singh@intel.com>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v2] announce ABI change for librte_table
  2015-07-23 10:59  4% [dpdk-dev] [PATCH v2] announce ABI change for librte_table Cristian Dumitrescu
  2015-07-23 11:05  4% ` Singh, Jasvinder
@ 2015-07-23 11:07  4% ` Mrzyglod, DanielX T
  2015-07-23 11:34  4% ` Gajdzica, MaciejX T
  2 siblings, 0 replies; 200+ results
From: Mrzyglod, DanielX T @ 2015-07-23 11:07 UTC (permalink / raw)
  To: Dumitrescu, Cristian, dev

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Cristian Dumitrescu
> Sent: Thursday, July 23, 2015 1:00 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v2] announce ABI change for librte_table
> 
> v2 changes:
> -changed item on LPM table to add LPM IPv6
> -removed item for ACL table and replaced with item on table ops
> -added item for hash tables
> 
> Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
> ---
>  doc/guides/rel_notes/deprecation.rst |   10 ++++++++++
>  1 files changed, 10 insertions(+), 0 deletions(-)
> 
> diff --git a/doc/guides/rel_notes/deprecation.rst
> b/doc/guides/rel_notes/deprecation.rst
> index 5330d3b..677f111 100644
> --- a/doc/guides/rel_notes/deprecation.rst
> +++ b/doc/guides/rel_notes/deprecation.rst
> @@ -35,3 +35,13 @@ Deprecation Notices
>  * The following fields have been deprecated in rte_eth_stats:
>    imissed, ibadcrc, ibadlen, imcasts, fdirmatch, fdirmiss,
>    tx_pause_xon, rx_pause_xon, tx_pause_xoff, rx_pause_xoff
> +
> +* librte_table (rte_table_lpm.h, rte_table_lpm_ipv6.h): A new parameter to
> hold
> +  the table name will be added to the LPM table parameter structure.
> +
> +* librte_table (rte_table.h): New functions for table entry bulk add/delete will
> +  be added to the table operations structure.
> +
> +* librte_table (rte_table_hash.h): Key mask parameter will be added to the hash
> +  table parameter structure for 8-byte key and 16-byte key extendible bucket
> and
> +  LRU tables.
> --
> 1.7.4.1

Acked-by: Daniel Mrzyglod <danielx.t.mrzyglod@intel.com>

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v2] announce ABI change for librte_table
@ 2015-07-23 10:59  4% Cristian Dumitrescu
  2015-07-23 11:05  4% ` Singh, Jasvinder
                   ` (2 more replies)
  0 siblings, 3 replies; 200+ results
From: Cristian Dumitrescu @ 2015-07-23 10:59 UTC (permalink / raw)
  To: dev

v2 changes:
-changed item on LPM table to add LPM IPv6
-removed item for ACL table and replaced with item on table ops 
-added item for hash tables

Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
---
 doc/guides/rel_notes/deprecation.rst |   10 ++++++++++
 1 files changed, 10 insertions(+), 0 deletions(-)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 5330d3b..677f111 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -35,3 +35,13 @@ Deprecation Notices
 * The following fields have been deprecated in rte_eth_stats:
   imissed, ibadcrc, ibadlen, imcasts, fdirmatch, fdirmiss,
   tx_pause_xon, rx_pause_xon, tx_pause_xoff, rx_pause_xoff
+
+* librte_table (rte_table_lpm.h, rte_table_lpm_ipv6.h): A new parameter to hold
+  the table name will be added to the LPM table parameter structure.
+
+* librte_table (rte_table.h): New functions for table entry bulk add/delete will
+  be added to the table operations structure.
+
+* librte_table (rte_table_hash.h): Key mask parameter will be added to the hash
+  table parameter structure for 8-byte key and 16-byte key extendible bucket and
+  LRU tables.
-- 
1.7.4.1

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCHv4 1/5] ethdev: add new API to retrieve RX/TX queue information
  2015-07-22 19:48  0%     ` Stephen Hemminger
@ 2015-07-23 10:52  0%       ` Ananyev, Konstantin
  0 siblings, 0 replies; 200+ results
From: Ananyev, Konstantin @ 2015-07-23 10:52 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev



> -----Original Message-----
> From: Stephen Hemminger [mailto:stephen@networkplumber.org]
> Sent: Wednesday, July 22, 2015 8:48 PM
> To: Ananyev, Konstantin
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCHv4 1/5] ethdev: add new API to retrieve RX/TX queue information
> 
> On Wed, 22 Jul 2015 19:28:51 +0100
> Konstantin Ananyev <konstantin.ananyev@intel.com> wrote:
> 
> > Add the ability for the upper layer to query RX/TX queue information.
> >
> > Add new structures:
> > struct rte_eth_rxq_info
> > struct rte_eth_txq_info
> >
> > new functions:
> > rte_eth_rx_queue_info_get
> > rte_eth_tx_queue_info_get
> >
> > into rte_etdev API.
> >
> > Left extra free space in the queue info structures,
> > so extra fields could be added later without ABI breakage.
> >
> > v2 changes:
> > - Add formal check for the qinfo input parameter.
> > - As suggested rename 'rx_qinfo/tx_qinfo' to 'rxq_info/txq_info'
> >
> > v3 changes:
> > - Updated rte_ether_version.map
> > - Merged with latest changes
> >
> > v4 changes:
> > - rte_ether_version.map: move new functions into DPDK_2.1 sub-space.
> >
> > Signed-off-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
> 
> Since all this data should be rxconf already, Is it possible
> to do a generic version of this and not have to change every driver.

I don't think it is possible to implement these two functions at rte_etdev level only.
At least not with current ethdev/PMD implementation:
-  Inside struct rte_eth_dev_info we have only: 'struct rte_eth_rxconf default_rxconf;'.
We don't have rxconf here for each configured rx queue.
That information is maintained by PMD and inside PMD, different devices have different format for queue structure.
- rte_eth_rxq_info contains not only rxconf but some extra information: mempool in use by that queue,
 min/max possible number of descriptors.
 Also my intention was that in future that structure would be extended to provide some RT info about queue:
 (number of free/used descriptors from SW point of view, etc).  

Konstantin

> 
> You only handled the Intel hardware drivers. But there also
> all the virtual drivers, other vendors etc.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for librte_sched
  2015-07-16 21:21 14% [dpdk-dev] [PATCH] doc: announce ABI change for librte_sched Stephen Hemminger
  2015-07-16 21:25  4% ` Dumitrescu, Cristian
  2015-07-16 21:28  4% ` Neil Horman
@ 2015-07-23 10:18  4% ` Dumitrescu, Cristian
  2 siblings, 0 replies; 200+ results
From: Dumitrescu, Cristian @ 2015-07-23 10:18 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev

Acked-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCHv4 1/5] ethdev: add new API to retrieve RX/TX queue information
  2015-07-22 18:28  2%   ` [dpdk-dev] [PATCHv4 " Konstantin Ananyev
@ 2015-07-22 19:48  0%     ` Stephen Hemminger
  2015-07-23 10:52  0%       ` Ananyev, Konstantin
    1 sibling, 1 reply; 200+ results
From: Stephen Hemminger @ 2015-07-22 19:48 UTC (permalink / raw)
  To: Konstantin Ananyev; +Cc: dev

On Wed, 22 Jul 2015 19:28:51 +0100
Konstantin Ananyev <konstantin.ananyev@intel.com> wrote:

> Add the ability for the upper layer to query RX/TX queue information.
> 
> Add new structures:
> struct rte_eth_rxq_info
> struct rte_eth_txq_info
> 
> new functions:
> rte_eth_rx_queue_info_get
> rte_eth_tx_queue_info_get
> 
> into rte_etdev API.
> 
> Left extra free space in the queue info structures,
> so extra fields could be added later without ABI breakage.
> 
> v2 changes:
> - Add formal check for the qinfo input parameter.
> - As suggested rename 'rx_qinfo/tx_qinfo' to 'rxq_info/txq_info'
> 
> v3 changes:
> - Updated rte_ether_version.map
> - Merged with latest changes
> 
> v4 changes:
> - rte_ether_version.map: move new functions into DPDK_2.1 sub-space.
> 
> Signed-off-by: Konstantin Ananyev <konstantin.ananyev@intel.com>

Since all this data should be rxconf already, Is it possible
to do a generic version of this and not have to change every driver.

You only handled the Intel hardware drivers. But there also
all the virtual drivers, other vendors etc.

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCHv4 1/5] ethdev: add new API to retrieve RX/TX queue information
  2015-07-20 12:19  2% ` [dpdk-dev] [PATCHv3 1/5] " Konstantin Ananyev
  2015-07-22 16:50  0%   ` Zhang, Helin
@ 2015-07-22 18:28  2%   ` Konstantin Ananyev
  2015-07-22 19:48  0%     ` Stephen Hemminger
    1 sibling, 2 replies; 200+ results
From: Konstantin Ananyev @ 2015-07-22 18:28 UTC (permalink / raw)
  To: dev

Add the ability for the upper layer to query RX/TX queue information.

Add new structures:
struct rte_eth_rxq_info
struct rte_eth_txq_info

new functions:
rte_eth_rx_queue_info_get
rte_eth_tx_queue_info_get

into rte_etdev API.

Left extra free space in the queue info structures,
so extra fields could be added later without ABI breakage.

v2 changes:
- Add formal check for the qinfo input parameter.
- As suggested rename 'rx_qinfo/tx_qinfo' to 'rxq_info/txq_info'

v3 changes:
- Updated rte_ether_version.map
- Merged with latest changes

v4 changes:
- rte_ether_version.map: move new functions into DPDK_2.1 sub-space.

Signed-off-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
---
 lib/librte_ether/rte_ethdev.c          | 54 +++++++++++++++++++++
 lib/librte_ether/rte_ethdev.h          | 87 +++++++++++++++++++++++++++++++---
 lib/librte_ether/rte_ether_version.map |  2 +
 3 files changed, 137 insertions(+), 6 deletions(-)

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 94104ce..a94c119 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -3341,6 +3341,60 @@ rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id,
 }
 
 int
+rte_eth_rx_queue_info_get(uint8_t port_id, uint16_t queue_id,
+	struct rte_eth_rxq_info *qinfo)
+{
+	struct rte_eth_dev *dev;
+
+	if (qinfo == NULL)
+		return -EINVAL;
+
+	if (!rte_eth_dev_is_valid_port(port_id)) {
+		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
+		return -EINVAL;
+	}
+
+	dev = &rte_eth_devices[port_id];
+	if (queue_id >= dev->data->nb_rx_queues) {
+		PMD_DEBUG_TRACE("Invalid RX queue_id=%d\n", queue_id);
+		return -EINVAL;
+	}
+
+	FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rxq_info_get, -ENOTSUP);
+
+	memset(qinfo, 0, sizeof(*qinfo));
+	dev->dev_ops->rxq_info_get(dev, queue_id, qinfo);
+	return 0;
+}
+
+int
+rte_eth_tx_queue_info_get(uint8_t port_id, uint16_t queue_id,
+	struct rte_eth_txq_info *qinfo)
+{
+	struct rte_eth_dev *dev;
+
+	if (qinfo == NULL)
+		return -EINVAL;
+
+	if (!rte_eth_dev_is_valid_port(port_id)) {
+		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
+		return -EINVAL;
+	}
+
+	dev = &rte_eth_devices[port_id];
+	if (queue_id >= dev->data->nb_tx_queues) {
+		PMD_DEBUG_TRACE("Invalid TX queue_id=%d\n", queue_id);
+		return -EINVAL;
+	}
+
+	FUNC_PTR_OR_ERR_RET(*dev->dev_ops->txq_info_get, -ENOTSUP);
+
+	memset(qinfo, 0, sizeof(*qinfo));
+	dev->dev_ops->txq_info_get(dev, queue_id, qinfo);
+	return 0;
+}
+
+int
 rte_eth_dev_set_mc_addr_list(uint8_t port_id,
 			     struct ether_addr *mc_addr_set,
 			     uint32_t nb_mc_addr)
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index c901a2c..0c6705e 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -960,6 +960,30 @@ struct rte_eth_xstats {
 	uint64_t value;
 };
 
+/**
+ * Ethernet device RX queue information strcuture.
+ * Used to retieve information about configured queue.
+ */
+struct rte_eth_rxq_info {
+	struct rte_mempool *mp;     /**< mempool used by that queue. */
+	struct rte_eth_rxconf conf; /**< queue config parameters. */
+	uint8_t scattered_rx;       /**< scattered packets RX supported. */
+	uint16_t nb_desc;           /**< configured number of RXDs. */
+	uint16_t max_desc;          /**< max allowed number of RXDs. */
+	uint16_t min_desc;          /**< min allowed number of RXDs. */
+} __rte_cache_aligned;
+
+/**
+ * Ethernet device TX queue information strcuture.
+ * Used to retieve information about configured queue.
+ */
+struct rte_eth_txq_info {
+	struct rte_eth_txconf conf; /**< queue config parameters. */
+	uint16_t nb_desc;           /**< configured number of TXDs. */
+	uint16_t max_desc;          /**< max allowed number of TXDs. */
+	uint16_t min_desc;          /**< min allowed number of TXDs. */
+} __rte_cache_aligned;
+
 struct rte_eth_dev;
 
 struct rte_eth_dev_callback;
@@ -1063,6 +1087,12 @@ typedef uint32_t (*eth_rx_queue_count_t)(struct rte_eth_dev *dev,
 typedef int (*eth_rx_descriptor_done_t)(void *rxq, uint16_t offset);
 /**< @internal Check DD bit of specific RX descriptor */
 
+typedef void (*eth_rxq_info_get_t)(struct rte_eth_dev *dev,
+	uint16_t rx_queue_id, struct rte_eth_rxq_info *qinfo);
+
+typedef void (*eth_txq_info_get_t)(struct rte_eth_dev *dev,
+	uint16_t tx_queue_id, struct rte_eth_txq_info *qinfo);
+
 typedef int (*mtu_set_t)(struct rte_eth_dev *dev, uint16_t mtu);
 /**< @internal Set MTU. */
 
@@ -1451,9 +1481,13 @@ struct eth_dev_ops {
 	rss_hash_update_t rss_hash_update;
 	/** Get current RSS hash configuration. */
 	rss_hash_conf_get_t rss_hash_conf_get;
-	eth_filter_ctrl_t              filter_ctrl;          /**< common filter control*/
+	eth_filter_ctrl_t              filter_ctrl;
+	/**< common filter control. */
 	eth_set_mc_addr_list_t set_mc_addr_list; /**< set list of mcast addrs */
-
+	eth_rxq_info_get_t rxq_info_get;
+	/**< retrieve RX queue information. */
+	eth_txq_info_get_t txq_info_get;
+	/**< retrieve TX queue information. */
 	/** Turn IEEE1588/802.1AS timestamping on. */
 	eth_timesync_enable_t timesync_enable;
 	/** Turn IEEE1588/802.1AS timestamping off. */
@@ -3721,6 +3755,46 @@ int rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id,
 		struct rte_eth_rxtx_callback *user_cb);
 
 /**
+ * Retrieve information about given port's RX queue.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param queue_id
+ *   The RX queue on the Ethernet device for which information
+ *   will be retrieved.
+ * @param qinfo
+ *   A pointer to a structure of type *rte_eth_rxq_info_info* to be filled with
+ *   the information of the Ethernet device.
+ *
+ * @return
+ *   - 0: Success
+ *   - -ENOTSUP: routine is not supported by the device PMD.
+ *   - -EINVAL:  The port_id or the queue_id is out of range.
+ */
+int rte_eth_rx_queue_info_get(uint8_t port_id, uint16_t queue_id,
+	struct rte_eth_rxq_info *qinfo);
+
+/**
+ * Retrieve information about given port's TX queue.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param queue_id
+ *   The TX queue on the Ethernet device for which information
+ *   will be retrieved.
+ * @param qinfo
+ *   A pointer to a structure of type *rte_eth_txq_info_info* to be filled with
+ *   the information of the Ethernet device.
+ *
+ * @return
+ *   - 0: Success
+ *   - -ENOTSUP: routine is not supported by the device PMD.
+ *   - -EINVAL:  The port_id or the queue_id is out of range.
+ */
+int rte_eth_tx_queue_info_get(uint8_t port_id, uint16_t queue_id,
+	struct rte_eth_txq_info *qinfo);
+
+/*
  * Retrieve number of available registers for access
  *
  * @param port_id
@@ -3793,10 +3867,6 @@ int rte_eth_dev_get_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info);
  */
 int rte_eth_dev_set_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info);
 
-#ifdef __cplusplus
-}
-#endif
-
 /**
  * Set the list of multicast addresses to filter on an Ethernet device.
  *
@@ -3882,4 +3952,9 @@ extern int rte_eth_timesync_read_rx_timestamp(uint8_t port_id,
  */
 extern int rte_eth_timesync_read_tx_timestamp(uint8_t port_id,
 					      struct timespec *timestamp);
+
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* _RTE_ETHDEV_H_ */
diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map
index 23cfee9..2bae2cf 100644
--- a/lib/librte_ether/rte_ether_version.map
+++ b/lib/librte_ether/rte_ether_version.map
@@ -117,9 +117,11 @@ DPDK_2.1 {
 	rte_eth_dev_is_valid_port;
 	rte_eth_dev_set_eeprom;
 	rte_eth_dev_set_mc_addr_list;
+	rte_eth_rx_queue_info_get;
 	rte_eth_timesync_disable;
 	rte_eth_timesync_enable;
 	rte_eth_timesync_read_rx_timestamp;
 	rte_eth_timesync_read_tx_timestamp;
+	rte_eth_tx_queue_info_get;
 
 } DPDK_2.0;
-- 
1.8.3.1

^ permalink raw reply	[relevance 2%]

* Re: [dpdk-dev] [PATCHv3 1/5] ethdev: add new API to retrieve RX/TX queue information
  2015-07-22 16:50  0%   ` Zhang, Helin
@ 2015-07-22 17:00  0%     ` Ananyev, Konstantin
  0 siblings, 0 replies; 200+ results
From: Ananyev, Konstantin @ 2015-07-22 17:00 UTC (permalink / raw)
  To: Zhang, Helin; +Cc: dev



> -----Original Message-----
> From: Zhang, Helin
> Sent: Wednesday, July 22, 2015 5:51 PM
> To: Ananyev, Konstantin
> Cc: dev@dpdk.org
> Subject: RE: [dpdk-dev] [PATCHv3 1/5] ethdev: add new API to retrieve RX/TX queue information
> 
> 
> 
> > -----Original Message-----
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Konstantin Ananyev
> > Sent: Monday, July 20, 2015 5:19 AM
> > To: dev@dpdk.org
> > Subject: [dpdk-dev] [PATCHv3 1/5] ethdev: add new API to retrieve RX/TX queue
> > information
> >
> > Add the ability for the upper layer to query RX/TX queue information.
> >
> > Add new structures:
> > struct rte_eth_rxq_info
> > struct rte_eth_txq_info
> >
> > new functions:
> > rte_eth_rx_queue_info_get
> > rte_eth_tx_queue_info_get
> >
> > into rte_etdev API.
> >
> > Left extra free space in the queue info structures, so extra fields could be added
> > later without ABI breakage.
> >
> > v2 changes:
> > - Add formal check for the qinfo input parameter.
> > - As suggested rename 'rx_qinfo/tx_qinfo' to 'rxq_info/txq_info'
> >
> > v3 changes:
> > - Updated rte_ether_version.map
> > - Merged with latest changes
> >
> > Signed-off-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
> > ---
> >  lib/librte_ether/rte_ethdev.c          | 54 +++++++++++++++++++++
> >  lib/librte_ether/rte_ethdev.h          | 87
> > +++++++++++++++++++++++++++++++---
> >  lib/librte_ether/rte_ether_version.map |  2 +
> >  3 files changed, 137 insertions(+), 6 deletions(-)
> >
> > diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index
> > 94104ce..a94c119 100644
> > --- a/lib/librte_ether/rte_ethdev.c
> > +++ b/lib/librte_ether/rte_ethdev.c
> > @@ -3341,6 +3341,60 @@ rte_eth_remove_tx_callback(uint8_t port_id, uint16_t
> > queue_id,  }
> >
> >  int
> > +rte_eth_rx_queue_info_get(uint8_t port_id, uint16_t queue_id,
> > +	struct rte_eth_rxq_info *qinfo)
> > +{
> > +	struct rte_eth_dev *dev;
> > +
> > +	if (qinfo == NULL)
> > +		return -EINVAL;
> > +
> > +	if (!rte_eth_dev_is_valid_port(port_id)) {
> > +		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
> > +		return -EINVAL;
> > +	}
> > +
> > +	dev = &rte_eth_devices[port_id];
> > +	if (queue_id >= dev->data->nb_rx_queues) {
> > +		PMD_DEBUG_TRACE("Invalid RX queue_id=%d\n", queue_id);
> > +		return -EINVAL;
> > +	}
> > +
> > +	FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rxq_info_get, -ENOTSUP);
> > +
> > +	memset(qinfo, 0, sizeof(*qinfo));
> > +	dev->dev_ops->rxq_info_get(dev, queue_id, qinfo);
> > +	return 0;
> > +}
> > +
> > +int
> > +rte_eth_tx_queue_info_get(uint8_t port_id, uint16_t queue_id,
> > +	struct rte_eth_txq_info *qinfo)
> > +{
> > +	struct rte_eth_dev *dev;
> > +
> > +	if (qinfo == NULL)
> > +		return -EINVAL;
> > +
> > +	if (!rte_eth_dev_is_valid_port(port_id)) {
> > +		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
> > +		return -EINVAL;
> > +	}
> > +
> > +	dev = &rte_eth_devices[port_id];
> > +	if (queue_id >= dev->data->nb_tx_queues) {
> > +		PMD_DEBUG_TRACE("Invalid TX queue_id=%d\n", queue_id);
> > +		return -EINVAL;
> > +	}
> > +
> > +	FUNC_PTR_OR_ERR_RET(*dev->dev_ops->txq_info_get, -ENOTSUP);
> > +
> > +	memset(qinfo, 0, sizeof(*qinfo));
> > +	dev->dev_ops->txq_info_get(dev, queue_id, qinfo);
> > +	return 0;
> > +}
> > +
> > +int
> >  rte_eth_dev_set_mc_addr_list(uint8_t port_id,
> >  			     struct ether_addr *mc_addr_set,
> >  			     uint32_t nb_mc_addr)
> > diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index
> > c901a2c..0c6705e 100644
> > --- a/lib/librte_ether/rte_ethdev.h
> > +++ b/lib/librte_ether/rte_ethdev.h
> > @@ -960,6 +960,30 @@ struct rte_eth_xstats {
> >  	uint64_t value;
> >  };
> >
> > +/**
> > + * Ethernet device RX queue information strcuture.
> > + * Used to retieve information about configured queue.
> > + */
> > +struct rte_eth_rxq_info {
> > +	struct rte_mempool *mp;     /**< mempool used by that queue. */
> > +	struct rte_eth_rxconf conf; /**< queue config parameters. */
> > +	uint8_t scattered_rx;       /**< scattered packets RX supported. */
> > +	uint16_t nb_desc;           /**< configured number of RXDs. */
> > +	uint16_t max_desc;          /**< max allowed number of RXDs. */
> > +	uint16_t min_desc;          /**< min allowed number of RXDs. */
> > +} __rte_cache_aligned;
> > +
> > +/**
> > + * Ethernet device TX queue information strcuture.
> > + * Used to retieve information about configured queue.
> > + */
> > +struct rte_eth_txq_info {
> > +	struct rte_eth_txconf conf; /**< queue config parameters. */
> > +	uint16_t nb_desc;           /**< configured number of TXDs. */
> > +	uint16_t max_desc;          /**< max allowed number of TXDs. */
> > +	uint16_t min_desc;          /**< min allowed number of TXDs. */
> > +} __rte_cache_aligned;
> > +
> >  struct rte_eth_dev;
> >
> >  struct rte_eth_dev_callback;
> > @@ -1063,6 +1087,12 @@ typedef uint32_t (*eth_rx_queue_count_t)(struct
> > rte_eth_dev *dev,  typedef int (*eth_rx_descriptor_done_t)(void *rxq,
> > uint16_t offset);  /**< @internal Check DD bit of specific RX descriptor */
> >
> > +typedef void (*eth_rxq_info_get_t)(struct rte_eth_dev *dev,
> > +	uint16_t rx_queue_id, struct rte_eth_rxq_info *qinfo);
> > +
> > +typedef void (*eth_txq_info_get_t)(struct rte_eth_dev *dev,
> > +	uint16_t tx_queue_id, struct rte_eth_txq_info *qinfo);
> > +
> >  typedef int (*mtu_set_t)(struct rte_eth_dev *dev, uint16_t mtu);  /**<
> > @internal Set MTU. */
> >
> > @@ -1451,9 +1481,13 @@ struct eth_dev_ops {
> >  	rss_hash_update_t rss_hash_update;
> >  	/** Get current RSS hash configuration. */
> >  	rss_hash_conf_get_t rss_hash_conf_get;
> > -	eth_filter_ctrl_t              filter_ctrl;          /**< common filter
> > control*/
> > +	eth_filter_ctrl_t              filter_ctrl;
> > +	/**< common filter control. */
> >  	eth_set_mc_addr_list_t set_mc_addr_list; /**< set list of mcast addrs */
> > -
> > +	eth_rxq_info_get_t rxq_info_get;
> > +	/**< retrieve RX queue information. */
> > +	eth_txq_info_get_t txq_info_get;
> > +	/**< retrieve TX queue information. */
> >  	/** Turn IEEE1588/802.1AS timestamping on. */
> >  	eth_timesync_enable_t timesync_enable;
> >  	/** Turn IEEE1588/802.1AS timestamping off. */ @@ -3721,6 +3755,46 @@
> > int rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id,
> >  		struct rte_eth_rxtx_callback *user_cb);
> Is it targeting R2.1? If no, the new ops should be added at the end of this structure?
> 
> >
> >  /**
> > + * Retrieve information about given port's RX queue.
> > + *
> > + * @param port_id
> > + *   The port identifier of the Ethernet device.
> > + * @param queue_id
> > + *   The RX queue on the Ethernet device for which information
> > + *   will be retrieved.
> > + * @param qinfo
> > + *   A pointer to a structure of type *rte_eth_rxq_info_info* to be filled with
> > + *   the information of the Ethernet device.
> > + *
> > + * @return
> > + *   - 0: Success
> > + *   - -ENOTSUP: routine is not supported by the device PMD.
> > + *   - -EINVAL:  The port_id or the queue_id is out of range.
> > + */
> > +int rte_eth_rx_queue_info_get(uint8_t port_id, uint16_t queue_id,
> > +	struct rte_eth_rxq_info *qinfo);
> > +
> > +/**
> > + * Retrieve information about given port's TX queue.
> > + *
> > + * @param port_id
> > + *   The port identifier of the Ethernet device.
> > + * @param queue_id
> > + *   The TX queue on the Ethernet device for which information
> > + *   will be retrieved.
> > + * @param qinfo
> > + *   A pointer to a structure of type *rte_eth_txq_info_info* to be filled with
> > + *   the information of the Ethernet device.
> > + *
> > + * @return
> > + *   - 0: Success
> > + *   - -ENOTSUP: routine is not supported by the device PMD.
> > + *   - -EINVAL:  The port_id or the queue_id is out of range.
> > + */
> > +int rte_eth_tx_queue_info_get(uint8_t port_id, uint16_t queue_id,
> > +	struct rte_eth_txq_info *qinfo);
> > +
> > +/*
> >   * Retrieve number of available registers for access
> >   *
> >   * @param port_id
> > @@ -3793,10 +3867,6 @@ int rte_eth_dev_get_eeprom(uint8_t port_id, struct
> > rte_dev_eeprom_info *info);
> >   */
> >  int rte_eth_dev_set_eeprom(uint8_t port_id, struct rte_dev_eeprom_info
> > *info);
> >
> > -#ifdef __cplusplus
> > -}
> > -#endif
> 
> 
> > -
> >  /**
> >   * Set the list of multicast addresses to filter on an Ethernet device.
> >   *
> > @@ -3882,4 +3952,9 @@ extern int
> > rte_eth_timesync_read_rx_timestamp(uint8_t port_id,
> >   */
> >  extern int rte_eth_timesync_read_tx_timestamp(uint8_t port_id,
> >  					      struct timespec *timestamp);
> > +
> > +#ifdef __cplusplus
> > +}
> > +#endif
> This is fix for the issue introduced by new ieee1588. It must be added in R2.1 no matter
> these patches can be applied or not.
> 
> > +
> >  #endif /* _RTE_ETHDEV_H_ */
> > diff --git a/lib/librte_ether/rte_ether_version.map
> > b/lib/librte_ether/rte_ether_version.map
> > index 23cfee9..8de0928 100644
> > --- a/lib/librte_ether/rte_ether_version.map
> > +++ b/lib/librte_ether/rte_ether_version.map
> > @@ -92,6 +92,7 @@ DPDK_2.0 {
> >  	rte_eth_rx_burst;
> >  	rte_eth_rx_descriptor_done;
> >  	rte_eth_rx_queue_count;
> > +	rte_eth_rx_queue_info_get;
> >  	rte_eth_rx_queue_setup;
> >  	rte_eth_set_queue_rate_limit;
> >  	rte_eth_set_vf_rate_limit;
> > @@ -99,6 +100,7 @@ DPDK_2.0 {
> >  	rte_eth_stats_get;
> >  	rte_eth_stats_reset;
> >  	rte_eth_tx_burst;
> > +	rte_eth_tx_queue_info_get;
> >  	rte_eth_tx_queue_setup;
> >  	rte_eth_xstats_get;
> >  	rte_eth_xstats_reset;
> I am not quite sure about the version map. But I have a question: does it need to create new {} for DPDK_2.1?
> And should your changes be in DPDK_2.1?

Ah yes, I think you right - it should be in 2.1, not 2.0.
Will re-spin.
Konstantin

> 
> Regards,
> Helin
> 
> > --
> > 1.8.3.1

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCHv3 1/5] ethdev: add new API to retrieve RX/TX queue information
  2015-07-20 12:19  2% ` [dpdk-dev] [PATCHv3 1/5] " Konstantin Ananyev
@ 2015-07-22 16:50  0%   ` Zhang, Helin
  2015-07-22 17:00  0%     ` Ananyev, Konstantin
  2015-07-22 18:28  2%   ` [dpdk-dev] [PATCHv4 " Konstantin Ananyev
  1 sibling, 1 reply; 200+ results
From: Zhang, Helin @ 2015-07-22 16:50 UTC (permalink / raw)
  To: Ananyev, Konstantin; +Cc: dev



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Konstantin Ananyev
> Sent: Monday, July 20, 2015 5:19 AM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCHv3 1/5] ethdev: add new API to retrieve RX/TX queue
> information
> 
> Add the ability for the upper layer to query RX/TX queue information.
> 
> Add new structures:
> struct rte_eth_rxq_info
> struct rte_eth_txq_info
> 
> new functions:
> rte_eth_rx_queue_info_get
> rte_eth_tx_queue_info_get
> 
> into rte_etdev API.
> 
> Left extra free space in the queue info structures, so extra fields could be added
> later without ABI breakage.
> 
> v2 changes:
> - Add formal check for the qinfo input parameter.
> - As suggested rename 'rx_qinfo/tx_qinfo' to 'rxq_info/txq_info'
> 
> v3 changes:
> - Updated rte_ether_version.map
> - Merged with latest changes
> 
> Signed-off-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
> ---
>  lib/librte_ether/rte_ethdev.c          | 54 +++++++++++++++++++++
>  lib/librte_ether/rte_ethdev.h          | 87
> +++++++++++++++++++++++++++++++---
>  lib/librte_ether/rte_ether_version.map |  2 +
>  3 files changed, 137 insertions(+), 6 deletions(-)
> 
> diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index
> 94104ce..a94c119 100644
> --- a/lib/librte_ether/rte_ethdev.c
> +++ b/lib/librte_ether/rte_ethdev.c
> @@ -3341,6 +3341,60 @@ rte_eth_remove_tx_callback(uint8_t port_id, uint16_t
> queue_id,  }
> 
>  int
> +rte_eth_rx_queue_info_get(uint8_t port_id, uint16_t queue_id,
> +	struct rte_eth_rxq_info *qinfo)
> +{
> +	struct rte_eth_dev *dev;
> +
> +	if (qinfo == NULL)
> +		return -EINVAL;
> +
> +	if (!rte_eth_dev_is_valid_port(port_id)) {
> +		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
> +		return -EINVAL;
> +	}
> +
> +	dev = &rte_eth_devices[port_id];
> +	if (queue_id >= dev->data->nb_rx_queues) {
> +		PMD_DEBUG_TRACE("Invalid RX queue_id=%d\n", queue_id);
> +		return -EINVAL;
> +	}
> +
> +	FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rxq_info_get, -ENOTSUP);
> +
> +	memset(qinfo, 0, sizeof(*qinfo));
> +	dev->dev_ops->rxq_info_get(dev, queue_id, qinfo);
> +	return 0;
> +}
> +
> +int
> +rte_eth_tx_queue_info_get(uint8_t port_id, uint16_t queue_id,
> +	struct rte_eth_txq_info *qinfo)
> +{
> +	struct rte_eth_dev *dev;
> +
> +	if (qinfo == NULL)
> +		return -EINVAL;
> +
> +	if (!rte_eth_dev_is_valid_port(port_id)) {
> +		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
> +		return -EINVAL;
> +	}
> +
> +	dev = &rte_eth_devices[port_id];
> +	if (queue_id >= dev->data->nb_tx_queues) {
> +		PMD_DEBUG_TRACE("Invalid TX queue_id=%d\n", queue_id);
> +		return -EINVAL;
> +	}
> +
> +	FUNC_PTR_OR_ERR_RET(*dev->dev_ops->txq_info_get, -ENOTSUP);
> +
> +	memset(qinfo, 0, sizeof(*qinfo));
> +	dev->dev_ops->txq_info_get(dev, queue_id, qinfo);
> +	return 0;
> +}
> +
> +int
>  rte_eth_dev_set_mc_addr_list(uint8_t port_id,
>  			     struct ether_addr *mc_addr_set,
>  			     uint32_t nb_mc_addr)
> diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index
> c901a2c..0c6705e 100644
> --- a/lib/librte_ether/rte_ethdev.h
> +++ b/lib/librte_ether/rte_ethdev.h
> @@ -960,6 +960,30 @@ struct rte_eth_xstats {
>  	uint64_t value;
>  };
> 
> +/**
> + * Ethernet device RX queue information strcuture.
> + * Used to retieve information about configured queue.
> + */
> +struct rte_eth_rxq_info {
> +	struct rte_mempool *mp;     /**< mempool used by that queue. */
> +	struct rte_eth_rxconf conf; /**< queue config parameters. */
> +	uint8_t scattered_rx;       /**< scattered packets RX supported. */
> +	uint16_t nb_desc;           /**< configured number of RXDs. */
> +	uint16_t max_desc;          /**< max allowed number of RXDs. */
> +	uint16_t min_desc;          /**< min allowed number of RXDs. */
> +} __rte_cache_aligned;
> +
> +/**
> + * Ethernet device TX queue information strcuture.
> + * Used to retieve information about configured queue.
> + */
> +struct rte_eth_txq_info {
> +	struct rte_eth_txconf conf; /**< queue config parameters. */
> +	uint16_t nb_desc;           /**< configured number of TXDs. */
> +	uint16_t max_desc;          /**< max allowed number of TXDs. */
> +	uint16_t min_desc;          /**< min allowed number of TXDs. */
> +} __rte_cache_aligned;
> +
>  struct rte_eth_dev;
> 
>  struct rte_eth_dev_callback;
> @@ -1063,6 +1087,12 @@ typedef uint32_t (*eth_rx_queue_count_t)(struct
> rte_eth_dev *dev,  typedef int (*eth_rx_descriptor_done_t)(void *rxq,
> uint16_t offset);  /**< @internal Check DD bit of specific RX descriptor */
> 
> +typedef void (*eth_rxq_info_get_t)(struct rte_eth_dev *dev,
> +	uint16_t rx_queue_id, struct rte_eth_rxq_info *qinfo);
> +
> +typedef void (*eth_txq_info_get_t)(struct rte_eth_dev *dev,
> +	uint16_t tx_queue_id, struct rte_eth_txq_info *qinfo);
> +
>  typedef int (*mtu_set_t)(struct rte_eth_dev *dev, uint16_t mtu);  /**<
> @internal Set MTU. */
> 
> @@ -1451,9 +1481,13 @@ struct eth_dev_ops {
>  	rss_hash_update_t rss_hash_update;
>  	/** Get current RSS hash configuration. */
>  	rss_hash_conf_get_t rss_hash_conf_get;
> -	eth_filter_ctrl_t              filter_ctrl;          /**< common filter
> control*/
> +	eth_filter_ctrl_t              filter_ctrl;
> +	/**< common filter control. */
>  	eth_set_mc_addr_list_t set_mc_addr_list; /**< set list of mcast addrs */
> -
> +	eth_rxq_info_get_t rxq_info_get;
> +	/**< retrieve RX queue information. */
> +	eth_txq_info_get_t txq_info_get;
> +	/**< retrieve TX queue information. */
>  	/** Turn IEEE1588/802.1AS timestamping on. */
>  	eth_timesync_enable_t timesync_enable;
>  	/** Turn IEEE1588/802.1AS timestamping off. */ @@ -3721,6 +3755,46 @@
> int rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id,
>  		struct rte_eth_rxtx_callback *user_cb);
Is it targeting R2.1? If no, the new ops should be added at the end of this structure?

> 
>  /**
> + * Retrieve information about given port's RX queue.
> + *
> + * @param port_id
> + *   The port identifier of the Ethernet device.
> + * @param queue_id
> + *   The RX queue on the Ethernet device for which information
> + *   will be retrieved.
> + * @param qinfo
> + *   A pointer to a structure of type *rte_eth_rxq_info_info* to be filled with
> + *   the information of the Ethernet device.
> + *
> + * @return
> + *   - 0: Success
> + *   - -ENOTSUP: routine is not supported by the device PMD.
> + *   - -EINVAL:  The port_id or the queue_id is out of range.
> + */
> +int rte_eth_rx_queue_info_get(uint8_t port_id, uint16_t queue_id,
> +	struct rte_eth_rxq_info *qinfo);
> +
> +/**
> + * Retrieve information about given port's TX queue.
> + *
> + * @param port_id
> + *   The port identifier of the Ethernet device.
> + * @param queue_id
> + *   The TX queue on the Ethernet device for which information
> + *   will be retrieved.
> + * @param qinfo
> + *   A pointer to a structure of type *rte_eth_txq_info_info* to be filled with
> + *   the information of the Ethernet device.
> + *
> + * @return
> + *   - 0: Success
> + *   - -ENOTSUP: routine is not supported by the device PMD.
> + *   - -EINVAL:  The port_id or the queue_id is out of range.
> + */
> +int rte_eth_tx_queue_info_get(uint8_t port_id, uint16_t queue_id,
> +	struct rte_eth_txq_info *qinfo);
> +
> +/*
>   * Retrieve number of available registers for access
>   *
>   * @param port_id
> @@ -3793,10 +3867,6 @@ int rte_eth_dev_get_eeprom(uint8_t port_id, struct
> rte_dev_eeprom_info *info);
>   */
>  int rte_eth_dev_set_eeprom(uint8_t port_id, struct rte_dev_eeprom_info
> *info);
> 
> -#ifdef __cplusplus
> -}
> -#endif


> -
>  /**
>   * Set the list of multicast addresses to filter on an Ethernet device.
>   *
> @@ -3882,4 +3952,9 @@ extern int
> rte_eth_timesync_read_rx_timestamp(uint8_t port_id,
>   */
>  extern int rte_eth_timesync_read_tx_timestamp(uint8_t port_id,
>  					      struct timespec *timestamp);
> +
> +#ifdef __cplusplus
> +}
> +#endif
This is fix for the issue introduced by new ieee1588. It must be added in R2.1 no matter
these patches can be applied or not.

> +
>  #endif /* _RTE_ETHDEV_H_ */
> diff --git a/lib/librte_ether/rte_ether_version.map
> b/lib/librte_ether/rte_ether_version.map
> index 23cfee9..8de0928 100644
> --- a/lib/librte_ether/rte_ether_version.map
> +++ b/lib/librte_ether/rte_ether_version.map
> @@ -92,6 +92,7 @@ DPDK_2.0 {
>  	rte_eth_rx_burst;
>  	rte_eth_rx_descriptor_done;
>  	rte_eth_rx_queue_count;
> +	rte_eth_rx_queue_info_get;
>  	rte_eth_rx_queue_setup;
>  	rte_eth_set_queue_rate_limit;
>  	rte_eth_set_vf_rate_limit;
> @@ -99,6 +100,7 @@ DPDK_2.0 {
>  	rte_eth_stats_get;
>  	rte_eth_stats_reset;
>  	rte_eth_tx_burst;
> +	rte_eth_tx_queue_info_get;
>  	rte_eth_tx_queue_setup;
>  	rte_eth_xstats_get;
>  	rte_eth_xstats_reset;
I am not quite sure about the version map. But I have a question: does it need to create new {} for DPDK_2.1?
And should your changes be in DPDK_2.1?

Regards,
Helin

> --
> 1.8.3.1

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] hash: move field hash_func_init_val in rte_hash struct
  2015-07-21 14:10  3% [dpdk-dev] [PATCH] hash: move field hash_func_init_val in rte_hash struct Pablo de Lara
@ 2015-07-22  9:08  0% ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-07-22  9:08 UTC (permalink / raw)
  To: Pablo de Lara; +Cc: dev

> In order to keep the ABI consistent with the old hash library,
> hash_func_init_val field has been moved, so it remains
> at the same offset as previously, since hash_func and
> hash_func_init_val are fields accesed by the public function
> rte_hash_hash and must keep the same offset as older versions.
> 
> Signed-off-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>

Applied, thanks

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH] hash: move field hash_func_init_val in rte_hash struct
@ 2015-07-21 14:10  3% Pablo de Lara
  2015-07-22  9:08  0% ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Pablo de Lara @ 2015-07-21 14:10 UTC (permalink / raw)
  To: dev

In order to keep the ABI consistent with the old hash library,
hash_func_init_val field has been moved, so it remains
at the same offset as previously, since hash_func and
hash_func_init_val are fields accesed by the public function
rte_hash_hash and must keep the same offset as older versions.

Signed-off-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
---
 lib/librte_hash/rte_cuckoo_hash.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/librte_hash/rte_cuckoo_hash.c b/lib/librte_hash/rte_cuckoo_hash.c
index dec18ce..5cf4af6 100644
--- a/lib/librte_hash/rte_cuckoo_hash.c
+++ b/lib/librte_hash/rte_cuckoo_hash.c
@@ -105,8 +105,8 @@ struct rte_hash {
 	uint32_t num_buckets;           /**< Number of buckets in table. */
 	uint32_t key_len;               /**< Length of hash key. */
 	rte_hash_function hash_func;    /**< Function used to calculate hash. */
-	rte_hash_cmp_eq_t rte_hash_cmp_eq; /**< Function used to compare keys. */
 	uint32_t hash_func_init_val;    /**< Init value used by hash_func. */
+	rte_hash_cmp_eq_t rte_hash_cmp_eq; /**< Function used to compare keys. */
 	uint32_t bucket_bitmask;        /**< Bitmask for getting bucket index
 						from hash signature. */
 	uint32_t key_entry_size;         /**< Size of each key entry. */
-- 
2.4.2

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH 1/4] doc: rename ABI chapter to deprecation
  2015-07-21 13:20  7%   ` Dumitrescu, Cristian
@ 2015-07-21 14:03  7%     ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-07-21 14:03 UTC (permalink / raw)
  To: Dumitrescu, Cristian; +Cc: dev

2015-07-21 13:20, Dumitrescu, Cristian:
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas Monjalon
> > --- a/doc/guides/rel_notes/abi.rst
> > +++ b/doc/guides/rel_notes/deprecation.rst
> 
> There are some pending doc patches on ABI changes that have been sent and ack-ed prior to this change.
> 
> Due to this change, they cannot be applied cleanly anymore.
> Are you OK to integrate them with the small local change required from your side?

Yes it is a basic merge issue that is easily managed locally.

Though, it would be nice to have at least 3 acks on these patches,
as specified in the ABI policy.

^ permalink raw reply	[relevance 7%]

* Re: [dpdk-dev] [PATCH 1/4] doc: rename ABI chapter to deprecation
  2015-07-19 10:52 36% ` [dpdk-dev] [PATCH 1/4] doc: rename ABI chapter to deprecation Thomas Monjalon
@ 2015-07-21 13:20  7%   ` Dumitrescu, Cristian
  2015-07-21 14:03  7%     ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Dumitrescu, Cristian @ 2015-07-21 13:20 UTC (permalink / raw)
  To: Thomas Monjalon, dev


> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas Monjalon
> Sent: Sunday, July 19, 2015 11:52 AM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH 1/4] doc: rename ABI chapter to deprecation
> 
> This chapter is for ABI and API. That's why a renaming is required.
> 
> Remove also the examples which are now in the referenced guidelines.
> 
> Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
> ---
>  MAINTAINERS                                       |  2 +-
>  doc/guides/rel_notes/{abi.rst => deprecation.rst} | 16 +++++-----------
>  doc/guides/rel_notes/index.rst                    |  2 +-
>  3 files changed, 7 insertions(+), 13 deletions(-)
>  rename doc/guides/rel_notes/{abi.rst => deprecation.rst} (51%)
> 
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 2a32659..6531900 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -60,7 +60,7 @@ F: doc/guides/prog_guide/ext_app_lib_make_help.rst
>  ABI versioning
>  M: Neil Horman <nhorman@tuxdriver.com>
>  F: lib/librte_compat/
> -F: doc/guides/rel_notes/abi.rst
> +F: doc/guides/rel_notes/deprecation.rst
>  F: scripts/validate-abi.sh
> 
> 
> diff --git a/doc/guides/rel_notes/abi.rst
> b/doc/guides/rel_notes/deprecation.rst
> similarity index 51%
> rename from doc/guides/rel_notes/abi.rst
> rename to doc/guides/rel_notes/deprecation.rst
> index 7a08830..eef01f1 100644
> --- a/doc/guides/rel_notes/abi.rst
> +++ b/doc/guides/rel_notes/deprecation.rst
> @@ -1,17 +1,11 @@
> -ABI policy
> -==========
> +Deprecation
> +===========
> 
>  See the :doc:`guidelines document for details of the ABI policy
> </guidelines/versioning>`.
> -ABI deprecation notices are to be posted here.
> +API and ABI deprecation notices are to be posted here.
> 
> -
> -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 and rebuilding to the new structure at that time, which will be
> renamed to the original struct foo.
> -* Significant ABI changes are planned for the librte_dostuff library.  The
> upcoming 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.
> +Help to update from a previous release is provided in
> +:doc:`another section </rel_notes/updating_apps>`.
> 
> 
>  Deprecation Notices
> diff --git a/doc/guides/rel_notes/index.rst b/doc/guides/rel_notes/index.rst
> index d790783..9d66cd8 100644
> --- a/doc/guides/rel_notes/index.rst
> +++ b/doc/guides/rel_notes/index.rst
> @@ -48,5 +48,5 @@ Contents
>      updating_apps
>      known_issues
>      resolved_issues
> -    abi
> +    deprecation
>      faq
> --
> 2.4.2

Hi Thomas,

There are some pending doc patches on ABI changes that have been sent and ack-ed prior to this change.

Due to this change, they cannot be applied cleanly anymore. Are you OK to integrate them with the small local change required from your side?

Thanks,
Cristian

^ permalink raw reply	[relevance 7%]

* [dpdk-dev] [PATCHv3 1/5] ethdev: add new API to retrieve RX/TX queue information
  @ 2015-07-20 12:19  2% ` Konstantin Ananyev
  2015-07-22 16:50  0%   ` Zhang, Helin
  2015-07-22 18:28  2%   ` [dpdk-dev] [PATCHv4 " Konstantin Ananyev
  0 siblings, 2 replies; 200+ results
From: Konstantin Ananyev @ 2015-07-20 12:19 UTC (permalink / raw)
  To: dev

Add the ability for the upper layer to query RX/TX queue information.

Add new structures:
struct rte_eth_rxq_info
struct rte_eth_txq_info

new functions:
rte_eth_rx_queue_info_get
rte_eth_tx_queue_info_get

into rte_etdev API.

Left extra free space in the queue info structures,
so extra fields could be added later without ABI breakage.

v2 changes:
- Add formal check for the qinfo input parameter.
- As suggested rename 'rx_qinfo/tx_qinfo' to 'rxq_info/txq_info'

v3 changes:
- Updated rte_ether_version.map 
- Merged with latest changes

Signed-off-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
---
 lib/librte_ether/rte_ethdev.c          | 54 +++++++++++++++++++++
 lib/librte_ether/rte_ethdev.h          | 87 +++++++++++++++++++++++++++++++---
 lib/librte_ether/rte_ether_version.map |  2 +
 3 files changed, 137 insertions(+), 6 deletions(-)

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 94104ce..a94c119 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -3341,6 +3341,60 @@ rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id,
 }
 
 int
+rte_eth_rx_queue_info_get(uint8_t port_id, uint16_t queue_id,
+	struct rte_eth_rxq_info *qinfo)
+{
+	struct rte_eth_dev *dev;
+
+	if (qinfo == NULL)
+		return -EINVAL;
+
+	if (!rte_eth_dev_is_valid_port(port_id)) {
+		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
+		return -EINVAL;
+	}
+
+	dev = &rte_eth_devices[port_id];
+	if (queue_id >= dev->data->nb_rx_queues) {
+		PMD_DEBUG_TRACE("Invalid RX queue_id=%d\n", queue_id);
+		return -EINVAL;
+	}
+
+	FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rxq_info_get, -ENOTSUP);
+
+	memset(qinfo, 0, sizeof(*qinfo));
+	dev->dev_ops->rxq_info_get(dev, queue_id, qinfo);
+	return 0;
+}
+
+int
+rte_eth_tx_queue_info_get(uint8_t port_id, uint16_t queue_id,
+	struct rte_eth_txq_info *qinfo)
+{
+	struct rte_eth_dev *dev;
+
+	if (qinfo == NULL)
+		return -EINVAL;
+
+	if (!rte_eth_dev_is_valid_port(port_id)) {
+		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
+		return -EINVAL;
+	}
+
+	dev = &rte_eth_devices[port_id];
+	if (queue_id >= dev->data->nb_tx_queues) {
+		PMD_DEBUG_TRACE("Invalid TX queue_id=%d\n", queue_id);
+		return -EINVAL;
+	}
+
+	FUNC_PTR_OR_ERR_RET(*dev->dev_ops->txq_info_get, -ENOTSUP);
+
+	memset(qinfo, 0, sizeof(*qinfo));
+	dev->dev_ops->txq_info_get(dev, queue_id, qinfo);
+	return 0;
+}
+
+int
 rte_eth_dev_set_mc_addr_list(uint8_t port_id,
 			     struct ether_addr *mc_addr_set,
 			     uint32_t nb_mc_addr)
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index c901a2c..0c6705e 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -960,6 +960,30 @@ struct rte_eth_xstats {
 	uint64_t value;
 };
 
+/**
+ * Ethernet device RX queue information strcuture.
+ * Used to retieve information about configured queue.
+ */
+struct rte_eth_rxq_info {
+	struct rte_mempool *mp;     /**< mempool used by that queue. */
+	struct rte_eth_rxconf conf; /**< queue config parameters. */
+	uint8_t scattered_rx;       /**< scattered packets RX supported. */
+	uint16_t nb_desc;           /**< configured number of RXDs. */
+	uint16_t max_desc;          /**< max allowed number of RXDs. */
+	uint16_t min_desc;          /**< min allowed number of RXDs. */
+} __rte_cache_aligned;
+
+/**
+ * Ethernet device TX queue information strcuture.
+ * Used to retieve information about configured queue.
+ */
+struct rte_eth_txq_info {
+	struct rte_eth_txconf conf; /**< queue config parameters. */
+	uint16_t nb_desc;           /**< configured number of TXDs. */
+	uint16_t max_desc;          /**< max allowed number of TXDs. */
+	uint16_t min_desc;          /**< min allowed number of TXDs. */
+} __rte_cache_aligned;
+
 struct rte_eth_dev;
 
 struct rte_eth_dev_callback;
@@ -1063,6 +1087,12 @@ typedef uint32_t (*eth_rx_queue_count_t)(struct rte_eth_dev *dev,
 typedef int (*eth_rx_descriptor_done_t)(void *rxq, uint16_t offset);
 /**< @internal Check DD bit of specific RX descriptor */
 
+typedef void (*eth_rxq_info_get_t)(struct rte_eth_dev *dev,
+	uint16_t rx_queue_id, struct rte_eth_rxq_info *qinfo);
+
+typedef void (*eth_txq_info_get_t)(struct rte_eth_dev *dev,
+	uint16_t tx_queue_id, struct rte_eth_txq_info *qinfo);
+
 typedef int (*mtu_set_t)(struct rte_eth_dev *dev, uint16_t mtu);
 /**< @internal Set MTU. */
 
@@ -1451,9 +1481,13 @@ struct eth_dev_ops {
 	rss_hash_update_t rss_hash_update;
 	/** Get current RSS hash configuration. */
 	rss_hash_conf_get_t rss_hash_conf_get;
-	eth_filter_ctrl_t              filter_ctrl;          /**< common filter control*/
+	eth_filter_ctrl_t              filter_ctrl;
+	/**< common filter control. */
 	eth_set_mc_addr_list_t set_mc_addr_list; /**< set list of mcast addrs */
-
+	eth_rxq_info_get_t rxq_info_get;
+	/**< retrieve RX queue information. */
+	eth_txq_info_get_t txq_info_get;
+	/**< retrieve TX queue information. */
 	/** Turn IEEE1588/802.1AS timestamping on. */
 	eth_timesync_enable_t timesync_enable;
 	/** Turn IEEE1588/802.1AS timestamping off. */
@@ -3721,6 +3755,46 @@ int rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id,
 		struct rte_eth_rxtx_callback *user_cb);
 
 /**
+ * Retrieve information about given port's RX queue.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param queue_id
+ *   The RX queue on the Ethernet device for which information
+ *   will be retrieved.
+ * @param qinfo
+ *   A pointer to a structure of type *rte_eth_rxq_info_info* to be filled with
+ *   the information of the Ethernet device.
+ *
+ * @return
+ *   - 0: Success
+ *   - -ENOTSUP: routine is not supported by the device PMD.
+ *   - -EINVAL:  The port_id or the queue_id is out of range.
+ */
+int rte_eth_rx_queue_info_get(uint8_t port_id, uint16_t queue_id,
+	struct rte_eth_rxq_info *qinfo);
+
+/**
+ * Retrieve information about given port's TX queue.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param queue_id
+ *   The TX queue on the Ethernet device for which information
+ *   will be retrieved.
+ * @param qinfo
+ *   A pointer to a structure of type *rte_eth_txq_info_info* to be filled with
+ *   the information of the Ethernet device.
+ *
+ * @return
+ *   - 0: Success
+ *   - -ENOTSUP: routine is not supported by the device PMD.
+ *   - -EINVAL:  The port_id or the queue_id is out of range.
+ */
+int rte_eth_tx_queue_info_get(uint8_t port_id, uint16_t queue_id,
+	struct rte_eth_txq_info *qinfo);
+
+/*
  * Retrieve number of available registers for access
  *
  * @param port_id
@@ -3793,10 +3867,6 @@ int rte_eth_dev_get_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info);
  */
 int rte_eth_dev_set_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info);
 
-#ifdef __cplusplus
-}
-#endif
-
 /**
  * Set the list of multicast addresses to filter on an Ethernet device.
  *
@@ -3882,4 +3952,9 @@ extern int rte_eth_timesync_read_rx_timestamp(uint8_t port_id,
  */
 extern int rte_eth_timesync_read_tx_timestamp(uint8_t port_id,
 					      struct timespec *timestamp);
+
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* _RTE_ETHDEV_H_ */
diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map
index 23cfee9..8de0928 100644
--- a/lib/librte_ether/rte_ether_version.map
+++ b/lib/librte_ether/rte_ether_version.map
@@ -92,6 +92,7 @@ DPDK_2.0 {
 	rte_eth_rx_burst;
 	rte_eth_rx_descriptor_done;
 	rte_eth_rx_queue_count;
+	rte_eth_rx_queue_info_get;
 	rte_eth_rx_queue_setup;
 	rte_eth_set_queue_rate_limit;
 	rte_eth_set_vf_rate_limit;
@@ -99,6 +100,7 @@ DPDK_2.0 {
 	rte_eth_stats_get;
 	rte_eth_stats_reset;
 	rte_eth_tx_burst;
+	rte_eth_tx_queue_info_get;
 	rte_eth_tx_queue_setup;
 	rte_eth_xstats_get;
 	rte_eth_xstats_reset;
-- 
1.8.3.1

^ permalink raw reply	[relevance 2%]

* Re: [dpdk-dev] [PATCH 0/4] ethdev/eal API fixes
  2015-07-19 10:52  4% [dpdk-dev] [PATCH 0/4] ethdev/eal API fixes Thomas Monjalon
  2015-07-19 10:52 36% ` [dpdk-dev] [PATCH 1/4] doc: rename ABI chapter to deprecation Thomas Monjalon
  2015-07-19 21:32  0% ` [dpdk-dev] [PATCH 0/4] ethdev/eal API fixes Thomas Monjalon
@ 2015-07-20 10:45  0% ` Neil Horman
  2 siblings, 0 replies; 200+ results
From: Neil Horman @ 2015-07-20 10:45 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Sun, Jul 19, 2015 at 12:52:13PM +0200, Thomas Monjalon wrote:
> The main change of these patches is to improve naming consistency
> across ethdev and EAL.
> It should be applied shortly to be part of rc1. If some comments arise,
> it can be fixed/improved in rc2.
> 
> Thomas Monjalon (4):
>   doc: rename ABI chapter to deprecation
>   pci: fix detach and uninit naming
>   ethdev: refactor port release
>   ethdev: fix doxygen internal comments
> 
>  MAINTAINERS                                       |  2 +-
>  doc/guides/rel_notes/{abi.rst => deprecation.rst} | 19 ++++++++-----------
>  doc/guides/rel_notes/index.rst                    |  2 +-
>  lib/librte_eal/bsdapp/eal/rte_eal_version.map     |  2 ++
>  lib/librte_eal/common/eal_common_pci.c            | 20 ++++++++++++--------
>  lib/librte_eal/common/include/rte_pci.h           |  6 ++++--
>  lib/librte_eal/linuxapp/eal/rte_eal_version.map   |  2 ++
>  lib/librte_ether/rte_ethdev.c                     | 11 +++++------
>  lib/librte_ether/rte_ethdev.h                     |  9 ++++-----
>  9 files changed, 39 insertions(+), 34 deletions(-)
>  rename doc/guides/rel_notes/{abi.rst => deprecation.rst} (51%)
> 
> -- 
> 2.4.2
> 
> 

Series
Acked-by: Neil Horman <nhorman@tuxdriver.com>

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH] doc: announce ABI change for rte_eth_fdir_filter
@ 2015-07-20  7:03 13% Jingjing Wu
  2015-07-28  8:22  4% ` Lu, Wenzhuo
                   ` (3 more replies)
  0 siblings, 4 replies; 200+ results
From: Jingjing Wu @ 2015-07-20  7:03 UTC (permalink / raw)
  To: dev

To fix the FVL's flow director issue for SCTP flow, rte_eth_fdir_filter
need to be change to support SCTP flow keys extension. Here announce
the ABI deprecation.

Signed-off-by: jingjing.wu <jingjing.wu@intel.com>
---
 doc/guides/rel_notes/deprecation.rst | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst
index 5330d3b..63e19c7 100644
--- a/doc/guides/rel_notes/deprecation.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -35,3 +35,7 @@ Deprecation Notices
 * The following fields have been deprecated in rte_eth_stats:
   imissed, ibadcrc, ibadlen, imcasts, fdirmatch, fdirmiss,
   tx_pause_xon, rx_pause_xon, tx_pause_xoff, rx_pause_xoff
+
+* Significant ABI change is planned for struct rte_eth_fdir_filter to extend
+  the SCTP flow's key input from release 2.1. The change may be enabled in
+  the upcoming release 2.1 with CONFIG_RTE_NEXT_ABI.
-- 
2.4.0

^ permalink raw reply	[relevance 13%]

* [dpdk-dev] [PATCH v15 13/13] l3fwd-power: enable one-shot rx interrupt and polling/interrupt mode switch
  2015-07-20  3:02  4%     ` [dpdk-dev] [PATCH v15 00/13] Interrupt mode PMD Cunming Liang
                         ` (8 preceding siblings ...)
  2015-07-20  3:02  2%       ` [dpdk-dev] [PATCH v15 12/13] igb: enable rx queue interrupts for PF Cunming Liang
@ 2015-07-20  3:02  2%       ` Cunming Liang
  2015-07-23 14:18  3%       ` [dpdk-dev] [PATCH v15 00/13] Interrupt mode PMD Liang, Cunming
  10 siblings, 0 replies; 200+ results
From: Cunming Liang @ 2015-07-20  3:02 UTC (permalink / raw)
  To: dev, thomas.monjalon; +Cc: shemming

The patch demonstrates how to handle per rx queue interrupt in a NAPI-like
implementation in userspace. The working thread mainly runs in polling mode
and switch to interrupt mode only if there is no packet received in recent polls.
The working thread returns to polling mode immediately once it receives an
interrupt notification caused by the incoming packets.
The sample keeps running in polling mode if the binding PMD hasn't supported
the rx interrupt yet. Now only ixgbe(pf/vf) and igb support it.

Signed-off-by: Danny Zhou <danny.zhou@intel.com>
Signed-off-by: Cunming Liang <cunming.liang@intel.com>
---
v14 changes
 - per-patch basis ABI compatibility rework
 - reword commit comments

v7 changes
 - using new APIs
 - demo multiple port/queue pair wait on the same epoll instance

v6 changes
 - Split event fd add and wait

v5 changes
 - Change invoked function name and parameter to accomodate EAL change

v3 changes
 - Add spinlock to ensure thread safe when accessing interrupt mask
   register

v2 changes
 - Remove unused function which is for debug purpose

 examples/l3fwd-power/main.c | 205 +++++++++++++++++++++++++++++++++++---------
 1 file changed, 165 insertions(+), 40 deletions(-)

diff --git a/examples/l3fwd-power/main.c b/examples/l3fwd-power/main.c
index b3c5f43..14f6fba 100644
--- a/examples/l3fwd-power/main.c
+++ b/examples/l3fwd-power/main.c
@@ -74,12 +74,14 @@
 #include <rte_string_fns.h>
 #include <rte_timer.h>
 #include <rte_power.h>
+#include <rte_eal.h>
+#include <rte_spinlock.h>
 
 #define RTE_LOGTYPE_L3FWD_POWER RTE_LOGTYPE_USER1
 
 #define MAX_PKT_BURST 32
 
-#define MIN_ZERO_POLL_COUNT 5
+#define MIN_ZERO_POLL_COUNT 10
 
 /* around 100ms at 2 Ghz */
 #define TIMER_RESOLUTION_CYCLES           200000000ULL
@@ -153,6 +155,9 @@ static uint16_t nb_txd = RTE_TEST_TX_DESC_DEFAULT;
 /* ethernet addresses of ports */
 static struct ether_addr ports_eth_addr[RTE_MAX_ETHPORTS];
 
+/* ethernet addresses of ports */
+static rte_spinlock_t locks[RTE_MAX_ETHPORTS];
+
 /* mask of enabled ports */
 static uint32_t enabled_port_mask = 0;
 /* Ports set in promiscuous mode off by default. */
@@ -185,6 +190,9 @@ struct lcore_rx_queue {
 #define MAX_TX_QUEUE_PER_PORT RTE_MAX_ETHPORTS
 #define MAX_RX_QUEUE_PER_PORT 128
 
+#define MAX_RX_QUEUE_INTERRUPT_PER_PORT 16
+
+
 #define MAX_LCORE_PARAMS 1024
 struct lcore_params {
 	uint8_t port_id;
@@ -211,7 +219,7 @@ static uint16_t nb_lcore_params = sizeof(lcore_params_array_default) /
 
 static struct rte_eth_conf port_conf = {
 	.rxmode = {
-		.mq_mode	= ETH_MQ_RX_RSS,
+		.mq_mode        = ETH_MQ_RX_RSS,
 		.max_rx_pkt_len = ETHER_MAX_LEN,
 		.split_hdr_size = 0,
 		.header_split   = 0, /**< Header Split disabled */
@@ -223,11 +231,17 @@ static struct rte_eth_conf port_conf = {
 	.rx_adv_conf = {
 		.rss_conf = {
 			.rss_key = NULL,
-			.rss_hf = ETH_RSS_IP,
+			.rss_hf = ETH_RSS_UDP,
 		},
 	},
 	.txmode = {
-		.mq_mode = ETH_DCB_NONE,
+		.mq_mode = ETH_MQ_TX_NONE,
+	},
+	.intr_conf = {
+		.lsc = 1,
+#ifdef RTE_NEXT_ABI
+		.rxq = 1,
+#endif
 	},
 };
 
@@ -399,19 +413,22 @@ power_timer_cb(__attribute__((unused)) struct rte_timer *tim,
 	/* accumulate total execution time in us when callback is invoked */
 	sleep_time_ratio = (float)(stats[lcore_id].sleep_time) /
 					(float)SCALING_PERIOD;
-
 	/**
 	 * check whether need to scale down frequency a step if it sleep a lot.
 	 */
-	if (sleep_time_ratio >= SCALING_DOWN_TIME_RATIO_THRESHOLD)
-		rte_power_freq_down(lcore_id);
+	if (sleep_time_ratio >= SCALING_DOWN_TIME_RATIO_THRESHOLD) {
+		if (rte_power_freq_down)
+			rte_power_freq_down(lcore_id);
+	}
 	else if ( (unsigned)(stats[lcore_id].nb_rx_processed /
-		stats[lcore_id].nb_iteration_looped) < MAX_PKT_BURST)
+		stats[lcore_id].nb_iteration_looped) < MAX_PKT_BURST) {
 		/**
 		 * scale down a step if average packet per iteration less
 		 * than expectation.
 		 */
-		rte_power_freq_down(lcore_id);
+		if (rte_power_freq_down)
+			rte_power_freq_down(lcore_id);
+	}
 
 	/**
 	 * initialize another timer according to current frequency to ensure
@@ -712,22 +729,20 @@ l3fwd_simple_forward(struct rte_mbuf *m, uint8_t portid,
 
 }
 
-#define SLEEP_GEAR1_THRESHOLD            100
-#define SLEEP_GEAR2_THRESHOLD            1000
+#define MINIMUM_SLEEP_TIME         1
+#define SUSPEND_THRESHOLD          300
 
 static inline uint32_t
 power_idle_heuristic(uint32_t zero_rx_packet_count)
 {
-	/* If zero count is less than 100, use it as the sleep time in us */
-	if (zero_rx_packet_count < SLEEP_GEAR1_THRESHOLD)
-		return zero_rx_packet_count;
-	/* If zero count is less than 1000, sleep time should be 100 us */
-	else if ((zero_rx_packet_count >= SLEEP_GEAR1_THRESHOLD) &&
-			(zero_rx_packet_count < SLEEP_GEAR2_THRESHOLD))
-		return SLEEP_GEAR1_THRESHOLD;
-	/* If zero count is greater than 1000, sleep time should be 1000 us */
-	else if (zero_rx_packet_count >= SLEEP_GEAR2_THRESHOLD)
-		return SLEEP_GEAR2_THRESHOLD;
+	/* If zero count is less than 100,  sleep 1us */
+	if (zero_rx_packet_count < SUSPEND_THRESHOLD)
+		return MINIMUM_SLEEP_TIME;
+	/* If zero count is less than 1000, sleep 100 us which is the
+		minimum latency switching from C3/C6 to C0
+	*/
+	else
+		return SUSPEND_THRESHOLD;
 
 	return 0;
 }
@@ -767,6 +782,84 @@ power_freq_scaleup_heuristic(unsigned lcore_id,
 	return FREQ_CURRENT;
 }
 
+/**
+ * force polling thread sleep until one-shot rx interrupt triggers
+ * @param port_id
+ *  Port id.
+ * @param queue_id
+ *  Rx queue id.
+ * @return
+ *  0 on success
+ */
+static int
+sleep_until_rx_interrupt(int num)
+{
+	struct rte_epoll_event event[num];
+	int n, i;
+	uint8_t port_id, queue_id;
+	void *data;
+
+	RTE_LOG(INFO, L3FWD_POWER,
+		"lcore %u sleeps until interrupt triggers\n",
+		rte_lcore_id());
+
+	n = rte_epoll_wait(RTE_EPOLL_PER_THREAD, event, num, -1);
+	for (i = 0; i < n; i++) {
+		data = event[i].epdata.data;
+		port_id = ((uintptr_t)data) >> CHAR_BIT;
+		queue_id = ((uintptr_t)data) &
+			RTE_LEN2MASK(CHAR_BIT, uint8_t);
+		RTE_LOG(INFO, L3FWD_POWER,
+			"lcore %u is waked up from rx interrupt on"
+			" port %d queue %d\n",
+			rte_lcore_id(), port_id, queue_id);
+	}
+
+	return 0;
+}
+
+static int turn_on_intr(struct lcore_conf *qconf)
+{
+	int i;
+	struct lcore_rx_queue *rx_queue;
+	uint8_t port_id, queue_id;
+
+	for (i = 0; i < qconf->n_rx_queue; ++i) {
+		rx_queue = &(qconf->rx_queue_list[i]);
+		port_id = rx_queue->port_id;
+		queue_id = rx_queue->queue_id;
+
+		rte_spinlock_lock(&(locks[port_id]));
+		rte_eth_dev_rx_intr_enable(port_id, queue_id);
+		rte_spinlock_unlock(&(locks[port_id]));
+	}
+}
+
+static int event_register(struct lcore_conf *qconf)
+{
+	struct lcore_rx_queue *rx_queue;
+	uint8_t portid, queueid;
+	uint32_t data;
+	int ret;
+	int i;
+
+	for (i = 0; i < qconf->n_rx_queue; ++i) {
+		rx_queue = &(qconf->rx_queue_list[i]);
+		portid = rx_queue->port_id;
+		queueid = rx_queue->queue_id;
+		data = portid << CHAR_BIT | queueid;
+
+		ret = rte_eth_dev_rx_intr_ctl_q(portid, queueid,
+						RTE_EPOLL_PER_THREAD,
+						RTE_INTR_EVENT_ADD,
+						(void *)((uintptr_t)data));
+		if (ret)
+			return ret;
+	}
+
+	return 0;
+}
+
 /* main processing loop */
 static int
 main_loop(__attribute__((unused)) void *dummy)
@@ -780,9 +873,9 @@ main_loop(__attribute__((unused)) void *dummy)
 	struct lcore_conf *qconf;
 	struct lcore_rx_queue *rx_queue;
 	enum freq_scale_hint_t lcore_scaleup_hint;
-
 	uint32_t lcore_rx_idle_count = 0;
 	uint32_t lcore_idle_hint = 0;
+	int intr_en = 0;
 
 	const uint64_t drain_tsc = (rte_get_tsc_hz() + US_PER_S - 1) / US_PER_S * BURST_TX_DRAIN_US;
 
@@ -799,13 +892,18 @@ main_loop(__attribute__((unused)) void *dummy)
 	RTE_LOG(INFO, L3FWD_POWER, "entering main loop on lcore %u\n", lcore_id);
 
 	for (i = 0; i < qconf->n_rx_queue; i++) {
-
 		portid = qconf->rx_queue_list[i].port_id;
 		queueid = qconf->rx_queue_list[i].queue_id;
 		RTE_LOG(INFO, L3FWD_POWER, " -- lcoreid=%u portid=%hhu "
 			"rxqueueid=%hhu\n", lcore_id, portid, queueid);
 	}
 
+	/* add into event wait list */
+	if (event_register(qconf) == 0)
+		intr_en = 1;
+	else
+		RTE_LOG(INFO, L3FWD_POWER, "RX interrupt won't enable.\n");
+
 	while (1) {
 		stats[lcore_id].nb_iteration_looped++;
 
@@ -840,6 +938,7 @@ main_loop(__attribute__((unused)) void *dummy)
 			prev_tsc_power = cur_tsc_power;
 		}
 
+start_rx:
 		/*
 		 * Read packet from RX queues
 		 */
@@ -853,6 +952,7 @@ main_loop(__attribute__((unused)) void *dummy)
 
 			nb_rx = rte_eth_rx_burst(portid, queueid, pkts_burst,
 								MAX_PKT_BURST);
+
 			stats[lcore_id].nb_rx_processed += nb_rx;
 			if (unlikely(nb_rx == 0)) {
 				/**
@@ -915,10 +1015,13 @@ main_loop(__attribute__((unused)) void *dummy)
 						rx_queue->freq_up_hint;
 			}
 
-			if (lcore_scaleup_hint == FREQ_HIGHEST)
-				rte_power_freq_max(lcore_id);
-			else if (lcore_scaleup_hint == FREQ_HIGHER)
-				rte_power_freq_up(lcore_id);
+			if (lcore_scaleup_hint == FREQ_HIGHEST) {
+				if (rte_power_freq_max)
+					rte_power_freq_max(lcore_id);
+			} else if (lcore_scaleup_hint == FREQ_HIGHER) {
+				if (rte_power_freq_up)
+					rte_power_freq_up(lcore_id);
+			}
 		} else {
 			/**
 			 * All Rx queues empty in recent consecutive polls,
@@ -933,16 +1036,23 @@ main_loop(__attribute__((unused)) void *dummy)
 					lcore_idle_hint = rx_queue->idle_hint;
 			}
 
-			if ( lcore_idle_hint < SLEEP_GEAR1_THRESHOLD)
+			if (lcore_idle_hint < SUSPEND_THRESHOLD)
 				/**
 				 * execute "pause" instruction to avoid context
-				 * switch for short sleep.
+				 * switch which generally take hundred of
+				 * microseconds for short sleep.
 				 */
 				rte_delay_us(lcore_idle_hint);
-			else
-				/* long sleep force runing thread to suspend */
-				usleep(lcore_idle_hint);
-
+			else {
+				/* suspend until rx interrupt trigges */
+				if (intr_en) {
+					turn_on_intr(qconf);
+					sleep_until_rx_interrupt(
+						qconf->n_rx_queue);
+				}
+				/* start receiving packets immediately */
+				goto start_rx;
+			}
 			stats[lcore_id].sleep_time += lcore_idle_hint;
 		}
 	}
@@ -1273,7 +1383,7 @@ setup_hash(int socketid)
 	char s[64];
 
 	/* create ipv4 hash */
-	snprintf(s, sizeof(s), "ipv4_l3fwd_hash_%d", socketid);
+	rte_snprintf(s, sizeof(s), "ipv4_l3fwd_hash_%d", socketid);
 	ipv4_l3fwd_hash_params.name = s;
 	ipv4_l3fwd_hash_params.socket_id = socketid;
 	ipv4_l3fwd_lookup_struct[socketid] =
@@ -1283,7 +1393,7 @@ setup_hash(int socketid)
 				"socket %d\n", socketid);
 
 	/* create ipv6 hash */
-	snprintf(s, sizeof(s), "ipv6_l3fwd_hash_%d", socketid);
+	rte_snprintf(s, sizeof(s), "ipv6_l3fwd_hash_%d", socketid);
 	ipv6_l3fwd_hash_params.name = s;
 	ipv6_l3fwd_hash_params.socket_id = socketid;
 	ipv6_l3fwd_lookup_struct[socketid] =
@@ -1477,6 +1587,7 @@ main(int argc, char **argv)
 	unsigned lcore_id;
 	uint64_t hz;
 	uint32_t n_tx_queue, nb_lcores;
+	uint32_t dev_rxq_num, dev_txq_num;
 	uint8_t portid, nb_rx_queue, queue, socketid;
 
 	/* catch SIGINT and restore cpufreq governor to ondemand */
@@ -1526,10 +1637,19 @@ main(int argc, char **argv)
 		printf("Initializing port %d ... ", portid );
 		fflush(stdout);
 
+		rte_eth_dev_info_get(portid, &dev_info);
+		dev_rxq_num = dev_info.max_rx_queues;
+		dev_txq_num = dev_info.max_tx_queues;
+
 		nb_rx_queue = get_port_n_rx_queues(portid);
+		if (nb_rx_queue > dev_rxq_num)
+			rte_exit(EXIT_FAILURE,
+				"Cannot configure not existed rxq: "
+				"port=%d\n", portid);
+
 		n_tx_queue = nb_lcores;
-		if (n_tx_queue > MAX_TX_QUEUE_PER_PORT)
-			n_tx_queue = MAX_TX_QUEUE_PER_PORT;
+		if (n_tx_queue > dev_txq_num)
+			n_tx_queue = dev_txq_num;
 		printf("Creating queues: nb_rxq=%d nb_txq=%u... ",
 			nb_rx_queue, (unsigned)n_tx_queue );
 		ret = rte_eth_dev_configure(portid, nb_rx_queue,
@@ -1553,6 +1673,9 @@ main(int argc, char **argv)
 			if (rte_lcore_is_enabled(lcore_id) == 0)
 				continue;
 
+			if (queueid >= dev_txq_num)
+				continue;
+
 			if (numa_on)
 				socketid = \
 				(uint8_t)rte_lcore_to_socket_id(lcore_id);
@@ -1587,8 +1710,9 @@ main(int argc, char **argv)
 		/* init power management library */
 		ret = rte_power_init(lcore_id);
 		if (ret)
-			rte_exit(EXIT_FAILURE, "Power management library "
-				"initialization failed on core%u\n", lcore_id);
+			rte_log(RTE_LOG_ERR, RTE_LOGTYPE_POWER,
+				"Power management library initialization "
+				"failed on core%u", lcore_id);
 
 		/* init timer structures for each enabled lcore */
 		rte_timer_init(&power_timers[lcore_id]);
@@ -1636,7 +1760,6 @@ main(int argc, char **argv)
 		if (ret < 0)
 			rte_exit(EXIT_FAILURE, "rte_eth_dev_start: err=%d, "
 						"port=%d\n", ret, portid);
-
 		/*
 		 * If enabled, put device in promiscuous mode.
 		 * This allows IO forwarding mode to forward packets
@@ -1645,6 +1768,8 @@ main(int argc, char **argv)
 		 */
 		if (promiscuous_on)
 			rte_eth_promiscuous_enable(portid);
+		/* initialize spinlock for each port */
+		rte_spinlock_init(&(locks[portid]));
 	}
 
 	check_all_ports_link_status((uint8_t)nb_ports, enabled_port_mask);
-- 
1.8.1.4

^ permalink raw reply	[relevance 2%]

* [dpdk-dev] [PATCH v15 12/13] igb: enable rx queue interrupts for PF
  2015-07-20  3:02  4%     ` [dpdk-dev] [PATCH v15 00/13] Interrupt mode PMD Cunming Liang
                         ` (7 preceding siblings ...)
  2015-07-20  3:02  1%       ` [dpdk-dev] [PATCH v15 11/13] ixgbe: enable rx queue interrupts for both PF and VF Cunming Liang
@ 2015-07-20  3:02  2%       ` Cunming Liang
  2015-07-20  3:02  2%       ` [dpdk-dev] [PATCH v15 13/13] l3fwd-power: enable one-shot rx interrupt and polling/interrupt mode switch Cunming Liang
  2015-07-23 14:18  3%       ` [dpdk-dev] [PATCH v15 00/13] Interrupt mode PMD Liang, Cunming
  10 siblings, 0 replies; 200+ results
From: Cunming Liang @ 2015-07-20  3:02 UTC (permalink / raw)
  To: dev, thomas.monjalon; +Cc: shemming

The patch does below for igb PF:
- Setup NIC to generate MSI-X interrupts
- Set the IVAR register to map interrupt causes to vectors
- Implement interrupt enable/disable functions

Signed-off-by: Danny Zhou <danny.zhou@intel.com>
Signed-off-by: Cunming Liang <cunming.liang@intel.com>
---
v14 changes
 - per-patch basis ABI compatibility rework

v9 changes
 - move queue-vec mapping init from dev_configure to dev_start
 - fix link interrupt not working issue in vfio-msix

v8 changes
 - add vfio-msi/vfio-legacy and uio-legacy support

v7 changes
 - add condition check when intr vector is not enabled

v6 changes
 - fill queue-vector mapping table

v5 changes
 - Rebase the patchset onto the HEAD

v3 changes
 - Remove unnecessary variables in e1000_mac_info
 - Remove spinlok from PMD

v2 changes
 - Consolidate review comments related to coding style

 drivers/net/e1000/igb_ethdev.c | 311 ++++++++++++++++++++++++++++++++++++-----
 1 file changed, 277 insertions(+), 34 deletions(-)

diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c
index ddc7186..56734a3 100644
--- a/drivers/net/e1000/igb_ethdev.c
+++ b/drivers/net/e1000/igb_ethdev.c
@@ -105,6 +105,9 @@ static int  eth_igb_flow_ctrl_get(struct rte_eth_dev *dev,
 static int  eth_igb_flow_ctrl_set(struct rte_eth_dev *dev,
 				struct rte_eth_fc_conf *fc_conf);
 static int eth_igb_lsc_interrupt_setup(struct rte_eth_dev *dev);
+#ifdef RTE_NEXT_ABI
+static int eth_igb_rxq_interrupt_setup(struct rte_eth_dev *dev);
+#endif
 static int eth_igb_interrupt_get_status(struct rte_eth_dev *dev);
 static int eth_igb_interrupt_action(struct rte_eth_dev *dev);
 static void eth_igb_interrupt_handler(struct rte_intr_handle *handle,
@@ -218,7 +221,6 @@ static int eth_igb_get_eeprom(struct rte_eth_dev *dev,
 		struct rte_dev_eeprom_info *eeprom);
 static int eth_igb_set_eeprom(struct rte_eth_dev *dev,
 		struct rte_dev_eeprom_info *eeprom);
-
 static int eth_igb_set_mc_addr_list(struct rte_eth_dev *dev,
 				    struct ether_addr *mc_addr_set,
 				    uint32_t nb_mc_addr);
@@ -229,6 +231,17 @@ static int igb_timesync_read_rx_timestamp(struct rte_eth_dev *dev,
 					  uint32_t flags);
 static int igb_timesync_read_tx_timestamp(struct rte_eth_dev *dev,
 					  struct timespec *timestamp);
+#ifdef RTE_NEXT_ABI
+static int eth_igb_rx_queue_intr_enable(struct rte_eth_dev *dev,
+					uint16_t queue_id);
+static int eth_igb_rx_queue_intr_disable(struct rte_eth_dev *dev,
+					 uint16_t queue_id);
+static void eth_igb_assign_msix_vector(struct e1000_hw *hw, int8_t direction,
+				       uint8_t queue, uint8_t msix_vector);
+static void eth_igb_write_ivar(struct e1000_hw *hw, uint8_t msix_vector,
+			       uint8_t index, uint8_t offset);
+#endif
+static void eth_igb_configure_msix_intr(struct rte_eth_dev *dev);
 
 /*
  * Define VF Stats MACRO for Non "cleared on read" register
@@ -289,6 +302,10 @@ static const struct eth_dev_ops eth_igb_ops = {
 	.vlan_tpid_set        = eth_igb_vlan_tpid_set,
 	.vlan_offload_set     = eth_igb_vlan_offload_set,
 	.rx_queue_setup       = eth_igb_rx_queue_setup,
+#ifdef RTE_NEXT_ABI
+	.rx_queue_intr_enable = eth_igb_rx_queue_intr_enable,
+	.rx_queue_intr_disable = eth_igb_rx_queue_intr_disable,
+#endif
 	.rx_queue_release     = eth_igb_rx_queue_release,
 	.rx_queue_count       = eth_igb_rx_queue_count,
 	.rx_descriptor_done   = eth_igb_rx_descriptor_done,
@@ -639,12 +656,6 @@ eth_igb_dev_init(struct rte_eth_dev *eth_dev)
 		     eth_dev->data->port_id, pci_dev->id.vendor_id,
 		     pci_dev->id.device_id);
 
-	rte_intr_callback_register(&(pci_dev->intr_handle),
-		eth_igb_interrupt_handler, (void *)eth_dev);
-
-	/* enable uio intr after callback register */
-	rte_intr_enable(&(pci_dev->intr_handle));
-
 	/* enable support intr */
 	igb_intr_enable(eth_dev);
 
@@ -879,7 +890,11 @@ eth_igb_start(struct rte_eth_dev *dev)
 		E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	struct e1000_adapter *adapter =
 		E1000_DEV_PRIVATE(dev->data->dev_private);
-	int ret, i, mask;
+	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+	int ret, mask;
+#ifdef RTE_NEXT_ABI
+	uint32_t intr_vector = 0;
+#endif
 	uint32_t ctrl_ext;
 
 	PMD_INIT_FUNC_TRACE();
@@ -920,6 +935,29 @@ eth_igb_start(struct rte_eth_dev *dev)
 	/* configure PF module if SRIOV enabled */
 	igb_pf_host_configure(dev);
 
+#ifdef RTE_NEXT_ABI
+	/* check and configure queue intr-vector mapping */
+	if (dev->data->dev_conf.intr_conf.rxq != 0)
+		intr_vector = dev->data->nb_rx_queues;
+
+	if (rte_intr_efd_enable(intr_handle, intr_vector))
+		return -1;
+
+	if (rte_intr_dp_is_en(intr_handle)) {
+		intr_handle->intr_vec =
+			rte_zmalloc("intr_vec",
+				    dev->data->nb_rx_queues * sizeof(int), 0);
+		if (intr_handle->intr_vec == NULL) {
+			PMD_INIT_LOG(ERR, "Failed to allocate %d rx_queues"
+				     " intr_vec\n", dev->data->nb_rx_queues);
+			return -ENOMEM;
+		}
+	}
+#endif
+
+	/* confiugre msix for rx interrupt */
+	eth_igb_configure_msix_intr(dev);
+
 	/* Configure for OS presence */
 	igb_init_manageability(hw);
 
@@ -947,33 +985,9 @@ eth_igb_start(struct rte_eth_dev *dev)
 		igb_vmdq_vlan_hw_filter_enable(dev);
 	}
 
-	/*
-	 * Configure the Interrupt Moderation register (EITR) with the maximum
-	 * possible value (0xFFFF) to minimize "System Partial Write" issued by
-	 * spurious [DMA] memory updates of RX and TX ring descriptors.
-	 *
-	 * With a EITR granularity of 2 microseconds in the 82576, only 7/8
-	 * spurious memory updates per second should be expected.
-	 * ((65535 * 2) / 1000.1000 ~= 0.131 second).
-	 *
-	 * Because interrupts are not used at all, the MSI-X is not activated
-	 * and interrupt moderation is controlled by EITR[0].
-	 *
-	 * Note that having [almost] disabled memory updates of RX and TX ring
-	 * descriptors through the Interrupt Moderation mechanism, memory
-	 * updates of ring descriptors are now moderated by the configurable
-	 * value of Write-Back Threshold registers.
-	 */
 	if ((hw->mac.type == e1000_82576) || (hw->mac.type == e1000_82580) ||
 		(hw->mac.type == e1000_i350) || (hw->mac.type == e1000_i210) ||
 		(hw->mac.type == e1000_i211)) {
-		uint32_t ivar;
-
-		/* Enable all RX & TX queues in the IVAR registers */
-		ivar = (uint32_t) ((E1000_IVAR_VALID << 16) | E1000_IVAR_VALID);
-		for (i = 0; i < 8; i++)
-			E1000_WRITE_REG_ARRAY(hw, E1000_IVAR0, i, ivar);
-
 		/* Configure EITR with the maximum possible value (0xFFFF) */
 		E1000_WRITE_REG(hw, E1000_EITR(0), 0xFFFF);
 	}
@@ -1024,8 +1038,25 @@ eth_igb_start(struct rte_eth_dev *dev)
 	e1000_setup_link(hw);
 
 	/* check if lsc interrupt feature is enabled */
-	if (dev->data->dev_conf.intr_conf.lsc != 0)
-		ret = eth_igb_lsc_interrupt_setup(dev);
+	if (dev->data->dev_conf.intr_conf.lsc != 0) {
+		if (rte_intr_allow_others(intr_handle)) {
+			rte_intr_callback_register(intr_handle,
+						   eth_igb_interrupt_handler,
+						   (void *)dev);
+			eth_igb_lsc_interrupt_setup(dev);
+		} else
+			PMD_INIT_LOG(INFO, "lsc won't enable because of"
+				     " no intr multiplex\n");
+	}
+
+#ifdef RTE_NEXT_ABI
+	/* check if rxq interrupt is enabled */
+	if (dev->data->dev_conf.intr_conf.rxq != 0)
+		eth_igb_rxq_interrupt_setup(dev);
+#endif
+
+	/* enable uio/vfio intr/eventfd mapping */
+	rte_intr_enable(intr_handle);
 
 	/* resume enabled intr since hw reset */
 	igb_intr_enable(dev);
@@ -1058,8 +1089,13 @@ eth_igb_stop(struct rte_eth_dev *dev)
 	struct e1000_flex_filter *p_flex;
 	struct e1000_5tuple_filter *p_5tuple, *p_5tuple_next;
 	struct e1000_2tuple_filter *p_2tuple, *p_2tuple_next;
+	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
 
 	igb_intr_disable(hw);
+
+	/* disable intr eventfd mapping */
+	rte_intr_disable(intr_handle);
+
 	igb_pf_reset_hw(hw);
 	E1000_WRITE_REG(hw, E1000_WUC, 0);
 
@@ -1108,6 +1144,15 @@ eth_igb_stop(struct rte_eth_dev *dev)
 		rte_free(p_2tuple);
 	}
 	filter_info->twotuple_mask = 0;
+
+#ifdef RTE_NEXT_ABI
+	/* Clean datapath event and queue/vec mapping */
+	rte_intr_efd_disable(intr_handle);
+	if (intr_handle->intr_vec != NULL) {
+		rte_free(intr_handle->intr_vec);
+		intr_handle->intr_vec = NULL;
+	}
+#endif
 }
 
 static void
@@ -1117,6 +1162,9 @@ eth_igb_close(struct rte_eth_dev *dev)
 	struct e1000_adapter *adapter =
 		E1000_DEV_PRIVATE(dev->data->dev_private);
 	struct rte_eth_link link;
+#ifdef RTE_NEXT_ABI
+	struct rte_pci_device *pci_dev;
+#endif
 
 	eth_igb_stop(dev);
 	adapter->stopped = 1;
@@ -1136,6 +1184,14 @@ eth_igb_close(struct rte_eth_dev *dev)
 
 	igb_dev_free_queues(dev);
 
+#ifdef RTE_NEXT_ABI
+	pci_dev = dev->pci_dev;
+	if (pci_dev->intr_handle.intr_vec) {
+		rte_free(pci_dev->intr_handle.intr_vec);
+		pci_dev->intr_handle.intr_vec = NULL;
+	}
+#endif
+
 	memset(&link, 0, sizeof(link));
 	rte_igb_dev_atomic_write_link_status(dev, &link);
 }
@@ -1960,6 +2016,35 @@ eth_igb_lsc_interrupt_setup(struct rte_eth_dev *dev)
 	return 0;
 }
 
+#ifdef RTE_NEXT_ABI
+/* It clears the interrupt causes and enables the interrupt.
+ * It will be called once only during nic initialized.
+ *
+ * @param dev
+ *  Pointer to struct rte_eth_dev.
+ *
+ * @return
+ *  - On success, zero.
+ *  - On failure, a negative value.
+ */
+static int eth_igb_rxq_interrupt_setup(struct rte_eth_dev *dev)
+{
+	uint32_t mask, regval;
+	struct e1000_hw *hw =
+		E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct rte_eth_dev_info dev_info;
+
+	memset(&dev_info, 0, sizeof(dev_info));
+	eth_igb_infos_get(dev, &dev_info);
+
+	mask = 0xFFFFFFFF >> (32 - dev_info.max_rx_queues);
+	regval = E1000_READ_REG(hw, E1000_EIMS);
+	E1000_WRITE_REG(hw, E1000_EIMS, regval | mask);
+
+	return 0;
+}
+#endif
+
 /*
  * It reads ICR and gets interrupt causes, check it and set a bit flag
  * to update link status.
@@ -4051,5 +4136,163 @@ static struct rte_driver pmd_igbvf_drv = {
 	.init = rte_igbvf_pmd_init,
 };
 
+#ifdef RTE_NEXT_ABI
+static int
+eth_igb_rx_queue_intr_disable(struct rte_eth_dev *dev, uint16_t queue_id)
+{
+	struct e1000_hw *hw =
+		E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	uint32_t mask = 1 << queue_id;
+
+	E1000_WRITE_REG(hw, E1000_EIMC, mask);
+	E1000_WRITE_FLUSH(hw);
+
+	return 0;
+}
+
+static int
+eth_igb_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
+{
+	struct e1000_hw *hw =
+		E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	uint32_t mask = 1 << queue_id;
+	uint32_t regval;
+
+	regval = E1000_READ_REG(hw, E1000_EIMS);
+	E1000_WRITE_REG(hw, E1000_EIMS, regval | mask);
+	E1000_WRITE_FLUSH(hw);
+
+	rte_intr_enable(&dev->pci_dev->intr_handle);
+
+	return 0;
+}
+
+static void
+eth_igb_write_ivar(struct e1000_hw *hw, uint8_t  msix_vector,
+		   uint8_t index, uint8_t offset)
+{
+	uint32_t val = E1000_READ_REG_ARRAY(hw, E1000_IVAR0, index);
+
+	/* clear bits */
+	val &= ~((uint32_t)0xFF << offset);
+
+	/* write vector and valid bit */
+	val |= (msix_vector | E1000_IVAR_VALID) << offset;
+
+	E1000_WRITE_REG_ARRAY(hw, E1000_IVAR0, index, val);
+}
+
+static void
+eth_igb_assign_msix_vector(struct e1000_hw *hw, int8_t direction,
+			   uint8_t queue, uint8_t msix_vector)
+{
+	uint32_t tmp = 0;
+
+	if (hw->mac.type == e1000_82575) {
+		if (direction == 0)
+			tmp = E1000_EICR_RX_QUEUE0 << queue;
+		else if (direction == 1)
+			tmp = E1000_EICR_TX_QUEUE0 << queue;
+		E1000_WRITE_REG(hw, E1000_MSIXBM(msix_vector), tmp);
+	} else if (hw->mac.type == e1000_82576) {
+		if ((direction == 0) || (direction == 1))
+			eth_igb_write_ivar(hw, msix_vector, queue & 0x7,
+					   ((queue & 0x8) << 1) +
+					   8 * direction);
+	} else if ((hw->mac.type == e1000_82580) ||
+			(hw->mac.type == e1000_i350) ||
+			(hw->mac.type == e1000_i354) ||
+			(hw->mac.type == e1000_i210) ||
+			(hw->mac.type == e1000_i211)) {
+		if ((direction == 0) || (direction == 1))
+			eth_igb_write_ivar(hw, msix_vector,
+					   queue >> 1,
+					   ((queue & 0x1) << 4) +
+					   8 * direction);
+	}
+}
+#endif
+
+/* Sets up the hardware to generate MSI-X interrupts properly
+ * @hw
+ *  board private structure
+ */
+static void
+eth_igb_configure_msix_intr(struct rte_eth_dev *dev)
+{
+#ifdef RTE_NEXT_ABI
+	int queue_id;
+	uint32_t tmpval, regval, intr_mask;
+	struct e1000_hw *hw =
+		E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	uint32_t vec = 0;
+#endif
+	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+
+	/* won't configure msix register if no mapping is done
+	 * between intr vector and event fd
+	 */
+	if (!rte_intr_dp_is_en(intr_handle))
+		return;
+
+#ifdef RTE_NEXT_ABI
+	/* set interrupt vector for other causes */
+	if (hw->mac.type == e1000_82575) {
+		tmpval = E1000_READ_REG(hw, E1000_CTRL_EXT);
+		/* enable MSI-X PBA support */
+		tmpval |= E1000_CTRL_EXT_PBA_CLR;
+
+		/* Auto-Mask interrupts upon ICR read */
+		tmpval |= E1000_CTRL_EXT_EIAME;
+		tmpval |= E1000_CTRL_EXT_IRCA;
+
+		E1000_WRITE_REG(hw, E1000_CTRL_EXT, tmpval);
+
+		/* enable msix_other interrupt */
+		E1000_WRITE_REG_ARRAY(hw, E1000_MSIXBM(0), 0, E1000_EIMS_OTHER);
+		regval = E1000_READ_REG(hw, E1000_EIAC);
+		E1000_WRITE_REG(hw, E1000_EIAC, regval | E1000_EIMS_OTHER);
+		regval = E1000_READ_REG(hw, E1000_EIAM);
+		E1000_WRITE_REG(hw, E1000_EIMS, regval | E1000_EIMS_OTHER);
+	} else if ((hw->mac.type == e1000_82576) ||
+			(hw->mac.type == e1000_82580) ||
+			(hw->mac.type == e1000_i350) ||
+			(hw->mac.type == e1000_i354) ||
+			(hw->mac.type == e1000_i210) ||
+			(hw->mac.type == e1000_i211)) {
+		/* turn on MSI-X capability first */
+		E1000_WRITE_REG(hw, E1000_GPIE, E1000_GPIE_MSIX_MODE |
+					E1000_GPIE_PBA | E1000_GPIE_EIAME |
+					E1000_GPIE_NSICR);
+
+		intr_mask = (1 << intr_handle->max_intr) - 1;
+		regval = E1000_READ_REG(hw, E1000_EIAC);
+		E1000_WRITE_REG(hw, E1000_EIAC, regval | intr_mask);
+
+		/* enable msix_other interrupt */
+		regval = E1000_READ_REG(hw, E1000_EIMS);
+		E1000_WRITE_REG(hw, E1000_EIMS, regval | intr_mask);
+		tmpval = (dev->data->nb_rx_queues | E1000_IVAR_VALID) << 8;
+		E1000_WRITE_REG(hw, E1000_IVAR_MISC, tmpval);
+	}
+
+	/* use EIAM to auto-mask when MSI-X interrupt
+	 * is asserted, this saves a register write for every interrupt
+	 */
+	intr_mask = (1 << intr_handle->nb_efd) - 1;
+	regval = E1000_READ_REG(hw, E1000_EIAM);
+	E1000_WRITE_REG(hw, E1000_EIAM, regval | intr_mask);
+
+	for (queue_id = 0; queue_id < dev->data->nb_rx_queues; queue_id++) {
+		eth_igb_assign_msix_vector(hw, 0, queue_id, vec);
+		intr_handle->intr_vec[queue_id] = vec;
+		if (vec < intr_handle->nb_efd - 1)
+			vec++;
+	}
+
+	E1000_WRITE_FLUSH(hw);
+#endif
+}
+
 PMD_REGISTER_DRIVER(pmd_igb_drv);
 PMD_REGISTER_DRIVER(pmd_igbvf_drv);
-- 
1.8.1.4

^ permalink raw reply	[relevance 2%]

* [dpdk-dev] [PATCH v15 11/13] ixgbe: enable rx queue interrupts for both PF and VF
  2015-07-20  3:02  4%     ` [dpdk-dev] [PATCH v15 00/13] Interrupt mode PMD Cunming Liang
                         ` (6 preceding siblings ...)
  2015-07-20  3:02  3%       ` [dpdk-dev] [PATCH v15 10/13] ethdev: add rx intr enable, disable and ctl functions Cunming Liang
@ 2015-07-20  3:02  1%       ` Cunming Liang
  2015-07-20  3:02  2%       ` [dpdk-dev] [PATCH v15 12/13] igb: enable rx queue interrupts for PF Cunming Liang
                         ` (2 subsequent siblings)
  10 siblings, 0 replies; 200+ results
From: Cunming Liang @ 2015-07-20  3:02 UTC (permalink / raw)
  To: dev, thomas.monjalon; +Cc: shemming

The patch does below things for ixgbe PF and VF:
- Setup NIC to generate MSI-X interrupts
- Set the IVAR register to map interrupt causes to vectors
- Implement interrupt enable/disable functions

Signed-off-by: Danny Zhou <danny.zhou@intel.com>
Signed-off-by: Yong Liu <yong.liu@intel.com>
Signed-off-by: Cunming Liang <cunming.liang@intel.com>
---
v14 changes
 - per-patch basis ABI compatibility rework

v10 changes
 - return an actual error code rather than -1

v9 changes
 - move queue-vec mapping init from dev_configure to dev_start

v8 changes
 - add vfio-msi/vfio-legacy and uio-legacy support

v7 changes
 - add condition check when intr vector is not enabled

v6 changes
 - fill queue-vector mapping table

v5 changes
 - Rebase the patchset onto the HEAD

v3 changes
 - Remove spinlok from PMD

v2 changes
 - Consolidate review comments related to coding style

 drivers/net/ixgbe/ixgbe_ethdev.c | 527 ++++++++++++++++++++++++++++++++++++++-
 drivers/net/ixgbe/ixgbe_ethdev.h |   4 +
 2 files changed, 518 insertions(+), 13 deletions(-)

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index 3a8cff0..7f43fb6 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -85,6 +85,9 @@
  */
 #define IXGBE_FC_LO    0x40
 
+/* Default minimum inter-interrupt interval for EITR configuration */
+#define IXGBE_MIN_INTER_INTERRUPT_INTERVAL_DEFAULT    0x79E
+
 /* Timer value included in XOFF frames. */
 #define IXGBE_FC_PAUSE 0x680
 
@@ -187,6 +190,9 @@ static int ixgbe_dev_rss_reta_query(struct rte_eth_dev *dev,
 			uint16_t reta_size);
 static void ixgbe_dev_link_status_print(struct rte_eth_dev *dev);
 static int ixgbe_dev_lsc_interrupt_setup(struct rte_eth_dev *dev);
+#ifdef RTE_NEXT_ABI
+static int ixgbe_dev_rxq_interrupt_setup(struct rte_eth_dev *dev);
+#endif
 static int ixgbe_dev_interrupt_get_status(struct rte_eth_dev *dev);
 static int ixgbe_dev_interrupt_action(struct rte_eth_dev *dev);
 static void ixgbe_dev_interrupt_handler(struct rte_intr_handle *handle,
@@ -202,11 +208,14 @@ static void ixgbe_dcb_init(struct ixgbe_hw *hw,struct ixgbe_dcb_config *dcb_conf
 /* For Virtual Function support */
 static int eth_ixgbevf_dev_init(struct rte_eth_dev *eth_dev);
 static int eth_ixgbevf_dev_uninit(struct rte_eth_dev *eth_dev);
+static int ixgbevf_dev_interrupt_get_status(struct rte_eth_dev *dev);
+static int ixgbevf_dev_interrupt_action(struct rte_eth_dev *dev);
 static int  ixgbevf_dev_configure(struct rte_eth_dev *dev);
 static int  ixgbevf_dev_start(struct rte_eth_dev *dev);
 static void ixgbevf_dev_stop(struct rte_eth_dev *dev);
 static void ixgbevf_dev_close(struct rte_eth_dev *dev);
 static void ixgbevf_intr_disable(struct ixgbe_hw *hw);
+static void ixgbevf_intr_enable(struct ixgbe_hw *hw);
 static void ixgbevf_dev_stats_get(struct rte_eth_dev *dev,
 		struct rte_eth_stats *stats);
 static void ixgbevf_dev_stats_reset(struct rte_eth_dev *dev);
@@ -216,6 +225,17 @@ static void ixgbevf_vlan_strip_queue_set(struct rte_eth_dev *dev,
 		uint16_t queue, int on);
 static void ixgbevf_vlan_offload_set(struct rte_eth_dev *dev, int mask);
 static void ixgbevf_set_vfta_all(struct rte_eth_dev *dev, bool on);
+static void ixgbevf_dev_interrupt_handler(struct rte_intr_handle *handle,
+					  void *param);
+#ifdef RTE_NEXT_ABI
+static int ixgbevf_dev_rx_queue_intr_enable(struct rte_eth_dev *dev,
+					    uint16_t queue_id);
+static int ixgbevf_dev_rx_queue_intr_disable(struct rte_eth_dev *dev,
+					     uint16_t queue_id);
+static void ixgbevf_set_ivar_map(struct ixgbe_hw *hw, int8_t direction,
+				 uint8_t queue, uint8_t msix_vector);
+#endif
+static void ixgbevf_configure_msix(struct rte_eth_dev *dev);
 
 /* For Eth VMDQ APIs support */
 static int ixgbe_uc_hash_table_set(struct rte_eth_dev *dev, struct
@@ -232,6 +252,15 @@ static int ixgbe_mirror_rule_set(struct rte_eth_dev *dev,
 		uint8_t rule_id, uint8_t on);
 static int ixgbe_mirror_rule_reset(struct rte_eth_dev *dev,
 		uint8_t	rule_id);
+#ifdef RTE_NEXT_ABI
+static int ixgbe_dev_rx_queue_intr_enable(struct rte_eth_dev *dev,
+					  uint16_t queue_id);
+static int ixgbe_dev_rx_queue_intr_disable(struct rte_eth_dev *dev,
+					   uint16_t queue_id);
+static void ixgbe_set_ivar_map(struct ixgbe_hw *hw, int8_t direction,
+			       uint8_t queue, uint8_t msix_vector);
+#endif
+static void ixgbe_configure_msix(struct rte_eth_dev *dev);
 
 static int ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev,
 		uint16_t queue_idx, uint16_t tx_rate);
@@ -308,7 +337,7 @@ static int ixgbe_timesync_read_tx_timestamp(struct rte_eth_dev *dev,
  */
 #define UPDATE_VF_STAT(reg, last, cur)	                        \
 {                                                               \
-	u32 latest = IXGBE_READ_REG(hw, reg);                   \
+	uint32_t latest = IXGBE_READ_REG(hw, reg);              \
 	cur += latest - last;                                   \
 	last = latest;                                          \
 }
@@ -391,6 +420,10 @@ static const struct eth_dev_ops ixgbe_eth_dev_ops = {
 	.tx_queue_start	      = ixgbe_dev_tx_queue_start,
 	.tx_queue_stop        = ixgbe_dev_tx_queue_stop,
 	.rx_queue_setup       = ixgbe_dev_rx_queue_setup,
+#ifdef RTE_NEXT_ABI
+	.rx_queue_intr_enable = ixgbe_dev_rx_queue_intr_enable,
+	.rx_queue_intr_disable = ixgbe_dev_rx_queue_intr_disable,
+#endif
 	.rx_queue_release     = ixgbe_dev_rx_queue_release,
 	.rx_queue_count       = ixgbe_dev_rx_queue_count,
 	.rx_descriptor_done   = ixgbe_dev_rx_descriptor_done,
@@ -461,8 +494,13 @@ static const struct eth_dev_ops ixgbevf_eth_dev_ops = {
 	.vlan_offload_set     = ixgbevf_vlan_offload_set,
 	.rx_queue_setup       = ixgbe_dev_rx_queue_setup,
 	.rx_queue_release     = ixgbe_dev_rx_queue_release,
+	.rx_descriptor_done   = ixgbe_dev_rx_descriptor_done,
 	.tx_queue_setup       = ixgbe_dev_tx_queue_setup,
 	.tx_queue_release     = ixgbe_dev_tx_queue_release,
+#ifdef RTE_NEXT_ABI
+	.rx_queue_intr_enable = ixgbevf_dev_rx_queue_intr_enable,
+	.rx_queue_intr_disable = ixgbevf_dev_rx_queue_intr_disable,
+#endif
 	.mac_addr_add         = ixgbevf_add_mac_addr,
 	.mac_addr_remove      = ixgbevf_remove_mac_addr,
 	.set_mc_addr_list     = ixgbe_dev_set_mc_addr_list,
@@ -1000,12 +1038,6 @@ eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev)
 			eth_dev->data->port_id, pci_dev->id.vendor_id,
 			pci_dev->id.device_id);
 
-	rte_intr_callback_register(&(pci_dev->intr_handle),
-		ixgbe_dev_interrupt_handler, (void *)eth_dev);
-
-	/* enable uio intr after callback register */
-	rte_intr_enable(&(pci_dev->intr_handle));
-
 	/* enable support intr */
 	ixgbe_enable_intr(eth_dev);
 
@@ -1647,6 +1679,10 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
 		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	struct ixgbe_vf_info *vfinfo =
 		*IXGBE_DEV_PRIVATE_TO_P_VFDATA(dev->data->dev_private);
+	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+#ifdef RTE_NEXT_ABI
+	uint32_t intr_vector = 0;
+#endif
 	int err, link_up = 0, negotiate = 0;
 	uint32_t speed = 0;
 	int mask = 0;
@@ -1679,6 +1715,30 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
 	/* configure PF module if SRIOV enabled */
 	ixgbe_pf_host_configure(dev);
 
+#ifdef RTE_NEXT_ABI
+	/* check and configure queue intr-vector mapping */
+	if (dev->data->dev_conf.intr_conf.rxq != 0)
+		intr_vector = dev->data->nb_rx_queues;
+
+	if (rte_intr_efd_enable(intr_handle, intr_vector))
+		return -1;
+
+	if (rte_intr_dp_is_en(intr_handle) && !intr_handle->intr_vec) {
+		intr_handle->intr_vec =
+			rte_zmalloc("intr_vec",
+				    dev->data->nb_rx_queues * sizeof(int),
+				    0);
+		if (intr_handle->intr_vec == NULL) {
+			PMD_INIT_LOG(ERR, "Failed to allocate %d rx_queues"
+				     " intr_vec\n", dev->data->nb_rx_queues);
+			return -ENOMEM;
+		}
+	}
+#endif
+
+	/* confiugre msix for sleep until rx interrupt */
+	ixgbe_configure_msix(dev);
+
 	/* initialize transmission unit */
 	ixgbe_dev_tx_init(dev);
 
@@ -1756,8 +1816,25 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
 skip_link_setup:
 
 	/* check if lsc interrupt is enabled */
-	if (dev->data->dev_conf.intr_conf.lsc != 0)
-		ixgbe_dev_lsc_interrupt_setup(dev);
+	if (dev->data->dev_conf.intr_conf.lsc != 0) {
+		if (rte_intr_allow_others(intr_handle)) {
+			rte_intr_callback_register(intr_handle,
+						   ixgbe_dev_interrupt_handler,
+						   (void *)dev);
+			ixgbe_dev_lsc_interrupt_setup(dev);
+		} else
+			PMD_INIT_LOG(INFO, "lsc won't enable because of"
+				     " no intr multiplex\n");
+	}
+
+#ifdef RTE_NEXT_ABI
+	/* check if rxq interrupt is enabled */
+	if (dev->data->dev_conf.intr_conf.rxq != 0)
+		ixgbe_dev_rxq_interrupt_setup(dev);
+#endif
+
+	/* enable uio/vfio intr/eventfd mapping */
+	rte_intr_enable(intr_handle);
 
 	/* resume enabled intr since hw reset */
 	ixgbe_enable_intr(dev);
@@ -1814,6 +1891,7 @@ ixgbe_dev_stop(struct rte_eth_dev *dev)
 	struct ixgbe_filter_info *filter_info =
 		IXGBE_DEV_PRIVATE_TO_FILTER_INFO(dev->data->dev_private);
 	struct ixgbe_5tuple_filter *p_5tuple, *p_5tuple_next;
+	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
 	int vf;
 
 	PMD_INIT_FUNC_TRACE();
@@ -1821,6 +1899,9 @@ ixgbe_dev_stop(struct rte_eth_dev *dev)
 	/* disable interrupts */
 	ixgbe_disable_intr(hw);
 
+	/* disable intr eventfd mapping */
+	rte_intr_disable(intr_handle);
+
 	/* reset the NIC */
 	ixgbe_pf_reset_hw(hw);
 	hw->adapter_stopped = 0;
@@ -1861,6 +1942,14 @@ ixgbe_dev_stop(struct rte_eth_dev *dev)
 	memset(filter_info->fivetuple_mask, 0,
 		sizeof(uint32_t) * IXGBE_5TUPLE_ARRAY_SIZE);
 
+#ifdef RTE_NEXT_ABI
+	/* Clean datapath event and queue/vec mapping */
+	rte_intr_efd_disable(intr_handle);
+	if (intr_handle->intr_vec != NULL) {
+		rte_free(intr_handle->intr_vec);
+		intr_handle->intr_vec = NULL;
+	}
+#endif
 }
 
 /*
@@ -2535,6 +2624,30 @@ ixgbe_dev_lsc_interrupt_setup(struct rte_eth_dev *dev)
 	return 0;
 }
 
+/**
+ * It clears the interrupt causes and enables the interrupt.
+ * It will be called once only during nic initialized.
+ *
+ * @param dev
+ *  Pointer to struct rte_eth_dev.
+ *
+ * @return
+ *  - On success, zero.
+ *  - On failure, a negative value.
+ */
+#ifdef RTE_NEXT_ABI
+static int
+ixgbe_dev_rxq_interrupt_setup(struct rte_eth_dev *dev)
+{
+	struct ixgbe_interrupt *intr =
+		IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
+
+	intr->mask |= IXGBE_EICR_RTX_QUEUE;
+
+	return 0;
+}
+#endif
+
 /*
  * It reads ICR and sets flag (IXGBE_EICR_LSC) for the link_update.
  *
@@ -2561,10 +2674,10 @@ ixgbe_dev_interrupt_get_status(struct rte_eth_dev *dev)
 	PMD_DRV_LOG(INFO, "eicr %x", eicr);
 
 	intr->flags = 0;
-	if (eicr & IXGBE_EICR_LSC) {
-		/* set flag for async link update */
+
+	/* set flag for async link update */
+	if (eicr & IXGBE_EICR_LSC)
 		intr->flags |= IXGBE_FLAG_NEED_LINK_UPDATE;
-	}
 
 	if (eicr & IXGBE_EICR_MAILBOX)
 		intr->flags |= IXGBE_FLAG_MAILBOX;
@@ -2572,6 +2685,30 @@ ixgbe_dev_interrupt_get_status(struct rte_eth_dev *dev)
 	return 0;
 }
 
+static int
+ixgbevf_dev_interrupt_get_status(struct rte_eth_dev *dev)
+{
+	uint32_t eicr;
+	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct ixgbe_interrupt *intr =
+		IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
+
+	/* clear all cause mask */
+	ixgbevf_intr_disable(hw);
+
+	/* read-on-clear nic registers here */
+	eicr = IXGBE_READ_REG(hw, IXGBE_VTEICR);
+	PMD_DRV_LOG(INFO, "eicr %x", eicr);
+
+	intr->flags = 0;
+
+	/* set flag for async link update */
+	if (eicr & IXGBE_EICR_LSC)
+		intr->flags |= IXGBE_FLAG_NEED_LINK_UPDATE;
+
+	return 0;
+}
+
 /**
  * It gets and then prints the link status.
  *
@@ -2667,6 +2804,18 @@ ixgbe_dev_interrupt_action(struct rte_eth_dev *dev)
 	return 0;
 }
 
+static int
+ixgbevf_dev_interrupt_action(struct rte_eth_dev *dev)
+{
+	struct ixgbe_hw *hw =
+		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+
+	PMD_DRV_LOG(DEBUG, "enable intr immediately");
+	ixgbevf_intr_enable(hw);
+	rte_intr_enable(&dev->pci_dev->intr_handle);
+	return 0;
+}
+
 /**
  * Interrupt handler which shall be registered for alarm callback for delayed
  * handling specific interrupt to wait for the stable nic state. As the
@@ -2721,13 +2870,24 @@ ixgbe_dev_interrupt_delayed_handler(void *param)
  */
 static void
 ixgbe_dev_interrupt_handler(__rte_unused struct rte_intr_handle *handle,
-							void *param)
+			    void *param)
 {
 	struct rte_eth_dev *dev = (struct rte_eth_dev *)param;
+
 	ixgbe_dev_interrupt_get_status(dev);
 	ixgbe_dev_interrupt_action(dev);
 }
 
+static void
+ixgbevf_dev_interrupt_handler(__rte_unused struct rte_intr_handle *handle,
+			      void *param)
+{
+	struct rte_eth_dev *dev = (struct rte_eth_dev *)param;
+
+	ixgbevf_dev_interrupt_get_status(dev);
+	ixgbevf_dev_interrupt_action(dev);
+}
+
 static int
 ixgbe_dev_led_on(struct rte_eth_dev *dev)
 {
@@ -3233,6 +3393,19 @@ ixgbevf_intr_disable(struct ixgbe_hw *hw)
 	IXGBE_WRITE_FLUSH(hw);
 }
 
+static void
+ixgbevf_intr_enable(struct ixgbe_hw *hw)
+{
+	PMD_INIT_FUNC_TRACE();
+
+	/* VF enable interrupt autoclean */
+	IXGBE_WRITE_REG(hw, IXGBE_VTEIAM, IXGBE_VF_IRQ_ENABLE_MASK);
+	IXGBE_WRITE_REG(hw, IXGBE_VTEIAC, IXGBE_VF_IRQ_ENABLE_MASK);
+	IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, IXGBE_VF_IRQ_ENABLE_MASK);
+
+	IXGBE_WRITE_FLUSH(hw);
+}
+
 static int
 ixgbevf_dev_configure(struct rte_eth_dev *dev)
 {
@@ -3274,6 +3447,11 @@ ixgbevf_dev_start(struct rte_eth_dev *dev)
 {
 	struct ixgbe_hw *hw =
 		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+#ifdef RTE_NEXT_ABI
+	uint32_t intr_vector = 0;
+#endif
+	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+
 	int err, mask = 0;
 
 	PMD_INIT_FUNC_TRACE();
@@ -3304,6 +3482,42 @@ ixgbevf_dev_start(struct rte_eth_dev *dev)
 
 	ixgbevf_dev_rxtx_start(dev);
 
+#ifdef RTE_NEXT_ABI
+	/* check and configure queue intr-vector mapping */
+	if (dev->data->dev_conf.intr_conf.rxq != 0)
+		intr_vector = dev->data->nb_rx_queues;
+
+	if (rte_intr_efd_enable(intr_handle, intr_vector))
+		return -1;
+
+	if (rte_intr_dp_is_en(intr_handle) && !intr_handle->intr_vec) {
+		intr_handle->intr_vec =
+			rte_zmalloc("intr_vec",
+				    dev->data->nb_rx_queues * sizeof(int), 0);
+		if (intr_handle->intr_vec == NULL) {
+			PMD_INIT_LOG(ERR, "Failed to allocate %d rx_queues"
+				     " intr_vec\n", dev->data->nb_rx_queues);
+			return -ENOMEM;
+		}
+	}
+#endif
+	ixgbevf_configure_msix(dev);
+
+	if (dev->data->dev_conf.intr_conf.lsc != 0) {
+		if (rte_intr_allow_others(intr_handle))
+			rte_intr_callback_register(intr_handle,
+					ixgbevf_dev_interrupt_handler,
+					(void *)dev);
+		else
+			PMD_INIT_LOG(INFO, "lsc won't enable because of"
+				     " no intr multiplex\n");
+	}
+
+	rte_intr_enable(intr_handle);
+
+	/* Re-enable interrupt for VF */
+	ixgbevf_intr_enable(hw);
+
 	return 0;
 }
 
@@ -3311,6 +3525,7 @@ static void
 ixgbevf_dev_stop(struct rte_eth_dev *dev)
 {
 	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -3327,12 +3542,27 @@ ixgbevf_dev_stop(struct rte_eth_dev *dev)
 	dev->data->scattered_rx = 0;
 
 	ixgbe_dev_clear_queues(dev);
+
+	/* disable intr eventfd mapping */
+	rte_intr_disable(intr_handle);
+
+#ifdef RTE_NEXT_ABI
+	/* Clean datapath event and queue/vec mapping */
+	rte_intr_efd_disable(intr_handle);
+	if (intr_handle->intr_vec != NULL) {
+		rte_free(intr_handle->intr_vec);
+		intr_handle->intr_vec = NULL;
+	}
+#endif
 }
 
 static void
 ixgbevf_dev_close(struct rte_eth_dev *dev)
 {
 	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+#ifdef RTE_NEXT_ABI
+	struct rte_pci_device *pci_dev;
+#endif
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -3344,6 +3574,14 @@ ixgbevf_dev_close(struct rte_eth_dev *dev)
 
 	/* reprogram the RAR[0] in case user changed it. */
 	ixgbe_set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV);
+
+#ifdef RTE_NEXT_ABI
+	pci_dev = dev->pci_dev;
+	if (pci_dev->intr_handle.intr_vec) {
+		rte_free(pci_dev->intr_handle.intr_vec);
+		pci_dev->intr_handle.intr_vec = NULL;
+	}
+#endif
 }
 
 static void ixgbevf_set_vfta_all(struct rte_eth_dev *dev, bool on)
@@ -3861,6 +4099,269 @@ ixgbe_mirror_rule_reset(struct rte_eth_dev *dev, uint8_t rule_id)
 	return 0;
 }
 
+#ifdef RTE_NEXT_ABI
+static int
+ixgbevf_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
+{
+	uint32_t mask;
+	struct ixgbe_hw *hw =
+		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+
+	mask = IXGBE_READ_REG(hw, IXGBE_VTEIMS);
+	mask |= (1 << queue_id);
+	IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, mask);
+
+	rte_intr_enable(&dev->pci_dev->intr_handle);
+
+	return 0;
+}
+
+static int
+ixgbevf_dev_rx_queue_intr_disable(struct rte_eth_dev *dev, uint16_t queue_id)
+{
+	uint32_t mask;
+	struct ixgbe_hw *hw =
+		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+
+	mask = IXGBE_READ_REG(hw, IXGBE_VTEIMS);
+	mask &= ~(1 << queue_id);
+	IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, mask);
+
+	return 0;
+}
+
+static int
+ixgbe_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
+{
+	uint32_t mask;
+	struct ixgbe_hw *hw =
+		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct ixgbe_interrupt *intr =
+		IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
+
+	if (queue_id < 16) {
+		ixgbe_disable_intr(hw);
+		intr->mask |= (1 << queue_id);
+		ixgbe_enable_intr(dev);
+	} else if (queue_id < 32) {
+		mask = IXGBE_READ_REG(hw, IXGBE_EIMS_EX(0));
+		mask &= (1 << queue_id);
+		IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(0), mask);
+	} else if (queue_id < 64) {
+		mask = IXGBE_READ_REG(hw, IXGBE_EIMS_EX(1));
+		mask &= (1 << (queue_id - 32));
+		IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(1), mask);
+	}
+	rte_intr_enable(&dev->pci_dev->intr_handle);
+
+	return 0;
+}
+
+static int
+ixgbe_dev_rx_queue_intr_disable(struct rte_eth_dev *dev, uint16_t queue_id)
+{
+	uint32_t mask;
+	struct ixgbe_hw *hw =
+		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct ixgbe_interrupt *intr =
+		IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
+
+	if (queue_id < 16) {
+		ixgbe_disable_intr(hw);
+		intr->mask &= ~(1 << queue_id);
+		ixgbe_enable_intr(dev);
+	} else if (queue_id < 32) {
+		mask = IXGBE_READ_REG(hw, IXGBE_EIMS_EX(0));
+		mask &= ~(1 << queue_id);
+		IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(0), mask);
+	} else if (queue_id < 64) {
+		mask = IXGBE_READ_REG(hw, IXGBE_EIMS_EX(1));
+		mask &= ~(1 << (queue_id - 32));
+		IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(1), mask);
+	}
+
+	return 0;
+}
+
+static void
+ixgbevf_set_ivar_map(struct ixgbe_hw *hw, int8_t direction,
+		     uint8_t queue, uint8_t msix_vector)
+{
+	uint32_t tmp, idx;
+
+	if (direction == -1) {
+		/* other causes */
+		msix_vector |= IXGBE_IVAR_ALLOC_VAL;
+		tmp = IXGBE_READ_REG(hw, IXGBE_VTIVAR_MISC);
+		tmp &= ~0xFF;
+		tmp |= msix_vector;
+		IXGBE_WRITE_REG(hw, IXGBE_VTIVAR_MISC, tmp);
+	} else {
+		/* rx or tx cause */
+		msix_vector |= IXGBE_IVAR_ALLOC_VAL;
+		idx = ((16 * (queue & 1)) + (8 * direction));
+		tmp = IXGBE_READ_REG(hw, IXGBE_VTIVAR(queue >> 1));
+		tmp &= ~(0xFF << idx);
+		tmp |= (msix_vector << idx);
+		IXGBE_WRITE_REG(hw, IXGBE_VTIVAR(queue >> 1), tmp);
+	}
+}
+
+/**
+ * set the IVAR registers, mapping interrupt causes to vectors
+ * @param hw
+ *  pointer to ixgbe_hw struct
+ * @direction
+ *  0 for Rx, 1 for Tx, -1 for other causes
+ * @queue
+ *  queue to map the corresponding interrupt to
+ * @msix_vector
+ *  the vector to map to the corresponding queue
+ */
+static void
+ixgbe_set_ivar_map(struct ixgbe_hw *hw, int8_t direction,
+		   uint8_t queue, uint8_t msix_vector)
+{
+	uint32_t tmp, idx;
+
+	msix_vector |= IXGBE_IVAR_ALLOC_VAL;
+	if (hw->mac.type == ixgbe_mac_82598EB) {
+		if (direction == -1)
+			direction = 0;
+		idx = (((direction * 64) + queue) >> 2) & 0x1F;
+		tmp = IXGBE_READ_REG(hw, IXGBE_IVAR(idx));
+		tmp &= ~(0xFF << (8 * (queue & 0x3)));
+		tmp |= (msix_vector << (8 * (queue & 0x3)));
+		IXGBE_WRITE_REG(hw, IXGBE_IVAR(idx), tmp);
+	} else if ((hw->mac.type == ixgbe_mac_82599EB) ||
+			(hw->mac.type == ixgbe_mac_X540)) {
+		if (direction == -1) {
+			/* other causes */
+			idx = ((queue & 1) * 8);
+			tmp = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
+			tmp &= ~(0xFF << idx);
+			tmp |= (msix_vector << idx);
+			IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, tmp);
+		} else {
+			/* rx or tx causes */
+			idx = ((16 * (queue & 1)) + (8 * direction));
+			tmp = IXGBE_READ_REG(hw, IXGBE_IVAR(queue >> 1));
+			tmp &= ~(0xFF << idx);
+			tmp |= (msix_vector << idx);
+			IXGBE_WRITE_REG(hw, IXGBE_IVAR(queue >> 1), tmp);
+		}
+	}
+}
+#endif
+
+static void
+ixgbevf_configure_msix(struct rte_eth_dev *dev)
+{
+	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+#ifdef RTE_NEXT_ABI
+	struct ixgbe_hw *hw =
+		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	uint32_t q_idx;
+	uint32_t vector_idx = 0;
+#endif
+
+	/* won't configure msix register if no mapping is done
+	 * between intr vector and event fd.
+	 */
+	if (!rte_intr_dp_is_en(intr_handle))
+		return;
+
+#ifdef RTE_NEXT_ABI
+	/* Configure all RX queues of VF */
+	for (q_idx = 0; q_idx < dev->data->nb_rx_queues; q_idx++) {
+		/* Force all queue use vector 0,
+		 * as IXGBE_VF_MAXMSIVECOTR = 1
+		 */
+		ixgbevf_set_ivar_map(hw, 0, q_idx, vector_idx);
+		intr_handle->intr_vec[q_idx] = vector_idx;
+	}
+
+	/* Configure VF Rx queue ivar */
+	ixgbevf_set_ivar_map(hw, -1, 1, vector_idx);
+#endif
+}
+
+/**
+ * Sets up the hardware to properly generate MSI-X interrupts
+ * @hw
+ *  board private structure
+ */
+static void
+ixgbe_configure_msix(struct rte_eth_dev *dev)
+{
+	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+#ifdef RTE_NEXT_ABI
+	struct ixgbe_hw *hw =
+		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	uint32_t queue_id, vec = 0;
+	uint32_t mask;
+	uint32_t gpie;
+#endif
+
+	/* won't configure msix register if no mapping is done
+	 * between intr vector and event fd
+	 */
+	if (!rte_intr_dp_is_en(intr_handle))
+		return;
+
+#ifdef RTE_NEXT_ABI
+	/* setup GPIE for MSI-x mode */
+	gpie = IXGBE_READ_REG(hw, IXGBE_GPIE);
+	gpie |= IXGBE_GPIE_MSIX_MODE | IXGBE_GPIE_PBA_SUPPORT |
+		IXGBE_GPIE_OCD | IXGBE_GPIE_EIAME;
+	/* auto clearing and auto setting corresponding bits in EIMS
+	 * when MSI-X interrupt is triggered
+	 */
+	if (hw->mac.type == ixgbe_mac_82598EB) {
+		IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE);
+	} else {
+		IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(0), 0xFFFFFFFF);
+		IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(1), 0xFFFFFFFF);
+	}
+	IXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie);
+
+	/* Populate the IVAR table and set the ITR values to the
+	 * corresponding register.
+	 */
+	for (queue_id = 0; queue_id < dev->data->nb_rx_queues;
+	     queue_id++) {
+		/* by default, 1:1 mapping */
+		ixgbe_set_ivar_map(hw, 0, queue_id, vec);
+		intr_handle->intr_vec[queue_id] = vec;
+		if (vec < intr_handle->nb_efd - 1)
+			vec++;
+	}
+
+	switch (hw->mac.type) {
+	case ixgbe_mac_82598EB:
+		ixgbe_set_ivar_map(hw, -1, IXGBE_IVAR_OTHER_CAUSES_INDEX,
+				   intr_handle->max_intr - 1);
+		break;
+	case ixgbe_mac_82599EB:
+	case ixgbe_mac_X540:
+		ixgbe_set_ivar_map(hw, -1, 1, intr_handle->max_intr - 1);
+		break;
+	default:
+		break;
+	}
+	IXGBE_WRITE_REG(hw, IXGBE_EITR(queue_id),
+			IXGBE_MIN_INTER_INTERRUPT_INTERVAL_DEFAULT & 0xFFF);
+
+	/* set up to autoclear timer, and the vectors */
+	mask = IXGBE_EIMS_ENABLE_MASK;
+	mask &= ~(IXGBE_EIMS_OTHER |
+		  IXGBE_EIMS_MAILBOX |
+		  IXGBE_EIMS_LSC);
+
+	IXGBE_WRITE_REG(hw, IXGBE_EIAC, mask);
+#endif
+}
+
 static int ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev,
 	uint16_t queue_idx, uint16_t tx_rate)
 {
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.h b/drivers/net/ixgbe/ixgbe_ethdev.h
index c16c11d..c3d4f4f 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.h
+++ b/drivers/net/ixgbe/ixgbe_ethdev.h
@@ -117,6 +117,9 @@
 	ETH_RSS_IPV6_TCP_EX | \
 	ETH_RSS_IPV6_UDP_EX)
 
+#define IXGBE_VF_IRQ_ENABLE_MASK        3          /* vf irq enable mask */
+#define IXGBE_VF_MAXMSIVECTOR           1
+
 /*
  * Information about the fdir mode.
  */
@@ -332,6 +335,7 @@ uint32_t ixgbe_dev_rx_queue_count(struct rte_eth_dev *dev,
 		uint16_t rx_queue_id);
 
 int ixgbe_dev_rx_descriptor_done(void *rx_queue, uint16_t offset);
+int ixgbevf_dev_rx_descriptor_done(void *rx_queue, uint16_t offset);
 
 int ixgbe_dev_rx_init(struct rte_eth_dev *dev);
 
-- 
1.8.1.4

^ permalink raw reply	[relevance 1%]

* [dpdk-dev] [PATCH v15 10/13] ethdev: add rx intr enable, disable and ctl functions
  2015-07-20  3:02  4%     ` [dpdk-dev] [PATCH v15 00/13] Interrupt mode PMD Cunming Liang
                         ` (5 preceding siblings ...)
  2015-07-20  3:02  3%       ` [dpdk-dev] [PATCH v15 08/13] eal/bsd: dummy for new intr definition Cunming Liang
@ 2015-07-20  3:02  3%       ` Cunming Liang
  2015-07-20  3:02  1%       ` [dpdk-dev] [PATCH v15 11/13] ixgbe: enable rx queue interrupts for both PF and VF Cunming Liang
                         ` (3 subsequent siblings)
  10 siblings, 0 replies; 200+ results
From: Cunming Liang @ 2015-07-20  3:02 UTC (permalink / raw)
  To: dev, thomas.monjalon; +Cc: shemming

The patch adds two dev_ops functions to enable and disable rx queue interrupts.
In addtion, it adds rte_eth_dev_rx_intr_ctl/rx_intr_q to support per port or per queue rx intr event set.

Signed-off-by: Danny Zhou <danny.zhou@intel.com>
Signed-off-by: Cunming Liang <cunming.liang@intel.com>
---
v15 changes
 - remove ifdef RTE_NEXT_ABI from header file

v14 changes
 - per-patch basis ABI compatibility rework
 - remove unnecessary 'local: *' from version map

v13 changes
 - version map cleanup for v2.1

v9 changes
 - remove unnecessary check after rte_eth_dev_is_valid_port.
   the same as http://www.dpdk.org/dev/patchwork/patch/4784

v8 changes
 - add addtion check for EEXIT

v7 changes
 - remove rx_intr_vec_get
 - add rx_intr_ctl and rx_intr_ctl_q

v6 changes
 - add rx_intr_vec_get to retrieve the vector num of the queue.

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

 lib/librte_ether/rte_ethdev.c          | 147 +++++++++++++++++++++++++++++++++
 lib/librte_ether/rte_ethdev.h          | 104 +++++++++++++++++++++++
 lib/librte_ether/rte_ether_version.map |   4 +
 3 files changed, 255 insertions(+)

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 94104ce..a24c399 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -3031,6 +3031,153 @@ _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
 	}
 	rte_spinlock_unlock(&rte_eth_dev_cb_lock);
 }
+
+#ifdef RTE_NEXT_ABI
+int
+rte_eth_dev_rx_intr_ctl(uint8_t port_id, int epfd, int op, void *data)
+{
+	uint32_t vec;
+	struct rte_eth_dev *dev;
+	struct rte_intr_handle *intr_handle;
+	uint16_t qid;
+	int rc;
+
+	if (!rte_eth_dev_is_valid_port(port_id)) {
+		PMD_DEBUG_TRACE("Invalid port_id=%u\n", port_id);
+		return -ENODEV;
+	}
+
+	dev = &rte_eth_devices[port_id];
+	intr_handle = &dev->pci_dev->intr_handle;
+	if (!intr_handle->intr_vec) {
+		PMD_DEBUG_TRACE("RX Intr vector unset\n");
+		return -EPERM;
+	}
+
+	for (qid = 0; qid < dev->data->nb_rx_queues; qid++) {
+		vec = intr_handle->intr_vec[qid];
+		rc = rte_intr_rx_ctl(intr_handle, epfd, op, vec, data);
+		if (rc && rc != -EEXIST) {
+			PMD_DEBUG_TRACE("p %u q %u rx ctl error"
+					" op %d epfd %d vec %u\n",
+					port_id, qid, op, epfd, vec);
+		}
+	}
+
+	return 0;
+}
+
+int
+rte_eth_dev_rx_intr_ctl_q(uint8_t port_id, uint16_t queue_id,
+			  int epfd, int op, void *data)
+{
+	uint32_t vec;
+	struct rte_eth_dev *dev;
+	struct rte_intr_handle *intr_handle;
+	int rc;
+
+	if (!rte_eth_dev_is_valid_port(port_id)) {
+		PMD_DEBUG_TRACE("Invalid port_id=%u\n", port_id);
+		return -ENODEV;
+	}
+
+	dev = &rte_eth_devices[port_id];
+	if (queue_id >= dev->data->nb_rx_queues) {
+		PMD_DEBUG_TRACE("Invalid RX queue_id=%u\n", queue_id);
+		return -EINVAL;
+	}
+
+	intr_handle = &dev->pci_dev->intr_handle;
+	if (!intr_handle->intr_vec) {
+		PMD_DEBUG_TRACE("RX Intr vector unset\n");
+		return -EPERM;
+	}
+
+	vec = intr_handle->intr_vec[queue_id];
+	rc = rte_intr_rx_ctl(intr_handle, epfd, op, vec, data);
+	if (rc && rc != -EEXIST) {
+		PMD_DEBUG_TRACE("p %u q %u rx ctl error"
+				" op %d epfd %d vec %u\n",
+				port_id, queue_id, op, epfd, vec);
+		return rc;
+	}
+
+	return 0;
+}
+
+int
+rte_eth_dev_rx_intr_enable(uint8_t port_id,
+			   uint16_t queue_id)
+{
+	struct rte_eth_dev *dev;
+
+	if (!rte_eth_dev_is_valid_port(port_id)) {
+		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
+		return -ENODEV;
+	}
+
+	dev = &rte_eth_devices[port_id];
+
+	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_intr_disable(uint8_t port_id,
+			    uint16_t queue_id)
+{
+	struct rte_eth_dev *dev;
+
+	if (!rte_eth_dev_is_valid_port(port_id)) {
+		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
+		return -ENODEV;
+	}
+
+	dev = &rte_eth_devices[port_id];
+
+	FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_intr_disable, -ENOTSUP);
+	return (*dev->dev_ops->rx_queue_intr_disable)(dev, queue_id);
+}
+#else
+int
+rte_eth_dev_rx_intr_enable(uint8_t port_id, uint16_t queue_id)
+{
+	RTE_SET_USED(port_id);
+	RTE_SET_USED(queue_id);
+	return -ENOTSUP;
+}
+
+int
+rte_eth_dev_rx_intr_disable(uint8_t port_id, uint16_t queue_id)
+{
+	RTE_SET_USED(port_id);
+	RTE_SET_USED(queue_id);
+	return -ENOTSUP;
+}
+
+int
+rte_eth_dev_rx_intr_ctl(uint8_t port_id, int epfd, int op, void *data)
+{
+	RTE_SET_USED(port_id);
+	RTE_SET_USED(epfd);
+	RTE_SET_USED(op);
+	RTE_SET_USED(data);
+	return -1;
+}
+
+int
+rte_eth_dev_rx_intr_ctl_q(uint8_t port_id, uint16_t queue_id,
+			  int epfd, int op, void *data)
+{
+	RTE_SET_USED(port_id);
+	RTE_SET_USED(queue_id);
+	RTE_SET_USED(epfd);
+	RTE_SET_USED(op);
+	RTE_SET_USED(data);
+	return -1;
+}
+#endif
+
 #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 c901a2c..662e106 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -845,6 +845,10 @@ struct rte_eth_fdir {
 struct rte_intr_conf {
 	/** enable/disable lsc interrupt. 0 (default) - disable, 1 enable */
 	uint16_t lsc;
+#ifdef RTE_NEXT_ABI
+	/** enable/disable rxq interrupt. 0 (default) - disable, 1 enable */
+	uint16_t rxq;
+#endif
 };
 
 /**
@@ -1053,6 +1057,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. */
 
@@ -1380,6 +1392,12 @@ struct eth_dev_ops {
 	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 */
+#ifdef RTE_NEXT_ABI
+	/**< Enable Rx queue interrupt. */
+	eth_rx_enable_intr_t       rx_queue_intr_enable;
+	/**< Disable Rx queue interrupt.*/
+	eth_rx_disable_intr_t      rx_queue_intr_disable;
+#endif
 	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. */
@@ -2957,6 +2975,92 @@ 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_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_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_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_intr_disable(uint8_t port_id, uint16_t queue_id);
+
+/**
+ * RX Interrupt control per port.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param epfd
+ *   Epoll instance fd which the intr vector associated to.
+ *   Using RTE_EPOLL_PER_THREAD allows to use per thread epoll instance.
+ * @param op
+ *   The operation be performed for the vector.
+ *   Operation type of {RTE_INTR_EVENT_ADD, RTE_INTR_EVENT_DEL}.
+ * @param data
+ *   User raw data.
+ * @return
+ *   - On success, zero.
+ *   - On failure, a negative value.
+ */
+int rte_eth_dev_rx_intr_ctl(uint8_t port_id, int epfd, int op, void *data);
+
+/**
+ * RX Interrupt control per queue.
+ *
+ * @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 epfd
+ *   Epoll instance fd which the intr vector associated to.
+ *   Using RTE_EPOLL_PER_THREAD allows to use per thread epoll instance.
+ * @param op
+ *   The operation be performed for the vector.
+ *   Operation type of {RTE_INTR_EVENT_ADD, RTE_INTR_EVENT_DEL}.
+ * @param data
+ *   User raw data.
+ * @return
+ *   - On success, zero.
+ *   - On failure, a negative value.
+ */
+int rte_eth_dev_rx_intr_ctl_q(uint8_t port_id, uint16_t queue_id,
+			      int epfd, int op, void *data);
+
+/**
  * 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 23cfee9..8345a6c 100644
--- a/lib/librte_ether/rte_ether_version.map
+++ b/lib/librte_ether/rte_ether_version.map
@@ -115,6 +115,10 @@ DPDK_2.1 {
 	rte_eth_dev_get_reg_info;
 	rte_eth_dev_get_reg_length;
 	rte_eth_dev_is_valid_port;
+	rte_eth_dev_rx_intr_ctl;
+	rte_eth_dev_rx_intr_ctl_q;
+	rte_eth_dev_rx_intr_disable;
+	rte_eth_dev_rx_intr_enable;
 	rte_eth_dev_set_eeprom;
 	rte_eth_dev_set_mc_addr_list;
 	rte_eth_timesync_disable;
-- 
1.8.1.4

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v15 08/13] eal/bsd: dummy for new intr definition
  2015-07-20  3:02  4%     ` [dpdk-dev] [PATCH v15 00/13] Interrupt mode PMD Cunming Liang
                         ` (4 preceding siblings ...)
  2015-07-20  3:02  3%       ` [dpdk-dev] [PATCH v15 06/13] eal/linux: standalone intr event fd create support Cunming Liang
@ 2015-07-20  3:02  3%       ` Cunming Liang
  2015-07-20  3:02  3%       ` [dpdk-dev] [PATCH v15 10/13] ethdev: add rx intr enable, disable and ctl functions Cunming Liang
                         ` (4 subsequent siblings)
  10 siblings, 0 replies; 200+ results
From: Cunming Liang @ 2015-07-20  3:02 UTC (permalink / raw)
  To: dev, thomas.monjalon; +Cc: shemming

To make bsd compiling happy with new intr changes.

Signed-off-by: Cunming Liang <cunming.liang@intel.com>
---
v15 changes
 - remove ifdef RTE_NEXT_ABI from header file

v14 changes
 - per-patch basis ABI compatibility rework

v13 changes
 - version map cleanup for v2.1

v12 changes
 - fix unused variables compiling warning

v8 changes
 - add stub for new function

v7 changes
 - remove stub 'linux only' function from source file

 lib/librte_eal/bsdapp/eal/eal_interrupts.c         | 42 +++++++++++++
 .../bsdapp/eal/include/exec-env/rte_interrupts.h   | 68 ++++++++++++++++++++++
 lib/librte_eal/bsdapp/eal/rte_eal_version.map      |  5 ++
 3 files changed, 115 insertions(+)

diff --git a/lib/librte_eal/bsdapp/eal/eal_interrupts.c b/lib/librte_eal/bsdapp/eal/eal_interrupts.c
index 26a55c7..51a13fa 100644
--- a/lib/librte_eal/bsdapp/eal/eal_interrupts.c
+++ b/lib/librte_eal/bsdapp/eal/eal_interrupts.c
@@ -68,3 +68,45 @@ rte_eal_intr_init(void)
 {
 	return 0;
 }
+
+int
+rte_intr_rx_ctl(struct rte_intr_handle *intr_handle,
+		int epfd, int op, unsigned int vec, void *data)
+{
+	RTE_SET_USED(intr_handle);
+	RTE_SET_USED(epfd);
+	RTE_SET_USED(op);
+	RTE_SET_USED(vec);
+	RTE_SET_USED(data);
+
+	return -ENOTSUP;
+}
+
+int
+rte_intr_efd_enable(struct rte_intr_handle *intr_handle, uint32_t nb_efd)
+{
+	RTE_SET_USED(intr_handle);
+	RTE_SET_USED(nb_efd);
+
+	return 0;
+}
+
+void
+rte_intr_efd_disable(struct rte_intr_handle *intr_handle)
+{
+	RTE_SET_USED(intr_handle);
+}
+
+int
+rte_intr_dp_is_en(struct rte_intr_handle *intr_handle)
+{
+	RTE_SET_USED(intr_handle);
+	return 0;
+}
+
+int
+rte_intr_allow_others(struct rte_intr_handle *intr_handle)
+{
+	RTE_SET_USED(intr_handle);
+	return 1;
+}
diff --git a/lib/librte_eal/bsdapp/eal/include/exec-env/rte_interrupts.h b/lib/librte_eal/bsdapp/eal/include/exec-env/rte_interrupts.h
index d4c388f..91d1900 100644
--- a/lib/librte_eal/bsdapp/eal/include/exec-env/rte_interrupts.h
+++ b/lib/librte_eal/bsdapp/eal/include/exec-env/rte_interrupts.h
@@ -50,6 +50,74 @@ struct rte_intr_handle {
 	int fd;                          /**< file descriptor */
 	int uio_cfg_fd;                  /**< UIO config file descriptor */
 	enum rte_intr_handle_type type;  /**< handle type */
+#ifdef RTE_NEXT_ABI
+	int max_intr;                    /**< max interrupt requested */
+	uint32_t nb_efd;                 /**< number of available efds */
+	int *intr_vec;               /**< intr vector number array */
+#endif
 };
 
+/**
+ * @param intr_handle
+ *   Pointer to the interrupt handle.
+ * @param epfd
+ *   Epoll instance fd which the intr vector associated to.
+ * @param op
+ *   The operation be performed for the vector.
+ *   Operation type of {ADD, DEL}.
+ * @param vec
+ *   RX intr vector number added to the epoll instance wait list.
+ * @param data
+ *   User raw data.
+ * @return
+ *   - On success, zero.
+ *   - On failure, a negative value.
+ */
+int
+rte_intr_rx_ctl(struct rte_intr_handle *intr_handle,
+		int epfd, int op, unsigned int vec, void *data);
+
+/**
+ * It enables the fastpath event fds if it's necessary.
+ * It creates event fds when multi-vectors allowed,
+ * otherwise it multiplexes the single event fds.
+ *
+ * @param intr_handle
+ *   Pointer to the interrupt handle.
+ * @param nb_vec
+ *   Number of interrupt vector trying to enable.
+ * @return
+ *   - On success, zero.
+ *   - On failure, a negative value.
+ */
+int
+rte_intr_efd_enable(struct rte_intr_handle *intr_handle, uint32_t nb_efd);
+
+/**
+ * It disable the fastpath event fds.
+ * It deletes registered eventfds and closes the open fds.
+ *
+ * @param intr_handle
+ *   Pointer to the interrupt handle.
+ */
+void
+rte_intr_efd_disable(struct rte_intr_handle *intr_handle);
+
+/**
+ * The fastpath interrupt is enabled or not.
+ *
+ * @param intr_handle
+ *   Pointer to the interrupt handle.
+ */
+int rte_intr_dp_is_en(struct rte_intr_handle *intr_handle);
+
+/**
+ * The interrupt handle instance allows other cause or not.
+ * Other cause stands for none fastpath interrupt.
+ *
+ * @param intr_handle
+ *   Pointer to the interrupt handle.
+ */
+int rte_intr_allow_others(struct rte_intr_handle *intr_handle);
+
 #endif /* _RTE_LINUXAPP_INTERRUPTS_H_ */
diff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
index b2d4441..cfeb0fb 100644
--- a/lib/librte_eal/bsdapp/eal/rte_eal_version.map
+++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
@@ -116,6 +116,11 @@ DPDK_2.1 {
 	global:
 
 	rte_eal_pci_detach;
+	rte_intr_allow_others;
+	rte_intr_dp_is_en;
+	rte_intr_efd_enable;
+	rte_intr_efd_disable;
+	rte_intr_rx_ctl;
 	rte_memzone_free;
 
 } DPDK_2.0;
-- 
1.8.1.4

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v15 06/13] eal/linux: standalone intr event fd create support
  2015-07-20  3:02  4%     ` [dpdk-dev] [PATCH v15 00/13] Interrupt mode PMD Cunming Liang
                         ` (3 preceding siblings ...)
  2015-07-20  3:02  3%       ` [dpdk-dev] [PATCH v15 05/13] eal/linux: map eventfd to VFIO MSI-X intr vector Cunming Liang
@ 2015-07-20  3:02  3%       ` Cunming Liang
  2015-07-20  3:02  3%       ` [dpdk-dev] [PATCH v15 08/13] eal/bsd: dummy for new intr definition Cunming Liang
                         ` (5 subsequent siblings)
  10 siblings, 0 replies; 200+ results
From: Cunming Liang @ 2015-07-20  3:02 UTC (permalink / raw)
  To: dev, thomas.monjalon; +Cc: shemming

The patch exposes intr event fd create and release for PMD.
The device driver can assign the number of event associated with interrupt vector.
It also provides misc functions to check 1) allows other slowpath intr(e.g. lsc);
2) intr event on fastpath is enabled or not.

Signed-off-by: Cunming Liang <cunming.liang@intel.com>
---
v15 changes
 - remove ifdef RTE_NEXT_ABI from header file

v14 changes
 - per-patch basis ABI compatibility rework
 - minor changes on API decription comments

v13 changes
 - version map cleanup for v2.1

v11 changes
 - typo cleanup

 lib/librte_eal/linuxapp/eal/eal_interrupts.c       | 97 ++++++++++++++++++++++
 .../linuxapp/eal/include/exec-env/rte_interrupts.h | 45 ++++++++++
 lib/librte_eal/linuxapp/eal/rte_eal_version.map    |  4 +
 3 files changed, 146 insertions(+)

diff --git a/lib/librte_eal/linuxapp/eal/eal_interrupts.c b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
index 12105cc..1cea4bf 100644
--- a/lib/librte_eal/linuxapp/eal/eal_interrupts.c
+++ b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
@@ -44,6 +44,7 @@
 #include <sys/epoll.h>
 #include <sys/signalfd.h>
 #include <sys/ioctl.h>
+#include <sys/eventfd.h>
 
 #include <rte_common.h>
 #include <rte_interrupts.h>
@@ -68,6 +69,7 @@
 #include "eal_vfio.h"
 
 #define EAL_INTR_EPOLL_WAIT_FOREVER (-1)
+#define NB_OTHER_INTR               1
 
 static RTE_DEFINE_PER_LCORE(int, _epfd) = -1; /**< epoll fd per thread */
 
@@ -1123,6 +1125,73 @@ rte_intr_rx_ctl(struct rte_intr_handle *intr_handle, int epfd,
 
 	return rc;
 }
+
+int
+rte_intr_efd_enable(struct rte_intr_handle *intr_handle, uint32_t nb_efd)
+{
+	uint32_t i;
+	int fd;
+	uint32_t n = RTE_MIN(nb_efd, (uint32_t)RTE_MAX_RXTX_INTR_VEC_ID);
+
+	if (intr_handle->type == RTE_INTR_HANDLE_VFIO_MSIX) {
+		for (i = 0; i < n; i++) {
+			fd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
+			if (fd < 0) {
+				RTE_LOG(ERR, EAL,
+					"can't setup eventfd, error %i (%s)\n",
+					errno, strerror(errno));
+				return -1;
+			}
+			intr_handle->efds[i] = fd;
+		}
+		intr_handle->nb_efd   = n;
+		intr_handle->max_intr = NB_OTHER_INTR + n;
+	} else {
+		intr_handle->efds[0]  = intr_handle->fd;
+		intr_handle->nb_efd   = RTE_MIN(nb_efd, 1U);
+		intr_handle->max_intr = NB_OTHER_INTR;
+	}
+
+	return 0;
+}
+
+void
+rte_intr_efd_disable(struct rte_intr_handle *intr_handle)
+{
+	uint32_t i;
+	struct rte_epoll_event *rev;
+
+	for (i = 0; i < intr_handle->nb_efd; i++) {
+		rev = &intr_handle->elist[i];
+		if (rev->status == RTE_EPOLL_INVALID)
+			continue;
+		if (rte_epoll_ctl(rev->epfd, EPOLL_CTL_DEL, rev->fd, rev)) {
+			/* force free if the entry valid */
+			eal_epoll_data_safe_free(rev);
+			rev->status = RTE_EPOLL_INVALID;
+		}
+	}
+
+	if (intr_handle->max_intr > intr_handle->nb_efd) {
+		for (i = 0; i < intr_handle->nb_efd; i++)
+			close(intr_handle->efds[i]);
+	}
+	intr_handle->nb_efd = 0;
+	intr_handle->max_intr = 0;
+}
+
+int
+rte_intr_dp_is_en(struct rte_intr_handle *intr_handle)
+{
+	return !(!intr_handle->nb_efd);
+}
+
+int
+rte_intr_allow_others(struct rte_intr_handle *intr_handle)
+{
+	return !!(intr_handle->max_intr - intr_handle->nb_efd);
+}
+
 #else
 int
 rte_intr_rx_ctl(struct rte_intr_handle *intr_handle,
@@ -1135,4 +1204,32 @@ rte_intr_rx_ctl(struct rte_intr_handle *intr_handle,
 	RTE_SET_USED(data);
 	return -ENOTSUP;
 }
+
+int
+rte_intr_efd_enable(struct rte_intr_handle *intr_handle, uint32_t nb_efd)
+{
+	RTE_SET_USED(intr_handle);
+	RTE_SET_USED(nb_efd);
+	return 0;
+}
+
+void
+rte_intr_efd_disable(struct rte_intr_handle *intr_handle)
+{
+	RTE_SET_USED(intr_handle);
+}
+
+int
+rte_intr_dp_is_en(struct rte_intr_handle *intr_handle)
+{
+	RTE_SET_USED(intr_handle);
+	return 0;
+}
+
+int
+rte_intr_allow_others(struct rte_intr_handle *intr_handle)
+{
+	RTE_SET_USED(intr_handle);
+	return 1;
+}
 #endif
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 acf4be9..b05f4c8 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
@@ -168,4 +168,49 @@ int
 rte_intr_rx_ctl(struct rte_intr_handle *intr_handle,
 		int epfd, int op, unsigned int vec, void *data);
 
+/**
+ * It enables the packet I/O interrupt event if it's necessary.
+ * It creates event fd for each interrupt vector when MSIX is used,
+ * otherwise it multiplexes a single event fd.
+ *
+ * @param intr_handle
+ *   Pointer to the interrupt handle.
+ * @param nb_vec
+ *   Number of interrupt vector trying to enable.
+ * @return
+ *   - On success, zero.
+ *   - On failure, a negative value.
+ */
+int
+rte_intr_efd_enable(struct rte_intr_handle *intr_handle, uint32_t nb_efd);
+
+/**
+ * It disables the packet I/O interrupt event.
+ * It deletes registered eventfds and closes the open fds.
+ *
+ * @param intr_handle
+ *   Pointer to the interrupt handle.
+ */
+void
+rte_intr_efd_disable(struct rte_intr_handle *intr_handle);
+
+/**
+ * The packet I/O interrupt on datapath is enabled or not.
+ *
+ * @param intr_handle
+ *   Pointer to the interrupt handle.
+ */
+int
+rte_intr_dp_is_en(struct rte_intr_handle *intr_handle);
+
+/**
+ * The interrupt handle instance allows other causes or not.
+ * Other causes stand for any none packet I/O interrupts.
+ *
+ * @param intr_handle
+ *   Pointer to the interrupt handle.
+ */
+int
+rte_intr_allow_others(struct rte_intr_handle *intr_handle);
+
 #endif /* _RTE_LINUXAPP_INTERRUPTS_H_ */
diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
index 095b2c5..f44bc34 100644
--- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map
+++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
@@ -118,6 +118,10 @@ DPDK_2.1 {
 	rte_eal_pci_detach;
 	rte_epoll_ctl;
 	rte_epoll_wait;
+	rte_intr_allow_others;
+	rte_intr_dp_is_en;
+	rte_intr_efd_enable;
+	rte_intr_efd_disable;
 	rte_intr_rx_ctl;
 	rte_intr_tls_epfd;
 	rte_memzone_free;
-- 
1.8.1.4

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v15 05/13] eal/linux: map eventfd to VFIO MSI-X intr vector
  2015-07-20  3:02  4%     ` [dpdk-dev] [PATCH v15 00/13] Interrupt mode PMD Cunming Liang
                         ` (2 preceding siblings ...)
  2015-07-20  3:02  3%       ` [dpdk-dev] [PATCH v15 03/13] eal/linux: add API to set rx interrupt event monitor Cunming Liang
@ 2015-07-20  3:02  3%       ` Cunming Liang
  2015-07-20  3:02  3%       ` [dpdk-dev] [PATCH v15 06/13] eal/linux: standalone intr event fd create support Cunming Liang
                         ` (6 subsequent siblings)
  10 siblings, 0 replies; 200+ results
From: Cunming Liang @ 2015-07-20  3:02 UTC (permalink / raw)
  To: dev, thomas.monjalon; +Cc: shemming

The patch maps each of the eventfd to the interrupt vector of VFIO MSI-X.

Signed-off-by: Danny Zhou <danny.zhou@intel.com>
Signed-off-by: Cunming Liang <cunming.liang@intel.com>
---
v14 changes
 - per-patch basis ABI compatibility rework
 - reword commit comments

v8 changes
 - move eventfd creation out of the setup_interrupts to a standalone function

v7 changes
 - cleanup unnecessary code change
 - split event and intr operation to other patches

 lib/librte_eal/linuxapp/eal/eal_interrupts.c | 56 ++++++++++------------------
 1 file changed, 20 insertions(+), 36 deletions(-)

diff --git a/lib/librte_eal/linuxapp/eal/eal_interrupts.c b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
index 5acc3b7..12105cc 100644
--- a/lib/librte_eal/linuxapp/eal/eal_interrupts.c
+++ b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
@@ -128,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) * (RTE_MAX_RXTX_INTR_VEC_ID + 1))
 
 /* enable legacy (INTx) interrupts */
 static int
@@ -245,23 +248,6 @@ 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;
 }
 
@@ -294,7 +280,7 @@ vfio_disable_msi(struct rte_intr_handle *intr_handle) {
 static int
 vfio_enable_msix(struct rte_intr_handle *intr_handle) {
 	int len, ret;
-	char irq_set_buf[IRQ_SET_BUF_LEN];
+	char irq_set_buf[MSIX_IRQ_SET_BUF_LEN];
 	struct vfio_irq_set *irq_set;
 	int *fd_ptr;
 
@@ -302,12 +288,26 @@ vfio_enable_msix(struct rte_intr_handle *intr_handle) {
 
 	irq_set = (struct vfio_irq_set *) irq_set_buf;
 	irq_set->argsz = len;
+#ifdef RTE_NEXT_ABI
+	if (!intr_handle->max_intr)
+		intr_handle->max_intr = 1;
+	else if (intr_handle->max_intr > RTE_MAX_RXTX_INTR_VEC_ID)
+		intr_handle->max_intr = RTE_MAX_RXTX_INTR_VEC_ID + 1;
+
+	irq_set->count = intr_handle->max_intr;
+#else
 	irq_set->count = 1;
+#endif
 	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;
+#ifdef RTE_NEXT_ABI
+	memcpy(fd_ptr, intr_handle->efds, sizeof(intr_handle->efds));
+	fd_ptr[intr_handle->max_intr - 1] = intr_handle->fd;
+#else
+	fd_ptr[0] = intr_handle->fd;
+#endif
 
 	ret = ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, irq_set);
 
@@ -317,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;
 }
 
@@ -340,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);
-- 
1.8.1.4

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v15 03/13] eal/linux: add API to set rx interrupt event monitor
  2015-07-20  3:02  4%     ` [dpdk-dev] [PATCH v15 00/13] Interrupt mode PMD Cunming Liang
  2015-07-20  3:02  3%       ` [dpdk-dev] [PATCH v15 01/13] eal/linux: add interrupt vectors support in intr_handle Cunming Liang
  2015-07-20  3:02  2%       ` [dpdk-dev] [PATCH v15 02/13] eal/linux: add rte_epoll_wait/ctl support Cunming Liang
@ 2015-07-20  3:02  3%       ` Cunming Liang
  2015-07-20  3:02  3%       ` [dpdk-dev] [PATCH v15 05/13] eal/linux: map eventfd to VFIO MSI-X intr vector Cunming Liang
                         ` (7 subsequent siblings)
  10 siblings, 0 replies; 200+ results
From: Cunming Liang @ 2015-07-20  3:02 UTC (permalink / raw)
  To: dev, thomas.monjalon; +Cc: shemming

The patch adds 'rte_intr_rx_ctl' to add or delete interrupt vector events monitor on specified epoll instance.

Signed-off-by: Cunming Liang <cunming.liang@intel.com>
---
v15 changes
 - remove ifdef RTE_NEXT_ABI from header file

v14 changes
 - per-patch basis ABI compatibility rework
 - remove unnecessary 'local: *' from version map

v13 changes
 - version map cleanup for v2.1

v12 changes:
 - fix awkward line split in using RTE_LOG

v10 changes:
 - add RTE_INTR_HANDLE_UIO_INTX for uio_pci_generic

v8 changes
 - fix EWOULDBLOCK and EINTR processing
 - add event status check

v7 changes
 - rename rte_intr_rx_set to rte_intr_rx_ctl.
 - rte_intr_rx_ctl uses rte_epoll_ctl to register epoll event instance.
 - the intr rx event instance includes a intr process callback.

v6 changes
 - split rte_intr_wait_rx_pkt into two function, wait and set.
 - rewrite rte_intr_rx_wait/rte_intr_rx_set to remove queue visibility on eal.
 - rte_intr_rx_wait to support multiplexing.
 - allow epfd as input to support flexible event fd combination.

 lib/librte_eal/linuxapp/eal/eal_interrupts.c       | 117 +++++++++++++++++++++
 .../linuxapp/eal/include/exec-env/rte_interrupts.h |  20 ++++
 lib/librte_eal/linuxapp/eal/rte_eal_version.map    |   1 +
 3 files changed, 138 insertions(+)

diff --git a/lib/librte_eal/linuxapp/eal/eal_interrupts.c b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
index 55be263..ffccb0e 100644
--- a/lib/librte_eal/linuxapp/eal/eal_interrupts.c
+++ b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
@@ -899,6 +899,51 @@ rte_eal_intr_init(void)
 	return -ret;
 }
 
+#ifdef RTE_NEXT_ABI
+static void
+eal_intr_proc_rxtx_intr(int fd, const struct rte_intr_handle *intr_handle)
+{
+	union rte_intr_read_buffer buf;
+	int bytes_read = 1;
+
+	switch (intr_handle->type) {
+	case RTE_INTR_HANDLE_UIO:
+	case RTE_INTR_HANDLE_UIO_INTX:
+		bytes_read = sizeof(buf.uio_intr_count);
+		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;
+		RTE_LOG(INFO, EAL, "unexpected intr type\n");
+		break;
+	}
+
+	/**
+	 * read out to clear the ready-to-be-read flag
+	 * for epoll_wait.
+	 */
+	do {
+		bytes_read = read(fd, &buf, bytes_read);
+		if (bytes_read < 0) {
+			if (errno == EINTR || errno == EWOULDBLOCK ||
+			    errno == EAGAIN)
+				continue;
+			RTE_LOG(ERR, EAL,
+				"Error reading from fd %d: %s\n",
+				fd, strerror(errno));
+		} else if (bytes_read == 0)
+			RTE_LOG(ERR, EAL, "Read nothing from fd %d\n", fd);
+		return;
+	} while (1);
+}
+#endif
+
 static int
 eal_epoll_process_event(struct epoll_event *evs, unsigned int n,
 			struct rte_epoll_event *events)
@@ -1035,3 +1080,75 @@ rte_epoll_ctl(int epfd, int op, int fd,
 
 	return 0;
 }
+
+#ifdef RTE_NEXT_ABI
+int
+rte_intr_rx_ctl(struct rte_intr_handle *intr_handle, int epfd,
+		int op, unsigned int vec, void *data)
+{
+	struct rte_epoll_event *rev;
+	struct rte_epoll_data *epdata;
+	int epfd_op;
+	int rc = 0;
+
+	if (!intr_handle || intr_handle->nb_efd == 0 ||
+	    vec >= intr_handle->nb_efd) {
+		RTE_LOG(ERR, EAL, "Wrong intr vector number.\n");
+		return -EPERM;
+	}
+
+	switch (op) {
+	case RTE_INTR_EVENT_ADD:
+		epfd_op = EPOLL_CTL_ADD;
+		rev = &intr_handle->elist[vec];
+		if (rev->status != RTE_EPOLL_INVALID) {
+			RTE_LOG(INFO, EAL, "Event already been added.\n");
+			return -EEXIST;
+		}
+
+		/* attach to intr vector fd */
+		epdata = &rev->epdata;
+		epdata->event  = EPOLLIN | EPOLLPRI | EPOLLET;
+		epdata->data   = data;
+		epdata->cb_fun = (rte_intr_event_cb_t)eal_intr_proc_rxtx_intr;
+		epdata->cb_arg = (void *)intr_handle;
+		rc = rte_epoll_ctl(epfd, epfd_op, intr_handle->efds[vec], rev);
+		if (!rc)
+			RTE_LOG(DEBUG, EAL,
+				"efd %d associated with vec %d added on epfd %d"
+				"\n", rev->fd, vec, epfd);
+		else
+			rc = -EPERM;
+		break;
+	case RTE_INTR_EVENT_DEL:
+		epfd_op = EPOLL_CTL_DEL;
+		rev = &intr_handle->elist[vec];
+		if (rev->status == RTE_EPOLL_INVALID) {
+			RTE_LOG(INFO, EAL, "Event does not exist.\n");
+			return -EPERM;
+		}
+
+		rc = rte_epoll_ctl(rev->epfd, epfd_op, rev->fd, rev);
+		if (rc)
+			rc = -EPERM;
+		break;
+	default:
+		RTE_LOG(ERR, EAL, "event op type mismatch\n");
+		rc = -EPERM;
+	}
+
+	return rc;
+}
+#else
+int
+rte_intr_rx_ctl(struct rte_intr_handle *intr_handle,
+		int epfd, int op, unsigned int vec, void *data)
+{
+	RTE_SET_USED(intr_handle);
+	RTE_SET_USED(epfd);
+	RTE_SET_USED(op);
+	RTE_SET_USED(vec);
+	RTE_SET_USED(data);
+	return -ENOTSUP;
+}
+#endif
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 886608c..acf4be9 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
@@ -148,4 +148,24 @@ rte_epoll_ctl(int epfd, int op, int fd,
 int
 rte_intr_tls_epfd(void);
 
+/**
+ * @param intr_handle
+ *   Pointer to the interrupt handle.
+ * @param epfd
+ *   Epoll instance fd which the intr vector associated to.
+ * @param op
+ *   The operation be performed for the vector.
+ *   Operation type of {ADD, DEL}.
+ * @param vec
+ *   RX intr vector number added to the epoll instance wait list.
+ * @param data
+ *   User raw data.
+ * @return
+ *   - On success, zero.
+ *   - On failure, a negative value.
+ */
+int
+rte_intr_rx_ctl(struct rte_intr_handle *intr_handle,
+		int epfd, int op, unsigned int vec, void *data);
+
 #endif /* _RTE_LINUXAPP_INTERRUPTS_H_ */
diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
index 39cc2d2..095b2c5 100644
--- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map
+++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
@@ -118,6 +118,7 @@ DPDK_2.1 {
 	rte_eal_pci_detach;
 	rte_epoll_ctl;
 	rte_epoll_wait;
+	rte_intr_rx_ctl;
 	rte_intr_tls_epfd;
 	rte_memzone_free;
 
-- 
1.8.1.4

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v15 02/13] eal/linux: add rte_epoll_wait/ctl support
  2015-07-20  3:02  4%     ` [dpdk-dev] [PATCH v15 00/13] Interrupt mode PMD Cunming Liang
  2015-07-20  3:02  3%       ` [dpdk-dev] [PATCH v15 01/13] eal/linux: add interrupt vectors support in intr_handle Cunming Liang
@ 2015-07-20  3:02  2%       ` Cunming Liang
  2015-07-20  3:02  3%       ` [dpdk-dev] [PATCH v15 03/13] eal/linux: add API to set rx interrupt event monitor Cunming Liang
                         ` (8 subsequent siblings)
  10 siblings, 0 replies; 200+ results
From: Cunming Liang @ 2015-07-20  3:02 UTC (permalink / raw)
  To: dev, thomas.monjalon; +Cc: shemming

The patch adds 'rte_epoll_wait' and 'rte_epoll_ctl' for async event wakeup.
It defines 'struct rte_epoll_event' as the event param.
When the event fds add to a specified epoll instance, 'eptrs' will hold the rte_epoll_event object pointer.
The 'op' uses the same enum as epoll_wait/ctl does.
The epoll event support to carry a raw user data and to register a callback which is executed during wakeup.

Signed-off-by: Cunming Liang <cunming.liang@intel.com>
---
v14 changes
 - per-patch basis ABI compatibility rework
 - remove unnecessary 'local: *' from version map

v13 changes
 - version map cleanup for v2.1

v11 changes
 - cleanup spelling error

v9 changes
 - rework on coding style

v8 changes
 - support delete event in safety during the wakeup execution
 - add EINTR process during epoll_wait

v7 changes
 - split v6[4/8] into two patches, one for epoll event(this one)
   another for rx intr(next patch)
 - introduce rte_epoll_event definition
 - rte_epoll_wait/ctl for more generic RTE epoll API

v6 changes
 - split rte_intr_wait_rx_pkt into two function, wait and set.
 - rewrite rte_intr_rx_wait/rte_intr_rx_set to remove queue visibility on eal.
 - rte_intr_rx_wait to support multiplexing.
 - allow epfd as input to support flexible event fd combination.

 lib/librte_eal/linuxapp/eal/eal_interrupts.c       | 139 +++++++++++++++++++++
 .../linuxapp/eal/include/exec-env/rte_interrupts.h |  80 ++++++++++++
 lib/librte_eal/linuxapp/eal/rte_eal_version.map    |   3 +
 3 files changed, 222 insertions(+)

diff --git a/lib/librte_eal/linuxapp/eal/eal_interrupts.c b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
index 61e7c85..55be263 100644
--- a/lib/librte_eal/linuxapp/eal/eal_interrupts.c
+++ b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
@@ -69,6 +69,8 @@
 
 #define EAL_INTR_EPOLL_WAIT_FOREVER (-1)
 
+static RTE_DEFINE_PER_LCORE(int, _epfd) = -1; /**< epoll fd per thread */
+
 /**
  * union for pipe fds.
  */
@@ -896,3 +898,140 @@ rte_eal_intr_init(void)
 
 	return -ret;
 }
+
+static int
+eal_epoll_process_event(struct epoll_event *evs, unsigned int n,
+			struct rte_epoll_event *events)
+{
+	unsigned int i, count = 0;
+	struct rte_epoll_event *rev;
+
+	for (i = 0; i < n; i++) {
+		rev = evs[i].data.ptr;
+		if (!rev || !rte_atomic32_cmpset(&rev->status, RTE_EPOLL_VALID,
+						 RTE_EPOLL_EXEC))
+			continue;
+
+		events[count].status        = RTE_EPOLL_VALID;
+		events[count].fd            = rev->fd;
+		events[count].epfd          = rev->epfd;
+		events[count].epdata.event  = rev->epdata.event;
+		events[count].epdata.data   = rev->epdata.data;
+		if (rev->epdata.cb_fun)
+			rev->epdata.cb_fun(rev->fd,
+					   rev->epdata.cb_arg);
+
+		rte_compiler_barrier();
+		rev->status = RTE_EPOLL_VALID;
+		count++;
+	}
+	return count;
+}
+
+static inline int
+eal_init_tls_epfd(void)
+{
+	int pfd = epoll_create(255);
+
+	if (pfd < 0) {
+		RTE_LOG(ERR, EAL,
+			"Cannot create epoll instance\n");
+		return -1;
+	}
+	return pfd;
+}
+
+int
+rte_intr_tls_epfd(void)
+{
+	if (RTE_PER_LCORE(_epfd) == -1)
+		RTE_PER_LCORE(_epfd) = eal_init_tls_epfd();
+
+	return RTE_PER_LCORE(_epfd);
+}
+
+int
+rte_epoll_wait(int epfd, struct rte_epoll_event *events,
+	       int maxevents, int timeout)
+{
+	struct epoll_event evs[maxevents];
+	int rc;
+
+	if (!events) {
+		RTE_LOG(ERR, EAL, "rte_epoll_event can't be NULL\n");
+		return -1;
+	}
+
+	/* using per thread epoll fd */
+	if (epfd == RTE_EPOLL_PER_THREAD)
+		epfd = rte_intr_tls_epfd();
+
+	while (1) {
+		rc = epoll_wait(epfd, evs, maxevents, timeout);
+		if (likely(rc > 0)) {
+			/* epoll_wait has at least one fd ready to read */
+			rc = eal_epoll_process_event(evs, rc, events);
+			break;
+		} else if (rc < 0) {
+			if (errno == EINTR)
+				continue;
+			/* epoll_wait fail */
+			RTE_LOG(ERR, EAL, "epoll_wait returns with fail %s\n",
+				strerror(errno));
+			rc = -1;
+			break;
+		}
+	}
+
+	return rc;
+}
+
+static inline void
+eal_epoll_data_safe_free(struct rte_epoll_event *ev)
+{
+	while (!rte_atomic32_cmpset(&ev->status, RTE_EPOLL_VALID,
+				    RTE_EPOLL_INVALID))
+		while (ev->status != RTE_EPOLL_VALID)
+			rte_pause();
+	memset(&ev->epdata, 0, sizeof(ev->epdata));
+	ev->fd = -1;
+	ev->epfd = -1;
+}
+
+int
+rte_epoll_ctl(int epfd, int op, int fd,
+	      struct rte_epoll_event *event)
+{
+	struct epoll_event ev;
+
+	if (!event) {
+		RTE_LOG(ERR, EAL, "rte_epoll_event can't be NULL\n");
+		return -1;
+	}
+
+	/* using per thread epoll fd */
+	if (epfd == RTE_EPOLL_PER_THREAD)
+		epfd = rte_intr_tls_epfd();
+
+	if (op == EPOLL_CTL_ADD) {
+		event->status = RTE_EPOLL_VALID;
+		event->fd = fd;  /* ignore fd in event */
+		event->epfd = epfd;
+		ev.data.ptr = (void *)event;
+	}
+
+	ev.events = event->epdata.event;
+	if (epoll_ctl(epfd, op, fd, &ev) < 0) {
+		RTE_LOG(ERR, EAL, "Error op %d fd %d epoll_ctl, %s\n",
+			op, fd, strerror(errno));
+		if (op == EPOLL_CTL_ADD)
+			/* rollback status when CTL_ADD fail */
+			event->status = RTE_EPOLL_INVALID;
+		return -1;
+	}
+
+	if (op == EPOLL_CTL_DEL && event->status != RTE_EPOLL_INVALID)
+		eal_epoll_data_safe_free(event);
+
+	return 0;
+}
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 ac33eda..886608c 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
@@ -51,6 +51,32 @@ enum rte_intr_handle_type {
 	RTE_INTR_HANDLE_MAX
 };
 
+#define RTE_INTR_EVENT_ADD            1UL
+#define RTE_INTR_EVENT_DEL            2UL
+
+typedef void (*rte_intr_event_cb_t)(int fd, void *arg);
+
+struct rte_epoll_data {
+	uint32_t event;               /**< event type */
+	void *data;                   /**< User data */
+	rte_intr_event_cb_t cb_fun;   /**< IN: callback fun */
+	void *cb_arg;	              /**< IN: callback arg */
+};
+
+enum {
+	RTE_EPOLL_INVALID = 0,
+	RTE_EPOLL_VALID,
+	RTE_EPOLL_EXEC,
+};
+
+/** interrupt epoll event obj, taken by epoll_event.ptr */
+struct rte_epoll_event {
+	volatile uint32_t status;  /**< OUT: event status */
+	int fd;                    /**< OUT: event fd */
+	int epfd;       /**< OUT: epoll instance the ev associated with */
+	struct rte_epoll_data epdata;
+};
+
 /** Handle for interrupts. */
 struct rte_intr_handle {
 	union {
@@ -64,8 +90,62 @@ struct rte_intr_handle {
 	uint32_t max_intr;             /**< max interrupt requested */
 	uint32_t nb_efd;               /**< number of available efd(event fd) */
 	int efds[RTE_MAX_RXTX_INTR_VEC_ID];  /**< intr vectors/efds mapping */
+	struct rte_epoll_event elist[RTE_MAX_RXTX_INTR_VEC_ID];
+				       /**< intr vector epoll event */
 	int *intr_vec;                 /**< intr vector number array */
 #endif
 };
 
+#define RTE_EPOLL_PER_THREAD        -1  /**< to hint using per thread epfd */
+
+/**
+ * It waits for events on the epoll instance.
+ *
+ * @param epfd
+ *   Epoll instance fd on which the caller wait for events.
+ * @param events
+ *   Memory area contains the events that will be available for the caller.
+ * @param maxevents
+ *   Up to maxevents are returned, must greater than zero.
+ * @param timeout
+ *   Specifying a timeout of -1 causes a block indefinitely.
+ *   Specifying a timeout equal to zero cause to return immediately.
+ * @return
+ *   - On success, returns the number of available event.
+ *   - On failure, a negative value.
+ */
+int
+rte_epoll_wait(int epfd, struct rte_epoll_event *events,
+	       int maxevents, int timeout);
+
+/**
+ * It performs control operations on epoll instance referred by the epfd.
+ * It requests that the operation op be performed for the target fd.
+ *
+ * @param epfd
+ *   Epoll instance fd on which the caller perform control operations.
+ * @param op
+ *   The operation be performed for the target fd.
+ * @param fd
+ *   The target fd on which the control ops perform.
+ * @param event
+ *   Describes the object linked to the fd.
+ *   Note: The caller must take care the object deletion after CTL_DEL.
+ * @return
+ *   - On success, zero.
+ *   - On failure, a negative value.
+ */
+int
+rte_epoll_ctl(int epfd, int op, int fd,
+	      struct rte_epoll_event *event);
+
+/**
+ * The function returns the per thread epoll instance.
+ *
+ * @return
+ *   epfd the epoll instance referred to.
+ */
+int
+rte_intr_tls_epfd(void);
+
 #endif /* _RTE_LINUXAPP_INTERRUPTS_H_ */
diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
index b2d4441..39cc2d2 100644
--- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map
+++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
@@ -116,6 +116,9 @@ DPDK_2.1 {
 	global:
 
 	rte_eal_pci_detach;
+	rte_epoll_ctl;
+	rte_epoll_wait;
+	rte_intr_tls_epfd;
 	rte_memzone_free;
 
 } DPDK_2.0;
-- 
1.8.1.4

^ permalink raw reply	[relevance 2%]

* [dpdk-dev] [PATCH v15 01/13] eal/linux: add interrupt vectors support in intr_handle
  2015-07-20  3:02  4%     ` [dpdk-dev] [PATCH v15 00/13] Interrupt mode PMD Cunming Liang
@ 2015-07-20  3:02  3%       ` Cunming Liang
  2015-07-20  3:02  2%       ` [dpdk-dev] [PATCH v15 02/13] eal/linux: add rte_epoll_wait/ctl support Cunming Liang
                         ` (9 subsequent siblings)
  10 siblings, 0 replies; 200+ results
From: Cunming Liang @ 2015-07-20  3:02 UTC (permalink / raw)
  To: dev, thomas.monjalon; +Cc: shemming

The patch adds interrupt vectors support in rte_intr_handle.
'vec_en' is set when interrupt vectors are detected and associated event fds are set.
Those event fds are stored in efds[].
'intr_vec' is reserved for device driver to initialize the vector mapping table.

Signed-off-by: Danny Zhou <danny.zhou@intel.com>
Signed-off-by: Cunming Liang <cunming.liang@intel.com>
---
v15 changes
 - remove unnecessary RTE_NEXT_ABI comment

v14 changes
 - per-patch basis ABI compatibility rework

v7 changes:
 - add eptrs[], it's used to store the register rte_epoll_event instances.
 - add vec_en, to log the vector capability status.

v6 changes:
 - add mapping table between irq vector number and queue id.

v5 changes:
 - Create this new patch file for changed struct rte_intr_handle that
   other patches depend on, to avoid breaking git bisect.

 lib/librte_eal/linuxapp/eal/include/exec-env/rte_interrupts.h | 8 ++++++++
 1 file changed, 8 insertions(+)

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 bdeb3fc..ac33eda 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 RTE_MAX_RXTX_INTR_VEC_ID     32
+
 enum rte_intr_handle_type {
 	RTE_INTR_HANDLE_UNKNOWN = 0,
 	RTE_INTR_HANDLE_UIO,          /**< uio device handle */
@@ -58,6 +60,12 @@ struct rte_intr_handle {
 	};
 	int fd;	 /**< interrupt event file descriptor */
 	enum rte_intr_handle_type type;  /**< handle type */
+#ifdef RTE_NEXT_ABI
+	uint32_t max_intr;             /**< max interrupt requested */
+	uint32_t nb_efd;               /**< number of available efd(event fd) */
+	int efds[RTE_MAX_RXTX_INTR_VEC_ID];  /**< intr vectors/efds mapping */
+	int *intr_vec;                 /**< intr vector number array */
+#endif
 };
 
 #endif /* _RTE_LINUXAPP_INTERRUPTS_H_ */
-- 
1.8.1.4

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v15 00/13] Interrupt mode PMD
  2015-07-17  6:16  4%   ` [dpdk-dev] [PATCH v14 00/13] " Cunming Liang
                       ` (9 preceding siblings ...)
  2015-07-17  6:16  2%     ` [dpdk-dev] [PATCH v14 13/13] l3fwd-power: enable one-shot rx interrupt and polling/interrupt mode switch Cunming Liang
@ 2015-07-20  3:02  4%     ` Cunming Liang
  2015-07-20  3:02  3%       ` [dpdk-dev] [PATCH v15 01/13] eal/linux: add interrupt vectors support in intr_handle Cunming Liang
                         ` (10 more replies)
  10 siblings, 11 replies; 200+ results
From: Cunming Liang @ 2015-07-20  3:02 UTC (permalink / raw)
  To: dev, thomas.monjalon; +Cc: shemming

v15 changes
 - remove unnecessary RTE_NEXT_ABI comment
 - remove ifdef RTE_NEXT_ABI from header file

v14 changes
 - per-patch basis ABI compatibility rework
 - remove unnecessary 'local: *' from version map
 - minor comments rework

v13 changes
 - version map cleanup for v2.1
 - replace RTE_EAL_RX_INTR by RTE_NEXT_ABI for ABI compatibility

Patch series v12
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
Acked-by: Danny Zhou <danny.zhou@intel.com>

v12 changes
 - bsd cleanup for unused variable warning
 - fix awkward line split in debug message

v11 changes
 - typo cleanup and check kernel style

v10 changes
 - code rework to return actual error code
 - bug fix for lsc when using uio_pci_generic

v9 changes
 - code rework to fix open comment
 - bug fix for igb lsc when both lsc and rxq are enabled in vfio-msix
 - new patch to turn off the feature by default so as to avoid v2.1 abi broken

v8 changes
 - remove condition check for only vfio-msix
 - add multiplex intr support when only one intr vector allowed
 - lsc and rxq interrupt runtime enable decision
 - add safe event delete while the event wakeup execution happens

v7 changes
 - decouple epoll event and intr operation
 - add condition check in the case intr vector is disabled
 - renaming some APIs

v6 changes
 - split rte_intr_wait_rx_pkt into two APIs 'wait' and 'set'.
 - rewrite rte_intr_rx_wait/rte_intr_rx_set.
 - using vector number instead of queue_id as interrupt API params.
 - patch reorder and split.

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. [FIXED]
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.

Cunming Liang (13):
  eal/linux: add interrupt vectors support in intr_handle
  eal/linux: add rte_epoll_wait/ctl support
  eal/linux: add API to set rx interrupt event monitor
  eal/linux: fix comments typo on vfio msi
  eal/linux: map eventfd to VFIO MSI-X intr vector
  eal/linux: standalone intr event fd create support
  eal/linux: fix lsc read error in uio_pci_generic
  eal/bsd: dummy for new intr definition
  eal/bsd: fix inappropriate linuxapp referred in bsd
  ethdev: add rx intr enable, disable and ctl functions
  ixgbe: enable rx queue interrupts for both PF and VF
  igb: enable rx queue interrupts for PF
  l3fwd-power: enable one-shot rx interrupt and polling/interrupt mode
    switch

 drivers/net/e1000/igb_ethdev.c                     | 311 ++++++++++--
 drivers/net/ixgbe/ixgbe_ethdev.c                   | 527 ++++++++++++++++++++-
 drivers/net/ixgbe/ixgbe_ethdev.h                   |   4 +
 examples/l3fwd-power/main.c                        | 205 ++++++--
 lib/librte_eal/bsdapp/eal/eal_interrupts.c         |  42 ++
 .../bsdapp/eal/include/exec-env/rte_interrupts.h   |  74 ++-
 lib/librte_eal/bsdapp/eal/rte_eal_version.map      |   5 +
 lib/librte_eal/linuxapp/eal/eal_interrupts.c       | 414 ++++++++++++++--
 .../linuxapp/eal/include/exec-env/rte_interrupts.h | 153 ++++++
 lib/librte_eal/linuxapp/eal/rte_eal_version.map    |   8 +
 lib/librte_ether/rte_ethdev.c                      | 147 ++++++
 lib/librte_ether/rte_ethdev.h                      | 104 ++++
 lib/librte_ether/rte_ether_version.map             |   4 +
 13 files changed, 1870 insertions(+), 128 deletions(-)

-- 
1.8.1.4

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v14 01/13] eal/linux: add interrupt vectors support in intr_handle
  2015-07-19 23:31  0%       ` Thomas Monjalon
@ 2015-07-20  2:02  0%         ` Liang, Cunming
  0 siblings, 0 replies; 200+ results
From: Liang, Cunming @ 2015-07-20  2:02 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev, shemming



On 7/20/2015 7:31 AM, Thomas Monjalon wrote:
> 2015-07-17 14:16, Cunming Liang:
>> +#ifdef RTE_NEXT_ABI
>> +	/**
>> +	 * RTE_NEXT_ABI will be removed from v2.2.
>> +	 * It's only used to avoid ABI(unannounced) broken in v2.1.
>> +	 * Make sure being aware of the impact before turning on the feature.
>> +	 */
> We are not going to put this comment each time NEXT_ABI is used with ifdef.
Ok, will remove the comment.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v14 01/13] eal/linux: add interrupt vectors support in intr_handle
  2015-07-17  6:16  8%     ` [dpdk-dev] [PATCH v14 01/13] eal/linux: add interrupt vectors support in intr_handle Cunming Liang
@ 2015-07-19 23:31  0%       ` Thomas Monjalon
  2015-07-20  2:02  0%         ` Liang, Cunming
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2015-07-19 23:31 UTC (permalink / raw)
  To: Cunming Liang; +Cc: dev, shemming

2015-07-17 14:16, Cunming Liang:
> +#ifdef RTE_NEXT_ABI
> +	/**
> +	 * RTE_NEXT_ABI will be removed from v2.2.
> +	 * It's only used to avoid ABI(unannounced) broken in v2.1.
> +	 * Make sure being aware of the impact before turning on the feature.
> +	 */

We are not going to put this comment each time NEXT_ABI is used with ifdef.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH 0/3] fix the issue sctp flow cannot be matched in FVL FDIR
  @ 2015-07-19 22:54  3%   ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-07-19 22:54 UTC (permalink / raw)
  To: Wu, Jingjing; +Cc: dev

> > This patch set fixes the issue SCTP flow cannot be matched by FVL's flow
> > director. The issue's root cause is that due to the NIC's firmware update,
> > the input set of sctp flow are changed to source IP, destination IP,
> > source port, destination port and Verification-Tag, which are source IP,
> > destination IP and Verification-Tag previously.
> > And because this fix will affect the struct rte_eth_fdir_flow, use
> > RTE_NEXT_ABI to avoid ABI breaking.
> > 
> > Jingjing Wu (3):
> >   ethdev: change the input set of sctp flow
> >   i40e: make sport and dport of sctp flow involved in match
> >   testpmd: add sport and dport configuration for sctp flow
> 
> Tested-by: Marvin Liu <yong.liu@intel.com>

Applied, thanks

An ABI deprecation announce must be sent.

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH 0/4] ethdev/eal API fixes
  2015-07-19 10:52  4% [dpdk-dev] [PATCH 0/4] ethdev/eal API fixes Thomas Monjalon
  2015-07-19 10:52 36% ` [dpdk-dev] [PATCH 1/4] doc: rename ABI chapter to deprecation Thomas Monjalon
@ 2015-07-19 21:32  0% ` Thomas Monjalon
  2015-07-20 10:45  0% ` Neil Horman
  2 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-07-19 21:32 UTC (permalink / raw)
  To: dev

2015-07-19 12:52, Thomas Monjalon:
> The main change of these patches is to improve naming consistency
> across ethdev and EAL.
> It should be applied shortly to be part of rc1. If some comments arise,
> it can be fixed/improved in rc2.
> 
> Thomas Monjalon (4):
>   doc: rename ABI chapter to deprecation
>   pci: fix detach and uninit naming
>   ethdev: refactor port release
>   ethdev: fix doxygen internal comments

Applied, do not hesitate to comment if something must be fixed.

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH 1/4] doc: rename ABI chapter to deprecation
  2015-07-19 10:52  4% [dpdk-dev] [PATCH 0/4] ethdev/eal API fixes Thomas Monjalon
@ 2015-07-19 10:52 36% ` Thomas Monjalon
  2015-07-21 13:20  7%   ` Dumitrescu, Cristian
  2015-07-19 21:32  0% ` [dpdk-dev] [PATCH 0/4] ethdev/eal API fixes Thomas Monjalon
  2015-07-20 10:45  0% ` Neil Horman
  2 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2015-07-19 10:52 UTC (permalink / raw)
  To: dev

This chapter is for ABI and API. That's why a renaming is required.

Remove also the examples which are now in the referenced guidelines.

Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
---
 MAINTAINERS                                       |  2 +-
 doc/guides/rel_notes/{abi.rst => deprecation.rst} | 16 +++++-----------
 doc/guides/rel_notes/index.rst                    |  2 +-
 3 files changed, 7 insertions(+), 13 deletions(-)
 rename doc/guides/rel_notes/{abi.rst => deprecation.rst} (51%)

diff --git a/MAINTAINERS b/MAINTAINERS
index 2a32659..6531900 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -60,7 +60,7 @@ F: doc/guides/prog_guide/ext_app_lib_make_help.rst
 ABI versioning
 M: Neil Horman <nhorman@tuxdriver.com>
 F: lib/librte_compat/
-F: doc/guides/rel_notes/abi.rst
+F: doc/guides/rel_notes/deprecation.rst
 F: scripts/validate-abi.sh
 
 
diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/deprecation.rst
similarity index 51%
rename from doc/guides/rel_notes/abi.rst
rename to doc/guides/rel_notes/deprecation.rst
index 7a08830..eef01f1 100644
--- a/doc/guides/rel_notes/abi.rst
+++ b/doc/guides/rel_notes/deprecation.rst
@@ -1,17 +1,11 @@
-ABI policy
-==========
+Deprecation
+===========
 
 See the :doc:`guidelines document for details of the ABI policy </guidelines/versioning>`.
-ABI deprecation notices are to be posted here.
+API and ABI deprecation notices are to be posted here.
 
-
-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 and rebuilding to the new structure at that time, which will be renamed to the original struct foo.
-* Significant ABI changes are planned for the librte_dostuff library.  The upcoming 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.
+Help to update from a previous release is provided in
+:doc:`another section </rel_notes/updating_apps>`.
 
 
 Deprecation Notices
diff --git a/doc/guides/rel_notes/index.rst b/doc/guides/rel_notes/index.rst
index d790783..9d66cd8 100644
--- a/doc/guides/rel_notes/index.rst
+++ b/doc/guides/rel_notes/index.rst
@@ -48,5 +48,5 @@ Contents
     updating_apps
     known_issues
     resolved_issues
-    abi
+    deprecation
     faq
-- 
2.4.2

^ permalink raw reply	[relevance 36%]

* [dpdk-dev] [PATCH 0/4] ethdev/eal API fixes
@ 2015-07-19 10:52  4% Thomas Monjalon
  2015-07-19 10:52 36% ` [dpdk-dev] [PATCH 1/4] doc: rename ABI chapter to deprecation Thomas Monjalon
                   ` (2 more replies)
  0 siblings, 3 replies; 200+ results
From: Thomas Monjalon @ 2015-07-19 10:52 UTC (permalink / raw)
  To: dev

The main change of these patches is to improve naming consistency
across ethdev and EAL.
It should be applied shortly to be part of rc1. If some comments arise,
it can be fixed/improved in rc2.

Thomas Monjalon (4):
  doc: rename ABI chapter to deprecation
  pci: fix detach and uninit naming
  ethdev: refactor port release
  ethdev: fix doxygen internal comments

 MAINTAINERS                                       |  2 +-
 doc/guides/rel_notes/{abi.rst => deprecation.rst} | 19 ++++++++-----------
 doc/guides/rel_notes/index.rst                    |  2 +-
 lib/librte_eal/bsdapp/eal/rte_eal_version.map     |  2 ++
 lib/librte_eal/common/eal_common_pci.c            | 20 ++++++++++++--------
 lib/librte_eal/common/include/rte_pci.h           |  6 ++++--
 lib/librte_eal/linuxapp/eal/rte_eal_version.map   |  2 ++
 lib/librte_ether/rte_ethdev.c                     | 11 +++++------
 lib/librte_ether/rte_ethdev.h                     |  9 ++++-----
 9 files changed, 39 insertions(+), 34 deletions(-)
 rename doc/guides/rel_notes/{abi.rst => deprecation.rst} (51%)

-- 
2.4.2

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code
  2015-07-17 11:45  7%       ` Mcnamara, John
@ 2015-07-17 12:25  4%         ` Neil Horman
  0 siblings, 0 replies; 200+ results
From: Neil Horman @ 2015-07-17 12:25 UTC (permalink / raw)
  To: Mcnamara, John; +Cc: dev

On Fri, Jul 17, 2015 at 11:45:10AM +0000, Mcnamara, John wrote:
> > -----Original Message-----
> > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > Sent: Monday, July 13, 2015 3:00 PM
> > To: Mcnamara, John
> > Cc: dev@dpdk.org; vladz@cloudius-systems.com
> > Subject: Re: [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code
> > 
> > > > > -		dev_started : 1;   /**< Device state: STARTED(1) / STOPPED(0). */
> > > > > +		dev_started : 1,   /**< Device state: STARTED(1) / STOPPED(0). */
> > > > > +		lro         : 1;   /**< RX LRO is ON(1) / OFF(0) */
> > > > >
> > > > >
> > >
> > Thank you, I'll ack as soon as Chao confirms its not a problem on ppc Neil
> 
> Hi,
> 
> Just pinging Chao Zhu on this again so that it isn't forgotten.
> 
> Neil, just to be clear, are you looking for a validate-abi.sh check on PPC?
> 
Yes, correct.
> Just for context, the lro flag doesn't seem to be used anywhere that would be affected by endianness:
> 
>     $ ag -w "\->lro"             
>     drivers/net/ixgbe/ixgbe_rxtx.c
>     3767:   if (dev->data->lro) {
>     3967:   dev->data->lro = 1;
> 
>     drivers/net/ixgbe/ixgbe_ethdev.c
>     1689:   dev->data->lro = 0;
> 
But this data is visible to the outside application, correct?  If so then we
can't rely on internal-only usage as a guide.  If it is only internally visible,
then yes, you are correct, endianess is not an issue then
neil

> John.
> -- 
> 
> 

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for librte_pipeline
  2015-07-16 17:07 14% [dpdk-dev] [PATCH] doc: announce ABI change for librte_pipeline Cristian Dumitrescu
  2015-07-17  7:54  4% ` Gajdzica, MaciejX T
  2015-07-17  8:10  4% ` Mrzyglod, DanielX T
@ 2015-07-17 12:03  4% ` Singh, Jasvinder
  2015-08-15 21:49  4%   ` Thomas Monjalon
  2 siblings, 1 reply; 200+ results
From: Singh, Jasvinder @ 2015-07-17 12:03 UTC (permalink / raw)
  To: Dumitrescu, Cristian, dev



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Cristian Dumitrescu
> Sent: Thursday, July 16, 2015 6:08 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH] doc: announce ABI change for librte_pipeline
> 
> 
> Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
> ---

Acked-by: Jasvinder Singh <jasvinder.singh@intel.com>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for librte_table
  2015-07-16 16:59 14% [dpdk-dev] [PATCH] doc: announce ABI change for librte_table Cristian Dumitrescu
  2015-07-17  7:54  4% ` Gajdzica, MaciejX T
  2015-07-17  8:09  4% ` Mrzyglod, DanielX T
@ 2015-07-17 12:02  4% ` Singh, Jasvinder
  2 siblings, 0 replies; 200+ results
From: Singh, Jasvinder @ 2015-07-17 12:02 UTC (permalink / raw)
  To: Dumitrescu, Cristian, dev



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Cristian Dumitrescu
> Sent: Thursday, July 16, 2015 6:00 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH] doc: announce ABI change for librte_table
> 
> 
> Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
> ---

Acked-by: Jasvinder Singh <jasvinder.singh@intel.com>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code
  2015-07-13 13:59  4%     ` Neil Horman
@ 2015-07-17 11:45  7%       ` Mcnamara, John
  2015-07-17 12:25  4%         ` Neil Horman
  2015-07-31  9:03  7%       ` Mcnamara, John
  1 sibling, 1 reply; 200+ results
From: Mcnamara, John @ 2015-07-17 11:45 UTC (permalink / raw)
  To: Neil Horman, Chao Zhu; +Cc: dev

> -----Original Message-----
> From: Neil Horman [mailto:nhorman@tuxdriver.com]
> Sent: Monday, July 13, 2015 3:00 PM
> To: Mcnamara, John
> Cc: dev@dpdk.org; vladz@cloudius-systems.com
> Subject: Re: [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code
> 
> > > > -		dev_started : 1;   /**< Device state: STARTED(1) / STOPPED(0). */
> > > > +		dev_started : 1,   /**< Device state: STARTED(1) / STOPPED(0). */
> > > > +		lro         : 1;   /**< RX LRO is ON(1) / OFF(0) */
> > > >
> > > >
> >
> Thank you, I'll ack as soon as Chao confirms its not a problem on ppc Neil

Hi,

Just pinging Chao Zhu on this again so that it isn't forgotten.

Neil, just to be clear, are you looking for a validate-abi.sh check on PPC?

Just for context, the lro flag doesn't seem to be used anywhere that would be affected by endianness:

    $ ag -w "\->lro"             
    drivers/net/ixgbe/ixgbe_rxtx.c
    3767:   if (dev->data->lro) {
    3967:   dev->data->lro = 1;

    drivers/net/ixgbe/ixgbe_ethdev.c
    1689:   dev->data->lro = 0;

John.
-- 

^ permalink raw reply	[relevance 7%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for librte_pipeline
  2015-07-16 17:07 14% [dpdk-dev] [PATCH] doc: announce ABI change for librte_pipeline Cristian Dumitrescu
  2015-07-17  7:54  4% ` Gajdzica, MaciejX T
@ 2015-07-17  8:10  4% ` Mrzyglod, DanielX T
  2015-07-17 12:03  4% ` Singh, Jasvinder
  2 siblings, 0 replies; 200+ results
From: Mrzyglod, DanielX T @ 2015-07-17  8:10 UTC (permalink / raw)
  To: Dumitrescu, Cristian, dev

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Cristian Dumitrescu
> Sent: Thursday, July 16, 2015 7:08 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH] doc: announce ABI change for librte_pipeline
> 
> 
> Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>

Acked-by: Daniel Mrzyglod <danielx.t.mrzyglod@intel.com>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for librte_table
  2015-07-16 16:59 14% [dpdk-dev] [PATCH] doc: announce ABI change for librte_table Cristian Dumitrescu
  2015-07-17  7:54  4% ` Gajdzica, MaciejX T
@ 2015-07-17  8:09  4% ` Mrzyglod, DanielX T
  2015-07-17 12:02  4% ` Singh, Jasvinder
  2 siblings, 0 replies; 200+ results
From: Mrzyglod, DanielX T @ 2015-07-17  8:09 UTC (permalink / raw)
  To: Dumitrescu, Cristian, dev

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Cristian Dumitrescu
> Sent: Thursday, July 16, 2015 7:00 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH] doc: announce ABI change for librte_table
> 
> 
> Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>

Acked-by: Daniel Mrzyglod <danielx.t.mrzyglod@intel.com>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v2] doc: announce ABI change for librte_port
  2015-07-16 15:27 14% [dpdk-dev] [PATCH v2] " Cristian Dumitrescu
  2015-07-16 15:51  4% ` Singh, Jasvinder
  2015-07-17  7:56  4% ` Gajdzica, MaciejX T
@ 2015-07-17  8:08  4% ` Mrzyglod, DanielX T
  2 siblings, 0 replies; 200+ results
From: Mrzyglod, DanielX T @ 2015-07-17  8:08 UTC (permalink / raw)
  To: Dumitrescu, Cristian, dev

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Cristian Dumitrescu
> Sent: Thursday, July 16, 2015 5:27 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v2] doc: announce ABI change for librte_port
> 
> v2 changes:
> -text simplification
> 
> Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>

Acked-by: Daniel Mrzyglod <danielx.t.mrzyglod@intel.com>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v2] doc: announce ABI change for librte_port
  2015-07-16 15:27 14% [dpdk-dev] [PATCH v2] " Cristian Dumitrescu
  2015-07-16 15:51  4% ` Singh, Jasvinder
@ 2015-07-17  7:56  4% ` Gajdzica, MaciejX T
  2015-07-17  8:08  4% ` Mrzyglod, DanielX T
  2 siblings, 0 replies; 200+ results
From: Gajdzica, MaciejX T @ 2015-07-17  7:56 UTC (permalink / raw)
  To: Dumitrescu, Cristian, dev



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Cristian Dumitrescu
> Sent: Thursday, July 16, 2015 5:27 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v2] doc: announce ABI change for librte_port
> 
> v2 changes:
> -text simplification
> 
> Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>

Acked-by: Maciej Gajdzica <maciejx.t.gajdzica@intel.com>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for librte_table
  2015-07-16 16:59 14% [dpdk-dev] [PATCH] doc: announce ABI change for librte_table Cristian Dumitrescu
@ 2015-07-17  7:54  4% ` Gajdzica, MaciejX T
  2015-07-17  8:09  4% ` Mrzyglod, DanielX T
  2015-07-17 12:02  4% ` Singh, Jasvinder
  2 siblings, 0 replies; 200+ results
From: Gajdzica, MaciejX T @ 2015-07-17  7:54 UTC (permalink / raw)
  To: Dumitrescu, Cristian, dev



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Cristian Dumitrescu
> Sent: Thursday, July 16, 2015 7:00 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH] doc: announce ABI change for librte_table
> 
> 
> Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>

Acked-by: Maciej Gajdzica <maciejx.t.gajdzica@intel.com>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for librte_pipeline
  2015-07-16 17:07 14% [dpdk-dev] [PATCH] doc: announce ABI change for librte_pipeline Cristian Dumitrescu
@ 2015-07-17  7:54  4% ` Gajdzica, MaciejX T
  2015-07-17  8:10  4% ` Mrzyglod, DanielX T
  2015-07-17 12:03  4% ` Singh, Jasvinder
  2 siblings, 0 replies; 200+ results
From: Gajdzica, MaciejX T @ 2015-07-17  7:54 UTC (permalink / raw)
  To: Dumitrescu, Cristian, dev



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Cristian Dumitrescu
> Sent: Thursday, July 16, 2015 7:08 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH] doc: announce ABI change for librte_pipeline
> 
> 
> Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>

Acked-by: Maciej Gajdzica <maciejx.t.gajdzica@intel.com>

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v14 13/13] l3fwd-power: enable one-shot rx interrupt and polling/interrupt mode switch
  2015-07-17  6:16  4%   ` [dpdk-dev] [PATCH v14 00/13] " Cunming Liang
                       ` (8 preceding siblings ...)
  2015-07-17  6:16  2%     ` [dpdk-dev] [PATCH v14 12/13] igb: enable rx queue interrupts for PF Cunming Liang
@ 2015-07-17  6:16  2%     ` Cunming Liang
  2015-07-20  3:02  4%     ` [dpdk-dev] [PATCH v15 00/13] Interrupt mode PMD Cunming Liang
  10 siblings, 0 replies; 200+ results
From: Cunming Liang @ 2015-07-17  6:16 UTC (permalink / raw)
  To: dev, thomas.monjalon, david.marchand; +Cc: shemming

The patch demonstrates how to handle per rx queue interrupt in a NAPI-like
implementation in userspace. The working thread mainly runs in polling mode
and switch to interrupt mode only if there is no packet received in recent polls.
The working thread returns to polling mode immediately once it receives an
interrupt notification caused by the incoming packets.
The sample keeps running in polling mode if the binding PMD hasn't supported
the rx interrupt yet. Now only ixgbe(pf/vf) and igb support it.

Signed-off-by: Danny Zhou <danny.zhou@intel.com>
Signed-off-by: Cunming Liang <cunming.liang@intel.com>
---
v14 changes
 - per-patch basis ABI compatibility rework
 - reword commit comments

v7 changes
 - using new APIs
 - demo multiple port/queue pair wait on the same epoll instance

v6 changes
 - Split event fd add and wait

v5 changes
 - Change invoked function name and parameter to accomodate EAL change

v3 changes
 - Add spinlock to ensure thread safe when accessing interrupt mask
   register

v2 changes
 - Remove unused function which is for debug purpose

 examples/l3fwd-power/main.c | 202 +++++++++++++++++++++++++++++++++++---------
 1 file changed, 162 insertions(+), 40 deletions(-)

diff --git a/examples/l3fwd-power/main.c b/examples/l3fwd-power/main.c
index b3c5f43..bec78e1 100644
--- a/examples/l3fwd-power/main.c
+++ b/examples/l3fwd-power/main.c
@@ -74,12 +74,14 @@
 #include <rte_string_fns.h>
 #include <rte_timer.h>
 #include <rte_power.h>
+#include <rte_eal.h>
+#include <rte_spinlock.h>
 
 #define RTE_LOGTYPE_L3FWD_POWER RTE_LOGTYPE_USER1
 
 #define MAX_PKT_BURST 32
 
-#define MIN_ZERO_POLL_COUNT 5
+#define MIN_ZERO_POLL_COUNT 10
 
 /* around 100ms at 2 Ghz */
 #define TIMER_RESOLUTION_CYCLES           200000000ULL
@@ -153,6 +155,9 @@ static uint16_t nb_txd = RTE_TEST_TX_DESC_DEFAULT;
 /* ethernet addresses of ports */
 static struct ether_addr ports_eth_addr[RTE_MAX_ETHPORTS];
 
+/* ethernet addresses of ports */
+static rte_spinlock_t locks[RTE_MAX_ETHPORTS];
+
 /* mask of enabled ports */
 static uint32_t enabled_port_mask = 0;
 /* Ports set in promiscuous mode off by default. */
@@ -185,6 +190,9 @@ struct lcore_rx_queue {
 #define MAX_TX_QUEUE_PER_PORT RTE_MAX_ETHPORTS
 #define MAX_RX_QUEUE_PER_PORT 128
 
+#define MAX_RX_QUEUE_INTERRUPT_PER_PORT 16
+
+
 #define MAX_LCORE_PARAMS 1024
 struct lcore_params {
 	uint8_t port_id;
@@ -211,7 +219,7 @@ static uint16_t nb_lcore_params = sizeof(lcore_params_array_default) /
 
 static struct rte_eth_conf port_conf = {
 	.rxmode = {
-		.mq_mode	= ETH_MQ_RX_RSS,
+		.mq_mode = ETH_MQ_RX_RSS,
 		.max_rx_pkt_len = ETHER_MAX_LEN,
 		.split_hdr_size = 0,
 		.header_split   = 0, /**< Header Split disabled */
@@ -223,11 +231,14 @@ static struct rte_eth_conf port_conf = {
 	.rx_adv_conf = {
 		.rss_conf = {
 			.rss_key = NULL,
-			.rss_hf = ETH_RSS_IP,
+			.rss_hf = ETH_RSS_UDP,
 		},
 	},
 	.txmode = {
-		.mq_mode = ETH_DCB_NONE,
+		.mq_mode = ETH_MQ_TX_NONE,
+	},
+	.intr_conf = {
+		.lsc = 1,
 	},
 };
 
@@ -399,19 +410,22 @@ power_timer_cb(__attribute__((unused)) struct rte_timer *tim,
 	/* accumulate total execution time in us when callback is invoked */
 	sleep_time_ratio = (float)(stats[lcore_id].sleep_time) /
 					(float)SCALING_PERIOD;
-
 	/**
 	 * check whether need to scale down frequency a step if it sleep a lot.
 	 */
-	if (sleep_time_ratio >= SCALING_DOWN_TIME_RATIO_THRESHOLD)
-		rte_power_freq_down(lcore_id);
+	if (sleep_time_ratio >= SCALING_DOWN_TIME_RATIO_THRESHOLD) {
+		if (rte_power_freq_down)
+			rte_power_freq_down(lcore_id);
+	}
 	else if ( (unsigned)(stats[lcore_id].nb_rx_processed /
-		stats[lcore_id].nb_iteration_looped) < MAX_PKT_BURST)
+		stats[lcore_id].nb_iteration_looped) < MAX_PKT_BURST) {
 		/**
 		 * scale down a step if average packet per iteration less
 		 * than expectation.
 		 */
-		rte_power_freq_down(lcore_id);
+		if (rte_power_freq_down)
+			rte_power_freq_down(lcore_id);
+	}
 
 	/**
 	 * initialize another timer according to current frequency to ensure
@@ -712,22 +726,20 @@ l3fwd_simple_forward(struct rte_mbuf *m, uint8_t portid,
 
 }
 
-#define SLEEP_GEAR1_THRESHOLD            100
-#define SLEEP_GEAR2_THRESHOLD            1000
+#define MINIMUM_SLEEP_TIME         1
+#define SUSPEND_THRESHOLD          300
 
 static inline uint32_t
 power_idle_heuristic(uint32_t zero_rx_packet_count)
 {
-	/* If zero count is less than 100, use it as the sleep time in us */
-	if (zero_rx_packet_count < SLEEP_GEAR1_THRESHOLD)
-		return zero_rx_packet_count;
-	/* If zero count is less than 1000, sleep time should be 100 us */
-	else if ((zero_rx_packet_count >= SLEEP_GEAR1_THRESHOLD) &&
-			(zero_rx_packet_count < SLEEP_GEAR2_THRESHOLD))
-		return SLEEP_GEAR1_THRESHOLD;
-	/* If zero count is greater than 1000, sleep time should be 1000 us */
-	else if (zero_rx_packet_count >= SLEEP_GEAR2_THRESHOLD)
-		return SLEEP_GEAR2_THRESHOLD;
+	/* If zero count is less than 100,  sleep 1us */
+	if (zero_rx_packet_count < SUSPEND_THRESHOLD)
+		return MINIMUM_SLEEP_TIME;
+	/* If zero count is less than 1000, sleep 100 us which is the
+		minimum latency switching from C3/C6 to C0
+	*/
+	else
+		return SUSPEND_THRESHOLD;
 
 	return 0;
 }
@@ -767,6 +779,84 @@ power_freq_scaleup_heuristic(unsigned lcore_id,
 	return FREQ_CURRENT;
 }
 
+/**
+ * force polling thread sleep until one-shot rx interrupt triggers
+ * @param port_id
+ *  Port id.
+ * @param queue_id
+ *  Rx queue id.
+ * @return
+ *  0 on success
+ */
+static int
+sleep_until_rx_interrupt(int num)
+{
+	struct rte_epoll_event event[num];
+	int n, i;
+	uint8_t port_id, queue_id;
+	void *data;
+
+	RTE_LOG(INFO, L3FWD_POWER,
+		"lcore %u sleeps until interrupt triggers\n",
+		rte_lcore_id());
+
+	n = rte_epoll_wait(RTE_EPOLL_PER_THREAD, event, num, -1);
+	for (i = 0; i < n; i++) {
+		data = event[i].epdata.data;
+		port_id = ((uintptr_t)data) >> CHAR_BIT;
+		queue_id = ((uintptr_t)data) &
+			RTE_LEN2MASK(CHAR_BIT, uint8_t);
+		RTE_LOG(INFO, L3FWD_POWER,
+			"lcore %u is waked up from rx interrupt on"
+			" port %d queue %d\n",
+			rte_lcore_id(), port_id, queue_id);
+	}
+
+	return 0;
+}
+
+static int turn_on_intr(struct lcore_conf *qconf)
+{
+	int i;
+	struct lcore_rx_queue *rx_queue;
+	uint8_t port_id, queue_id;
+
+	for (i = 0; i < qconf->n_rx_queue; ++i) {
+		rx_queue = &(qconf->rx_queue_list[i]);
+		port_id = rx_queue->port_id;
+		queue_id = rx_queue->queue_id;
+
+		rte_spinlock_lock(&(locks[port_id]));
+		rte_eth_dev_rx_intr_enable(port_id, queue_id);
+		rte_spinlock_unlock(&(locks[port_id]));
+	}
+}
+
+static int event_register(struct lcore_conf *qconf)
+{
+	struct lcore_rx_queue *rx_queue;
+	uint8_t portid, queueid;
+	uint32_t data;
+	int ret;
+	int i;
+
+	for (i = 0; i < qconf->n_rx_queue; ++i) {
+		rx_queue = &(qconf->rx_queue_list[i]);
+		portid = rx_queue->port_id;
+		queueid = rx_queue->queue_id;
+		data = portid << CHAR_BIT | queueid;
+
+		ret = rte_eth_dev_rx_intr_ctl_q(portid, queueid,
+						RTE_EPOLL_PER_THREAD,
+						RTE_INTR_EVENT_ADD,
+						(void *)((uintptr_t)data));
+		if (ret)
+			return ret;
+	}
+
+	return 0;
+}
+
 /* main processing loop */
 static int
 main_loop(__attribute__((unused)) void *dummy)
@@ -780,9 +870,9 @@ main_loop(__attribute__((unused)) void *dummy)
 	struct lcore_conf *qconf;
 	struct lcore_rx_queue *rx_queue;
 	enum freq_scale_hint_t lcore_scaleup_hint;
-
 	uint32_t lcore_rx_idle_count = 0;
 	uint32_t lcore_idle_hint = 0;
+	int intr_en = 0;
 
 	const uint64_t drain_tsc = (rte_get_tsc_hz() + US_PER_S - 1) / US_PER_S * BURST_TX_DRAIN_US;
 
@@ -799,13 +889,18 @@ main_loop(__attribute__((unused)) void *dummy)
 	RTE_LOG(INFO, L3FWD_POWER, "entering main loop on lcore %u\n", lcore_id);
 
 	for (i = 0; i < qconf->n_rx_queue; i++) {
-
 		portid = qconf->rx_queue_list[i].port_id;
 		queueid = qconf->rx_queue_list[i].queue_id;
 		RTE_LOG(INFO, L3FWD_POWER, " -- lcoreid=%u portid=%hhu "
 			"rxqueueid=%hhu\n", lcore_id, portid, queueid);
 	}
 
+	/* add into event wait list */
+	if (event_register(qconf) == 0)
+		intr_en = 1;
+	else
+		RTE_LOG(INFO, L3FWD_POWER, "RX interrupt won't enable.\n");
+
 	while (1) {
 		stats[lcore_id].nb_iteration_looped++;
 
@@ -840,6 +935,7 @@ main_loop(__attribute__((unused)) void *dummy)
 			prev_tsc_power = cur_tsc_power;
 		}
 
+start_rx:
 		/*
 		 * Read packet from RX queues
 		 */
@@ -853,6 +949,7 @@ main_loop(__attribute__((unused)) void *dummy)
 
 			nb_rx = rte_eth_rx_burst(portid, queueid, pkts_burst,
 								MAX_PKT_BURST);
+
 			stats[lcore_id].nb_rx_processed += nb_rx;
 			if (unlikely(nb_rx == 0)) {
 				/**
@@ -915,10 +1012,13 @@ main_loop(__attribute__((unused)) void *dummy)
 						rx_queue->freq_up_hint;
 			}
 
-			if (lcore_scaleup_hint == FREQ_HIGHEST)
-				rte_power_freq_max(lcore_id);
-			else if (lcore_scaleup_hint == FREQ_HIGHER)
-				rte_power_freq_up(lcore_id);
+			if (lcore_scaleup_hint == FREQ_HIGHEST) {
+				if (rte_power_freq_max)
+					rte_power_freq_max(lcore_id);
+			} else if (lcore_scaleup_hint == FREQ_HIGHER) {
+				if (rte_power_freq_up)
+					rte_power_freq_up(lcore_id);
+			}
 		} else {
 			/**
 			 * All Rx queues empty in recent consecutive polls,
@@ -933,16 +1033,23 @@ main_loop(__attribute__((unused)) void *dummy)
 					lcore_idle_hint = rx_queue->idle_hint;
 			}
 
-			if ( lcore_idle_hint < SLEEP_GEAR1_THRESHOLD)
+			if (lcore_idle_hint < SUSPEND_THRESHOLD)
 				/**
 				 * execute "pause" instruction to avoid context
-				 * switch for short sleep.
+				 * switch which generally take hundred of
+				 * microseconds for short sleep.
 				 */
 				rte_delay_us(lcore_idle_hint);
-			else
-				/* long sleep force runing thread to suspend */
-				usleep(lcore_idle_hint);
-
+			else {
+				/* suspend until rx interrupt trigges */
+				if (intr_en) {
+					turn_on_intr(qconf);
+					sleep_until_rx_interrupt(
+						qconf->n_rx_queue);
+				}
+				/* start receiving packets immediately */
+				goto start_rx;
+			}
 			stats[lcore_id].sleep_time += lcore_idle_hint;
 		}
 	}
@@ -1273,7 +1380,7 @@ setup_hash(int socketid)
 	char s[64];
 
 	/* create ipv4 hash */
-	snprintf(s, sizeof(s), "ipv4_l3fwd_hash_%d", socketid);
+	rte_snprintf(s, sizeof(s), "ipv4_l3fwd_hash_%d", socketid);
 	ipv4_l3fwd_hash_params.name = s;
 	ipv4_l3fwd_hash_params.socket_id = socketid;
 	ipv4_l3fwd_lookup_struct[socketid] =
@@ -1283,7 +1390,7 @@ setup_hash(int socketid)
 				"socket %d\n", socketid);
 
 	/* create ipv6 hash */
-	snprintf(s, sizeof(s), "ipv6_l3fwd_hash_%d", socketid);
+	rte_snprintf(s, sizeof(s), "ipv6_l3fwd_hash_%d", socketid);
 	ipv6_l3fwd_hash_params.name = s;
 	ipv6_l3fwd_hash_params.socket_id = socketid;
 	ipv6_l3fwd_lookup_struct[socketid] =
@@ -1477,6 +1584,7 @@ main(int argc, char **argv)
 	unsigned lcore_id;
 	uint64_t hz;
 	uint32_t n_tx_queue, nb_lcores;
+	uint32_t dev_rxq_num, dev_txq_num;
 	uint8_t portid, nb_rx_queue, queue, socketid;
 
 	/* catch SIGINT and restore cpufreq governor to ondemand */
@@ -1526,10 +1634,19 @@ main(int argc, char **argv)
 		printf("Initializing port %d ... ", portid );
 		fflush(stdout);
 
+		rte_eth_dev_info_get(portid, &dev_info);
+		dev_rxq_num = dev_info.max_rx_queues;
+		dev_txq_num = dev_info.max_tx_queues;
+
 		nb_rx_queue = get_port_n_rx_queues(portid);
+		if (nb_rx_queue > dev_rxq_num)
+			rte_exit(EXIT_FAILURE,
+				"Cannot configure not existed rxq: "
+				"port=%d\n", portid);
+
 		n_tx_queue = nb_lcores;
-		if (n_tx_queue > MAX_TX_QUEUE_PER_PORT)
-			n_tx_queue = MAX_TX_QUEUE_PER_PORT;
+		if (n_tx_queue > dev_txq_num)
+			n_tx_queue = dev_txq_num;
 		printf("Creating queues: nb_rxq=%d nb_txq=%u... ",
 			nb_rx_queue, (unsigned)n_tx_queue );
 		ret = rte_eth_dev_configure(portid, nb_rx_queue,
@@ -1553,6 +1670,9 @@ main(int argc, char **argv)
 			if (rte_lcore_is_enabled(lcore_id) == 0)
 				continue;
 
+			if (queueid >= dev_txq_num)
+				continue;
+
 			if (numa_on)
 				socketid = \
 				(uint8_t)rte_lcore_to_socket_id(lcore_id);
@@ -1587,8 +1707,9 @@ main(int argc, char **argv)
 		/* init power management library */
 		ret = rte_power_init(lcore_id);
 		if (ret)
-			rte_exit(EXIT_FAILURE, "Power management library "
-				"initialization failed on core%u\n", lcore_id);
+			rte_log(RTE_LOG_ERR, RTE_LOGTYPE_POWER,
+				"Power management library initialization "
+				"failed on core%u", lcore_id);
 
 		/* init timer structures for each enabled lcore */
 		rte_timer_init(&power_timers[lcore_id]);
@@ -1636,7 +1757,6 @@ main(int argc, char **argv)
 		if (ret < 0)
 			rte_exit(EXIT_FAILURE, "rte_eth_dev_start: err=%d, "
 						"port=%d\n", ret, portid);
-
 		/*
 		 * If enabled, put device in promiscuous mode.
 		 * This allows IO forwarding mode to forward packets
@@ -1645,6 +1765,8 @@ main(int argc, char **argv)
 		 */
 		if (promiscuous_on)
 			rte_eth_promiscuous_enable(portid);
+		/* initialize spinlock for each port */
+		rte_spinlock_init(&(locks[portid]));
 	}
 
 	check_all_ports_link_status((uint8_t)nb_ports, enabled_port_mask);
-- 
1.8.1.4

^ permalink raw reply	[relevance 2%]

* [dpdk-dev] [PATCH v14 12/13] igb: enable rx queue interrupts for PF
  2015-07-17  6:16  4%   ` [dpdk-dev] [PATCH v14 00/13] " Cunming Liang
                       ` (7 preceding siblings ...)
  2015-07-17  6:16  1%     ` [dpdk-dev] [PATCH v14 11/13] ixgbe: enable rx queue interrupts for both PF and VF Cunming Liang
@ 2015-07-17  6:16  2%     ` Cunming Liang
  2015-07-17  6:16  2%     ` [dpdk-dev] [PATCH v14 13/13] l3fwd-power: enable one-shot rx interrupt and polling/interrupt mode switch Cunming Liang
  2015-07-20  3:02  4%     ` [dpdk-dev] [PATCH v15 00/13] Interrupt mode PMD Cunming Liang
  10 siblings, 0 replies; 200+ results
From: Cunming Liang @ 2015-07-17  6:16 UTC (permalink / raw)
  To: dev, thomas.monjalon, david.marchand; +Cc: shemming

The patch does below for igb PF:
- Setup NIC to generate MSI-X interrupts
- Set the IVAR register to map interrupt causes to vectors
- Implement interrupt enable/disable functions

Signed-off-by: Danny Zhou <danny.zhou@intel.com>
Signed-off-by: Cunming Liang <cunming.liang@intel.com>
---
v14 changes
 - per-patch basis ABI compatibility rework

v9 changes
 - move queue-vec mapping init from dev_configure to dev_start
 - fix link interrupt not working issue in vfio-msix

v8 changes
 - add vfio-msi/vfio-legacy and uio-legacy support

v7 changes
 - add condition check when intr vector is not enabled

v6 changes
 - fill queue-vector mapping table

v5 changes
 - Rebase the patchset onto the HEAD

v3 changes
 - Remove unnecessary variables in e1000_mac_info
 - Remove spinlok from PMD

v2 changes
 - Consolidate review comments related to coding style

 drivers/net/e1000/igb_ethdev.c | 311 ++++++++++++++++++++++++++++++++++++-----
 1 file changed, 277 insertions(+), 34 deletions(-)

diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c
index eb97218..fd92c80 100644
--- a/drivers/net/e1000/igb_ethdev.c
+++ b/drivers/net/e1000/igb_ethdev.c
@@ -104,6 +104,9 @@ static int  eth_igb_flow_ctrl_get(struct rte_eth_dev *dev,
 static int  eth_igb_flow_ctrl_set(struct rte_eth_dev *dev,
 				struct rte_eth_fc_conf *fc_conf);
 static int eth_igb_lsc_interrupt_setup(struct rte_eth_dev *dev);
+#ifdef RTE_NEXT_ABI
+static int eth_igb_rxq_interrupt_setup(struct rte_eth_dev *dev);
+#endif
 static int eth_igb_interrupt_get_status(struct rte_eth_dev *dev);
 static int eth_igb_interrupt_action(struct rte_eth_dev *dev);
 static void eth_igb_interrupt_handler(struct rte_intr_handle *handle,
@@ -201,7 +204,6 @@ static int eth_igb_filter_ctrl(struct rte_eth_dev *dev,
 		     enum rte_filter_type filter_type,
 		     enum rte_filter_op filter_op,
 		     void *arg);
-
 static int eth_igb_set_mc_addr_list(struct rte_eth_dev *dev,
 				    struct ether_addr *mc_addr_set,
 				    uint32_t nb_mc_addr);
@@ -212,6 +214,17 @@ static int igb_timesync_read_rx_timestamp(struct rte_eth_dev *dev,
 					  uint32_t flags);
 static int igb_timesync_read_tx_timestamp(struct rte_eth_dev *dev,
 					  struct timespec *timestamp);
+#ifdef RTE_NEXT_ABI
+static int eth_igb_rx_queue_intr_enable(struct rte_eth_dev *dev,
+					uint16_t queue_id);
+static int eth_igb_rx_queue_intr_disable(struct rte_eth_dev *dev,
+					 uint16_t queue_id);
+static void eth_igb_assign_msix_vector(struct e1000_hw *hw, int8_t direction,
+				       uint8_t queue, uint8_t msix_vector);
+static void eth_igb_write_ivar(struct e1000_hw *hw, uint8_t msix_vector,
+			       uint8_t index, uint8_t offset);
+#endif
+static void eth_igb_configure_msix_intr(struct rte_eth_dev *dev);
 
 /*
  * Define VF Stats MACRO for Non "cleared on read" register
@@ -272,6 +285,10 @@ static const struct eth_dev_ops eth_igb_ops = {
 	.vlan_tpid_set        = eth_igb_vlan_tpid_set,
 	.vlan_offload_set     = eth_igb_vlan_offload_set,
 	.rx_queue_setup       = eth_igb_rx_queue_setup,
+#ifdef RTE_NEXT_ABI
+	.rx_queue_intr_enable = eth_igb_rx_queue_intr_enable,
+	.rx_queue_intr_disable = eth_igb_rx_queue_intr_disable,
+#endif
 	.rx_queue_release     = eth_igb_rx_queue_release,
 	.rx_queue_count       = eth_igb_rx_queue_count,
 	.rx_descriptor_done   = eth_igb_rx_descriptor_done,
@@ -609,12 +626,6 @@ eth_igb_dev_init(struct rte_eth_dev *eth_dev)
 		     eth_dev->data->port_id, pci_dev->id.vendor_id,
 		     pci_dev->id.device_id);
 
-	rte_intr_callback_register(&(pci_dev->intr_handle),
-		eth_igb_interrupt_handler, (void *)eth_dev);
-
-	/* enable uio intr after callback register */
-	rte_intr_enable(&(pci_dev->intr_handle));
-
 	/* enable support intr */
 	igb_intr_enable(eth_dev);
 
@@ -777,7 +788,11 @@ eth_igb_start(struct rte_eth_dev *dev)
 {
 	struct e1000_hw *hw =
 		E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-	int ret, i, mask;
+	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+#ifdef RTE_NEXT_ABI
+	uint32_t intr_vector = 0;
+#endif
+	int ret, mask;
 	uint32_t ctrl_ext;
 
 	PMD_INIT_FUNC_TRACE();
@@ -817,6 +832,29 @@ eth_igb_start(struct rte_eth_dev *dev)
 	/* configure PF module if SRIOV enabled */
 	igb_pf_host_configure(dev);
 
+#ifdef RTE_NEXT_ABI
+	/* check and configure queue intr-vector mapping */
+	if (dev->data->dev_conf.intr_conf.rxq != 0)
+		intr_vector = dev->data->nb_rx_queues;
+
+	if (rte_intr_efd_enable(intr_handle, intr_vector))
+		return -1;
+
+	if (rte_intr_dp_is_en(intr_handle)) {
+		intr_handle->intr_vec =
+			rte_zmalloc("intr_vec",
+				    dev->data->nb_rx_queues * sizeof(int), 0);
+		if (intr_handle->intr_vec == NULL) {
+			PMD_INIT_LOG(ERR, "Failed to allocate %d rx_queues"
+				     " intr_vec\n", dev->data->nb_rx_queues);
+			return -ENOMEM;
+		}
+	}
+#endif
+
+	/* confiugre msix for rx interrupt */
+	eth_igb_configure_msix_intr(dev);
+
 	/* Configure for OS presence */
 	igb_init_manageability(hw);
 
@@ -844,33 +882,9 @@ eth_igb_start(struct rte_eth_dev *dev)
 		igb_vmdq_vlan_hw_filter_enable(dev);
 	}
 
-	/*
-	 * Configure the Interrupt Moderation register (EITR) with the maximum
-	 * possible value (0xFFFF) to minimize "System Partial Write" issued by
-	 * spurious [DMA] memory updates of RX and TX ring descriptors.
-	 *
-	 * With a EITR granularity of 2 microseconds in the 82576, only 7/8
-	 * spurious memory updates per second should be expected.
-	 * ((65535 * 2) / 1000.1000 ~= 0.131 second).
-	 *
-	 * Because interrupts are not used at all, the MSI-X is not activated
-	 * and interrupt moderation is controlled by EITR[0].
-	 *
-	 * Note that having [almost] disabled memory updates of RX and TX ring
-	 * descriptors through the Interrupt Moderation mechanism, memory
-	 * updates of ring descriptors are now moderated by the configurable
-	 * value of Write-Back Threshold registers.
-	 */
 	if ((hw->mac.type == e1000_82576) || (hw->mac.type == e1000_82580) ||
 		(hw->mac.type == e1000_i350) || (hw->mac.type == e1000_i210) ||
 		(hw->mac.type == e1000_i211)) {
-		uint32_t ivar;
-
-		/* Enable all RX & TX queues in the IVAR registers */
-		ivar = (uint32_t) ((E1000_IVAR_VALID << 16) | E1000_IVAR_VALID);
-		for (i = 0; i < 8; i++)
-			E1000_WRITE_REG_ARRAY(hw, E1000_IVAR0, i, ivar);
-
 		/* Configure EITR with the maximum possible value (0xFFFF) */
 		E1000_WRITE_REG(hw, E1000_EITR(0), 0xFFFF);
 	}
@@ -921,8 +935,25 @@ eth_igb_start(struct rte_eth_dev *dev)
 	e1000_setup_link(hw);
 
 	/* check if lsc interrupt feature is enabled */
-	if (dev->data->dev_conf.intr_conf.lsc != 0)
-		ret = eth_igb_lsc_interrupt_setup(dev);
+	if (dev->data->dev_conf.intr_conf.lsc != 0) {
+		if (rte_intr_allow_others(intr_handle)) {
+			rte_intr_callback_register(intr_handle,
+						   eth_igb_interrupt_handler,
+						   (void *)dev);
+			eth_igb_lsc_interrupt_setup(dev);
+		} else
+			PMD_INIT_LOG(INFO, "lsc won't enable because of"
+				     " no intr multiplex\n");
+	}
+
+#ifdef RTE_NEXT_ABI
+	/* check if rxq interrupt is enabled */
+	if (dev->data->dev_conf.intr_conf.rxq != 0)
+		eth_igb_rxq_interrupt_setup(dev);
+#endif
+
+	/* enable uio/vfio intr/eventfd mapping */
+	rte_intr_enable(intr_handle);
 
 	/* resume enabled intr since hw reset */
 	igb_intr_enable(dev);
@@ -955,8 +986,13 @@ eth_igb_stop(struct rte_eth_dev *dev)
 	struct e1000_flex_filter *p_flex;
 	struct e1000_5tuple_filter *p_5tuple, *p_5tuple_next;
 	struct e1000_2tuple_filter *p_2tuple, *p_2tuple_next;
+	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
 
 	igb_intr_disable(hw);
+
+	/* disable intr eventfd mapping */
+	rte_intr_disable(intr_handle);
+
 	igb_pf_reset_hw(hw);
 	E1000_WRITE_REG(hw, E1000_WUC, 0);
 
@@ -1005,6 +1041,15 @@ eth_igb_stop(struct rte_eth_dev *dev)
 		rte_free(p_2tuple);
 	}
 	filter_info->twotuple_mask = 0;
+
+#ifdef RTE_NEXT_ABI
+	/* Clean datapath event and queue/vec mapping */
+	rte_intr_efd_disable(intr_handle);
+	if (intr_handle->intr_vec != NULL) {
+		rte_free(intr_handle->intr_vec);
+		intr_handle->intr_vec = NULL;
+	}
+#endif
 }
 
 static void
@@ -1012,6 +1057,9 @@ eth_igb_close(struct rte_eth_dev *dev)
 {
 	struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	struct rte_eth_link link;
+#ifdef RTE_NEXT_ABI
+	struct rte_pci_device *pci_dev;
+#endif
 
 	eth_igb_stop(dev);
 	e1000_phy_hw_reset(hw);
@@ -1029,6 +1077,14 @@ eth_igb_close(struct rte_eth_dev *dev)
 
 	igb_dev_clear_queues(dev);
 
+#ifdef RTE_NEXT_ABI
+	pci_dev = dev->pci_dev;
+	if (pci_dev->intr_handle.intr_vec) {
+		rte_free(pci_dev->intr_handle.intr_vec);
+		pci_dev->intr_handle.intr_vec = NULL;
+	}
+#endif
+
 	memset(&link, 0, sizeof(link));
 	rte_igb_dev_atomic_write_link_status(dev, &link);
 }
@@ -1853,6 +1909,35 @@ eth_igb_lsc_interrupt_setup(struct rte_eth_dev *dev)
 	return 0;
 }
 
+#ifdef RTE_NEXT_ABI
+/* It clears the interrupt causes and enables the interrupt.
+ * It will be called once only during nic initialized.
+ *
+ * @param dev
+ *  Pointer to struct rte_eth_dev.
+ *
+ * @return
+ *  - On success, zero.
+ *  - On failure, a negative value.
+ */
+static int eth_igb_rxq_interrupt_setup(struct rte_eth_dev *dev)
+{
+	uint32_t mask, regval;
+	struct e1000_hw *hw =
+		E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct rte_eth_dev_info dev_info;
+
+	memset(&dev_info, 0, sizeof(dev_info));
+	eth_igb_infos_get(dev, &dev_info);
+
+	mask = 0xFFFFFFFF >> (32 - dev_info.max_rx_queues);
+	regval = E1000_READ_REG(hw, E1000_EIMS);
+	E1000_WRITE_REG(hw, E1000_EIMS, regval | mask);
+
+	return 0;
+}
+#endif
+
 /*
  * It reads ICR and gets interrupt causes, check it and set a bit flag
  * to update link status.
@@ -3788,5 +3873,163 @@ static struct rte_driver pmd_igbvf_drv = {
 	.init = rte_igbvf_pmd_init,
 };
 
+#ifdef RTE_NEXT_ABI
+static int
+eth_igb_rx_queue_intr_disable(struct rte_eth_dev *dev, uint16_t queue_id)
+{
+	struct e1000_hw *hw =
+		E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	uint32_t mask = 1 << queue_id;
+
+	E1000_WRITE_REG(hw, E1000_EIMC, mask);
+	E1000_WRITE_FLUSH(hw);
+
+	return 0;
+}
+
+static int
+eth_igb_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
+{
+	struct e1000_hw *hw =
+		E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	uint32_t mask = 1 << queue_id;
+	uint32_t regval;
+
+	regval = E1000_READ_REG(hw, E1000_EIMS);
+	E1000_WRITE_REG(hw, E1000_EIMS, regval | mask);
+	E1000_WRITE_FLUSH(hw);
+
+	rte_intr_enable(&dev->pci_dev->intr_handle);
+
+	return 0;
+}
+
+static void
+eth_igb_write_ivar(struct e1000_hw *hw, uint8_t  msix_vector,
+		   uint8_t index, uint8_t offset)
+{
+	uint32_t val = E1000_READ_REG_ARRAY(hw, E1000_IVAR0, index);
+
+	/* clear bits */
+	val &= ~((uint32_t)0xFF << offset);
+
+	/* write vector and valid bit */
+	val |= (msix_vector | E1000_IVAR_VALID) << offset;
+
+	E1000_WRITE_REG_ARRAY(hw, E1000_IVAR0, index, val);
+}
+
+static void
+eth_igb_assign_msix_vector(struct e1000_hw *hw, int8_t direction,
+			   uint8_t queue, uint8_t msix_vector)
+{
+	uint32_t tmp = 0;
+
+	if (hw->mac.type == e1000_82575) {
+		if (direction == 0)
+			tmp = E1000_EICR_RX_QUEUE0 << queue;
+		else if (direction == 1)
+			tmp = E1000_EICR_TX_QUEUE0 << queue;
+		E1000_WRITE_REG(hw, E1000_MSIXBM(msix_vector), tmp);
+	} else if (hw->mac.type == e1000_82576) {
+		if ((direction == 0) || (direction == 1))
+			eth_igb_write_ivar(hw, msix_vector, queue & 0x7,
+					   ((queue & 0x8) << 1) +
+					   8 * direction);
+	} else if ((hw->mac.type == e1000_82580) ||
+			(hw->mac.type == e1000_i350) ||
+			(hw->mac.type == e1000_i354) ||
+			(hw->mac.type == e1000_i210) ||
+			(hw->mac.type == e1000_i211)) {
+		if ((direction == 0) || (direction == 1))
+			eth_igb_write_ivar(hw, msix_vector,
+					   queue >> 1,
+					   ((queue & 0x1) << 4) +
+					   8 * direction);
+	}
+}
+#endif
+
+/* Sets up the hardware to generate MSI-X interrupts properly
+ * @hw
+ *  board private structure
+ */
+static void
+eth_igb_configure_msix_intr(struct rte_eth_dev *dev)
+{
+#ifdef RTE_NEXT_ABI
+	int queue_id;
+	uint32_t tmpval, regval, intr_mask;
+	struct e1000_hw *hw =
+		E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	uint32_t vec = 0;
+#endif
+	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+
+	/* won't configure msix register if no mapping is done
+	 * between intr vector and event fd
+	 */
+	if (!rte_intr_dp_is_en(intr_handle))
+		return;
+
+#ifdef RTE_NEXT_ABI
+	/* set interrupt vector for other causes */
+	if (hw->mac.type == e1000_82575) {
+		tmpval = E1000_READ_REG(hw, E1000_CTRL_EXT);
+		/* enable MSI-X PBA support */
+		tmpval |= E1000_CTRL_EXT_PBA_CLR;
+
+		/* Auto-Mask interrupts upon ICR read */
+		tmpval |= E1000_CTRL_EXT_EIAME;
+		tmpval |= E1000_CTRL_EXT_IRCA;
+
+		E1000_WRITE_REG(hw, E1000_CTRL_EXT, tmpval);
+
+		/* enable msix_other interrupt */
+		E1000_WRITE_REG_ARRAY(hw, E1000_MSIXBM(0), 0, E1000_EIMS_OTHER);
+		regval = E1000_READ_REG(hw, E1000_EIAC);
+		E1000_WRITE_REG(hw, E1000_EIAC, regval | E1000_EIMS_OTHER);
+		regval = E1000_READ_REG(hw, E1000_EIAM);
+		E1000_WRITE_REG(hw, E1000_EIMS, regval | E1000_EIMS_OTHER);
+	} else if ((hw->mac.type == e1000_82576) ||
+			(hw->mac.type == e1000_82580) ||
+			(hw->mac.type == e1000_i350) ||
+			(hw->mac.type == e1000_i354) ||
+			(hw->mac.type == e1000_i210) ||
+			(hw->mac.type == e1000_i211)) {
+		/* turn on MSI-X capability first */
+		E1000_WRITE_REG(hw, E1000_GPIE, E1000_GPIE_MSIX_MODE |
+					E1000_GPIE_PBA | E1000_GPIE_EIAME |
+					E1000_GPIE_NSICR);
+
+		intr_mask = (1 << intr_handle->max_intr) - 1;
+		regval = E1000_READ_REG(hw, E1000_EIAC);
+		E1000_WRITE_REG(hw, E1000_EIAC, regval | intr_mask);
+
+		/* enable msix_other interrupt */
+		regval = E1000_READ_REG(hw, E1000_EIMS);
+		E1000_WRITE_REG(hw, E1000_EIMS, regval | intr_mask);
+		tmpval = (dev->data->nb_rx_queues | E1000_IVAR_VALID) << 8;
+		E1000_WRITE_REG(hw, E1000_IVAR_MISC, tmpval);
+	}
+
+	/* use EIAM to auto-mask when MSI-X interrupt
+	 * is asserted, this saves a register write for every interrupt
+	 */
+	intr_mask = (1 << intr_handle->nb_efd) - 1;
+	regval = E1000_READ_REG(hw, E1000_EIAM);
+	E1000_WRITE_REG(hw, E1000_EIAM, regval | intr_mask);
+
+	for (queue_id = 0; queue_id < dev->data->nb_rx_queues; queue_id++) {
+		eth_igb_assign_msix_vector(hw, 0, queue_id, vec);
+		intr_handle->intr_vec[queue_id] = vec;
+		if (vec < intr_handle->nb_efd - 1)
+			vec++;
+	}
+
+	E1000_WRITE_FLUSH(hw);
+#endif
+}
+
 PMD_REGISTER_DRIVER(pmd_igb_drv);
 PMD_REGISTER_DRIVER(pmd_igbvf_drv);
-- 
1.8.1.4

^ permalink raw reply	[relevance 2%]

* [dpdk-dev] [PATCH v14 11/13] ixgbe: enable rx queue interrupts for both PF and VF
  2015-07-17  6:16  4%   ` [dpdk-dev] [PATCH v14 00/13] " Cunming Liang
                       ` (6 preceding siblings ...)
  2015-07-17  6:16  3%     ` [dpdk-dev] [PATCH v14 10/13] ethdev: add rx intr enable, disable and ctl functions Cunming Liang
@ 2015-07-17  6:16  1%     ` Cunming Liang
  2015-07-17  6:16  2%     ` [dpdk-dev] [PATCH v14 12/13] igb: enable rx queue interrupts for PF Cunming Liang
                       ` (2 subsequent siblings)
  10 siblings, 0 replies; 200+ results
From: Cunming Liang @ 2015-07-17  6:16 UTC (permalink / raw)
  To: dev, thomas.monjalon, david.marchand; +Cc: shemming

The patch does below things for ixgbe PF and VF:
- Setup NIC to generate MSI-X interrupts
- Set the IVAR register to map interrupt causes to vectors
- Implement interrupt enable/disable functions

Signed-off-by: Danny Zhou <danny.zhou@intel.com>
Signed-off-by: Yong Liu <yong.liu@intel.com>
Signed-off-by: Cunming Liang <cunming.liang@intel.com>
---
v14 changes
 - per-patch basis ABI compatibility rework

v10 changes
 - return an actual error code rather than -1

v9 changes
 - move queue-vec mapping init from dev_configure to dev_start

v8 changes
 - add vfio-msi/vfio-legacy and uio-legacy support

v7 changes
 - add condition check when intr vector is not enabled

v6 changes
 - fill queue-vector mapping table

v5 changes
 - Rebase the patchset onto the HEAD

v3 changes
 - Remove spinlok from PMD

v2 changes
 - Consolidate review comments related to coding style

 drivers/net/ixgbe/ixgbe_ethdev.c | 527 ++++++++++++++++++++++++++++++++++++++-
 drivers/net/ixgbe/ixgbe_ethdev.h |   4 +
 2 files changed, 518 insertions(+), 13 deletions(-)

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index 8d68125..8145da9 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -82,6 +82,9 @@
  */
 #define IXGBE_FC_LO    0x40
 
+/* Default minimum inter-interrupt interval for EITR configuration */
+#define IXGBE_MIN_INTER_INTERRUPT_INTERVAL_DEFAULT    0x79E
+
 /* Timer value included in XOFF frames. */
 #define IXGBE_FC_PAUSE 0x680
 
@@ -179,6 +182,9 @@ static int ixgbe_dev_rss_reta_query(struct rte_eth_dev *dev,
 			uint16_t reta_size);
 static void ixgbe_dev_link_status_print(struct rte_eth_dev *dev);
 static int ixgbe_dev_lsc_interrupt_setup(struct rte_eth_dev *dev);
+#ifdef RTE_NEXT_ABI
+static int ixgbe_dev_rxq_interrupt_setup(struct rte_eth_dev *dev);
+#endif
 static int ixgbe_dev_interrupt_get_status(struct rte_eth_dev *dev);
 static int ixgbe_dev_interrupt_action(struct rte_eth_dev *dev);
 static void ixgbe_dev_interrupt_handler(struct rte_intr_handle *handle,
@@ -191,11 +197,14 @@ static void ixgbe_dcb_init(struct ixgbe_hw *hw,struct ixgbe_dcb_config *dcb_conf
 
 /* For Virtual Function support */
 static int eth_ixgbevf_dev_init(struct rte_eth_dev *eth_dev);
+static int ixgbevf_dev_interrupt_get_status(struct rte_eth_dev *dev);
+static int ixgbevf_dev_interrupt_action(struct rte_eth_dev *dev);
 static int  ixgbevf_dev_configure(struct rte_eth_dev *dev);
 static int  ixgbevf_dev_start(struct rte_eth_dev *dev);
 static void ixgbevf_dev_stop(struct rte_eth_dev *dev);
 static void ixgbevf_dev_close(struct rte_eth_dev *dev);
 static void ixgbevf_intr_disable(struct ixgbe_hw *hw);
+static void ixgbevf_intr_enable(struct ixgbe_hw *hw);
 static void ixgbevf_dev_stats_get(struct rte_eth_dev *dev,
 		struct rte_eth_stats *stats);
 static void ixgbevf_dev_stats_reset(struct rte_eth_dev *dev);
@@ -205,6 +214,17 @@ static void ixgbevf_vlan_strip_queue_set(struct rte_eth_dev *dev,
 		uint16_t queue, int on);
 static void ixgbevf_vlan_offload_set(struct rte_eth_dev *dev, int mask);
 static void ixgbevf_set_vfta_all(struct rte_eth_dev *dev, bool on);
+static void ixgbevf_dev_interrupt_handler(struct rte_intr_handle *handle,
+					  void *param);
+#ifdef RTE_NEXT_ABI
+static int ixgbevf_dev_rx_queue_intr_enable(struct rte_eth_dev *dev,
+					    uint16_t queue_id);
+static int ixgbevf_dev_rx_queue_intr_disable(struct rte_eth_dev *dev,
+					     uint16_t queue_id);
+static void ixgbevf_set_ivar_map(struct ixgbe_hw *hw, int8_t direction,
+				 uint8_t queue, uint8_t msix_vector);
+#endif
+static void ixgbevf_configure_msix(struct rte_eth_dev *dev);
 
 /* For Eth VMDQ APIs support */
 static int ixgbe_uc_hash_table_set(struct rte_eth_dev *dev, struct
@@ -221,6 +241,15 @@ static int ixgbe_mirror_rule_set(struct rte_eth_dev *dev,
 		uint8_t rule_id, uint8_t on);
 static int ixgbe_mirror_rule_reset(struct rte_eth_dev *dev,
 		uint8_t	rule_id);
+#ifdef RTE_NEXT_ABI
+static int ixgbe_dev_rx_queue_intr_enable(struct rte_eth_dev *dev,
+					  uint16_t queue_id);
+static int ixgbe_dev_rx_queue_intr_disable(struct rte_eth_dev *dev,
+					   uint16_t queue_id);
+static void ixgbe_set_ivar_map(struct ixgbe_hw *hw, int8_t direction,
+			       uint8_t queue, uint8_t msix_vector);
+#endif
+static void ixgbe_configure_msix(struct rte_eth_dev *dev);
 
 static int ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev,
 		uint16_t queue_idx, uint16_t tx_rate);
@@ -282,7 +311,7 @@ static int ixgbe_timesync_read_tx_timestamp(struct rte_eth_dev *dev,
  */
 #define UPDATE_VF_STAT(reg, last, cur)	                        \
 {                                                               \
-	u32 latest = IXGBE_READ_REG(hw, reg);                   \
+	uint32_t latest = IXGBE_READ_REG(hw, reg);                   \
 	cur += latest - last;                                   \
 	last = latest;                                          \
 }
@@ -363,6 +392,10 @@ static const struct eth_dev_ops ixgbe_eth_dev_ops = {
 	.tx_queue_start	      = ixgbe_dev_tx_queue_start,
 	.tx_queue_stop        = ixgbe_dev_tx_queue_stop,
 	.rx_queue_setup       = ixgbe_dev_rx_queue_setup,
+#ifdef RTE_NEXT_ABI
+	.rx_queue_intr_enable = ixgbe_dev_rx_queue_intr_enable,
+	.rx_queue_intr_disable = ixgbe_dev_rx_queue_intr_disable,
+#endif
 	.rx_queue_release     = ixgbe_dev_rx_queue_release,
 	.rx_queue_count       = ixgbe_dev_rx_queue_count,
 	.rx_descriptor_done   = ixgbe_dev_rx_descriptor_done,
@@ -427,8 +460,13 @@ static const struct eth_dev_ops ixgbevf_eth_dev_ops = {
 	.vlan_offload_set     = ixgbevf_vlan_offload_set,
 	.rx_queue_setup       = ixgbe_dev_rx_queue_setup,
 	.rx_queue_release     = ixgbe_dev_rx_queue_release,
+	.rx_descriptor_done   = ixgbe_dev_rx_descriptor_done,
 	.tx_queue_setup       = ixgbe_dev_tx_queue_setup,
 	.tx_queue_release     = ixgbe_dev_tx_queue_release,
+#ifdef RTE_NEXT_ABI
+	.rx_queue_intr_enable = ixgbevf_dev_rx_queue_intr_enable,
+	.rx_queue_intr_disable = ixgbevf_dev_rx_queue_intr_disable,
+#endif
 	.mac_addr_add         = ixgbevf_add_mac_addr,
 	.mac_addr_remove      = ixgbevf_remove_mac_addr,
 	.set_mc_addr_list     = ixgbe_dev_set_mc_addr_list,
@@ -928,12 +966,6 @@ eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev)
 			eth_dev->data->port_id, pci_dev->id.vendor_id,
 			pci_dev->id.device_id);
 
-	rte_intr_callback_register(&(pci_dev->intr_handle),
-		ixgbe_dev_interrupt_handler, (void *)eth_dev);
-
-	/* enable uio intr after callback register */
-	rte_intr_enable(&(pci_dev->intr_handle));
-
 	/* enable support intr */
 	ixgbe_enable_intr(eth_dev);
 
@@ -1489,6 +1521,10 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
 		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	struct ixgbe_vf_info *vfinfo =
 		*IXGBE_DEV_PRIVATE_TO_P_VFDATA(dev->data->dev_private);
+	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+#ifdef RTE_NEXT_ABI
+	uint32_t intr_vector = 0;
+#endif
 	int err, link_up = 0, negotiate = 0;
 	uint32_t speed = 0;
 	int mask = 0;
@@ -1521,6 +1557,30 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
 	/* configure PF module if SRIOV enabled */
 	ixgbe_pf_host_configure(dev);
 
+#ifdef RTE_NEXT_ABI
+	/* check and configure queue intr-vector mapping */
+	if (dev->data->dev_conf.intr_conf.rxq != 0)
+		intr_vector = dev->data->nb_rx_queues;
+
+	if (rte_intr_efd_enable(intr_handle, intr_vector))
+		return -1;
+
+	if (rte_intr_dp_is_en(intr_handle) && !intr_handle->intr_vec) {
+		intr_handle->intr_vec =
+			rte_zmalloc("intr_vec",
+				    dev->data->nb_rx_queues * sizeof(int),
+				    0);
+		if (intr_handle->intr_vec == NULL) {
+			PMD_INIT_LOG(ERR, "Failed to allocate %d rx_queues"
+				     " intr_vec\n", dev->data->nb_rx_queues);
+			return -ENOMEM;
+		}
+	}
+#endif
+
+	/* confiugre msix for sleep until rx interrupt */
+	ixgbe_configure_msix(dev);
+
 	/* initialize transmission unit */
 	ixgbe_dev_tx_init(dev);
 
@@ -1598,8 +1658,25 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
 skip_link_setup:
 
 	/* check if lsc interrupt is enabled */
-	if (dev->data->dev_conf.intr_conf.lsc != 0)
-		ixgbe_dev_lsc_interrupt_setup(dev);
+	if (dev->data->dev_conf.intr_conf.lsc != 0) {
+		if (rte_intr_allow_others(intr_handle)) {
+			rte_intr_callback_register(intr_handle,
+						   ixgbe_dev_interrupt_handler,
+						   (void *)dev);
+			ixgbe_dev_lsc_interrupt_setup(dev);
+		} else
+			PMD_INIT_LOG(INFO, "lsc won't enable because of"
+				     " no intr multiplex\n");
+	}
+
+#ifdef RTE_NEXT_ABI
+	/* check if rxq interrupt is enabled */
+	if (dev->data->dev_conf.intr_conf.rxq != 0)
+		ixgbe_dev_rxq_interrupt_setup(dev);
+#endif
+
+	/* enable uio/vfio intr/eventfd mapping */
+	rte_intr_enable(intr_handle);
 
 	/* resume enabled intr since hw reset */
 	ixgbe_enable_intr(dev);
@@ -1656,6 +1733,7 @@ ixgbe_dev_stop(struct rte_eth_dev *dev)
 	struct ixgbe_filter_info *filter_info =
 		IXGBE_DEV_PRIVATE_TO_FILTER_INFO(dev->data->dev_private);
 	struct ixgbe_5tuple_filter *p_5tuple, *p_5tuple_next;
+	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
 	int vf;
 
 	PMD_INIT_FUNC_TRACE();
@@ -1663,6 +1741,9 @@ ixgbe_dev_stop(struct rte_eth_dev *dev)
 	/* disable interrupts */
 	ixgbe_disable_intr(hw);
 
+	/* disable intr eventfd mapping */
+	rte_intr_disable(intr_handle);
+
 	/* reset the NIC */
 	ixgbe_pf_reset_hw(hw);
 	hw->adapter_stopped = FALSE;
@@ -1703,6 +1784,14 @@ ixgbe_dev_stop(struct rte_eth_dev *dev)
 	memset(filter_info->fivetuple_mask, 0,
 		sizeof(uint32_t) * IXGBE_5TUPLE_ARRAY_SIZE);
 
+#ifdef RTE_NEXT_ABI
+	/* Clean datapath event and queue/vec mapping */
+	rte_intr_efd_disable(intr_handle);
+	if (intr_handle->intr_vec != NULL) {
+		rte_free(intr_handle->intr_vec);
+		intr_handle->intr_vec = NULL;
+	}
+#endif
 }
 
 /*
@@ -2298,6 +2387,30 @@ ixgbe_dev_lsc_interrupt_setup(struct rte_eth_dev *dev)
 	return 0;
 }
 
+/**
+ * It clears the interrupt causes and enables the interrupt.
+ * It will be called once only during nic initialized.
+ *
+ * @param dev
+ *  Pointer to struct rte_eth_dev.
+ *
+ * @return
+ *  - On success, zero.
+ *  - On failure, a negative value.
+ */
+#ifdef RTE_NEXT_ABI
+static int
+ixgbe_dev_rxq_interrupt_setup(struct rte_eth_dev *dev)
+{
+	struct ixgbe_interrupt *intr =
+		IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
+
+	intr->mask |= IXGBE_EICR_RTX_QUEUE;
+
+	return 0;
+}
+#endif
+
 /*
  * It reads ICR and sets flag (IXGBE_EICR_LSC) for the link_update.
  *
@@ -2324,10 +2437,10 @@ ixgbe_dev_interrupt_get_status(struct rte_eth_dev *dev)
 	PMD_DRV_LOG(INFO, "eicr %x", eicr);
 
 	intr->flags = 0;
-	if (eicr & IXGBE_EICR_LSC) {
-		/* set flag for async link update */
+
+	/* set flag for async link update */
+	if (eicr & IXGBE_EICR_LSC)
 		intr->flags |= IXGBE_FLAG_NEED_LINK_UPDATE;
-	}
 
 	if (eicr & IXGBE_EICR_MAILBOX)
 		intr->flags |= IXGBE_FLAG_MAILBOX;
@@ -2335,6 +2448,30 @@ ixgbe_dev_interrupt_get_status(struct rte_eth_dev *dev)
 	return 0;
 }
 
+static int
+ixgbevf_dev_interrupt_get_status(struct rte_eth_dev *dev)
+{
+	uint32_t eicr;
+	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct ixgbe_interrupt *intr =
+		IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
+
+	/* clear all cause mask */
+	ixgbevf_intr_disable(hw);
+
+	/* read-on-clear nic registers here */
+	eicr = IXGBE_READ_REG(hw, IXGBE_VTEICR);
+	PMD_DRV_LOG(INFO, "eicr %x", eicr);
+
+	intr->flags = 0;
+
+	/* set flag for async link update */
+	if (eicr & IXGBE_EICR_LSC)
+		intr->flags |= IXGBE_FLAG_NEED_LINK_UPDATE;
+
+	return 0;
+}
+
 /**
  * It gets and then prints the link status.
  *
@@ -2430,6 +2567,18 @@ ixgbe_dev_interrupt_action(struct rte_eth_dev *dev)
 	return 0;
 }
 
+static int
+ixgbevf_dev_interrupt_action(struct rte_eth_dev *dev)
+{
+	struct ixgbe_hw *hw =
+		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+
+	PMD_DRV_LOG(DEBUG, "enable intr immediately");
+	ixgbevf_intr_enable(hw);
+	rte_intr_enable(&dev->pci_dev->intr_handle);
+	return 0;
+}
+
 /**
  * Interrupt handler which shall be registered for alarm callback for delayed
  * handling specific interrupt to wait for the stable nic state. As the
@@ -2484,13 +2633,24 @@ ixgbe_dev_interrupt_delayed_handler(void *param)
  */
 static void
 ixgbe_dev_interrupt_handler(__rte_unused struct rte_intr_handle *handle,
-							void *param)
+			    void *param)
 {
 	struct rte_eth_dev *dev = (struct rte_eth_dev *)param;
+
 	ixgbe_dev_interrupt_get_status(dev);
 	ixgbe_dev_interrupt_action(dev);
 }
 
+static void
+ixgbevf_dev_interrupt_handler(__rte_unused struct rte_intr_handle *handle,
+			      void *param)
+{
+	struct rte_eth_dev *dev = (struct rte_eth_dev *)param;
+
+	ixgbevf_dev_interrupt_get_status(dev);
+	ixgbevf_dev_interrupt_action(dev);
+}
+
 static int
 ixgbe_dev_led_on(struct rte_eth_dev *dev)
 {
@@ -2988,6 +3148,19 @@ ixgbevf_intr_disable(struct ixgbe_hw *hw)
 	IXGBE_WRITE_FLUSH(hw);
 }
 
+static void
+ixgbevf_intr_enable(struct ixgbe_hw *hw)
+{
+	PMD_INIT_FUNC_TRACE();
+
+	/* VF enable interrupt autoclean */
+	IXGBE_WRITE_REG(hw, IXGBE_VTEIAM, IXGBE_VF_IRQ_ENABLE_MASK);
+	IXGBE_WRITE_REG(hw, IXGBE_VTEIAC, IXGBE_VF_IRQ_ENABLE_MASK);
+	IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, IXGBE_VF_IRQ_ENABLE_MASK);
+
+	IXGBE_WRITE_FLUSH(hw);
+}
+
 static int
 ixgbevf_dev_configure(struct rte_eth_dev *dev)
 {
@@ -3029,6 +3202,11 @@ ixgbevf_dev_start(struct rte_eth_dev *dev)
 {
 	struct ixgbe_hw *hw =
 		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+#ifdef RTE_NEXT_ABI
+	uint32_t intr_vector = 0;
+#endif
+	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+
 	int err, mask = 0;
 
 	PMD_INIT_FUNC_TRACE();
@@ -3059,6 +3237,42 @@ ixgbevf_dev_start(struct rte_eth_dev *dev)
 
 	ixgbevf_dev_rxtx_start(dev);
 
+#ifdef RTE_NEXT_ABI
+	/* check and configure queue intr-vector mapping */
+	if (dev->data->dev_conf.intr_conf.rxq != 0)
+		intr_vector = dev->data->nb_rx_queues;
+
+	if (rte_intr_efd_enable(intr_handle, intr_vector))
+		return -1;
+
+	if (rte_intr_dp_is_en(intr_handle) && !intr_handle->intr_vec) {
+		intr_handle->intr_vec =
+			rte_zmalloc("intr_vec",
+				    dev->data->nb_rx_queues * sizeof(int), 0);
+		if (intr_handle->intr_vec == NULL) {
+			PMD_INIT_LOG(ERR, "Failed to allocate %d rx_queues"
+				     " intr_vec\n", dev->data->nb_rx_queues);
+			return -ENOMEM;
+		}
+	}
+#endif
+	ixgbevf_configure_msix(dev);
+
+	if (dev->data->dev_conf.intr_conf.lsc != 0) {
+		if (rte_intr_allow_others(intr_handle))
+			rte_intr_callback_register(intr_handle,
+					       ixgbevf_dev_interrupt_handler,
+					       (void *)dev);
+		else
+			PMD_INIT_LOG(INFO, "lsc won't enable because of"
+				     " no intr multiplex\n");
+	}
+
+	rte_intr_enable(intr_handle);
+
+	/* Re-enable interrupt for VF */
+	ixgbevf_intr_enable(hw);
+
 	return 0;
 }
 
@@ -3066,6 +3280,7 @@ static void
 ixgbevf_dev_stop(struct rte_eth_dev *dev)
 {
 	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -3082,12 +3297,27 @@ ixgbevf_dev_stop(struct rte_eth_dev *dev)
 	dev->data->scattered_rx = 0;
 
 	ixgbe_dev_clear_queues(dev);
+
+	/* disable intr eventfd mapping */
+	rte_intr_disable(intr_handle);
+
+#ifdef RTE_NEXT_ABI
+	/* Clean datapath event and queue/vec mapping */
+	rte_intr_efd_disable(intr_handle);
+	if (intr_handle->intr_vec != NULL) {
+		rte_free(intr_handle->intr_vec);
+		intr_handle->intr_vec = NULL;
+	}
+#endif
 }
 
 static void
 ixgbevf_dev_close(struct rte_eth_dev *dev)
 {
 	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+#ifdef RTE_NEXT_ABI
+	struct rte_pci_device *pci_dev;
+#endif
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -3097,6 +3327,14 @@ ixgbevf_dev_close(struct rte_eth_dev *dev)
 
 	/* reprogram the RAR[0] in case user changed it. */
 	ixgbe_set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV);
+
+#ifdef RTE_NEXT_ABI
+	pci_dev = dev->pci_dev;
+	if (pci_dev->intr_handle.intr_vec) {
+		rte_free(pci_dev->intr_handle.intr_vec);
+		pci_dev->intr_handle.intr_vec = NULL;
+	}
+#endif
 }
 
 static void ixgbevf_set_vfta_all(struct rte_eth_dev *dev, bool on)
@@ -3614,6 +3852,269 @@ ixgbe_mirror_rule_reset(struct rte_eth_dev *dev, uint8_t rule_id)
 	return 0;
 }
 
+#ifdef RTE_NEXT_ABI
+static int
+ixgbevf_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
+{
+	uint32_t mask;
+	struct ixgbe_hw *hw =
+		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+
+	mask = IXGBE_READ_REG(hw, IXGBE_VTEIMS);
+	mask |= (1 << queue_id);
+	IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, mask);
+
+	rte_intr_enable(&dev->pci_dev->intr_handle);
+
+	return 0;
+}
+
+static int
+ixgbevf_dev_rx_queue_intr_disable(struct rte_eth_dev *dev, uint16_t queue_id)
+{
+	uint32_t mask;
+	struct ixgbe_hw *hw =
+		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+
+	mask = IXGBE_READ_REG(hw, IXGBE_VTEIMS);
+	mask &= ~(1 << queue_id);
+	IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, mask);
+
+	return 0;
+}
+
+static int
+ixgbe_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
+{
+	uint32_t mask;
+	struct ixgbe_hw *hw =
+		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct ixgbe_interrupt *intr =
+		IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
+
+	if (queue_id < 16) {
+		ixgbe_disable_intr(hw);
+		intr->mask |= (1 << queue_id);
+		ixgbe_enable_intr(dev);
+	} else if (queue_id < 32) {
+		mask = IXGBE_READ_REG(hw, IXGBE_EIMS_EX(0));
+		mask &= (1 << queue_id);
+		IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(0), mask);
+	} else if (queue_id < 64) {
+		mask = IXGBE_READ_REG(hw, IXGBE_EIMS_EX(1));
+		mask &= (1 << (queue_id - 32));
+		IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(1), mask);
+	}
+	rte_intr_enable(&dev->pci_dev->intr_handle);
+
+	return 0;
+}
+
+static int
+ixgbe_dev_rx_queue_intr_disable(struct rte_eth_dev *dev, uint16_t queue_id)
+{
+	uint32_t mask;
+	struct ixgbe_hw *hw =
+		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	struct ixgbe_interrupt *intr =
+		IXGBE_DEV_PRIVATE_TO_INTR(dev->data->dev_private);
+
+	if (queue_id < 16) {
+		ixgbe_disable_intr(hw);
+		intr->mask &= ~(1 << queue_id);
+		ixgbe_enable_intr(dev);
+	} else if (queue_id < 32) {
+		mask = IXGBE_READ_REG(hw, IXGBE_EIMS_EX(0));
+		mask &= ~(1 << queue_id);
+		IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(0), mask);
+	} else if (queue_id < 64) {
+		mask = IXGBE_READ_REG(hw, IXGBE_EIMS_EX(1));
+		mask &= ~(1 << (queue_id - 32));
+		IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(1), mask);
+	}
+
+	return 0;
+}
+
+static void
+ixgbevf_set_ivar_map(struct ixgbe_hw *hw, int8_t direction,
+		     uint8_t queue, uint8_t msix_vector)
+{
+	uint32_t tmp, idx;
+
+	if (direction == -1) {
+		/* other causes */
+		msix_vector |= IXGBE_IVAR_ALLOC_VAL;
+		tmp = IXGBE_READ_REG(hw, IXGBE_VTIVAR_MISC);
+		tmp &= ~0xFF;
+		tmp |= msix_vector;
+		IXGBE_WRITE_REG(hw, IXGBE_VTIVAR_MISC, tmp);
+	} else {
+		/* rx or tx cause */
+		msix_vector |= IXGBE_IVAR_ALLOC_VAL;
+		idx = ((16 * (queue & 1)) + (8 * direction));
+		tmp = IXGBE_READ_REG(hw, IXGBE_VTIVAR(queue >> 1));
+		tmp &= ~(0xFF << idx);
+		tmp |= (msix_vector << idx);
+		IXGBE_WRITE_REG(hw, IXGBE_VTIVAR(queue >> 1), tmp);
+	}
+}
+
+/**
+ * set the IVAR registers, mapping interrupt causes to vectors
+ * @param hw
+ *  pointer to ixgbe_hw struct
+ * @direction
+ *  0 for Rx, 1 for Tx, -1 for other causes
+ * @queue
+ *  queue to map the corresponding interrupt to
+ * @msix_vector
+ *  the vector to map to the corresponding queue
+ */
+static void
+ixgbe_set_ivar_map(struct ixgbe_hw *hw, int8_t direction,
+		   uint8_t queue, uint8_t msix_vector)
+{
+	uint32_t tmp, idx;
+
+	msix_vector |= IXGBE_IVAR_ALLOC_VAL;
+	if (hw->mac.type == ixgbe_mac_82598EB) {
+		if (direction == -1)
+			direction = 0;
+		idx = (((direction * 64) + queue) >> 2) & 0x1F;
+		tmp = IXGBE_READ_REG(hw, IXGBE_IVAR(idx));
+		tmp &= ~(0xFF << (8 * (queue & 0x3)));
+		tmp |= (msix_vector << (8 * (queue & 0x3)));
+		IXGBE_WRITE_REG(hw, IXGBE_IVAR(idx), tmp);
+	} else if ((hw->mac.type == ixgbe_mac_82599EB) ||
+			(hw->mac.type == ixgbe_mac_X540)) {
+		if (direction == -1) {
+			/* other causes */
+			idx = ((queue & 1) * 8);
+			tmp = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
+			tmp &= ~(0xFF << idx);
+			tmp |= (msix_vector << idx);
+			IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, tmp);
+		} else {
+			/* rx or tx causes */
+			idx = ((16 * (queue & 1)) + (8 * direction));
+			tmp = IXGBE_READ_REG(hw, IXGBE_IVAR(queue >> 1));
+			tmp &= ~(0xFF << idx);
+			tmp |= (msix_vector << idx);
+			IXGBE_WRITE_REG(hw, IXGBE_IVAR(queue >> 1), tmp);
+		}
+	}
+}
+#endif
+
+static void
+ixgbevf_configure_msix(struct rte_eth_dev *dev)
+{
+	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+#ifdef RTE_NEXT_ABI
+	struct ixgbe_hw *hw =
+		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	uint32_t q_idx;
+	uint32_t vector_idx = 0;
+#endif
+
+	/* won't configure msix register if no mapping is done
+	 * between intr vector and event fd.
+	 */
+	if (!rte_intr_dp_is_en(intr_handle))
+		return;
+
+#ifdef RTE_NEXT_ABI
+	/* Configure all RX queues of VF */
+	for (q_idx = 0; q_idx < dev->data->nb_rx_queues; q_idx++) {
+		/* Force all queue use vector 0,
+		 * as IXGBE_VF_MAXMSIVECOTR = 1
+		 */
+		ixgbevf_set_ivar_map(hw, 0, q_idx, vector_idx);
+		intr_handle->intr_vec[q_idx] = vector_idx;
+	}
+
+	/* Configure VF Rx queue ivar */
+	ixgbevf_set_ivar_map(hw, -1, 1, vector_idx);
+#endif
+}
+
+/**
+ * Sets up the hardware to properly generate MSI-X interrupts
+ * @hw
+ *  board private structure
+ */
+static void
+ixgbe_configure_msix(struct rte_eth_dev *dev)
+{
+	struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+#ifdef RTE_NEXT_ABI
+	struct ixgbe_hw *hw =
+		IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+	uint32_t queue_id, vec = 0;
+	uint32_t mask;
+	uint32_t gpie;
+#endif
+
+	/* won't configure msix register if no mapping is done
+	 * between intr vector and event fd
+	 */
+	if (!rte_intr_dp_is_en(intr_handle))
+		return;
+
+#ifdef RTE_NEXT_ABI
+	/* setup GPIE for MSI-x mode */
+	gpie = IXGBE_READ_REG(hw, IXGBE_GPIE);
+	gpie |= IXGBE_GPIE_MSIX_MODE | IXGBE_GPIE_PBA_SUPPORT |
+		IXGBE_GPIE_OCD | IXGBE_GPIE_EIAME;
+	/* auto clearing and auto setting corresponding bits in EIMS
+	 * when MSI-X interrupt is triggered
+	 */
+	if (hw->mac.type == ixgbe_mac_82598EB) {
+		IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE);
+	} else {
+		IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(0), 0xFFFFFFFF);
+		IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(1), 0xFFFFFFFF);
+	}
+	IXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie);
+
+	/* Populate the IVAR table and set the ITR values to the
+	 * corresponding register.
+	 */
+	for (queue_id = 0; queue_id < dev->data->nb_rx_queues;
+	     queue_id++) {
+		/* by default, 1:1 mapping */
+		ixgbe_set_ivar_map(hw, 0, queue_id, vec);
+		intr_handle->intr_vec[queue_id] = vec;
+		if (vec < intr_handle->nb_efd - 1)
+			vec++;
+	}
+
+	switch (hw->mac.type) {
+	case ixgbe_mac_82598EB:
+		ixgbe_set_ivar_map(hw, -1, IXGBE_IVAR_OTHER_CAUSES_INDEX,
+				   intr_handle->max_intr - 1);
+		break;
+	case ixgbe_mac_82599EB:
+	case ixgbe_mac_X540:
+		ixgbe_set_ivar_map(hw, -1, 1, intr_handle->max_intr - 1);
+		break;
+	default:
+		break;
+	}
+	IXGBE_WRITE_REG(hw, IXGBE_EITR(queue_id),
+			IXGBE_MIN_INTER_INTERRUPT_INTERVAL_DEFAULT & 0xFFF);
+
+	/* set up to autoclear timer, and the vectors */
+	mask = IXGBE_EIMS_ENABLE_MASK;
+	mask &= ~(IXGBE_EIMS_OTHER |
+		  IXGBE_EIMS_MAILBOX |
+		  IXGBE_EIMS_LSC);
+
+	IXGBE_WRITE_REG(hw, IXGBE_EIAC, mask);
+#endif
+}
+
 static int ixgbe_set_queue_rate_limit(struct rte_eth_dev *dev,
 	uint16_t queue_idx, uint16_t tx_rate)
 {
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.h b/drivers/net/ixgbe/ixgbe_ethdev.h
index 755b674..d813f65 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.h
+++ b/drivers/net/ixgbe/ixgbe_ethdev.h
@@ -117,6 +117,9 @@
 	ETH_RSS_IPV6_TCP_EX | \
 	ETH_RSS_IPV6_UDP_EX)
 
+#define IXGBE_VF_IRQ_ENABLE_MASK        3          /* vf irq enable mask */
+#define IXGBE_VF_MAXMSIVECTOR           1
+
 /*
  * Information about the fdir mode.
  */
@@ -330,6 +333,7 @@ uint32_t ixgbe_dev_rx_queue_count(struct rte_eth_dev *dev,
 		uint16_t rx_queue_id);
 
 int ixgbe_dev_rx_descriptor_done(void *rx_queue, uint16_t offset);
+int ixgbevf_dev_rx_descriptor_done(void *rx_queue, uint16_t offset);
 
 int ixgbe_dev_rx_init(struct rte_eth_dev *dev);
 
-- 
1.8.1.4

^ permalink raw reply	[relevance 1%]

* [dpdk-dev] [PATCH v14 10/13] ethdev: add rx intr enable, disable and ctl functions
  2015-07-17  6:16  4%   ` [dpdk-dev] [PATCH v14 00/13] " Cunming Liang
                       ` (5 preceding siblings ...)
  2015-07-17  6:16  8%     ` [dpdk-dev] [PATCH v14 08/13] eal/bsd: dummy for new intr definition Cunming Liang
@ 2015-07-17  6:16  3%     ` Cunming Liang
  2015-07-17  6:16  1%     ` [dpdk-dev] [PATCH v14 11/13] ixgbe: enable rx queue interrupts for both PF and VF Cunming Liang
                       ` (3 subsequent siblings)
  10 siblings, 0 replies; 200+ results
From: Cunming Liang @ 2015-07-17  6:16 UTC (permalink / raw)
  To: dev, thomas.monjalon, david.marchand; +Cc: shemming

The patch adds two dev_ops functions to enable and disable rx queue interrupts.
In addtion, it adds rte_eth_dev_rx_intr_ctl/rx_intr_q to support per port or per queue rx intr event set.

Signed-off-by: Danny Zhou <danny.zhou@intel.com>
Signed-off-by: Cunming Liang <cunming.liang@intel.com>
---
v14 changes
 - per-patch basis ABI compatibility rework
 - remove unnecessary 'local: *' from version map

v13 changes
 - version map cleanup for v2.1

v9 changes
 - remove unnecessary check after rte_eth_dev_is_valid_port.
   the same as http://www.dpdk.org/dev/patchwork/patch/4784

v8 changes
 - add addtion check for EEXIT

v7 changes
 - remove rx_intr_vec_get
 - add rx_intr_ctl and rx_intr_ctl_q

v6 changes
 - add rx_intr_vec_get to retrieve the vector num of the queue.

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

 lib/librte_ether/rte_ethdev.c          | 109 +++++++++++++++++++++++
 lib/librte_ether/rte_ethdev.h          | 154 +++++++++++++++++++++++++++++++++
 lib/librte_ether/rte_ether_version.map |   4 +
 3 files changed, 267 insertions(+)

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index ddf3658..d7aa840 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -3006,6 +3006,115 @@ _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
 	}
 	rte_spinlock_unlock(&rte_eth_dev_cb_lock);
 }
+
+#ifdef RTE_NEXT_ABI
+int
+rte_eth_dev_rx_intr_ctl(uint8_t port_id, int epfd, int op, void *data)
+{
+	uint32_t vec;
+	struct rte_eth_dev *dev;
+	struct rte_intr_handle *intr_handle;
+	uint16_t qid;
+	int rc;
+
+	if (!rte_eth_dev_is_valid_port(port_id)) {
+		PMD_DEBUG_TRACE("Invalid port_id=%u\n", port_id);
+		return -ENODEV;
+	}
+
+	dev = &rte_eth_devices[port_id];
+	intr_handle = &dev->pci_dev->intr_handle;
+	if (!intr_handle->intr_vec) {
+		PMD_DEBUG_TRACE("RX Intr vector unset\n");
+		return -EPERM;
+	}
+
+	for (qid = 0; qid < dev->data->nb_rx_queues; qid++) {
+		vec = intr_handle->intr_vec[qid];
+		rc = rte_intr_rx_ctl(intr_handle, epfd, op, vec, data);
+		if (rc && rc != -EEXIST) {
+			PMD_DEBUG_TRACE("p %u q %u rx ctl error"
+					" op %d epfd %d vec %u\n",
+					port_id, qid, op, epfd, vec);
+		}
+	}
+
+	return 0;
+}
+
+int
+rte_eth_dev_rx_intr_ctl_q(uint8_t port_id, uint16_t queue_id,
+			  int epfd, int op, void *data)
+{
+	uint32_t vec;
+	struct rte_eth_dev *dev;
+	struct rte_intr_handle *intr_handle;
+	int rc;
+
+	if (!rte_eth_dev_is_valid_port(port_id)) {
+		PMD_DEBUG_TRACE("Invalid port_id=%u\n", port_id);
+		return -ENODEV;
+	}
+
+	dev = &rte_eth_devices[port_id];
+	if (queue_id >= dev->data->nb_rx_queues) {
+		PMD_DEBUG_TRACE("Invalid RX queue_id=%u\n", queue_id);
+		return -EINVAL;
+	}
+
+	intr_handle = &dev->pci_dev->intr_handle;
+	if (!intr_handle->intr_vec) {
+		PMD_DEBUG_TRACE("RX Intr vector unset\n");
+		return -EPERM;
+	}
+
+	vec = intr_handle->intr_vec[queue_id];
+	rc = rte_intr_rx_ctl(intr_handle, epfd, op, vec, data);
+	if (rc && rc != -EEXIST) {
+		PMD_DEBUG_TRACE("p %u q %u rx ctl error"
+				" op %d epfd %d vec %u\n",
+				port_id, queue_id, op, epfd, vec);
+		return rc;
+	}
+
+	return 0;
+}
+
+int
+rte_eth_dev_rx_intr_enable(uint8_t port_id,
+			   uint16_t queue_id)
+{
+	struct rte_eth_dev *dev;
+
+	if (!rte_eth_dev_is_valid_port(port_id)) {
+		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
+		return -ENODEV;
+	}
+
+	dev = &rte_eth_devices[port_id];
+
+	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_intr_disable(uint8_t port_id,
+			    uint16_t queue_id)
+{
+	struct rte_eth_dev *dev;
+
+	if (!rte_eth_dev_is_valid_port(port_id)) {
+		PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
+		return -ENODEV;
+	}
+
+	dev = &rte_eth_devices[port_id];
+
+	FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_intr_disable, -ENOTSUP);
+	return (*dev->dev_ops->rx_queue_intr_disable)(dev, queue_id);
+}
+#endif
+
 #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 d76bbb3..602bd2b 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -834,6 +834,10 @@ struct rte_eth_fdir {
 struct rte_intr_conf {
 	/** enable/disable lsc interrupt. 0 (default) - disable, 1 enable */
 	uint16_t lsc;
+#ifdef RTE_NEXT_ABI
+	/** enable/disable rxq interrupt. 0 (default) - disable, 1 enable */
+	uint16_t rxq;
+#endif
 };
 
 /**
@@ -1042,6 +1046,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. */
 
@@ -1351,6 +1363,12 @@ struct eth_dev_ops {
 	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 */
+#ifdef RTE_NEXT_ABI
+	/**< Enable Rx queue interrupt. */
+	eth_rx_enable_intr_t       rx_queue_intr_enable;
+	/**< Disable Rx queue interrupt.*/
+	eth_rx_disable_intr_t      rx_queue_intr_disable;
+#endif
 	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. */
@@ -2907,6 +2925,142 @@ 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_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.
+ */
+#ifdef RTE_NEXT_ABI
+extern int
+rte_eth_dev_rx_intr_enable(uint8_t port_id, uint16_t queue_id);
+#else
+static inline int
+rte_eth_dev_rx_intr_enable(uint8_t port_id, uint16_t queue_id)
+{
+	RTE_SET_USED(port_id);
+	RTE_SET_USED(queue_id);
+	return -ENOTSUP;
+}
+#endif
+
+/**
+ * When lcore wakes up from rx interrupt indicating packet coming, disable rx
+ * interrupt and returns to polling mode.
+ *
+ * The rte_eth_dev_rx_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.
+ */
+#ifdef RTE_NEXT_ABI
+extern int
+rte_eth_dev_rx_intr_disable(uint8_t port_id, uint16_t queue_id);
+#else
+static inline int
+rte_eth_dev_rx_intr_disable(uint8_t port_id, uint16_t queue_id)
+{
+	RTE_SET_USED(port_id);
+	RTE_SET_USED(queue_id);
+	return -ENOTSUP;
+}
+#endif
+
+/**
+ * RX Interrupt control per port.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param epfd
+ *   Epoll instance fd which the intr vector associated to.
+ *   Using RTE_EPOLL_PER_THREAD allows to use per thread epoll instance.
+ * @param op
+ *   The operation be performed for the vector.
+ *   Operation type of {RTE_INTR_EVENT_ADD, RTE_INTR_EVENT_DEL}.
+ * @param data
+ *   User raw data.
+ * @return
+ *   - On success, zero.
+ *   - On failure, a negative value.
+ */
+#ifdef RTE_NEXT_ABI
+extern int
+rte_eth_dev_rx_intr_ctl(uint8_t port_id, int epfd, int op, void *data);
+#else
+static inline int
+rte_eth_dev_rx_intr_ctl(uint8_t port_id, int epfd, int op, void *data)
+{
+	RTE_SET_USED(port_id);
+	RTE_SET_USED(epfd);
+	RTE_SET_USED(op);
+	RTE_SET_USED(data);
+	return -1;
+}
+#endif
+
+/**
+ * RX Interrupt control per queue.
+ *
+ * @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 epfd
+ *   Epoll instance fd which the intr vector associated to.
+ *   Using RTE_EPOLL_PER_THREAD allows to use per thread epoll instance.
+ * @param op
+ *   The operation be performed for the vector.
+ *   Operation type of {RTE_INTR_EVENT_ADD, RTE_INTR_EVENT_DEL}.
+ * @param data
+ *   User raw data.
+ * @return
+ *   - On success, zero.
+ *   - On failure, a negative value.
+ */
+#ifdef RTE_NEXT_ABI
+extern int
+rte_eth_dev_rx_intr_ctl_q(uint8_t port_id, uint16_t queue_id,
+			  int epfd, int op, void *data);
+#else
+static inline int
+rte_eth_dev_rx_intr_ctl_q(uint8_t port_id, uint16_t queue_id,
+			  int epfd, int op, void *data)
+{
+	RTE_SET_USED(port_id);
+	RTE_SET_USED(queue_id);
+	RTE_SET_USED(epfd);
+	RTE_SET_USED(op);
+	RTE_SET_USED(data);
+	return -1;
+}
+#endif
+
+/**
  * 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 39baf11..fa09d75 100644
--- a/lib/librte_ether/rte_ether_version.map
+++ b/lib/librte_ether/rte_ether_version.map
@@ -109,6 +109,10 @@ DPDK_2.0 {
 DPDK_2.1 {
 	global:
 
+	rte_eth_dev_rx_intr_ctl;
+	rte_eth_dev_rx_intr_ctl_q;
+	rte_eth_dev_rx_intr_disable;
+	rte_eth_dev_rx_intr_enable;
 	rte_eth_dev_set_mc_addr_list;
 	rte_eth_timesync_disable;
 	rte_eth_timesync_enable;
-- 
1.8.1.4

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v14 08/13] eal/bsd: dummy for new intr definition
  2015-07-17  6:16  4%   ` [dpdk-dev] [PATCH v14 00/13] " Cunming Liang
                       ` (4 preceding siblings ...)
  2015-07-17  6:16  3%     ` [dpdk-dev] [PATCH v14 06/13] eal/linux: standalone intr event fd create support Cunming Liang
@ 2015-07-17  6:16  8%     ` Cunming Liang
  2015-07-17  6:16  3%     ` [dpdk-dev] [PATCH v14 10/13] ethdev: add rx intr enable, disable and ctl functions Cunming Liang
                       ` (4 subsequent siblings)
  10 siblings, 0 replies; 200+ results
From: Cunming Liang @ 2015-07-17  6:16 UTC (permalink / raw)
  To: dev, thomas.monjalon, david.marchand; +Cc: shemming

To make bsd compiling happy with new intr changes.

Signed-off-by: Cunming Liang <cunming.liang@intel.com>
---
v14 changes
 - per-patch basis ABI compatibility rework

v13 changes
 - version map cleanup for v2.1

v12 changes
 - fix unused variables compiling warning

v8 changes
 - add stub for new function

v7 changes
 - remove stub 'linux only' function from source file

 lib/librte_eal/bsdapp/eal/eal_interrupts.c         | 28 +++++++
 .../bsdapp/eal/include/exec-env/rte_interrupts.h   | 85 ++++++++++++++++++++++
 lib/librte_eal/bsdapp/eal/rte_eal_version.map      |  5 ++
 3 files changed, 118 insertions(+)

diff --git a/lib/librte_eal/bsdapp/eal/eal_interrupts.c b/lib/librte_eal/bsdapp/eal/eal_interrupts.c
index 26a55c7..a550ece 100644
--- a/lib/librte_eal/bsdapp/eal/eal_interrupts.c
+++ b/lib/librte_eal/bsdapp/eal/eal_interrupts.c
@@ -68,3 +68,31 @@ rte_eal_intr_init(void)
 {
 	return 0;
 }
+
+int
+rte_intr_rx_ctl(struct rte_intr_handle *intr_handle,
+		int epfd, int op, unsigned int vec, void *data)
+{
+	RTE_SET_USED(intr_handle);
+	RTE_SET_USED(epfd);
+	RTE_SET_USED(op);
+	RTE_SET_USED(vec);
+	RTE_SET_USED(data);
+
+	return -ENOTSUP;
+}
+
+int
+rte_intr_efd_enable(struct rte_intr_handle *intr_handle, uint32_t nb_efd)
+{
+	RTE_SET_USED(intr_handle);
+	RTE_SET_USED(nb_efd);
+
+	return 0;
+}
+
+void
+rte_intr_efd_disable(struct rte_intr_handle *intr_handle)
+{
+	RTE_SET_USED(intr_handle);
+}
diff --git a/lib/librte_eal/bsdapp/eal/include/exec-env/rte_interrupts.h b/lib/librte_eal/bsdapp/eal/include/exec-env/rte_interrupts.h
index d4c388f..eaf5410 100644
--- a/lib/librte_eal/bsdapp/eal/include/exec-env/rte_interrupts.h
+++ b/lib/librte_eal/bsdapp/eal/include/exec-env/rte_interrupts.h
@@ -38,6 +38,8 @@
 #ifndef _RTE_LINUXAPP_INTERRUPTS_H_
 #define _RTE_LINUXAPP_INTERRUPTS_H_
 
+#include <rte_common.h>
+
 enum rte_intr_handle_type {
 	RTE_INTR_HANDLE_UNKNOWN = 0,
 	RTE_INTR_HANDLE_UIO,      /**< uio device handle */
@@ -50,6 +52,89 @@ struct rte_intr_handle {
 	int fd;                          /**< file descriptor */
 	int uio_cfg_fd;                  /**< UIO config file descriptor */
 	enum rte_intr_handle_type type;  /**< handle type */
+#ifdef RTE_NEXT_ABI
+	/**
+	 * RTE_NEXT_ABI will be removed from v2.2.
+	 * It's only used to avoid ABI(unannounced) broken in v2.1.
+	 * Make sure being aware of the impact before turning on the feature.
+	 */
+	int max_intr;                    /**< max interrupt requested */
+	uint32_t nb_efd;                 /**< number of available efds */
+	int *intr_vec;               /**< intr vector number array */
+#endif
 };
 
+/**
+ * @param intr_handle
+ *   Pointer to the interrupt handle.
+ * @param epfd
+ *   Epoll instance fd which the intr vector associated to.
+ * @param op
+ *   The operation be performed for the vector.
+ *   Operation type of {ADD, DEL}.
+ * @param vec
+ *   RX intr vector number added to the epoll instance wait list.
+ * @param data
+ *   User raw data.
+ * @return
+ *   - On success, zero.
+ *   - On failure, a negative value.
+ */
+int
+rte_intr_rx_ctl(struct rte_intr_handle *intr_handle,
+		int epfd, int op, unsigned int vec, void *data);
+
+/**
+ * It enables the fastpath event fds if it's necessary.
+ * It creates event fds when multi-vectors allowed,
+ * otherwise it multiplexes the single event fds.
+ *
+ * @param intr_handle
+ *   Pointer to the interrupt handle.
+ * @param nb_vec
+ *   Number of interrupt vector trying to enable.
+ * @return
+ *   - On success, zero.
+ *   - On failure, a negative value.
+ */
+int
+rte_intr_efd_enable(struct rte_intr_handle *intr_handle, uint32_t nb_efd);
+
+/**
+ * It disable the fastpath event fds.
+ * It deletes registered eventfds and closes the open fds.
+ *
+ * @param intr_handle
+ *   Pointer to the interrupt handle.
+ */
+void
+rte_intr_efd_disable(struct rte_intr_handle *intr_handle);
+
+/**
+ * The fastpath interrupt is enabled or not.
+ *
+ * @param intr_handle
+ *   Pointer to the interrupt handle.
+ */
+static inline int
+rte_intr_dp_is_en(struct rte_intr_handle *intr_handle)
+{
+	RTE_SET_USED(intr_handle);
+	return 0;
+}
+
+/**
+ * The interrupt handle instance allows other cause or not.
+ * Other cause stands for none fastpath interrupt.
+ *
+ * @param intr_handle
+ *   Pointer to the interrupt handle.
+ */
+static inline int
+rte_intr_allow_others(struct rte_intr_handle *intr_handle)
+{
+	RTE_SET_USED(intr_handle);
+	return 1;
+}
+
 #endif /* _RTE_LINUXAPP_INTERRUPTS_H_ */
diff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
index e537b42..b527ad4 100644
--- a/lib/librte_eal/bsdapp/eal/rte_eal_version.map
+++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
@@ -116,4 +116,9 @@ DPDK_2.1 {
 	global:
 
 	rte_memzone_free;
+	rte_intr_allow_others;
+	rte_intr_dp_is_en;
+	rte_intr_efd_enable;
+	rte_intr_efd_disable;
+	rte_intr_rx_ctl;
 } DPDK_2.0;
-- 
1.8.1.4

^ permalink raw reply	[relevance 8%]

* [dpdk-dev] [PATCH v14 06/13] eal/linux: standalone intr event fd create support
  2015-07-17  6:16  4%   ` [dpdk-dev] [PATCH v14 00/13] " Cunming Liang
                       ` (3 preceding siblings ...)
  2015-07-17  6:16  3%     ` [dpdk-dev] [PATCH v14 05/13] eal/linux: map eventfd to VFIO MSI-X intr vector Cunming Liang
@ 2015-07-17  6:16  3%     ` Cunming Liang
  2015-07-17  6:16  8%     ` [dpdk-dev] [PATCH v14 08/13] eal/bsd: dummy for new intr definition Cunming Liang
                       ` (5 subsequent siblings)
  10 siblings, 0 replies; 200+ results
From: Cunming Liang @ 2015-07-17  6:16 UTC (permalink / raw)
  To: dev, thomas.monjalon, david.marchand; +Cc: shemming

The patch exposes intr event fd create and release for PMD.
The device driver can assign the number of event associated with interrupt vector.
It also provides misc functions to check 1) allows other slowpath intr(e.g. lsc);
2) intr event on fastpath is enabled or not.

Signed-off-by: Cunming Liang <cunming.liang@intel.com>
---
v14 changes
 - per-patch basis ABI compatibility rework
 - minor changes on API decription comments

v13 changes
 - version map cleanup for v2.1

v11 changes
 - typo cleanup

 lib/librte_eal/linuxapp/eal/eal_interrupts.c       | 57 ++++++++++++++
 .../linuxapp/eal/include/exec-env/rte_interrupts.h | 87 ++++++++++++++++++++++
 lib/librte_eal/linuxapp/eal/rte_eal_version.map    |  4 +
 3 files changed, 148 insertions(+)

diff --git a/lib/librte_eal/linuxapp/eal/eal_interrupts.c b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
index b18ab86..0266d98 100644
--- a/lib/librte_eal/linuxapp/eal/eal_interrupts.c
+++ b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
@@ -44,6 +44,7 @@
 #include <sys/epoll.h>
 #include <sys/signalfd.h>
 #include <sys/ioctl.h>
+#include <sys/eventfd.h>
 
 #include <rte_common.h>
 #include <rte_interrupts.h>
@@ -68,6 +69,7 @@
 #include "eal_vfio.h"
 
 #define EAL_INTR_EPOLL_WAIT_FOREVER (-1)
+#define NB_OTHER_INTR               1
 
 static RTE_DEFINE_PER_LCORE(int, _epfd) = -1; /**< epoll fd per thread */
 
@@ -1121,4 +1123,59 @@ rte_intr_rx_ctl(struct rte_intr_handle *intr_handle, int epfd,
 
 	return rc;
 }
+
+int
+rte_intr_efd_enable(struct rte_intr_handle *intr_handle, uint32_t nb_efd)
+{
+	uint32_t i;
+	int fd;
+	uint32_t n = RTE_MIN(nb_efd, (uint32_t)RTE_MAX_RXTX_INTR_VEC_ID);
+
+	if (intr_handle->type == RTE_INTR_HANDLE_VFIO_MSIX) {
+		for (i = 0; i < n; i++) {
+			fd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
+			if (fd < 0) {
+				RTE_LOG(ERR, EAL,
+					"cannot setup eventfd,"
+					"error %i (%s)\n",
+					errno, strerror(errno));
+				return -1;
+			}
+			intr_handle->efds[i] = fd;
+		}
+		intr_handle->nb_efd   = n;
+		intr_handle->max_intr = NB_OTHER_INTR + n;
+	} else {
+		intr_handle->efds[0]  = intr_handle->fd;
+		intr_handle->nb_efd   = RTE_MIN(nb_efd, 1U);
+		intr_handle->max_intr = NB_OTHER_INTR;
+	}
+
+	return 0;
+}
+
+void
+rte_intr_efd_disable(struct rte_intr_handle *intr_handle)
+{
+	uint32_t i;
+	struct rte_epoll_event *rev;
+
+	for (i = 0; i < intr_handle->nb_efd; i++) {
+		rev = &intr_handle->elist[i];
+		if (rev->status == RTE_EPOLL_INVALID)
+			continue;
+		if (rte_epoll_ctl(rev->epfd, EPOLL_CTL_DEL, rev->fd, rev)) {
+			/* force free if the entry valid */
+			eal_epoll_data_safe_free(rev);
+			rev->status = RTE_EPOLL_INVALID;
+		}
+	}
+
+	if (intr_handle->max_intr > intr_handle->nb_efd) {
+		for (i = 0; i < intr_handle->nb_efd; i++)
+			close(intr_handle->efds[i]);
+	}
+	intr_handle->nb_efd = 0;
+	intr_handle->max_intr = 0;
+}
 #endif
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 918246f..3f17f29 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
@@ -191,4 +191,91 @@ rte_intr_rx_ctl(struct rte_intr_handle *intr_handle,
 }
 #endif
 
+/**
+ * It enables the packet I/O interrupt event if it's necessary.
+ * It creates event fd for each interrupt vector when MSIX is used,
+ * otherwise it multiplexes a single event fd.
+ *
+ * @param intr_handle
+ *   Pointer to the interrupt handle.
+ * @param nb_vec
+ *   Number of interrupt vector trying to enable.
+ * @return
+ *   - On success, zero.
+ *   - On failure, a negative value.
+ */
+#ifdef RTE_NEXT_ABI
+extern int
+rte_intr_efd_enable(struct rte_intr_handle *intr_handle, uint32_t nb_efd);
+#else
+static inline int
+rte_intr_efd_enable(struct rte_intr_handle *intr_handle, uint32_t nb_efd)
+{
+	RTE_SET_USED(intr_handle);
+	RTE_SET_USED(nb_efd);
+	return 0;
+}
+#endif
+
+/**
+ * It disables the packet I/O interrupt event.
+ * It deletes registered eventfds and closes the open fds.
+ *
+ * @param intr_handle
+ *   Pointer to the interrupt handle.
+ */
+#ifdef RTE_NEXT_ABI
+extern void
+rte_intr_efd_disable(struct rte_intr_handle *intr_handle);
+#else
+static inline void
+rte_intr_efd_disable(struct rte_intr_handle *intr_handle)
+{
+	RTE_SET_USED(intr_handle);
+}
+#endif
+
+/**
+ * The packet I/O interrupt on datapath is enabled or not.
+ *
+ * @param intr_handle
+ *   Pointer to the interrupt handle.
+ */
+#ifdef RTE_NEXT_ABI
+static inline int
+rte_intr_dp_is_en(struct rte_intr_handle *intr_handle)
+{
+	return !(!intr_handle->nb_efd);
+}
+#else
+static inline int
+rte_intr_dp_is_en(struct rte_intr_handle *intr_handle)
+{
+	RTE_SET_USED(intr_handle);
+	return 0;
+}
+#endif
+
+/**
+ * The interrupt handle instance allows other causes or not.
+ * Other causes stand for any none packet I/O interrupts.
+ *
+ * @param intr_handle
+ *   Pointer to the interrupt handle.
+ */
+#ifdef RTE_NEXT_ABI
+static inline int
+rte_intr_allow_others(struct rte_intr_handle *intr_handle)
+{
+	return !!(intr_handle->max_intr - intr_handle->nb_efd);
+}
+#else
+static inline int
+rte_intr_allow_others(struct rte_intr_handle *intr_handle)
+{
+	RTE_SET_USED(intr_handle);
+	return 1;
+}
+#endif
+
 #endif /* _RTE_LINUXAPP_INTERRUPTS_H_ */
diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
index 1cd4cc5..a0d9cb2 100644
--- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map
+++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
@@ -117,6 +117,10 @@ DPDK_2.1 {
 
 	rte_epoll_ctl;
 	rte_epoll_wait;
+	rte_intr_allow_others;
+	rte_intr_dp_is_en;
+	rte_intr_efd_enable;
+	rte_intr_efd_disable;
 	rte_intr_rx_ctl;
 	rte_intr_tls_epfd;
 	rte_memzone_free;
-- 
1.8.1.4

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v14 05/13] eal/linux: map eventfd to VFIO MSI-X intr vector
  2015-07-17  6:16  4%   ` [dpdk-dev] [PATCH v14 00/13] " Cunming Liang
                       ` (2 preceding siblings ...)
  2015-07-17  6:16  2%     ` [dpdk-dev] [PATCH v14 03/13] eal/linux: add API to set rx interrupt event monitor Cunming Liang
@ 2015-07-17  6:16  3%     ` Cunming Liang
  2015-07-17  6:16  3%     ` [dpdk-dev] [PATCH v14 06/13] eal/linux: standalone intr event fd create support Cunming Liang
                       ` (6 subsequent siblings)
  10 siblings, 0 replies; 200+ results
From: Cunming Liang @ 2015-07-17  6:16 UTC (permalink / raw)
  To: dev, thomas.monjalon, david.marchand; +Cc: shemming

The patch assigns event fds to each vfio msix interrupt vector by ioctl.

Signed-off-by: Danny Zhou <danny.zhou@intel.com>
Signed-off-by: Cunming Liang <cunming.liang@intel.com>
---
v14 changes
 - per-patch basis ABI compatibility rework
 - reword commit comments

v8 changes
 - move eventfd creation out of the setup_interrupts to a standalone function

v7 changes
 - cleanup unnecessary code change
 - split event and intr operation to other patches

 lib/librte_eal/linuxapp/eal/eal_interrupts.c | 56 ++++++++++------------------
 1 file changed, 20 insertions(+), 36 deletions(-)

diff --git a/lib/librte_eal/linuxapp/eal/eal_interrupts.c b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
index cca2efd..b18ab86 100644
--- a/lib/librte_eal/linuxapp/eal/eal_interrupts.c
+++ b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
@@ -128,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) * (RTE_MAX_RXTX_INTR_VEC_ID + 1))
 
 /* enable legacy (INTx) interrupts */
 static int
@@ -245,23 +248,6 @@ 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;
 }
 
@@ -294,7 +280,7 @@ vfio_disable_msi(struct rte_intr_handle *intr_handle) {
 static int
 vfio_enable_msix(struct rte_intr_handle *intr_handle) {
 	int len, ret;
-	char irq_set_buf[IRQ_SET_BUF_LEN];
+	char irq_set_buf[MSIX_IRQ_SET_BUF_LEN];
 	struct vfio_irq_set *irq_set;
 	int *fd_ptr;
 
@@ -302,12 +288,26 @@ vfio_enable_msix(struct rte_intr_handle *intr_handle) {
 
 	irq_set = (struct vfio_irq_set *) irq_set_buf;
 	irq_set->argsz = len;
+#ifdef RTE_NEXT_ABI
+	if (!intr_handle->max_intr)
+		intr_handle->max_intr = 1;
+	else if (intr_handle->max_intr > RTE_MAX_RXTX_INTR_VEC_ID)
+		intr_handle->max_intr = RTE_MAX_RXTX_INTR_VEC_ID + 1;
+
+	irq_set->count = intr_handle->max_intr;
+#else
 	irq_set->count = 1;
+#endif
 	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;
+#ifdef RTE_NEXT_ABI
+	memcpy(fd_ptr, intr_handle->efds, sizeof(intr_handle->efds));
+	fd_ptr[intr_handle->max_intr - 1] = intr_handle->fd;
+#else
+	fd_ptr[0] = intr_handle->fd;
+#endif
 
 	ret = ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, irq_set);
 
@@ -317,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;
 }
 
@@ -340,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);
-- 
1.8.1.4

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v14 03/13] eal/linux: add API to set rx interrupt event monitor
  2015-07-17  6:16  4%   ` [dpdk-dev] [PATCH v14 00/13] " Cunming Liang
  2015-07-17  6:16  8%     ` [dpdk-dev] [PATCH v14 01/13] eal/linux: add interrupt vectors support in intr_handle Cunming Liang
  2015-07-17  6:16  2%     ` [dpdk-dev] [PATCH v14 02/13] eal/linux: add rte_epoll_wait/ctl support Cunming Liang
@ 2015-07-17  6:16  2%     ` Cunming Liang
  2015-07-17  6:16  3%     ` [dpdk-dev] [PATCH v14 05/13] eal/linux: map eventfd to VFIO MSI-X intr vector Cunming Liang
                       ` (7 subsequent siblings)
  10 siblings, 0 replies; 200+ results
From: Cunming Liang @ 2015-07-17  6:16 UTC (permalink / raw)
  To: dev, thomas.monjalon, david.marchand; +Cc: shemming

The patch adds 'rte_intr_rx_ctl' to add or delete interrupt vector events monitor on specified epoll instance.

Signed-off-by: Cunming Liang <cunming.liang@intel.com>
---
v14 changes
 - per-patch basis ABI compatibility rework
 - remove unnecessary 'local: *' from version map

v13 changes
 - version map cleanup for v2.1

v12 changes:
 - fix awkward line split in using RTE_LOG

v10 changes:
 - add RTE_INTR_HANDLE_UIO_INTX for uio_pci_generic

v8 changes
 - fix EWOULDBLOCK and EINTR processing
 - add event status check

v7 changes
 - rename rte_intr_rx_set to rte_intr_rx_ctl.
 - rte_intr_rx_ctl uses rte_epoll_ctl to register epoll event instance.
 - the intr rx event instance includes a intr process callback.

v6 changes
 - split rte_intr_wait_rx_pkt into two function, wait and set.
 - rewrite rte_intr_rx_wait/rte_intr_rx_set to remove queue visibility on eal.
 - rte_intr_rx_wait to support multiplexing.
 - allow epfd as input to support flexible event fd combination.

 lib/librte_eal/linuxapp/eal/eal_interrupts.c       | 105 +++++++++++++++++++++
 .../linuxapp/eal/include/exec-env/rte_interrupts.h |  38 ++++++++
 lib/librte_eal/linuxapp/eal/rte_eal_version.map    |   1 +
 3 files changed, 144 insertions(+)

diff --git a/lib/librte_eal/linuxapp/eal/eal_interrupts.c b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
index 5fe5b99..4e34abc 100644
--- a/lib/librte_eal/linuxapp/eal/eal_interrupts.c
+++ b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
@@ -897,6 +897,51 @@ rte_eal_intr_init(void)
 	return -ret;
 }
 
+#ifdef RTE_NEXT_ABI
+static void
+eal_intr_proc_rxtx_intr(int fd, const struct rte_intr_handle *intr_handle)
+{
+	union rte_intr_read_buffer buf;
+	int bytes_read = 1;
+
+	switch (intr_handle->type) {
+	case RTE_INTR_HANDLE_UIO:
+	case RTE_INTR_HANDLE_UIO_INTX:
+		bytes_read = sizeof(buf.uio_intr_count);
+		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;
+		RTE_LOG(INFO, EAL, "unexpected intr type\n");
+		break;
+	}
+
+	/**
+	 * read out to clear the ready-to-be-read flag
+	 * for epoll_wait.
+	 */
+	do {
+		bytes_read = read(fd, &buf, bytes_read);
+		if (bytes_read < 0) {
+			if (errno == EINTR || errno == EWOULDBLOCK ||
+			    errno == EAGAIN)
+				continue;
+			RTE_LOG(ERR, EAL,
+				"Error reading from fd %d: %s\n",
+				fd, strerror(errno));
+		} else if (bytes_read == 0)
+			RTE_LOG(ERR, EAL, "Read nothing from fd %d\n", fd);
+		return;
+	} while (1);
+}
+#endif
+
 static int
 eal_epoll_process_event(struct epoll_event *evs, unsigned int n,
 			struct rte_epoll_event *events)
@@ -1033,3 +1078,63 @@ rte_epoll_ctl(int epfd, int op, int fd,
 
 	return 0;
 }
+
+#ifdef RTE_NEXT_ABI
+int
+rte_intr_rx_ctl(struct rte_intr_handle *intr_handle, int epfd,
+		int op, unsigned int vec, void *data)
+{
+	struct rte_epoll_event *rev;
+	struct rte_epoll_data *epdata;
+	int epfd_op;
+	int rc = 0;
+
+	if (!intr_handle || intr_handle->nb_efd == 0 ||
+	    vec >= intr_handle->nb_efd) {
+		RTE_LOG(ERR, EAL, "Wrong intr vector number.\n");
+		return -EPERM;
+	}
+
+	switch (op) {
+	case RTE_INTR_EVENT_ADD:
+		epfd_op = EPOLL_CTL_ADD;
+		rev = &intr_handle->elist[vec];
+		if (rev->status != RTE_EPOLL_INVALID) {
+			RTE_LOG(INFO, EAL, "Event already been added.\n");
+			return -EEXIST;
+		}
+
+		/* attach to intr vector fd */
+		epdata = &rev->epdata;
+		epdata->event  = EPOLLIN | EPOLLPRI | EPOLLET;
+		epdata->data   = data;
+		epdata->cb_fun = (rte_intr_event_cb_t)eal_intr_proc_rxtx_intr;
+		epdata->cb_arg = (void *)intr_handle;
+		rc = rte_epoll_ctl(epfd, epfd_op, intr_handle->efds[vec], rev);
+		if (!rc)
+			RTE_LOG(DEBUG, EAL,
+				"efd %d associated with vec %d added on epfd %d"
+				"\n", rev->fd, vec, epfd);
+		else
+			rc = -EPERM;
+		break;
+	case RTE_INTR_EVENT_DEL:
+		epfd_op = EPOLL_CTL_DEL;
+		rev = &intr_handle->elist[vec];
+		if (rev->status == RTE_EPOLL_INVALID) {
+			RTE_LOG(INFO, EAL, "Event does not exist.\n");
+			return -EPERM;
+		}
+
+		rc = rte_epoll_ctl(rev->epfd, epfd_op, rev->fd, rev);
+		if (rc)
+			rc = -EPERM;
+		break;
+	default:
+		RTE_LOG(ERR, EAL, "event op type mismatch\n");
+		rc = -EPERM;
+	}
+
+	return rc;
+}
+#endif
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 b55b4ee..918246f 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,10 @@
 #ifndef _RTE_LINUXAPP_INTERRUPTS_H_
 #define _RTE_LINUXAPP_INTERRUPTS_H_
 
+#ifndef RTE_NEXT_ABI
+#include <rte_common.h>
+#endif
+
 #define RTE_MAX_RXTX_INTR_VEC_ID     32
 
 enum rte_intr_handle_type {
@@ -153,4 +157,38 @@ rte_epoll_ctl(int epfd, int op, int fd,
 int
 rte_intr_tls_epfd(void);
 
+/**
+ * @param intr_handle
+ *   Pointer to the interrupt handle.
+ * @param epfd
+ *   Epoll instance fd which the intr vector associated to.
+ * @param op
+ *   The operation be performed for the vector.
+ *   Operation type of {ADD, DEL}.
+ * @param vec
+ *   RX intr vector number added to the epoll instance wait list.
+ * @param data
+ *   User raw data.
+ * @return
+ *   - On success, zero.
+ *   - On failure, a negative value.
+ */
+#ifdef RTE_NEXT_ABI
+extern int
+rte_intr_rx_ctl(struct rte_intr_handle *intr_handle,
+		int epfd, int op, unsigned int vec, void *data);
+#else
+static inline int
+rte_intr_rx_ctl(struct rte_intr_handle *intr_handle,
+		int epfd, int op, unsigned int vec, void *data)
+{
+	RTE_SET_USED(intr_handle);
+	RTE_SET_USED(epfd);
+	RTE_SET_USED(op);
+	RTE_SET_USED(vec);
+	RTE_SET_USED(data);
+	return -ENOTSUP;
+}
+#endif
+
 #endif /* _RTE_LINUXAPP_INTERRUPTS_H_ */
diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
index 3c4c710..1cd4cc5 100644
--- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map
+++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
@@ -117,6 +117,7 @@ DPDK_2.1 {
 
 	rte_epoll_ctl;
 	rte_epoll_wait;
+	rte_intr_rx_ctl;
 	rte_intr_tls_epfd;
 	rte_memzone_free;
 } DPDK_2.0;
-- 
1.8.1.4

^ permalink raw reply	[relevance 2%]

* [dpdk-dev] [PATCH v14 02/13] eal/linux: add rte_epoll_wait/ctl support
  2015-07-17  6:16  4%   ` [dpdk-dev] [PATCH v14 00/13] " Cunming Liang
  2015-07-17  6:16  8%     ` [dpdk-dev] [PATCH v14 01/13] eal/linux: add interrupt vectors support in intr_handle Cunming Liang
@ 2015-07-17  6:16  2%     ` Cunming Liang
  2015-07-17  6:16  2%     ` [dpdk-dev] [PATCH v14 03/13] eal/linux: add API to set rx interrupt event monitor Cunming Liang
                       ` (8 subsequent siblings)
  10 siblings, 0 replies; 200+ results
From: Cunming Liang @ 2015-07-17  6:16 UTC (permalink / raw)
  To: dev, thomas.monjalon, david.marchand; +Cc: shemming

The patch adds 'rte_epoll_wait' and 'rte_epoll_ctl' for async event wakeup.
It defines 'struct rte_epoll_event' as the event param.
When the event fds add to a specified epoll instance, 'eptrs' will hold the rte_epoll_event object pointer.
The 'op' uses the same enum as epoll_wait/ctl does.
The epoll event support to carry a raw user data and to register a callback which is executed during wakeup.

Signed-off-by: Cunming Liang <cunming.liang@intel.com>
---
v14 changes
 - per-patch basis ABI compatibility rework
 - remove unnecessary 'local: *' from version map

v13 changes
 - version map cleanup for v2.1

v11 changes
 - cleanup spelling error

v9 changes
 - rework on coding style

v8 changes
 - support delete event in safety during the wakeup execution
 - add EINTR process during epoll_wait

v7 changes
 - split v6[4/8] into two patches, one for epoll event(this one)
   another for rx intr(next patch)
 - introduce rte_epoll_event definition
 - rte_epoll_wait/ctl for more generic RTE epoll API

v6 changes
 - split rte_intr_wait_rx_pkt into two function, wait and set.
 - rewrite rte_intr_rx_wait/rte_intr_rx_set to remove queue visibility on eal.
 - rte_intr_rx_wait to support multiplexing.
 - allow epfd as input to support flexible event fd combination.

 lib/librte_eal/linuxapp/eal/eal_interrupts.c       | 139 +++++++++++++++++++++
 .../linuxapp/eal/include/exec-env/rte_interrupts.h |  80 ++++++++++++
 lib/librte_eal/linuxapp/eal/rte_eal_version.map    |   3 +
 3 files changed, 222 insertions(+)

diff --git a/lib/librte_eal/linuxapp/eal/eal_interrupts.c b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
index b5f369e..5fe5b99 100644
--- a/lib/librte_eal/linuxapp/eal/eal_interrupts.c
+++ b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
@@ -69,6 +69,8 @@
 
 #define EAL_INTR_EPOLL_WAIT_FOREVER (-1)
 
+static RTE_DEFINE_PER_LCORE(int, _epfd) = -1; /**< epoll fd per thread */
+
 /**
  * union for pipe fds.
  */
@@ -894,3 +896,140 @@ rte_eal_intr_init(void)
 
 	return -ret;
 }
+
+static int
+eal_epoll_process_event(struct epoll_event *evs, unsigned int n,
+			struct rte_epoll_event *events)
+{
+	unsigned int i, count = 0;
+	struct rte_epoll_event *rev;
+
+	for (i = 0; i < n; i++) {
+		rev = evs[i].data.ptr;
+		if (!rev || !rte_atomic32_cmpset(&rev->status, RTE_EPOLL_VALID,
+						 RTE_EPOLL_EXEC))
+			continue;
+
+		events[count].status        = RTE_EPOLL_VALID;
+		events[count].fd            = rev->fd;
+		events[count].epfd          = rev->epfd;
+		events[count].epdata.event  = rev->epdata.event;
+		events[count].epdata.data   = rev->epdata.data;
+		if (rev->epdata.cb_fun)
+			rev->epdata.cb_fun(rev->fd,
+					   rev->epdata.cb_arg);
+
+		rte_compiler_barrier();
+		rev->status = RTE_EPOLL_VALID;
+		count++;
+	}
+	return count;
+}
+
+static inline int
+eal_init_tls_epfd(void)
+{
+	int pfd = epoll_create(255);
+
+	if (pfd < 0) {
+		RTE_LOG(ERR, EAL,
+			"Cannot create epoll instance\n");
+		return -1;
+	}
+	return pfd;
+}
+
+int
+rte_intr_tls_epfd(void)
+{
+	if (RTE_PER_LCORE(_epfd) == -1)
+		RTE_PER_LCORE(_epfd) = eal_init_tls_epfd();
+
+	return RTE_PER_LCORE(_epfd);
+}
+
+int
+rte_epoll_wait(int epfd, struct rte_epoll_event *events,
+	       int maxevents, int timeout)
+{
+	struct epoll_event evs[maxevents];
+	int rc;
+
+	if (!events) {
+		RTE_LOG(ERR, EAL, "rte_epoll_event can't be NULL\n");
+		return -1;
+	}
+
+	/* using per thread epoll fd */
+	if (epfd == RTE_EPOLL_PER_THREAD)
+		epfd = rte_intr_tls_epfd();
+
+	while (1) {
+		rc = epoll_wait(epfd, evs, maxevents, timeout);
+		if (likely(rc > 0)) {
+			/* epoll_wait has at least one fd ready to read */
+			rc = eal_epoll_process_event(evs, rc, events);
+			break;
+		} else if (rc < 0) {
+			if (errno == EINTR)
+				continue;
+			/* epoll_wait fail */
+			RTE_LOG(ERR, EAL, "epoll_wait returns with fail %s\n",
+				strerror(errno));
+			rc = -1;
+			break;
+		}
+	}
+
+	return rc;
+}
+
+static inline void
+eal_epoll_data_safe_free(struct rte_epoll_event *ev)
+{
+	while (!rte_atomic32_cmpset(&ev->status, RTE_EPOLL_VALID,
+				    RTE_EPOLL_INVALID))
+		while (ev->status != RTE_EPOLL_VALID)
+			rte_pause();
+	memset(&ev->epdata, 0, sizeof(ev->epdata));
+	ev->fd = -1;
+	ev->epfd = -1;
+}
+
+int
+rte_epoll_ctl(int epfd, int op, int fd,
+	      struct rte_epoll_event *event)
+{
+	struct epoll_event ev;
+
+	if (!event) {
+		RTE_LOG(ERR, EAL, "rte_epoll_event can't be NULL\n");
+		return -1;
+	}
+
+	/* using per thread epoll fd */
+	if (epfd == RTE_EPOLL_PER_THREAD)
+		epfd = rte_intr_tls_epfd();
+
+	if (op == EPOLL_CTL_ADD) {
+		event->status = RTE_EPOLL_VALID;
+		event->fd = fd;  /* ignore fd in event */
+		event->epfd = epfd;
+		ev.data.ptr = (void *)event;
+	}
+
+	ev.events = event->epdata.event;
+	if (epoll_ctl(epfd, op, fd, &ev) < 0) {
+		RTE_LOG(ERR, EAL, "Error op %d fd %d epoll_ctl, %s\n",
+			op, fd, strerror(errno));
+		if (op == EPOLL_CTL_ADD)
+			/* rollback status when CTL_ADD fail */
+			event->status = RTE_EPOLL_INVALID;
+		return -1;
+	}
+
+	if (op == EPOLL_CTL_DEL && event->status != RTE_EPOLL_INVALID)
+		eal_epoll_data_safe_free(event);
+
+	return 0;
+}
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 12b33c9..b55b4ee 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
@@ -51,6 +51,32 @@ enum rte_intr_handle_type {
 	RTE_INTR_HANDLE_MAX
 };
 
+#define RTE_INTR_EVENT_ADD            1UL
+#define RTE_INTR_EVENT_DEL            2UL
+
+typedef void (*rte_intr_event_cb_t)(int fd, void *arg);
+
+struct rte_epoll_data {
+	uint32_t event;               /**< event type */
+	void *data;                   /**< User data */
+	rte_intr_event_cb_t cb_fun;   /**< IN: callback fun */
+	void *cb_arg;	              /**< IN: callback arg */
+};
+
+enum {
+	RTE_EPOLL_INVALID = 0,
+	RTE_EPOLL_VALID,
+	RTE_EPOLL_EXEC,
+};
+
+/** interrupt epoll event obj, taken by epoll_event.ptr */
+struct rte_epoll_event {
+	volatile uint32_t status;  /**< OUT: event status */
+	int fd;                    /**< OUT: event fd */
+	int epfd;       /**< OUT: epoll instance the ev associated with */
+	struct rte_epoll_data epdata;
+};
+
 /** Handle for interrupts. */
 struct rte_intr_handle {
 	union {
@@ -69,8 +95,62 @@ struct rte_intr_handle {
 	uint32_t max_intr;             /**< max interrupt requested */
 	uint32_t nb_efd;               /**< number of available efd(event fd) */
 	int efds[RTE_MAX_RXTX_INTR_VEC_ID];  /**< intr vectors/efds mapping */
+	struct rte_epoll_event elist[RTE_MAX_RXTX_INTR_VEC_ID];
+				       /**< intr vector epoll event */
 	int *intr_vec;                 /**< intr vector number array */
 #endif
 };
 
+#define RTE_EPOLL_PER_THREAD        -1  /**< to hint using per thread epfd */
+
+/**
+ * It waits for events on the epoll instance.
+ *
+ * @param epfd
+ *   Epoll instance fd on which the caller wait for events.
+ * @param events
+ *   Memory area contains the events that will be available for the caller.
+ * @param maxevents
+ *   Up to maxevents are returned, must greater than zero.
+ * @param timeout
+ *   Specifying a timeout of -1 causes a block indefinitely.
+ *   Specifying a timeout equal to zero cause to return immediately.
+ * @return
+ *   - On success, returns the number of available event.
+ *   - On failure, a negative value.
+ */
+int
+rte_epoll_wait(int epfd, struct rte_epoll_event *events,
+	       int maxevents, int timeout);
+
+/**
+ * It performs control operations on epoll instance referred by the epfd.
+ * It requests that the operation op be performed for the target fd.
+ *
+ * @param epfd
+ *   Epoll instance fd on which the caller perform control operations.
+ * @param op
+ *   The operation be performed for the target fd.
+ * @param fd
+ *   The target fd on which the control ops perform.
+ * @param event
+ *   Describes the object linked to the fd.
+ *   Note: The caller must take care the object deletion after CTL_DEL.
+ * @return
+ *   - On success, zero.
+ *   - On failure, a negative value.
+ */
+int
+rte_epoll_ctl(int epfd, int op, int fd,
+	      struct rte_epoll_event *event);
+
+/**
+ * The function returns the per thread epoll instance.
+ *
+ * @return
+ *   epfd the epoll instance referred to.
+ */
+int
+rte_intr_tls_epfd(void);
+
 #endif /* _RTE_LINUXAPP_INTERRUPTS_H_ */
diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
index e537b42..3c4c710 100644
--- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map
+++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
@@ -115,5 +115,8 @@ DPDK_2.0 {
 DPDK_2.1 {
 	global:
 
+	rte_epoll_ctl;
+	rte_epoll_wait;
+	rte_intr_tls_epfd;
 	rte_memzone_free;
 } DPDK_2.0;
-- 
1.8.1.4

^ permalink raw reply	[relevance 2%]

* [dpdk-dev] [PATCH v14 01/13] eal/linux: add interrupt vectors support in intr_handle
  2015-07-17  6:16  4%   ` [dpdk-dev] [PATCH v14 00/13] " Cunming Liang
@ 2015-07-17  6:16  8%     ` Cunming Liang
  2015-07-19 23:31  0%       ` Thomas Monjalon
  2015-07-17  6:16  2%     ` [dpdk-dev] [PATCH v14 02/13] eal/linux: add rte_epoll_wait/ctl support Cunming Liang
                       ` (9 subsequent siblings)
  10 siblings, 1 reply; 200+ results
From: Cunming Liang @ 2015-07-17  6:16 UTC (permalink / raw)
  To: dev, thomas.monjalon, david.marchand; +Cc: shemming

The patch adds interrupt vectors support in rte_intr_handle.
'vec_en' is set when interrupt vectors are detected and associated event fds are set.
Those event fds are stored in efds[].
'intr_vec' is reserved for device driver to initialize the vector mapping table.

Signed-off-by: Danny Zhou <danny.zhou@intel.com>
Signed-off-by: Cunming Liang <cunming.liang@intel.com>
---
v14 changes
 - per-patch basis ABI compatibility rework

v7 changes:
 - add eptrs[], it's used to store the register rte_epoll_event instances.
 - add vec_en, to log the vector capability status.

v6 changes:
 - add mapping table between irq vector number and queue id.

v5 changes:
 - Create this new patch file for changed struct rte_intr_handle that
   other patches depend on, to avoid breaking git bisect.

 .../linuxapp/eal/include/exec-env/rte_interrupts.h          | 13 +++++++++++++
 1 file changed, 13 insertions(+)

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 bdeb3fc..12b33c9 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 RTE_MAX_RXTX_INTR_VEC_ID     32
+
 enum rte_intr_handle_type {
 	RTE_INTR_HANDLE_UNKNOWN = 0,
 	RTE_INTR_HANDLE_UIO,          /**< uio device handle */
@@ -58,6 +60,17 @@ struct rte_intr_handle {
 	};
 	int fd;	 /**< interrupt event file descriptor */
 	enum rte_intr_handle_type type;  /**< handle type */
+#ifdef RTE_NEXT_ABI
+	/**
+	 * RTE_NEXT_ABI will be removed from v2.2.
+	 * It's only used to avoid ABI(unannounced) broken in v2.1.
+	 * Make sure being aware of the impact before turning on the feature.
+	 */
+	uint32_t max_intr;             /**< max interrupt requested */
+	uint32_t nb_efd;               /**< number of available efd(event fd) */
+	int efds[RTE_MAX_RXTX_INTR_VEC_ID];  /**< intr vectors/efds mapping */
+	int *intr_vec;                 /**< intr vector number array */
+#endif
 };
 
 #endif /* _RTE_LINUXAPP_INTERRUPTS_H_ */
-- 
1.8.1.4

^ permalink raw reply	[relevance 8%]

* [dpdk-dev] [PATCH v14 00/13] Interrupt mode PMD
    @ 2015-07-17  6:16  4%   ` Cunming Liang
  2015-07-17  6:16  8%     ` [dpdk-dev] [PATCH v14 01/13] eal/linux: add interrupt vectors support in intr_handle Cunming Liang
                       ` (10 more replies)
  1 sibling, 11 replies; 200+ results
From: Cunming Liang @ 2015-07-17  6:16 UTC (permalink / raw)
  To: dev, thomas.monjalon, david.marchand; +Cc: shemming

v14 changes
 - per-patch basis ABI compatibility rework
 - remove unnecessary 'local: *' from version map
 - minor comments rework

v13 changes
 - version map cleanup for v2.1
 - replace RTE_EAL_RX_INTR by RTE_NEXT_ABI for ABI compatibility

Patch series v12
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
Acked-by: Danny Zhou <danny.zhou@intel.com>

v12 changes
 - bsd cleanup for unused variable warning
 - fix awkward line split in debug message

v11 changes
 - typo cleanup and check kernel style

v10 changes
 - code rework to return actual error code
 - bug fix for lsc when using uio_pci_generic

v9 changes
 - code rework to fix open comment
 - bug fix for igb lsc when both lsc and rxq are enabled in vfio-msix
 - new patch to turn off the feature by default so as to avoid v2.1 abi broken

v8 changes
 - remove condition check for only vfio-msix
 - add multiplex intr support when only one intr vector allowed
 - lsc and rxq interrupt runtime enable decision
 - add safe event delete while the event wakeup execution happens

v7 changes
 - decouple epoll event and intr operation
 - add condition check in the case intr vector is disabled
 - renaming some APIs

v6 changes
 - split rte_intr_wait_rx_pkt into two APIs 'wait' and 'set'.
 - rewrite rte_intr_rx_wait/rte_intr_rx_set.
 - using vector number instead of queue_id as interrupt API params.
 - patch reorder and split.

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. [FIXED]
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.

Cunming Liang (13):
  eal/linux: add interrupt vectors support in intr_handle
  eal/linux: add rte_epoll_wait/ctl support
  eal/linux: add API to set rx interrupt event monitor
  eal/linux: fix comments typo on vfio msi
  eal/linux: map eventfd to VFIO MSI-X intr vector
  eal/linux: standalone intr event fd create support
  eal/linux: fix lsc read error in uio_pci_generic
  eal/bsd: dummy for new intr definition
  eal/bsd: fix inappropriate linuxapp referred in bsd
  ethdev: add rx intr enable, disable and ctl functions
  ixgbe: enable rx queue interrupts for both PF and VF
  igb: enable rx queue interrupts for PF
  l3fwd-power: enable one-shot rx interrupt and polling/interrupt mode
    switch

 drivers/net/e1000/igb_ethdev.c                     | 311 ++++++++++--
 drivers/net/ixgbe/ixgbe_ethdev.c                   | 527 ++++++++++++++++++++-
 drivers/net/ixgbe/ixgbe_ethdev.h                   |   4 +
 examples/l3fwd-power/main.c                        | 202 ++++++--
 lib/librte_eal/bsdapp/eal/eal_interrupts.c         |  28 ++
 .../bsdapp/eal/include/exec-env/rte_interrupts.h   |  91 +++-
 lib/librte_eal/bsdapp/eal/rte_eal_version.map      |   5 +
 lib/librte_eal/linuxapp/eal/eal_interrupts.c       | 362 ++++++++++++--
 .../linuxapp/eal/include/exec-env/rte_interrupts.h | 218 +++++++++
 lib/librte_eal/linuxapp/eal/rte_eal_version.map    |   8 +
 lib/librte_ether/rte_ethdev.c                      | 109 +++++
 lib/librte_ether/rte_ethdev.h                      | 154 ++++++
 lib/librte_ether/rte_ether_version.map             |   4 +
 13 files changed, 1895 insertions(+), 128 deletions(-)

-- 
1.8.1.4

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v13 00/14] Interrupt mode PMD
  @ 2015-07-17  6:04  0%     ` Liang, Cunming
  0 siblings, 0 replies; 200+ results
From: Liang, Cunming @ 2015-07-17  6:04 UTC (permalink / raw)
  To: David Marchand; +Cc: Stephen Hemminger, dev, Wang, Liang-min


> -----Original Message-----
> From: David Marchand [mailto:david.marchand@6wind.com] 
> Sent: Thursday, July 09, 2015 9:59 PM
> To: Liang, Cunming
> Cc: dev@dpdk.org; Stephen Hemminger; Thomas Monjalon; Zhou, Danny; Wang, Liang-min; Richardson, Bruce; Liu, Yong; Neil Horman
> Subject: Re: [PATCH v13 00/14] Interrupt mode PMD

> On Fri, Jun 19, 2015 at 6:00 AM, Cunming Liang <cunming.liang@intel.com> wrote:
> v13 changes
> - version map cleanup for v2.1
> - replace RTE_EAL_RX_INTR by RTE_NEXT_ABI for ABI compatibility
>
> Please, this patchset ends with a patch that deals with ABI compatibility while it should do so on a per-patch basis.
> Besides, some patches are introducing stuff that is reworked in other patches without a clear reason.
> 
> Can you rework this to ease review and ensure patch atomicity ?
> 
> Thanks.
> 
> -- 
> David Marchand

Will split it, thanks.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code
  2015-07-13 10:26  7% [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code John McNamara
  2015-07-13 10:42  7% ` Neil Horman
@ 2015-07-16 22:22  4% ` Vlad Zolotarov
  2015-08-02 21:06  7%   ` Thomas Monjalon
  1 sibling, 1 reply; 200+ results
From: Vlad Zolotarov @ 2015-07-16 22:22 UTC (permalink / raw)
  To: John McNamara, dev



On 07/13/15 13:26, John McNamara wrote:
> Fix for ABI breakage introduced in LRO addition. Moves
> lro bitfield to the end of the struct/member.
>
> Fixes: 8eecb3295aed (ixgbe: add LRO support)
>
> Signed-off-by: John McNamara <john.mcnamara@intel.com>
> ---
>   lib/librte_ether/rte_ethdev.h | 4 ++--
>   1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
> index 79bde89..1c3ace1 100644
> --- a/lib/librte_ether/rte_ethdev.h
> +++ b/lib/librte_ether/rte_ethdev.h
> @@ -1578,9 +1578,9 @@ struct rte_eth_dev_data {
>   	uint8_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) */
> -		lro          : 1,  /**< RX LRO 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). */
> +		dev_started : 1,   /**< Device state: STARTED(1) / STOPPED(0). */
> +		lro         : 1;   /**< RX LRO is ON(1) / OFF(0) */

Acked-by: Vlad Zolotarov <vladz@cloudius-systems.com>

>   };
>   
>   /**

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v5 4/4] rte_sched: hide structure of port hierarchy
  @ 2015-07-16 21:34  3% ` Stephen Hemminger
  0 siblings, 0 replies; 200+ results
From: Stephen Hemminger @ 2015-07-16 21:34 UTC (permalink / raw)
  To: Cristian Dumitrescu; +Cc: dev

Right now the scheduler hierarchy is encoded as a bitfield
that is visible as part of the ABI. This creates an barrier
limiting future expansion of the hierarchy.

As a transistional step. hide the actual layout of the hierarchy
and mark the exposed structure as deprecated. This will allow for
expansion in later release.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 lib/librte_sched/rte_sched.c           | 54 ++++++++++++++++++++++++++++++++++
 lib/librte_sched/rte_sched.h           | 54 ++++++++++------------------------
 lib/librte_sched/rte_sched_version.map |  9 ++++++
 3 files changed, 79 insertions(+), 38 deletions(-)

diff --git a/lib/librte_sched/rte_sched.c b/lib/librte_sched/rte_sched.c
index ec565d2..4593af8 100644
--- a/lib/librte_sched/rte_sched.c
+++ b/lib/librte_sched/rte_sched.c
@@ -184,6 +184,21 @@ enum grinder_state {
 	e_GRINDER_READ_MBUF
 };
 
+/*
+ * Path through the scheduler hierarchy used by the scheduler enqueue
+ * operation to identify the destination queue for the current
+ * packet. Stored in the field pkt.hash.sched of struct rte_mbuf of
+ * each packet, typically written by the classification stage and read
+ * by scheduler enqueue.
+ */
+struct __rte_sched_port_hierarchy {
+	uint32_t queue:2;                /**< Queue ID (0 .. 3) */
+	uint32_t traffic_class:2;        /**< Traffic class ID (0 .. 3)*/
+	uint32_t pipe:20;                /**< Pipe ID */
+	uint32_t subport:6;              /**< Subport ID */
+	uint32_t color:2;                /**< Color */
+};
+
 struct rte_sched_grinder {
 	/* Pipe cache */
 	uint16_t pcache_qmask[RTE_SCHED_GRINDER_PCACHE_SIZE];
@@ -910,6 +925,45 @@ rte_sched_pipe_config(struct rte_sched_port *port,
 	return 0;
 }
 
+void
+rte_sched_port_pkt_write(struct rte_mbuf *pkt,
+			 uint32_t subport, uint32_t pipe, uint32_t traffic_class,
+			 uint32_t queue, enum rte_meter_color color)
+{
+	struct __rte_sched_port_hierarchy *sched
+		= (struct __rte_sched_port_hierarchy *) &pkt->hash.sched;
+
+	sched->color = (uint32_t) color;
+	sched->subport = subport;
+	sched->pipe = pipe;
+	sched->traffic_class = traffic_class;
+	sched->queue = queue;
+}
+
+void
+rte_sched_port_pkt_read_tree_path(const struct rte_mbuf *pkt,
+				  uint32_t *subport, uint32_t *pipe,
+				  uint32_t *traffic_class, uint32_t *queue)
+{
+	const struct __rte_sched_port_hierarchy *sched
+		= (const struct __rte_sched_port_hierarchy *) &pkt->hash.sched;
+
+	*subport = sched->subport;
+	*pipe = sched->pipe;
+	*traffic_class = sched->traffic_class;
+	*queue = sched->queue;
+}
+
+
+enum rte_meter_color
+rte_sched_port_pkt_read_color(const struct rte_mbuf *pkt)
+{
+	const struct __rte_sched_port_hierarchy *sched
+		= (const struct __rte_sched_port_hierarchy *) &pkt->hash.sched;
+
+	return (enum rte_meter_color) sched->color;
+}
+
 int
 rte_sched_subport_read_stats(struct rte_sched_port *port,
 	uint32_t subport_id,
diff --git a/lib/librte_sched/rte_sched.h b/lib/librte_sched/rte_sched.h
index 729f8c8..1ead267 100644
--- a/lib/librte_sched/rte_sched.h
+++ b/lib/librte_sched/rte_sched.h
@@ -195,17 +195,19 @@ struct rte_sched_port_params {
 #endif
 };
 
-/** Path through the scheduler hierarchy used by the scheduler enqueue operation to
-identify the destination queue for the current packet. Stored in the field hash.sched
-of struct rte_mbuf of each packet, typically written by the classification stage and read by
-scheduler enqueue.*/
+/*
+ * Path through scheduler hierarchy
+ *
+ * Note: direct access to internal bitfields is deprecated to allow for future expansion.
+ * Use rte_sched_port_pkt_read/write API instead
+ */
 struct rte_sched_port_hierarchy {
 	uint32_t queue:2;                /**< Queue ID (0 .. 3) */
 	uint32_t traffic_class:2;        /**< Traffic class ID (0 .. 3)*/
 	uint32_t pipe:20;                /**< Pipe ID */
 	uint32_t subport:6;              /**< Subport ID */
 	uint32_t color:2;                /**< Color */
-};
+} __attribute__ ((deprecated));
 
 /*
  * Configuration
@@ -328,11 +330,6 @@ rte_sched_queue_read_stats(struct rte_sched_port *port,
 	struct rte_sched_queue_stats *stats,
 	uint16_t *qlen);
 
-/*
- * Run-time
- *
- ***/
-
 /**
  * Scheduler hierarchy path write to packet descriptor. Typically called by the
  * packet classification stage.
@@ -350,18 +347,10 @@ rte_sched_queue_read_stats(struct rte_sched_port *port,
  * @param color
  *   Packet color set
  */
-static inline void
+void
 rte_sched_port_pkt_write(struct rte_mbuf *pkt,
-	uint32_t subport, uint32_t pipe, uint32_t traffic_class, uint32_t queue, enum rte_meter_color color)
-{
-	struct rte_sched_port_hierarchy *sched = (struct rte_sched_port_hierarchy *) &pkt->hash.sched;
-
-	sched->color = (uint32_t) color;
-	sched->subport = subport;
-	sched->pipe = pipe;
-	sched->traffic_class = traffic_class;
-	sched->queue = queue;
-}
+			 uint32_t subport, uint32_t pipe, uint32_t traffic_class,
+			 uint32_t queue, enum rte_meter_color color);
 
 /**
  * Scheduler hierarchy path read from packet descriptor (struct rte_mbuf). Typically
@@ -380,24 +369,13 @@ rte_sched_port_pkt_write(struct rte_mbuf *pkt,
  *   Queue ID within pipe traffic class (0 .. 3)
  *
  */
-static inline void
-rte_sched_port_pkt_read_tree_path(struct rte_mbuf *pkt, uint32_t *subport, uint32_t *pipe, uint32_t *traffic_class, uint32_t *queue)
-{
-	struct rte_sched_port_hierarchy *sched = (struct rte_sched_port_hierarchy *) &pkt->hash.sched;
-
-	*subport = sched->subport;
-	*pipe = sched->pipe;
-	*traffic_class = sched->traffic_class;
-	*queue = sched->queue;
-}
-
-static inline enum rte_meter_color
-rte_sched_port_pkt_read_color(struct rte_mbuf *pkt)
-{
-	struct rte_sched_port_hierarchy *sched = (struct rte_sched_port_hierarchy *) &pkt->hash.sched;
+void
+rte_sched_port_pkt_read_tree_path(const struct rte_mbuf *pkt,
+				  uint32_t *subport, uint32_t *pipe,
+				  uint32_t *traffic_class, uint32_t *queue);
 
-	return (enum rte_meter_color) sched->color;
-}
+enum rte_meter_color
+rte_sched_port_pkt_read_color(const struct rte_mbuf *pkt);
 
 /**
  * Hierarchical scheduler port enqueue. Writes up to n_pkts to port scheduler and
diff --git a/lib/librte_sched/rte_sched_version.map b/lib/librte_sched/rte_sched_version.map
index 9f74e8b..3aa159a 100644
--- a/lib/librte_sched/rte_sched_version.map
+++ b/lib/librte_sched/rte_sched_version.map
@@ -20,3 +20,12 @@ DPDK_2.0 {
 
 	local: *;
 };
+
+DPDK_2.1 {
+	global:
+
+	rte_sched_port_pkt_write;
+	rte_sched_port_pkt_read_tree_path;
+	rte_sched_port_pkt_read_color;
+
+} DPDK_2.0;
-- 
2.1.4

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for librte_sched
  2015-07-16 21:21 14% [dpdk-dev] [PATCH] doc: announce ABI change for librte_sched Stephen Hemminger
  2015-07-16 21:25  4% ` Dumitrescu, Cristian
@ 2015-07-16 21:28  4% ` Neil Horman
  2015-08-15  8:58  4%   ` Thomas Monjalon
  2015-07-23 10:18  4% ` Dumitrescu, Cristian
  2 siblings, 1 reply; 200+ results
From: Neil Horman @ 2015-07-16 21:28 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev

On Thu, Jul 16, 2015 at 02:21:39PM -0700, Stephen Hemminger wrote:
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
>  doc/guides/rel_notes/abi.rst | 9 +++++++++
>  1 file changed, 9 insertions(+)
> 
> diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst
> index 9e98d62..a4d100b 100644
> --- a/doc/guides/rel_notes/abi.rst
> +++ b/doc/guides/rel_notes/abi.rst
> @@ -34,3 +34,12 @@ Deprecation Notices
>    creates a dummy/empty malloc library to fulfill binaries with dynamic linking
>    dependencies on librte_malloc.so. Such dummy library will not be created from
>    release 2.2 so binaries will need to be rebuilt.
> +
> +* librte_sched (rte_sched.h): The scheduler hierarchy structure
> +  (rte_sched_port_hierarchy) will change to allow for a larger number of subport
> +  entries. The number of available traffic_classes and queues may also change.
> +  The mbuf structure element for sched hierarchy will also change from a single
> +  32 bit to a 64 bit structure.
> +
> +* librte_sched (rte_sched.h): The scheduler statistics structure will change
> +  to allow keeping track of RED actions.
> -- 
> 2.1.4
> 
> 
ACK

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for librte_sched
  2015-07-16 21:21 14% [dpdk-dev] [PATCH] doc: announce ABI change for librte_sched Stephen Hemminger
@ 2015-07-16 21:25  4% ` Dumitrescu, Cristian
  2015-07-16 21:28  4% ` Neil Horman
  2015-07-23 10:18  4% ` Dumitrescu, Cristian
  2 siblings, 0 replies; 200+ results
From: Dumitrescu, Cristian @ 2015-07-16 21:25 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev



> -----Original Message-----
> From: Stephen Hemminger [mailto:stephen@networkplumber.org]
> Sent: Thursday, July 16, 2015 10:22 PM
> To: Dumitrescu, Cristian
> Cc: dev@dpdk.org; Stephen Hemminger
> Subject: [PATCH] doc: announce ABI change for librte_sched
> 
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
>  doc/guides/rel_notes/abi.rst | 9 +++++++++
>  1 file changed, 9 insertions(+)
> 
> diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst
> index 9e98d62..a4d100b 100644
> --- a/doc/guides/rel_notes/abi.rst
> +++ b/doc/guides/rel_notes/abi.rst
> @@ -34,3 +34,12 @@ Deprecation Notices
>    creates a dummy/empty malloc library to fulfill binaries with dynamic linking
>    dependencies on librte_malloc.so. Such dummy library will not be created
> from
>    release 2.2 so binaries will need to be rebuilt.
> +
> +* librte_sched (rte_sched.h): The scheduler hierarchy structure
> +  (rte_sched_port_hierarchy) will change to allow for a larger number of
> subport
> +  entries. The number of available traffic_classes and queues may also
> change.
> +  The mbuf structure element for sched hierarchy will also change from a
> single
> +  32 bit to a 64 bit structure.
> +
> +* librte_sched (rte_sched.h): The scheduler statistics structure will change
> +  to allow keeping track of RED actions.
> --
> 2.1.4

Hi Stephen,

Agree with both, how about the new clear flag to the stats read function, shall we add a separate note on this as well?

Thanks,
Cristian

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH] doc: announce ABI change for librte_sched
@ 2015-07-16 21:21 14% Stephen Hemminger
  2015-07-16 21:25  4% ` Dumitrescu, Cristian
                   ` (2 more replies)
  0 siblings, 3 replies; 200+ results
From: Stephen Hemminger @ 2015-07-16 21:21 UTC (permalink / raw)
  To: Cristian Dumitrescu; +Cc: dev

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 doc/guides/rel_notes/abi.rst | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst
index 9e98d62..a4d100b 100644
--- a/doc/guides/rel_notes/abi.rst
+++ b/doc/guides/rel_notes/abi.rst
@@ -34,3 +34,12 @@ Deprecation Notices
   creates a dummy/empty malloc library to fulfill binaries with dynamic linking
   dependencies on librte_malloc.so. Such dummy library will not be created from
   release 2.2 so binaries will need to be rebuilt.
+
+* librte_sched (rte_sched.h): The scheduler hierarchy structure
+  (rte_sched_port_hierarchy) will change to allow for a larger number of subport
+  entries. The number of available traffic_classes and queues may also change.
+  The mbuf structure element for sched hierarchy will also change from a single
+  32 bit to a 64 bit structure.
+
+* librte_sched (rte_sched.h): The scheduler statistics structure will change
+  to allow keeping track of RED actions.
-- 
2.1.4

^ permalink raw reply	[relevance 14%]

* [dpdk-dev] [PATCH] doc: announce ABI change for librte_pipeline
@ 2015-07-16 17:07 14% Cristian Dumitrescu
  2015-07-17  7:54  4% ` Gajdzica, MaciejX T
                   ` (2 more replies)
  0 siblings, 3 replies; 200+ results
From: Cristian Dumitrescu @ 2015-07-16 17:07 UTC (permalink / raw)
  To: dev


Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
---
 doc/guides/rel_notes/abi.rst |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst
index 9e98d62..194e8c6 100644
--- a/doc/guides/rel_notes/abi.rst
+++ b/doc/guides/rel_notes/abi.rst
@@ -34,3 +34,8 @@ Deprecation Notices
   creates a dummy/empty malloc library to fulfill binaries with dynamic linking
   dependencies on librte_malloc.so. Such dummy library will not be created from
   release 2.2 so binaries will need to be rebuilt.
+
+* librte_pipeline (rte_pipeline.h): The prototype for the pipeline input port,
+  output port and table action handlers will be updated: the pipeline parameter
+  will be added, the packets mask parameter will be either removed (for input
+  port action handler) or made input-only.
-- 
1.7.4.1

^ permalink raw reply	[relevance 14%]

* [dpdk-dev] [PATCH] doc: announce ABI change for librte_table
@ 2015-07-16 16:59 14% Cristian Dumitrescu
  2015-07-17  7:54  4% ` Gajdzica, MaciejX T
                   ` (2 more replies)
  0 siblings, 3 replies; 200+ results
From: Cristian Dumitrescu @ 2015-07-16 16:59 UTC (permalink / raw)
  To: dev


Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
---
 doc/guides/rel_notes/abi.rst |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)

diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst
index 9e98d62..aa7c036 100644
--- a/doc/guides/rel_notes/abi.rst
+++ b/doc/guides/rel_notes/abi.rst
@@ -34,3 +34,11 @@ Deprecation Notices
   creates a dummy/empty malloc library to fulfill binaries with dynamic linking
   dependencies on librte_malloc.so. Such dummy library will not be created from
   release 2.2 so binaries will need to be rebuilt.
+
+* librte_table (rte_table_lpm.h): A new parameter to hold the table name (const
+  char *name) will be added to the LPM table parameter structure
+  (struct rte_table_lpm_params).
+
+* librte_table (rte_table_acl.h): Structures rte_table_acl_rule_add_params and
+  rte_table_acl_rule_delete_params will change to store an array of rules as
+  opposed to a single rule.
-- 
1.7.4.1

^ permalink raw reply	[relevance 14%]

* Re: [dpdk-dev] [PATCH v2] doc: announce ABI change for librte_port
  2015-07-16 15:27 14% [dpdk-dev] [PATCH v2] " Cristian Dumitrescu
@ 2015-07-16 15:51  4% ` Singh, Jasvinder
  2015-07-17  7:56  4% ` Gajdzica, MaciejX T
  2015-07-17  8:08  4% ` Mrzyglod, DanielX T
  2 siblings, 0 replies; 200+ results
From: Singh, Jasvinder @ 2015-07-16 15:51 UTC (permalink / raw)
  To: Dumitrescu, Cristian, dev



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Cristian Dumitrescu
> Sent: Thursday, July 16, 2015 4:27 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v2] doc: announce ABI change for librte_port
> 
> v2 changes:
> -text simplification
> 
> Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
> ---

Acked-by: Jasvinder Singh <jasvinder.singh@intel.com>

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v2] doc: announce ABI change for librte_port
@ 2015-07-16 15:27 14% Cristian Dumitrescu
  2015-07-16 15:51  4% ` Singh, Jasvinder
                   ` (2 more replies)
  0 siblings, 3 replies; 200+ results
From: Cristian Dumitrescu @ 2015-07-16 15:27 UTC (permalink / raw)
  To: dev

v2 changes: 
-text simplification

Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
---
 doc/guides/rel_notes/abi.rst |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst
index 9e98d62..6c064e2 100644
--- a/doc/guides/rel_notes/abi.rst
+++ b/doc/guides/rel_notes/abi.rst
@@ -34,3 +34,8 @@ Deprecation Notices
   creates a dummy/empty malloc library to fulfill binaries with dynamic linking
   dependencies on librte_malloc.so. Such dummy library will not be created from
   release 2.2 so binaries will need to be rebuilt.
+
+* librte_port (rte_port.h): Macros to access the packet meta-data stored within
+  the packet buffer will be adjusted to cover the packet mbuf structure as well,
+  as currently they are able to access any packet buffer location except the
+  packet mbuf structure.
-- 
1.7.4.1

^ permalink raw reply	[relevance 14%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for librte_port
  2015-07-16 12:25  4% ` Thomas Monjalon
@ 2015-07-16 15:09  4%   ` Dumitrescu, Cristian
  0 siblings, 0 replies; 200+ results
From: Dumitrescu, Cristian @ 2015-07-16 15:09 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev



> -----Original Message-----
> From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> Sent: Thursday, July 16, 2015 1:26 PM
> To: Dumitrescu, Cristian
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH] doc: announce ABI change for librte_port
> 
> 2015-07-16 13:19, Cristian Dumitrescu:
> > +* librte_port (rte_port.h): Macros to access the packet meta-data stored
> within
> > +  the packet buffer will be adjusted to cover the packet mbuf structure as
> well,
> > +  as currently they are able to access any packet buffer location except the
> > +  packet mbuf structure. The consequence is that applications currently
> using
> > +  these macros will have to adjust the value of the offset parameter of
> these
> > +  macros by increasing it with sizeof(struc rte_mbuf). The affected macros
> are:
> > +  RTE_MBUF_METADATA_UINT<8, 16, 32, 64>_PTR and
> > +  RTE_MBUF_METADATA_UINT<8, 16, 32, 64>. In terms of code changes,
> most likely
> > +  only the definition of RTE_MBUF_METADATA_UINT8_PTR macro will be
> changed from
> > +  ``(&((uint8_t *) &(mbuf)[1])[offset])`` to
> > +  ``(&((uint8_t *) (mbuf))[offset])``.
> 
> Cristian,
> General comment: you are too verbose :)
> Specifically on this patch: same comment ;)

No problem, will simplify and resend. Thanks, Thomas.

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for librte_port
  2015-07-16 12:19 14% [dpdk-dev] [PATCH] doc: announce ABI change for librte_port Cristian Dumitrescu
                   ` (2 preceding siblings ...)
  2015-07-16 12:30  4% ` Mrzyglod, DanielX T
@ 2015-07-16 12:49  4% ` Singh, Jasvinder
  3 siblings, 0 replies; 200+ results
From: Singh, Jasvinder @ 2015-07-16 12:49 UTC (permalink / raw)
  To: Dumitrescu, Cristian, dev



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Cristian Dumitrescu
> Sent: Thursday, July 16, 2015 1:20 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH] doc: announce ABI change for librte_port
> 
> 
> Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
> ---

Acked-by: Jasvinder Singh <jasvinder.singh@intel.com>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for librte_cfgfile
  2015-07-16 11:36 14% [dpdk-dev] [PATCH] doc: announce ABI change for librte_cfgfile Cristian Dumitrescu
  2015-07-16 11:50  4% ` Gajdzica, MaciejX T
  2015-07-16 12:28  4% ` Mrzyglod, DanielX T
@ 2015-07-16 12:49  4% ` Singh, Jasvinder
  2015-08-15  9:09  4%   ` Thomas Monjalon
  2 siblings, 1 reply; 200+ results
From: Singh, Jasvinder @ 2015-07-16 12:49 UTC (permalink / raw)
  To: Dumitrescu, Cristian, dev



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Cristian Dumitrescu
> Sent: Thursday, July 16, 2015 12:37 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH] doc: announce ABI change for librte_cfgfile
> 
> 
> Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
> ---

Acked-by: Jasvinder Singh <jasvinder.singh@intel.com>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for librte_cfgfile
  2015-07-16 11:36 14% [dpdk-dev] [PATCH] doc: announce ABI change for librte_cfgfile Cristian Dumitrescu
  2015-07-16 11:50  4% ` Gajdzica, MaciejX T
@ 2015-07-16 12:28  4% ` Mrzyglod, DanielX T
  2015-07-16 12:49  4% ` Singh, Jasvinder
  2 siblings, 0 replies; 200+ results
From: Mrzyglod, DanielX T @ 2015-07-16 12:28 UTC (permalink / raw)
  To: dev



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Cristian Dumitrescu
> Sent: Thursday, July 16, 2015 1:37 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH] doc: announce ABI change for librte_cfgfile
> 
> 
> Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
> ---
>  doc/guides/rel_notes/abi.rst |    5 +++++
>  1 files changed, 5 insertions(+), 0 deletions(-)
> 
> diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst
> index 126f73e..942f3ea 100644
> --- a/doc/guides/rel_notes/abi.rst
> +++ b/doc/guides/rel_notes/abi.rst
> @@ -29,3 +29,8 @@ Deprecation Notices
>    and several ``PKT_RX_`` flags will be removed, to support unified packet type
>    from release 2.1. Those changes may be enabled in the upcoming release 2.1
>    with CONFIG_RTE_NEXT_ABI.
> +
> +* librte_cfgfile (rte_cfgfile.h): In order to allow for longer names and values,
> +  the value of macros CFG_NAME_LEN and CFG_NAME_VAL will be increased.
> Most
> +  likely, the new values will be 64 and 256, respectively.
> +
> --
> 1.7.4.1

Acked-by: Daniel Mrzyglod <danielx.t.mrzyglod@intel.com> 

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for librte_port
  2015-07-16 12:19 14% [dpdk-dev] [PATCH] doc: announce ABI change for librte_port Cristian Dumitrescu
  2015-07-16 12:25  4% ` Gajdzica, MaciejX T
  2015-07-16 12:25  4% ` Thomas Monjalon
@ 2015-07-16 12:30  4% ` Mrzyglod, DanielX T
  2015-07-16 12:49  4% ` Singh, Jasvinder
  3 siblings, 0 replies; 200+ results
From: Mrzyglod, DanielX T @ 2015-07-16 12:30 UTC (permalink / raw)
  To: Dumitrescu, Cristian, dev



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Cristian Dumitrescu
> Sent: Thursday, July 16, 2015 2:20 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH] doc: announce ABI change for librte_port
> 
> 
> Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
> ---
>  doc/guides/rel_notes/abi.rst |   12 ++++++++++++
>  1 files changed, 12 insertions(+), 0 deletions(-)
> 
> diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst
> index 9e98d62..271e08e 100644
> --- a/doc/guides/rel_notes/abi.rst
> +++ b/doc/guides/rel_notes/abi.rst
> @@ -34,3 +34,15 @@ Deprecation Notices
>    creates a dummy/empty malloc library to fulfill binaries with dynamic linking
>    dependencies on librte_malloc.so. Such dummy library will not be created from
>    release 2.2 so binaries will need to be rebuilt.
> +
> +* librte_port (rte_port.h): Macros to access the packet meta-data stored within
> +  the packet buffer will be adjusted to cover the packet mbuf structure as well,
> +  as currently they are able to access any packet buffer location except the
> +  packet mbuf structure. The consequence is that applications currently using
> +  these macros will have to adjust the value of the offset parameter of these
> +  macros by increasing it with sizeof(struc rte_mbuf). The affected macros are:
> +  RTE_MBUF_METADATA_UINT<8, 16, 32, 64>_PTR and
> +  RTE_MBUF_METADATA_UINT<8, 16, 32, 64>. In terms of code changes, most
> likely
> +  only the definition of RTE_MBUF_METADATA_UINT8_PTR macro will be
> changed from
> +  ``(&((uint8_t *) &(mbuf)[1])[offset])`` to
> +  ``(&((uint8_t *) (mbuf))[offset])``.
> --
> 1.7.4.1

> 1.7.4.1


Acked-by: Daniel Mrzyglod <danielx.t.mrzyglod@intel.com>

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for librte_port
  2015-07-16 12:19 14% [dpdk-dev] [PATCH] doc: announce ABI change for librte_port Cristian Dumitrescu
  2015-07-16 12:25  4% ` Gajdzica, MaciejX T
@ 2015-07-16 12:25  4% ` Thomas Monjalon
  2015-07-16 15:09  4%   ` Dumitrescu, Cristian
  2015-07-16 12:30  4% ` Mrzyglod, DanielX T
  2015-07-16 12:49  4% ` Singh, Jasvinder
  3 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2015-07-16 12:25 UTC (permalink / raw)
  To: Cristian Dumitrescu; +Cc: dev

2015-07-16 13:19, Cristian Dumitrescu:
> +* librte_port (rte_port.h): Macros to access the packet meta-data stored within
> +  the packet buffer will be adjusted to cover the packet mbuf structure as well,
> +  as currently they are able to access any packet buffer location except the
> +  packet mbuf structure. The consequence is that applications currently using
> +  these macros will have to adjust the value of the offset parameter of these
> +  macros by increasing it with sizeof(struc rte_mbuf). The affected macros are:
> +  RTE_MBUF_METADATA_UINT<8, 16, 32, 64>_PTR and
> +  RTE_MBUF_METADATA_UINT<8, 16, 32, 64>. In terms of code changes, most likely
> +  only the definition of RTE_MBUF_METADATA_UINT8_PTR macro will be changed from
> +  ``(&((uint8_t *) &(mbuf)[1])[offset])`` to
> +  ``(&((uint8_t *) (mbuf))[offset])``.

Cristian,
General comment: you are too verbose :)
Specifically on this patch: same comment ;)

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for librte_port
  2015-07-16 12:19 14% [dpdk-dev] [PATCH] doc: announce ABI change for librte_port Cristian Dumitrescu
@ 2015-07-16 12:25  4% ` Gajdzica, MaciejX T
  2015-07-16 12:25  4% ` Thomas Monjalon
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 200+ results
From: Gajdzica, MaciejX T @ 2015-07-16 12:25 UTC (permalink / raw)
  To: Dumitrescu, Cristian, dev



> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Cristian Dumitrescu
> Sent: Thursday, July 16, 2015 2:20 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH] doc: announce ABI change for librte_port
> 
> 
> Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>

Acked-by: Maciej Gajdzica <maciejx.t.gajdzica@intel.com>

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH] doc: announce ABI change for librte_port
@ 2015-07-16 12:19 14% Cristian Dumitrescu
  2015-07-16 12:25  4% ` Gajdzica, MaciejX T
                   ` (3 more replies)
  0 siblings, 4 replies; 200+ results
From: Cristian Dumitrescu @ 2015-07-16 12:19 UTC (permalink / raw)
  To: dev


Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
---
 doc/guides/rel_notes/abi.rst |   12 ++++++++++++
 1 files changed, 12 insertions(+), 0 deletions(-)

diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst
index 9e98d62..271e08e 100644
--- a/doc/guides/rel_notes/abi.rst
+++ b/doc/guides/rel_notes/abi.rst
@@ -34,3 +34,15 @@ Deprecation Notices
   creates a dummy/empty malloc library to fulfill binaries with dynamic linking
   dependencies on librte_malloc.so. Such dummy library will not be created from
   release 2.2 so binaries will need to be rebuilt.
+
+* librte_port (rte_port.h): Macros to access the packet meta-data stored within
+  the packet buffer will be adjusted to cover the packet mbuf structure as well,
+  as currently they are able to access any packet buffer location except the
+  packet mbuf structure. The consequence is that applications currently using
+  these macros will have to adjust the value of the offset parameter of these
+  macros by increasing it with sizeof(struc rte_mbuf). The affected macros are:
+  RTE_MBUF_METADATA_UINT<8, 16, 32, 64>_PTR and
+  RTE_MBUF_METADATA_UINT<8, 16, 32, 64>. In terms of code changes, most likely
+  only the definition of RTE_MBUF_METADATA_UINT8_PTR macro will be changed from
+  ``(&((uint8_t *) &(mbuf)[1])[offset])`` to
+  ``(&((uint8_t *) (mbuf))[offset])``.
-- 
1.7.4.1

^ permalink raw reply	[relevance 14%]

* Re: [dpdk-dev] [PATCH] doc: announce ABI change for librte_cfgfile
  2015-07-16 11:36 14% [dpdk-dev] [PATCH] doc: announce ABI change for librte_cfgfile Cristian Dumitrescu
@ 2015-07-16 11:50  4% ` Gajdzica, MaciejX T
  2015-07-16 12:28  4% ` Mrzyglod, DanielX T
  2015-07-16 12:49  4% ` Singh, Jasvinder
  2 siblings, 0 replies; 200+ results
From: Gajdzica, MaciejX T @ 2015-07-16 11:50 UTC (permalink / raw)
  To: Dumitrescu, Cristian, dev

> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Cristian Dumitrescu
> Sent: Thursday, July 16, 2015 1:37 PM
> To: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH] doc: announce ABI change for librte_cfgfile
> 
> 
> Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>

Acked-by: Maciej Gajdzica <maciejx.t.gajdzica@intel.com>

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH] doc: announce ABI change for librte_cfgfile
@ 2015-07-16 11:36 14% Cristian Dumitrescu
  2015-07-16 11:50  4% ` Gajdzica, MaciejX T
                   ` (2 more replies)
  0 siblings, 3 replies; 200+ results
From: Cristian Dumitrescu @ 2015-07-16 11:36 UTC (permalink / raw)
  To: dev


Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
---
 doc/guides/rel_notes/abi.rst |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst
index 126f73e..942f3ea 100644
--- a/doc/guides/rel_notes/abi.rst
+++ b/doc/guides/rel_notes/abi.rst
@@ -29,3 +29,8 @@ Deprecation Notices
   and several ``PKT_RX_`` flags will be removed, to support unified packet type
   from release 2.1. Those changes may be enabled in the upcoming release 2.1
   with CONFIG_RTE_NEXT_ABI.
+
+* librte_cfgfile (rte_cfgfile.h): In order to allow for longer names and values,
+  the value of macros CFG_NAME_LEN and CFG_NAME_VAL will be increased. Most
+  likely, the new values will be 64 and 256, respectively.
+
-- 
1.7.4.1

^ permalink raw reply	[relevance 14%]

* Re: [dpdk-dev] [PATCH v6 0/9] Expose IXGBE extended stats to DPDK apps
  2015-07-15 13:11  3% [dpdk-dev] [PATCH v6 0/9] Expose IXGBE extended stats to DPDK apps Maryam Tahhan
  2015-07-15 13:11  9% ` [dpdk-dev] [PATCH v6 4/9] ethdev: remove HW specific stats in stats structs Maryam Tahhan
@ 2015-07-16  7:54  0% ` Olivier MATZ
  1 sibling, 0 replies; 200+ results
From: Olivier MATZ @ 2015-07-16  7:54 UTC (permalink / raw)
  To: Maryam Tahhan, dev

Hi Maryam,

On 07/15/2015 03:11 PM, Maryam Tahhan wrote:
> This patch set implements xstats_get() and xstats_reset() in dev_ops for
> ixgbe to expose detailed error statistics to DPDK applications. The
> dump_cfg application was extended to demonstrate the usage of
> retrieving statistics for DPDK interfaces and renamed to proc_info
> in order reflect this new functionality. This patch set also removes non
> generic statistics from the statistics strings at the ethdev level and
> marks the relevant registers as depricated in struct rte_eth_stats.
>
> v2:
>   - Fixed patch dependencies.
>   - Broke down patches into smaller logical changes.
>
> v3:
>   - Removes non-generic stats fields in rte_stats_strings and deprecates
>     the fields related to them in struct rte_eth_stats.
>   - Modifies rte_eth_xstats_get() to return generic stats and extended
>     stats.
>
> v4:
>   - Replace count use in the loop in ixgbe_dev_xstats_get() function
>     definition with i.
>   - Breakdown "ixgbe: add NIC specific stats removed from ethdev" into
>     two patches, one that adds the stats and another that extends
>     ierrors to include more error stats.
>   - Remove second call to ixgbe_dev_xstats_get() from
>     rte_eth_xstats_get().
>
> v5:
>   - Added documentation for proc_info.
>   - Fixed proc_info copyright year.
>   - Display queue stats for all devices in proc_info.
>
> v6:
>   - Modified the driver implementation of ixgbe_dev_xstats_get() so that
>     it doesn't worry about the generic stats written by the generic layer.
>
> Maryam Tahhan (9):
>    ixgbe: move stats register reads to a new function
>    ixgbe: add functions to get and reset xstats
>    ethdev: expose extended error stats
>    ethdev: remove HW specific stats in stats structs
>    ixgbe: add NIC specific stats removed from ethdev
>    ixgbe: return more errors in ierrors
>    app: remove dump_cfg
>    app: add a new app proc_info
>    doc: Add documentation for proc_info
>
>   MAINTAINERS                            |   4 +
>   app/Makefile                           |   2 +-
>   app/dump_cfg/Makefile                  |  45 -----
>   app/dump_cfg/main.c                    |  92 ---------
>   app/proc_info/Makefile                 |  45 +++++
>   app/proc_info/main.c                   | 354 +++++++++++++++++++++++++++++++++
>   doc/guides/rel_notes/abi.rst           |  12 ++
>   doc/guides/sample_app_ug/index.rst     |   1 +
>   doc/guides/sample_app_ug/proc_info.rst |  71 +++++++
>   drivers/net/ixgbe/ixgbe_ethdev.c       | 193 ++++++++++++++----
>   lib/librte_ether/rte_ethdev.c          |  40 ++--
>   lib/librte_ether/rte_ethdev.h          |  30 ++-
>   mk/rte.sdktest.mk                      |   4 +-
>   13 files changed, 685 insertions(+), 208 deletions(-)
>   delete mode 100644 app/dump_cfg/Makefile
>   delete mode 100644 app/dump_cfg/main.c
>   create mode 100644 app/proc_info/Makefile
>   create mode 100644 app/proc_info/main.c
>   create mode 100644 doc/guides/sample_app_ug/proc_info.rst
>   mode change 100644 => 100755 lib/librte_ether/rte_ethdev.c

Acked-by: Olivier Matz <olivier.matz@6wind.com>

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v10 00/19] unified packet type
  2015-07-15 23:00  0%   ` [dpdk-dev] [PATCH v10 00/19] unified packet type Thomas Monjalon
@ 2015-07-15 23:51  0%     ` Zhang, Helin
  0 siblings, 0 replies; 200+ results
From: Zhang, Helin @ 2015-07-15 23:51 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev



> -----Original Message-----
> From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> Sent: Wednesday, July 15, 2015 4:01 PM
> To: Zhang, Helin
> Cc: dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v10 00/19] unified packet type
> 
> 2015-07-10 00:31, Helin Zhang:
> > Currently only 6 bits which are stored in ol_flags are used to
> > indicate the packet types. This is not enough, as some NIC hardware
> > can recognize quite a lot of packet types, e.g i40e hardware can
> > recognize more than 150 packet types. Hiding those packet types hides
> > hardware offload capabilities which could be quite useful for improving
> performance and for end users.
> > So an unified packet types are needed to support all possible PMDs. A
> > 16 bits packet_type in mbuf structure can be changed to 32 bits and
> > used for this purpose. In addition, all packet types stored in ol_flag
> > field should be deleted at all, and 6 bits of ol_flags can be save as the benifit.
> >
> > Initially, 32 bits of packet_type can be divided into several sub
> > fields to indicate different packet type information of a packet. The
> > initial design is to divide those bits into fields for L2 types, L3
> > types, L4 types, tunnel types, inner L2 types, inner L3 types and
> > inner L4 types. All PMDs should translate the offloaded packet types
> > into these 7 fields of information, for user applications.
> >
> > To avoid breaking ABI compatibility, currently all the code changes
> > for unified packet type are disabled at compile time by default. Users
> > can enable it manually by defining the macro of RTE_NEXT_ABI. The code
> > changes will be valid by default in a future release, and the old
> > version will be deleted accordingly, after the ABI change process is done.
> 
> Applied with fixes for cxgbe and mlx4, thanks everyone
> 
> The macro RTE_ETH_IS_TUNNEL_PKT may need to take RTE_PTYPE_INNER_*
> into account.

Thank you so much!
Thanks to all the contributors!

Helin

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v3] doc: announce ABI changes planned for unified packet type
  @ 2015-07-15 23:37  4%     ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-07-15 23:37 UTC (permalink / raw)
  To: Zhang, Helin; +Cc: dev

> > The significant ABI changes of all shared libraries are planned to support
> > unified packet type which will be taken effect from release 2.2. Here
> > announces that ABI changes in detail.
> > 
> > Signed-off-by: Helin Zhang <helin.zhang@intel.com>
> Acked-by: Jingjing Wu <jingjing.wu@intel.com>

Applied with rewording to take new NEXT_ABI option into account.

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v10 00/19] unified packet type
      @ 2015-07-15 23:00  0%   ` Thomas Monjalon
  2015-07-15 23:51  0%     ` Zhang, Helin
  2 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2015-07-15 23:00 UTC (permalink / raw)
  To: Helin Zhang; +Cc: dev

2015-07-10 00:31, Helin Zhang:
> Currently only 6 bits which are stored in ol_flags are used to indicate the
> packet types. This is not enough, as some NIC hardware can recognize quite
> a lot of packet types, e.g i40e hardware can recognize more than 150 packet
> types. Hiding those packet types hides hardware offload capabilities which
> could be quite useful for improving performance and for end users.
> So an unified packet types are needed to support all possible PMDs. A 16
> bits packet_type in mbuf structure can be changed to 32 bits and used for
> this purpose. In addition, all packet types stored in ol_flag field should
> be deleted at all, and 6 bits of ol_flags can be save as the benifit.
> 
> Initially, 32 bits of packet_type can be divided into several sub fields to
> indicate different packet type information of a packet. The initial design
> is to divide those bits into fields for L2 types, L3 types, L4 types, tunnel
> types, inner L2 types, inner L3 types and inner L4 types. All PMDs should
> translate the offloaded packet types into these 7 fields of information, for
> user applications.
> 
> To avoid breaking ABI compatibility, currently all the code changes for
> unified packet type are disabled at compile time by default. Users can enable
> it manually by defining the macro of RTE_NEXT_ABI. The code changes will be
> valid by default in a future release, and the old version will be deleted
> accordingly, after the ABI change process is done.

Applied with fixes for cxgbe and mlx4, thanks everyone

The macro RTE_ETH_IS_TUNNEL_PKT may need to take RTE_PTYPE_INNER_* into account.

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v10 2/9] eal: memzone allocated by malloc
  2015-07-15 16:32  3%     ` [dpdk-dev] [PATCH v10 0/9] Dynamic memzones Sergio Gonzalez Monroy
@ 2015-07-15 16:32  1%       ` Sergio Gonzalez Monroy
  2015-07-15 16:32 19%       ` [dpdk-dev] [PATCH v10 8/9] doc: announce ABI change of librte_malloc Sergio Gonzalez Monroy
  1 sibling, 0 replies; 200+ results
From: Sergio Gonzalez Monroy @ 2015-07-15 16:32 UTC (permalink / raw)
  To: dev

In the current memory hierarchy, memsegs are groups of physically
contiguous hugepages, memzones are slices of memsegs and malloc further
slices memzones into smaller memory chunks.

This patch modifies malloc so it partitions memsegs instead of memzones.
Thus memzones would call malloc internally for memory allocation while
maintaining its ABI.

It would be possible to free memzones and therefore any other structure
based on memzones, ie. mempools

Signed-off-by: Sergio Gonzalez Monroy <sergio.gonzalez.monroy@intel.com>
---
 lib/librte_eal/common/eal_common_memzone.c        | 290 ++++++----------------
 lib/librte_eal/common/include/rte_eal_memconfig.h |   2 +-
 lib/librte_eal/common/include/rte_malloc_heap.h   |   3 +-
 lib/librte_eal/common/malloc_elem.c               |  68 +++--
 lib/librte_eal/common/malloc_elem.h               |  14 +-
 lib/librte_eal/common/malloc_heap.c               | 161 ++++++------
 lib/librte_eal/common/malloc_heap.h               |   6 +-
 lib/librte_eal/common/rte_malloc.c                |  10 +-
 lib/librte_eal/linuxapp/eal/eal_memory.c          |   2 +-
 9 files changed, 226 insertions(+), 330 deletions(-)

diff --git a/lib/librte_eal/common/eal_common_memzone.c b/lib/librte_eal/common/eal_common_memzone.c
index 9c1da71..31bf6d8 100644
--- a/lib/librte_eal/common/eal_common_memzone.c
+++ b/lib/librte_eal/common/eal_common_memzone.c
@@ -50,15 +50,15 @@
 #include <rte_string_fns.h>
 #include <rte_common.h>
 
+#include "malloc_heap.h"
+#include "malloc_elem.h"
 #include "eal_private.h"
 
-/* internal copy of free memory segments */
-static struct rte_memseg *free_memseg = NULL;
-
 static inline const struct rte_memzone *
 memzone_lookup_thread_unsafe(const char *name)
 {
 	const struct rte_mem_config *mcfg;
+	const struct rte_memzone *mz;
 	unsigned i = 0;
 
 	/* get pointer to global configuration */
@@ -68,62 +68,50 @@ memzone_lookup_thread_unsafe(const char *name)
 	 * the algorithm is not optimal (linear), but there are few
 	 * zones and this function should be called at init only
 	 */
-	for (i = 0; i < RTE_MAX_MEMZONE && mcfg->memzone[i].addr != NULL; i++) {
-		if (!strncmp(name, mcfg->memzone[i].name, RTE_MEMZONE_NAMESIZE))
+	for (i = 0; i < RTE_MAX_MEMZONE; i++) {
+		mz = &mcfg->memzone[i];
+		if (mz->addr != NULL && !strncmp(name, mz->name, RTE_MEMZONE_NAMESIZE))
 			return &mcfg->memzone[i];
 	}
 
 	return NULL;
 }
 
-/*
- * Helper function for memzone_reserve_aligned_thread_unsafe().
- * Calculate address offset from the start of the segment.
- * Align offset in that way that it satisfy istart alignmnet and
- * buffer of the  requested length would not cross specified boundary.
- */
-static inline phys_addr_t
-align_phys_boundary(const struct rte_memseg *ms, size_t len, size_t align,
-	size_t bound)
+/* This function will return the greatest free block if a heap has been
+ * specified. If no heap has been specified, it will return the heap and
+ * length of the greatest free block available in all heaps */
+static size_t
+find_heap_max_free_elem(int *s, unsigned align)
 {
-	phys_addr_t addr_offset, bmask, end, start;
-	size_t step;
-
-	step = RTE_MAX(align, bound);
-	bmask = ~((phys_addr_t)bound - 1);
-
-	/* calculate offset to closest alignment */
-	start = RTE_ALIGN_CEIL(ms->phys_addr, align);
-	addr_offset = start - ms->phys_addr;
+	struct rte_mem_config *mcfg;
+	struct rte_malloc_socket_stats stats;
+	int i, socket = *s;
+	size_t len = 0;
 
-	while (addr_offset + len < ms->len) {
+	/* get pointer to global configuration */
+	mcfg = rte_eal_get_configuration()->mem_config;
 
-		/* check, do we meet boundary condition */
-		end = start + len - (len != 0);
-		if ((start & bmask) == (end & bmask))
-			break;
+	for (i = 0; i < RTE_MAX_NUMA_NODES; i++) {
+		if ((socket != SOCKET_ID_ANY) && (socket != i))
+			continue;
 
-		/* calculate next offset */
-		start = RTE_ALIGN_CEIL(start + 1, step);
-		addr_offset = start - ms->phys_addr;
+		malloc_heap_get_stats(&mcfg->malloc_heaps[i], &stats);
+		if (stats.greatest_free_size > len) {
+			len = stats.greatest_free_size;
+			*s = i;
+		}
 	}
 
-	return addr_offset;
+	return (len - MALLOC_ELEM_OVERHEAD - align);
 }
 
 static const struct rte_memzone *
 memzone_reserve_aligned_thread_unsafe(const char *name, size_t len,
-		int socket_id, uint64_t size_mask, unsigned align,
-		unsigned bound)
+		int socket_id, unsigned flags, unsigned align, unsigned bound)
 {
 	struct rte_mem_config *mcfg;
-	unsigned i = 0;
-	int memseg_idx = -1;
-	uint64_t addr_offset, seg_offset = 0;
 	size_t requested_len;
-	size_t memseg_len = 0;
-	phys_addr_t memseg_physaddr;
-	void *memseg_addr;
+	int socket, i;
 
 	/* get pointer to global configuration */
 	mcfg = rte_eal_get_configuration()->mem_config;
@@ -155,7 +143,6 @@ memzone_reserve_aligned_thread_unsafe(const char *name, size_t len,
 	if (align < RTE_CACHE_LINE_SIZE)
 		align = RTE_CACHE_LINE_SIZE;
 
-
 	/* align length on cache boundary. Check for overflow before doing so */
 	if (len > SIZE_MAX - RTE_CACHE_LINE_MASK) {
 		rte_errno = EINVAL; /* requested size too big */
@@ -169,108 +156,65 @@ memzone_reserve_aligned_thread_unsafe(const char *name, size_t len,
 	requested_len = RTE_MAX((size_t)RTE_CACHE_LINE_SIZE,  len);
 
 	/* check that boundary condition is valid */
-	if (bound != 0 &&
-			(requested_len > bound || !rte_is_power_of_2(bound))) {
+	if (bound != 0 && (requested_len > bound || !rte_is_power_of_2(bound))) {
 		rte_errno = EINVAL;
 		return NULL;
 	}
 
-	/* find the smallest segment matching requirements */
-	for (i = 0; i < RTE_MAX_MEMSEG; i++) {
-		/* last segment */
-		if (free_memseg[i].addr == NULL)
-			break;
-
-		/* empty segment, skip it */
-		if (free_memseg[i].len == 0)
-			continue;
-
-		/* bad socket ID */
-		if (socket_id != SOCKET_ID_ANY &&
-		    free_memseg[i].socket_id != SOCKET_ID_ANY &&
-		    socket_id != free_memseg[i].socket_id)
-			continue;
-
-		/*
-		 * calculate offset to closest alignment that
-		 * meets boundary conditions.
-		 */
-		addr_offset = align_phys_boundary(free_memseg + i,
-			requested_len, align, bound);
+	if ((socket_id != SOCKET_ID_ANY) && (socket_id >= RTE_MAX_NUMA_NODES)) {
+		rte_errno = EINVAL;
+		return NULL;
+	}
 
-		/* check len */
-		if ((requested_len + addr_offset) > free_memseg[i].len)
-			continue;
+	if (!rte_eal_has_hugepages())
+		socket_id = SOCKET_ID_ANY;
 
-		if ((size_mask & free_memseg[i].hugepage_sz) == 0)
-			continue;
+	if (len == 0) {
+		if (bound != 0)
+			requested_len = bound;
+		else
+			requested_len = find_heap_max_free_elem(&socket_id, align);
+	}
 
-		/* this segment is the best until now */
-		if (memseg_idx == -1) {
-			memseg_idx = i;
-			memseg_len = free_memseg[i].len;
-			seg_offset = addr_offset;
-		}
-		/* find the biggest contiguous zone */
-		else if (len == 0) {
-			if (free_memseg[i].len > memseg_len) {
-				memseg_idx = i;
-				memseg_len = free_memseg[i].len;
-				seg_offset = addr_offset;
-			}
-		}
-		/*
-		 * find the smallest (we already checked that current
-		 * zone length is > len
-		 */
-		else if (free_memseg[i].len + align < memseg_len ||
-				(free_memseg[i].len <= memseg_len + align &&
-				addr_offset < seg_offset)) {
-			memseg_idx = i;
-			memseg_len = free_memseg[i].len;
-			seg_offset = addr_offset;
+	if (socket_id == SOCKET_ID_ANY)
+		socket = malloc_get_numa_socket();
+	else
+		socket = socket_id;
+
+	/* allocate memory on heap */
+	void *mz_addr = malloc_heap_alloc(&mcfg->malloc_heaps[socket], NULL,
+			requested_len, flags, align, bound);
+
+	if ((mz_addr == NULL) && (socket_id == SOCKET_ID_ANY)) {
+		/* try other heaps */
+		for (i = 0; i < RTE_MAX_NUMA_NODES; i++) {
+			if (socket == i)
+				continue;
+
+			mz_addr = malloc_heap_alloc(&mcfg->malloc_heaps[i],
+					NULL, requested_len, flags, align, bound);
+			if (mz_addr != NULL)
+				break;
 		}
 	}
 
-	/* no segment found */
-	if (memseg_idx == -1) {
+	if (mz_addr == NULL) {
 		rte_errno = ENOMEM;
 		return NULL;
 	}
 
-	/* save aligned physical and virtual addresses */
-	memseg_physaddr = free_memseg[memseg_idx].phys_addr + seg_offset;
-	memseg_addr = RTE_PTR_ADD(free_memseg[memseg_idx].addr,
-			(uintptr_t) seg_offset);
-
-	/* if we are looking for a biggest memzone */
-	if (len == 0) {
-		if (bound == 0)
-			requested_len = memseg_len - seg_offset;
-		else
-			requested_len = RTE_ALIGN_CEIL(memseg_physaddr + 1,
-				bound) - memseg_physaddr;
-	}
-
-	/* set length to correct value */
-	len = (size_t)seg_offset + requested_len;
-
-	/* update our internal state */
-	free_memseg[memseg_idx].len -= len;
-	free_memseg[memseg_idx].phys_addr += len;
-	free_memseg[memseg_idx].addr =
-		(char *)free_memseg[memseg_idx].addr + len;
+	const struct malloc_elem *elem = malloc_elem_from_data(mz_addr);
 
 	/* fill the zone in config */
 	struct rte_memzone *mz = &mcfg->memzone[mcfg->memzone_idx++];
 	snprintf(mz->name, sizeof(mz->name), "%s", name);
-	mz->phys_addr = memseg_physaddr;
-	mz->addr = memseg_addr;
-	mz->len = requested_len;
-	mz->hugepage_sz = free_memseg[memseg_idx].hugepage_sz;
-	mz->socket_id = free_memseg[memseg_idx].socket_id;
+	mz->phys_addr = rte_malloc_virt2phy(mz_addr);
+	mz->addr = mz_addr;
+	mz->len = (requested_len == 0 ? elem->size : requested_len);
+	mz->hugepage_sz = elem->ms->hugepage_sz;
+	mz->socket_id = elem->ms->socket_id;
 	mz->flags = 0;
-	mz->memseg_id = memseg_idx;
+	mz->memseg_id = elem->ms - rte_eal_get_configuration()->mem_config->memseg;
 
 	return mz;
 }
@@ -282,26 +226,6 @@ rte_memzone_reserve_thread_safe(const char *name, size_t len,
 {
 	struct rte_mem_config *mcfg;
 	const struct rte_memzone *mz = NULL;
-	uint64_t size_mask = 0;
-
-	if (flags & RTE_MEMZONE_256KB)
-		size_mask |= RTE_PGSIZE_256K;
-	if (flags & RTE_MEMZONE_2MB)
-		size_mask |= RTE_PGSIZE_2M;
-	if (flags & RTE_MEMZONE_16MB)
-		size_mask |= RTE_PGSIZE_16M;
-	if (flags & RTE_MEMZONE_256MB)
-		size_mask |= RTE_PGSIZE_256M;
-	if (flags & RTE_MEMZONE_512MB)
-		size_mask |= RTE_PGSIZE_512M;
-	if (flags & RTE_MEMZONE_1GB)
-		size_mask |= RTE_PGSIZE_1G;
-	if (flags & RTE_MEMZONE_4GB)
-		size_mask |= RTE_PGSIZE_4G;
-	if (flags & RTE_MEMZONE_16GB)
-		size_mask |= RTE_PGSIZE_16G;
-	if (!size_mask)
-		size_mask = UINT64_MAX;
 
 	/* get pointer to global configuration */
 	mcfg = rte_eal_get_configuration()->mem_config;
@@ -309,18 +233,7 @@ rte_memzone_reserve_thread_safe(const char *name, size_t len,
 	rte_rwlock_write_lock(&mcfg->mlock);
 
 	mz = memzone_reserve_aligned_thread_unsafe(
-		name, len, socket_id, size_mask, align, bound);
-
-	/*
-	 * If we failed to allocate the requested page size, and the
-	 * RTE_MEMZONE_SIZE_HINT_ONLY flag is specified, try allocating
-	 * again.
-	 */
-	if (!mz && rte_errno == ENOMEM && size_mask != UINT64_MAX &&
-	    flags & RTE_MEMZONE_SIZE_HINT_ONLY) {
-		mz = memzone_reserve_aligned_thread_unsafe(
-			name, len, socket_id, UINT64_MAX, align, bound);
-	}
+		name, len, socket_id, flags, align, bound);
 
 	rte_rwlock_write_unlock(&mcfg->mlock);
 
@@ -412,45 +325,6 @@ rte_memzone_dump(FILE *f)
 }
 
 /*
- * called by init: modify the free memseg list to have cache-aligned
- * addresses and cache-aligned lengths
- */
-static int
-memseg_sanitize(struct rte_memseg *memseg)
-{
-	unsigned phys_align;
-	unsigned virt_align;
-	unsigned off;
-
-	phys_align = memseg->phys_addr & RTE_CACHE_LINE_MASK;
-	virt_align = (unsigned long)memseg->addr & RTE_CACHE_LINE_MASK;
-
-	/*
-	 * sanity check: phys_addr and addr must have the same
-	 * alignment
-	 */
-	if (phys_align != virt_align)
-		return -1;
-
-	/* memseg is really too small, don't bother with it */
-	if (memseg->len < (2 * RTE_CACHE_LINE_SIZE)) {
-		memseg->len = 0;
-		return 0;
-	}
-
-	/* align start address */
-	off = (RTE_CACHE_LINE_SIZE - phys_align) & RTE_CACHE_LINE_MASK;
-	memseg->phys_addr += off;
-	memseg->addr = (char *)memseg->addr + off;
-	memseg->len -= off;
-
-	/* align end address */
-	memseg->len &= ~((uint64_t)RTE_CACHE_LINE_MASK);
-
-	return 0;
-}
-
-/*
  * Init the memzone subsystem
  */
 int
@@ -458,14 +332,10 @@ rte_eal_memzone_init(void)
 {
 	struct rte_mem_config *mcfg;
 	const struct rte_memseg *memseg;
-	unsigned i = 0;
 
 	/* get pointer to global configuration */
 	mcfg = rte_eal_get_configuration()->mem_config;
 
-	/* mirror the runtime memsegs from config */
-	free_memseg = mcfg->free_memseg;
-
 	/* secondary processes don't need to initialise anything */
 	if (rte_eal_process_type() == RTE_PROC_SECONDARY)
 		return 0;
@@ -478,33 +348,13 @@ rte_eal_memzone_init(void)
 
 	rte_rwlock_write_lock(&mcfg->mlock);
 
-	/* fill in uninitialized free_memsegs */
-	for (i = 0; i < RTE_MAX_MEMSEG; i++) {
-		if (memseg[i].addr == NULL)
-			break;
-		if (free_memseg[i].addr != NULL)
-			continue;
-		memcpy(&free_memseg[i], &memseg[i], sizeof(struct rte_memseg));
-	}
-
-	/* make all zones cache-aligned */
-	for (i = 0; i < RTE_MAX_MEMSEG; i++) {
-		if (free_memseg[i].addr == NULL)
-			break;
-		if (memseg_sanitize(&free_memseg[i]) < 0) {
-			RTE_LOG(ERR, EAL, "%s(): Sanity check failed\n", __func__);
-			rte_rwlock_write_unlock(&mcfg->mlock);
-			return -1;
-		}
-	}
-
 	/* delete all zones */
 	mcfg->memzone_idx = 0;
 	memset(mcfg->memzone, 0, sizeof(mcfg->memzone));
 
 	rte_rwlock_write_unlock(&mcfg->mlock);
 
-	return 0;
+	return rte_eal_malloc_heap_init();
 }
 
 /* Walk all reserved memory zones */
diff --git a/lib/librte_eal/common/include/rte_eal_memconfig.h b/lib/librte_eal/common/include/rte_eal_memconfig.h
index 34f5abc..055212a 100644
--- a/lib/librte_eal/common/include/rte_eal_memconfig.h
+++ b/lib/librte_eal/common/include/rte_eal_memconfig.h
@@ -73,7 +73,7 @@ struct rte_mem_config {
 	struct rte_memseg memseg[RTE_MAX_MEMSEG];    /**< Physmem descriptors. */
 	struct rte_memzone memzone[RTE_MAX_MEMZONE]; /**< Memzone descriptors. */
 
-	/* Runtime Physmem descriptors. */
+	/* Runtime Physmem descriptors - NOT USED */
 	struct rte_memseg free_memseg[RTE_MAX_MEMSEG];
 
 	struct rte_tailq_head tailq_head[RTE_MAX_TAILQ]; /**< Tailqs for objects */
diff --git a/lib/librte_eal/common/include/rte_malloc_heap.h b/lib/librte_eal/common/include/rte_malloc_heap.h
index 716216f..b270356 100644
--- a/lib/librte_eal/common/include/rte_malloc_heap.h
+++ b/lib/librte_eal/common/include/rte_malloc_heap.h
@@ -40,7 +40,7 @@
 #include <rte_memory.h>
 
 /* Number of free lists per heap, grouped by size. */
-#define RTE_HEAP_NUM_FREELISTS  5
+#define RTE_HEAP_NUM_FREELISTS  13
 
 /**
  * Structure to hold malloc heap
@@ -48,7 +48,6 @@
 struct malloc_heap {
 	rte_spinlock_t lock;
 	LIST_HEAD(, malloc_elem) free_head[RTE_HEAP_NUM_FREELISTS];
-	unsigned mz_count;
 	unsigned alloc_count;
 	size_t total_size;
 } __rte_cache_aligned;
diff --git a/lib/librte_eal/common/malloc_elem.c b/lib/librte_eal/common/malloc_elem.c
index a5e1248..b54ee33 100644
--- a/lib/librte_eal/common/malloc_elem.c
+++ b/lib/librte_eal/common/malloc_elem.c
@@ -37,7 +37,6 @@
 #include <sys/queue.h>
 
 #include <rte_memory.h>
-#include <rte_memzone.h>
 #include <rte_eal.h>
 #include <rte_launch.h>
 #include <rte_per_lcore.h>
@@ -56,10 +55,10 @@
  */
 void
 malloc_elem_init(struct malloc_elem *elem,
-		struct malloc_heap *heap, const struct rte_memzone *mz, size_t size)
+		struct malloc_heap *heap, const struct rte_memseg *ms, size_t size)
 {
 	elem->heap = heap;
-	elem->mz = mz;
+	elem->ms = ms;
 	elem->prev = NULL;
 	memset(&elem->free_list, 0, sizeof(elem->free_list));
 	elem->state = ELEM_FREE;
@@ -70,12 +69,12 @@ malloc_elem_init(struct malloc_elem *elem,
 }
 
 /*
- * initialise a dummy malloc_elem header for the end-of-memzone marker
+ * initialise a dummy malloc_elem header for the end-of-memseg marker
  */
 void
 malloc_elem_mkend(struct malloc_elem *elem, struct malloc_elem *prev)
 {
-	malloc_elem_init(elem, prev->heap, prev->mz, 0);
+	malloc_elem_init(elem, prev->heap, prev->ms, 0);
 	elem->prev = prev;
 	elem->state = ELEM_BUSY; /* mark busy so its never merged */
 }
@@ -86,12 +85,24 @@ malloc_elem_mkend(struct malloc_elem *elem, struct malloc_elem *prev)
  * fit, return NULL.
  */
 static void *
-elem_start_pt(struct malloc_elem *elem, size_t size, unsigned align)
+elem_start_pt(struct malloc_elem *elem, size_t size, unsigned align,
+		size_t bound)
 {
-	const uintptr_t end_pt = (uintptr_t)elem +
+	const size_t bmask = ~(bound - 1);
+	uintptr_t end_pt = (uintptr_t)elem +
 			elem->size - MALLOC_ELEM_TRAILER_LEN;
-	const uintptr_t new_data_start = RTE_ALIGN_FLOOR((end_pt - size), align);
-	const uintptr_t new_elem_start = new_data_start - MALLOC_ELEM_HEADER_LEN;
+	uintptr_t new_data_start = RTE_ALIGN_FLOOR((end_pt - size), align);
+	uintptr_t new_elem_start;
+
+	/* check boundary */
+	if ((new_data_start & bmask) != ((end_pt - 1) & bmask)) {
+		end_pt = RTE_ALIGN_FLOOR(end_pt, bound);
+		new_data_start = RTE_ALIGN_FLOOR((end_pt - size), align);
+		if (((end_pt - 1) & bmask) != (new_data_start & bmask))
+			return NULL;
+	}
+
+	new_elem_start = new_data_start - MALLOC_ELEM_HEADER_LEN;
 
 	/* if the new start point is before the exist start, it won't fit */
 	return (new_elem_start < (uintptr_t)elem) ? NULL : (void *)new_elem_start;
@@ -102,9 +113,10 @@ elem_start_pt(struct malloc_elem *elem, size_t size, unsigned align)
  * alignment request from the current element
  */
 int
-malloc_elem_can_hold(struct malloc_elem *elem, size_t size, unsigned align)
+malloc_elem_can_hold(struct malloc_elem *elem, size_t size,	unsigned align,
+		size_t bound)
 {
-	return elem_start_pt(elem, size, align) != NULL;
+	return elem_start_pt(elem, size, align, bound) != NULL;
 }
 
 /*
@@ -115,10 +127,10 @@ static void
 split_elem(struct malloc_elem *elem, struct malloc_elem *split_pt)
 {
 	struct malloc_elem *next_elem = RTE_PTR_ADD(elem, elem->size);
-	const unsigned old_elem_size = (uintptr_t)split_pt - (uintptr_t)elem;
-	const unsigned new_elem_size = elem->size - old_elem_size;
+	const size_t old_elem_size = (uintptr_t)split_pt - (uintptr_t)elem;
+	const size_t new_elem_size = elem->size - old_elem_size;
 
-	malloc_elem_init(split_pt, elem->heap, elem->mz, new_elem_size);
+	malloc_elem_init(split_pt, elem->heap, elem->ms, new_elem_size);
 	split_pt->prev = elem;
 	next_elem->prev = split_pt;
 	elem->size = old_elem_size;
@@ -168,8 +180,9 @@ malloc_elem_free_list_index(size_t size)
 void
 malloc_elem_free_list_insert(struct malloc_elem *elem)
 {
-	size_t idx = malloc_elem_free_list_index(elem->size - MALLOC_ELEM_HEADER_LEN);
+	size_t idx;
 
+	idx = malloc_elem_free_list_index(elem->size - MALLOC_ELEM_HEADER_LEN);
 	elem->state = ELEM_FREE;
 	LIST_INSERT_HEAD(&elem->heap->free_head[idx], elem, free_list);
 }
@@ -190,12 +203,26 @@ elem_free_list_remove(struct malloc_elem *elem)
  * is not done here, as it's done there previously.
  */
 struct malloc_elem *
-malloc_elem_alloc(struct malloc_elem *elem, size_t size, unsigned align)
+malloc_elem_alloc(struct malloc_elem *elem, size_t size, unsigned align,
+		size_t bound)
 {
-	struct malloc_elem *new_elem = elem_start_pt(elem, size, align);
-	const unsigned old_elem_size = (uintptr_t)new_elem - (uintptr_t)elem;
+	struct malloc_elem *new_elem = elem_start_pt(elem, size, align, bound);
+	const size_t old_elem_size = (uintptr_t)new_elem - (uintptr_t)elem;
+	const size_t trailer_size = elem->size - old_elem_size - size -
+		MALLOC_ELEM_OVERHEAD;
+
+	elem_free_list_remove(elem);
 
-	if (old_elem_size < MALLOC_ELEM_OVERHEAD + MIN_DATA_SIZE){
+	if (trailer_size > MALLOC_ELEM_OVERHEAD + MIN_DATA_SIZE) {
+		/* split it, too much free space after elem */
+		struct malloc_elem *new_free_elem =
+				RTE_PTR_ADD(new_elem, size + MALLOC_ELEM_OVERHEAD);
+
+		split_elem(elem, new_free_elem);
+		malloc_elem_free_list_insert(new_free_elem);
+	}
+
+	if (old_elem_size < MALLOC_ELEM_OVERHEAD + MIN_DATA_SIZE) {
 		/* don't split it, pad the element instead */
 		elem->state = ELEM_BUSY;
 		elem->pad = old_elem_size;
@@ -208,8 +235,6 @@ malloc_elem_alloc(struct malloc_elem *elem, size_t size, unsigned align)
 			new_elem->size = elem->size - elem->pad;
 			set_header(new_elem);
 		}
-		/* remove element from free list */
-		elem_free_list_remove(elem);
 
 		return new_elem;
 	}
@@ -219,7 +244,6 @@ malloc_elem_alloc(struct malloc_elem *elem, size_t size, unsigned align)
 	 * Re-insert original element, in case its new size makes it
 	 * belong on a different list.
 	 */
-	elem_free_list_remove(elem);
 	split_elem(elem, new_elem);
 	new_elem->state = ELEM_BUSY;
 	malloc_elem_free_list_insert(elem);
diff --git a/lib/librte_eal/common/malloc_elem.h b/lib/librte_eal/common/malloc_elem.h
index 9790b1a..e05d2ea 100644
--- a/lib/librte_eal/common/malloc_elem.h
+++ b/lib/librte_eal/common/malloc_elem.h
@@ -47,9 +47,9 @@ enum elem_state {
 
 struct malloc_elem {
 	struct malloc_heap *heap;
-	struct malloc_elem *volatile prev;      /* points to prev elem in memzone */
+	struct malloc_elem *volatile prev;      /* points to prev elem in memseg */
 	LIST_ENTRY(malloc_elem) free_list;      /* list of free elements in heap */
-	const struct rte_memzone *mz;
+	const struct rte_memseg *ms;
 	volatile enum elem_state state;
 	uint32_t pad;
 	size_t size;
@@ -136,11 +136,11 @@ malloc_elem_from_data(const void *data)
 void
 malloc_elem_init(struct malloc_elem *elem,
 		struct malloc_heap *heap,
-		const struct rte_memzone *mz,
+		const struct rte_memseg *ms,
 		size_t size);
 
 /*
- * initialise a dummy malloc_elem header for the end-of-memzone marker
+ * initialise a dummy malloc_elem header for the end-of-memseg marker
  */
 void
 malloc_elem_mkend(struct malloc_elem *elem,
@@ -151,14 +151,16 @@ malloc_elem_mkend(struct malloc_elem *elem,
  * of the requested size and with the requested alignment
  */
 int
-malloc_elem_can_hold(struct malloc_elem *elem, size_t size, unsigned align);
+malloc_elem_can_hold(struct malloc_elem *elem, size_t size,
+		unsigned align, size_t bound);
 
 /*
  * reserve a block of data in an existing malloc_elem. If the malloc_elem
  * is much larger than the data block requested, we split the element in two.
  */
 struct malloc_elem *
-malloc_elem_alloc(struct malloc_elem *elem, size_t size, unsigned align);
+malloc_elem_alloc(struct malloc_elem *elem, size_t size,
+		unsigned align, size_t bound);
 
 /*
  * free a malloc_elem block by adding it to the free list. If the
diff --git a/lib/librte_eal/common/malloc_heap.c b/lib/librte_eal/common/malloc_heap.c
index 8861d27..21d8914 100644
--- a/lib/librte_eal/common/malloc_heap.c
+++ b/lib/librte_eal/common/malloc_heap.c
@@ -39,7 +39,6 @@
 #include <sys/queue.h>
 
 #include <rte_memory.h>
-#include <rte_memzone.h>
 #include <rte_eal.h>
 #include <rte_eal_memconfig.h>
 #include <rte_launch.h>
@@ -54,123 +53,125 @@
 #include "malloc_elem.h"
 #include "malloc_heap.h"
 
-/* since the memzone size starts with a digit, it will appear unquoted in
- * rte_config.h, so quote it so it can be passed to rte_str_to_size */
-#define MALLOC_MEMZONE_SIZE RTE_STR(RTE_MALLOC_MEMZONE_SIZE)
-
-/*
- * returns the configuration setting for the memzone size as a size_t value
- */
-static inline size_t
-get_malloc_memzone_size(void)
+static unsigned
+check_hugepage_sz(unsigned flags, uint64_t hugepage_sz)
 {
-	return rte_str_to_size(MALLOC_MEMZONE_SIZE);
+	unsigned check_flag = 0;
+
+	if (!(flags & ~RTE_MEMZONE_SIZE_HINT_ONLY))
+		return 1;
+
+	switch (hugepage_sz) {
+	case RTE_PGSIZE_256K:
+		check_flag = RTE_MEMZONE_256KB;
+		break;
+	case RTE_PGSIZE_2M:
+		check_flag = RTE_MEMZONE_2MB;
+		break;
+	case RTE_PGSIZE_16M:
+		check_flag = RTE_MEMZONE_16MB;
+		break;
+	case RTE_PGSIZE_256M:
+		check_flag = RTE_MEMZONE_256MB;
+		break;
+	case RTE_PGSIZE_512M:
+		check_flag = RTE_MEMZONE_512MB;
+		break;
+	case RTE_PGSIZE_1G:
+		check_flag = RTE_MEMZONE_1GB;
+		break;
+	case RTE_PGSIZE_4G:
+		check_flag = RTE_MEMZONE_4GB;
+		break;
+	case RTE_PGSIZE_16G:
+		check_flag = RTE_MEMZONE_16GB;
+	}
+
+	return (check_flag & flags);
 }
 
 /*
- * reserve an extra memory zone and make it available for use by a particular
- * heap. This reserves the zone and sets a dummy malloc_elem header at the end
+ * Expand the heap with a memseg.
+ * This reserves the zone and sets a dummy malloc_elem header at the end
  * to prevent overflow. The rest of the zone is added to free list as a single
  * large free block
  */
-static int
-malloc_heap_add_memzone(struct malloc_heap *heap, size_t size, unsigned align)
+static void
+malloc_heap_add_memseg(struct malloc_heap *heap, struct rte_memseg *ms)
 {
-	const unsigned mz_flags = 0;
-	const size_t block_size = get_malloc_memzone_size();
-	/* ensure the data we want to allocate will fit in the memzone */
-	const size_t min_size = size + align + MALLOC_ELEM_OVERHEAD * 2;
-	const struct rte_memzone *mz = NULL;
-	struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
-	unsigned numa_socket = heap - mcfg->malloc_heaps;
-
-	size_t mz_size = min_size;
-	if (mz_size < block_size)
-		mz_size = block_size;
-
-	char mz_name[RTE_MEMZONE_NAMESIZE];
-	snprintf(mz_name, sizeof(mz_name), "MALLOC_S%u_HEAP_%u",
-		     numa_socket, heap->mz_count++);
-
-	/* try getting a block. if we fail and we don't need as big a block
-	 * as given in the config, we can shrink our request and try again
-	 */
-	do {
-		mz = rte_memzone_reserve(mz_name, mz_size, numa_socket,
-					 mz_flags);
-		if (mz == NULL)
-			mz_size /= 2;
-	} while (mz == NULL && mz_size > min_size);
-	if (mz == NULL)
-		return -1;
-
 	/* allocate the memory block headers, one at end, one at start */
-	struct malloc_elem *start_elem = (struct malloc_elem *)mz->addr;
-	struct malloc_elem *end_elem = RTE_PTR_ADD(mz->addr,
-			mz_size - MALLOC_ELEM_OVERHEAD);
+	struct malloc_elem *start_elem = (struct malloc_elem *)ms->addr;
+	struct malloc_elem *end_elem = RTE_PTR_ADD(ms->addr,
+			ms->len - MALLOC_ELEM_OVERHEAD);
 	end_elem = RTE_PTR_ALIGN_FLOOR(end_elem, RTE_CACHE_LINE_SIZE);
+	const size_t elem_size = (uintptr_t)end_elem - (uintptr_t)start_elem;
 
-	const unsigned elem_size = (uintptr_t)end_elem - (uintptr_t)start_elem;
-	malloc_elem_init(start_elem, heap, mz, elem_size);
+	malloc_elem_init(start_elem, heap, ms, elem_size);
 	malloc_elem_mkend(end_elem, start_elem);
 	malloc_elem_free_list_insert(start_elem);
 
-	/* increase heap total size by size of new memzone */
-	heap->total_size+=mz_size - MALLOC_ELEM_OVERHEAD;
-	return 0;
+	heap->total_size += elem_size;
 }
 
 /*
  * Iterates through the freelist for a heap to find a free element
  * which can store data of the required size and with the requested alignment.
+ * If size is 0, find the biggest available elem.
  * Returns null on failure, or pointer to element on success.
  */
 static struct malloc_elem *
-find_suitable_element(struct malloc_heap *heap, size_t size, unsigned align)
+find_suitable_element(struct malloc_heap *heap, size_t size,
+		unsigned flags, size_t align, size_t bound)
 {
 	size_t idx;
-	struct malloc_elem *elem;
+	struct malloc_elem *elem, *alt_elem = NULL;
 
 	for (idx = malloc_elem_free_list_index(size);
-		idx < RTE_HEAP_NUM_FREELISTS; idx++)
-	{
+			idx < RTE_HEAP_NUM_FREELISTS; idx++) {
 		for (elem = LIST_FIRST(&heap->free_head[idx]);
-			!!elem; elem = LIST_NEXT(elem, free_list))
-		{
-			if (malloc_elem_can_hold(elem, size, align))
-				return elem;
+				!!elem; elem = LIST_NEXT(elem, free_list)) {
+			if (malloc_elem_can_hold(elem, size, align, bound)) {
+				if (check_hugepage_sz(flags, elem->ms->hugepage_sz))
+					return elem;
+				if (alt_elem == NULL)
+					alt_elem = elem;
+			}
 		}
 	}
+
+	if ((alt_elem != NULL) && (flags & RTE_MEMZONE_SIZE_HINT_ONLY))
+		return alt_elem;
+
 	return NULL;
 }
 
 /*
- * Main function called by malloc to allocate a block of memory from the
- * heap. It locks the free list, scans it, and adds a new memzone if the
- * scan fails. Once the new memzone is added, it re-scans and should return
+ * Main function to allocate a block of memory from the heap.
+ * It locks the free list, scans it, and adds a new memseg if the
+ * scan fails. Once the new memseg is added, it re-scans and should return
  * the new element after releasing the lock.
  */
 void *
 malloc_heap_alloc(struct malloc_heap *heap,
-		const char *type __attribute__((unused)), size_t size, unsigned align)
+		const char *type __attribute__((unused)), size_t size, unsigned flags,
+		size_t align, size_t bound)
 {
+	struct malloc_elem *elem;
+
 	size = RTE_CACHE_LINE_ROUNDUP(size);
 	align = RTE_CACHE_LINE_ROUNDUP(align);
+
 	rte_spinlock_lock(&heap->lock);
-	struct malloc_elem *elem = find_suitable_element(heap, size, align);
-	if (elem == NULL){
-		if ((malloc_heap_add_memzone(heap, size, align)) == 0)
-			elem = find_suitable_element(heap, size, align);
-	}
 
-	if (elem != NULL){
-		elem = malloc_elem_alloc(elem, size, align);
+	elem = find_suitable_element(heap, size, flags, align, bound);
+	if (elem != NULL) {
+		elem = malloc_elem_alloc(elem, size, align, bound);
 		/* increase heap's count of allocated elements */
 		heap->alloc_count++;
 	}
 	rte_spinlock_unlock(&heap->lock);
-	return elem == NULL ? NULL : (void *)(&elem[1]);
 
+	return elem == NULL ? NULL : (void *)(&elem[1]);
 }
 
 /*
@@ -206,3 +207,21 @@ malloc_heap_get_stats(const struct malloc_heap *heap,
 	socket_stats->alloc_count = heap->alloc_count;
 	return 0;
 }
+
+int
+rte_eal_malloc_heap_init(void)
+{
+	struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
+	unsigned ms_cnt;
+	struct rte_memseg *ms;
+
+	if (mcfg == NULL)
+		return -1;
+
+	for (ms = &mcfg->memseg[0], ms_cnt = 0;
+			(ms_cnt < RTE_MAX_MEMSEG) && (ms->len > 0);
+			ms_cnt++, ms++)
+		malloc_heap_add_memseg(&mcfg->malloc_heaps[ms->socket_id], ms);
+
+	return 0;
+}
diff --git a/lib/librte_eal/common/malloc_heap.h b/lib/librte_eal/common/malloc_heap.h
index a47136d..3ccbef0 100644
--- a/lib/librte_eal/common/malloc_heap.h
+++ b/lib/librte_eal/common/malloc_heap.h
@@ -53,15 +53,15 @@ malloc_get_numa_socket(void)
 }
 
 void *
-malloc_heap_alloc(struct malloc_heap *heap, const char *type,
-		size_t size, unsigned align);
+malloc_heap_alloc(struct malloc_heap *heap,	const char *type, size_t size,
+		unsigned flags, size_t align, size_t bound);
 
 int
 malloc_heap_get_stats(const struct malloc_heap *heap,
 		struct rte_malloc_socket_stats *socket_stats);
 
 int
-rte_eal_heap_memzone_init(void);
+rte_eal_malloc_heap_init(void);
 
 #ifdef __cplusplus
 }
diff --git a/lib/librte_eal/common/rte_malloc.c b/lib/librte_eal/common/rte_malloc.c
index c313a57..47deb00 100644
--- a/lib/librte_eal/common/rte_malloc.c
+++ b/lib/librte_eal/common/rte_malloc.c
@@ -39,7 +39,6 @@
 
 #include <rte_memcpy.h>
 #include <rte_memory.h>
-#include <rte_memzone.h>
 #include <rte_eal.h>
 #include <rte_eal_memconfig.h>
 #include <rte_branch_prediction.h>
@@ -77,6 +76,9 @@ rte_malloc_socket(const char *type, size_t size, unsigned align, int socket_arg)
 	if (size == 0 || (align && !rte_is_power_of_2(align)))
 		return NULL;
 
+	if (!rte_eal_has_hugepages())
+		socket_arg = SOCKET_ID_ANY;
+
 	if (socket_arg == SOCKET_ID_ANY)
 		socket = malloc_get_numa_socket();
 	else
@@ -87,7 +89,7 @@ rte_malloc_socket(const char *type, size_t size, unsigned align, int socket_arg)
 		return NULL;
 
 	ret = malloc_heap_alloc(&mcfg->malloc_heaps[socket], type,
-				size, align == 0 ? 1 : align);
+				size, 0, align == 0 ? 1 : align, 0);
 	if (ret != NULL || socket_arg != SOCKET_ID_ANY)
 		return ret;
 
@@ -98,7 +100,7 @@ rte_malloc_socket(const char *type, size_t size, unsigned align, int socket_arg)
 			continue;
 
 		ret = malloc_heap_alloc(&mcfg->malloc_heaps[i], type,
-					size, align == 0 ? 1 : align);
+					size, 0, align == 0 ? 1 : align, 0);
 		if (ret != NULL)
 			return ret;
 	}
@@ -256,5 +258,5 @@ rte_malloc_virt2phy(const void *addr)
 	const struct malloc_elem *elem = malloc_elem_from_data(addr);
 	if (elem == NULL)
 		return 0;
-	return elem->mz->phys_addr + ((uintptr_t)addr - (uintptr_t)elem->mz->addr);
+	return elem->ms->phys_addr + ((uintptr_t)addr - (uintptr_t)elem->ms->addr);
 }
diff --git a/lib/librte_eal/linuxapp/eal/eal_memory.c b/lib/librte_eal/linuxapp/eal/eal_memory.c
index 4fd63bb..80ee78f 100644
--- a/lib/librte_eal/linuxapp/eal/eal_memory.c
+++ b/lib/librte_eal/linuxapp/eal/eal_memory.c
@@ -1071,7 +1071,7 @@ rte_eal_hugepage_init(void)
 		mcfg->memseg[0].addr = addr;
 		mcfg->memseg[0].hugepage_sz = RTE_PGSIZE_4K;
 		mcfg->memseg[0].len = internal_config.memory;
-		mcfg->memseg[0].socket_id = SOCKET_ID_ANY;
+		mcfg->memseg[0].socket_id = 0;
 		return 0;
 	}
 
-- 
1.9.3

^ permalink raw reply	[relevance 1%]

* [dpdk-dev] [PATCH v10 0/9] Dynamic memzones
  2015-07-15  8:26  4%   ` [dpdk-dev] [PATCH v9 0/9] Dynamic memzones Sergio Gonzalez Monroy
  2015-07-15  8:26  1%     ` [dpdk-dev] [PATCH v9 2/9] eal: memzone allocated by malloc Sergio Gonzalez Monroy
  2015-07-15  8:26 19%     ` [dpdk-dev] [PATCH v9 8/9] doc: announce ABI change of librte_malloc Sergio Gonzalez Monroy
@ 2015-07-15 16:32  3%     ` Sergio Gonzalez Monroy
  2015-07-15 16:32  1%       ` [dpdk-dev] [PATCH v10 2/9] eal: memzone allocated by malloc Sergio Gonzalez Monroy
  2015-07-15 16:32 19%       ` [dpdk-dev] [PATCH v10 8/9] doc: announce ABI change of librte_malloc Sergio Gonzalez Monroy
  2 siblings, 2 replies; 200+ results
From: Sergio Gonzalez Monroy @ 2015-07-15 16:32 UTC (permalink / raw)
  To: dev

Current implemetation allows reserving/creating memzones but not the opposite
(unreserve/free). This affects mempools and other memzone based objects.

>From my point of view, implementing free functionality for memzones would look
like malloc over memsegs.
Thus, this approach moves malloc inside eal (which in turn removes a circular
dependency), where malloc heaps are composed of memsegs.
We keep both malloc and memzone APIs as they are, but memzones allocate its
memory by calling malloc_heap_alloc.
Some extra functionality is required in malloc to allow for boundary constrained
memory requests.
In summary, currently malloc is based on memzones, and with this approach
memzones are based on malloc.

v10:
 - Convert PNG to SVG
 - Fix issue with --no-huge by forcing SOCKET_ID_ANY
 - Rework some parts of the code

v9:
 - Fix incorrect size_t type that results in 32bits compilation error.

v8:
 - Rebase against current HEAD to factor for changes made by new Tile-Gx arch

v7:
 - Create a separated maintainer section for memory allocation

v6:
 - Fix bad patch for rte_memzone_free

v5:
 - Fix rte_memzone_free
 - Improve rte_memzone_free unit test

v4:
 - Rebase and fix couple of merge issues

v3:
 - Create dummy librte_malloc
 - Add deprecation notice
 - Rework some of the code
 - Doc update
 - checkpatch

v2:
 - New rte_memzone_free
 - Support memzone len = 0
 - Add all available memsegs to malloc heap at init
 - Update memzone/malloc unit tests


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

Sergio Gonzalez Monroy (9):
  eal: move librte_malloc to eal/common
  eal: memzone allocated by malloc
  app/test: update malloc/memzone unit tests
  config: remove CONFIG_RTE_MALLOC_MEMZONE_SIZE
  eal: remove free_memseg and references to it
  eal: new rte_memzone_free
  app/test: rte_memzone_free unit test
  doc: announce ABI change of librte_malloc
  doc: update malloc documentation

 MAINTAINERS                                       |   22 +-
 app/test/test_malloc.c                            |   86 --
 app/test/test_memzone.c                           |  456 ++-------
 config/common_bsdapp                              |    8 +-
 config/common_linuxapp                            |    8 +-
 doc/guides/prog_guide/env_abstraction_layer.rst   |  220 ++++-
 doc/guides/prog_guide/img/malloc_heap.png         |  Bin 81329 -> 0 bytes
 doc/guides/prog_guide/img/malloc_heap.svg         | 1018 +++++++++++++++++++++
 doc/guides/prog_guide/index.rst                   |    1 -
 doc/guides/prog_guide/malloc_lib.rst              |  233 -----
 doc/guides/prog_guide/overview.rst                |   11 +-
 doc/guides/rel_notes/abi.rst                      |    6 +-
 drivers/net/af_packet/Makefile                    |    1 -
 drivers/net/bonding/Makefile                      |    1 -
 drivers/net/e1000/Makefile                        |    2 +-
 drivers/net/enic/Makefile                         |    2 +-
 drivers/net/fm10k/Makefile                        |    2 +-
 drivers/net/i40e/Makefile                         |    2 +-
 drivers/net/ixgbe/Makefile                        |    2 +-
 drivers/net/mlx4/Makefile                         |    1 -
 drivers/net/null/Makefile                         |    1 -
 drivers/net/pcap/Makefile                         |    1 -
 drivers/net/virtio/Makefile                       |    2 +-
 drivers/net/vmxnet3/Makefile                      |    2 +-
 drivers/net/xenvirt/Makefile                      |    2 +-
 lib/Makefile                                      |    2 +-
 lib/librte_acl/Makefile                           |    2 +-
 lib/librte_eal/bsdapp/eal/Makefile                |    4 +-
 lib/librte_eal/bsdapp/eal/rte_eal_version.map     |   19 +
 lib/librte_eal/common/Makefile                    |    1 +
 lib/librte_eal/common/eal_common_memzone.c        |  352 +++----
 lib/librte_eal/common/include/rte_eal_memconfig.h |    5 +-
 lib/librte_eal/common/include/rte_malloc.h        |  342 +++++++
 lib/librte_eal/common/include/rte_malloc_heap.h   |    3 +-
 lib/librte_eal/common/include/rte_memzone.h       |   11 +
 lib/librte_eal/common/malloc_elem.c               |  344 +++++++
 lib/librte_eal/common/malloc_elem.h               |  192 ++++
 lib/librte_eal/common/malloc_heap.c               |  227 +++++
 lib/librte_eal/common/malloc_heap.h               |   70 ++
 lib/librte_eal/common/rte_malloc.c                |  262 ++++++
 lib/librte_eal/linuxapp/eal/Makefile              |    4 +-
 lib/librte_eal/linuxapp/eal/eal_ivshmem.c         |   17 +-
 lib/librte_eal/linuxapp/eal/eal_memory.c          |    2 +-
 lib/librte_eal/linuxapp/eal/rte_eal_version.map   |   19 +
 lib/librte_hash/Makefile                          |    2 +-
 lib/librte_lpm/Makefile                           |    2 +-
 lib/librte_malloc/Makefile                        |    6 +-
 lib/librte_malloc/malloc_elem.c                   |  320 -------
 lib/librte_malloc/malloc_elem.h                   |  190 ----
 lib/librte_malloc/malloc_heap.c                   |  208 -----
 lib/librte_malloc/malloc_heap.h                   |   70 --
 lib/librte_malloc/rte_malloc.c                    |  228 +----
 lib/librte_malloc/rte_malloc.h                    |  342 -------
 lib/librte_malloc/rte_malloc_version.map          |   16 -
 lib/librte_mempool/Makefile                       |    2 -
 lib/librte_port/Makefile                          |    1 -
 lib/librte_ring/Makefile                          |    3 +-
 lib/librte_table/Makefile                         |    1 -
 58 files changed, 2988 insertions(+), 2371 deletions(-)
 delete mode 100644 doc/guides/prog_guide/img/malloc_heap.png
 create mode 100755 doc/guides/prog_guide/img/malloc_heap.svg
 delete mode 100644 doc/guides/prog_guide/malloc_lib.rst
 create mode 100644 lib/librte_eal/common/include/rte_malloc.h
 create mode 100644 lib/librte_eal/common/malloc_elem.c
 create mode 100644 lib/librte_eal/common/malloc_elem.h
 create mode 100644 lib/librte_eal/common/malloc_heap.c
 create mode 100644 lib/librte_eal/common/malloc_heap.h
 create mode 100644 lib/librte_eal/common/rte_malloc.c
 delete mode 100644 lib/librte_malloc/malloc_elem.c
 delete mode 100644 lib/librte_malloc/malloc_elem.h
 delete mode 100644 lib/librte_malloc/malloc_heap.c
 delete mode 100644 lib/librte_malloc/malloc_heap.h
 delete mode 100644 lib/librte_malloc/rte_malloc.h

-- 
1.9.3

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v10 8/9] doc: announce ABI change of librte_malloc
  2015-07-15 16:32  3%     ` [dpdk-dev] [PATCH v10 0/9] Dynamic memzones Sergio Gonzalez Monroy
  2015-07-15 16:32  1%       ` [dpdk-dev] [PATCH v10 2/9] eal: memzone allocated by malloc Sergio Gonzalez Monroy
@ 2015-07-15 16:32 19%       ` Sergio Gonzalez Monroy
  1 sibling, 0 replies; 200+ results
From: Sergio Gonzalez Monroy @ 2015-07-15 16:32 UTC (permalink / raw)
  To: dev

Announce the creation of dummy malloc library for 2.1 and removal of
such library, now integrated in librte_eal, for 2.2 release.

Signed-off-by: Sergio Gonzalez Monroy <sergio.gonzalez.monroy@intel.com>
---
 doc/guides/rel_notes/abi.rst | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst
index 931e785..76e0ae2 100644
--- a/doc/guides/rel_notes/abi.rst
+++ b/doc/guides/rel_notes/abi.rst
@@ -16,7 +16,6 @@ Examples of Deprecation Notices
 
 Deprecation Notices
 -------------------
-
 * Significant ABI changes are planned for struct rte_eth_dev to support up to
   1024 queues per port. This change will be in release 2.2.
   There is no backward compatibility planned from release 2.2.
@@ -24,3 +23,8 @@ Deprecation Notices
 
 * The Macros RTE_HASH_BUCKET_ENTRIES_MAX and RTE_HASH_KEY_LENGTH_MAX are
   deprecated and will be removed with version 2.2.
+
+* librte_malloc library has been integrated into librte_eal. The 2.1 release
+  creates a dummy/empty malloc library to fulfill binaries with dynamic linking
+  dependencies on librte_malloc.so. Such dummy library will not be created from
+  release 2.2 so binaries will need to be rebuilt.
-- 
1.9.3

^ permalink raw reply	[relevance 19%]

* [dpdk-dev] [PATCH v6 4/9] ethdev: remove HW specific stats in stats structs
  2015-07-15 13:11  3% [dpdk-dev] [PATCH v6 0/9] Expose IXGBE extended stats to DPDK apps Maryam Tahhan
@ 2015-07-15 13:11  9% ` Maryam Tahhan
  2015-08-17 14:53  0%   ` Olivier MATZ
  2015-07-16  7:54  0% ` [dpdk-dev] [PATCH v6 0/9] Expose IXGBE extended stats to DPDK apps Olivier MATZ
  1 sibling, 1 reply; 200+ results
From: Maryam Tahhan @ 2015-07-15 13:11 UTC (permalink / raw)
  To: dev

Remove non generic stats in rte_stats_strings and mark the relevant
fields in struct rte_eth_stats as deprecated.

Signed-off-by: Maryam Tahhan <maryam.tahhan@intel.com>
---
 doc/guides/rel_notes/abi.rst  | 12 ++++++++++++
 lib/librte_ether/rte_ethdev.c |  9 ---------
 lib/librte_ether/rte_ethdev.h | 30 ++++++++++++++++++++----------
 3 files changed, 32 insertions(+), 19 deletions(-)

diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst
index 931e785..d5bf625 100644
--- a/doc/guides/rel_notes/abi.rst
+++ b/doc/guides/rel_notes/abi.rst
@@ -24,3 +24,15 @@ Deprecation Notices
 
 * The Macros RTE_HASH_BUCKET_ENTRIES_MAX and RTE_HASH_KEY_LENGTH_MAX are
   deprecated and will be removed with version 2.2.
+
+* The following fields have been deprecated in rte_eth_stats:
+  * uint64_t imissed
+  * uint64_t ibadcrc
+  * uint64_t ibadlen
+  * uint64_t imcasts
+  * uint64_t fdirmatch
+  * uint64_t fdirmiss
+  * uint64_t tx_pause_xon
+  * uint64_t rx_pause_xon
+  * uint64_t tx_pause_xoff
+  * uint64_t rx_pause_xoff
diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 7689328..c8f0e9a 100755
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -142,17 +142,8 @@ static const struct rte_eth_xstats_name_off rte_stats_strings[] = {
 	{"rx_bytes", offsetof(struct rte_eth_stats, ibytes)},
 	{"tx_bytes", offsetof(struct rte_eth_stats, obytes)},
 	{"tx_errors", offsetof(struct rte_eth_stats, oerrors)},
-	{"rx_missed_errors", offsetof(struct rte_eth_stats, imissed)},
-	{"rx_crc_errors", offsetof(struct rte_eth_stats, ibadcrc)},
-	{"rx_bad_length_errors", offsetof(struct rte_eth_stats, ibadlen)},
 	{"rx_errors", offsetof(struct rte_eth_stats, ierrors)},
 	{"alloc_rx_buff_failed", offsetof(struct rte_eth_stats, rx_nombuf)},
-	{"fdir_match", offsetof(struct rte_eth_stats, fdirmatch)},
-	{"fdir_miss", offsetof(struct rte_eth_stats, fdirmiss)},
-	{"tx_flow_control_xon", offsetof(struct rte_eth_stats, tx_pause_xon)},
-	{"rx_flow_control_xon", offsetof(struct rte_eth_stats, rx_pause_xon)},
-	{"tx_flow_control_xoff", offsetof(struct rte_eth_stats, tx_pause_xoff)},
-	{"rx_flow_control_xoff", offsetof(struct rte_eth_stats, rx_pause_xoff)},
 };
 #define RTE_NB_STATS (sizeof(rte_stats_strings) / sizeof(rte_stats_strings[0]))
 
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index d76bbb3..a862027 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -193,19 +193,29 @@ struct rte_eth_stats {
 	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. */
+	/**< Deprecated; Total of RX missed packets (e.g full FIFO). */
+	uint64_t imissed;
+	/**< Deprecated; Total of RX packets with CRC error. */
+	uint64_t ibadcrc;
+	/**< Deprecated; Total of RX packets with bad length. */
+	uint64_t ibadlen;
 	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 imcasts;
+	/**< Deprecated; 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 fdirmatch;
+	/**< Deprecated; Total number of RX packets matching a filter. */
+	uint64_t fdirmiss;
+	/**< Deprecated; Total number of RX packets not matching any filter. */
+	uint64_t tx_pause_xon;
+	 /**< Deprecated; Total nb. of XON pause frame sent. */
+	uint64_t rx_pause_xon;
+	/**< Deprecated; Total nb. of XON pause frame received. */
+	uint64_t tx_pause_xoff;
+	/**< Deprecated; Total nb. of XOFF pause frame sent. */
+	uint64_t rx_pause_xoff;
+	/**< Deprecated; 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];
-- 
2.4.3

^ permalink raw reply	[relevance 9%]

* [dpdk-dev] [PATCH v6 0/9] Expose IXGBE extended stats to DPDK apps
@ 2015-07-15 13:11  3% Maryam Tahhan
  2015-07-15 13:11  9% ` [dpdk-dev] [PATCH v6 4/9] ethdev: remove HW specific stats in stats structs Maryam Tahhan
  2015-07-16  7:54  0% ` [dpdk-dev] [PATCH v6 0/9] Expose IXGBE extended stats to DPDK apps Olivier MATZ
  0 siblings, 2 replies; 200+ results
From: Maryam Tahhan @ 2015-07-15 13:11 UTC (permalink / raw)
  To: dev

This patch set implements xstats_get() and xstats_reset() in dev_ops for
ixgbe to expose detailed error statistics to DPDK applications. The
dump_cfg application was extended to demonstrate the usage of
retrieving statistics for DPDK interfaces and renamed to proc_info
in order reflect this new functionality. This patch set also removes non
generic statistics from the statistics strings at the ethdev level and
marks the relevant registers as depricated in struct rte_eth_stats.

v2:
 - Fixed patch dependencies.
 - Broke down patches into smaller logical changes.

v3:
 - Removes non-generic stats fields in rte_stats_strings and deprecates
   the fields related to them in struct rte_eth_stats.
 - Modifies rte_eth_xstats_get() to return generic stats and extended
   stats.
 
v4:
 - Replace count use in the loop in ixgbe_dev_xstats_get() function
   definition with i.
 - Breakdown "ixgbe: add NIC specific stats removed from ethdev" into
   two patches, one that adds the stats and another that extends
   ierrors to include more error stats.
 - Remove second call to ixgbe_dev_xstats_get() from
   rte_eth_xstats_get().

v5:
 - Added documentation for proc_info.
 - Fixed proc_info copyright year.
 - Display queue stats for all devices in proc_info.

v6:
 - Modified the driver implementation of ixgbe_dev_xstats_get() so that
   it doesn't worry about the generic stats written by the generic layer.

Maryam Tahhan (9):
  ixgbe: move stats register reads to a new function
  ixgbe: add functions to get and reset xstats
  ethdev: expose extended error stats
  ethdev: remove HW specific stats in stats structs
  ixgbe: add NIC specific stats removed from ethdev
  ixgbe: return more errors in ierrors
  app: remove dump_cfg
  app: add a new app proc_info
  doc: Add documentation for proc_info

 MAINTAINERS                            |   4 +
 app/Makefile                           |   2 +-
 app/dump_cfg/Makefile                  |  45 -----
 app/dump_cfg/main.c                    |  92 ---------
 app/proc_info/Makefile                 |  45 +++++
 app/proc_info/main.c                   | 354 +++++++++++++++++++++++++++++++++
 doc/guides/rel_notes/abi.rst           |  12 ++
 doc/guides/sample_app_ug/index.rst     |   1 +
 doc/guides/sample_app_ug/proc_info.rst |  71 +++++++
 drivers/net/ixgbe/ixgbe_ethdev.c       | 193 ++++++++++++++----
 lib/librte_ether/rte_ethdev.c          |  40 ++--
 lib/librte_ether/rte_ethdev.h          |  30 ++-
 mk/rte.sdktest.mk                      |   4 +-
 13 files changed, 685 insertions(+), 208 deletions(-)
 delete mode 100644 app/dump_cfg/Makefile
 delete mode 100644 app/dump_cfg/main.c
 create mode 100644 app/proc_info/Makefile
 create mode 100644 app/proc_info/main.c
 create mode 100644 doc/guides/sample_app_ug/proc_info.rst
 mode change 100644 => 100755 lib/librte_ether/rte_ethdev.c

-- 
2.4.3

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v10 02/19] mbuf: add definitions of unified packet types
  @ 2015-07-15 10:19  0%     ` Olivier MATZ
  0 siblings, 0 replies; 200+ results
From: Olivier MATZ @ 2015-07-15 10:19 UTC (permalink / raw)
  To: Helin Zhang, dev

On 07/09/2015 06:31 PM, Helin Zhang wrote:
> As there are only 6 bit flags in ol_flags for indicating packet
> types, which is not enough to describe all the possible packet
> types hardware can recognize. For example, i40e hardware can
> recognize more than 150 packet types. Unified packet type is
> composed of L2 type, L3 type, L4 type, tunnel type, inner L2 type,
> inner L3 type and inner L4 type fields, and can be stored in
> 'struct rte_mbuf' of 32 bits field 'packet_type'.
> To avoid breaking ABI compatibility, all the changes would be
> enabled by RTE_NEXT_ABI, which is disabled by default.
>
> Signed-off-by: Helin Zhang <helin.zhang@intel.com>

Acked-by: Olivier Matz <olivier.matz@6wind.com>

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v9 8/9] doc: announce ABI change of librte_malloc
  2015-07-15  8:26  4%   ` [dpdk-dev] [PATCH v9 0/9] Dynamic memzones Sergio Gonzalez Monroy
  2015-07-15  8:26  1%     ` [dpdk-dev] [PATCH v9 2/9] eal: memzone allocated by malloc Sergio Gonzalez Monroy
@ 2015-07-15  8:26 19%     ` Sergio Gonzalez Monroy
  2015-07-15 16:32  3%     ` [dpdk-dev] [PATCH v10 0/9] Dynamic memzones Sergio Gonzalez Monroy
  2 siblings, 0 replies; 200+ results
From: Sergio Gonzalez Monroy @ 2015-07-15  8:26 UTC (permalink / raw)
  To: dev

Announce the creation of dummy malloc library for 2.1 and removal of
such library, now integrated in librte_eal, for 2.2 release.

Signed-off-by: Sergio Gonzalez Monroy <sergio.gonzalez.monroy@intel.com>
---
 doc/guides/rel_notes/abi.rst | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst
index 931e785..76e0ae2 100644
--- a/doc/guides/rel_notes/abi.rst
+++ b/doc/guides/rel_notes/abi.rst
@@ -16,7 +16,6 @@ Examples of Deprecation Notices
 
 Deprecation Notices
 -------------------
-
 * Significant ABI changes are planned for struct rte_eth_dev to support up to
   1024 queues per port. This change will be in release 2.2.
   There is no backward compatibility planned from release 2.2.
@@ -24,3 +23,8 @@ Deprecation Notices
 
 * The Macros RTE_HASH_BUCKET_ENTRIES_MAX and RTE_HASH_KEY_LENGTH_MAX are
   deprecated and will be removed with version 2.2.
+
+* librte_malloc library has been integrated into librte_eal. The 2.1 release
+  creates a dummy/empty malloc library to fulfill binaries with dynamic linking
+  dependencies on librte_malloc.so. Such dummy library will not be created from
+  release 2.2 so binaries will need to be rebuilt.
-- 
1.9.3

^ permalink raw reply	[relevance 19%]

* [dpdk-dev] [PATCH v9 2/9] eal: memzone allocated by malloc
  2015-07-15  8:26  4%   ` [dpdk-dev] [PATCH v9 0/9] Dynamic memzones Sergio Gonzalez Monroy
@ 2015-07-15  8:26  1%     ` Sergio Gonzalez Monroy
  2015-07-15  8:26 19%     ` [dpdk-dev] [PATCH v9 8/9] doc: announce ABI change of librte_malloc Sergio Gonzalez Monroy
  2015-07-15 16:32  3%     ` [dpdk-dev] [PATCH v10 0/9] Dynamic memzones Sergio Gonzalez Monroy
  2 siblings, 0 replies; 200+ results
From: Sergio Gonzalez Monroy @ 2015-07-15  8:26 UTC (permalink / raw)
  To: dev

In the current memory hierarchy, memsegs are groups of physically
contiguous hugepages, memzones are slices of memsegs and malloc further
slices memzones into smaller memory chunks.

This patch modifies malloc so it partitions memsegs instead of memzones.
Thus memzones would call malloc internally for memory allocation while
maintaining its ABI.

It would be possible to free memzones and therefore any other structure
based on memzones, ie. mempools

Signed-off-by: Sergio Gonzalez Monroy <sergio.gonzalez.monroy@intel.com>
---
 lib/librte_eal/common/eal_common_memzone.c        | 289 +++++-----------------
 lib/librte_eal/common/include/rte_eal_memconfig.h |   2 +-
 lib/librte_eal/common/include/rte_malloc_heap.h   |   3 +-
 lib/librte_eal/common/malloc_elem.c               |  68 +++--
 lib/librte_eal/common/malloc_elem.h               |  14 +-
 lib/librte_eal/common/malloc_heap.c               | 161 ++++++------
 lib/librte_eal/common/malloc_heap.h               |   6 +-
 lib/librte_eal/common/rte_malloc.c                |   7 +-
 8 files changed, 220 insertions(+), 330 deletions(-)

diff --git a/lib/librte_eal/common/eal_common_memzone.c b/lib/librte_eal/common/eal_common_memzone.c
index 9c1da71..fd7e73f 100644
--- a/lib/librte_eal/common/eal_common_memzone.c
+++ b/lib/librte_eal/common/eal_common_memzone.c
@@ -50,15 +50,15 @@
 #include <rte_string_fns.h>
 #include <rte_common.h>
 
+#include "malloc_heap.h"
+#include "malloc_elem.h"
 #include "eal_private.h"
 
-/* internal copy of free memory segments */
-static struct rte_memseg *free_memseg = NULL;
-
 static inline const struct rte_memzone *
 memzone_lookup_thread_unsafe(const char *name)
 {
 	const struct rte_mem_config *mcfg;
+	const struct rte_memzone *mz;
 	unsigned i = 0;
 
 	/* get pointer to global configuration */
@@ -68,62 +68,62 @@ memzone_lookup_thread_unsafe(const char *name)
 	 * the algorithm is not optimal (linear), but there are few
 	 * zones and this function should be called at init only
 	 */
-	for (i = 0; i < RTE_MAX_MEMZONE && mcfg->memzone[i].addr != NULL; i++) {
-		if (!strncmp(name, mcfg->memzone[i].name, RTE_MEMZONE_NAMESIZE))
+	for (i = 0; i < RTE_MAX_MEMZONE; i++) {
+		mz = &mcfg->memzone[i];
+		if (mz->addr != NULL && !strncmp(name, mz->name, RTE_MEMZONE_NAMESIZE))
 			return &mcfg->memzone[i];
 	}
 
 	return NULL;
 }
 
-/*
- * Helper function for memzone_reserve_aligned_thread_unsafe().
- * Calculate address offset from the start of the segment.
- * Align offset in that way that it satisfy istart alignmnet and
- * buffer of the  requested length would not cross specified boundary.
- */
-static inline phys_addr_t
-align_phys_boundary(const struct rte_memseg *ms, size_t len, size_t align,
-	size_t bound)
+/* Find the heap with the greatest free block size */
+static void
+find_heap_max_free_elem(int *s, size_t *len, unsigned align)
 {
-	phys_addr_t addr_offset, bmask, end, start;
-	size_t step;
+	struct rte_mem_config *mcfg;
+	struct rte_malloc_socket_stats stats;
+	unsigned i;
 
-	step = RTE_MAX(align, bound);
-	bmask = ~((phys_addr_t)bound - 1);
+	/* get pointer to global configuration */
+	mcfg = rte_eal_get_configuration()->mem_config;
 
-	/* calculate offset to closest alignment */
-	start = RTE_ALIGN_CEIL(ms->phys_addr, align);
-	addr_offset = start - ms->phys_addr;
+	for (i = 0; i < RTE_MAX_NUMA_NODES; i++) {
+		malloc_heap_get_stats(&mcfg->malloc_heaps[i], &stats);
+		if (stats.greatest_free_size > *len) {
+			*len = stats.greatest_free_size;
+			*s = i;
+		}
+	}
+	*len -= (MALLOC_ELEM_OVERHEAD + align);
+}
 
-	while (addr_offset + len < ms->len) {
+/* Find a heap that can allocate the requested size */
+static void
+find_heap_suitable(int *s, size_t len, unsigned align)
+{
+	struct rte_mem_config *mcfg;
+	struct rte_malloc_socket_stats stats;
+	unsigned i;
 
-		/* check, do we meet boundary condition */
-		end = start + len - (len != 0);
-		if ((start & bmask) == (end & bmask))
-			break;
+	/* get pointer to global configuration */
+	mcfg = rte_eal_get_configuration()->mem_config;
 
-		/* calculate next offset */
-		start = RTE_ALIGN_CEIL(start + 1, step);
-		addr_offset = start - ms->phys_addr;
+	for (i = 0; i < RTE_MAX_NUMA_NODES; i++) {
+		malloc_heap_get_stats(&mcfg->malloc_heaps[i], &stats);
+		if (stats.greatest_free_size >= len + MALLOC_ELEM_OVERHEAD + align) {
+			*s = i;
+			break;
+		}
 	}
-
-	return addr_offset;
 }
 
 static const struct rte_memzone *
 memzone_reserve_aligned_thread_unsafe(const char *name, size_t len,
-		int socket_id, uint64_t size_mask, unsigned align,
-		unsigned bound)
+		int socket_id, unsigned flags, unsigned align, unsigned bound)
 {
 	struct rte_mem_config *mcfg;
-	unsigned i = 0;
-	int memseg_idx = -1;
-	uint64_t addr_offset, seg_offset = 0;
 	size_t requested_len;
-	size_t memseg_len = 0;
-	phys_addr_t memseg_physaddr;
-	void *memseg_addr;
 
 	/* get pointer to global configuration */
 	mcfg = rte_eal_get_configuration()->mem_config;
@@ -155,7 +155,6 @@ memzone_reserve_aligned_thread_unsafe(const char *name, size_t len,
 	if (align < RTE_CACHE_LINE_SIZE)
 		align = RTE_CACHE_LINE_SIZE;
 
-
 	/* align length on cache boundary. Check for overflow before doing so */
 	if (len > SIZE_MAX - RTE_CACHE_LINE_MASK) {
 		rte_errno = EINVAL; /* requested size too big */
@@ -169,108 +168,50 @@ memzone_reserve_aligned_thread_unsafe(const char *name, size_t len,
 	requested_len = RTE_MAX((size_t)RTE_CACHE_LINE_SIZE,  len);
 
 	/* check that boundary condition is valid */
-	if (bound != 0 &&
-			(requested_len > bound || !rte_is_power_of_2(bound))) {
+	if (bound != 0 && (requested_len > bound || !rte_is_power_of_2(bound))) {
 		rte_errno = EINVAL;
 		return NULL;
 	}
 
-	/* find the smallest segment matching requirements */
-	for (i = 0; i < RTE_MAX_MEMSEG; i++) {
-		/* last segment */
-		if (free_memseg[i].addr == NULL)
-			break;
+	if (len == 0) {
+		if (bound != 0)
+			requested_len = bound;
+		else
+			requested_len = 0;
+	}
 
-		/* empty segment, skip it */
-		if (free_memseg[i].len == 0)
-			continue;
-
-		/* bad socket ID */
-		if (socket_id != SOCKET_ID_ANY &&
-		    free_memseg[i].socket_id != SOCKET_ID_ANY &&
-		    socket_id != free_memseg[i].socket_id)
-			continue;
-
-		/*
-		 * calculate offset to closest alignment that
-		 * meets boundary conditions.
-		 */
-		addr_offset = align_phys_boundary(free_memseg + i,
-			requested_len, align, bound);
-
-		/* check len */
-		if ((requested_len + addr_offset) > free_memseg[i].len)
-			continue;
-
-		if ((size_mask & free_memseg[i].hugepage_sz) == 0)
-			continue;
-
-		/* this segment is the best until now */
-		if (memseg_idx == -1) {
-			memseg_idx = i;
-			memseg_len = free_memseg[i].len;
-			seg_offset = addr_offset;
-		}
-		/* find the biggest contiguous zone */
-		else if (len == 0) {
-			if (free_memseg[i].len > memseg_len) {
-				memseg_idx = i;
-				memseg_len = free_memseg[i].len;
-				seg_offset = addr_offset;
-			}
-		}
-		/*
-		 * find the smallest (we already checked that current
-		 * zone length is > len
-		 */
-		else if (free_memseg[i].len + align < memseg_len ||
-				(free_memseg[i].len <= memseg_len + align &&
-				addr_offset < seg_offset)) {
-			memseg_idx = i;
-			memseg_len = free_memseg[i].len;
-			seg_offset = addr_offset;
+	if (socket_id == SOCKET_ID_ANY) {
+		if (requested_len == 0)
+			find_heap_max_free_elem(&socket_id, &requested_len, align);
+		else
+			find_heap_suitable(&socket_id, requested_len, align);
+
+		if (socket_id == SOCKET_ID_ANY) {
+			rte_errno = ENOMEM;
+			return NULL;
 		}
 	}
 
-	/* no segment found */
-	if (memseg_idx == -1) {
+	/* allocate memory on heap */
+	void *mz_addr = malloc_heap_alloc(&mcfg->malloc_heaps[socket_id], NULL,
+			requested_len, flags, align, bound);
+	if (mz_addr == NULL) {
 		rte_errno = ENOMEM;
 		return NULL;
 	}
 
-	/* save aligned physical and virtual addresses */
-	memseg_physaddr = free_memseg[memseg_idx].phys_addr + seg_offset;
-	memseg_addr = RTE_PTR_ADD(free_memseg[memseg_idx].addr,
-			(uintptr_t) seg_offset);
-
-	/* if we are looking for a biggest memzone */
-	if (len == 0) {
-		if (bound == 0)
-			requested_len = memseg_len - seg_offset;
-		else
-			requested_len = RTE_ALIGN_CEIL(memseg_physaddr + 1,
-				bound) - memseg_physaddr;
-	}
-
-	/* set length to correct value */
-	len = (size_t)seg_offset + requested_len;
-
-	/* update our internal state */
-	free_memseg[memseg_idx].len -= len;
-	free_memseg[memseg_idx].phys_addr += len;
-	free_memseg[memseg_idx].addr =
-		(char *)free_memseg[memseg_idx].addr + len;
+	const struct malloc_elem *elem = malloc_elem_from_data(mz_addr);
 
 	/* fill the zone in config */
 	struct rte_memzone *mz = &mcfg->memzone[mcfg->memzone_idx++];
 	snprintf(mz->name, sizeof(mz->name), "%s", name);
-	mz->phys_addr = memseg_physaddr;
-	mz->addr = memseg_addr;
-	mz->len = requested_len;
-	mz->hugepage_sz = free_memseg[memseg_idx].hugepage_sz;
-	mz->socket_id = free_memseg[memseg_idx].socket_id;
+	mz->phys_addr = rte_malloc_virt2phy(mz_addr);
+	mz->addr = mz_addr;
+	mz->len = (requested_len == 0 ? elem->size : requested_len);
+	mz->hugepage_sz = elem->ms->hugepage_sz;
+	mz->socket_id = elem->ms->socket_id;
 	mz->flags = 0;
-	mz->memseg_id = memseg_idx;
+	mz->memseg_id = elem->ms - rte_eal_get_configuration()->mem_config->memseg;
 
 	return mz;
 }
@@ -282,26 +223,6 @@ rte_memzone_reserve_thread_safe(const char *name, size_t len,
 {
 	struct rte_mem_config *mcfg;
 	const struct rte_memzone *mz = NULL;
-	uint64_t size_mask = 0;
-
-	if (flags & RTE_MEMZONE_256KB)
-		size_mask |= RTE_PGSIZE_256K;
-	if (flags & RTE_MEMZONE_2MB)
-		size_mask |= RTE_PGSIZE_2M;
-	if (flags & RTE_MEMZONE_16MB)
-		size_mask |= RTE_PGSIZE_16M;
-	if (flags & RTE_MEMZONE_256MB)
-		size_mask |= RTE_PGSIZE_256M;
-	if (flags & RTE_MEMZONE_512MB)
-		size_mask |= RTE_PGSIZE_512M;
-	if (flags & RTE_MEMZONE_1GB)
-		size_mask |= RTE_PGSIZE_1G;
-	if (flags & RTE_MEMZONE_4GB)
-		size_mask |= RTE_PGSIZE_4G;
-	if (flags & RTE_MEMZONE_16GB)
-		size_mask |= RTE_PGSIZE_16G;
-	if (!size_mask)
-		size_mask = UINT64_MAX;
 
 	/* get pointer to global configuration */
 	mcfg = rte_eal_get_configuration()->mem_config;
@@ -309,18 +230,7 @@ rte_memzone_reserve_thread_safe(const char *name, size_t len,
 	rte_rwlock_write_lock(&mcfg->mlock);
 
 	mz = memzone_reserve_aligned_thread_unsafe(
-		name, len, socket_id, size_mask, align, bound);
-
-	/*
-	 * If we failed to allocate the requested page size, and the
-	 * RTE_MEMZONE_SIZE_HINT_ONLY flag is specified, try allocating
-	 * again.
-	 */
-	if (!mz && rte_errno == ENOMEM && size_mask != UINT64_MAX &&
-	    flags & RTE_MEMZONE_SIZE_HINT_ONLY) {
-		mz = memzone_reserve_aligned_thread_unsafe(
-			name, len, socket_id, UINT64_MAX, align, bound);
-	}
+		name, len, socket_id, flags, align, bound);
 
 	rte_rwlock_write_unlock(&mcfg->mlock);
 
@@ -412,45 +322,6 @@ rte_memzone_dump(FILE *f)
 }
 
 /*
- * called by init: modify the free memseg list to have cache-aligned
- * addresses and cache-aligned lengths
- */
-static int
-memseg_sanitize(struct rte_memseg *memseg)
-{
-	unsigned phys_align;
-	unsigned virt_align;
-	unsigned off;
-
-	phys_align = memseg->phys_addr & RTE_CACHE_LINE_MASK;
-	virt_align = (unsigned long)memseg->addr & RTE_CACHE_LINE_MASK;
-
-	/*
-	 * sanity check: phys_addr and addr must have the same
-	 * alignment
-	 */
-	if (phys_align != virt_align)
-		return -1;
-
-	/* memseg is really too small, don't bother with it */
-	if (memseg->len < (2 * RTE_CACHE_LINE_SIZE)) {
-		memseg->len = 0;
-		return 0;
-	}
-
-	/* align start address */
-	off = (RTE_CACHE_LINE_SIZE - phys_align) & RTE_CACHE_LINE_MASK;
-	memseg->phys_addr += off;
-	memseg->addr = (char *)memseg->addr + off;
-	memseg->len -= off;
-
-	/* align end address */
-	memseg->len &= ~((uint64_t)RTE_CACHE_LINE_MASK);
-
-	return 0;
-}
-
-/*
  * Init the memzone subsystem
  */
 int
@@ -458,14 +329,10 @@ rte_eal_memzone_init(void)
 {
 	struct rte_mem_config *mcfg;
 	const struct rte_memseg *memseg;
-	unsigned i = 0;
 
 	/* get pointer to global configuration */
 	mcfg = rte_eal_get_configuration()->mem_config;
 
-	/* mirror the runtime memsegs from config */
-	free_memseg = mcfg->free_memseg;
-
 	/* secondary processes don't need to initialise anything */
 	if (rte_eal_process_type() == RTE_PROC_SECONDARY)
 		return 0;
@@ -478,33 +345,13 @@ rte_eal_memzone_init(void)
 
 	rte_rwlock_write_lock(&mcfg->mlock);
 
-	/* fill in uninitialized free_memsegs */
-	for (i = 0; i < RTE_MAX_MEMSEG; i++) {
-		if (memseg[i].addr == NULL)
-			break;
-		if (free_memseg[i].addr != NULL)
-			continue;
-		memcpy(&free_memseg[i], &memseg[i], sizeof(struct rte_memseg));
-	}
-
-	/* make all zones cache-aligned */
-	for (i = 0; i < RTE_MAX_MEMSEG; i++) {
-		if (free_memseg[i].addr == NULL)
-			break;
-		if (memseg_sanitize(&free_memseg[i]) < 0) {
-			RTE_LOG(ERR, EAL, "%s(): Sanity check failed\n", __func__);
-			rte_rwlock_write_unlock(&mcfg->mlock);
-			return -1;
-		}
-	}
-
 	/* delete all zones */
 	mcfg->memzone_idx = 0;
 	memset(mcfg->memzone, 0, sizeof(mcfg->memzone));
 
 	rte_rwlock_write_unlock(&mcfg->mlock);
 
-	return 0;
+	return rte_eal_malloc_heap_init();
 }
 
 /* Walk all reserved memory zones */
diff --git a/lib/librte_eal/common/include/rte_eal_memconfig.h b/lib/librte_eal/common/include/rte_eal_memconfig.h
index 34f5abc..055212a 100644
--- a/lib/librte_eal/common/include/rte_eal_memconfig.h
+++ b/lib/librte_eal/common/include/rte_eal_memconfig.h
@@ -73,7 +73,7 @@ struct rte_mem_config {
 	struct rte_memseg memseg[RTE_MAX_MEMSEG];    /**< Physmem descriptors. */
 	struct rte_memzone memzone[RTE_MAX_MEMZONE]; /**< Memzone descriptors. */
 
-	/* Runtime Physmem descriptors. */
+	/* Runtime Physmem descriptors - NOT USED */
 	struct rte_memseg free_memseg[RTE_MAX_MEMSEG];
 
 	struct rte_tailq_head tailq_head[RTE_MAX_TAILQ]; /**< Tailqs for objects */
diff --git a/lib/librte_eal/common/include/rte_malloc_heap.h b/lib/librte_eal/common/include/rte_malloc_heap.h
index 716216f..b270356 100644
--- a/lib/librte_eal/common/include/rte_malloc_heap.h
+++ b/lib/librte_eal/common/include/rte_malloc_heap.h
@@ -40,7 +40,7 @@
 #include <rte_memory.h>
 
 /* Number of free lists per heap, grouped by size. */
-#define RTE_HEAP_NUM_FREELISTS  5
+#define RTE_HEAP_NUM_FREELISTS  13
 
 /**
  * Structure to hold malloc heap
@@ -48,7 +48,6 @@
 struct malloc_heap {
 	rte_spinlock_t lock;
 	LIST_HEAD(, malloc_elem) free_head[RTE_HEAP_NUM_FREELISTS];
-	unsigned mz_count;
 	unsigned alloc_count;
 	size_t total_size;
 } __rte_cache_aligned;
diff --git a/lib/librte_eal/common/malloc_elem.c b/lib/librte_eal/common/malloc_elem.c
index a5e1248..b54ee33 100644
--- a/lib/librte_eal/common/malloc_elem.c
+++ b/lib/librte_eal/common/malloc_elem.c
@@ -37,7 +37,6 @@
 #include <sys/queue.h>
 
 #include <rte_memory.h>
-#include <rte_memzone.h>
 #include <rte_eal.h>
 #include <rte_launch.h>
 #include <rte_per_lcore.h>
@@ -56,10 +55,10 @@
  */
 void
 malloc_elem_init(struct malloc_elem *elem,
-		struct malloc_heap *heap, const struct rte_memzone *mz, size_t size)
+		struct malloc_heap *heap, const struct rte_memseg *ms, size_t size)
 {
 	elem->heap = heap;
-	elem->mz = mz;
+	elem->ms = ms;
 	elem->prev = NULL;
 	memset(&elem->free_list, 0, sizeof(elem->free_list));
 	elem->state = ELEM_FREE;
@@ -70,12 +69,12 @@ malloc_elem_init(struct malloc_elem *elem,
 }
 
 /*
- * initialise a dummy malloc_elem header for the end-of-memzone marker
+ * initialise a dummy malloc_elem header for the end-of-memseg marker
  */
 void
 malloc_elem_mkend(struct malloc_elem *elem, struct malloc_elem *prev)
 {
-	malloc_elem_init(elem, prev->heap, prev->mz, 0);
+	malloc_elem_init(elem, prev->heap, prev->ms, 0);
 	elem->prev = prev;
 	elem->state = ELEM_BUSY; /* mark busy so its never merged */
 }
@@ -86,12 +85,24 @@ malloc_elem_mkend(struct malloc_elem *elem, struct malloc_elem *prev)
  * fit, return NULL.
  */
 static void *
-elem_start_pt(struct malloc_elem *elem, size_t size, unsigned align)
+elem_start_pt(struct malloc_elem *elem, size_t size, unsigned align,
+		size_t bound)
 {
-	const uintptr_t end_pt = (uintptr_t)elem +
+	const size_t bmask = ~(bound - 1);
+	uintptr_t end_pt = (uintptr_t)elem +
 			elem->size - MALLOC_ELEM_TRAILER_LEN;
-	const uintptr_t new_data_start = RTE_ALIGN_FLOOR((end_pt - size), align);
-	const uintptr_t new_elem_start = new_data_start - MALLOC_ELEM_HEADER_LEN;
+	uintptr_t new_data_start = RTE_ALIGN_FLOOR((end_pt - size), align);
+	uintptr_t new_elem_start;
+
+	/* check boundary */
+	if ((new_data_start & bmask) != ((end_pt - 1) & bmask)) {
+		end_pt = RTE_ALIGN_FLOOR(end_pt, bound);
+		new_data_start = RTE_ALIGN_FLOOR((end_pt - size), align);
+		if (((end_pt - 1) & bmask) != (new_data_start & bmask))
+			return NULL;
+	}
+
+	new_elem_start = new_data_start - MALLOC_ELEM_HEADER_LEN;
 
 	/* if the new start point is before the exist start, it won't fit */
 	return (new_elem_start < (uintptr_t)elem) ? NULL : (void *)new_elem_start;
@@ -102,9 +113,10 @@ elem_start_pt(struct malloc_elem *elem, size_t size, unsigned align)
  * alignment request from the current element
  */
 int
-malloc_elem_can_hold(struct malloc_elem *elem, size_t size, unsigned align)
+malloc_elem_can_hold(struct malloc_elem *elem, size_t size,	unsigned align,
+		size_t bound)
 {
-	return elem_start_pt(elem, size, align) != NULL;
+	return elem_start_pt(elem, size, align, bound) != NULL;
 }
 
 /*
@@ -115,10 +127,10 @@ static void
 split_elem(struct malloc_elem *elem, struct malloc_elem *split_pt)
 {
 	struct malloc_elem *next_elem = RTE_PTR_ADD(elem, elem->size);
-	const unsigned old_elem_size = (uintptr_t)split_pt - (uintptr_t)elem;
-	const unsigned new_elem_size = elem->size - old_elem_size;
+	const size_t old_elem_size = (uintptr_t)split_pt - (uintptr_t)elem;
+	const size_t new_elem_size = elem->size - old_elem_size;
 
-	malloc_elem_init(split_pt, elem->heap, elem->mz, new_elem_size);
+	malloc_elem_init(split_pt, elem->heap, elem->ms, new_elem_size);
 	split_pt->prev = elem;
 	next_elem->prev = split_pt;
 	elem->size = old_elem_size;
@@ -168,8 +180,9 @@ malloc_elem_free_list_index(size_t size)
 void
 malloc_elem_free_list_insert(struct malloc_elem *elem)
 {
-	size_t idx = malloc_elem_free_list_index(elem->size - MALLOC_ELEM_HEADER_LEN);
+	size_t idx;
 
+	idx = malloc_elem_free_list_index(elem->size - MALLOC_ELEM_HEADER_LEN);
 	elem->state = ELEM_FREE;
 	LIST_INSERT_HEAD(&elem->heap->free_head[idx], elem, free_list);
 }
@@ -190,12 +203,26 @@ elem_free_list_remove(struct malloc_elem *elem)
  * is not done here, as it's done there previously.
  */
 struct malloc_elem *
-malloc_elem_alloc(struct malloc_elem *elem, size_t size, unsigned align)
+malloc_elem_alloc(struct malloc_elem *elem, size_t size, unsigned align,
+		size_t bound)
 {
-	struct malloc_elem *new_elem = elem_start_pt(elem, size, align);
-	const unsigned old_elem_size = (uintptr_t)new_elem - (uintptr_t)elem;
+	struct malloc_elem *new_elem = elem_start_pt(elem, size, align, bound);
+	const size_t old_elem_size = (uintptr_t)new_elem - (uintptr_t)elem;
+	const size_t trailer_size = elem->size - old_elem_size - size -
+		MALLOC_ELEM_OVERHEAD;
+
+	elem_free_list_remove(elem);
 
-	if (old_elem_size < MALLOC_ELEM_OVERHEAD + MIN_DATA_SIZE){
+	if (trailer_size > MALLOC_ELEM_OVERHEAD + MIN_DATA_SIZE) {
+		/* split it, too much free space after elem */
+		struct malloc_elem *new_free_elem =
+				RTE_PTR_ADD(new_elem, size + MALLOC_ELEM_OVERHEAD);
+
+		split_elem(elem, new_free_elem);
+		malloc_elem_free_list_insert(new_free_elem);
+	}
+
+	if (old_elem_size < MALLOC_ELEM_OVERHEAD + MIN_DATA_SIZE) {
 		/* don't split it, pad the element instead */
 		elem->state = ELEM_BUSY;
 		elem->pad = old_elem_size;
@@ -208,8 +235,6 @@ malloc_elem_alloc(struct malloc_elem *elem, size_t size, unsigned align)
 			new_elem->size = elem->size - elem->pad;
 			set_header(new_elem);
 		}
-		/* remove element from free list */
-		elem_free_list_remove(elem);
 
 		return new_elem;
 	}
@@ -219,7 +244,6 @@ malloc_elem_alloc(struct malloc_elem *elem, size_t size, unsigned align)
 	 * Re-insert original element, in case its new size makes it
 	 * belong on a different list.
 	 */
-	elem_free_list_remove(elem);
 	split_elem(elem, new_elem);
 	new_elem->state = ELEM_BUSY;
 	malloc_elem_free_list_insert(elem);
diff --git a/lib/librte_eal/common/malloc_elem.h b/lib/librte_eal/common/malloc_elem.h
index 9790b1a..e05d2ea 100644
--- a/lib/librte_eal/common/malloc_elem.h
+++ b/lib/librte_eal/common/malloc_elem.h
@@ -47,9 +47,9 @@ enum elem_state {
 
 struct malloc_elem {
 	struct malloc_heap *heap;
-	struct malloc_elem *volatile prev;      /* points to prev elem in memzone */
+	struct malloc_elem *volatile prev;      /* points to prev elem in memseg */
 	LIST_ENTRY(malloc_elem) free_list;      /* list of free elements in heap */
-	const struct rte_memzone *mz;
+	const struct rte_memseg *ms;
 	volatile enum elem_state state;
 	uint32_t pad;
 	size_t size;
@@ -136,11 +136,11 @@ malloc_elem_from_data(const void *data)
 void
 malloc_elem_init(struct malloc_elem *elem,
 		struct malloc_heap *heap,
-		const struct rte_memzone *mz,
+		const struct rte_memseg *ms,
 		size_t size);
 
 /*
- * initialise a dummy malloc_elem header for the end-of-memzone marker
+ * initialise a dummy malloc_elem header for the end-of-memseg marker
  */
 void
 malloc_elem_mkend(struct malloc_elem *elem,
@@ -151,14 +151,16 @@ malloc_elem_mkend(struct malloc_elem *elem,
  * of the requested size and with the requested alignment
  */
 int
-malloc_elem_can_hold(struct malloc_elem *elem, size_t size, unsigned align);
+malloc_elem_can_hold(struct malloc_elem *elem, size_t size,
+		unsigned align, size_t bound);
 
 /*
  * reserve a block of data in an existing malloc_elem. If the malloc_elem
  * is much larger than the data block requested, we split the element in two.
  */
 struct malloc_elem *
-malloc_elem_alloc(struct malloc_elem *elem, size_t size, unsigned align);
+malloc_elem_alloc(struct malloc_elem *elem, size_t size,
+		unsigned align, size_t bound);
 
 /*
  * free a malloc_elem block by adding it to the free list. If the
diff --git a/lib/librte_eal/common/malloc_heap.c b/lib/librte_eal/common/malloc_heap.c
index 8861d27..21d8914 100644
--- a/lib/librte_eal/common/malloc_heap.c
+++ b/lib/librte_eal/common/malloc_heap.c
@@ -39,7 +39,6 @@
 #include <sys/queue.h>
 
 #include <rte_memory.h>
-#include <rte_memzone.h>
 #include <rte_eal.h>
 #include <rte_eal_memconfig.h>
 #include <rte_launch.h>
@@ -54,123 +53,125 @@
 #include "malloc_elem.h"
 #include "malloc_heap.h"
 
-/* since the memzone size starts with a digit, it will appear unquoted in
- * rte_config.h, so quote it so it can be passed to rte_str_to_size */
-#define MALLOC_MEMZONE_SIZE RTE_STR(RTE_MALLOC_MEMZONE_SIZE)
-
-/*
- * returns the configuration setting for the memzone size as a size_t value
- */
-static inline size_t
-get_malloc_memzone_size(void)
+static unsigned
+check_hugepage_sz(unsigned flags, uint64_t hugepage_sz)
 {
-	return rte_str_to_size(MALLOC_MEMZONE_SIZE);
+	unsigned check_flag = 0;
+
+	if (!(flags & ~RTE_MEMZONE_SIZE_HINT_ONLY))
+		return 1;
+
+	switch (hugepage_sz) {
+	case RTE_PGSIZE_256K:
+		check_flag = RTE_MEMZONE_256KB;
+		break;
+	case RTE_PGSIZE_2M:
+		check_flag = RTE_MEMZONE_2MB;
+		break;
+	case RTE_PGSIZE_16M:
+		check_flag = RTE_MEMZONE_16MB;
+		break;
+	case RTE_PGSIZE_256M:
+		check_flag = RTE_MEMZONE_256MB;
+		break;
+	case RTE_PGSIZE_512M:
+		check_flag = RTE_MEMZONE_512MB;
+		break;
+	case RTE_PGSIZE_1G:
+		check_flag = RTE_MEMZONE_1GB;
+		break;
+	case RTE_PGSIZE_4G:
+		check_flag = RTE_MEMZONE_4GB;
+		break;
+	case RTE_PGSIZE_16G:
+		check_flag = RTE_MEMZONE_16GB;
+	}
+
+	return (check_flag & flags);
 }
 
 /*
- * reserve an extra memory zone and make it available for use by a particular
- * heap. This reserves the zone and sets a dummy malloc_elem header at the end
+ * Expand the heap with a memseg.
+ * This reserves the zone and sets a dummy malloc_elem header at the end
  * to prevent overflow. The rest of the zone is added to free list as a single
  * large free block
  */
-static int
-malloc_heap_add_memzone(struct malloc_heap *heap, size_t size, unsigned align)
+static void
+malloc_heap_add_memseg(struct malloc_heap *heap, struct rte_memseg *ms)
 {
-	const unsigned mz_flags = 0;
-	const size_t block_size = get_malloc_memzone_size();
-	/* ensure the data we want to allocate will fit in the memzone */
-	const size_t min_size = size + align + MALLOC_ELEM_OVERHEAD * 2;
-	const struct rte_memzone *mz = NULL;
-	struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
-	unsigned numa_socket = heap - mcfg->malloc_heaps;
-
-	size_t mz_size = min_size;
-	if (mz_size < block_size)
-		mz_size = block_size;
-
-	char mz_name[RTE_MEMZONE_NAMESIZE];
-	snprintf(mz_name, sizeof(mz_name), "MALLOC_S%u_HEAP_%u",
-		     numa_socket, heap->mz_count++);
-
-	/* try getting a block. if we fail and we don't need as big a block
-	 * as given in the config, we can shrink our request and try again
-	 */
-	do {
-		mz = rte_memzone_reserve(mz_name, mz_size, numa_socket,
-					 mz_flags);
-		if (mz == NULL)
-			mz_size /= 2;
-	} while (mz == NULL && mz_size > min_size);
-	if (mz == NULL)
-		return -1;
-
 	/* allocate the memory block headers, one at end, one at start */
-	struct malloc_elem *start_elem = (struct malloc_elem *)mz->addr;
-	struct malloc_elem *end_elem = RTE_PTR_ADD(mz->addr,
-			mz_size - MALLOC_ELEM_OVERHEAD);
+	struct malloc_elem *start_elem = (struct malloc_elem *)ms->addr;
+	struct malloc_elem *end_elem = RTE_PTR_ADD(ms->addr,
+			ms->len - MALLOC_ELEM_OVERHEAD);
 	end_elem = RTE_PTR_ALIGN_FLOOR(end_elem, RTE_CACHE_LINE_SIZE);
+	const size_t elem_size = (uintptr_t)end_elem - (uintptr_t)start_elem;
 
-	const unsigned elem_size = (uintptr_t)end_elem - (uintptr_t)start_elem;
-	malloc_elem_init(start_elem, heap, mz, elem_size);
+	malloc_elem_init(start_elem, heap, ms, elem_size);
 	malloc_elem_mkend(end_elem, start_elem);
 	malloc_elem_free_list_insert(start_elem);
 
-	/* increase heap total size by size of new memzone */
-	heap->total_size+=mz_size - MALLOC_ELEM_OVERHEAD;
-	return 0;
+	heap->total_size += elem_size;
 }
 
 /*
  * Iterates through the freelist for a heap to find a free element
  * which can store data of the required size and with the requested alignment.
+ * If size is 0, find the biggest available elem.
  * Returns null on failure, or pointer to element on success.
  */
 static struct malloc_elem *
-find_suitable_element(struct malloc_heap *heap, size_t size, unsigned align)
+find_suitable_element(struct malloc_heap *heap, size_t size,
+		unsigned flags, size_t align, size_t bound)
 {
 	size_t idx;
-	struct malloc_elem *elem;
+	struct malloc_elem *elem, *alt_elem = NULL;
 
 	for (idx = malloc_elem_free_list_index(size);
-		idx < RTE_HEAP_NUM_FREELISTS; idx++)
-	{
+			idx < RTE_HEAP_NUM_FREELISTS; idx++) {
 		for (elem = LIST_FIRST(&heap->free_head[idx]);
-			!!elem; elem = LIST_NEXT(elem, free_list))
-		{
-			if (malloc_elem_can_hold(elem, size, align))
-				return elem;
+				!!elem; elem = LIST_NEXT(elem, free_list)) {
+			if (malloc_elem_can_hold(elem, size, align, bound)) {
+				if (check_hugepage_sz(flags, elem->ms->hugepage_sz))
+					return elem;
+				if (alt_elem == NULL)
+					alt_elem = elem;
+			}
 		}
 	}
+
+	if ((alt_elem != NULL) && (flags & RTE_MEMZONE_SIZE_HINT_ONLY))
+		return alt_elem;
+
 	return NULL;
 }
 
 /*
- * Main function called by malloc to allocate a block of memory from the
- * heap. It locks the free list, scans it, and adds a new memzone if the
- * scan fails. Once the new memzone is added, it re-scans and should return
+ * Main function to allocate a block of memory from the heap.
+ * It locks the free list, scans it, and adds a new memseg if the
+ * scan fails. Once the new memseg is added, it re-scans and should return
  * the new element after releasing the lock.
  */
 void *
 malloc_heap_alloc(struct malloc_heap *heap,
-		const char *type __attribute__((unused)), size_t size, unsigned align)
+		const char *type __attribute__((unused)), size_t size, unsigned flags,
+		size_t align, size_t bound)
 {
+	struct malloc_elem *elem;
+
 	size = RTE_CACHE_LINE_ROUNDUP(size);
 	align = RTE_CACHE_LINE_ROUNDUP(align);
+
 	rte_spinlock_lock(&heap->lock);
-	struct malloc_elem *elem = find_suitable_element(heap, size, align);
-	if (elem == NULL){
-		if ((malloc_heap_add_memzone(heap, size, align)) == 0)
-			elem = find_suitable_element(heap, size, align);
-	}
 
-	if (elem != NULL){
-		elem = malloc_elem_alloc(elem, size, align);
+	elem = find_suitable_element(heap, size, flags, align, bound);
+	if (elem != NULL) {
+		elem = malloc_elem_alloc(elem, size, align, bound);
 		/* increase heap's count of allocated elements */
 		heap->alloc_count++;
 	}
 	rte_spinlock_unlock(&heap->lock);
-	return elem == NULL ? NULL : (void *)(&elem[1]);
 
+	return elem == NULL ? NULL : (void *)(&elem[1]);
 }
 
 /*
@@ -206,3 +207,21 @@ malloc_heap_get_stats(const struct malloc_heap *heap,
 	socket_stats->alloc_count = heap->alloc_count;
 	return 0;
 }
+
+int
+rte_eal_malloc_heap_init(void)
+{
+	struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
+	unsigned ms_cnt;
+	struct rte_memseg *ms;
+
+	if (mcfg == NULL)
+		return -1;
+
+	for (ms = &mcfg->memseg[0], ms_cnt = 0;
+			(ms_cnt < RTE_MAX_MEMSEG) && (ms->len > 0);
+			ms_cnt++, ms++)
+		malloc_heap_add_memseg(&mcfg->malloc_heaps[ms->socket_id], ms);
+
+	return 0;
+}
diff --git a/lib/librte_eal/common/malloc_heap.h b/lib/librte_eal/common/malloc_heap.h
index a47136d..3ccbef0 100644
--- a/lib/librte_eal/common/malloc_heap.h
+++ b/lib/librte_eal/common/malloc_heap.h
@@ -53,15 +53,15 @@ malloc_get_numa_socket(void)
 }
 
 void *
-malloc_heap_alloc(struct malloc_heap *heap, const char *type,
-		size_t size, unsigned align);
+malloc_heap_alloc(struct malloc_heap *heap,	const char *type, size_t size,
+		unsigned flags, size_t align, size_t bound);
 
 int
 malloc_heap_get_stats(const struct malloc_heap *heap,
 		struct rte_malloc_socket_stats *socket_stats);
 
 int
-rte_eal_heap_memzone_init(void);
+rte_eal_malloc_heap_init(void);
 
 #ifdef __cplusplus
 }
diff --git a/lib/librte_eal/common/rte_malloc.c b/lib/librte_eal/common/rte_malloc.c
index c313a57..54c2bd8 100644
--- a/lib/librte_eal/common/rte_malloc.c
+++ b/lib/librte_eal/common/rte_malloc.c
@@ -39,7 +39,6 @@
 
 #include <rte_memcpy.h>
 #include <rte_memory.h>
-#include <rte_memzone.h>
 #include <rte_eal.h>
 #include <rte_eal_memconfig.h>
 #include <rte_branch_prediction.h>
@@ -87,7 +86,7 @@ rte_malloc_socket(const char *type, size_t size, unsigned align, int socket_arg)
 		return NULL;
 
 	ret = malloc_heap_alloc(&mcfg->malloc_heaps[socket], type,
-				size, align == 0 ? 1 : align);
+				size, 0, align == 0 ? 1 : align, 0);
 	if (ret != NULL || socket_arg != SOCKET_ID_ANY)
 		return ret;
 
@@ -98,7 +97,7 @@ rte_malloc_socket(const char *type, size_t size, unsigned align, int socket_arg)
 			continue;
 
 		ret = malloc_heap_alloc(&mcfg->malloc_heaps[i], type,
-					size, align == 0 ? 1 : align);
+					size, 0, align == 0 ? 1 : align, 0);
 		if (ret != NULL)
 			return ret;
 	}
@@ -256,5 +255,5 @@ rte_malloc_virt2phy(const void *addr)
 	const struct malloc_elem *elem = malloc_elem_from_data(addr);
 	if (elem == NULL)
 		return 0;
-	return elem->mz->phys_addr + ((uintptr_t)addr - (uintptr_t)elem->mz->addr);
+	return elem->ms->phys_addr + ((uintptr_t)addr - (uintptr_t)elem->ms->addr);
 }
-- 
1.9.3

^ permalink raw reply	[relevance 1%]

* [dpdk-dev] [PATCH v9 0/9] Dynamic memzones
  2015-07-14  8:57  4% ` [dpdk-dev] [PATCH v8 " Sergio Gonzalez Monroy
  2015-07-14  8:57  1%   ` [dpdk-dev] [PATCH v8 2/9] eal: memzone allocated by malloc Sergio Gonzalez Monroy
  2015-07-14  8:57 19%   ` [dpdk-dev] [PATCH v8 8/9] doc: announce ABI change of librte_malloc Sergio Gonzalez Monroy
@ 2015-07-15  8:26  4%   ` Sergio Gonzalez Monroy
  2015-07-15  8:26  1%     ` [dpdk-dev] [PATCH v9 2/9] eal: memzone allocated by malloc Sergio Gonzalez Monroy
                       ` (2 more replies)
  2 siblings, 3 replies; 200+ results
From: Sergio Gonzalez Monroy @ 2015-07-15  8:26 UTC (permalink / raw)
  To: dev

Current implemetation allows reserving/creating memzones but not the opposite
(unreserve/free). This affects mempools and other memzone based objects.

>From my point of view, implementing free functionality for memzones would look
like malloc over memsegs.
Thus, this approach moves malloc inside eal (which in turn removes a circular
dependency), where malloc heaps are composed of memsegs.
We keep both malloc and memzone APIs as they are, but memzones allocate its
memory by calling malloc_heap_alloc.
Some extra functionality is required in malloc to allow for boundary constrained
memory requests.
In summary, currently malloc is based on memzones, and with this approach
memzones are based on malloc.

v9:
 - Fix incorrect size_t type that results in 32bits compilation error.

v8:
 - Rebase against current HEAD to factor for changes made by new Tile-Gx arch

v7:
 - Create a separated maintainer section for memory allocation

v6:
 - Fix bad patch for rte_memzone_free

v5:
 - Fix rte_memzone_free
 - Improve rte_memzone_free unit test

v4:
 - Rebase and fix couple of merge issues

v3:
 - Create dummy librte_malloc
 - Add deprecation notice
 - Rework some of the code
 - Doc update
 - checkpatch

v2:
 - New rte_memzone_free
 - Support memzone len = 0
 - Add all available memsegs to malloc heap at init
 - Update memzone/malloc unit tests


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


Sergio Gonzalez Monroy (9):
  eal: move librte_malloc to eal/common
  eal: memzone allocated by malloc
  app/test: update malloc/memzone unit tests
  config: remove CONFIG_RTE_MALLOC_MEMZONE_SIZE
  eal: remove free_memseg and references to it
  eal: new rte_memzone_free
  app/test: rte_memzone_free unit test
  doc: announce ABI change of librte_malloc
  doc: update malloc documentation

 MAINTAINERS                                       |  22 +-
 app/test/test_malloc.c                            |  86 ----
 app/test/test_memzone.c                           | 456 ++++------------------
 config/common_bsdapp                              |   8 +-
 config/common_linuxapp                            |   8 +-
 doc/guides/prog_guide/env_abstraction_layer.rst   | 220 ++++++++++-
 doc/guides/prog_guide/img/malloc_heap.png         | Bin 81329 -> 80952 bytes
 doc/guides/prog_guide/index.rst                   |   1 -
 doc/guides/prog_guide/malloc_lib.rst              | 233 -----------
 doc/guides/prog_guide/overview.rst                |  11 +-
 doc/guides/rel_notes/abi.rst                      |   6 +-
 drivers/net/af_packet/Makefile                    |   1 -
 drivers/net/bonding/Makefile                      |   1 -
 drivers/net/e1000/Makefile                        |   2 +-
 drivers/net/enic/Makefile                         |   2 +-
 drivers/net/fm10k/Makefile                        |   2 +-
 drivers/net/i40e/Makefile                         |   2 +-
 drivers/net/ixgbe/Makefile                        |   2 +-
 drivers/net/mlx4/Makefile                         |   1 -
 drivers/net/null/Makefile                         |   1 -
 drivers/net/pcap/Makefile                         |   1 -
 drivers/net/virtio/Makefile                       |   2 +-
 drivers/net/vmxnet3/Makefile                      |   2 +-
 drivers/net/xenvirt/Makefile                      |   2 +-
 lib/Makefile                                      |   2 +-
 lib/librte_acl/Makefile                           |   2 +-
 lib/librte_eal/bsdapp/eal/Makefile                |   4 +-
 lib/librte_eal/bsdapp/eal/rte_eal_version.map     |  19 +
 lib/librte_eal/common/Makefile                    |   1 +
 lib/librte_eal/common/eal_common_memzone.c        | 353 +++++++----------
 lib/librte_eal/common/include/rte_eal_memconfig.h |   5 +-
 lib/librte_eal/common/include/rte_malloc.h        | 342 ++++++++++++++++
 lib/librte_eal/common/include/rte_malloc_heap.h   |   3 +-
 lib/librte_eal/common/include/rte_memzone.h       |  11 +
 lib/librte_eal/common/malloc_elem.c               | 344 ++++++++++++++++
 lib/librte_eal/common/malloc_elem.h               | 192 +++++++++
 lib/librte_eal/common/malloc_heap.c               | 227 +++++++++++
 lib/librte_eal/common/malloc_heap.h               |  70 ++++
 lib/librte_eal/common/rte_malloc.c                | 259 ++++++++++++
 lib/librte_eal/linuxapp/eal/Makefile              |   4 +-
 lib/librte_eal/linuxapp/eal/eal_ivshmem.c         |  17 +-
 lib/librte_eal/linuxapp/eal/rte_eal_version.map   |  19 +
 lib/librte_hash/Makefile                          |   2 +-
 lib/librte_lpm/Makefile                           |   2 +-
 lib/librte_malloc/Makefile                        |   6 +-
 lib/librte_malloc/malloc_elem.c                   | 320 ---------------
 lib/librte_malloc/malloc_elem.h                   | 190 ---------
 lib/librte_malloc/malloc_heap.c                   | 208 ----------
 lib/librte_malloc/malloc_heap.h                   |  70 ----
 lib/librte_malloc/rte_malloc.c                    | 228 +----------
 lib/librte_malloc/rte_malloc.h                    | 342 ----------------
 lib/librte_malloc/rte_malloc_version.map          |  16 -
 lib/librte_mempool/Makefile                       |   2 -
 lib/librte_port/Makefile                          |   1 -
 lib/librte_ring/Makefile                          |   3 +-
 lib/librte_table/Makefile                         |   1 -
 56 files changed, 1965 insertions(+), 2372 deletions(-)
 delete mode 100644 doc/guides/prog_guide/malloc_lib.rst
 create mode 100644 lib/librte_eal/common/include/rte_malloc.h
 create mode 100644 lib/librte_eal/common/malloc_elem.c
 create mode 100644 lib/librte_eal/common/malloc_elem.h
 create mode 100644 lib/librte_eal/common/malloc_heap.c
 create mode 100644 lib/librte_eal/common/malloc_heap.h
 create mode 100644 lib/librte_eal/common/rte_malloc.c
 delete mode 100644 lib/librte_malloc/malloc_elem.c
 delete mode 100644 lib/librte_malloc/malloc_elem.h
 delete mode 100644 lib/librte_malloc/malloc_heap.c
 delete mode 100644 lib/librte_malloc/malloc_heap.h
 delete mode 100644 lib/librte_malloc/rte_malloc.h

-- 
1.9.3

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v2] hash: rename unused field to "reserved"
  2015-07-13 16:38  3% ` [dpdk-dev] [PATCH v2] " Bruce Richardson
  2015-07-13 17:29  0%   ` Thomas Monjalon
@ 2015-07-15  8:08  3%   ` Olga Shern
  1 sibling, 0 replies; 200+ results
From: Olga Shern @ 2015-07-15  8:08 UTC (permalink / raw)
  To: Bruce Richardson, dev

Hi, 

I see the following compilation error :
dpdk/lib/librte_hash/rte_cuckoo_hash.c:145: error: flexible array member in otherwise empty struct
when compiling on RH6.5

Best Regards,
Olga

-----Original Message-----
From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Bruce Richardson
Sent: Monday, July 13, 2015 7:39 PM
To: dev@dpdk.org
Subject: [dpdk-dev] [PATCH v2] hash: rename unused field to "reserved"

The cuckoo hash has a fixed number of entries per bucket, so the configuration parameter for this is unused. We change this field in the parameters struct to "reserved" to indicate that there is now no such parameter value, while at the same time keeping ABI consistency.

Fixes: 48a399119619 ("hash: replace with cuckoo hash implementation")

Suggested-by: Thomas Monjalon <thomas.monjalon@6wind.com>
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
 app/test/test_func_reentrancy.c | 1 -
 app/test/test_hash_perf.c       | 1 -
 app/test/test_hash_scaling.c    | 1 -
 drivers/net/enic/enic_clsf.c    | 2 --
 examples/l3fwd-power/main.c     | 2 --
 examples/l3fwd-vf/main.c        | 1 -
 examples/l3fwd/main.c           | 2 --
 lib/librte_hash/rte_hash.h      | 2 +-
 8 files changed, 1 insertion(+), 11 deletions(-)

diff --git a/app/test/test_func_reentrancy.c b/app/test/test_func_reentrancy.c index 85504c0..be61773 100644
--- a/app/test/test_func_reentrancy.c
+++ b/app/test/test_func_reentrancy.c
@@ -226,7 +226,6 @@ hash_create_free(__attribute__((unused)) void *arg)
 	struct rte_hash_parameters hash_params = {
 		.name = NULL,
 		.entries = 16,
-		.bucket_entries = 4,
 		.key_len = 4,
 		.hash_func = (rte_hash_function)rte_jhash_32b,
 		.hash_func_init_val = 0,
diff --git a/app/test/test_hash_perf.c b/app/test/test_hash_perf.c index e9a522b..a87fc80 100644
--- a/app/test/test_hash_perf.c
+++ b/app/test/test_hash_perf.c
@@ -100,7 +100,6 @@ int32_t positions[KEYS_TO_ADD];
 /* Parameters used for hash table in unit test functions. */  static struct rte_hash_parameters ut_params = {
 	.entries = MAX_ENTRIES,
-	.bucket_entries = BUCKET_SIZE,
 	.hash_func = rte_jhash,
 	.hash_func_init_val = 0,
 };
diff --git a/app/test/test_hash_scaling.c b/app/test/test_hash_scaling.c index 682ae94..39602cb 100644
--- a/app/test/test_hash_scaling.c
+++ b/app/test/test_hash_scaling.c
@@ -129,7 +129,6 @@ test_hash_scaling(int locking_mode)
 	uint64_t i, key;
 	struct rte_hash_parameters hash_params = {
 		.entries = num_iterations*2,
-		.bucket_entries = 16,
 		.key_len = sizeof(key),
 		.hash_func = rte_hash_crc,
 		.hash_func_init_val = 0,
diff --git a/drivers/net/enic/enic_clsf.c b/drivers/net/enic/enic_clsf.c index ca12d2d..9c2abfb 100644
--- a/drivers/net/enic/enic_clsf.c
+++ b/drivers/net/enic/enic_clsf.c
@@ -63,7 +63,6 @@
 
 #define SOCKET_0                0
 #define ENICPMD_CLSF_HASH_ENTRIES       ENICPMD_FDIR_MAX
-#define ENICPMD_CLSF_BUCKET_ENTRIES     4
 
 void enic_fdir_stats_get(struct enic *enic, struct rte_eth_fdir_stats *stats)  { @@ -245,7 +244,6 @@ int enic_clsf_init(struct enic *enic)
 	struct rte_hash_parameters hash_params = {
 		.name = "enicpmd_clsf_hash",
 		.entries = ENICPMD_CLSF_HASH_ENTRIES,
-		.bucket_entries = ENICPMD_CLSF_BUCKET_ENTRIES,
 		.key_len = RTE_HASH_KEY_LENGTH_MAX,
 		.hash_func = DEFAULT_HASH_FUNC,
 		.hash_func_init_val = 0,
diff --git a/examples/l3fwd-power/main.c b/examples/l3fwd-power/main.c index d4eba1a..6eb459d 100644
--- a/examples/l3fwd-power/main.c
+++ b/examples/l3fwd-power/main.c
@@ -1247,7 +1247,6 @@ setup_hash(int socketid)
 	struct rte_hash_parameters ipv4_l3fwd_hash_params = {
 		.name = NULL,
 		.entries = L3FWD_HASH_ENTRIES,
-		.bucket_entries = 4,
 		.key_len = sizeof(struct ipv4_5tuple),
 		.hash_func = DEFAULT_HASH_FUNC,
 		.hash_func_init_val = 0,
@@ -1256,7 +1255,6 @@ setup_hash(int socketid)
 	struct rte_hash_parameters ipv6_l3fwd_hash_params = {
 		.name = NULL,
 		.entries = L3FWD_HASH_ENTRIES,
-		.bucket_entries = 4,
 		.key_len = sizeof(struct ipv6_5tuple),
 		.hash_func = DEFAULT_HASH_FUNC,
 		.hash_func_init_val = 0,
diff --git a/examples/l3fwd-vf/main.c b/examples/l3fwd-vf/main.c index ccbb02f..01f610e 100644
--- a/examples/l3fwd-vf/main.c
+++ b/examples/l3fwd-vf/main.c
@@ -251,7 +251,6 @@ static lookup_struct_t *l3fwd_lookup_struct[NB_SOCKETS];  struct rte_hash_parameters l3fwd_hash_params = {
 	.name = "l3fwd_hash_0",
 	.entries = L3FWD_HASH_ENTRIES,
-	.bucket_entries = 4,
 	.key_len = sizeof(struct ipv4_5tuple),
 	.hash_func = DEFAULT_HASH_FUNC,
 	.hash_func_init_val = 0,
diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c index 5c22ed1..def9594 100644
--- a/examples/l3fwd/main.c
+++ b/examples/l3fwd/main.c
@@ -2162,7 +2162,6 @@ setup_hash(int socketid)
     struct rte_hash_parameters ipv4_l3fwd_hash_params = {
         .name = NULL,
         .entries = L3FWD_HASH_ENTRIES,
-        .bucket_entries = 4,
         .key_len = sizeof(union ipv4_5tuple_host),
         .hash_func = ipv4_hash_crc,
         .hash_func_init_val = 0,
@@ -2171,7 +2170,6 @@ setup_hash(int socketid)
     struct rte_hash_parameters ipv6_l3fwd_hash_params = {
         .name = NULL,
         .entries = L3FWD_HASH_ENTRIES,
-        .bucket_entries = 4,
         .key_len = sizeof(union ipv6_5tuple_host),
         .hash_func = ipv6_hash_crc,
         .hash_func_init_val = 0,
diff --git a/lib/librte_hash/rte_hash.h b/lib/librte_hash/rte_hash.h index 68109d5..1cddc07 100644
--- a/lib/librte_hash/rte_hash.h
+++ b/lib/librte_hash/rte_hash.h
@@ -75,7 +75,7 @@ typedef uint32_t (*rte_hash_function)(const void *key, uint32_t key_len,  struct rte_hash_parameters {
 	const char *name;		/**< Name of the hash. */
 	uint32_t entries;		/**< Total hash table entries. */
-	uint32_t bucket_entries;        /**< Bucket entries. */
+	uint32_t reserved;		/**< Unused field. Should be set to 0 */
 	uint32_t key_len;		/**< Length of hash key. */
 	rte_hash_function hash_func;	/**< Primary Hash function used to calculate hash. */
 	uint32_t hash_func_init_val;	/**< Init value used by hash_func. */
--
2.4.3

^ permalink raw reply	[relevance 3%]

* [dpdk-dev] [PATCH v8 2/9] eal: memzone allocated by malloc
  2015-07-14  8:57  4% ` [dpdk-dev] [PATCH v8 " Sergio Gonzalez Monroy
@ 2015-07-14  8:57  1%   ` Sergio Gonzalez Monroy
  2015-07-14  8:57 19%   ` [dpdk-dev] [PATCH v8 8/9] doc: announce ABI change of librte_malloc Sergio Gonzalez Monroy
  2015-07-15  8:26  4%   ` [dpdk-dev] [PATCH v9 0/9] Dynamic memzones Sergio Gonzalez Monroy
  2 siblings, 0 replies; 200+ results
From: Sergio Gonzalez Monroy @ 2015-07-14  8:57 UTC (permalink / raw)
  To: dev

In the current memory hierarchy, memsegs are groups of physically
contiguous hugepages, memzones are slices of memsegs and malloc further
slices memzones into smaller memory chunks.

This patch modifies malloc so it partitions memsegs instead of memzones.
Thus memzones would call malloc internally for memory allocation while
maintaining its ABI.

It would be possible to free memzones and therefore any other structure
based on memzones, ie. mempools

Signed-off-by: Sergio Gonzalez Monroy <sergio.gonzalez.monroy@intel.com>
---
 lib/librte_eal/common/eal_common_memzone.c        | 289 +++++-----------------
 lib/librte_eal/common/include/rte_eal_memconfig.h |   2 +-
 lib/librte_eal/common/include/rte_malloc_heap.h   |   3 +-
 lib/librte_eal/common/malloc_elem.c               |  68 +++--
 lib/librte_eal/common/malloc_elem.h               |  14 +-
 lib/librte_eal/common/malloc_heap.c               | 161 ++++++------
 lib/librte_eal/common/malloc_heap.h               |   6 +-
 lib/librte_eal/common/rte_malloc.c                |   7 +-
 8 files changed, 220 insertions(+), 330 deletions(-)

diff --git a/lib/librte_eal/common/eal_common_memzone.c b/lib/librte_eal/common/eal_common_memzone.c
index 9c1da71..fd7e73f 100644
--- a/lib/librte_eal/common/eal_common_memzone.c
+++ b/lib/librte_eal/common/eal_common_memzone.c
@@ -50,15 +50,15 @@
 #include <rte_string_fns.h>
 #include <rte_common.h>
 
+#include "malloc_heap.h"
+#include "malloc_elem.h"
 #include "eal_private.h"
 
-/* internal copy of free memory segments */
-static struct rte_memseg *free_memseg = NULL;
-
 static inline const struct rte_memzone *
 memzone_lookup_thread_unsafe(const char *name)
 {
 	const struct rte_mem_config *mcfg;
+	const struct rte_memzone *mz;
 	unsigned i = 0;
 
 	/* get pointer to global configuration */
@@ -68,62 +68,62 @@ memzone_lookup_thread_unsafe(const char *name)
 	 * the algorithm is not optimal (linear), but there are few
 	 * zones and this function should be called at init only
 	 */
-	for (i = 0; i < RTE_MAX_MEMZONE && mcfg->memzone[i].addr != NULL; i++) {
-		if (!strncmp(name, mcfg->memzone[i].name, RTE_MEMZONE_NAMESIZE))
+	for (i = 0; i < RTE_MAX_MEMZONE; i++) {
+		mz = &mcfg->memzone[i];
+		if (mz->addr != NULL && !strncmp(name, mz->name, RTE_MEMZONE_NAMESIZE))
 			return &mcfg->memzone[i];
 	}
 
 	return NULL;
 }
 
-/*
- * Helper function for memzone_reserve_aligned_thread_unsafe().
- * Calculate address offset from the start of the segment.
- * Align offset in that way that it satisfy istart alignmnet and
- * buffer of the  requested length would not cross specified boundary.
- */
-static inline phys_addr_t
-align_phys_boundary(const struct rte_memseg *ms, size_t len, size_t align,
-	size_t bound)
+/* Find the heap with the greatest free block size */
+static void
+find_heap_max_free_elem(int *s, size_t *len, unsigned align)
 {
-	phys_addr_t addr_offset, bmask, end, start;
-	size_t step;
+	struct rte_mem_config *mcfg;
+	struct rte_malloc_socket_stats stats;
+	unsigned i;
 
-	step = RTE_MAX(align, bound);
-	bmask = ~((phys_addr_t)bound - 1);
+	/* get pointer to global configuration */
+	mcfg = rte_eal_get_configuration()->mem_config;
 
-	/* calculate offset to closest alignment */
-	start = RTE_ALIGN_CEIL(ms->phys_addr, align);
-	addr_offset = start - ms->phys_addr;
+	for (i = 0; i < RTE_MAX_NUMA_NODES; i++) {
+		malloc_heap_get_stats(&mcfg->malloc_heaps[i], &stats);
+		if (stats.greatest_free_size > *len) {
+			*len = stats.greatest_free_size;
+			*s = i;
+		}
+	}
+	*len -= (MALLOC_ELEM_OVERHEAD + align);
+}
 
-	while (addr_offset + len < ms->len) {
+/* Find a heap that can allocate the requested size */
+static void
+find_heap_suitable(int *s, size_t len, unsigned align)
+{
+	struct rte_mem_config *mcfg;
+	struct rte_malloc_socket_stats stats;
+	unsigned i;
 
-		/* check, do we meet boundary condition */
-		end = start + len - (len != 0);
-		if ((start & bmask) == (end & bmask))
-			break;
+	/* get pointer to global configuration */
+	mcfg = rte_eal_get_configuration()->mem_config;
 
-		/* calculate next offset */
-		start = RTE_ALIGN_CEIL(start + 1, step);
-		addr_offset = start - ms->phys_addr;
+	for (i = 0; i < RTE_MAX_NUMA_NODES; i++) {
+		malloc_heap_get_stats(&mcfg->malloc_heaps[i], &stats);
+		if (stats.greatest_free_size >= len + MALLOC_ELEM_OVERHEAD + align) {
+			*s = i;
+			break;
+		}
 	}
-
-	return addr_offset;
 }
 
 static const struct rte_memzone *
 memzone_reserve_aligned_thread_unsafe(const char *name, size_t len,
-		int socket_id, uint64_t size_mask, unsigned align,
-		unsigned bound)
+		int socket_id, unsigned flags, unsigned align, unsigned bound)
 {
 	struct rte_mem_config *mcfg;
-	unsigned i = 0;
-	int memseg_idx = -1;
-	uint64_t addr_offset, seg_offset = 0;
 	size_t requested_len;
-	size_t memseg_len = 0;
-	phys_addr_t memseg_physaddr;
-	void *memseg_addr;
 
 	/* get pointer to global configuration */
 	mcfg = rte_eal_get_configuration()->mem_config;
@@ -155,7 +155,6 @@ memzone_reserve_aligned_thread_unsafe(const char *name, size_t len,
 	if (align < RTE_CACHE_LINE_SIZE)
 		align = RTE_CACHE_LINE_SIZE;
 
-
 	/* align length on cache boundary. Check for overflow before doing so */
 	if (len > SIZE_MAX - RTE_CACHE_LINE_MASK) {
 		rte_errno = EINVAL; /* requested size too big */
@@ -169,108 +168,50 @@ memzone_reserve_aligned_thread_unsafe(const char *name, size_t len,
 	requested_len = RTE_MAX((size_t)RTE_CACHE_LINE_SIZE,  len);
 
 	/* check that boundary condition is valid */
-	if (bound != 0 &&
-			(requested_len > bound || !rte_is_power_of_2(bound))) {
+	if (bound != 0 && (requested_len > bound || !rte_is_power_of_2(bound))) {
 		rte_errno = EINVAL;
 		return NULL;
 	}
 
-	/* find the smallest segment matching requirements */
-	for (i = 0; i < RTE_MAX_MEMSEG; i++) {
-		/* last segment */
-		if (free_memseg[i].addr == NULL)
-			break;
+	if (len == 0) {
+		if (bound != 0)
+			requested_len = bound;
+		else
+			requested_len = 0;
+	}
 
-		/* empty segment, skip it */
-		if (free_memseg[i].len == 0)
-			continue;
-
-		/* bad socket ID */
-		if (socket_id != SOCKET_ID_ANY &&
-		    free_memseg[i].socket_id != SOCKET_ID_ANY &&
-		    socket_id != free_memseg[i].socket_id)
-			continue;
-
-		/*
-		 * calculate offset to closest alignment that
-		 * meets boundary conditions.
-		 */
-		addr_offset = align_phys_boundary(free_memseg + i,
-			requested_len, align, bound);
-
-		/* check len */
-		if ((requested_len + addr_offset) > free_memseg[i].len)
-			continue;
-
-		if ((size_mask & free_memseg[i].hugepage_sz) == 0)
-			continue;
-
-		/* this segment is the best until now */
-		if (memseg_idx == -1) {
-			memseg_idx = i;
-			memseg_len = free_memseg[i].len;
-			seg_offset = addr_offset;
-		}
-		/* find the biggest contiguous zone */
-		else if (len == 0) {
-			if (free_memseg[i].len > memseg_len) {
-				memseg_idx = i;
-				memseg_len = free_memseg[i].len;
-				seg_offset = addr_offset;
-			}
-		}
-		/*
-		 * find the smallest (we already checked that current
-		 * zone length is > len
-		 */
-		else if (free_memseg[i].len + align < memseg_len ||
-				(free_memseg[i].len <= memseg_len + align &&
-				addr_offset < seg_offset)) {
-			memseg_idx = i;
-			memseg_len = free_memseg[i].len;
-			seg_offset = addr_offset;
+	if (socket_id == SOCKET_ID_ANY) {
+		if (requested_len == 0)
+			find_heap_max_free_elem(&socket_id, &requested_len, align);
+		else
+			find_heap_suitable(&socket_id, requested_len, align);
+
+		if (socket_id == SOCKET_ID_ANY) {
+			rte_errno = ENOMEM;
+			return NULL;
 		}
 	}
 
-	/* no segment found */
-	if (memseg_idx == -1) {
+	/* allocate memory on heap */
+	void *mz_addr = malloc_heap_alloc(&mcfg->malloc_heaps[socket_id], NULL,
+			requested_len, flags, align, bound);
+	if (mz_addr == NULL) {
 		rte_errno = ENOMEM;
 		return NULL;
 	}
 
-	/* save aligned physical and virtual addresses */
-	memseg_physaddr = free_memseg[memseg_idx].phys_addr + seg_offset;
-	memseg_addr = RTE_PTR_ADD(free_memseg[memseg_idx].addr,
-			(uintptr_t) seg_offset);
-
-	/* if we are looking for a biggest memzone */
-	if (len == 0) {
-		if (bound == 0)
-			requested_len = memseg_len - seg_offset;
-		else
-			requested_len = RTE_ALIGN_CEIL(memseg_physaddr + 1,
-				bound) - memseg_physaddr;
-	}
-
-	/* set length to correct value */
-	len = (size_t)seg_offset + requested_len;
-
-	/* update our internal state */
-	free_memseg[memseg_idx].len -= len;
-	free_memseg[memseg_idx].phys_addr += len;
-	free_memseg[memseg_idx].addr =
-		(char *)free_memseg[memseg_idx].addr + len;
+	const struct malloc_elem *elem = malloc_elem_from_data(mz_addr);
 
 	/* fill the zone in config */
 	struct rte_memzone *mz = &mcfg->memzone[mcfg->memzone_idx++];
 	snprintf(mz->name, sizeof(mz->name), "%s", name);
-	mz->phys_addr = memseg_physaddr;
-	mz->addr = memseg_addr;
-	mz->len = requested_len;
-	mz->hugepage_sz = free_memseg[memseg_idx].hugepage_sz;
-	mz->socket_id = free_memseg[memseg_idx].socket_id;
+	mz->phys_addr = rte_malloc_virt2phy(mz_addr);
+	mz->addr = mz_addr;
+	mz->len = (requested_len == 0 ? elem->size : requested_len);
+	mz->hugepage_sz = elem->ms->hugepage_sz;
+	mz->socket_id = elem->ms->socket_id;
 	mz->flags = 0;
-	mz->memseg_id = memseg_idx;
+	mz->memseg_id = elem->ms - rte_eal_get_configuration()->mem_config->memseg;
 
 	return mz;
 }
@@ -282,26 +223,6 @@ rte_memzone_reserve_thread_safe(const char *name, size_t len,
 {
 	struct rte_mem_config *mcfg;
 	const struct rte_memzone *mz = NULL;
-	uint64_t size_mask = 0;
-
-	if (flags & RTE_MEMZONE_256KB)
-		size_mask |= RTE_PGSIZE_256K;
-	if (flags & RTE_MEMZONE_2MB)
-		size_mask |= RTE_PGSIZE_2M;
-	if (flags & RTE_MEMZONE_16MB)
-		size_mask |= RTE_PGSIZE_16M;
-	if (flags & RTE_MEMZONE_256MB)
-		size_mask |= RTE_PGSIZE_256M;
-	if (flags & RTE_MEMZONE_512MB)
-		size_mask |= RTE_PGSIZE_512M;
-	if (flags & RTE_MEMZONE_1GB)
-		size_mask |= RTE_PGSIZE_1G;
-	if (flags & RTE_MEMZONE_4GB)
-		size_mask |= RTE_PGSIZE_4G;
-	if (flags & RTE_MEMZONE_16GB)
-		size_mask |= RTE_PGSIZE_16G;
-	if (!size_mask)
-		size_mask = UINT64_MAX;
 
 	/* get pointer to global configuration */
 	mcfg = rte_eal_get_configuration()->mem_config;
@@ -309,18 +230,7 @@ rte_memzone_reserve_thread_safe(const char *name, size_t len,
 	rte_rwlock_write_lock(&mcfg->mlock);
 
 	mz = memzone_reserve_aligned_thread_unsafe(
-		name, len, socket_id, size_mask, align, bound);
-
-	/*
-	 * If we failed to allocate the requested page size, and the
-	 * RTE_MEMZONE_SIZE_HINT_ONLY flag is specified, try allocating
-	 * again.
-	 */
-	if (!mz && rte_errno == ENOMEM && size_mask != UINT64_MAX &&
-	    flags & RTE_MEMZONE_SIZE_HINT_ONLY) {
-		mz = memzone_reserve_aligned_thread_unsafe(
-			name, len, socket_id, UINT64_MAX, align, bound);
-	}
+		name, len, socket_id, flags, align, bound);
 
 	rte_rwlock_write_unlock(&mcfg->mlock);
 
@@ -412,45 +322,6 @@ rte_memzone_dump(FILE *f)
 }
 
 /*
- * called by init: modify the free memseg list to have cache-aligned
- * addresses and cache-aligned lengths
- */
-static int
-memseg_sanitize(struct rte_memseg *memseg)
-{
-	unsigned phys_align;
-	unsigned virt_align;
-	unsigned off;
-
-	phys_align = memseg->phys_addr & RTE_CACHE_LINE_MASK;
-	virt_align = (unsigned long)memseg->addr & RTE_CACHE_LINE_MASK;
-
-	/*
-	 * sanity check: phys_addr and addr must have the same
-	 * alignment
-	 */
-	if (phys_align != virt_align)
-		return -1;
-
-	/* memseg is really too small, don't bother with it */
-	if (memseg->len < (2 * RTE_CACHE_LINE_SIZE)) {
-		memseg->len = 0;
-		return 0;
-	}
-
-	/* align start address */
-	off = (RTE_CACHE_LINE_SIZE - phys_align) & RTE_CACHE_LINE_MASK;
-	memseg->phys_addr += off;
-	memseg->addr = (char *)memseg->addr + off;
-	memseg->len -= off;
-
-	/* align end address */
-	memseg->len &= ~((uint64_t)RTE_CACHE_LINE_MASK);
-
-	return 0;
-}
-
-/*
  * Init the memzone subsystem
  */
 int
@@ -458,14 +329,10 @@ rte_eal_memzone_init(void)
 {
 	struct rte_mem_config *mcfg;
 	const struct rte_memseg *memseg;
-	unsigned i = 0;
 
 	/* get pointer to global configuration */
 	mcfg = rte_eal_get_configuration()->mem_config;
 
-	/* mirror the runtime memsegs from config */
-	free_memseg = mcfg->free_memseg;
-
 	/* secondary processes don't need to initialise anything */
 	if (rte_eal_process_type() == RTE_PROC_SECONDARY)
 		return 0;
@@ -478,33 +345,13 @@ rte_eal_memzone_init(void)
 
 	rte_rwlock_write_lock(&mcfg->mlock);
 
-	/* fill in uninitialized free_memsegs */
-	for (i = 0; i < RTE_MAX_MEMSEG; i++) {
-		if (memseg[i].addr == NULL)
-			break;
-		if (free_memseg[i].addr != NULL)
-			continue;
-		memcpy(&free_memseg[i], &memseg[i], sizeof(struct rte_memseg));
-	}
-
-	/* make all zones cache-aligned */
-	for (i = 0; i < RTE_MAX_MEMSEG; i++) {
-		if (free_memseg[i].addr == NULL)
-			break;
-		if (memseg_sanitize(&free_memseg[i]) < 0) {
-			RTE_LOG(ERR, EAL, "%s(): Sanity check failed\n", __func__);
-			rte_rwlock_write_unlock(&mcfg->mlock);
-			return -1;
-		}
-	}
-
 	/* delete all zones */
 	mcfg->memzone_idx = 0;
 	memset(mcfg->memzone, 0, sizeof(mcfg->memzone));
 
 	rte_rwlock_write_unlock(&mcfg->mlock);
 
-	return 0;
+	return rte_eal_malloc_heap_init();
 }
 
 /* Walk all reserved memory zones */
diff --git a/lib/librte_eal/common/include/rte_eal_memconfig.h b/lib/librte_eal/common/include/rte_eal_memconfig.h
index 34f5abc..055212a 100644
--- a/lib/librte_eal/common/include/rte_eal_memconfig.h
+++ b/lib/librte_eal/common/include/rte_eal_memconfig.h
@@ -73,7 +73,7 @@ struct rte_mem_config {
 	struct rte_memseg memseg[RTE_MAX_MEMSEG];    /**< Physmem descriptors. */
 	struct rte_memzone memzone[RTE_MAX_MEMZONE]; /**< Memzone descriptors. */
 
-	/* Runtime Physmem descriptors. */
+	/* Runtime Physmem descriptors - NOT USED */
 	struct rte_memseg free_memseg[RTE_MAX_MEMSEG];
 
 	struct rte_tailq_head tailq_head[RTE_MAX_TAILQ]; /**< Tailqs for objects */
diff --git a/lib/librte_eal/common/include/rte_malloc_heap.h b/lib/librte_eal/common/include/rte_malloc_heap.h
index 716216f..b270356 100644
--- a/lib/librte_eal/common/include/rte_malloc_heap.h
+++ b/lib/librte_eal/common/include/rte_malloc_heap.h
@@ -40,7 +40,7 @@
 #include <rte_memory.h>
 
 /* Number of free lists per heap, grouped by size. */
-#define RTE_HEAP_NUM_FREELISTS  5
+#define RTE_HEAP_NUM_FREELISTS  13
 
 /**
  * Structure to hold malloc heap
@@ -48,7 +48,6 @@
 struct malloc_heap {
 	rte_spinlock_t lock;
 	LIST_HEAD(, malloc_elem) free_head[RTE_HEAP_NUM_FREELISTS];
-	unsigned mz_count;
 	unsigned alloc_count;
 	size_t total_size;
 } __rte_cache_aligned;
diff --git a/lib/librte_eal/common/malloc_elem.c b/lib/librte_eal/common/malloc_elem.c
index a5e1248..b54ee33 100644
--- a/lib/librte_eal/common/malloc_elem.c
+++ b/lib/librte_eal/common/malloc_elem.c
@@ -37,7 +37,6 @@
 #include <sys/queue.h>
 
 #include <rte_memory.h>
-#include <rte_memzone.h>
 #include <rte_eal.h>
 #include <rte_launch.h>
 #include <rte_per_lcore.h>
@@ -56,10 +55,10 @@
  */
 void
 malloc_elem_init(struct malloc_elem *elem,
-		struct malloc_heap *heap, const struct rte_memzone *mz, size_t size)
+		struct malloc_heap *heap, const struct rte_memseg *ms, size_t size)
 {
 	elem->heap = heap;
-	elem->mz = mz;
+	elem->ms = ms;
 	elem->prev = NULL;
 	memset(&elem->free_list, 0, sizeof(elem->free_list));
 	elem->state = ELEM_FREE;
@@ -70,12 +69,12 @@ malloc_elem_init(struct malloc_elem *elem,
 }
 
 /*
- * initialise a dummy malloc_elem header for the end-of-memzone marker
+ * initialise a dummy malloc_elem header for the end-of-memseg marker
  */
 void
 malloc_elem_mkend(struct malloc_elem *elem, struct malloc_elem *prev)
 {
-	malloc_elem_init(elem, prev->heap, prev->mz, 0);
+	malloc_elem_init(elem, prev->heap, prev->ms, 0);
 	elem->prev = prev;
 	elem->state = ELEM_BUSY; /* mark busy so its never merged */
 }
@@ -86,12 +85,24 @@ malloc_elem_mkend(struct malloc_elem *elem, struct malloc_elem *prev)
  * fit, return NULL.
  */
 static void *
-elem_start_pt(struct malloc_elem *elem, size_t size, unsigned align)
+elem_start_pt(struct malloc_elem *elem, size_t size, unsigned align,
+		size_t bound)
 {
-	const uintptr_t end_pt = (uintptr_t)elem +
+	const size_t bmask = ~(bound - 1);
+	uintptr_t end_pt = (uintptr_t)elem +
 			elem->size - MALLOC_ELEM_TRAILER_LEN;
-	const uintptr_t new_data_start = RTE_ALIGN_FLOOR((end_pt - size), align);
-	const uintptr_t new_elem_start = new_data_start - MALLOC_ELEM_HEADER_LEN;
+	uintptr_t new_data_start = RTE_ALIGN_FLOOR((end_pt - size), align);
+	uintptr_t new_elem_start;
+
+	/* check boundary */
+	if ((new_data_start & bmask) != ((end_pt - 1) & bmask)) {
+		end_pt = RTE_ALIGN_FLOOR(end_pt, bound);
+		new_data_start = RTE_ALIGN_FLOOR((end_pt - size), align);
+		if (((end_pt - 1) & bmask) != (new_data_start & bmask))
+			return NULL;
+	}
+
+	new_elem_start = new_data_start - MALLOC_ELEM_HEADER_LEN;
 
 	/* if the new start point is before the exist start, it won't fit */
 	return (new_elem_start < (uintptr_t)elem) ? NULL : (void *)new_elem_start;
@@ -102,9 +113,10 @@ elem_start_pt(struct malloc_elem *elem, size_t size, unsigned align)
  * alignment request from the current element
  */
 int
-malloc_elem_can_hold(struct malloc_elem *elem, size_t size, unsigned align)
+malloc_elem_can_hold(struct malloc_elem *elem, size_t size,	unsigned align,
+		size_t bound)
 {
-	return elem_start_pt(elem, size, align) != NULL;
+	return elem_start_pt(elem, size, align, bound) != NULL;
 }
 
 /*
@@ -115,10 +127,10 @@ static void
 split_elem(struct malloc_elem *elem, struct malloc_elem *split_pt)
 {
 	struct malloc_elem *next_elem = RTE_PTR_ADD(elem, elem->size);
-	const unsigned old_elem_size = (uintptr_t)split_pt - (uintptr_t)elem;
-	const unsigned new_elem_size = elem->size - old_elem_size;
+	const size_t old_elem_size = (uintptr_t)split_pt - (uintptr_t)elem;
+	const size_t new_elem_size = elem->size - old_elem_size;
 
-	malloc_elem_init(split_pt, elem->heap, elem->mz, new_elem_size);
+	malloc_elem_init(split_pt, elem->heap, elem->ms, new_elem_size);
 	split_pt->prev = elem;
 	next_elem->prev = split_pt;
 	elem->size = old_elem_size;
@@ -168,8 +180,9 @@ malloc_elem_free_list_index(size_t size)
 void
 malloc_elem_free_list_insert(struct malloc_elem *elem)
 {
-	size_t idx = malloc_elem_free_list_index(elem->size - MALLOC_ELEM_HEADER_LEN);
+	size_t idx;
 
+	idx = malloc_elem_free_list_index(elem->size - MALLOC_ELEM_HEADER_LEN);
 	elem->state = ELEM_FREE;
 	LIST_INSERT_HEAD(&elem->heap->free_head[idx], elem, free_list);
 }
@@ -190,12 +203,26 @@ elem_free_list_remove(struct malloc_elem *elem)
  * is not done here, as it's done there previously.
  */
 struct malloc_elem *
-malloc_elem_alloc(struct malloc_elem *elem, size_t size, unsigned align)
+malloc_elem_alloc(struct malloc_elem *elem, size_t size, unsigned align,
+		size_t bound)
 {
-	struct malloc_elem *new_elem = elem_start_pt(elem, size, align);
-	const unsigned old_elem_size = (uintptr_t)new_elem - (uintptr_t)elem;
+	struct malloc_elem *new_elem = elem_start_pt(elem, size, align, bound);
+	const size_t old_elem_size = (uintptr_t)new_elem - (uintptr_t)elem;
+	const size_t trailer_size = elem->size - old_elem_size - size -
+		MALLOC_ELEM_OVERHEAD;
+
+	elem_free_list_remove(elem);
 
-	if (old_elem_size < MALLOC_ELEM_OVERHEAD + MIN_DATA_SIZE){
+	if (trailer_size > MALLOC_ELEM_OVERHEAD + MIN_DATA_SIZE) {
+		/* split it, too much free space after elem */
+		struct malloc_elem *new_free_elem =
+				RTE_PTR_ADD(new_elem, size + MALLOC_ELEM_OVERHEAD);
+
+		split_elem(elem, new_free_elem);
+		malloc_elem_free_list_insert(new_free_elem);
+	}
+
+	if (old_elem_size < MALLOC_ELEM_OVERHEAD + MIN_DATA_SIZE) {
 		/* don't split it, pad the element instead */
 		elem->state = ELEM_BUSY;
 		elem->pad = old_elem_size;
@@ -208,8 +235,6 @@ malloc_elem_alloc(struct malloc_elem *elem, size_t size, unsigned align)
 			new_elem->size = elem->size - elem->pad;
 			set_header(new_elem);
 		}
-		/* remove element from free list */
-		elem_free_list_remove(elem);
 
 		return new_elem;
 	}
@@ -219,7 +244,6 @@ malloc_elem_alloc(struct malloc_elem *elem, size_t size, unsigned align)
 	 * Re-insert original element, in case its new size makes it
 	 * belong on a different list.
 	 */
-	elem_free_list_remove(elem);
 	split_elem(elem, new_elem);
 	new_elem->state = ELEM_BUSY;
 	malloc_elem_free_list_insert(elem);
diff --git a/lib/librte_eal/common/malloc_elem.h b/lib/librte_eal/common/malloc_elem.h
index 9790b1a..e05d2ea 100644
--- a/lib/librte_eal/common/malloc_elem.h
+++ b/lib/librte_eal/common/malloc_elem.h
@@ -47,9 +47,9 @@ enum elem_state {
 
 struct malloc_elem {
 	struct malloc_heap *heap;
-	struct malloc_elem *volatile prev;      /* points to prev elem in memzone */
+	struct malloc_elem *volatile prev;      /* points to prev elem in memseg */
 	LIST_ENTRY(malloc_elem) free_list;      /* list of free elements in heap */
-	const struct rte_memzone *mz;
+	const struct rte_memseg *ms;
 	volatile enum elem_state state;
 	uint32_t pad;
 	size_t size;
@@ -136,11 +136,11 @@ malloc_elem_from_data(const void *data)
 void
 malloc_elem_init(struct malloc_elem *elem,
 		struct malloc_heap *heap,
-		const struct rte_memzone *mz,
+		const struct rte_memseg *ms,
 		size_t size);
 
 /*
- * initialise a dummy malloc_elem header for the end-of-memzone marker
+ * initialise a dummy malloc_elem header for the end-of-memseg marker
  */
 void
 malloc_elem_mkend(struct malloc_elem *elem,
@@ -151,14 +151,16 @@ malloc_elem_mkend(struct malloc_elem *elem,
  * of the requested size and with the requested alignment
  */
 int
-malloc_elem_can_hold(struct malloc_elem *elem, size_t size, unsigned align);
+malloc_elem_can_hold(struct malloc_elem *elem, size_t size,
+		unsigned align, size_t bound);
 
 /*
  * reserve a block of data in an existing malloc_elem. If the malloc_elem
  * is much larger than the data block requested, we split the element in two.
  */
 struct malloc_elem *
-malloc_elem_alloc(struct malloc_elem *elem, size_t size, unsigned align);
+malloc_elem_alloc(struct malloc_elem *elem, size_t size,
+		unsigned align, size_t bound);
 
 /*
  * free a malloc_elem block by adding it to the free list. If the
diff --git a/lib/librte_eal/common/malloc_heap.c b/lib/librte_eal/common/malloc_heap.c
index 8861d27..2496b77 100644
--- a/lib/librte_eal/common/malloc_heap.c
+++ b/lib/librte_eal/common/malloc_heap.c
@@ -39,7 +39,6 @@
 #include <sys/queue.h>
 
 #include <rte_memory.h>
-#include <rte_memzone.h>
 #include <rte_eal.h>
 #include <rte_eal_memconfig.h>
 #include <rte_launch.h>
@@ -54,123 +53,125 @@
 #include "malloc_elem.h"
 #include "malloc_heap.h"
 
-/* since the memzone size starts with a digit, it will appear unquoted in
- * rte_config.h, so quote it so it can be passed to rte_str_to_size */
-#define MALLOC_MEMZONE_SIZE RTE_STR(RTE_MALLOC_MEMZONE_SIZE)
-
-/*
- * returns the configuration setting for the memzone size as a size_t value
- */
-static inline size_t
-get_malloc_memzone_size(void)
+static unsigned
+check_hugepage_sz(unsigned flags, size_t hugepage_sz)
 {
-	return rte_str_to_size(MALLOC_MEMZONE_SIZE);
+	unsigned check_flag = 0;
+
+	if (!(flags & ~RTE_MEMZONE_SIZE_HINT_ONLY))
+		return 1;
+
+	switch (hugepage_sz) {
+	case RTE_PGSIZE_256K:
+		check_flag = RTE_MEMZONE_256KB;
+		break;
+	case RTE_PGSIZE_2M:
+		check_flag = RTE_MEMZONE_2MB;
+		break;
+	case RTE_PGSIZE_16M:
+		check_flag = RTE_MEMZONE_16MB;
+		break;
+	case RTE_PGSIZE_256M:
+		check_flag = RTE_MEMZONE_256MB;
+		break;
+	case RTE_PGSIZE_512M:
+		check_flag = RTE_MEMZONE_512MB;
+		break;
+	case RTE_PGSIZE_1G:
+		check_flag = RTE_MEMZONE_1GB;
+		break;
+	case RTE_PGSIZE_4G:
+		check_flag = RTE_MEMZONE_4GB;
+		break;
+	case RTE_PGSIZE_16G:
+		check_flag = RTE_MEMZONE_16GB;
+	}
+
+	return (check_flag & flags);
 }
 
 /*
- * reserve an extra memory zone and make it available for use by a particular
- * heap. This reserves the zone and sets a dummy malloc_elem header at the end
+ * Expand the heap with a memseg.
+ * This reserves the zone and sets a dummy malloc_elem header at the end
  * to prevent overflow. The rest of the zone is added to free list as a single
  * large free block
  */
-static int
-malloc_heap_add_memzone(struct malloc_heap *heap, size_t size, unsigned align)
+static void
+malloc_heap_add_memseg(struct malloc_heap *heap, struct rte_memseg *ms)
 {
-	const unsigned mz_flags = 0;
-	const size_t block_size = get_malloc_memzone_size();
-	/* ensure the data we want to allocate will fit in the memzone */
-	const size_t min_size = size + align + MALLOC_ELEM_OVERHEAD * 2;
-	const struct rte_memzone *mz = NULL;
-	struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
-	unsigned numa_socket = heap - mcfg->malloc_heaps;
-
-	size_t mz_size = min_size;
-	if (mz_size < block_size)
-		mz_size = block_size;
-
-	char mz_name[RTE_MEMZONE_NAMESIZE];
-	snprintf(mz_name, sizeof(mz_name), "MALLOC_S%u_HEAP_%u",
-		     numa_socket, heap->mz_count++);
-
-	/* try getting a block. if we fail and we don't need as big a block
-	 * as given in the config, we can shrink our request and try again
-	 */
-	do {
-		mz = rte_memzone_reserve(mz_name, mz_size, numa_socket,
-					 mz_flags);
-		if (mz == NULL)
-			mz_size /= 2;
-	} while (mz == NULL && mz_size > min_size);
-	if (mz == NULL)
-		return -1;
-
 	/* allocate the memory block headers, one at end, one at start */
-	struct malloc_elem *start_elem = (struct malloc_elem *)mz->addr;
-	struct malloc_elem *end_elem = RTE_PTR_ADD(mz->addr,
-			mz_size - MALLOC_ELEM_OVERHEAD);
+	struct malloc_elem *start_elem = (struct malloc_elem *)ms->addr;
+	struct malloc_elem *end_elem = RTE_PTR_ADD(ms->addr,
+			ms->len - MALLOC_ELEM_OVERHEAD);
 	end_elem = RTE_PTR_ALIGN_FLOOR(end_elem, RTE_CACHE_LINE_SIZE);
+	const size_t elem_size = (uintptr_t)end_elem - (uintptr_t)start_elem;
 
-	const unsigned elem_size = (uintptr_t)end_elem - (uintptr_t)start_elem;
-	malloc_elem_init(start_elem, heap, mz, elem_size);
+	malloc_elem_init(start_elem, heap, ms, elem_size);
 	malloc_elem_mkend(end_elem, start_elem);
 	malloc_elem_free_list_insert(start_elem);
 
-	/* increase heap total size by size of new memzone */
-	heap->total_size+=mz_size - MALLOC_ELEM_OVERHEAD;
-	return 0;
+	heap->total_size += elem_size;
 }
 
 /*
  * Iterates through the freelist for a heap to find a free element
  * which can store data of the required size and with the requested alignment.
+ * If size is 0, find the biggest available elem.
  * Returns null on failure, or pointer to element on success.
  */
 static struct malloc_elem *
-find_suitable_element(struct malloc_heap *heap, size_t size, unsigned align)
+find_suitable_element(struct malloc_heap *heap, size_t size,
+		unsigned flags, size_t align, size_t bound)
 {
 	size_t idx;
-	struct malloc_elem *elem;
+	struct malloc_elem *elem, *alt_elem = NULL;
 
 	for (idx = malloc_elem_free_list_index(size);
-		idx < RTE_HEAP_NUM_FREELISTS; idx++)
-	{
+			idx < RTE_HEAP_NUM_FREELISTS; idx++) {
 		for (elem = LIST_FIRST(&heap->free_head[idx]);
-			!!elem; elem = LIST_NEXT(elem, free_list))
-		{
-			if (malloc_elem_can_hold(elem, size, align))
-				return elem;
+				!!elem; elem = LIST_NEXT(elem, free_list)) {
+			if (malloc_elem_can_hold(elem, size, align, bound)) {
+				if (check_hugepage_sz(flags, elem->ms->hugepage_sz))
+					return elem;
+				if (alt_elem == NULL)
+					alt_elem = elem;
+			}
 		}
 	}
+
+	if ((alt_elem != NULL) && (flags & RTE_MEMZONE_SIZE_HINT_ONLY))
+		return alt_elem;
+
 	return NULL;
 }
 
 /*
- * Main function called by malloc to allocate a block of memory from the
- * heap. It locks the free list, scans it, and adds a new memzone if the
- * scan fails. Once the new memzone is added, it re-scans and should return
+ * Main function to allocate a block of memory from the heap.
+ * It locks the free list, scans it, and adds a new memseg if the
+ * scan fails. Once the new memseg is added, it re-scans and should return
  * the new element after releasing the lock.
  */
 void *
 malloc_heap_alloc(struct malloc_heap *heap,
-		const char *type __attribute__((unused)), size_t size, unsigned align)
+		const char *type __attribute__((unused)), size_t size, unsigned flags,
+		size_t align, size_t bound)
 {
+	struct malloc_elem *elem;
+
 	size = RTE_CACHE_LINE_ROUNDUP(size);
 	align = RTE_CACHE_LINE_ROUNDUP(align);
+
 	rte_spinlock_lock(&heap->lock);
-	struct malloc_elem *elem = find_suitable_element(heap, size, align);
-	if (elem == NULL){
-		if ((malloc_heap_add_memzone(heap, size, align)) == 0)
-			elem = find_suitable_element(heap, size, align);
-	}
 
-	if (elem != NULL){
-		elem = malloc_elem_alloc(elem, size, align);
+	elem = find_suitable_element(heap, size, flags, align, bound);
+	if (elem != NULL) {
+		elem = malloc_elem_alloc(elem, size, align, bound);
 		/* increase heap's count of allocated elements */
 		heap->alloc_count++;
 	}
 	rte_spinlock_unlock(&heap->lock);
-	return elem == NULL ? NULL : (void *)(&elem[1]);
 
+	return elem == NULL ? NULL : (void *)(&elem[1]);
 }
 
 /*
@@ -206,3 +207,21 @@ malloc_heap_get_stats(const struct malloc_heap *heap,
 	socket_stats->alloc_count = heap->alloc_count;
 	return 0;
 }
+
+int
+rte_eal_malloc_heap_init(void)
+{
+	struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
+	unsigned ms_cnt;
+	struct rte_memseg *ms;
+
+	if (mcfg == NULL)
+		return -1;
+
+	for (ms = &mcfg->memseg[0], ms_cnt = 0;
+			(ms_cnt < RTE_MAX_MEMSEG) && (ms->len > 0);
+			ms_cnt++, ms++)
+		malloc_heap_add_memseg(&mcfg->malloc_heaps[ms->socket_id], ms);
+
+	return 0;
+}
diff --git a/lib/librte_eal/common/malloc_heap.h b/lib/librte_eal/common/malloc_heap.h
index a47136d..3ccbef0 100644
--- a/lib/librte_eal/common/malloc_heap.h
+++ b/lib/librte_eal/common/malloc_heap.h
@@ -53,15 +53,15 @@ malloc_get_numa_socket(void)
 }
 
 void *
-malloc_heap_alloc(struct malloc_heap *heap, const char *type,
-		size_t size, unsigned align);
+malloc_heap_alloc(struct malloc_heap *heap,	const char *type, size_t size,
+		unsigned flags, size_t align, size_t bound);
 
 int
 malloc_heap_get_stats(const struct malloc_heap *heap,
 		struct rte_malloc_socket_stats *socket_stats);
 
 int
-rte_eal_heap_memzone_init(void);
+rte_eal_malloc_heap_init(void);
 
 #ifdef __cplusplus
 }
diff --git a/lib/librte_eal/common/rte_malloc.c b/lib/librte_eal/common/rte_malloc.c
index c313a57..54c2bd8 100644
--- a/lib/librte_eal/common/rte_malloc.c
+++ b/lib/librte_eal/common/rte_malloc.c
@@ -39,7 +39,6 @@
 
 #include <rte_memcpy.h>
 #include <rte_memory.h>
-#include <rte_memzone.h>
 #include <rte_eal.h>
 #include <rte_eal_memconfig.h>
 #include <rte_branch_prediction.h>
@@ -87,7 +86,7 @@ rte_malloc_socket(const char *type, size_t size, unsigned align, int socket_arg)
 		return NULL;
 
 	ret = malloc_heap_alloc(&mcfg->malloc_heaps[socket], type,
-				size, align == 0 ? 1 : align);
+				size, 0, align == 0 ? 1 : align, 0);
 	if (ret != NULL || socket_arg != SOCKET_ID_ANY)
 		return ret;
 
@@ -98,7 +97,7 @@ rte_malloc_socket(const char *type, size_t size, unsigned align, int socket_arg)
 			continue;
 
 		ret = malloc_heap_alloc(&mcfg->malloc_heaps[i], type,
-					size, align == 0 ? 1 : align);
+					size, 0, align == 0 ? 1 : align, 0);
 		if (ret != NULL)
 			return ret;
 	}
@@ -256,5 +255,5 @@ rte_malloc_virt2phy(const void *addr)
 	const struct malloc_elem *elem = malloc_elem_from_data(addr);
 	if (elem == NULL)
 		return 0;
-	return elem->mz->phys_addr + ((uintptr_t)addr - (uintptr_t)elem->mz->addr);
+	return elem->ms->phys_addr + ((uintptr_t)addr - (uintptr_t)elem->ms->addr);
 }
-- 
1.9.3

^ permalink raw reply	[relevance 1%]

* [dpdk-dev] [PATCH v8 8/9] doc: announce ABI change of librte_malloc
  2015-07-14  8:57  4% ` [dpdk-dev] [PATCH v8 " Sergio Gonzalez Monroy
  2015-07-14  8:57  1%   ` [dpdk-dev] [PATCH v8 2/9] eal: memzone allocated by malloc Sergio Gonzalez Monroy
@ 2015-07-14  8:57 19%   ` Sergio Gonzalez Monroy
  2015-07-15  8:26  4%   ` [dpdk-dev] [PATCH v9 0/9] Dynamic memzones Sergio Gonzalez Monroy
  2 siblings, 0 replies; 200+ results
From: Sergio Gonzalez Monroy @ 2015-07-14  8:57 UTC (permalink / raw)
  To: dev

Announce the creation of dummy malloc library for 2.1 and removal of
such library, now integrated in librte_eal, for 2.2 release.

Signed-off-by: Sergio Gonzalez Monroy <sergio.gonzalez.monroy@intel.com>
---
 doc/guides/rel_notes/abi.rst | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst
index 931e785..76e0ae2 100644
--- a/doc/guides/rel_notes/abi.rst
+++ b/doc/guides/rel_notes/abi.rst
@@ -16,7 +16,6 @@ Examples of Deprecation Notices
 
 Deprecation Notices
 -------------------
-
 * Significant ABI changes are planned for struct rte_eth_dev to support up to
   1024 queues per port. This change will be in release 2.2.
   There is no backward compatibility planned from release 2.2.
@@ -24,3 +23,8 @@ Deprecation Notices
 
 * The Macros RTE_HASH_BUCKET_ENTRIES_MAX and RTE_HASH_KEY_LENGTH_MAX are
   deprecated and will be removed with version 2.2.
+
+* librte_malloc library has been integrated into librte_eal. The 2.1 release
+  creates a dummy/empty malloc library to fulfill binaries with dynamic linking
+  dependencies on librte_malloc.so. Such dummy library will not be created from
+  release 2.2 so binaries will need to be rebuilt.
-- 
1.9.3

^ permalink raw reply	[relevance 19%]

* [dpdk-dev] [PATCH v8 0/9] Dynamic memzones
  @ 2015-07-14  8:57  4% ` Sergio Gonzalez Monroy
  2015-07-14  8:57  1%   ` [dpdk-dev] [PATCH v8 2/9] eal: memzone allocated by malloc Sergio Gonzalez Monroy
                     ` (2 more replies)
  0 siblings, 3 replies; 200+ results
From: Sergio Gonzalez Monroy @ 2015-07-14  8:57 UTC (permalink / raw)
  To: dev

Current implemetation allows reserving/creating memzones but not the opposite
(unreserve/free). This affects mempools and other memzone based objects.

>From my point of view, implementing free functionality for memzones would look
like malloc over memsegs.
Thus, this approach moves malloc inside eal (which in turn removes a circular
dependency), where malloc heaps are composed of memsegs.
We keep both malloc and memzone APIs as they are, but memzones allocate its
memory by calling malloc_heap_alloc.
Some extra functionality is required in malloc to allow for boundary constrained
memory requests.
In summary, currently malloc is based on memzones, and with this approach
memzones are based on malloc.

v8:
 - Rebase against current HEAD to factor for changes made by new Tile-Gx arch

v7:
 - Create a separated maintainer section for memory allocation

v6:
 - Fix bad patch for rte_memzone_free

v5:
 - Fix rte_memzone_free
 - Improve rte_memzone_free unit test

v4:
 - Rebase and fix couple of merge issues

v3:
 - Create dummy librte_malloc
 - Add deprecation notice
 - Rework some of the code
 - Doc update
 - checkpatch

v2:
 - New rte_memzone_free
 - Support memzone len = 0
 - Add all available memsegs to malloc heap at init
 - Update memzone/malloc unit tests


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


Sergio Gonzalez Monroy (9):
  eal: move librte_malloc to eal/common
  eal: memzone allocated by malloc
  app/test: update malloc/memzone unit tests
  config: remove CONFIG_RTE_MALLOC_MEMZONE_SIZE
  eal: remove free_memseg and references to it
  eal: new rte_memzone_free
  app/test: rte_memzone_free unit test
  doc: announce ABI change of librte_malloc
  doc: update malloc documentation

 MAINTAINERS                                       |  22 +-
 app/test/test_malloc.c                            |  86 ----
 app/test/test_memzone.c                           | 456 ++++------------------
 config/common_bsdapp                              |   8 +-
 config/common_linuxapp                            |   8 +-
 doc/guides/prog_guide/env_abstraction_layer.rst   | 220 ++++++++++-
 doc/guides/prog_guide/img/malloc_heap.png         | Bin 81329 -> 80952 bytes
 doc/guides/prog_guide/index.rst                   |   1 -
 doc/guides/prog_guide/malloc_lib.rst              | 233 -----------
 doc/guides/prog_guide/overview.rst                |  11 +-
 doc/guides/rel_notes/abi.rst                      |   6 +-
 drivers/net/af_packet/Makefile                    |   1 -
 drivers/net/bonding/Makefile                      |   1 -
 drivers/net/e1000/Makefile                        |   2 +-
 drivers/net/enic/Makefile                         |   2 +-
 drivers/net/fm10k/Makefile                        |   2 +-
 drivers/net/i40e/Makefile                         |   2 +-
 drivers/net/ixgbe/Makefile                        |   2 +-
 drivers/net/mlx4/Makefile                         |   1 -
 drivers/net/null/Makefile                         |   1 -
 drivers/net/pcap/Makefile                         |   1 -
 drivers/net/virtio/Makefile                       |   2 +-
 drivers/net/vmxnet3/Makefile                      |   2 +-
 drivers/net/xenvirt/Makefile                      |   2 +-
 lib/Makefile                                      |   2 +-
 lib/librte_acl/Makefile                           |   2 +-
 lib/librte_eal/bsdapp/eal/Makefile                |   4 +-
 lib/librte_eal/bsdapp/eal/rte_eal_version.map     |  19 +
 lib/librte_eal/common/Makefile                    |   1 +
 lib/librte_eal/common/eal_common_memzone.c        | 353 +++++++----------
 lib/librte_eal/common/include/rte_eal_memconfig.h |   5 +-
 lib/librte_eal/common/include/rte_malloc.h        | 342 ++++++++++++++++
 lib/librte_eal/common/include/rte_malloc_heap.h   |   3 +-
 lib/librte_eal/common/include/rte_memzone.h       |  11 +
 lib/librte_eal/common/malloc_elem.c               | 344 ++++++++++++++++
 lib/librte_eal/common/malloc_elem.h               | 192 +++++++++
 lib/librte_eal/common/malloc_heap.c               | 227 +++++++++++
 lib/librte_eal/common/malloc_heap.h               |  70 ++++
 lib/librte_eal/common/rte_malloc.c                | 259 ++++++++++++
 lib/librte_eal/linuxapp/eal/Makefile              |   4 +-
 lib/librte_eal/linuxapp/eal/eal_ivshmem.c         |  17 +-
 lib/librte_eal/linuxapp/eal/rte_eal_version.map   |  19 +
 lib/librte_hash/Makefile                          |   2 +-
 lib/librte_lpm/Makefile                           |   2 +-
 lib/librte_malloc/Makefile                        |   6 +-
 lib/librte_malloc/malloc_elem.c                   | 320 ---------------
 lib/librte_malloc/malloc_elem.h                   | 190 ---------
 lib/librte_malloc/malloc_heap.c                   | 208 ----------
 lib/librte_malloc/malloc_heap.h                   |  70 ----
 lib/librte_malloc/rte_malloc.c                    | 228 +----------
 lib/librte_malloc/rte_malloc.h                    | 342 ----------------
 lib/librte_malloc/rte_malloc_version.map          |  16 -
 lib/librte_mempool/Makefile                       |   2 -
 lib/librte_port/Makefile                          |   1 -
 lib/librte_ring/Makefile                          |   3 +-
 lib/librte_table/Makefile                         |   1 -
 56 files changed, 1965 insertions(+), 2372 deletions(-)
 delete mode 100644 doc/guides/prog_guide/malloc_lib.rst
 create mode 100644 lib/librte_eal/common/include/rte_malloc.h
 create mode 100644 lib/librte_eal/common/malloc_elem.c
 create mode 100644 lib/librte_eal/common/malloc_elem.h
 create mode 100644 lib/librte_eal/common/malloc_heap.c
 create mode 100644 lib/librte_eal/common/malloc_heap.h
 create mode 100644 lib/librte_eal/common/rte_malloc.c
 delete mode 100644 lib/librte_malloc/malloc_elem.c
 delete mode 100644 lib/librte_malloc/malloc_elem.h
 delete mode 100644 lib/librte_malloc/malloc_heap.c
 delete mode 100644 lib/librte_malloc/malloc_heap.h
 delete mode 100644 lib/librte_malloc/rte_malloc.h

-- 
1.9.3

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v2] hash: rename unused field to "reserved"
  2015-07-13 16:38  3% ` [dpdk-dev] [PATCH v2] " Bruce Richardson
@ 2015-07-13 17:29  0%   ` Thomas Monjalon
  2015-07-15  8:08  3%   ` Olga Shern
  1 sibling, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-07-13 17:29 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: dev

2015-07-13 17:38, Bruce Richardson:
> The cuckoo hash has a fixed number of entries per bucket, so the
> configuration parameter for this is unused. We change this field in the
> parameters struct to "reserved" to indicate that there is now no such
> parameter value, while at the same time keeping ABI consistency.
> 
> Fixes: 48a399119619 ("hash: replace with cuckoo hash implementation")
> 
> Suggested-by: Thomas Monjalon <thomas.monjalon@6wind.com>
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>

Applied, thanks

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v2] hash: rename unused field to "reserved"
  2015-07-13 16:25  3% [dpdk-dev] [PATCH] hash: rename unused field to "reserved" Bruce Richardson
  2015-07-13 16:28  0% ` Bruce Richardson
@ 2015-07-13 16:38  3% ` Bruce Richardson
  2015-07-13 17:29  0%   ` Thomas Monjalon
  2015-07-15  8:08  3%   ` Olga Shern
  1 sibling, 2 replies; 200+ results
From: Bruce Richardson @ 2015-07-13 16:38 UTC (permalink / raw)
  To: dev

The cuckoo hash has a fixed number of entries per bucket, so the
configuration parameter for this is unused. We change this field in the
parameters struct to "reserved" to indicate that there is now no such
parameter value, while at the same time keeping ABI consistency.

Fixes: 48a399119619 ("hash: replace with cuckoo hash implementation")

Suggested-by: Thomas Monjalon <thomas.monjalon@6wind.com>
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
 app/test/test_func_reentrancy.c | 1 -
 app/test/test_hash_perf.c       | 1 -
 app/test/test_hash_scaling.c    | 1 -
 drivers/net/enic/enic_clsf.c    | 2 --
 examples/l3fwd-power/main.c     | 2 --
 examples/l3fwd-vf/main.c        | 1 -
 examples/l3fwd/main.c           | 2 --
 lib/librte_hash/rte_hash.h      | 2 +-
 8 files changed, 1 insertion(+), 11 deletions(-)

diff --git a/app/test/test_func_reentrancy.c b/app/test/test_func_reentrancy.c
index 85504c0..be61773 100644
--- a/app/test/test_func_reentrancy.c
+++ b/app/test/test_func_reentrancy.c
@@ -226,7 +226,6 @@ hash_create_free(__attribute__((unused)) void *arg)
 	struct rte_hash_parameters hash_params = {
 		.name = NULL,
 		.entries = 16,
-		.bucket_entries = 4,
 		.key_len = 4,
 		.hash_func = (rte_hash_function)rte_jhash_32b,
 		.hash_func_init_val = 0,
diff --git a/app/test/test_hash_perf.c b/app/test/test_hash_perf.c
index e9a522b..a87fc80 100644
--- a/app/test/test_hash_perf.c
+++ b/app/test/test_hash_perf.c
@@ -100,7 +100,6 @@ int32_t positions[KEYS_TO_ADD];
 /* Parameters used for hash table in unit test functions. */
 static struct rte_hash_parameters ut_params = {
 	.entries = MAX_ENTRIES,
-	.bucket_entries = BUCKET_SIZE,
 	.hash_func = rte_jhash,
 	.hash_func_init_val = 0,
 };
diff --git a/app/test/test_hash_scaling.c b/app/test/test_hash_scaling.c
index 682ae94..39602cb 100644
--- a/app/test/test_hash_scaling.c
+++ b/app/test/test_hash_scaling.c
@@ -129,7 +129,6 @@ test_hash_scaling(int locking_mode)
 	uint64_t i, key;
 	struct rte_hash_parameters hash_params = {
 		.entries = num_iterations*2,
-		.bucket_entries = 16,
 		.key_len = sizeof(key),
 		.hash_func = rte_hash_crc,
 		.hash_func_init_val = 0,
diff --git a/drivers/net/enic/enic_clsf.c b/drivers/net/enic/enic_clsf.c
index ca12d2d..9c2abfb 100644
--- a/drivers/net/enic/enic_clsf.c
+++ b/drivers/net/enic/enic_clsf.c
@@ -63,7 +63,6 @@
 
 #define SOCKET_0                0
 #define ENICPMD_CLSF_HASH_ENTRIES       ENICPMD_FDIR_MAX
-#define ENICPMD_CLSF_BUCKET_ENTRIES     4
 
 void enic_fdir_stats_get(struct enic *enic, struct rte_eth_fdir_stats *stats)
 {
@@ -245,7 +244,6 @@ int enic_clsf_init(struct enic *enic)
 	struct rte_hash_parameters hash_params = {
 		.name = "enicpmd_clsf_hash",
 		.entries = ENICPMD_CLSF_HASH_ENTRIES,
-		.bucket_entries = ENICPMD_CLSF_BUCKET_ENTRIES,
 		.key_len = RTE_HASH_KEY_LENGTH_MAX,
 		.hash_func = DEFAULT_HASH_FUNC,
 		.hash_func_init_val = 0,
diff --git a/examples/l3fwd-power/main.c b/examples/l3fwd-power/main.c
index d4eba1a..6eb459d 100644
--- a/examples/l3fwd-power/main.c
+++ b/examples/l3fwd-power/main.c
@@ -1247,7 +1247,6 @@ setup_hash(int socketid)
 	struct rte_hash_parameters ipv4_l3fwd_hash_params = {
 		.name = NULL,
 		.entries = L3FWD_HASH_ENTRIES,
-		.bucket_entries = 4,
 		.key_len = sizeof(struct ipv4_5tuple),
 		.hash_func = DEFAULT_HASH_FUNC,
 		.hash_func_init_val = 0,
@@ -1256,7 +1255,6 @@ setup_hash(int socketid)
 	struct rte_hash_parameters ipv6_l3fwd_hash_params = {
 		.name = NULL,
 		.entries = L3FWD_HASH_ENTRIES,
-		.bucket_entries = 4,
 		.key_len = sizeof(struct ipv6_5tuple),
 		.hash_func = DEFAULT_HASH_FUNC,
 		.hash_func_init_val = 0,
diff --git a/examples/l3fwd-vf/main.c b/examples/l3fwd-vf/main.c
index ccbb02f..01f610e 100644
--- a/examples/l3fwd-vf/main.c
+++ b/examples/l3fwd-vf/main.c
@@ -251,7 +251,6 @@ static lookup_struct_t *l3fwd_lookup_struct[NB_SOCKETS];
 struct rte_hash_parameters l3fwd_hash_params = {
 	.name = "l3fwd_hash_0",
 	.entries = L3FWD_HASH_ENTRIES,
-	.bucket_entries = 4,
 	.key_len = sizeof(struct ipv4_5tuple),
 	.hash_func = DEFAULT_HASH_FUNC,
 	.hash_func_init_val = 0,
diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c
index 5c22ed1..def9594 100644
--- a/examples/l3fwd/main.c
+++ b/examples/l3fwd/main.c
@@ -2162,7 +2162,6 @@ setup_hash(int socketid)
     struct rte_hash_parameters ipv4_l3fwd_hash_params = {
         .name = NULL,
         .entries = L3FWD_HASH_ENTRIES,
-        .bucket_entries = 4,
         .key_len = sizeof(union ipv4_5tuple_host),
         .hash_func = ipv4_hash_crc,
         .hash_func_init_val = 0,
@@ -2171,7 +2170,6 @@ setup_hash(int socketid)
     struct rte_hash_parameters ipv6_l3fwd_hash_params = {
         .name = NULL,
         .entries = L3FWD_HASH_ENTRIES,
-        .bucket_entries = 4,
         .key_len = sizeof(union ipv6_5tuple_host),
         .hash_func = ipv6_hash_crc,
         .hash_func_init_val = 0,
diff --git a/lib/librte_hash/rte_hash.h b/lib/librte_hash/rte_hash.h
index 68109d5..1cddc07 100644
--- a/lib/librte_hash/rte_hash.h
+++ b/lib/librte_hash/rte_hash.h
@@ -75,7 +75,7 @@ typedef uint32_t (*rte_hash_function)(const void *key, uint32_t key_len,
 struct rte_hash_parameters {
 	const char *name;		/**< Name of the hash. */
 	uint32_t entries;		/**< Total hash table entries. */
-	uint32_t bucket_entries;        /**< Bucket entries. */
+	uint32_t reserved;		/**< Unused field. Should be set to 0 */
 	uint32_t key_len;		/**< Length of hash key. */
 	rte_hash_function hash_func;	/**< Primary Hash function used to calculate hash. */
 	uint32_t hash_func_init_val;	/**< Init value used by hash_func. */
-- 
2.4.3

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH] hash: rename unused field to "reserved"
  2015-07-13 16:25  3% [dpdk-dev] [PATCH] hash: rename unused field to "reserved" Bruce Richardson
@ 2015-07-13 16:28  0% ` Bruce Richardson
  2015-07-13 16:38  3% ` [dpdk-dev] [PATCH v2] " Bruce Richardson
  1 sibling, 0 replies; 200+ results
From: Bruce Richardson @ 2015-07-13 16:28 UTC (permalink / raw)
  To: dev

On Mon, Jul 13, 2015 at 05:25:51PM +0100, Bruce Richardson wrote:
> The cuckoo hash has a fixed number of entries per bucket, so the
> configuration parameter for this is unused. We change this field in the
> parameters struct to "reserved" to indicate that there is now no such
> parameter value, while at the same time keeping ABI consistency.
> 
> Fixes: 48a399119619 ("hash: replace with cuckoo hash implementation")
> 
> Suggested-by: Thomas Monjalon <thomas.monjalon@6wind.com>
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>

Self-NAK. 

Missed some extra code dependencies using this field. V2 to follow.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v7 1/7] hash: replace existing hash library with cuckoo hash implementation
  2015-07-13 16:20  0%                 ` Thomas Monjalon
@ 2015-07-13 16:26  0%                   ` Bruce Richardson
  0 siblings, 0 replies; 200+ results
From: Bruce Richardson @ 2015-07-13 16:26 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Mon, Jul 13, 2015 at 06:20:08PM +0200, Thomas Monjalon wrote:
> 2015-07-13 17:14, Bruce Richardson:
> > On Mon, Jul 13, 2015 at 05:11:54PM +0100, Bruce Richardson wrote:
> > > On Mon, Jul 13, 2015 at 12:29:53AM +0200, Thomas Monjalon wrote:
> > > > 2015-07-11 01:18, Pablo de Lara:
> > > > > The main change when creating a new table is that the number of entries
> > > > > per bucket is fixed now, so its parameter is ignored now
> > > > > (still there to maintain the same parameters structure).
> > > > 
> > > > Why not rename the "bucket_entries" field to "reserved"?
> > > > The API of this field has changed (now ignored) so it should be reflected
> > > > without changing the ABI.
> > > 
> > > Since the hash_create function is itself already versionned to take account of the
> > > new struct parameter, there is no reason to keep the field at all, as far as I can see.
> > > We can just drop it, and let the ABI versionning handle the change.
> > > 
> > > /Bruce
> > 
> > Sorry, my mistake. It's no longer versioned in the patchset that was merged, so
> > the field does need to be kept. :-(
> 
> So do you agree to submit a patch which rename the unused field?

Yes. It should be in your inbox now... :-)

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH] hash: rename unused field to "reserved"
@ 2015-07-13 16:25  3% Bruce Richardson
  2015-07-13 16:28  0% ` Bruce Richardson
  2015-07-13 16:38  3% ` [dpdk-dev] [PATCH v2] " Bruce Richardson
  0 siblings, 2 replies; 200+ results
From: Bruce Richardson @ 2015-07-13 16:25 UTC (permalink / raw)
  To: dev

The cuckoo hash has a fixed number of entries per bucket, so the
configuration parameter for this is unused. We change this field in the
parameters struct to "reserved" to indicate that there is now no such
parameter value, while at the same time keeping ABI consistency.

Fixes: 48a399119619 ("hash: replace with cuckoo hash implementation")

Suggested-by: Thomas Monjalon <thomas.monjalon@6wind.com>
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
 lib/librte_hash/rte_hash.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/librte_hash/rte_hash.h b/lib/librte_hash/rte_hash.h
index 68109d5..1cddc07 100644
--- a/lib/librte_hash/rte_hash.h
+++ b/lib/librte_hash/rte_hash.h
@@ -75,7 +75,7 @@ typedef uint32_t (*rte_hash_function)(const void *key, uint32_t key_len,
 struct rte_hash_parameters {
 	const char *name;		/**< Name of the hash. */
 	uint32_t entries;		/**< Total hash table entries. */
-	uint32_t bucket_entries;        /**< Bucket entries. */
+	uint32_t reserved;		/**< Unused field. Should be set to 0 */
 	uint32_t key_len;		/**< Length of hash key. */
 	rte_hash_function hash_func;	/**< Primary Hash function used to calculate hash. */
 	uint32_t hash_func_init_val;	/**< Init value used by hash_func. */
-- 
2.4.3

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v7 1/7] hash: replace existing hash library with cuckoo hash implementation
  2015-07-13 16:14  0%               ` Bruce Richardson
@ 2015-07-13 16:20  0%                 ` Thomas Monjalon
  2015-07-13 16:26  0%                   ` Bruce Richardson
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2015-07-13 16:20 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: dev

2015-07-13 17:14, Bruce Richardson:
> On Mon, Jul 13, 2015 at 05:11:54PM +0100, Bruce Richardson wrote:
> > On Mon, Jul 13, 2015 at 12:29:53AM +0200, Thomas Monjalon wrote:
> > > 2015-07-11 01:18, Pablo de Lara:
> > > > The main change when creating a new table is that the number of entries
> > > > per bucket is fixed now, so its parameter is ignored now
> > > > (still there to maintain the same parameters structure).
> > > 
> > > Why not rename the "bucket_entries" field to "reserved"?
> > > The API of this field has changed (now ignored) so it should be reflected
> > > without changing the ABI.
> > 
> > Since the hash_create function is itself already versionned to take account of the
> > new struct parameter, there is no reason to keep the field at all, as far as I can see.
> > We can just drop it, and let the ABI versionning handle the change.
> > 
> > /Bruce
> 
> Sorry, my mistake. It's no longer versioned in the patchset that was merged, so
> the field does need to be kept. :-(

So do you agree to submit a patch which rename the unused field?

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v7 1/7] hash: replace existing hash library with cuckoo hash implementation
  2015-07-13 16:11  3%             ` Bruce Richardson
@ 2015-07-13 16:14  0%               ` Bruce Richardson
  2015-07-13 16:20  0%                 ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Bruce Richardson @ 2015-07-13 16:14 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Mon, Jul 13, 2015 at 05:11:54PM +0100, Bruce Richardson wrote:
> On Mon, Jul 13, 2015 at 12:29:53AM +0200, Thomas Monjalon wrote:
> > 2015-07-11 01:18, Pablo de Lara:
> > > The main change when creating a new table is that the number of entries
> > > per bucket is fixed now, so its parameter is ignored now
> > > (still there to maintain the same parameters structure).
> > 
> > Why not rename the "bucket_entries" field to "reserved"?
> > The API of this field has changed (now ignored) so it should be reflected
> > without changing the ABI.
> 
> Since the hash_create function is itself already versionned to take account of the
> new struct parameter, there is no reason to keep the field at all, as far as I can see.
> We can just drop it, and let the ABI versionning handle the change.
> 
> /Bruce

Sorry, my mistake. It's no longer versioned in the patchset that was merged, so
the field does need to be kept. :-(

/Bruce

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v7 1/7] hash: replace existing hash library with cuckoo hash implementation
  2015-07-12 22:29  3%           ` Thomas Monjalon
@ 2015-07-13 16:11  3%             ` Bruce Richardson
  2015-07-13 16:14  0%               ` Bruce Richardson
  0 siblings, 1 reply; 200+ results
From: Bruce Richardson @ 2015-07-13 16:11 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

On Mon, Jul 13, 2015 at 12:29:53AM +0200, Thomas Monjalon wrote:
> 2015-07-11 01:18, Pablo de Lara:
> > The main change when creating a new table is that the number of entries
> > per bucket is fixed now, so its parameter is ignored now
> > (still there to maintain the same parameters structure).
> 
> Why not rename the "bucket_entries" field to "reserved"?
> The API of this field has changed (now ignored) so it should be reflected
> without changing the ABI.

Since the hash_create function is itself already versionned to take account of the
new struct parameter, there is no reason to keep the field at all, as far as I can see.
We can just drop it, and let the ABI versionning handle the change.

/Bruce

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH v10 01/19] mbuf: redefine packet_type in rte_mbuf
  @ 2015-07-13 15:53  0%     ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-07-13 15:53 UTC (permalink / raw)
  To: Helin Zhang; +Cc: dev

2015-07-10 00:31, Helin Zhang:
> To avoid breaking ABI compatibility, all the changes would be enabled by RTE_NEXT_ABI,
> which is disabled by default.

It is enabled by default.
This comment will be removed from all patches of the series.

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v5 4/9] ethdev: remove HW specific stats in stats structs
  2015-07-13 14:17  3% [dpdk-dev] [PATCH v5 0/9] Expose IXGBE extended stats to DPDK apps Maryam Tahhan
@ 2015-07-13 14:17  9% ` Maryam Tahhan
  0 siblings, 0 replies; 200+ results
From: Maryam Tahhan @ 2015-07-13 14:17 UTC (permalink / raw)
  To: dev

Remove non generic stats in rte_stats_strings and mark the relevant
fields in struct rte_eth_stats as deprecated.

Signed-off-by: Maryam Tahhan <maryam.tahhan@intel.com>
---
 doc/guides/rel_notes/abi.rst  | 12 ++++++++++++
 lib/librte_ether/rte_ethdev.c |  9 ---------
 lib/librte_ether/rte_ethdev.h | 30 ++++++++++++++++++++----------
 3 files changed, 32 insertions(+), 19 deletions(-)

diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst
index 931e785..d5bf625 100644
--- a/doc/guides/rel_notes/abi.rst
+++ b/doc/guides/rel_notes/abi.rst
@@ -24,3 +24,15 @@ Deprecation Notices
 
 * The Macros RTE_HASH_BUCKET_ENTRIES_MAX and RTE_HASH_KEY_LENGTH_MAX are
   deprecated and will be removed with version 2.2.
+
+* The following fields have been deprecated in rte_eth_stats:
+  * uint64_t imissed
+  * uint64_t ibadcrc
+  * uint64_t ibadlen
+  * uint64_t imcasts
+  * uint64_t fdirmatch
+  * uint64_t fdirmiss
+  * uint64_t tx_pause_xon
+  * uint64_t rx_pause_xon
+  * uint64_t tx_pause_xoff
+  * uint64_t rx_pause_xoff
diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 2e62f43..976ce5f 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -142,17 +142,8 @@ static const struct rte_eth_xstats_name_off rte_stats_strings[] = {
 	{"rx_bytes", offsetof(struct rte_eth_stats, ibytes)},
 	{"tx_bytes", offsetof(struct rte_eth_stats, obytes)},
 	{"tx_errors", offsetof(struct rte_eth_stats, oerrors)},
-	{"rx_missed_errors", offsetof(struct rte_eth_stats, imissed)},
-	{"rx_crc_errors", offsetof(struct rte_eth_stats, ibadcrc)},
-	{"rx_bad_length_errors", offsetof(struct rte_eth_stats, ibadlen)},
 	{"rx_errors", offsetof(struct rte_eth_stats, ierrors)},
 	{"alloc_rx_buff_failed", offsetof(struct rte_eth_stats, rx_nombuf)},
-	{"fdir_match", offsetof(struct rte_eth_stats, fdirmatch)},
-	{"fdir_miss", offsetof(struct rte_eth_stats, fdirmiss)},
-	{"tx_flow_control_xon", offsetof(struct rte_eth_stats, tx_pause_xon)},
-	{"rx_flow_control_xon", offsetof(struct rte_eth_stats, rx_pause_xon)},
-	{"tx_flow_control_xoff", offsetof(struct rte_eth_stats, tx_pause_xoff)},
-	{"rx_flow_control_xoff", offsetof(struct rte_eth_stats, rx_pause_xoff)},
 };
 #define RTE_NB_STATS (sizeof(rte_stats_strings) / sizeof(rte_stats_strings[0]))
 
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index d76bbb3..a862027 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -193,19 +193,29 @@ struct rte_eth_stats {
 	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. */
+	/**< Deprecated; Total of RX missed packets (e.g full FIFO). */
+	uint64_t imissed;
+	/**< Deprecated; Total of RX packets with CRC error. */
+	uint64_t ibadcrc;
+	/**< Deprecated; Total of RX packets with bad length. */
+	uint64_t ibadlen;
 	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 imcasts;
+	/**< Deprecated; 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 fdirmatch;
+	/**< Deprecated; Total number of RX packets matching a filter. */
+	uint64_t fdirmiss;
+	/**< Deprecated; Total number of RX packets not matching any filter. */
+	uint64_t tx_pause_xon;
+	 /**< Deprecated; Total nb. of XON pause frame sent. */
+	uint64_t rx_pause_xon;
+	/**< Deprecated; Total nb. of XON pause frame received. */
+	uint64_t tx_pause_xoff;
+	/**< Deprecated; Total nb. of XOFF pause frame sent. */
+	uint64_t rx_pause_xoff;
+	/**< Deprecated; 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];
-- 
2.4.3

^ permalink raw reply	[relevance 9%]

* [dpdk-dev] [PATCH v5 0/9] Expose IXGBE extended stats to DPDK apps
@ 2015-07-13 14:17  3% Maryam Tahhan
  2015-07-13 14:17  9% ` [dpdk-dev] [PATCH v5 4/9] ethdev: remove HW specific stats in stats structs Maryam Tahhan
  0 siblings, 1 reply; 200+ results
From: Maryam Tahhan @ 2015-07-13 14:17 UTC (permalink / raw)
  To: dev

This patch set implements xstats_get() and xstats_reset() in dev_ops for
ixgbe to expose detailed error statistics to DPDK applications. The
dump_cfg application was extended to demonstrate the usage of
retrieving statistics for DPDK interfaces and renamed to proc_info
in order reflect this new functionality. This patch set also removes non
generic statistics from the statistics strings at the ethdev level and
marks the relevant registers as depricated in struct rte_eth_stats.

v2:
 - Fixed patch dependencies.
 - Broke down patches into smaller logical changes.

v3:
 - Removes non-generic stats fields in rte_stats_strings and deprecates
   the fields related to them in struct rte_eth_stats.
 - Modifies rte_eth_xstats_get() to return generic stats and extended stats.
 
v4:
 - Replace count use in the loop in ixgbe_dev_xstats_get() function definition with i.
 - Breakdown "ixgbe: add NIC specific stats removed from ethdev" into two patches, one
   that adds the stats and another that extends ierrors to include more error stats.
 - Remove second call to ixgbe_dev_xstats_get() from rte_eth_xstats_get().

v5:
 - Added documentation for proc_info.
 - Fixed proc_info copyright year.
 - Display queue stats for all devices in proc_info.

Maryam Tahhan (9):
  ixgbe: move stats register reads to a new function
  ixgbe: add functions to get and reset xstats
  ethdev: expose extended error stats
  ethdev: remove HW specific stats in stats structs
  ixgbe: add NIC specific stats removed from ethdev
  ixgbe: return more errors in ierrors
  app: remove dump_cfg
  app: add a new app proc_info
  doc: Add documentation for proc_info

 MAINTAINERS                            |   4 +
 app/Makefile                           |   2 +-
 app/dump_cfg/Makefile                  |  45 -----
 app/dump_cfg/main.c                    |  92 ---------
 app/proc_info/Makefile                 |  45 +++++
 app/proc_info/main.c                   | 354 +++++++++++++++++++++++++++++++++
 doc/guides/rel_notes/abi.rst           |  12 ++
 doc/guides/sample_app_ug/index.rst     |   1 +
 doc/guides/sample_app_ug/proc_info.rst |  71 +++++++
 drivers/net/ixgbe/ixgbe_ethdev.c       | 194 ++++++++++++++----
 lib/librte_ether/rte_ethdev.c          |  34 ++--
 lib/librte_ether/rte_ethdev.h          |  30 ++-
 mk/rte.sdktest.mk                      |   4 +-
 13 files changed, 682 insertions(+), 206 deletions(-)
 delete mode 100644 app/dump_cfg/Makefile
 delete mode 100644 app/dump_cfg/main.c
 create mode 100644 app/proc_info/Makefile
 create mode 100644 app/proc_info/main.c
 create mode 100644 doc/guides/sample_app_ug/proc_info.rst

-- 
2.4.3

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code
  2015-07-13 10:47  4%   ` Mcnamara, John
@ 2015-07-13 13:59  4%     ` Neil Horman
  2015-07-17 11:45  7%       ` Mcnamara, John
  2015-07-31  9:03  7%       ` Mcnamara, John
  0 siblings, 2 replies; 200+ results
From: Neil Horman @ 2015-07-13 13:59 UTC (permalink / raw)
  To: Mcnamara, John; +Cc: dev

On Mon, Jul 13, 2015 at 10:47:03AM +0000, Mcnamara, John wrote:
> > -----Original Message-----
> > From: Neil Horman [mailto:nhorman@tuxdriver.com]
> > Sent: Monday, July 13, 2015 11:42 AM
> > To: Mcnamara, John
> > Cc: dev@dpdk.org; vladz@cloudius-systems.com
> > Subject: Re: [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code
> > 
> > On Mon, Jul 13, 2015 at 11:26:25AM +0100, John McNamara wrote:
> > > Fix for ABI breakage introduced in LRO addition. Moves lro bitfield to
> > > the end of the struct/member.
> > >
> > > Fixes: 8eecb3295aed (ixgbe: add LRO support)
> > >
> > > Signed-off-by: John McNamara <john.mcnamara@intel.com>
> > > ---
> > >  lib/librte_ether/rte_ethdev.h | 4 ++--
> > >  1 file changed, 2 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/lib/librte_ether/rte_ethdev.h
> > > b/lib/librte_ether/rte_ethdev.h index 79bde89..1c3ace1 100644
> > > --- a/lib/librte_ether/rte_ethdev.h
> > > +++ b/lib/librte_ether/rte_ethdev.h
> > > @@ -1578,9 +1578,9 @@ struct rte_eth_dev_data {
> > >  	uint8_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) */
> > > -		lro          : 1,  /**< RX LRO 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).
> > */
> > > +		dev_started : 1,   /**< Device state: STARTED(1) / STOPPED(0).
> > */
> > > +		lro         : 1;   /**< RX LRO is ON(1) / OFF(0) */
> > >  };
> > >
> > >  /**
> > > --
> > > 1.8.1.4
> > >
> > >
> > I presume the ABI checker stopped complaining about this with the patch,
> > yes?
> 
> Hi Neil,
> 
> Yes, I replied about that in the previous thread.
> 
Thank you, I'll ack as soon as Chao confirms its not a problem on ppc
Neil

> John.
> -- 
> 
> 

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code
  2015-07-13 10:42  7% ` Neil Horman
@ 2015-07-13 10:46  4%   ` Thomas Monjalon
  2015-07-13 10:47  4%   ` Mcnamara, John
  1 sibling, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-07-13 10:46 UTC (permalink / raw)
  To: Chao Zhu; +Cc: dev

2015-07-13 06:42, Neil Horman:
> On Mon, Jul 13, 2015 at 11:26:25AM +0100, John McNamara wrote:
> > Fix for ABI breakage introduced in LRO addition. Moves
> > lro bitfield to the end of the struct/member.
> > 
> > Fixes: 8eecb3295aed (ixgbe: add LRO support)
> > 
> > Signed-off-by: John McNamara <john.mcnamara@intel.com>
> > ---
> >  lib/librte_ether/rte_ethdev.h | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> > 
> > diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
> > index 79bde89..1c3ace1 100644
> > --- a/lib/librte_ether/rte_ethdev.h
> > +++ b/lib/librte_ether/rte_ethdev.h
> > @@ -1578,9 +1578,9 @@ struct rte_eth_dev_data {
> >  	uint8_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) */
> > -		lro          : 1,  /**< RX LRO 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). */
> > +		dev_started : 1,   /**< Device state: STARTED(1) / STOPPED(0). */
> > +		lro         : 1;   /**< RX LRO is ON(1) / OFF(0) */
> >  };
> >  
> >  /**
> I presume the ABI checker stopped complaining about this with the patch, yes?
> 
> Also, it would be great if someone could check this on ppc or a ppc cross
> compile, as I recall bitfields follow endianess order.

+ Chao, IBM POWER maintainer.

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code
  2015-07-13 10:42  7% ` Neil Horman
  2015-07-13 10:46  4%   ` Thomas Monjalon
@ 2015-07-13 10:47  4%   ` Mcnamara, John
  2015-07-13 13:59  4%     ` Neil Horman
  1 sibling, 1 reply; 200+ results
From: Mcnamara, John @ 2015-07-13 10:47 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

> -----Original Message-----
> From: Neil Horman [mailto:nhorman@tuxdriver.com]
> Sent: Monday, July 13, 2015 11:42 AM
> To: Mcnamara, John
> Cc: dev@dpdk.org; vladz@cloudius-systems.com
> Subject: Re: [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code
> 
> On Mon, Jul 13, 2015 at 11:26:25AM +0100, John McNamara wrote:
> > Fix for ABI breakage introduced in LRO addition. Moves lro bitfield to
> > the end of the struct/member.
> >
> > Fixes: 8eecb3295aed (ixgbe: add LRO support)
> >
> > Signed-off-by: John McNamara <john.mcnamara@intel.com>
> > ---
> >  lib/librte_ether/rte_ethdev.h | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> >
> > diff --git a/lib/librte_ether/rte_ethdev.h
> > b/lib/librte_ether/rte_ethdev.h index 79bde89..1c3ace1 100644
> > --- a/lib/librte_ether/rte_ethdev.h
> > +++ b/lib/librte_ether/rte_ethdev.h
> > @@ -1578,9 +1578,9 @@ struct rte_eth_dev_data {
> >  	uint8_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) */
> > -		lro          : 1,  /**< RX LRO 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).
> */
> > +		dev_started : 1,   /**< Device state: STARTED(1) / STOPPED(0).
> */
> > +		lro         : 1;   /**< RX LRO is ON(1) / OFF(0) */
> >  };
> >
> >  /**
> > --
> > 1.8.1.4
> >
> >
> I presume the ABI checker stopped complaining about this with the patch,
> yes?

Hi Neil,

Yes, I replied about that in the previous thread.

John.
-- 

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code
  2015-07-13 10:26  7% [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code John McNamara
@ 2015-07-13 10:42  7% ` Neil Horman
  2015-07-13 10:46  4%   ` Thomas Monjalon
  2015-07-13 10:47  4%   ` Mcnamara, John
  2015-07-16 22:22  4% ` Vlad Zolotarov
  1 sibling, 2 replies; 200+ results
From: Neil Horman @ 2015-07-13 10:42 UTC (permalink / raw)
  To: John McNamara; +Cc: dev

On Mon, Jul 13, 2015 at 11:26:25AM +0100, John McNamara wrote:
> Fix for ABI breakage introduced in LRO addition. Moves
> lro bitfield to the end of the struct/member.
> 
> Fixes: 8eecb3295aed (ixgbe: add LRO support)
> 
> Signed-off-by: John McNamara <john.mcnamara@intel.com>
> ---
>  lib/librte_ether/rte_ethdev.h | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
> index 79bde89..1c3ace1 100644
> --- a/lib/librte_ether/rte_ethdev.h
> +++ b/lib/librte_ether/rte_ethdev.h
> @@ -1578,9 +1578,9 @@ struct rte_eth_dev_data {
>  	uint8_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) */
> -		lro          : 1,  /**< RX LRO 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). */
> +		dev_started : 1,   /**< Device state: STARTED(1) / STOPPED(0). */
> +		lro         : 1;   /**< RX LRO is ON(1) / OFF(0) */
>  };
>  
>  /**
> -- 
> 1.8.1.4
> 
> 
I presume the ABI checker stopped complaining about this with the patch, yes?

Also, it would be great if someone could check this on ppc or a ppc cross
compile, as I recall bitfields follow endianess order.

Neil

^ permalink raw reply	[relevance 7%]

* [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code
@ 2015-07-13 10:26  7% John McNamara
  2015-07-13 10:42  7% ` Neil Horman
  2015-07-16 22:22  4% ` Vlad Zolotarov
  0 siblings, 2 replies; 200+ results
From: John McNamara @ 2015-07-13 10:26 UTC (permalink / raw)
  To: dev, vladz

Fix for ABI breakage introduced in LRO addition. Moves
lro bitfield to the end of the struct/member.

Fixes: 8eecb3295aed (ixgbe: add LRO support)

Signed-off-by: John McNamara <john.mcnamara@intel.com>
---
 lib/librte_ether/rte_ethdev.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 79bde89..1c3ace1 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -1578,9 +1578,9 @@ struct rte_eth_dev_data {
 	uint8_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) */
-		lro          : 1,  /**< RX LRO 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). */
+		dev_started : 1,   /**< Device state: STARTED(1) / STOPPED(0). */
+		lro         : 1;   /**< RX LRO is ON(1) / OFF(0) */
 };
 
 /**
-- 
1.8.1.4

^ permalink raw reply	[relevance 7%]

* Re: [dpdk-dev] [PATCH] mk: enable next abi in static libs
  2015-07-11 14:19  7%           ` Neil Horman
@ 2015-07-13 10:14  8%             ` Mcnamara, John
  0 siblings, 0 replies; 200+ results
From: Mcnamara, John @ 2015-07-13 10:14 UTC (permalink / raw)
  To: Neil Horman; +Cc: dev

> -----Original Message-----
> From: Neil Horman [mailto:nhorman@tuxdriver.com]
> Sent: Saturday, July 11, 2015 3:20 PM
> To: Mcnamara, John
> Cc: Thomas Monjalon; dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH] mk: enable next abi in static libs
> 
> On Fri, Jul 10, 2015 at 04:07:53PM +0000, Mcnamara, John wrote:
> > > -----Original Message-----
> > > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> > > Sent: Tuesday, July 7, 2015 2:44 PM
> > > To: Thomas Monjalon
> > > Cc: dev@dpdk.org
> > > Subject: Re: [dpdk-dev] [PATCH] mk: enable next abi in static libs
> > >
> ...
>
> > Is it okay to submit a patch to move it to the end?
> >
> Assuming that fixes the problem, I think thats the only thing you can do
> right now.  I expect that will work, but I would run it through the ABI
> checker to be certain.

Hi Neil,

I ran the change through the abi checker before and after and the lro field no longer generates a Medium Severity ABI warning. I'll submit a patch to move the field.

John.
-- 

^ permalink raw reply	[relevance 8%]

* Re: [dpdk-dev] [PATCH] mk: fix shared lib build with stable abi
  2015-07-13  9:24  4%         ` Mcnamara, John
@ 2015-07-13  9:32  7%           ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-07-13  9:32 UTC (permalink / raw)
  To: Mcnamara, John; +Cc: dev

> > When next ABI is enabled, the shared lib extension is .so.x.1.
> > That's why a double basename was introduced.
> > But the "ifeq NEXT_ABI" was forgotten, removing the .so extension when
> > NEXT_ABI is disabled.
> > It was preventing the linker from finding the .so libraries.
> > 
> > Fixes: 506f51cc0da7 ("mk: enable next abi preview")
> > 
> > Reported-by: John McNamara <john.mcnamara@intel.com>
> > Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
> 
> That fixes it. Thanks.
> 
> Acked-by: John McNamara <john.mcnamara@intel.com>

Applied, thanks.
Now that next ABI can be disabled, patches using it may be applied :)

^ permalink raw reply	[relevance 7%]

* Re: [dpdk-dev] [PATCH] mk: fix shared lib build with stable abi
  2015-07-13  9:02  8%       ` [dpdk-dev] [PATCH] mk: fix shared lib build with stable abi Thomas Monjalon
@ 2015-07-13  9:24  4%         ` Mcnamara, John
  2015-07-13  9:32  7%           ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Mcnamara, John @ 2015-07-13  9:24 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: dev

> -----Original Message-----
> From: Thomas Monjalon [mailto:thomas.monjalon@6wind.com]
> Sent: Monday, July 13, 2015 10:02 AM
> To: Mcnamara, John
> Cc: dev@dpdk.org
> Subject: [PATCH] mk: fix shared lib build with stable abi
> 
> When next ABI is enabled, the shared lib extension is .so.x.1.
> That's why a double basename was introduced.
> But the "ifeq NEXT_ABI" was forgotten, removing the .so extension when
> NEXT_ABI is disabled.
> It was preventing the linker from finding the .so libraries.
> 
> Fixes: 506f51cc0da7 ("mk: enable next abi preview")
> 
> Reported-by: John McNamara <john.mcnamara@intel.com>
> Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>

That fixes it. Thanks.

Acked-by: John McNamara <john.mcnamara@intel.com>

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH] mk: fix shared lib build with stable abi
  2015-07-13  8:48  7%     ` Thomas Monjalon
@ 2015-07-13  9:02  8%       ` Thomas Monjalon
  2015-07-13  9:24  4%         ` Mcnamara, John
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2015-07-13  9:02 UTC (permalink / raw)
  To: John McNamara; +Cc: dev

When next ABI is enabled, the shared lib extension is .so.x.1.
That's why a double basename was introduced.
But the "ifeq NEXT_ABI" was forgotten, removing the .so
extension when NEXT_ABI is disabled.
It was preventing the linker from finding the .so libraries.

Fixes: 506f51cc0da7 ("mk: enable next abi preview")

Reported-by: John McNamara <john.mcnamara@intel.com>
Signed-off-by: Thomas Monjalon <thomas.monjalon@6wind.com>
---
 mk/rte.lib.mk | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
index f15de9b..9ff5cce 100644
--- a/mk/rte.lib.mk
+++ b/mk/rte.lib.mk
@@ -173,7 +173,11 @@ $(RTE_OUTPUT)/lib/$(LIB): $(LIB)
 	@[ -d $(RTE_OUTPUT)/lib ] || mkdir -p $(RTE_OUTPUT)/lib
 	$(Q)cp -f $(LIB) $(RTE_OUTPUT)/lib
 ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),y)
+ifeq ($(CONFIG_RTE_NEXT_ABI),y)
 	$(Q)ln -s -f $< $(basename $(basename $@))
+else
+	$(Q)ln -s -f $< $(basename $@)
+endif
 endif
 
 #
-- 
2.4.2

^ permalink raw reply	[relevance 8%]

* Re: [dpdk-dev] [PATCH v3] mk: enable next abi preview
  2015-07-13  7:32  7%   ` Mcnamara, John
@ 2015-07-13  8:48  7%     ` Thomas Monjalon
  2015-07-13  9:02  8%       ` [dpdk-dev] [PATCH] mk: fix shared lib build with stable abi Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2015-07-13  8:48 UTC (permalink / raw)
  To: Mcnamara, John; +Cc: dev

2015-07-13 07:32, Mcnamara, John:
> This change to enable CONFIG_RTE_NEXT_ABI=n breaks validate-abi.sh
> because master won't compile with CONFIG_RTE_BUILD_SHARED_LIB=y and
> CONFIG_RTE_NEXT_ABI=n:

My bad. I thought I was testing both cases (next ABI and stable one) but
it appears only the "next one" was tested.

The error is trivial:
-       $(Q)ln -s -f $< $(RTE_OUTPUT)/lib/$(LIBSONAME)
+       $(Q)ln -s -f $< $(basename $(basename $@))

The double basename should apply to NEXT_ABI case only.

^ permalink raw reply	[relevance 7%]

* Re: [dpdk-dev] [PATCH v3] mk: enable next abi preview
  @ 2015-07-13  7:32  7%   ` Mcnamara, John
  2015-07-13  8:48  7%     ` Thomas Monjalon
  0 siblings, 1 reply; 200+ results
From: Mcnamara, John @ 2015-07-13  7:32 UTC (permalink / raw)
  To: Thomas Monjalon, nhorman; +Cc: dev


> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Thomas Monjalon
> Sent: Wednesday, July 8, 2015 5:44 PM
> To: nhorman@tuxdriver.com
> Cc: dev@dpdk.org
> Subject: [dpdk-dev] [PATCH v3] mk: enable next abi preview
> 
> --- a/scripts/validate-abi.sh
> +++ b/scripts/validate-abi.sh
> @@ -157,6 +157,7 @@ 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_NEXT_ABI=n" 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
> 

Hi,

This change to enable CONFIG_RTE_NEXT_ABI=n breaks validate-abi.sh because master won't compile with CONFIG_RTE_BUILD_SHARED_LIB=y and CONFIG_RTE_NEXT_ABI=n:

     make uninstall && \
     make T=x86_64-native-linuxapp-gcc install -j \
          CONFIG_RTE_BUILD_SHARED_LIB=y CONFIG_RTE_NEXT_ABI=n

Change was made in: 506f51cc0da7e057ac31e15048ba3b8015112226

John.
-- 

^ permalink raw reply	[relevance 7%]

* Re: [dpdk-dev] [PATCH v7 0/7] Cuckoo hash - part 3 of Cuckoo hash
  2015-07-11  0:18  4%       ` [dpdk-dev] [PATCH v7 0/7] Cuckoo hash - part 3 of Cuckoo hash Pablo de Lara
    2015-07-11  0:18 14%         ` [dpdk-dev] [PATCH v7 6/7] doc: announce ABI change of librte_hash Pablo de Lara
@ 2015-07-12 22:46  0%         ` Thomas Monjalon
  2 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-07-12 22:46 UTC (permalink / raw)
  To: Pablo de Lara; +Cc: dev

2015-07-11 01:18, Pablo de Lara:
> This patchset is to replace the existing hash library with
> a more efficient and functional approach, using the Cuckoo hash
> method to deal with collisions. This method is based on using
> two different hash functions to have two possible locations
> in the hash table where an entry can be.
> So, if a bucket is full, a new entry can push one of the items
> in that bucket to its alternative location, making space for itself.
> 
> Advantages
> ~~
> - Offers the option to store more entries when the target bucket is full
>   (unlike the previous implementation)
> - Memory efficient: for storing those entries, it is not necessary to
>   request new memory, as the entries will be stored in the same table
> - Constant worst lookup time: in worst case scenario, it always takes
>   the same time to look up an entry, as there are only two possible locations
>   where an entry can be.
> - Storing data: user can store data in the hash table, unlike the
>   previous implementation, but he can still use the old API
> 
> This implementation typically offers over 90% utilization.
> Notice that API has been extended, but old API remains.
> Check documentation included to know more about this new implementation
> (including how entries are distributed as table utilization increases).
> 
> Changes in v7:
> - Fix inaccurate documentation
> 
> Changes in v6:
> - Replace datatype for functions from uintptr_t to void *
> 
> Changes in v5:
> - Fix 32-bit compilation issues
> 
> Changes in v4:
> - Unit tests enhancements are not part of this patchset anymore.
> - rte_hash structure has been made internal in another patch,
>   so it is not part of this patchset anymore.
> - Add function to iterate through the hash table, as rte_hash
>   structure has been made private.
> - Added extra_flag parameter in rte_hash_parameter to be able
>   to add new parameters in the future without breaking the ABI
> - Remove proposed lookup_bulk_with_hash function, as it is
>   not of much use with the existing hash functions
>   (there are no vector hash functions).
> - User can store 8-byte integer or pointer as data, instead
>   of variable size data, as discussed in the mailing list.
> 
> Changes in v3:
> 
> - Now user can store variable size data, instead of 32 or 64-bit size data,
>   using the new parameter "data_len" in rte_hash_parameters
> - Add lookup_bulk_with_hash function in performance  unit tests
> - Add new functions that handle data in performance unit tests
> - Remove duplicates in performance unit tests
> - Fix rte_hash_reset, which was not resetting the last entry
> 
> Changes in v2:
> 
> - Fixed issue where table could not store maximum number of entries
> - Fixed issue where lookup burst could not be more than 32 (instead of 64)
> - Remove unnecessary macros and add other useful ones
> - Added missing library dependencies
> - Used directly rte_hash_secondary instead of rte_hash_alt
> - Renamed rte_hash.c to rte_cuckoo_hash.c to ease the view of the new library
> - Renamed test_hash_perf.c temporarily to ease the view of the improved unit test
> - Moved rte_hash, rte_bucket and rte_hash_key structures to rte_cuckoo_hash.c to
>   make them private
> - Corrected copyright dates
> - Added an optimized function to compare keys that are multiple of 16 bytes
> - Improved the way to use primary/secondary signatures. Now both are stored in
>   the bucket, so there is no need to calculate them if required.
>   Also, there is no need to use the MSB of a signature to differenciate between
>   an empty entry and signature 0, since we are storing both signatures,
>   which cannot be both 0.
> - Removed rte_hash_rehash, as it was a very expensive operation.
>   Therefore, the add function returns now -ENOSPC if key cannot be added
>   because of a loop.
> - Prefetched new slot for new key in add function to improve performance.
> - Made doxygen comments more clear.
> - Removed unnecessary rte_hash_del_key_data and rte_hash_del_key_with_data,
>   as we can use the lookup functions if we want to get the data before deleting.
> - Removed some unnecessary includes in rte_hash.h
> - Removed some unnecessary variables in rte_cuckoo_hash.c
> - Removed some unnecessary checks before creating a new hash table
> - Added documentation (in release notes and programmers guide)
> - Added new unit tests and replaced the performance one for hash tables
> 
> Series Acked-by: Bruce Richardson <bruce.richardson@intel.com>

Applied, thanks

Some bugs/formatting were fixed in fly.
Some remaining comments may be addressed in further patches.

^ permalink raw reply	[relevance 0%]

* Re: [dpdk-dev] [PATCH v7 6/7] doc: announce ABI change of librte_hash
  2015-07-11  0:18 14%         ` [dpdk-dev] [PATCH v7 6/7] doc: announce ABI change of librte_hash Pablo de Lara
@ 2015-07-12 22:38  8%           ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-07-12 22:38 UTC (permalink / raw)
  To: Pablo de Lara; +Cc: dev

2015-07-11 01:18, Pablo de Lara:
> Two of the macros in rte_hash.h are now deprecated, so this patch
> adds notice that they will be removed in 2.2.
[...]
> +* The Macros #RTE_HASH_BUCKET_ENTRIES_MAX and #RTE_HASH_KEY_LENGTH_MAX are deprecated and will be removed with version 2.2.

These macros have no impact on the ABI.
I suggest to rename doc/guides/rel_notes/abi.rst to deprecation.rst
and add a chapter about API in doc/guides/guidelines/versioning.rst.

^ permalink raw reply	[relevance 8%]

* Re: [dpdk-dev] [PATCH v7 1/7] hash: replace existing hash library with cuckoo hash implementation
  @ 2015-07-12 22:29  3%           ` Thomas Monjalon
  2015-07-13 16:11  3%             ` Bruce Richardson
  0 siblings, 1 reply; 200+ results
From: Thomas Monjalon @ 2015-07-12 22:29 UTC (permalink / raw)
  To: Pablo de Lara; +Cc: dev

2015-07-11 01:18, Pablo de Lara:
> The main change when creating a new table is that the number of entries
> per bucket is fixed now, so its parameter is ignored now
> (still there to maintain the same parameters structure).

Why not rename the "bucket_entries" field to "reserved"?
The API of this field has changed (now ignored) so it should be reflected
without changing the ABI.

^ permalink raw reply	[relevance 3%]

* Re: [dpdk-dev] [PATCH] mk: enable next abi in static libs
  @ 2015-07-11 14:19  7%           ` Neil Horman
  2015-07-13 10:14  8%             ` Mcnamara, John
  0 siblings, 1 reply; 200+ results
From: Neil Horman @ 2015-07-11 14:19 UTC (permalink / raw)
  To: Mcnamara, John; +Cc: dev

On Fri, Jul 10, 2015 at 04:07:53PM +0000, Mcnamara, John wrote:
> > -----Original Message-----
> > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Neil Horman
> > Sent: Tuesday, July 7, 2015 2:44 PM
> > To: Thomas Monjalon
> > Cc: dev@dpdk.org
> > Subject: Re: [dpdk-dev] [PATCH] mk: enable next abi in static libs
> > 
> > On Tue, Jul 07, 2015 at 05:46:08AM -0700, Thomas Monjalon wrote:
> > > Neil, in the meantime, could you please help to check ABI breakage in
> > the HEAD?
> > >
> > Took a look, the only ABI break I see that we need to worry about is the
> > one introduced in commit 8eecb3295aed0a979def52245564d03be172a83c. It adds
> > a bitfield called lro into the existing uint8_t there, but does so in the
> > middle of the set, which pushes the other bits around, breaking ABI.  It
> > should have been added to the end.
> 
> Hi,
> 
> Is it okay to submit a patch to move it to the end?
> 
Assuming that fixes the problem, I think thats the only thing you can do right
now.  I expect that will work, but I would run it through the ABI checker to be
certain
Neil


> John.
> -- 
> 
> 
> 
> 

^ permalink raw reply	[relevance 7%]

* [dpdk-dev] [PATCH v7 6/7] doc: announce ABI change of librte_hash
  2015-07-11  0:18  4%       ` [dpdk-dev] [PATCH v7 0/7] Cuckoo hash - part 3 of Cuckoo hash Pablo de Lara
  @ 2015-07-11  0:18 14%         ` Pablo de Lara
  2015-07-12 22:38  8%           ` Thomas Monjalon
  2015-07-12 22:46  0%         ` [dpdk-dev] [PATCH v7 0/7] Cuckoo hash - part 3 of Cuckoo hash Thomas Monjalon
  2 siblings, 1 reply; 200+ results
From: Pablo de Lara @ 2015-07-11  0:18 UTC (permalink / raw)
  To: dev

Two of the macros in rte_hash.h are now deprecated, so this patch
adds notice that they will be removed in 2.2.

Signed-off-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
---
 doc/guides/rel_notes/abi.rst | 1 +
 1 file changed, 1 insertion(+)

diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst
index 9d60a74..b45017c 100644
--- a/doc/guides/rel_notes/abi.rst
+++ b/doc/guides/rel_notes/abi.rst
@@ -21,3 +21,4 @@ Deprecation Notices
   1024 queues per port. This change will be in release 2.2.
   There is no backward compatibility planned from release 2.2.
   All binaries will need to be rebuilt from release 2.2.
+* The Macros #RTE_HASH_BUCKET_ENTRIES_MAX and #RTE_HASH_KEY_LENGTH_MAX are deprecated and will be removed with version 2.2.
-- 
2.4.3

^ permalink raw reply	[relevance 14%]

* [dpdk-dev] [PATCH v7 0/7] Cuckoo hash - part 3 of Cuckoo hash
  2015-07-10 23:30  4%     ` [dpdk-dev] [PATCH v6 0/7] Cuckoo hash - part 3 of Cuckoo hash Pablo de Lara
  2015-07-10 23:30 14%       ` [dpdk-dev] [PATCH v6 6/7] doc: announce ABI change of librte_hash Pablo de Lara
@ 2015-07-11  0:18  4%       ` Pablo de Lara
                             ` (2 more replies)
  1 sibling, 3 replies; 200+ results
From: Pablo de Lara @ 2015-07-11  0:18 UTC (permalink / raw)
  To: dev

This patchset is to replace the existing hash library with
a more efficient and functional approach, using the Cuckoo hash
method to deal with collisions. This method is based on using
two different hash functions to have two possible locations
in the hash table where an entry can be.
So, if a bucket is full, a new entry can push one of the items
in that bucket to its alternative location, making space for itself.

Advantages
~~
- Offers the option to store more entries when the target bucket is full
  (unlike the previous implementation)
- Memory efficient: for storing those entries, it is not necessary to
  request new memory, as the entries will be stored in the same table
- Constant worst lookup time: in worst case scenario, it always takes
  the same time to look up an entry, as there are only two possible locations
  where an entry can be.
- Storing data: user can store data in the hash table, unlike the
  previous implementation, but he can still use the old API

This implementation typically offers over 90% utilization.
Notice that API has been extended, but old API remains.
Check documentation included to know more about this new implementation
(including how entries are distributed as table utilization increases).

Changes in v7:
- Fix inaccurate documentation

Changes in v6:
- Replace datatype for functions from uintptr_t to void *

Changes in v5:
- Fix 32-bit compilation issues

Changes in v4:
- Unit tests enhancements are not part of this patchset anymore.
- rte_hash structure has been made internal in another patch,
  so it is not part of this patchset anymore.
- Add function to iterate through the hash table, as rte_hash
  structure has been made private.
- Added extra_flag parameter in rte_hash_parameter to be able
  to add new parameters in the future without breaking the ABI
- Remove proposed lookup_bulk_with_hash function, as it is
  not of much use with the existing hash functions
  (there are no vector hash functions).
- User can store 8-byte integer or pointer as data, instead
  of variable size data, as discussed in the mailing list.

Changes in v3:

- Now user can store variable size data, instead of 32 or 64-bit size data,
  using the new parameter "data_len" in rte_hash_parameters
- Add lookup_bulk_with_hash function in performance  unit tests
- Add new functions that handle data in performance unit tests
- Remove duplicates in performance unit tests
- Fix rte_hash_reset, which was not resetting the last entry

Changes in v2:

- Fixed issue where table could not store maximum number of entries
- Fixed issue where lookup burst could not be more than 32 (instead of 64)
- Remove unnecessary macros and add other useful ones
- Added missing library dependencies
- Used directly rte_hash_secondary instead of rte_hash_alt
- Renamed rte_hash.c to rte_cuckoo_hash.c to ease the view of the new library
- Renamed test_hash_perf.c temporarily to ease the view of the improved unit test
- Moved rte_hash, rte_bucket and rte_hash_key structures to rte_cuckoo_hash.c to
  make them private
- Corrected copyright dates
- Added an optimized function to compare keys that are multiple of 16 bytes
- Improved the way to use primary/secondary signatures. Now both are stored in
  the bucket, so there is no need to calculate them if required.
  Also, there is no need to use the MSB of a signature to differenciate between
  an empty entry and signature 0, since we are storing both signatures,
  which cannot be both 0.
- Removed rte_hash_rehash, as it was a very expensive operation.
  Therefore, the add function returns now -ENOSPC if key cannot be added
  because of a loop.
- Prefetched new slot for new key in add function to improve performance.
- Made doxygen comments more clear.
- Removed unnecessary rte_hash_del_key_data and rte_hash_del_key_with_data,
  as we can use the lookup functions if we want to get the data before deleting.
- Removed some unnecessary includes in rte_hash.h
- Removed some unnecessary variables in rte_cuckoo_hash.c
- Removed some unnecessary checks before creating a new hash table
- Added documentation (in release notes and programmers guide)
- Added new unit tests and replaced the performance one for hash tables

Series Acked-by: Bruce Richardson <bruce.richardson@intel.com>

Pablo de Lara (7):
  hash: replace existing hash library with cuckoo hash implementation
  hash: add new function rte_hash_reset
  hash: add new functionality to store data in hash table
  hash: add iterate function
  MAINTAINERS: claim responsability for hash library
  doc: announce ABI change of librte_hash
  doc: update hash documentation

 MAINTAINERS                          |    1 +
 app/test/test_hash.c                 |  189 +++---
 app/test/test_hash_perf.c            |  303 ++++++---
 doc/guides/prog_guide/hash_lib.rst   |  138 +++-
 doc/guides/prog_guide/index.rst      |    4 +
 doc/guides/rel_notes/abi.rst         |    1 +
 lib/librte_hash/Makefile             |    8 +-
 lib/librte_hash/rte_cuckoo_hash.c    | 1194 ++++++++++++++++++++++++++++++++++
 lib/librte_hash/rte_hash.c           |  499 --------------
 lib/librte_hash/rte_hash.h           |  198 +++++-
 lib/librte_hash/rte_hash_version.map |   15 +
 11 files changed, 1810 insertions(+), 740 deletions(-)
 create mode 100644 lib/librte_hash/rte_cuckoo_hash.c
 delete mode 100644 lib/librte_hash/rte_hash.c

-- 
2.4.3

^ permalink raw reply	[relevance 4%]

* [dpdk-dev] [PATCH v6 6/7] doc: announce ABI change of librte_hash
  2015-07-10 23:30  4%     ` [dpdk-dev] [PATCH v6 0/7] Cuckoo hash - part 3 of Cuckoo hash Pablo de Lara
@ 2015-07-10 23:30 14%       ` Pablo de Lara
  2015-07-11  0:18  4%       ` [dpdk-dev] [PATCH v7 0/7] Cuckoo hash - part 3 of Cuckoo hash Pablo de Lara
  1 sibling, 0 replies; 200+ results
From: Pablo de Lara @ 2015-07-10 23:30 UTC (permalink / raw)
  To: dev

Two of the macros in rte_hash.h are now deprecated, so this patch
adds notice that they will be removed in 2.2.

Signed-off-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
---
 doc/guides/rel_notes/abi.rst | 1 +
 1 file changed, 1 insertion(+)

diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst
index 9d60a74..b45017c 100644
--- a/doc/guides/rel_notes/abi.rst
+++ b/doc/guides/rel_notes/abi.rst
@@ -21,3 +21,4 @@ Deprecation Notices
   1024 queues per port. This change will be in release 2.2.
   There is no backward compatibility planned from release 2.2.
   All binaries will need to be rebuilt from release 2.2.
+* The Macros #RTE_HASH_BUCKET_ENTRIES_MAX and #RTE_HASH_KEY_LENGTH_MAX are deprecated and will be removed with version 2.2.
-- 
2.4.3

^ permalink raw reply	[relevance 14%]

* [dpdk-dev] [PATCH v6 0/7] Cuckoo hash - part 3 of Cuckoo hash
  2015-07-10 21:57  4%   ` [dpdk-dev] [PATCH v5 " Pablo de Lara
  2015-07-10 21:57 14%     ` [dpdk-dev] [PATCH v5 6/7] doc: announce ABI change of librte_hash Pablo de Lara
@ 2015-07-10 23:30  4%     ` Pablo de Lara
  2015-07-10 23:30 14%       ` [dpdk-dev] [PATCH v6 6/7] doc: announce ABI change of librte_hash Pablo de Lara
  2015-07-11  0:18  4%       ` [dpdk-dev] [PATCH v7 0/7] Cuckoo hash - part 3 of Cuckoo hash Pablo de Lara
  1 sibling, 2 replies; 200+ results
From: Pablo de Lara @ 2015-07-10 23:30 UTC (permalink / raw)
  To: dev

This patchset is to replace the existing hash library with
a more efficient and functional approach, using the Cuckoo hash
method to deal with collisions. This method is based on using
two different hash functions to have two possible locations
in the hash table where an entry can be.
So, if a bucket is full, a new entry can push one of the items
in that bucket to its alternative location, making space for itself.

Advantages
~~~
- Offers the option to store more entries when the target bucket is full
  (unlike the previous implementation)
- Memory efficient: for storing those entries, it is not necessary to
  request new memory, as the entries will be stored in the same table
- Constant worst lookup time: in worst case scenario, it always takes
  the same time to look up an entry, as there are only two possible locations
  where an entry can be.
- Storing data: user can store data in the hash table, unlike the
  previous implementation, but he can still use the old API

This implementation typically offers over 90% utilization.
Notice that API has been extended, but old API remains.
Check documentation included to know more about this new implementation
(including how entries are distributed as table utilization increases).

Changes in v6:
- Replace datatype for functions from uintptr_t to void *

Changes in v5:
- Fix documentation
- Fix 32-bit compilation issues

Changes in v4:
- Unit tests enhancements are not part of this patchset anymore.
- rte_hash structure has been made internal in another patch,
  so it is not part of this patchset anymore.
- Add function to iterate through the hash table, as rte_hash
  structure has been made private.
- Added extra_flag parameter in rte_hash_parameter to be able
  to add new parameters in the future without breaking the ABI
- Remove proposed lookup_bulk_with_hash function, as it is
  not of much use with the existing hash functions
  (there are no vector hash functions).
- User can store 8-byte integer or pointer as data, instead
  of variable size data, as discussed in the mailing list.

Changes in v3:

- Now user can store variable size data, instead of 32 or 64-bit size data,
  using the new parameter "data_len" in rte_hash_parameters
- Add lookup_bulk_with_hash function in performance  unit tests
- Add new functions that handle data in performance unit tests
- Remove duplicates in performance unit tests
- Fix rte_hash_reset, which was not resetting the last entry

Changes in v2:

- Fixed issue where table could not store maximum number of entries
- Fixed issue where lookup burst could not be more than 32 (instead of 64)
- Remove unnecessary macros and add other useful ones
- Added missing library dependencies
- Used directly rte_hash_secondary instead of rte_hash_alt
- Renamed rte_hash.c to rte_cuckoo_hash.c to ease the view of the new library
- Renamed test_hash_perf.c temporarily to ease the view of the improved unit test
- Moved rte_hash, rte_bucket and rte_hash_key structures to rte_cuckoo_hash.c to
  make them private
- Corrected copyright dates
- Added an optimized function to compare keys that are multiple of 16 bytes
- Improved the way to use primary/secondary signatures. Now both are stored in
  the bucket, so there is no need to calculate them if required.
  Also, there is no need to use the MSB of a signature to differenciate between
  an empty entry and signature 0, since we are storing both signatures,
  which cannot be both 0.
- Removed rte_hash_rehash, as it was a very expensive operation.
  Therefore, the add function returns now -ENOSPC if key cannot be added
  because of a loop.
- Prefetched new slot for new key in add function to improve performance.
- Made doxygen comments more clear.
- Removed unnecessary rte_hash_del_key_data and rte_hash_del_key_with_data,
  as we can use the lookup functions if we want to get the data before deleting.
- Removed some unnecessary includes in rte_hash.h
- Removed some unnecessary variables in rte_cuckoo_hash.c
- Removed some unnecessary checks before creating a new hash table
- Added documentation (in release notes and programmers guide)
- Added new unit tests and replaced the performance one for hash tables

Series Acked-by: Bruce Richardson <bruce.richardson@intel.com>

Pablo de Lara (7):
  hash: replace existing hash library with cuckoo hash implementation
  hash: add new function rte_hash_reset
  hash: add new functionality to store data in hash table
  hash: add iterate function
  MAINTAINERS: claim responsability for hash library
  doc: announce ABI change of librte_hash
  doc: update hash documentation

 MAINTAINERS                          |    1 +
 app/test/test_hash.c                 |  189 +++---
 app/test/test_hash_perf.c            |  303 ++++++---
 doc/guides/prog_guide/hash_lib.rst   |  138 +++-
 doc/guides/prog_guide/index.rst      |    4 +
 doc/guides/rel_notes/abi.rst         |    1 +
 lib/librte_hash/Makefile             |    8 +-
 lib/librte_hash/rte_cuckoo_hash.c    | 1194 ++++++++++++++++++++++++++++++++++
 lib/librte_hash/rte_hash.c           |  499 --------------
 lib/librte_hash/rte_hash.h           |  198 +++++-
 lib/librte_hash/rte_hash_version.map |   15 +
 11 files changed, 1810 insertions(+), 740 deletions(-)
 create mode 100644 lib/librte_hash/rte_cuckoo_hash.c
 delete mode 100644 lib/librte_hash/rte_hash.c

-- 
2.4.3

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] doc:announce ABI changes planned for struct rte_eth_dev to support up to 1024 queues per port
  @ 2015-07-10 22:14  4%   ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-07-10 22:14 UTC (permalink / raw)
  To: Jijiang Liu; +Cc: dev

> > The significant ABI change of all shared libraries is planned for struct rte_eth_dev to support up to 1024 queues per port which will be taken effect from release 2.2.
> > 
> > Signed-off-by: Jijiang Liu <jijiang.liu@intel.com>
[...]
> >  Deprecation Notices
> >  -------------------
> > +* Significant ABI changes are planned for struct rte_eth_dev to support up to 1024 queues per port. This change will be taken effect for shared libraries from release 2.2. There is no backward compatibility planned from release 2.2. All binaries will need to be rebuilt from release 2.2.

not only for shared libraries

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

Wrapped and applied with above fix, thanks

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH] config: revert the CONFIG_RTE_MAX_QUEUES_PER_PORT to 256
  @ 2015-07-10 21:58  0% ` Thomas Monjalon
  0 siblings, 0 replies; 200+ results
From: Thomas Monjalon @ 2015-07-10 21:58 UTC (permalink / raw)
  To: Jijiang Liu; +Cc: dev

2015-07-08 09:24, Jijiang Liu:
> Revert the CONFIG_RTE_MAX_QUEUES_PER_PORT to 256.
> 
> The previous commit changed the size and the offsets of struct rte_eth_dev,
> so it is an ABI breakage. I revert it, and will send a deprecation notice for this.
> 
> Signed-off-by: Jijiang Liu <jijiang.liu@intel.com>

Applied, thanks

^ permalink raw reply	[relevance 0%]

* [dpdk-dev] [PATCH v5 6/7] doc: announce ABI change of librte_hash
  2015-07-10 21:57  4%   ` [dpdk-dev] [PATCH v5 " Pablo de Lara
@ 2015-07-10 21:57 14%     ` Pablo de Lara
  2015-07-10 23:30  4%     ` [dpdk-dev] [PATCH v6 0/7] Cuckoo hash - part 3 of Cuckoo hash Pablo de Lara
  1 sibling, 0 replies; 200+ results
From: Pablo de Lara @ 2015-07-10 21:57 UTC (permalink / raw)
  To: dev

Two of the macros in rte_hash.h are now deprecated, so this patch
adds notice that they will be removed in 2.2.

Signed-off-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
---
 doc/guides/rel_notes/abi.rst | 1 +
 1 file changed, 1 insertion(+)

diff --git a/doc/guides/rel_notes/abi.rst b/doc/guides/rel_notes/abi.rst
index 110c486..312348e 100644
--- a/doc/guides/rel_notes/abi.rst
+++ b/doc/guides/rel_notes/abi.rst
@@ -12,3 +12,4 @@ Examples of Deprecation Notices
 
 Deprecation Notices
 -------------------
+* The Macros #RTE_HASH_BUCKET_ENTRIES_MAX and #RTE_HASH_KEY_LENGTH_MAX are deprecated and will be removed with version 2.2.
-- 
2.4.3

^ permalink raw reply	[relevance 14%]

* [dpdk-dev] [PATCH v5 0/7] Cuckoo hash - part 3 of Cuckoo hash
    2015-07-10 20:52  0%   ` Bruce Richardson
@ 2015-07-10 21:57  4%   ` Pablo de Lara
  2015-07-10 21:57 14%     ` [dpdk-dev] [PATCH v5 6/7] doc: announce ABI change of librte_hash Pablo de Lara
  2015-07-10 23:30  4%     ` [dpdk-dev] [PATCH v6 0/7] Cuckoo hash - part 3 of Cuckoo hash Pablo de Lara
  1 sibling, 2 replies; 200+ results
From: Pablo de Lara @ 2015-07-10 21:57 UTC (permalink / raw)
  To: dev

This patchset is to replace the existing hash library with
a more efficient and functional approach, using the Cuckoo hash
method to deal with collisions. This method is based on using
two different hash functions to have two possible locations
in the hash table where an entry can be.
So, if a bucket is full, a new entry can push one of the items
in that bucket to its alternative location, making space for itself.

Advantages
~~~~
- Offers the option to store more entries when the target bucket is full
  (unlike the previous implementation)
- Memory efficient: for storing those entries, it is not necessary to
  request new memory, as the entries will be stored in the same table
- Constant worst lookup time: in worst case scenario, it always takes
  the same time to look up an entry, as there are only two possible locations
  where an entry can be.
- Storing data: user can store data in the hash table, unlike the
  previous implementation, but he can still use the old API

This implementation tipically offers over 90% utilization.
Notice that API has been extended, but old API remains.
Check documentation included to know more about this new implementation
(including how entries are distributed as table utilization increases).

Changes in v5:
- Fix documentation
- Fix 32-bit compilation issues

Changes in v4:
- Unit tests enhancements are not part of this patchset anymore.
- rte_hash structure has been made internal in another patch,
  so it is not part of this patchset anymore.
- Add function to iterate through the hash table, as rte_hash
  structure has been made private.
- Added extra_flag parameter in rte_hash_parameter to be able
  to add new parameters in the future without breaking the ABI
- Remove proposed lookup_bulk_with_hash function, as it is
  not of much use with the existing hash functions
  (there are no vector hash functions).
- User can store 8-byte integer or pointer as data, instead
  of variable size data, as discussed in the mailing list.

Changes in v3:

- Now user can store variable size data, instead of 32 or 64-bit size data,
  using the new parameter "data_len" in rte_hash_parameters
- Add lookup_bulk_with_hash function in performance  unit tests
- Add new functions that handle data in performance unit tests
- Remove duplicates in performance unit tests
- Fix rte_hash_reset, which was not reseting the last entry

Changes in v2:

- Fixed issue where table could not store maximum number of entries
- Fixed issue where lookup burst could not be more than 32 (instead of 64)
- Remove unnecessary macros and add other useful ones
- Added missing library dependencies
- Used directly rte_hash_secondary instead of rte_hash_alt
- Renamed rte_hash.c to rte_cuckoo_hash.c to ease the view of the new library
- Renamed test_hash_perf.c temporarily to ease the view of the improved unit test
- Moved rte_hash, rte_bucket and rte_hash_key structures to rte_cuckoo_hash.c to
  make them private
- Corrected copyright dates
- Added an optimized function to compare keys that are multiple of 16 bytes
- Improved the way to use primary/secondary signatures. Now both are stored in
  the bucket, so there is no need to calculate them if required.
  Also, there is no need to use the MSB of a signature to differenciate between
  an empty entry and signature 0, since we are storing both signatures,
  which cannot be both 0.
- Removed rte_hash_rehash, as it was a very expensive operation.
  Therefore, the add function returns now -ENOSPC if key cannot be added
  because of a loop.
- Prefetched new slot for new key in add function to improve performance.
- Made doxygen comments more clear.
- Removed unnecessary rte_hash_del_key_data and rte_hash_del_key_with_data,
  as we can use the lookup functions if we want to get the data before deleting.
- Removed some unnecessary includes in rte_hash.h
- Removed some unnecessary variables in rte_cuckoo_hash.c
- Removed some unnecessary checks before creating a new hash table
- Added documentation (in release notes and programmers guide)
- Added new unit tests and replaced the performance one for hash tables

Pablo de Lara (7):
  hash: replace existing hash library with cuckoo hash implementation
  hash: add new function rte_hash_reset
  hash: add new functionality to store data in hash table
  hash: add iterate function
  MAINTAINERS: claim responsability for hash library
  doc: announce ABI change of librte_hash
  doc: update hash documentation

 MAINTAINERS                          |    1 +
 app/test/test_hash.c                 |  189 +++---
 app/test/test_hash_perf.c            |  305 ++++++---
 doc/guides/prog_guide/hash_lib.rst   |  138 +++-
 doc/guides/prog_guide/index.rst      |    4 +
 doc/guides/rel_notes/abi.rst         |    1 +
 lib/librte_hash/Makefile             |    8 +-
 lib/librte_hash/rte_cuckoo_hash.c    | 1194 ++++++++++++++++++++++++++++++++++
 lib/librte_hash/rte_hash.c           |  499 --------------
 lib/librte_hash/rte_hash.h           |  198 +++++-
 lib/librte_hash/rte_hash_version.map |   15 +
 11 files changed, 1812 insertions(+), 740 deletions(-)
 create mode 100644 lib/librte_hash/rte_cuckoo_hash.c
 delete mode 100644 lib/librte_hash/rte_hash.c

-- 
2.4.3

^ permalink raw reply	[relevance 4%]

* Re: [dpdk-dev] [PATCH v4 0/7] Cuckoo hash - part 3 of Cuckoo hash
  @ 2015-07-10 20:52  0%   ` Bruce Richardson
  2015-07-10 21:57  4%   ` [dpdk-dev] [PATCH v5 " Pablo de Lara
  1 sibling, 0 replies; 200+ results
From: Bruce Richardson @ 2015-07-10 20:52 UTC (permalink / raw)
  To: Pablo de Lara; +Cc: dev

On Fri, Jul 10, 2015 at 06:24:17PM +0100, Pablo de Lara wrote:
> This patchset is to replace the existing hash library with
> a more efficient and functional approach, using the Cuckoo hash
> method to deal with collisions. This method is based on using
> two different hash functions to have two possible locations
> in the hash table where an entry can be.
> So, if a bucket is full, a new entry can push one of the items
> in that bucket to its alternative location, making space for itself.
> 
> Advantages
> ~~~~~
> - Offers the option to store more entries when the target bucket is full
>   (unlike the previous implementation)
> - Memory efficient: for storing those entries, it is not necessary to
>   request new memory, as the entries will be stored in the same table
> - Constant worst lookup time: in worst case scenario, it always takes
>   the same time to look up an entry, as there are only two possible locations
>   where an entry can be.
> - Storing data: user can store data in the hash table, unlike the
>   previous implementation, but he can still use the old API
> 
> This implementation tipically offers over 90% utilization.
> Notice that API has been extended, but old API remains.
> Check documentation included to know more about this new implementation
> (including how entries are distributed as table utilization increases).
> 
> Changes in v4:
> - Unit tests enhancements are not part of this patchset anymore.
> - rte_hash structure has been made internal in another patch,
>   so it is not part of this patchset anymore.
> - Add function to iterate through the hash table, as rte_hash
>   structure has been made private.
> - Added extra_flag parameter in rte_hash_parameter to be able
>   to add new parameters in the future without breaking the ABI
> - Remove proposed lookup_bulk_with_hash function, as it is
>   not of much use with the existing hash functions
>   (there are no vector hash functions).
> - User can store 8-byte integer or pointer as data, instead
>   of variable size data, as discussed in the mailing list.
>

Hi Pablo,

I'm getting some compile errors with this code, perhaps you could recheck e.g
32-bit and with clang.
On the plus side, I like the docs included with this set.

Regards,
/Bruce

^ permalink raw reply	[relevance 0%]

Results 13001-13200 of ~18000   |  | reverse | sort options + mbox downloads above
-- links below jump to the message on this page --
2015-04-14 17:55     [dpdk-dev] [PATCH] pci: make rte_pci_probe void Stephen Hemminger
2015-04-20 13:15     ` Thomas Monjalon
2015-07-30  0:34  3%   ` Stephen Hemminger
2015-04-17 15:35     [dpdk-dev] [PATCH 0/2] functions with useless return Stephen Hemminger
2015-04-17 15:35     ` [dpdk-dev] [PATCH 1/2] log: rte_openlog_stream should be void Stephen Hemminger
2015-05-19 10:24       ` Bruce Richardson
2015-07-30  0:35  3%     ` Stephen Hemminger
2015-06-05  7:40     [dpdk-dev] [PATCH v1] abi: announce abi changes plan for interrupt mode Cunming Liang
2015-07-30  1:57 14% ` [dpdk-dev] [PATCH v2] doc: announce abi change " Cunming Liang
2015-07-30  5:04 13%   ` [dpdk-dev] [PATCH v3] " Cunming Liang
2015-07-30  5:14  4%     ` Liu, Yong
2015-07-30 14:25  7%       ` O'Driscoll, Tim
2015-07-30  8:31  4%     ` He, Shaopeng
2015-07-31  1:00  4%     ` Zhang, Helin
2015-08-12  8:51  4%       ` Thomas Monjalon
2015-06-08  5:28     [dpdk-dev] [PATCH v12 00/14] Interrupt mode PMD Cunming Liang
2015-06-19  4:00     ` [dpdk-dev] [PATCH v13 " Cunming Liang
2015-07-09 13:58       ` David Marchand
2015-07-17  6:04  0%     ` Liang, Cunming
2015-07-17  6:16  4%   ` [dpdk-dev] [PATCH v14 00/13] " Cunming Liang
2015-07-17  6:16  8%     ` [dpdk-dev] [PATCH v14 01/13] eal/linux: add interrupt vectors support in intr_handle Cunming Liang
2015-07-19 23:31  0%       ` Thomas Monjalon
2015-07-20  2:02  0%         ` Liang, Cunming
2015-07-17  6:16  2%     ` [dpdk-dev] [PATCH v14 02/13] eal/linux: add rte_epoll_wait/ctl support Cunming Liang
2015-07-17  6:16  2%     ` [dpdk-dev] [PATCH v14 03/13] eal/linux: add API to set rx interrupt event monitor Cunming Liang
2015-07-17  6:16  3%     ` [dpdk-dev] [PATCH v14 05/13] eal/linux: map eventfd to VFIO MSI-X intr vector Cunming Liang
2015-07-17  6:16  3%     ` [dpdk-dev] [PATCH v14 06/13] eal/linux: standalone intr event fd create support Cunming Liang
2015-07-17  6:16  8%     ` [dpdk-dev] [PATCH v14 08/13] eal/bsd: dummy for new intr definition Cunming Liang
2015-07-17  6:16  3%     ` [dpdk-dev] [PATCH v14 10/13] ethdev: add rx intr enable, disable and ctl functions Cunming Liang
2015-07-17  6:16  1%     ` [dpdk-dev] [PATCH v14 11/13] ixgbe: enable rx queue interrupts for both PF and VF Cunming Liang
2015-07-17  6:16  2%     ` [dpdk-dev] [PATCH v14 12/13] igb: enable rx queue interrupts for PF Cunming Liang
2015-07-17  6:16  2%     ` [dpdk-dev] [PATCH v14 13/13] l3fwd-power: enable one-shot rx interrupt and polling/interrupt mode switch Cunming Liang
2015-07-20  3:02  4%     ` [dpdk-dev] [PATCH v15 00/13] Interrupt mode PMD Cunming Liang
2015-07-20  3:02  3%       ` [dpdk-dev] [PATCH v15 01/13] eal/linux: add interrupt vectors support in intr_handle Cunming Liang
2015-07-20  3:02  2%       ` [dpdk-dev] [PATCH v15 02/13] eal/linux: add rte_epoll_wait/ctl support Cunming Liang
2015-07-20  3:02  3%       ` [dpdk-dev] [PATCH v15 03/13] eal/linux: add API to set rx interrupt event monitor Cunming Liang
2015-07-20  3:02  3%       ` [dpdk-dev] [PATCH v15 05/13] eal/linux: map eventfd to VFIO MSI-X intr vector Cunming Liang
2015-07-20  3:02  3%       ` [dpdk-dev] [PATCH v15 06/13] eal/linux: standalone intr event fd create support Cunming Liang
2015-07-20  3:02  3%       ` [dpdk-dev] [PATCH v15 08/13] eal/bsd: dummy for new intr definition Cunming Liang
2015-07-20  3:02  3%       ` [dpdk-dev] [PATCH v15 10/13] ethdev: add rx intr enable, disable and ctl functions Cunming Liang
2015-07-20  3:02  1%       ` [dpdk-dev] [PATCH v15 11/13] ixgbe: enable rx queue interrupts for both PF and VF Cunming Liang
2015-07-20  3:02  2%       ` [dpdk-dev] [PATCH v15 12/13] igb: enable rx queue interrupts for PF Cunming Liang
2015-07-20  3:02  2%       ` [dpdk-dev] [PATCH v15 13/13] l3fwd-power: enable one-shot rx interrupt and polling/interrupt mode switch Cunming Liang
2015-07-23 14:18  3%       ` [dpdk-dev] [PATCH v15 00/13] Interrupt mode PMD Liang, Cunming
2015-07-27 21:34  0%         ` Thomas Monjalon
2015-06-12 11:28     [dpdk-dev] [PATCH 0/4] ethdev: Add checks for function support in driver Bruce Richardson
2015-06-15 10:14     ` [dpdk-dev] [PATCH 4/4] ethdev: check support for rx_queue_count and descriptor_done fns Bruce Richardson
2015-07-06 15:11       ` Thomas Monjalon
2015-07-26 20:44  0%     ` Thomas Monjalon
2015-06-15 16:51     [dpdk-dev] [PATCH 0/3 v2] remove code marked as deprecated in 2.0 Stephen Hemminger
2015-08-16 22:51     ` [dpdk-dev] [PATCH 0/3] announce deprecation of functions commented as deprecated Thomas Monjalon
2015-08-16 22:51  4%   ` [dpdk-dev] [PATCH 2/3] doc: announce removal of kni functions using port id Thomas Monjalon
2015-08-16 22:51  4%   ` [dpdk-dev] [PATCH 3/3] doc: announce ring PMD functions removal Thomas Monjalon
2015-06-16  1:38     [dpdk-dev] [PATCH] abi: Announce abi changes plan for vhost-user multiple queues Ouyang Changchun
2015-08-12 14:57  5% ` Thomas Monjalon
2015-06-17  3:36     [dpdk-dev] [PATCH] abi: announce abi changes plan for struct rte_eth_fdir_flow_ext Jingjing Wu
2015-08-12 10:25  5% ` Thomas Monjalon
2015-06-28 22:25     [dpdk-dev] [PATCH v3 00/11] Cuckoo hash Pablo de Lara
2015-07-10 17:24     ` [dpdk-dev] [PATCH v4 0/7] Cuckoo hash - part 3 of " Pablo de Lara
2015-07-10 20:52  0%   ` Bruce Richardson
2015-07-10 21:57  4%   ` [dpdk-dev] [PATCH v5 " Pablo de Lara
2015-07-10 21:57 14%     ` [dpdk-dev] [PATCH v5 6/7] doc: announce ABI change of librte_hash Pablo de Lara
2015-07-10 23:30  4%     ` [dpdk-dev] [PATCH v6 0/7] Cuckoo hash - part 3 of Cuckoo hash Pablo de Lara
2015-07-10 23:30 14%       ` [dpdk-dev] [PATCH v6 6/7] doc: announce ABI change of librte_hash Pablo de Lara
2015-07-11  0:18  4%       ` [dpdk-dev] [PATCH v7 0/7] Cuckoo hash - part 3 of Cuckoo hash Pablo de Lara
2015-07-11  0:18             ` [dpdk-dev] [PATCH v7 1/7] hash: replace existing hash library with cuckoo hash implementation Pablo de Lara
2015-07-12 22:29  3%           ` Thomas Monjalon
2015-07-13 16:11  3%             ` Bruce Richardson
2015-07-13 16:14  0%               ` Bruce Richardson
2015-07-13 16:20  0%                 ` Thomas Monjalon
2015-07-13 16:26  0%                   ` Bruce Richardson
2015-07-11  0:18 14%         ` [dpdk-dev] [PATCH v7 6/7] doc: announce ABI change of librte_hash Pablo de Lara
2015-07-12 22:38  8%           ` Thomas Monjalon
2015-07-12 22:46  0%         ` [dpdk-dev] [PATCH v7 0/7] Cuckoo hash - part 3 of Cuckoo hash Thomas Monjalon
2015-07-02 22:05     [dpdk-dev] [PATCH] mk: enable next abi in static libs Thomas Monjalon
2015-07-06 21:44     ` Thomas Monjalon
2015-07-07 11:14       ` Neil Horman
2015-07-07 12:46         ` Thomas Monjalon
2015-07-07 13:44           ` Neil Horman
2015-07-10 16:07             ` Mcnamara, John
2015-07-11 14:19  7%           ` Neil Horman
2015-07-13 10:14  8%             ` Mcnamara, John
2015-07-03  8:32     [dpdk-dev] [PATCH v9 00/19] unified packet type Helin Zhang
2015-07-09 16:31     ` [dpdk-dev] [PATCH v10 " Helin Zhang
2015-07-09 16:31       ` [dpdk-dev] [PATCH v10 01/19] mbuf: redefine packet_type in rte_mbuf Helin Zhang
2015-07-13 15:53  0%     ` Thomas Monjalon
2015-07-09 16:31       ` [dpdk-dev] [PATCH v10 02/19] mbuf: add definitions of unified packet types Helin Zhang
2015-07-15 10:19  0%     ` Olivier MATZ
2015-07-15 23:00  0%   ` [dpdk-dev] [PATCH v10 00/19] unified packet type Thomas Monjalon
2015-07-15 23:51  0%     ` Zhang, Helin
2015-07-03  8:49     [dpdk-dev] [PATCH v2] doc: announce ABI changes planned for " Helin Zhang
2015-07-07 17:45     ` [dpdk-dev] [PATCH v3] " Helin Zhang
2015-07-09  0:56       ` Wu, Jingjing
2015-07-15 23:37  4%     ` Thomas Monjalon
2015-07-03  9:55     [dpdk-dev] [PATCH v7 0/9] Dynamic memzones Sergio Gonzalez Monroy
2015-07-14  8:57  4% ` [dpdk-dev] [PATCH v8 " Sergio Gonzalez Monroy
2015-07-14  8:57  1%   ` [dpdk-dev] [PATCH v8 2/9] eal: memzone allocated by malloc Sergio Gonzalez Monroy
2015-07-14  8:57 19%   ` [dpdk-dev] [PATCH v8 8/9] doc: announce ABI change of librte_malloc Sergio Gonzalez Monroy
2015-07-15  8:26  4%   ` [dpdk-dev] [PATCH v9 0/9] Dynamic memzones Sergio Gonzalez Monroy
2015-07-15  8:26  1%     ` [dpdk-dev] [PATCH v9 2/9] eal: memzone allocated by malloc Sergio Gonzalez Monroy
2015-07-15  8:26 19%     ` [dpdk-dev] [PATCH v9 8/9] doc: announce ABI change of librte_malloc Sergio Gonzalez Monroy
2015-07-15 16:32  3%     ` [dpdk-dev] [PATCH v10 0/9] Dynamic memzones Sergio Gonzalez Monroy
2015-07-15 16:32  1%       ` [dpdk-dev] [PATCH v10 2/9] eal: memzone allocated by malloc Sergio Gonzalez Monroy
2015-07-15 16:32 19%       ` [dpdk-dev] [PATCH v10 8/9] doc: announce ABI change of librte_malloc Sergio Gonzalez Monroy
2015-07-07  7:58     [dpdk-dev] [PATCH 0/3] fix the issue sctp flow cannot be matched in FVL FDIR Jingjing Wu
2015-07-07  9:04     ` Liu, Yong
2015-07-19 22:54  3%   ` Thomas Monjalon
2015-07-08  1:24     [dpdk-dev] [PATCH] config: revert the CONFIG_RTE_MAX_QUEUES_PER_PORT to 256 Jijiang Liu
2015-07-10 21:58  0% ` Thomas Monjalon
2015-07-08  2:08     [dpdk-dev] [PATCH] doc:announce ABI changes planned for struct rte_eth_dev to support up to 1024 queues per port Jijiang Liu
2015-07-08 11:07     ` Neil Horman
2015-07-10 22:14  4%   ` Thomas Monjalon
2015-07-08 14:55     [dpdk-dev] [PATCH v2 2/2] mk: enable next abi preview Thomas Monjalon
2015-07-08 16:44     ` [dpdk-dev] [PATCH v3] " Thomas Monjalon
2015-07-13  7:32  7%   ` Mcnamara, John
2015-07-13  8:48  7%     ` Thomas Monjalon
2015-07-13  9:02  8%       ` [dpdk-dev] [PATCH] mk: fix shared lib build with stable abi Thomas Monjalon
2015-07-13  9:24  4%         ` Mcnamara, John
2015-07-13  9:32  7%           ` Thomas Monjalon
2015-07-09  2:47     [dpdk-dev] [PATCH] doc: announce ABI change of rte_fdir_filter, rte_fdir_masks Wenzhuo Lu
2015-07-10  2:24     ` [dpdk-dev] [PATCH v2] doc: announce ABI change of rte_eth_fdir_filter, rte_eth_fdir_masks Wenzhuo Lu
2015-08-04  8:54  7%   ` Mcnamara, John
2015-08-04  8:56  4%   ` Mcnamara, John
2015-08-12 14:19  4%     ` Thomas Monjalon
2015-07-13 10:26  7% [dpdk-dev] [PATCH] ethdev: fix ABI breakage in lro code John McNamara
2015-07-13 10:42  7% ` Neil Horman
2015-07-13 10:46  4%   ` Thomas Monjalon
2015-07-13 10:47  4%   ` Mcnamara, John
2015-07-13 13:59  4%     ` Neil Horman
2015-07-17 11:45  7%       ` Mcnamara, John
2015-07-17 12:25  4%         ` Neil Horman
2015-07-31  9:03  7%       ` Mcnamara, John
2015-07-31 10:34  4%         ` Neil Horman
2015-08-03  2:39  7%           ` Chao Zhu
2015-08-03  3:45  4%             ` Chao Zhu
2015-08-03  8:41  8%               ` Thomas Monjalon
2015-08-03 12:53  7%                 ` Neil Horman
2015-07-16 22:22  4% ` Vlad Zolotarov
2015-08-02 21:06  7%   ` Thomas Monjalon
2015-07-13 14:17  3% [dpdk-dev] [PATCH v5 0/9] Expose IXGBE extended stats to DPDK apps Maryam Tahhan
2015-07-13 14:17  9% ` [dpdk-dev] [PATCH v5 4/9] ethdev: remove HW specific stats in stats structs Maryam Tahhan
2015-07-13 16:25  3% [dpdk-dev] [PATCH] hash: rename unused field to "reserved" Bruce Richardson
2015-07-13 16:28  0% ` Bruce Richardson
2015-07-13 16:38  3% ` [dpdk-dev] [PATCH v2] " Bruce Richardson
2015-07-13 17:29  0%   ` Thomas Monjalon
2015-07-15  8:08  3%   ` Olga Shern
2015-07-15 13:11  3% [dpdk-dev] [PATCH v6 0/9] Expose IXGBE extended stats to DPDK apps Maryam Tahhan
2015-07-15 13:11  9% ` [dpdk-dev] [PATCH v6 4/9] ethdev: remove HW specific stats in stats structs Maryam Tahhan
2015-08-17 14:53  0%   ` Olivier MATZ
2015-08-19 12:53  0%     ` Tahhan, Maryam
2015-07-16  7:54  0% ` [dpdk-dev] [PATCH v6 0/9] Expose IXGBE extended stats to DPDK apps Olivier MATZ
2015-07-16 11:36 14% [dpdk-dev] [PATCH] doc: announce ABI change for librte_cfgfile Cristian Dumitrescu
2015-07-16 11:50  4% ` Gajdzica, MaciejX T
2015-07-16 12:28  4% ` Mrzyglod, DanielX T
2015-07-16 12:49  4% ` Singh, Jasvinder
2015-08-15  9:09  4%   ` Thomas Monjalon
2015-07-16 12:19 14% [dpdk-dev] [PATCH] doc: announce ABI change for librte_port Cristian Dumitrescu
2015-07-16 12:25  4% ` Gajdzica, MaciejX T
2015-07-16 12:25  4% ` Thomas Monjalon
2015-07-16 15:09  4%   ` Dumitrescu, Cristian
2015-07-16 12:30  4% ` Mrzyglod, DanielX T
2015-07-16 12:49  4% ` Singh, Jasvinder
2015-07-16 15:27 14% [dpdk-dev] [PATCH v2] " Cristian Dumitrescu
2015-07-16 15:51  4% ` Singh, Jasvinder
2015-07-17  7:56  4% ` Gajdzica, MaciejX T
2015-07-17  8:08  4% ` Mrzyglod, DanielX T
2015-07-16 16:59 14% [dpdk-dev] [PATCH] doc: announce ABI change for librte_table Cristian Dumitrescu
2015-07-17  7:54  4% ` Gajdzica, MaciejX T
2015-07-17  8:09  4% ` Mrzyglod, DanielX T
2015-07-17 12:02  4% ` Singh, Jasvinder
2015-07-16 17:07 14% [dpdk-dev] [PATCH] doc: announce ABI change for librte_pipeline Cristian Dumitrescu
2015-07-17  7:54  4% ` Gajdzica, MaciejX T
2015-07-17  8:10  4% ` Mrzyglod, DanielX T
2015-07-17 12:03  4% ` Singh, Jasvinder
2015-08-15 21:49  4%   ` Thomas Monjalon
2015-07-16 21:21 14% [dpdk-dev] [PATCH] doc: announce ABI change for librte_sched Stephen Hemminger
2015-07-16 21:25  4% ` Dumitrescu, Cristian
2015-07-16 21:28  4% ` Neil Horman
2015-08-15  8:58  4%   ` Thomas Monjalon
2015-07-23 10:18  4% ` Dumitrescu, Cristian
2015-07-16 21:34     [dpdk-dev] [PATCH v5 0/4] rte_sched: cleanup and deprecation Stephen Hemminger
2015-07-16 21:34  3% ` [dpdk-dev] [PATCH v5 4/4] rte_sched: hide structure of port hierarchy Stephen Hemminger
2015-07-19 10:52  4% [dpdk-dev] [PATCH 0/4] ethdev/eal API fixes Thomas Monjalon
2015-07-19 10:52 36% ` [dpdk-dev] [PATCH 1/4] doc: rename ABI chapter to deprecation Thomas Monjalon
2015-07-21 13:20  7%   ` Dumitrescu, Cristian
2015-07-21 14:03  7%     ` Thomas Monjalon
2015-07-19 21:32  0% ` [dpdk-dev] [PATCH 0/4] ethdev/eal API fixes Thomas Monjalon
2015-07-20 10:45  0% ` Neil Horman
2015-07-20  7:03 13% [dpdk-dev] [PATCH] doc: announce ABI change for rte_eth_fdir_filter Jingjing Wu
2015-07-28  8:22  4% ` Lu, Wenzhuo
2015-07-30  3:38  4% ` Liang, Cunming
2015-08-04  8:52  4% ` Mcnamara, John
2015-08-12 10:38  4%   ` Thomas Monjalon
2015-08-04  8:53  4% ` Mcnamara, John
2015-07-20 12:19     [dpdk-dev] [PATCHv3 0/5] ethdev: add new API to retrieve RX/TX queue information Konstantin Ananyev
2015-07-20 12:19  2% ` [dpdk-dev] [PATCHv3 1/5] " Konstantin Ananyev
2015-07-22 16:50  0%   ` Zhang, Helin
2015-07-22 17:00  0%     ` Ananyev, Konstantin
2015-07-22 18:28  2%   ` [dpdk-dev] [PATCHv4 " Konstantin Ananyev
2015-07-22 19:48  0%     ` Stephen Hemminger
2015-07-23 10:52  0%       ` Ananyev, Konstantin
2015-07-23 16:26         ` Thomas Monjalon
2015-07-24  9:15  3%       ` Ananyev, Konstantin
2015-07-24  9:24  0%         ` Thomas Monjalon
2015-07-24 10:50  3%           ` Ananyev, Konstantin
2015-07-24 12:40  3%             ` Thomas Monjalon
2015-07-20 14:12     [dpdk-dev] [PATCH] examples: new example: l2fwd-ethtool Liang-Min Larry Wang
2015-07-23 15:00  4% ` [dpdk-dev] [PATCH v2 0/2] Example: l2fwd-ethtool Liang-Min Larry Wang
2015-07-23 15:00  4%   ` [dpdk-dev] [PATCH v2 1/2] Remove ABI requierment for external library builds Liang-Min Larry Wang
2015-07-21 14:10  3% [dpdk-dev] [PATCH] hash: move field hash_func_init_val in rte_hash struct Pablo de Lara
2015-07-22  9:08  0% ` Thomas Monjalon
2015-07-22 18:28     [dpdk-dev] [PATCHv4 0/5] ethdev: add new API to retrieve RX/TX queue information Konstantin Ananyev
2015-07-23 10:59  4% [dpdk-dev] [PATCH v2] announce ABI change for librte_table Cristian Dumitrescu
2015-07-23 11:05  4% ` Singh, Jasvinder
2015-08-15 21:48  4%   ` Thomas Monjalon
2015-07-23 11:07  4% ` Mrzyglod, DanielX T
2015-07-23 11:34  4% ` Gajdzica, MaciejX T
2015-07-27 22:55  4% [dpdk-dev] [dpdk-announce] release candidate 2.1.0-rc2 Thomas Monjalon
2015-07-28 15:47     [dpdk-dev] [PATCH 0/4] some fixes for bnx2x Thomas Monjalon
2015-07-28 15:47  3% ` [dpdk-dev] [PATCH 1/4] bnx2x: fix build as shared library Thomas Monjalon
2015-07-29 15:07     [dpdk-dev] Issue with non-scattered rx in ixgbe and i40e when mbuf private area size is odd Martin Weiser
2015-07-29 18:12     ` Ananyev, Konstantin
2015-07-29 20:24       ` Zhang, Helin
2015-07-30  8:12         ` Olivier MATZ
2015-07-30  9:00           ` Ananyev, Konstantin
2015-07-30  9:10             ` Olivier MATZ
2015-07-30  9:43  3%           ` Ananyev, Konstantin
2015-07-30 11:22  0%             ` Olivier MATZ
2015-07-30 13:47  0%               ` Thomas Monjalon
2015-07-30  9:25  7% [dpdk-dev] abi change announce Xie, Huawei
2015-07-30 10:18  4% ` Thomas Monjalon
2015-07-30 10:33  8%   ` Neil Horman
2015-08-03 22:47  4% [dpdk-dev] [dpdk-announce] release candidate 2.1.0-rc3 Thomas Monjalon
2015-08-11  2:12  7% [dpdk-dev] [PATCH] doc: announce ABI change for old flow director APIs removing Jingjing Wu
2015-08-11  3:01  4% ` Zhang, Helin
2015-08-12  9:02  4%   ` Thomas Monjalon
2015-08-11  5:41  4% ` Liu, Jijiang
2015-08-11 11:57  3% [dpdk-dev] [PATCH] doc: restructured release notes documentation John McNamara
2015-08-11 16:29  4% [dpdk-dev] [PATCH] doc: add missing API headers Thomas Monjalon
2015-08-11 22:58  4% [dpdk-dev] [PATCH] doc: simplify release notes cover Thomas Monjalon
2015-08-13 11:04     [dpdk-dev] [PATCH] doc: updated release notes for r2.1 John McNamara
2015-08-13 11:04  5% ` John McNamara
2015-08-17 14:39  4% [dpdk-dev] [PATCH 1/2] doc: announce removal of jhash2 function Thomas Monjalon
2015-08-17 14:39  4% ` [dpdk-dev] [PATCH 2/2] doc: announce removal of LPM memory location Thomas Monjalon
2015-08-19 20:46  2% [dpdk-dev] [PATCH v2] Move common functions in eal_thread.c Ravi Kerur
2015-09-01 20:18     [dpdk-dev] [PATCH 0/9] clean deprecated code Thomas Monjalon
2015-09-01 21:30  5% ` [dpdk-dev] [PATCH 1/9] ethdev: remove Rx interrupt switch Thomas Monjalon
2015-09-01 21:30  2% ` [dpdk-dev] [PATCH 2/9] mbuf: remove packet type from offload flags Thomas Monjalon
2015-09-01 21:30 11% ` [dpdk-dev] [PATCH 3/9] ethdev: remove SCTP flow entries switch Thomas Monjalon
2015-09-01 21:31  4% ` [dpdk-dev] [PATCH 9/9] ring: remove deprecated functions Thomas Monjalon
2015-09-02 13:16  3% ` [dpdk-dev] [PATCH v2 00/10] clean deprecated code Thomas Monjalon
2015-09-02 13:16  5%   ` [dpdk-dev] [PATCH v2 01/10] doc: init next release notes Thomas Monjalon
2015-09-02 13:16  7%   ` [dpdk-dev] [PATCH v2 02/10] ethdev: remove Rx interrupt switch Thomas Monjalon
2015-09-02 13:16  4%   ` [dpdk-dev] [PATCH v2 03/10] mbuf: remove packet type from offload flags Thomas Monjalon
2015-09-02 13:16 15%   ` [dpdk-dev] [PATCH v2 04/10] ethdev: remove SCTP flow entries switch Thomas Monjalon
2015-09-02 13:16  4%   ` [dpdk-dev] [PATCH v2 05/10] eal: remove deprecated function Thomas Monjalon

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).