PMD for performance measurement
A message that is not in the archive (sent off-list or not yet received): [email protected]
From: Tetsuya Mukawa <mukawa-AlSX/UN32fvPDbFq/[email protected]>
Hi,
I want to measure throughputs like following cases.
- path connected by RING PMDs
- path connected by librte_vhost and virtio-net PMD
- path connected by MEMNIC PMDs
- .....
Is there anyone want to do same thing?
Anyway, I guess those throughputs may be too high for some devices like ixia. But it's a bit pain to write or fix applications just for measuring.
I guess a PMD like '/dev/null' and testpmd application will help. This patch set is RFC of a PMD like '/dev/null'.
Please see the first commit of this patch set.
Here is a my plan to use this PMD
+-------------------------------+
| testpmd1 |
+-------------+------+----------+
| Target PMD1 | | null PMD |
+---++--------+ +----------+
||
|| Target path
||
+---++--------+ +----------+
| Target PMD2 | | null PMD |
+-------------+------+----------+
| testpmd2 |
+-------------------------------+The testpmd1 or testpmd2 will start with "start tx_first". It causes huge transfers.
The result is not thuroughput of PMD1 or PMD2, but throughput between PMD1 and PMD2. But I guess it's enough to know rough thuroughput. Also it's nice for measuing that the same environment can be used.
Any suggestions or comments?
Thanks,
Tetsuya
--
Tetsuya Mukawa (1):
librte_pmd_null: Add null PMD
config/common_bsdapp | 5 + config/common_linuxapp | 5 + lib/Makefile | 1 + lib/librte_pmd_null/Makefile | 58 +++++ lib/librte_pmd_null/rte_eth_null.c | 474 +++++++++++++++++++++++++++++++++++++ 5 files changed, 543 insertions(+) create mode 100644 lib/librte_pmd_null/Makefile create mode 100644 lib/librte_pmd_null/rte_eth_null.c
Signature · 1 line
1.9.1
A message that is not in the archive (sent off-list or not yet received): 1411129659-7132-1-git-send-email-mukawa-AlSX/UN32fvPDbFq/[email protected]
RFC 1/1 librte_pmd_null: Add null PMD
From: Tetsuya Mukawa <mukawa-AlSX/UN32fvPDbFq/[email protected]>
'null PMD' is a virtual device driver particulary designed to measure performance of DPDK applications and DPDK PMDs. When an application call rx, null PMD just allocate mbufs and return those. Also tx, the PMD just free mbufs.
The PMD has following options.
- size: specify packe size allocated by RX. Default packet size is 64.
- copy: specify 1 or 0 to enable or disable copy while RX and TX. Default value is 0(disbaled).
This option is used for emulating more realistic data transfer. Copy size is equal to packet size.
--- config/common_bsdapp | 5 + config/common_linuxapp | 5 + lib/Makefile | 1 + lib/librte_pmd_null/Makefile | 58 +++++ lib/librte_pmd_null/rte_eth_null.c | 474 +++++++++++++++++++++++++++++++++++++ 5 files changed, 543 insertions(+) create mode 100644 lib/librte_pmd_null/Makefile create mode 100644 lib/librte_pmd_null/rte_eth_null.c
config/common_bsdapp +5 -0
@@ -226,6 +226,11 @@ CONFIG_RTE_LIBRTE_PMD_PCAP=y CONFIG_RTE_LIBRTE_PMD_BOND=y # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=y
config/common_linuxapp +5 -0
@@ -254,6 +254,11 @@ CONFIG_RTE_LIBRTE_PMD_BOND=y CONFIG_RTE_LIBRTE_PMD_XENVIRT=n # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=y
lib/Makefile +1 -0
@@ -50,6 +50,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_PMD_PCAP) += librte_pmd_pcap DIRS-$(CONFIG_RTE_LIBRTE_VIRTIO_PMD) += librte_pmd_virtio DIRS-$(CONFIG_RTE_LIBRTE_VMXNET3_PMD) += librte_pmd_vmxnet3 DIRS-$(CONFIG_RTE_LIBRTE_PMD_XENVIRT) += librte_pmd_xenvirt +DIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += librte_pmd_null DIRS-$(CONFIG_RTE_LIBRTE_HASH) += librte_hash DIRS-$(CONFIG_RTE_LIBRTE_LPM) += librte_lpm DIRS-$(CONFIG_RTE_LIBRTE_ACL) += librte_acl
lib/librte_pmd_null/Makefile new file +58 -0
58 lines not on this page · raw message
lib/librte_pmd_null/rte_eth_null.c new file +474 -0
474 lines not on this page · raw message
Signature · 1 line
1.9.1
A message that is not in the archive (sent off-list or not yet received): 1411129659-7132-2-git-send-email-mukawa-AlSX/UN32fvPDbFq/[email protected]
Re: [RFC] librte_pmd_null: Add null PMD
Quoted 7 lines · On 09/19/2014 02:27 PM, mukawa-AlSX/UN32fvPDbFq/[email protected] wrote:
From: Tetsuya Mukawa <mukawa-AlSX/UN32fvPDbFq/[email protected]>
'null PMD' is a virtual device driver particulary designed to measure performance of DPDK applications and DPDK PMDs. When an application call rx, null PMD just allocate mbufs and return those. Also tx, the PMD just free mbufs.
Quoted 6 lines
The PMD has following options.
- size: specify packe size allocated by RX. Default packet size is 64.
- copy: specify 1 or 0 to enable or disable copy while RX and TX. Default value is 0(disbaled).
This option is used for emulating more realistic data transfer. Copy size is equal to packet size.
Hi Tetsuya,
This is a "nice to have" PMD.
Just a minor comment.
I guess it should be NTT instead of Intel in the following comment
"# * Neither the name of Intel Corporation nor the names of its".
Regards,
Ivan
Quoted 601 lines
--- config/common_bsdapp | 5 + config/common_linuxapp | 5 + lib/Makefile | 1 + lib/librte_pmd_null/Makefile | 58 +++++ lib/librte_pmd_null/rte_eth_null.c | 474 +++++++++++++++++++++++++++++++++++++ 5 files changed, 543 insertions(+)create mode 100644
lib/librte_pmd_null/Makefilecreate mode 100644lib/librte_pmd_null/rte_eth_null.cconfig/common_bsdapp +5
-0@@ -226,6 +226,11 @@ CONFIG_RTE_LIBRTE_PMD_PCAP=y CONFIG_RTE_LIBRTE_PMD_BOND=y # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=yconfig/common_linuxapp +5
-0@@ -254,6 +254,11 @@ CONFIG_RTE_LIBRTE_PMD_BOND=y CONFIG_RTE_LIBRTE_PMD_XENVIRT=n # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=ylib/Makefile +1
-0@@ -50,6 +50,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_PMD_PCAP) += librte_pmd_pcap DIRS-$(CONFIG_RTE_LIBRTE_VIRTIO_PMD) += librte_pmd_virtio DIRS-$(CONFIG_RTE_LIBRTE_VMXNET3_PMD) += librte_pmd_vmxnet3 DIRS-$(CONFIG_RTE_LIBRTE_PMD_XENVIRT) += librte_pmd_xenvirt +DIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += librte_pmd_null DIRS-$(CONFIG_RTE_LIBRTE_HASH) += librte_hash DIRS-$(CONFIG_RTE_LIBRTE_LPM) += librte_lpm DIRS-$(CONFIG_RTE_LIBRTE_ACL) += librte_acllib/librte_pmd_null/Makefile new file +58
-0@@ -0,0 +1,58 @@ +# BSD LICENSE +# +# Copyright (C) 2014 Nippon Telegraph and Telephone Corporation. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +include $(RTE_SDK)/mk/rte.vars.mk + +# +# library name +# +LIB = librte_pmd_null.a + +CFLAGS += -O3 +CFLAGS += $(WERROR_FLAGS) + +# +# all source are stored in SRCS-y +# +SRCS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += rte_eth_null.c + +# +# Export include files +# +SYMLINK-y-include += + +# this lib depends upon: +DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += lib/librte_mbuf +DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += lib/librte_ether +DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += lib/librte_malloc +DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += lib/librte_kvargs + +include $(RTE_SDK)/mk/rte.lib.mklib/librte_pmd_null/rte_eth_null.c new file +474
-0@@ -0,0 +1,474 @@ +/*- +* BSD LICENSE +* +* Copyright (C) 2014 Nippon Telegraph and Telephone Corporation. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in +* the documentation and/or other materials provided with the +* distribution. +* * Neither the name of Intel Corporation nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include <rte_mbuf.h> +#include <rte_ethdev.h> +#include <rte_malloc.h> +#include <rte_memcpy.h> +#include <rte_dev.h> +#include <rte_kvargs.h> + +#define ETH_NULL_PACKET_SIZE_ARG "size" +#define ETH_NULL_PACKET_COPY_ARG "copy" + +static unsigned default_packet_size =64 ; +static unsigned default_packet_copy; + +static const char const *valid_arguments[] = { +ETH_NULL_PACKET_SIZE_ARG , +ETH_NULL_PACKET_COPY_ARG , +NULL +}; + +struct pmd_internals ; + +struct null_queue { +struct pmd_internals *internals; + +struct rte_mempool *mb_pool; +struct rte_mbuf *dummy_packet; + +rte_atomic64_t rx_pkts; +rte_atomic64_t tx_pkts; +rte_atomic64_t err_pkts; +}; + +struct pmd_internals { +unsigned packet_size; +unsigned packet_copy; +unsigned numa_node; + +unsigned nb_rx_queues; +unsigned nb_tx_queues; + +struct null_queue rx_null_queues[1 ]; +struct null_queue tx_null_queues[1 ]; +}; + + +static struct ether_addr eth_addr = { .addr_bytes = {0 } }; +static const char *drivername ="Null PMD" ; +static struct rte_eth_link pmd_link = { + .link_speed =10000 , + .link_duplex =ETH_LINK_FULL_DUPLEX , + .link_status =0 +}; + +static uint16_t +eth_null_rx (void *q,struct rte_mbuf **bufs,uint16_t nb_bufs) +{ +int i; +struct null_queue *h = q; +unsigned packet_size = h->internals->packet_size; + +for (i =0 ; i < nb_bufs; i++) { + bufs[i] =rte_pktmbuf_alloc (h->mb_pool); +if (!bufs[i]) +break ; + bufs[i]->data_len = (uint16_t )packet_size; + bufs[i]->pkt_len = packet_size; + bufs[i]->nb_segs =1 ; + bufs[i]->next =NULL ; + } + +rte_atomic64_add (&(h->rx_pkts), i); + +return i; +} + +static uint16_t +eth_null_copy_rx (void *q,struct rte_mbuf **bufs,uint16_t nb_bufs) +{ +int i; +struct null_queue *h = q; +unsigned packet_size = h->internals->packet_size; + +for (i =0 ; i < nb_bufs; i++) { + bufs[i] =rte_pktmbuf_alloc (h->mb_pool); +if (!bufs[i]) +break ; + rte_memcpy(rte_pktmbuf_mtod(bufs[i], void *), h->dummy_packet, + packet_size); + bufs[i]->data_len = (uint16_t )packet_size; + bufs[i]->pkt_len = packet_size; + bufs[i]->nb_segs =1 ; + bufs[i]->next =NULL ; + } + +rte_atomic64_add (&(h->rx_pkts), i); + +return i; +} + +static uint16_t +eth_null_tx(void *q, struct rte_mbuf **bufs __rte_unused, uint16_t nb_bufs) +{ +int i; +struct null_queue *h = q; + +for (i =0 ; i < nb_bufs; i++) +rte_pktmbuf_free (bufs[i]); + +rte_atomic64_add (&(h->tx_pkts), i); + +return i; +} + +static uint16_t +eth_null_copy_tx (void *q,struct rte_mbuf **bufs,uint16_t nb_bufs) +{ +int i; +struct null_queue *h = q; +unsigned packet_size = h->internals->packet_size; + +for (i =0 ; i < nb_bufs; i++) { + rte_memcpy(h->dummy_packet, rte_pktmbuf_mtod(bufs[i], void *), + packet_size); +rte_pktmbuf_free (bufs[i]); + } + +rte_atomic64_add (&(h->tx_pkts), i); + +return i; +} + +static int +eth_dev_configure(struct rte_eth_dev *dev __rte_unused) { return 0; } + +static int +eth_dev_start (struct rte_eth_dev *dev) +{ + dev->data->dev_link.link_status =1 ; +return 0 ; +} + +static void +eth_dev_stop (struct rte_eth_dev *dev) +{ + dev->data->dev_link.link_status =0 ; +} + +static int +eth_rx_queue_setup (struct rte_eth_dev *dev,uint16_t rx_queue_id, + uint16_t nb_rx_desc __rte_unused, + unsigned int socket_id __rte_unused, + const struct rte_eth_rxconf *rx_conf __rte_unused, + struct rte_mempool *mb_pool __rte_unused) +{ +struct rte_mbuf *dummy_packet; +struct pmd_internals *internals = dev->data->dev_private; +unsigned packet_size = internals->packet_size; + +if (rx_queue_id !=0 ) +return -ENODEV ; + + internals->rx_null_queues[rx_queue_id].mb_pool = mb_pool; + dev->data->rx_queues[rx_queue_id] = + &internals->rx_null_queues[rx_queue_id]; + dummy_packet =rte_zmalloc_socket (NULL , + packet_size,0 , internals->numa_node); +if (dummy_packet ==NULL ) +return -ENOMEM ; + + internals->rx_null_queues[rx_queue_id].internals = internals; + internals->rx_null_queues[rx_queue_id].dummy_packet = dummy_packet; + +return 0 ; +} + +static int +eth_tx_queue_setup (struct rte_eth_dev *dev,uint16_t tx_queue_id, + uint16_t nb_tx_desc __rte_unused, + unsigned int socket_id __rte_unused, + const struct rte_eth_txconf *tx_conf __rte_unused) +{ +struct rte_mbuf *dummy_packet; +struct pmd_internals *internals = dev->data->dev_private; +unsigned packet_size = internals->packet_size; + +if (tx_queue_id !=0 ) +return -ENODEV ; + + dev->data->tx_queues[tx_queue_id] = + &internals->tx_null_queues[tx_queue_id]; + dummy_packet =rte_zmalloc_socket (NULL , + packet_size,0 , internals->numa_node); +if (dummy_packet ==NULL ) +return -ENOMEM ; + + internals->tx_null_queues[tx_queue_id].internals = internals; + internals->tx_null_queues[tx_queue_id].dummy_packet = dummy_packet; + +return 0 ; +} + + +static void +eth_dev_info (struct rte_eth_dev *dev, +struct rte_eth_dev_info *dev_info) +{ +struct pmd_internals *internals = dev->data->dev_private; + + dev_info->driver_name = drivername; + dev_info->max_mac_addrs =1 ; + dev_info->max_rx_pktlen = (uint32_t )-1 ; + dev_info->max_rx_queues = (uint16_t )internals->nb_rx_queues; + dev_info->max_tx_queues = (uint16_t )internals->nb_tx_queues; + dev_info->min_rx_bufsize =0 ; + dev_info->pci_dev =NULL ; +} + +static void +eth_stats_get (struct rte_eth_dev *dev,struct rte_eth_stats *igb_stats) +{ +unsigned i; +unsigned long rx_total =0 , tx_total =0 , tx_err_total =0 ; +const struct pmd_internals *internal = dev->data->dev_private; + +memset (igb_stats,0 ,sizeof (*igb_stats)); +for (i =0 ; i <RTE_ETHDEV_QUEUE_STAT_CNTRS && + i < internal->nb_rx_queues; i++) { + igb_stats->q_ipackets[i] = + internal->rx_null_queues[i].rx_pkts.cnt; + rx_total += igb_stats->q_ipackets[i]; + } + +for (i =0 ; i <RTE_ETHDEV_QUEUE_STAT_CNTRS && + i < internal->nb_tx_queues; i++) { + igb_stats->q_opackets[i] = + internal->tx_null_queues[i].tx_pkts.cnt; + igb_stats->q_errors[i] = + internal->tx_null_queues[i].err_pkts.cnt; + tx_total += igb_stats->q_opackets[i]; + tx_err_total += igb_stats->q_errors[i]; + } + + igb_stats->ipackets = rx_total; + igb_stats->opackets = tx_total; + igb_stats->oerrors = tx_err_total; +} + +static void +eth_stats_reset (struct rte_eth_dev *dev) +{ +unsigned i; +struct pmd_internals *internal = dev->data->dev_private; + +for (i =0 ; i < internal->nb_rx_queues; i++) + internal->rx_null_queues[i].rx_pkts.cnt =0 ; +for (i =0 ; i < internal->nb_tx_queues; i++) { + internal->tx_null_queues[i].tx_pkts.cnt =0 ; + internal->tx_null_queues[i].err_pkts.cnt =0 ; + } +} + +static void +eth_queue_release(void *q __rte_unused) { ; } +static int +eth_link_update(struct rte_eth_dev *dev __rte_unused, + int wait_to_complete __rte_unused) { return 0; } + +static struct eth_dev_ops ops = { + .dev_start = eth_dev_start, + .dev_stop = eth_dev_stop, + .dev_configure = eth_dev_configure, + .dev_infos_get = eth_dev_info, + .rx_queue_setup = eth_rx_queue_setup, + .tx_queue_setup = eth_tx_queue_setup, + .rx_queue_release = eth_queue_release, + .tx_queue_release = eth_queue_release, + .link_update = eth_link_update, + .stats_get = eth_stats_get, + .stats_reset = eth_stats_reset, +}; + +static int +eth_dev_null_create(const char *name __rte_unused, +const unsigned numa_node, +unsigned packet_size, +unsigned packet_copy) +{ +const unsigned nb_rx_queues =1 ; +const unsigned nb_tx_queues =1 ; +struct rte_eth_dev_data *data =NULL ; +struct rte_pci_device *pci_dev =NULL ; +struct pmd_internals *internals =NULL ; +struct rte_eth_dev *eth_dev =NULL ; + +RTE_LOG (INFO ,PMD ,"Creating null ethdev on numa socket %u\n" , + numa_node); + +/* now do all data allocation - for eth_dev structure, dummy pci driver +* and internal (private) data +*/ + data =rte_zmalloc_socket (name,sizeof (*data),0 , numa_node); +if (data ==NULL ) + goto error; + + pci_dev =rte_zmalloc_socket (name,sizeof (*pci_dev),0 , numa_node); +if (pci_dev ==NULL ) + goto error; + + internals =rte_zmalloc_socket (name,sizeof (*internals),0 , numa_node); +if (internals ==NULL ) + goto error; + +/* reserve an ethdev entry */ + eth_dev =rte_eth_dev_allocate (name); +if (eth_dev ==NULL ) + goto error; + +/* now put it all together +* - store queue data in internals, +* - store numa_node info in pci_driver +* - point eth_dev_data to internals and pci_driver +* - and point eth_dev structure to new eth_dev_data structure +*/ +/* NOTE: we'll replace the data element, of originally allocated eth_dev +* so the nulls are local per-process */ + + internals->nb_rx_queues = nb_rx_queues; + internals->nb_tx_queues = nb_tx_queues; + internals->packet_size = packet_size; + internals->packet_copy = packet_copy; + internals->numa_node = numa_node; + + pci_dev->numa_node = numa_node; + + data->dev_private = internals; + data->port_id = eth_dev->data->port_id; + data->nb_rx_queues = (uint16_t )nb_rx_queues; + data->nb_tx_queues = (uint16_t )nb_tx_queues; + data->dev_link = pmd_link; + data->mac_addrs = ð_addr; + + eth_dev->data = data; + eth_dev->dev_ops = &ops; + eth_dev->pci_dev = pci_dev; + +/* finally assign rx and tx ops */ +if (packet_copy) { + eth_dev->rx_pkt_burst = eth_null_copy_rx; + eth_dev->tx_pkt_burst = eth_null_copy_tx; + }else { + eth_dev->rx_pkt_burst = eth_null_rx; + eth_dev->tx_pkt_burst = eth_null_tx; + } + +return 0 ; + +error: +if (data) +rte_free (data); +if (pci_dev) +rte_free (pci_dev); +if (internals) +rte_free (internals); +return -1 ; +} + +static inline int +get_packet_size_arg(const char *key __rte_unused, +const char *value,void *extra_args) +{ +const char *a = value; +unsigned *packet_size = extra_args; + + *packet_size = (unsigned )strtoul (a,NULL ,0 ); +if (*packet_size ==UINT_MAX ) +return -1 ; + +return 0 ; +} + +static inline int +get_packet_copy_arg(const char *key __rte_unused, +const char *value,void *extra_args) +{ +const char *a = value; +unsigned *packet_copy = extra_args; + + *packet_copy = (unsigned )strtoul (a,NULL ,0 ); +if (*packet_copy ==UINT_MAX ) +return -1 ; + +return 0 ; +} + +static int +rte_pmd_null_devinit (const char *name,const char *params) +{ +unsigned numa_node; +unsigned packet_size = default_packet_size; +unsigned packet_copy = default_packet_copy; +struct rte_kvargs *kvlist; +int ret; + +RTE_LOG (INFO ,PMD ,"Initializing pmd_null for %s\n" , name); + + numa_node =rte_socket_id (); + + kvlist =rte_kvargs_parse (params, valid_arguments); +if (kvlist ==NULL ) +return -1 ; + +if (rte_kvargs_count (kvlist,ETH_NULL_PACKET_SIZE_ARG ) ==1 ) { + + ret =rte_kvargs_process (kvlist,ETH_NULL_PACKET_SIZE_ARG , + &get_packet_size_arg, &packet_size); +if (ret <0 ) +return -1 ; + } + +if (rte_kvargs_count (kvlist,ETH_NULL_PACKET_COPY_ARG ) ==1 ) { + + ret =rte_kvargs_process (kvlist,ETH_NULL_PACKET_COPY_ARG , + &get_packet_copy_arg, &packet_copy); +if (ret <0 ) +return -1 ; + } + +RTE_LOG (INFO ,PMD ,"Configure pmd_null: packet size is %d, " +"packet copy is %s\n" , packet_size, + packet_copy ?"enabled" :"disabled" ); + +return eth_dev_null_create (name, numa_node, packet_size, packet_copy); +} + +static struct rte_driver pmd_null_drv = { + .name ="eth_null" , + .type =PMD_VDEV , + .init = rte_pmd_null_devinit, +}; + +PMD_REGISTER_DRIVER (pmd_null_drv);
Signature · 2 lines
Ivan Boule 6WIND Development Engineer
A message that is not in the archive (sent off-list or not yet received): [email protected]
Re: [RFC] librte_pmd_null: Add null PMD
Hi Ivan
Quoted 7 lines · Ivan Boule
This is a "nice to have" PMD.
Just a minor comment.
I guess it should be NTT instead of Intel in the following comment
"# * Neither the name of Intel Corporation nor the names of its".
I appreciate your comment. I will rewrite and post it again.
Regards,
Tetsuya
Quoted 633 lines
Regards,
IvanQuoted 628 lines
--- config/common_bsdapp | 5 + config/common_linuxapp | 5 + lib/Makefile | 1 + lib/librte_pmd_null/Makefile | 58 +++++ lib/librte_pmd_null/rte_eth_null.c | 474 +++++++++++++++++++++++++++++++++++++ 5 files changed, 543 insertions(+)create mode 100644
lib/librte_pmd_null/Makefilecreate mode 100644lib/librte_pmd_null/rte_eth_null.cconfig/common_bsdapp +5
-0@@ -226,6 +226,11 @@ CONFIG_RTE_LIBRTE_PMD_PCAP=y CONFIG_RTE_LIBRTE_PMD_BOND=y # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=yconfig/common_linuxapp +5
-0@@ -254,6 +254,11 @@ CONFIG_RTE_LIBRTE_PMD_BOND=y CONFIG_RTE_LIBRTE_PMD_XENVIRT=n # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=ylib/Makefile +1
-0@@ -50,6 +50,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_PMD_PCAP) += librte_pmd_pcap DIRS-$(CONFIG_RTE_LIBRTE_VIRTIO_PMD) += librte_pmd_virtio DIRS-$(CONFIG_RTE_LIBRTE_VMXNET3_PMD) += librte_pmd_vmxnet3 DIRS-$(CONFIG_RTE_LIBRTE_PMD_XENVIRT) += librte_pmd_xenvirt +DIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += librte_pmd_null DIRS-$(CONFIG_RTE_LIBRTE_HASH) += librte_hash DIRS-$(CONFIG_RTE_LIBRTE_LPM) += librte_lpm DIRS-$(CONFIG_RTE_LIBRTE_ACL) += librte_acllib/librte_pmd_null/Makefile new file +12
-0@@ -0,0 +1,58 @@ +# BSD LICENSE +# +# Copyright (C) 2014 Nippon Telegraph and Telephone Corporation. +# 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 abovecopyright
lib/librte_pmd_null/Makefile new file +10
-0+# 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 ANDFITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL,lib/librte_pmd_null/Makefile new file +2
-0+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OFUSE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANYlib/librte_pmd_null/Makefile new file +2
-0+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OFTHE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.lib/librte_pmd_null/Makefile new file +28
-0+ +include $(RTE_SDK)/mk/rte.vars.mk + +# +# library name +# +LIB = librte_pmd_null.a + +CFLAGS += -O3 +CFLAGS += $(WERROR_FLAGS) + +# +# all source are stored in SRCS-y +# +SRCS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += rte_eth_null.c + +# +# Export include files +# +SYMLINK-y-include += + +# this lib depends upon: +DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += lib/librte_mbuf +DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += lib/librte_ether +DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += lib/librte_malloc +DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += lib/librte_kvargs + +include $(RTE_SDK)/mk/rte.lib.mklib/librte_pmd_null/rte_eth_null.c new file +13
-0@@ -0,0 +1,474 @@ +/*- +* BSD LICENSE +* +* Copyright (C) 2014 Nippon Telegraph and Telephone Corporation. +* 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.
+ */lib/librte_pmd_null/rte_eth_null.c new file +102
-0+ +#include <rte_mbuf.h> +#include <rte_ethdev.h> +#include <rte_malloc.h> +#include <rte_memcpy.h> +#include <rte_dev.h> +#include <rte_kvargs.h> + +#define ETH_NULL_PACKET_SIZE_ARG "size" +#define ETH_NULL_PACKET_COPY_ARG "copy" + +static unsigned default_packet_size =64 ; +static unsigned default_packet_copy; + +static const char const *valid_arguments[] = { +ETH_NULL_PACKET_SIZE_ARG , +ETH_NULL_PACKET_COPY_ARG , +NULL +}; + +struct pmd_internals ; + +struct null_queue { +struct pmd_internals *internals; + +struct rte_mempool *mb_pool; +struct rte_mbuf *dummy_packet; + +rte_atomic64_t rx_pkts; +rte_atomic64_t tx_pkts; +rte_atomic64_t err_pkts; +}; + +struct pmd_internals { +unsigned packet_size; +unsigned packet_copy; +unsigned numa_node; + +unsigned nb_rx_queues; +unsigned nb_tx_queues; + +struct null_queue rx_null_queues[1 ]; +struct null_queue tx_null_queues[1 ]; +}; + + +static struct ether_addr eth_addr = { .addr_bytes = {0 } }; +static const char *drivername ="Null PMD" ; +static struct rte_eth_link pmd_link = { + .link_speed =10000 , + .link_duplex =ETH_LINK_FULL_DUPLEX , + .link_status =0 +}; + +static uint16_t +eth_null_rx (void *q,struct rte_mbuf **bufs,uint16_t nb_bufs) +{ +int i; +struct null_queue *h = q; +unsigned packet_size = h->internals->packet_size; + +for (i =0 ; i < nb_bufs; i++) { + bufs[i] =rte_pktmbuf_alloc (h->mb_pool); +if (!bufs[i]) +break ; + bufs[i]->data_len = (uint16_t )packet_size; + bufs[i]->pkt_len = packet_size; + bufs[i]->nb_segs =1 ; + bufs[i]->next =NULL ; + } + +rte_atomic64_add (&(h->rx_pkts), i); + +return i; +} + +static uint16_t +eth_null_copy_rx (void *q,struct rte_mbuf **bufs,uint16_t nb_bufs) +{ +int i; +struct null_queue *h = q; +unsigned packet_size = h->internals->packet_size; + +for (i =0 ; i < nb_bufs; i++) { + bufs[i] =rte_pktmbuf_alloc (h->mb_pool); +if (!bufs[i]) +break ; + rte_memcpy(rte_pktmbuf_mtod(bufs[i], void *), h->dummy_packet, + packet_size); + bufs[i]->data_len = (uint16_t )packet_size; + bufs[i]->pkt_len = packet_size; + bufs[i]->nb_segs =1 ; + bufs[i]->next =NULL ; + } + +rte_atomic64_add (&(h->rx_pkts), i); + +return i; +} + +static uint16_t +eth_null_tx(void *q, struct rte_mbuf **bufs __rte_unused, uint16_t
nb_bufs)lib/librte_pmd_null/rte_eth_null.c new file +197
-0+{ +int i; +struct null_queue *h = q; + +for (i =0 ; i < nb_bufs; i++) +rte_pktmbuf_free (bufs[i]); + +rte_atomic64_add (&(h->tx_pkts), i); + +return i; +} + +static uint16_t +eth_null_copy_tx (void *q,struct rte_mbuf **bufs,uint16_t nb_bufs) +{ +int i; +struct null_queue *h = q; +unsigned packet_size = h->internals->packet_size; + +for (i =0 ; i < nb_bufs; i++) { + rte_memcpy(h->dummy_packet, rte_pktmbuf_mtod(bufs[i], void *), + packet_size); +rte_pktmbuf_free (bufs[i]); + } + +rte_atomic64_add (&(h->tx_pkts), i); + +return i; +} + +static int +eth_dev_configure(struct rte_eth_dev *dev __rte_unused) { return 0; } + +static int +eth_dev_start (struct rte_eth_dev *dev) +{ + dev->data->dev_link.link_status =1 ; +return 0 ; +} + +static void +eth_dev_stop (struct rte_eth_dev *dev) +{ + dev->data->dev_link.link_status =0 ; +} + +static int +eth_rx_queue_setup (struct rte_eth_dev *dev,uint16_t rx_queue_id, + uint16_t nb_rx_desc __rte_unused, + unsigned int socket_id __rte_unused, + const struct rte_eth_rxconf *rx_conf __rte_unused, + struct rte_mempool *mb_pool __rte_unused) +{ +struct rte_mbuf *dummy_packet; +struct pmd_internals *internals = dev->data->dev_private; +unsigned packet_size = internals->packet_size; + +if (rx_queue_id !=0 ) +return -ENODEV ; + + internals->rx_null_queues[rx_queue_id].mb_pool = mb_pool; + dev->data->rx_queues[rx_queue_id] = + &internals->rx_null_queues[rx_queue_id]; + dummy_packet =rte_zmalloc_socket (NULL , + packet_size,0 , internals->numa_node); +if (dummy_packet ==NULL ) +return -ENOMEM ; + + internals->rx_null_queues[rx_queue_id].internals = internals; + internals->rx_null_queues[rx_queue_id].dummy_packet = dummy_packet; + +return 0 ; +} + +static int +eth_tx_queue_setup (struct rte_eth_dev *dev,uint16_t tx_queue_id, + uint16_t nb_tx_desc __rte_unused, + unsigned int socket_id __rte_unused, + const struct rte_eth_txconf *tx_conf __rte_unused) +{ +struct rte_mbuf *dummy_packet; +struct pmd_internals *internals = dev->data->dev_private; +unsigned packet_size = internals->packet_size; + +if (tx_queue_id !=0 ) +return -ENODEV ; + + dev->data->tx_queues[tx_queue_id] = + &internals->tx_null_queues[tx_queue_id]; + dummy_packet =rte_zmalloc_socket (NULL , + packet_size,0 , internals->numa_node); +if (dummy_packet ==NULL ) +return -ENOMEM ; + + internals->tx_null_queues[tx_queue_id].internals = internals; + internals->tx_null_queues[tx_queue_id].dummy_packet = dummy_packet; + +return 0 ; +} + + +static void +eth_dev_info (struct rte_eth_dev *dev, +struct rte_eth_dev_info *dev_info) +{ +struct pmd_internals *internals = dev->data->dev_private; + + dev_info->driver_name = drivername; + dev_info->max_mac_addrs =1 ; + dev_info->max_rx_pktlen = (uint32_t )-1 ; + dev_info->max_rx_queues = (uint16_t )internals->nb_rx_queues; + dev_info->max_tx_queues = (uint16_t )internals->nb_tx_queues; + dev_info->min_rx_bufsize =0 ; + dev_info->pci_dev =NULL ; +} + +static void +eth_stats_get (struct rte_eth_dev *dev,struct rte_eth_stats *igb_stats) +{ +unsigned i; +unsigned long rx_total =0 , tx_total =0 , tx_err_total =0 ; +const struct pmd_internals *internal = dev->data->dev_private; + +memset (igb_stats,0 ,sizeof (*igb_stats)); +for (i =0 ; i <RTE_ETHDEV_QUEUE_STAT_CNTRS && + i < internal->nb_rx_queues; i++) { + igb_stats->q_ipackets[i] = + internal->rx_null_queues[i].rx_pkts.cnt; + rx_total += igb_stats->q_ipackets[i]; + } + +for (i =0 ; i <RTE_ETHDEV_QUEUE_STAT_CNTRS && + i < internal->nb_tx_queues; i++) { + igb_stats->q_opackets[i] = + internal->tx_null_queues[i].tx_pkts.cnt; + igb_stats->q_errors[i] = + internal->tx_null_queues[i].err_pkts.cnt; + tx_total += igb_stats->q_opackets[i]; + tx_err_total += igb_stats->q_errors[i]; + } + + igb_stats->ipackets = rx_total; + igb_stats->opackets = tx_total; + igb_stats->oerrors = tx_err_total; +} + +static void +eth_stats_reset (struct rte_eth_dev *dev) +{ +unsigned i; +struct pmd_internals *internal = dev->data->dev_private; + +for (i =0 ; i < internal->nb_rx_queues; i++) + internal->rx_null_queues[i].rx_pkts.cnt =0 ; +for (i =0 ; i < internal->nb_tx_queues; i++) { + internal->tx_null_queues[i].tx_pkts.cnt =0 ; + internal->tx_null_queues[i].err_pkts.cnt =0 ; + } +} + +static void +eth_queue_release(void *q __rte_unused) { ; } +static int +eth_link_update(struct rte_eth_dev *dev __rte_unused, + int wait_to_complete __rte_unused) { return 0; } + +static struct eth_dev_ops ops = { + .dev_start = eth_dev_start, + .dev_stop = eth_dev_stop, + .dev_configure = eth_dev_configure, + .dev_infos_get = eth_dev_info, + .rx_queue_setup = eth_rx_queue_setup, + .tx_queue_setup = eth_tx_queue_setup, + .rx_queue_release = eth_queue_release, + .tx_queue_release = eth_queue_release, + .link_update = eth_link_update, + .stats_get = eth_stats_get, + .stats_reset = eth_stats_reset, +}; + +static int +eth_dev_null_create(const char *name __rte_unused, +const unsigned numa_node, +unsigned packet_size, +unsigned packet_copy) +{ +const unsigned nb_rx_queues =1 ; +const unsigned nb_tx_queues =1 ; +struct rte_eth_dev_data *data =NULL ; +struct rte_pci_device *pci_dev =NULL ; +struct pmd_internals *internals =NULL ; +struct rte_eth_dev *eth_dev =NULL ; + +RTE_LOG (INFO ,PMD ,"Creating null ethdev on numa socket %u\n" , + numa_node); + +/* now do all data allocation - for eth_dev structure, dummy pci driver
lib/librte_pmd_null/rte_eth_null.c new file +11
-0+* and internal (private) data +*/ + data =rte_zmalloc_socket (name,sizeof (*data),0 , numa_node); +if (data ==NULL ) + goto error; + + pci_dev =rte_zmalloc_socket (name,sizeof (*pci_dev),0 , numa_node); +if (pci_dev ==NULL ) + goto error; + + internals = rte_zmalloc_socket(name, sizeof(*internals), 0,
numa_node);lib/librte_pmd_null/rte_eth_null.c new file +15
-0+if (internals ==NULL ) + goto error; + +/* reserve an ethdev entry */ + eth_dev =rte_eth_dev_allocate (name); +if (eth_dev ==NULL ) + goto error; + +/* now put it all together +* - store queue data in internals, +* - store numa_node info in pci_driver +* - point eth_dev_data to internals and pci_driver +* - and point eth_dev structure to new eth_dev_data structure +*/ +/* NOTE: we'll replace the data element, of originally allocated
eth_devlib/librte_pmd_null/rte_eth_null.c new file +108
-0+* so the nulls are local per-process */ + + internals->nb_rx_queues = nb_rx_queues; + internals->nb_tx_queues = nb_tx_queues; + internals->packet_size = packet_size; + internals->packet_copy = packet_copy; + internals->numa_node = numa_node; + + pci_dev->numa_node = numa_node; + + data->dev_private = internals; + data->port_id = eth_dev->data->port_id; + data->nb_rx_queues = (uint16_t )nb_rx_queues; + data->nb_tx_queues = (uint16_t )nb_tx_queues; + data->dev_link = pmd_link; + data->mac_addrs = ð_addr; + + eth_dev->data = data; + eth_dev->dev_ops = &ops; + eth_dev->pci_dev = pci_dev; + +/* finally assign rx and tx ops */ +if (packet_copy) { + eth_dev->rx_pkt_burst = eth_null_copy_rx; + eth_dev->tx_pkt_burst = eth_null_copy_tx; + }else { + eth_dev->rx_pkt_burst = eth_null_rx; + eth_dev->tx_pkt_burst = eth_null_tx; + } + +return 0 ; + +error: +if (data) +rte_free (data); +if (pci_dev) +rte_free (pci_dev); +if (internals) +rte_free (internals); +return -1 ; +} + +static inline int +get_packet_size_arg(const char *key __rte_unused, +const char *value,void *extra_args) +{ +const char *a = value; +unsigned *packet_size = extra_args; + + *packet_size = (unsigned )strtoul (a,NULL ,0 ); +if (*packet_size ==UINT_MAX ) +return -1 ; + +return 0 ; +} + +static inline int +get_packet_copy_arg(const char *key __rte_unused, +const char *value,void *extra_args) +{ +const char *a = value; +unsigned *packet_copy = extra_args; + + *packet_copy = (unsigned )strtoul (a,NULL ,0 ); +if (*packet_copy ==UINT_MAX ) +return -1 ; + +return 0 ; +} + +static int +rte_pmd_null_devinit (const char *name,const char *params) +{ +unsigned numa_node; +unsigned packet_size = default_packet_size; +unsigned packet_copy = default_packet_copy; +struct rte_kvargs *kvlist; +int ret; + +RTE_LOG (INFO ,PMD ,"Initializing pmd_null for %s\n" , name); + + numa_node =rte_socket_id (); + + kvlist =rte_kvargs_parse (params, valid_arguments); +if (kvlist ==NULL ) +return -1 ; + +if (rte_kvargs_count (kvlist,ETH_NULL_PACKET_SIZE_ARG ) ==1 ) { + + ret =rte_kvargs_process (kvlist,ETH_NULL_PACKET_SIZE_ARG , + &get_packet_size_arg, &packet_size); +if (ret <0 ) +return -1 ; + } + +if (rte_kvargs_count (kvlist,ETH_NULL_PACKET_COPY_ARG ) ==1 ) { + + ret =rte_kvargs_process (kvlist,ETH_NULL_PACKET_COPY_ARG , + &get_packet_copy_arg, &packet_copy); +if (ret <0 ) +return -1 ; + } + +RTE_LOG (INFO ,PMD ,"Configure pmd_null: packet size is %d, " +"packet copy is %s\n" , packet_size, + packet_copy ?"enabled" :"disabled" ); + + return eth_dev_null_create(name, numa_node, packet_size,
packet_copy);lib/librte_pmd_null/rte_eth_null.c new file +9
-0+} + +static struct rte_driver pmd_null_drv = { + .name ="eth_null" , + .type =PMD_VDEV , + .init = rte_pmd_null_devinit, +}; + +PMD_REGISTER_DRIVER (pmd_null_drv);
cover PMD for performance measurement
In reply to a message not in the archiveFrom: Tetsuya Mukawa <mukawa-AlSX/UN32fvPDbFq/[email protected]>
Hi,
Here are patches to add the new PMD like '/dev/null'.
This PMD is a driver for virtual device. When an application call rx, it just allocates mbufs and returns those. Also tx, it just frees mbufs.
Main purpose of the PMD is measuring rough throughputs of a VDEV PMD. To measure rough throughputs between PMD1 and PMD2, prepare following environment.
+-------------------------------+
| testpmd1 |
+-------------+------+----------+
| Target PMD1 | | null PMD |
+---++--------+ +----------+
||
|| Target path
||
+---++--------+ +----------+
| Target PMD2 | | null PMD |
+-------------+------+----------+
| testpmd2 |
+-------------------------------+changes from RFC:
* change the copyright of this PMD.
* change commit logs.
Tetsuya Mukawa (2):
librte_pmd_null: Add null PMD
librte_pmd_null: Enable librte_pmd_null
config/common_bsdapp | 5 + config/common_linuxapp | 5 + lib/Makefile | 1 + lib/librte_pmd_null/Makefile | 58 +++++ lib/librte_pmd_null/rte_eth_null.c | 474 +++++++++++++++++++++++++++++++++++++ mk/rte.app.mk | 4 + 6 files changed, 547 insertions(+) create mode 100644 lib/librte_pmd_null/Makefile create mode 100644 lib/librte_pmd_null/rte_eth_null.c
Signature · 1 line
1.9.1
A message that is not in the archive (sent off-list or not yet received): 1412070970-5625-1-git-send-email-mukawa-AlSX/UN32fvPDbFq/[email protected]
PATCH 1/2 librte_pmd_null: Add null PMD
From: Tetsuya Mukawa <mukawa-AlSX/UN32fvPDbFq/[email protected]>
'null PMD' is a driver of the virtual device particulary designed to measure performance of DPDK PMDs. When an application call rx, null PMD just allocates mbufs and returns those. Also tx, the PMD just frees mbufs.
The PMD has following options.
- size: specify packe size allocated by RX. Default packet size is 64.
- copy: specify 1 or 0 to enable or disable copy while RX and TX. Default value is 0(disbaled).
This option is used for emulating more realistic data transfer. Copy size is equal to packet size.
--- config/common_bsdapp | 5 + config/common_linuxapp | 5 + lib/Makefile | 1 + lib/librte_pmd_null/Makefile | 58 +++++ lib/librte_pmd_null/rte_eth_null.c | 474 +++++++++++++++++++++++++++++++++++++ 5 files changed, 543 insertions(+) create mode 100644 lib/librte_pmd_null/Makefile create mode 100644 lib/librte_pmd_null/rte_eth_null.c
config/common_bsdapp +5 -0
@@ -224,6 +224,11 @@ CONFIG_RTE_LIBRTE_PMD_PCAP=y CONFIG_RTE_LIBRTE_PMD_BOND=y # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=y
config/common_linuxapp +5 -0
@@ -252,6 +252,11 @@ CONFIG_RTE_LIBRTE_PMD_BOND=y CONFIG_RTE_LIBRTE_PMD_XENVIRT=n # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=y
lib/Makefile +1 -0
@@ -50,6 +50,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_PMD_PCAP) += librte_pmd_pcap DIRS-$(CONFIG_RTE_LIBRTE_VIRTIO_PMD) += librte_pmd_virtio DIRS-$(CONFIG_RTE_LIBRTE_VMXNET3_PMD) += librte_pmd_vmxnet3 DIRS-$(CONFIG_RTE_LIBRTE_PMD_XENVIRT) += librte_pmd_xenvirt +DIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += librte_pmd_null DIRS-$(CONFIG_RTE_LIBRTE_HASH) += librte_hash DIRS-$(CONFIG_RTE_LIBRTE_LPM) += librte_lpm DIRS-$(CONFIG_RTE_LIBRTE_ACL) += librte_acl
lib/librte_pmd_null/Makefile new file +58 -0
58 lines not on this page · raw message
lib/librte_pmd_null/rte_eth_null.c new file +474 -0
474 lines not on this page · raw message
Signature · 1 line
1.9.1
A message that is not in the archive (sent off-list or not yet received): 1412070970-5625-2-git-send-email-mukawa-AlSX/UN32fvPDbFq/[email protected]
Re: [PATCH 1/2] librte_pmd_null: Add null PMD
2014-09-30 18:56, mukawa-AlSX/UN32fvPDbFq/[email protected]:
Quoted 9 lines
lib/librte_pmd_null/Makefile new file +6
-0@@ -0,0 +1,58 @@ +# BSD LICENSE +# +# Copyright (C) 2014 Nippon Telegraph and Telephone Corporation. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without
lib/librte_pmd_null/Makefile line 16
Quoted 10 lines
lib/librte_pmd_null/Makefile new file +10
-0+# 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
You probably mean NTT here?
Quoted 12 lines
lib/librte_pmd_null/rte_eth_null.c new file +9
-0@@ -0,0 +1,474 @@ +/*- +* BSD LICENSE +* +* Copyright (C) IGEL Co.,Ltd. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met:
lib/librte_pmd_null/rte_eth_null.c line 19
Quoted 10 lines
lib/librte_pmd_null/rte_eth_null.c new file +10
-0+* +* * 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 IGEL Co.,Ltd. nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission.
So the Makefile is copyrighted NTT and the .c file is copyrighted IGEL?
Signature · 1 line
Thomas
Re: [PATCH 1/2] librte_pmd_null: Add null PMD
Quoted 37 lines · Thomas Monjalon
2014-09-30 18:56, mukawa-AlSX/UN32fvPDbFq/[email protected]:
Quoted 9 lines
lib/librte_pmd_null/Makefile new file +6
-0@@ -0,0 +1,58 @@ +# BSD LICENSE +# +# Copyright (C) 2014 Nippon Telegraph and Telephone Corporation. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or withoutlib/librte_pmd_null/Makefile line 16
Quoted 10 lines
lib/librte_pmd_null/Makefile new file +10
-0+# 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 itsYou probably mean NTT here?
Quoted 15 lines
lib/librte_pmd_null/rte_eth_null.c new file +12
-0@@ -0,0 +1,474 @@ +/*- +* BSD LICENSE +* +* Copyright (C) IGEL Co.,Ltd. +* 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.
Quoted 9 lines
lib/librte_pmd_null/rte_eth_null.c line 19
Quoted 7 lines
lib/librte_pmd_null/rte_eth_null.c new file +7
-0+* * 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 IGEL Co.,Ltd. nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. So the
Makefileis copyrighted NTT and the .c file is copyrighted IGEL?
It's my mistake. I needed to change Makefile also.
I had a discussion about copyright with NTT guys, then changed it. Thank you for your attention. I will submit again.
Regards,
Tetsuya
PATCH 2/2 librte_pmd_null: Enable librte_pmd_null
In reply to a message not in the archiveFrom: Tetsuya Mukawa <mukawa-AlSX/UN32fvPDbFq/[email protected]>
--- mk/rte.app.mk | 4 ++++ 1 file changed, 4 insertions(+)
mk/rte.app.mk +4 -0
@@ -179,6 +179,10 @@ LDLIBS += -lrte_pmd_xenvirt LDLIBS += -lxenstore endif +ifeq ($(CONFIG_RTE_LIBRTE_PMD_NULL),y) +LDLIBS += -lrte_pmd_null +endif + ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),n) # plugins (link only if static libraries)
Signature · 1 line
1.9.1
A message that is not in the archive (sent off-list or not yet received): 1412070970-5625-3-git-send-email-mukawa-AlSX/UN32fvPDbFq/[email protected]
Re: [PATCH 2/2] librte_pmd_null: Enable librte_pmd_null
Quoted 12 lines · On Tue, Sep 30, 2014 at 06:56:10PM +0900…
From: Tetsuya Mukawa <mukawa-AlSX/UN32fvPDbFq/[email protected]>
--- mk/rte.app.mk | 4 ++++ 1 file changed, 4 insertions(+)mk/rte.app.mk +0
-0
mk/rte.app.mk LDLIBS += -lrte_pmd_xenvirt · line 185
Quoted 7 lines
mk/rte.app.mk +4
-0@@ -179,6 +179,10 @@ LDLIBS += -lrte_pmd_xenvirt LDLIBS += -lxenstore endif +ifeq ($(CONFIG_RTE_LIBRTE_PMD_NULL),y) +LDLIBS += -lrte_pmd_null +endif +
You don't need to add this, as the pmd can be loaded dynamically via the dlopen call executed via the -d option on the test app command line. The only pmds that need explicit linking are those that offer additional API calls to an appilcation.
Neil
Quoted 7 lines
mk/rte.app.mk +0
-0ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),n) # plugins (link only if static libraries)Signature · 1 line
1.9.1
A message that is not in the archive (sent off-list or not yet received): 20140930112353.GA2193-B26myB8xz7F8NnZeBjwnZQMhkBWG/[email protected]
Re: [PATCH 2/2] librte_pmd_null: Enable librte_pmd_null
Quoted 16 lines · Neil Horman
Quoted 15 lines · On Tue, Sep 30, 2014 at 06:56:10PM +0900…
From: Tetsuya Mukawa <mukawa-AlSX/UN32fvPDbFq/[email protected]>
--- mk/rte.app.mk | 4 ++++ 1 file changed, 4 insertions(+)mk/rte.app.mk +0
-0@@ -179,6 +179,10 @@ LDLIBS += -lrte_pmd_xenvirt LDLIBS += -lxenstore endif
Quoted 8 lines
mk/rte.app.mk LDLIBS += -lrte_pmd_xenvirt · line 185
Quoted 4 lines
mk/rte.app.mk +4
-0+ifeq ($(CONFIG_RTE_LIBRTE_PMD_NULL),y) +LDLIBS += -lrte_pmd_null +endif +You don't need to add this, as the pmd can be loaded dynamically via the dlopen call executed via the -d option on the test app command line. The only pmds that need explicit linking are those that offer additional API calls to an appilcation.
Thanks, I will change above.
Regards,
Tetsuya
Quoted 9 lines
Neil
Quoted 7 lines
mk/rte.app.mk +0
-0ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),n) # plugins (link only if static libraries)Signature · 1 line
1.9.1
PATCH 1/1 Fix linking errors when CONFIG_RTE_BUILD_SHARED_LIB is enabled
In reply to a message not in the archiveFrom: Tetsuya Mukawa <mukawa-AlSX/UN32fvPDbFq/[email protected]>
When CONFIG_RTE_BUILD_SHARED_LIB is enabled, linking errors occured while compiling. It seems those errors are caused by wrong link order of some libraries. The patch fixes it like following.
1. librte_eal
2. librte_malloc
3. librte_mempool
4. librte_ring
5. librte_pmd_bond
6. librte_kvargs
--- mk/rte.app.mk | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
mk/rte.app.mk +8 -8
@@ -121,10 +121,6 @@ endif LDLIBS += --start-group -ifeq ($(CONFIG_RTE_LIBRTE_KVARGS),y) -LDLIBS += -lrte_kvargs -endif - ifeq ($(CONFIG_RTE_LIBRTE_MBUF),y) LDLIBS += -lrte_mbuf endif
@@ -137,6 +133,10 @@ ifeq ($(CONFIG_RTE_LIBRTE_ETHER),y) LDLIBS += -lethdev endif +ifeq ($(CONFIG_RTE_LIBRTE_EAL),y) +LDLIBS += -lrte_eal +endif + ifeq ($(CONFIG_RTE_LIBRTE_MALLOC),y) LDLIBS += -lrte_malloc endif
@@ -158,10 +158,6 @@ ifeq ($(CONFIG_RTE_LIBGLOSS),y) LDLIBS += -lgloss endif -ifeq ($(CONFIG_RTE_LIBRTE_EAL),y) -LDLIBS += -lrte_eal -endif - ifeq ($(CONFIG_RTE_LIBRTE_CMDLINE),y) LDLIBS += -lrte_cmdline endif
@@ -174,6 +170,10 @@ ifeq ($(CONFIG_RTE_LIBRTE_PMD_BOND),y) LDLIBS += -lrte_pmd_bond endif +ifeq ($(CONFIG_RTE_LIBRTE_KVARGS),y) +LDLIBS += -lrte_kvargs +endif + ifeq ($(CONFIG_RTE_LIBRTE_PMD_XENVIRT),y) LDLIBS += -lrte_pmd_xenvirt LDLIBS += -lxenstore
Signature · 1 line
1.9.1
A message that is not in the archive (sent off-list or not yet received): 1412137623-18817-1-git-send-email-mukawa-AlSX/UN32fvPDbFq/[email protected]
Re: [PATCH] Fix linking errors when CONFIG_RTE_BUILD_SHARED_LIB is enabled
Quoted 6 lines · On Wed, Oct 01, 2014 at 01:27:03PM +0900…
From: Tetsuya Mukawa <mukawa-AlSX/UN32fvPDbFq/[email protected]>
When
CONFIG_RTE_BUILD_SHARED_LIBis enabled, linking errors occured while compiling. It seems those errors are caused by wrong link order of some libraries. The patch fixes it like following.
Quoted 7 lines
1.
librte_eal
2.librte_malloc
3.librte_mempool
4.librte_ring
5.librte_pmd_bond
6.librte_kvargs
I'm not sure why thats necesecary. We add a --start-group/--end-group pair halfway through this makefile. If we just encompassed the entire set of libraries in that group, order would be irrelevant.
Neil
Quoted 57 lines
--- mk/rte.app.mk | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)mk/rte.app.mk +8
-8@@ -121,10 +121,6 @@ endif LDLIBS += --start-group -ifeq ($(CONFIG_RTE_LIBRTE_KVARGS),y) -LDLIBS += -lrte_kvargs -endif - ifeq ($(CONFIG_RTE_LIBRTE_MBUF),y) LDLIBS += -lrte_mbuf endif@@ -137,6 +133,10 @@ ifeq ($(CONFIG_RTE_LIBRTE_ETHER),y) LDLIBS += -lethdev endif +ifeq ($(CONFIG_RTE_LIBRTE_EAL),y) +LDLIBS += -lrte_eal +endif + ifeq ($(CONFIG_RTE_LIBRTE_MALLOC),y) LDLIBS += -lrte_malloc endif@@ -158,10 +158,6 @@ ifeq ($(CONFIG_RTE_LIBGLOSS),y) LDLIBS += -lgloss endif -ifeq ($(CONFIG_RTE_LIBRTE_EAL),y) -LDLIBS += -lrte_eal -endif - ifeq ($(CONFIG_RTE_LIBRTE_CMDLINE),y) LDLIBS += -lrte_cmdline endif@@ -174,6 +170,10 @@ ifeq ($(CONFIG_RTE_LIBRTE_PMD_BOND),y) LDLIBS += -lrte_pmd_bond endif +ifeq ($(CONFIG_RTE_LIBRTE_KVARGS),y) +LDLIBS += -lrte_kvargs +endif + ifeq ($(CONFIG_RTE_LIBRTE_PMD_XENVIRT),y) LDLIBS += -lrte_pmd_xenvirt LDLIBS += -lxenstoreSignature · 1 line
1.9.1
A message that is not in the archive (sent off-list or not yet received): 20141001105022.GB21151-B26myB8xz7F8NnZeBjwnZQMhkBWG/[email protected]
Re: [PATCH] Fix linking errors when CONFIG_RTE_BUILD_SHARED_LIB is enabled
2014-10-01 06:50, Neil Horman:
Quoted 12 lines · On Wed, Oct 01, 2014 at 01:27:03PM +0900…
Quoted 11 lines
When
CONFIG_RTE_BUILD_SHARED_LIBis enabled, linking errors occured while compiling. It seems those errors are caused by wrong link order of some libraries. The patch fixes it like following.1.
librte_eal
2.librte_malloc
3.librte_mempool
4.librte_ring
5.librte_pmd_bond
6.librte_kvargs
Quoted 3 lines
I'm not sure why thats necesecary. We add a --start-group/--end-group pair halfway through this makefile. If we just encompassed the entire set of libraries in that group, order would be irrelevant.
I don't see any error.
Please Tetsuya, could you describe how you test and what is the error message?
Thanks
Signature · 1 line
Thomas
Re: [PATCH] Fix linking errors when CONFIG_RTE_BUILD_SHARED_LIB is enabled
Quoted 13 lines · Thomas Monjalon
2014-10-01 06:50, Neil Horman:
Quoted 12 lines · On Wed, Oct 01, 2014 at 01:27:03PM +0900…
Quoted 11 lines
When
CONFIG_RTE_BUILD_SHARED_LIBis enabled, linking errors occured while compiling. It seems those errors are caused by wrong link order of some libraries. The patch fixes it like following.1.
librte_eal
2.librte_malloc
3.librte_mempool
4.librte_ring
5.librte_pmd_bond
6.librte_kvargs
Quoted 7 lines
Quoted 3 lines
I'm not sure why thats necesecary. We add a --start-group/--end-group pair halfway through this makefile. If we just encompassed the entire set of libraries in that group, order would be irrelevant.
I don't see any error.
Please Tetsuya, could you describe how you test and what is the error message?Thanks
Thank you for testing.
I have confirmed '--start-group/--end-groups' is specified while compiling, but I am still seeing the error.
Here is what I actually did.
----------------------------------------------------------------------
<< Show my environment >>
$ uname -a Linux eris 3.13.0-29-generic #53-Ubuntu SMP Wed Jun 4 21:00:20 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04.1 LTS Release: 14.04 Codename: trusty $ gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
<< Compile DPDK >>
$ git clone git://dpdk.org/dpdk $ cd dpdk $ vi config/common_linuxapp CONFIG_RTE_BUILD_SHARED_LIB=y $ T=x86_64-native-linuxapp-gcc make install V=1
.......
== Build app/test-acl
gcc -Wp,-MD,./.main.o.d.tmp -m64 -pthread -fPIC -march=native
-DRTE_MACHINE_CPUFLAG_SSE -DRTE_MACHINE_CPUFLAG_SSE2
-DRTE_MACHINE_CPUFLAG_SSE3 -DRTE_MACHINE_CPUFLAG_SSSE3
-DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2
-DRTE_MACHINE_CPUFLAG_AES -DRTE_MACHINE_CPUFLAG_PCLMULQDQ
-DRTE_MACHINE_CPUFLAG_AVX -DRTE_MACHINE_CPUFLAG_F16C -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C -I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h -W
-Wall -Werror -Wstrict-prototypes -Wmissing-prototypes
-Wmissing-declarations -Wold-style-definition -Wpointer-arith
-Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral
-Wformat-security -Wundef -Wwrite-strings -o main.o -c/home/mukawa/tmp/dpdk/app/test-acl/main.c
gcc -m64 -pthread -fPIC -march=native -DRTE_MACHINE_CPUFLAG_SSE
-DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3
-DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1
-DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES
-DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX
-DRTE_MACHINE_CPUFLAG_F16C -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C -I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h -W
-Wall -Werror -Wstrict-prototypes -Wmissing-prototypes
-Wmissing-declarations -Wold-style-definition -Wpointer-arith
-Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral
-Wformat-security -Wundef -Wwrite-strings -Wl,-Map=testacl.map,--cref
-o testacl main.o -Wl,-export-dynamic
-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib
-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib
-Wl,--whole-archive -Wl,-lrte_distributor -Wl,-lrte_kni
-Wl,-lrte_pipeline -Wl,-lrte_table -Wl,-lrte_port -Wl,-lrte_timer
-Wl,-lrte_hash -Wl,-lrte_lpm -Wl,-lrte_power -Wl,-lrte_acl
-Wl,-lrte_meter -Wl,-lrte_sched -Wl,-lm -Wl,-lrt -Wl,--start-group
-Wl,-lrte_kvargs -Wl,-lrte_mbuf -Wl,-lrte_ip_frag -Wl,-lethdev
-Wl,-lrte_malloc -Wl,-lrte_mempool -Wl,-lrte_ring -Wl,-lrte_eal
-Wl,-lrte_cmdline -Wl,-lrte_cfgfile -Wl,-lrte_pmd_bond -Wl,-lrt -Wl,-lm
-Wl,-lgcc_s -Wl,-ldl -Wl,--end-group -Wl,--no-whole-archive/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
undefined reference to `rte_mempool_lookup'/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
undefined reference to `rte_mempool_create'
<< Reproduce the issue with same options >>
$ cd x86_64-native-linuxapp-gcc/build/app/test-acl/ $ gcc -Wp,-MD,./.main.o.d.tmp -m64 -pthread -fPIC -march=native -DRTE_MACHINE_CPUFLAG_SSE -DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3 -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES -DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX -DRTE_MACHINE_CPUFLAG_F16C -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C -I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h -W -Wall -Werror -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wpointer-arith -Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral -Wformat-security -Wundef -Wwrite-strings -o main.o -c /home/mukawa/tmp/dpdk/app/test-acl/main.c mukawa@eris:~/tmp/dpdk/x86_64-native-linuxapp-gcc/build/app/test-acl$ gcc -m64 -pthread -fPIC -march=native -DRTE_MACHINE_CPUFLAG_SSE -DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3 -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES -DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX -DRTE_MACHINE_CPUFLAG_F16C -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C -I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h -W -Wall -Werror -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wpointer-arith -Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral -Wformat-security -Wundef -Wwrite-strings -Wl,-Map=testacl.map,--cref -o testacl main.o -Wl,-export-dynamic -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -Wl,--whole-archive -Wl,-lrte_distributor -Wl,-lrte_kni -Wl,-lrte_pipeline -Wl,-lrte_table -Wl,-lrte_port -Wl,-lrte_timer -Wl,-lrte_hash -Wl,-lrte_lpm -Wl,-lrte_power -Wl,-lrte_acl -Wl,-lrte_meter -Wl,-lrte_sched -Wl,-lm -Wl,-lrt -Wl,--start-group -Wl,-lrte_kvargs -Wl,-lrte_mbuf -Wl,-lrte_ip_frag -Wl,-lethdev -Wl,-lrte_malloc -Wl,-lrte_mempool -Wl,-lrte_ring -Wl,-lrte_eal -Wl,-lrte_cmdline -Wl,-lrte_cfgfile -Wl,-lrte_pmd_bond -Wl,-lrt -Wl,-lm -Wl,-lgcc_s -Wl,-ldl -Wl,--end-group -Wl,--no-whole-archive /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so: undefined reference to `rte_mempool_lookup' /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so: undefined reference to `rte_mempool_create' collect2: error: ld returned 1 exit status
----------------------------------------------------------------------
I just enabled the following option, then compile DPDK. CONFIG_RTE_BUILD_SHARED_LIB
Is this collect to compile PMDs as dynamic link libraries?
With the option, all libraries include are compiled as dynamic link library. Does "--start-group/--end-group" options work with dynamic link libraries?
Regards,
Tetsuya
A message that is not in the archive (sent off-list or not yet received): 542CBD05.5000507-AlSX/UN32fvPDbFq/[email protected]
Re: [PATCH] Fix linking errors when CONFIG_RTE_BUILD_SHARED_LIB is enabled
Quoted 162 lines · Tetsuya Mukawa
Quoted 13 lines · Thomas Monjalon
2014-10-01 06:50, Neil Horman:
Quoted 12 lines · On Wed, Oct 01, 2014 at 01:27:03PM +0900…
Quoted 11 lines
When
CONFIG_RTE_BUILD_SHARED_LIBis enabled, linking errors occured while compiling. It seems those errors are caused by wrong link order of some libraries. The patch fixes it like following.1.
librte_eal
2.librte_malloc
3.librte_mempool
4.librte_ring
5.librte_pmd_bond
6.librte_kvargsQuoted 7 lines
Quoted 3 lines
I'm not sure why thats necesecary. We add a --start-group/--end-group pair halfway through this makefile. If we just encompassed the entire set of libraries in that group, order would be irrelevant.
I don't see any error.
Please Tetsuya, could you describe how you test and what is the error message?Thanks
Thank you for testing.
I have confirmed '--start-group/--end-groups' is specified while compiling, but I am still seeing the error.Here is what I actually did.
----------------------------------------------------------------------
<< Show my environment >>
$ uname -a Linux eris 3.13.0-29-generic #53-Ubuntu SMP Wed Jun 4 21:00:20 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04.1 LTS Release: 14.04 Codename: trusty $ gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)<< Compile DPDK >>
$ git clone git://dpdk.org/dpdk $ cd dpdk $ vi config/common_linuxapp CONFIG_RTE_BUILD_SHARED_LIB=y $ T=x86_64-native-linuxapp-gcc make install V=1.......
== Build app/test-acl
gcc -Wp,-MD,./.main.o.d.tmp -m64 -pthread -fPIC -march=native(quoted diff) +0
-7-DRTE_MACHINE_CPUFLAG_SSE -DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3 -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES -DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX -DRTE_MACHINE_CPUFLAG_F16C -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C -I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h-W(quoted diff) +0
-4-Wall -Werror -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wpointer-arith -Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral -Wformat-security -Wundef -Wwrite-strings -o main.o -c
/home/mukawa/tmp/dpdk/app/test-acl/main.c
gcc -m64 -pthread -fPIC -march=native -DRTE_MACHINE_CPUFLAG_SSE(quoted diff) +0
-7-DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3 -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES -DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX -DRTE_MACHINE_CPUFLAG_F16C -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C -I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h-W(quoted diff) +0
-15-Wall -Werror -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wpointer-arith -Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral -Wformat-security -Wundef -Wwrite-strings -Wl,-Map=testacl.map,--cref -o testacl main.o -Wl,-export-dynamic -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -Wl,--whole-archive -Wl,-lrte_distributor -Wl,-lrte_kni -Wl,-lrte_pipeline -Wl,-lrte_table -Wl,-lrte_port -Wl,-lrte_timer -Wl,-lrte_hash -Wl,-lrte_lpm -Wl,-lrte_power -Wl,-lrte_acl -Wl,-lrte_meter -Wl,-lrte_sched -Wl,-lm -Wl,-lrt -Wl,--start-group -Wl,-lrte_kvargs -Wl,-lrte_mbuf -Wl,-lrte_ip_frag -Wl,-lethdev -Wl,-lrte_malloc -Wl,-lrte_mempool -Wl,-lrte_ring -Wl,-lrte_eal -Wl,-lrte_cmdline -Wl,-lrte_cfgfile -Wl,-lrte_pmd_bond -Wl,-lrt -Wl,-lm -Wl,-lgcc_s -Wl,-ldl -Wl,--end-group -Wl,--no-whole-archive
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
undefined reference to `rte_mempool_lookup'/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
undefined reference to `rte_mempool_create'<< Reproduce the issue with same options >>
$ cd x86_64-native-linuxapp-gcc/build/app/test-acl/ $ gcc -Wp,-MD,./.main.o.d.tmp -m64 -pthread -fPIC -march=native(quoted diff) +0
-7-DRTE_MACHINE_CPUFLAG_SSE -DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3 -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES -DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX -DRTE_MACHINE_CPUFLAG_F16C -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C -I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h-W(quoted diff) +0
-4-Wall -Werror -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wpointer-arith -Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral -Wformat-security -Wundef -Wwrite-strings -o main.o -c
/home/mukawa/tmp/dpdk/app/test-acl/main.cmukawa@eris:~/tmp/dpdk/x86_64-native-linuxapp-gcc/build/app/test-acl$ gcc -m64 -pthread -fPIC -march=native -DRTE_MACHINE_CPUFLAG_SSE(quoted diff) +0
-7-DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3 -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES -DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX -DRTE_MACHINE_CPUFLAG_F16C -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C -I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h-W(quoted diff) +0
-15-Wall -Werror -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wpointer-arith -Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral -Wformat-security -Wundef -Wwrite-strings -Wl,-Map=testacl.map,--cref -o testacl main.o -Wl,-export-dynamic -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -Wl,--whole-archive -Wl,-lrte_distributor -Wl,-lrte_kni -Wl,-lrte_pipeline -Wl,-lrte_table -Wl,-lrte_port -Wl,-lrte_timer -Wl,-lrte_hash -Wl,-lrte_lpm -Wl,-lrte_power -Wl,-lrte_acl -Wl,-lrte_meter -Wl,-lrte_sched -Wl,-lm -Wl,-lrt -Wl,--start-group -Wl,-lrte_kvargs -Wl,-lrte_mbuf -Wl,-lrte_ip_frag -Wl,-lethdev -Wl,-lrte_malloc -Wl,-lrte_mempool -Wl,-lrte_ring -Wl,-lrte_eal -Wl,-lrte_cmdline -Wl,-lrte_cfgfile -Wl,-lrte_pmd_bond -Wl,-lrt -Wl,-lm -Wl,-lgcc_s -Wl,-ldl -Wl,--end-group -Wl,--no-whole-archive
Quoted 6 lines
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
undefined reference to `rte_mempool_lookup'/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
undefined reference to `rte_mempool_create'
collect2: error: ld returned 1 exit status
Hi Tetsuya,
Would you mind posting the output of the last command adding the option '-v'?
Sergio
Quoted 12 lines
----------------------------------------------------------------------
I just enabled the following option, then compile DPDK.
CONFIG_RTE_BUILD_SHARED_LIB
Is this collect to compile PMDs as dynamic link libraries?With the option, all libraries include are compiled as dynamic link library. Does "--start-group/--end-group" options work with dynamic link libraries?
Regards,
Tetsuya
A message that is not in the archive (sent off-list or not yet received): 20141002081221.GA27208-IWE99D/oH1/[email protected]
Re: [PATCH] Fix linking errors when CONFIG_RTE_BUILD_SHARED_LIB is enabled
Quoted 33 lines · Sergio Gonzalez Monroy
Quoted 24 lines · Tetsuya Mukawa
$ gcc -m64 -pthread -fPIC -march=native -DRTE_MACHINE_CPUFLAG_SSE(quoted diff) +0
-7-DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3 -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES -DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX -DRTE_MACHINE_CPUFLAG_F16C -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C -I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h(quoted diff) +0
-15-W -Wall -Werror -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wpointer-arith -Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral -Wformat-security -Wundef -Wwrite-strings -Wl,-Map=testacl.map,--cref -o testacl main.o -Wl,-export-dynamic -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -Wl,--whole-archive -Wl,-lrte_distributor -Wl,-lrte_kni -Wl,-lrte_pipeline -Wl,-lrte_table -Wl,-lrte_port -Wl,-lrte_timer -Wl,-lrte_hash -Wl,-lrte_lpm -Wl,-lrte_power -Wl,-lrte_acl -Wl,-lrte_meter -Wl,-lrte_sched -Wl,-lm -Wl,-lrt -Wl,--start-group -Wl,-lrte_kvargs -Wl,-lrte_mbuf -Wl,-lrte_ip_frag -Wl,-lethdev -Wl,-lrte_malloc -Wl,-lrte_mempool -Wl,-lrte_ring -Wl,-lrte_eal -Wl,-lrte_cmdline -Wl,-lrte_cfgfile -Wl,-lrte_pmd_bond -Wl,-lrt -Wl,-lm -Wl,-lgcc_s -Wl,-ldl -Wl,--end-group -Wl,--no-whole-archiveQuoted 5 lines
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
undefined reference to `rte_mempool_lookup'/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
undefined reference to `rte_mempool_create' collect2: error: ld returned 1 exit statusHi Tetsuya,
Quoted 1 line
Would you mind posting the output of the last command adding the option '-v'?
Sure, here is.
$ gcc -m64 -pthread -fPIC -march=native -DRTE_MACHINE_CPUFLAG_SSE -DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3 -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES -DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX -DRTE_MACHINE_CPUFLAG_F16C -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C -I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h -W -Wall -Werror -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wpointer-arith -Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral -Wformat-security -Wundef -Wwrite-strings -Wl,-Map=testacl.map,--cref -o testacl main.o -Wl,-export-dynamic -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -Wl,--whole-archive -Wl,-lrte_distributor -Wl,-lrte_kni -Wl,-lrte_pipeline -Wl,-lrte_table -Wl,-lrte_port -Wl,-lrte_timer -Wl,-lrte_hash -Wl,-lrte_lpm -Wl,-lrte_power -Wl,-lrte_acl -Wl,-lrte_meter -Wl,-lrte_sched -Wl,-lm -Wl,-lrt -Wl,--start-group -Wl,-lrte_kvargs -Wl,-lrte_mbuf -Wl,-lrte_ip_frag -Wl,-lethdev -Wl,-lrte_malloc -Wl,-lrte_mempool -Wl,-lrte_ring -Wl,-lrte_eal -Wl,-lrte_cmdline -Wl,-lrte_cfgfile -Wl,-lrte_pmd_bond -Wl,-lrt -Wl,-lm -Wl,-lgcc_s -Wl,-ldl -Wl,--end-group -Wl,--no-whole-archive -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/ LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../:/lib/:/usr/lib/ COLLECT_GCC_OPTIONS='-m64' '-pthread' '-fPIC' '-march=native' '-D' 'RTE_MACHINE_CPUFLAG_SSE' '-D' 'RTE_MACHINE_CPUFLAG_SSE2' '-D' 'RTE_MACHINE_CPUFLAG_SSE3' '-D' 'RTE_MACHINE_CPUFLAG_SSSE3' '-D' 'RTE_MACHINE_CPUFLAG_SSE4_1' '-D' 'RTE_MACHINE_CPUFLAG_SSE4_2' '-D' 'RTE_MACHINE_CPUFLAG_AES' '-D' 'RTE_MACHINE_CPUFLAG_PCLMULQDQ' '-D' 'RTE_MACHINE_CPUFLAG_AVX' '-D' 'RTE_MACHINE_CPUFLAG_F16C' '-D' 'RTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C' '-I' '/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include' '-include' '/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h' '-Wextra' '-Wall' '-Werror' '-Wstrict-prototypes' '-Wmissing-prototypes' '-Wmissing-declarations' '-Wold-style-definition' '-Wpointer-arith' '-Wcast-align' '-Wnested-externs' '-Wcast-qual' '-Wformat-nonliteral' '-Wformat-security' '-Wundef' '-Wwrite-strings' '-o' 'testacl' '-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib' '-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib' '-v' /usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o testacl /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. -Map=testacl.map --cref main.o -export-dynamic --whole-archive -lrte_distributor -lrte_kni -lrte_pipeline -lrte_table -lrte_port -lrte_timer -lrte_hash -lrte_lpm -lrte_power -lrte_acl -lrte_meter -lrte_sched -lm -lrt --start-group -lrte_kvargs -lrte_mbuf -lrte_ip_frag -lethdev -lrte_malloc -lrte_mempool -lrte_ring -lrte_eal -lrte_cmdline -lrte_cfgfile -lrte_pmd_bond -lrt -lm -lgcc_s -ldl --end-group --no-whole-archive -lgcc --as-needed -lgcc_s --no-as-needed -lpthread -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so: undefined reference to `rte_mempool_lookup' /home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so: undefined reference to `rte_mempool_create' collect2: error: ld returned 1 exit status
Regards,
Tetsuya
Quoted 15 lines
Sergio
Quoted 12 lines
----------------------------------------------------------------------
I just enabled the following option, then compile DPDK.
CONFIG_RTE_BUILD_SHARED_LIB
Is this collect to compile PMDs as dynamic link libraries?With the option, all libraries include are compiled as dynamic link library. Does "--start-group/--end-group" options work with dynamic link libraries?
Regards,
Tetsuya
A message that is not in the archive (sent off-list or not yet received): 542D0C94.70209-AlSX/UN32fvPDbFq/[email protected]
Re: [PATCH] Fix linking errors when CONFIG_RTE_BUILD_SHARED_LIB is enabled
Quoted 98 lines · Tetsuya Mukawa
Quoted 33 lines · Sergio Gonzalez Monroy
Quoted 24 lines · Tetsuya Mukawa
$ gcc -m64 -pthread -fPIC -march=native -DRTE_MACHINE_CPUFLAG_SSE(quoted diff) +0
-7-DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3 -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES -DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX -DRTE_MACHINE_CPUFLAG_F16C -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C -I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h(quoted diff) +0
-15-W -Wall -Werror -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wpointer-arith -Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral -Wformat-security -Wundef -Wwrite-strings -Wl,-Map=testacl.map,--cref -o testacl main.o -Wl,-export-dynamic -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -Wl,--whole-archive -Wl,-lrte_distributor -Wl,-lrte_kni -Wl,-lrte_pipeline -Wl,-lrte_table -Wl,-lrte_port -Wl,-lrte_timer -Wl,-lrte_hash -Wl,-lrte_lpm -Wl,-lrte_power -Wl,-lrte_acl -Wl,-lrte_meter -Wl,-lrte_sched -Wl,-lm -Wl,-lrt -Wl,--start-group -Wl,-lrte_kvargs -Wl,-lrte_mbuf -Wl,-lrte_ip_frag -Wl,-lethdev -Wl,-lrte_malloc -Wl,-lrte_mempool -Wl,-lrte_ring -Wl,-lrte_eal -Wl,-lrte_cmdline -Wl,-lrte_cfgfile -Wl,-lrte_pmd_bond -Wl,-lrt -Wl,-lm -Wl,-lgcc_s -Wl,-ldl -Wl,--end-group -Wl,--no-whole-archiveQuoted 5 lines
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
undefined reference to `rte_mempool_lookup'/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
undefined reference to `rte_mempool_create' collect2: error: ld returned 1 exit statusHi Tetsuya,
Quoted 1 line
Would you mind posting the output of the last command adding the option '-v'?
Sure, here is.
$ gcc -m64 -pthread -fPIC -march=native -DRTE_MACHINE_CPUFLAG_SSE(quoted diff) +0
-7-DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3 -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES -DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX -DRTE_MACHINE_CPUFLAG_F16C -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C -I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h-W(quoted diff) +0
-15-Wall -Werror -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wpointer-arith -Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral -Wformat-security -Wundef -Wwrite-strings -Wl,-Map=testacl.map,--cref -o testacl main.o -Wl,-export-dynamic -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -Wl,--whole-archive -Wl,-lrte_distributor -Wl,-lrte_kni -Wl,-lrte_pipeline -Wl,-lrte_table -Wl,-lrte_port -Wl,-lrte_timer -Wl,-lrte_hash -Wl,-lrte_lpm -Wl,-lrte_power -Wl,-lrte_acl -Wl,-lrte_meter -Wl,-lrte_sched -Wl,-lm -Wl,-lrt -Wl,--start-group -Wl,-lrte_kvargs -Wl,-lrte_mbuf -Wl,-lrte_ip_frag -Wl,-lethdev -Wl,-lrte_malloc -Wl,-lrte_mempool -Wl,-lrte_ring -Wl,-lrte_eal -Wl,-lrte_cmdline -Wl,-lrte_cfgfile -Wl,-lrte_pmd_bond -Wl,-lrt -Wl,-lm -Wl,-lgcc_s -Wl,-ldl -Wl,--end-group -Wl,--no-whole-archive -vUsing built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu
4.8.2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs
--enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr
--program-suffix=-4.8 --enable-shared --enable-linker-build-id
--libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
--with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib
--enable-nls --with-sysroot=/ --enable-clocale=gnu
--enable-libstdcxx-debug --enable-libstdcxx-time=yes
--enable-gnu-unique-object --disable-libmudflap --enable-plugin
--with-system-zlib --disable-browser-plugin --enable-java-awt=gtk
--enable-gtk-cairo
--with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre
--enable-java-home
--with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64
--with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64
--with-arch-directory=amd64
--with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc
--enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64
--with-multilib-list=m32,m64,mx32 --with-tune=generic
--enable-checking=release --build=x86_64-linux-gnu
--host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/ LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../:/lib/:/usr/lib/ COLLECT_GCC_OPTIONS='-m64' '-pthread' '-fPIC' '-march=native' '-D'
'RTE_MACHINE_CPUFLAG_SSE' '-D' 'RTE_MACHINE_CPUFLAG_SSE2' '-D'
'RTE_MACHINE_CPUFLAG_SSE3' '-D' 'RTE_MACHINE_CPUFLAG_SSSE3' '-D'
'RTE_MACHINE_CPUFLAG_SSE4_1' '-D' 'RTE_MACHINE_CPUFLAG_SSE4_2' '-D'
'RTE_MACHINE_CPUFLAG_AES' '-D' 'RTE_MACHINE_CPUFLAG_PCLMULQDQ' '-D'
'RTE_MACHINE_CPUFLAG_AVX' '-D' 'RTE_MACHINE_CPUFLAG_F16C' '-D' 'RTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C'
'-I' '/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include'
Quoted 8 lines
'-include' '
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h' '-Wextra' '-Wall' '-Werror' '-Wstrict-prototypes' '-Wmissing-prototypes' '-Wmissing-declarations' '-Wold-style-definition' '-Wpointer-arith' '-Wcast-align' '-Wnested-externs' '-Wcast-qual' '-Wformat-nonliteral' '-Wformat-security' '-Wundef' '-Wwrite-strings' '-o' 'testacl' '-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib' '-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib' '-v'
We have been looking at this issue over the last couple of days.
It seems to be an Ubuntu GCC related bug as it works on other distros. GCC is passing incorrectly the option '--as-needed' to LD resulting in wrong linking.
Quoted 2 lines
/usr/lib/gcc/x86_64-linux-gnu/4.8/collect2--sysroot=/ --build-id
--eh-frame-hdr -melf_x86_64--hash-style=gnu --as-needed
The '--as-needed' just at the end of the above line is incorrect and not matching a closing '--no-as-needed'.
You may get away with it by adding 'EXTRA_LDFLAGS=--no-as-needed'. ie. $ make install T=x86_64-native-linuxapp-gcc EXTRA_LDFLAGS=--no-as-needed
Sergio
Quoted 46 lines
-dynamic-linker
/lib64/ld-linux-x86-64.so.2-z relro -o testacl/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o/usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o(quoted diff) +0
-15-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. -Map=testacl.map --cref main.o -export-dynamic --whole-archive -lrte_distributor -lrte_kni -lrte_pipeline -lrte_table -lrte_port -lrte_timer -lrte_hash -lrte_lpm -lrte_power -lrte_acl -lrte_meter -lrte_sched -lm -lrt --start-group -lrte_kvargs -lrte_mbuf -lrte_ip_frag -lethdev -lrte_malloc -lrte_mempool -lrte_ring -lrte_eal -lrte_cmdline -lrte_cfgfile -lrte_pmd_bond -lrt -lm -lgcc_s -ldl --end-group --no-whole-archive -lgcc --as-needed -lgcc_s --no-as-needed -lpthread -lc -lgcc --as-needed -lgcc_s --no-as-needed
/usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
undefined reference to `rte_mempool_lookup'/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
undefined reference to `rte_mempool_create'
collect2: error: ld returned 1 exit statusRegards,
TetsuyaQuoted 15 lines
Sergio
Quoted 12 lines
----------------------------------------------------------------------
I just enabled the following option, then compile DPDK.
CONFIG_RTE_BUILD_SHARED_LIB
Is this collect to compile PMDs as dynamic link libraries?With the option, all libraries include are compiled as dynamic link library. Does "--start-group/--end-group" options work with dynamic link libraries?
Regards,
Tetsuya
A message that is not in the archive (sent off-list or not yet received): 20141002085321.GA31287-IWE99D/oH1/[email protected]
Re: [PATCH] Fix linking errors when CONFIG_RTE_BUILD_SHARED_LIB is enabled
Quoted 111 lines · Sergio Gonzalez Monroy
Quoted 98 lines · Tetsuya Mukawa
Quoted 33 lines · Sergio Gonzalez Monroy
Quoted 24 lines · Tetsuya Mukawa
$ gcc -m64 -pthread -fPIC -march=native -DRTE_MACHINE_CPUFLAG_SSE(quoted diff) +0
-7-DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3 -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES -DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX -DRTE_MACHINE_CPUFLAG_F16C -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C -I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h(quoted diff) +0
-15-W -Wall -Werror -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wpointer-arith -Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral -Wformat-security -Wundef -Wwrite-strings -Wl,-Map=testacl.map,--cref -o testacl main.o -Wl,-export-dynamic -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -Wl,--whole-archive -Wl,-lrte_distributor -Wl,-lrte_kni -Wl,-lrte_pipeline -Wl,-lrte_table -Wl,-lrte_port -Wl,-lrte_timer -Wl,-lrte_hash -Wl,-lrte_lpm -Wl,-lrte_power -Wl,-lrte_acl -Wl,-lrte_meter -Wl,-lrte_sched -Wl,-lm -Wl,-lrt -Wl,--start-group -Wl,-lrte_kvargs -Wl,-lrte_mbuf -Wl,-lrte_ip_frag -Wl,-lethdev -Wl,-lrte_malloc -Wl,-lrte_mempool -Wl,-lrte_ring -Wl,-lrte_eal -Wl,-lrte_cmdline -Wl,-lrte_cfgfile -Wl,-lrte_pmd_bond -Wl,-lrt -Wl,-lm -Wl,-lgcc_s -Wl,-ldl -Wl,--end-group -Wl,--no-whole-archiveQuoted 5 lines
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
undefined reference to `rte_mempool_lookup'/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
undefined reference to `rte_mempool_create' collect2: error: ld returned 1 exit statusHi Tetsuya,
Quoted 1 line
Would you mind posting the output of the last command adding the option '-v'?
Sure, here is.
$ gcc -m64 -pthread -fPIC -march=native -DRTE_MACHINE_CPUFLAG_SSE(quoted diff) +0
-7-DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3 -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES -DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX -DRTE_MACHINE_CPUFLAG_F16C -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C -I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h-W(quoted diff) +0
-15-Wall -Werror -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wpointer-arith -Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral -Wformat-security -Wundef -Wwrite-strings -Wl,-Map=testacl.map,--cref -o testacl main.o -Wl,-export-dynamic -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -Wl,--whole-archive -Wl,-lrte_distributor -Wl,-lrte_kni -Wl,-lrte_pipeline -Wl,-lrte_table -Wl,-lrte_port -Wl,-lrte_timer -Wl,-lrte_hash -Wl,-lrte_lpm -Wl,-lrte_power -Wl,-lrte_acl -Wl,-lrte_meter -Wl,-lrte_sched -Wl,-lm -Wl,-lrt -Wl,--start-group -Wl,-lrte_kvargs -Wl,-lrte_mbuf -Wl,-lrte_ip_frag -Wl,-lethdev -Wl,-lrte_malloc -Wl,-lrte_mempool -Wl,-lrte_ring -Wl,-lrte_eal -Wl,-lrte_cmdline -Wl,-lrte_cfgfile -Wl,-lrte_pmd_bond -Wl,-lrt -Wl,-lm -Wl,-lgcc_s -Wl,-ldl -Wl,--end-group -Wl,--no-whole-archive -vUsing built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu
4.8.2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs
--enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr
--program-suffix=-4.8 --enable-shared --enable-linker-build-id
--libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
--with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib
--enable-nls --with-sysroot=/ --enable-clocale=gnu
--enable-libstdcxx-debug --enable-libstdcxx-time=yes
--enable-gnu-unique-object --disable-libmudflap --enable-plugin
--with-system-zlib --disable-browser-plugin --enable-java-awt=gtk
--enable-gtk-cairo
--with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre
--enable-java-home
--with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64
--with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64
--with-arch-directory=amd64
--with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc
--enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64
--with-multilib-list=m32,m64,mx32 --with-tune=generic
--enable-checking=release --build=x86_64-linux-gnu
--host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/ LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../:/lib/:/usr/lib/ COLLECT_GCC_OPTIONS='-m64' '-pthread' '-fPIC' '-march=native' '-D'
'RTE_MACHINE_CPUFLAG_SSE' '-D' 'RTE_MACHINE_CPUFLAG_SSE2' '-D'
'RTE_MACHINE_CPUFLAG_SSE3' '-D' 'RTE_MACHINE_CPUFLAG_SSSE3' '-D'
'RTE_MACHINE_CPUFLAG_SSE4_1' '-D' 'RTE_MACHINE_CPUFLAG_SSE4_2' '-D'
'RTE_MACHINE_CPUFLAG_AES' '-D' 'RTE_MACHINE_CPUFLAG_PCLMULQDQ' '-D'
'RTE_MACHINE_CPUFLAG_AVX' '-D' 'RTE_MACHINE_CPUFLAG_F16C' '-D' 'RTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C'
'-I' '/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include'Quoted 8 lines
'-include' '
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h' '-Wextra' '-Wall' '-Werror' '-Wstrict-prototypes' '-Wmissing-prototypes' '-Wmissing-declarations' '-Wold-style-definition' '-Wpointer-arith' '-Wcast-align' '-Wnested-externs' '-Wcast-qual' '-Wformat-nonliteral' '-Wformat-security' '-Wundef' '-Wwrite-strings' '-o' 'testacl' '-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib' '-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib' '-v'We have been looking at this issue over the last couple of days.
It seems to be an Ubuntu GCC related bug as it works on other distros. GCC is passing incorrectly the option '--as-needed' to LD resulting in wrong linking.
Quoted 6 lines
Quoted 2 lines
/usr/lib/gcc/x86_64-linux-gnu/4.8/collect2--sysroot=/ --build-id
--eh-frame-hdr -melf_x86_64--hash-style=gnu --as-neededThe '--as-needed' just at the end of the above line is incorrect and not matching a closing '--no-as-needed'.
You may get away with it by adding 'EXTRA_LDFLAGS=--no-as-needed'. ie. $ make install T=x86_64-native-linuxapp-gcc EXTRA_LDFLAGS=--no-as-needed
I can compile DPDK with above options. Thank you everyone for helping to solve this issue.
Regards,
Tetsuya
Quoted 48 lines
Sergio
Quoted 45 lines
-dynamic-linker
/lib64/ld-linux-x86-64.so.2-z relro -o testacl/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o/usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o(quoted diff) +0
-15-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. -Map=testacl.map --cref main.o -export-dynamic --whole-archive -lrte_distributor -lrte_kni -lrte_pipeline -lrte_table -lrte_port -lrte_timer -lrte_hash -lrte_lpm -lrte_power -lrte_acl -lrte_meter -lrte_sched -lm -lrt --start-group -lrte_kvargs -lrte_mbuf -lrte_ip_frag -lethdev -lrte_malloc -lrte_mempool -lrte_ring -lrte_eal -lrte_cmdline -lrte_cfgfile -lrte_pmd_bond -lrt -lm -lgcc_s -ldl --end-group --no-whole-archive -lgcc --as-needed -lgcc_s --no-as-needed -lpthread -lc -lgcc --as-needed -lgcc_s --no-as-needed
/usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
undefined reference to `rte_mempool_lookup'/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
undefined reference to `rte_mempool_create'
collect2: error: ld returned 1 exit statusRegards,
TetsuyaQuoted 15 lines
Sergio
Quoted 12 lines
----------------------------------------------------------------------
I just enabled the following option, then compile DPDK.
CONFIG_RTE_BUILD_SHARED_LIB
Is this collect to compile PMDs as dynamic link libraries?With the option, all libraries include are compiled as dynamic link library. Does "--start-group/--end-group" options work with dynamic link libraries?
Regards,
Tetsuya
A message that is not in the archive (sent off-list or not yet received): 542D1545.8040202-AlSX/UN32fvPDbFq/[email protected]
Re: [PATCH] Fix linking errors when CONFIG_RTE_BUILD_SHARED_LIB is enabled
Quoted 104 lines · Tetsuya Mukawa
Quoted 103 lines · Sergio Gonzalez Monroy
Quoted 102 lines · Tetsuya Mukawa
Quoted 33 lines · Sergio Gonzalez Monroy
Quoted 24 lines · Tetsuya Mukawa
$ gcc -m64 -pthread -fPIC -march=native -DRTE_MACHINE_CPUFLAG_SSE(quoted diff) +0
-7-DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3 -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES -DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX -DRTE_MACHINE_CPUFLAG_F16C -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C -I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h(quoted diff) +0
-15-W -Wall -Werror -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wpointer-arith -Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral -Wformat-security -Wundef -Wwrite-strings -Wl,-Map=testacl.map,--cref -o testacl main.o -Wl,-export-dynamic -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -Wl,--whole-archive -Wl,-lrte_distributor -Wl,-lrte_kni -Wl,-lrte_pipeline -Wl,-lrte_table -Wl,-lrte_port -Wl,-lrte_timer -Wl,-lrte_hash -Wl,-lrte_lpm -Wl,-lrte_power -Wl,-lrte_acl -Wl,-lrte_meter -Wl,-lrte_sched -Wl,-lm -Wl,-lrt -Wl,--start-group -Wl,-lrte_kvargs -Wl,-lrte_mbuf -Wl,-lrte_ip_frag -Wl,-lethdev -Wl,-lrte_malloc -Wl,-lrte_mempool -Wl,-lrte_ring -Wl,-lrte_eal -Wl,-lrte_cmdline -Wl,-lrte_cfgfile -Wl,-lrte_pmd_bond -Wl,-lrt -Wl,-lm -Wl,-lgcc_s -Wl,-ldl -Wl,--end-group -Wl,--no-whole-archiveQuoted 5 lines
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
undefined reference to `rte_mempool_lookup'/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
undefined reference to `rte_mempool_create' collect2: error: ld returned 1 exit statusHi Tetsuya,
Quoted 1 line
Would you mind posting the output of the last command adding the option '-v'?
Sure, here is.
$ gcc -m64 -pthread -fPIC -march=native -DRTE_MACHINE_CPUFLAG_SSE(quoted diff) +0
-7-DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3 -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2 -DRTE_MACHINE_CPUFLAG_AES -DRTE_MACHINE_CPUFLAG_PCLMULQDQ -DRTE_MACHINE_CPUFLAG_AVX -DRTE_MACHINE_CPUFLAG_F16C -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C -I/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include -include
/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h-W(quoted diff) +0
-15-Wall -Werror -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition -Wpointer-arith -Wcast-align -Wnested-externs -Wcast-qual -Wformat-nonliteral -Wformat-security -Wundef -Wwrite-strings -Wl,-Map=testacl.map,--cref -o testacl main.o -Wl,-export-dynamic -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -Wl,--whole-archive -Wl,-lrte_distributor -Wl,-lrte_kni -Wl,-lrte_pipeline -Wl,-lrte_table -Wl,-lrte_port -Wl,-lrte_timer -Wl,-lrte_hash -Wl,-lrte_lpm -Wl,-lrte_power -Wl,-lrte_acl -Wl,-lrte_meter -Wl,-lrte_sched -Wl,-lm -Wl,-lrt -Wl,--start-group -Wl,-lrte_kvargs -Wl,-lrte_mbuf -Wl,-lrte_ip_frag -Wl,-lethdev -Wl,-lrte_malloc -Wl,-lrte_mempool -Wl,-lrte_ring -Wl,-lrte_eal -Wl,-lrte_cmdline -Wl,-lrte_cfgfile -Wl,-lrte_pmd_bond -Wl,-lrt -Wl,-lm -Wl,-lgcc_s -Wl,-ldl -Wl,--end-group -Wl,--no-whole-archive -vUsing built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu
4.8.2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs
--enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr
--program-suffix=-4.8 --enable-shared --enable-linker-build-id
--libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
--with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib
--enable-nls --with-sysroot=/ --enable-clocale=gnu
--enable-libstdcxx-debug --enable-libstdcxx-time=yes
--enable-gnu-unique-object --disable-libmudflap --enable-plugin
--with-system-zlib --disable-browser-plugin --enable-java-awt=gtk
--enable-gtk-cairo
--with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre
--enable-java-home
--with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64
--with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64
--with-arch-directory=amd64
--with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc
--enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64
--with-multilib-list=m32,m64,mx32 --with-tune=generic
--enable-checking=release --build=x86_64-linux-gnu
--host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/ LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../:/lib/:/usr/lib/ COLLECT_GCC_OPTIONS='-m64' '-pthread' '-fPIC' '-march=native' '-D'
'RTE_MACHINE_CPUFLAG_SSE' '-D' 'RTE_MACHINE_CPUFLAG_SSE2' '-D'
'RTE_MACHINE_CPUFLAG_SSE3' '-D' 'RTE_MACHINE_CPUFLAG_SSSE3' '-D'
'RTE_MACHINE_CPUFLAG_SSE4_1' '-D' 'RTE_MACHINE_CPUFLAG_SSE4_2' '-D'
'RTE_MACHINE_CPUFLAG_AES' '-D' 'RTE_MACHINE_CPUFLAG_PCLMULQDQ' '-D'
'RTE_MACHINE_CPUFLAG_AVX' '-D' 'RTE_MACHINE_CPUFLAG_F16C' '-D' 'RTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2,RTE_CPUFLAG_AES,RTE_CPUFLAG_PCLMULQDQ,RTE_CPUFLAG_AVX,RTE_CPUFLAG_F16C'
'-I' '/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include'
'-include'
'/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/include/rte_config.h'
'-Wextra' '-Wall' '-Werror' '-Wstrict-prototypes' '-Wmissing-prototypes'
'-Wmissing-declarations' '-Wold-style-definition' '-Wpointer-arith'
Quoted 8 lines
Quoted 8 lines
Quoted 4 lines
'-Wcast-align' '-Wnested-externs' '-Wcast-qual' '-Wformat-nonliteral' '-Wformat-security' '-Wundef' '-Wwrite-strings' '-o' 'testacl' '-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib' '-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib' '-v'
We have been looking at this issue over the last couple of days.
It seems to be an Ubuntu GCC related bug as it works on other distros. GCC is passing incorrectly the option '--as-needed' to LD resulting in wrong linking.
Just a quick follow up on this issue and to rectify myself. This is not a bug but expected behavior:
https://wiki.debian.org/ToolChain/DSOLinking#Onlylinkwithneededlibraries
Sergio
Quoted 63 lines
Quoted 6 lines
Quoted 2 lines
/usr/lib/gcc/x86_64-linux-gnu/4.8/collect2--sysroot=/ --build-id
--eh-frame-hdr -melf_x86_64--hash-style=gnu --as-neededThe '--as-needed' just at the end of the above line is incorrect and not matching a closing '--no-as-needed'.
You may get away with it by adding 'EXTRA_LDFLAGS=--no-as-needed'. ie. $ make install T=x86_64-native-linuxapp-gcc EXTRA_LDFLAGS=--no-as-neededI can compile DPDK with above options. Thank you everyone for helping to solve this issue.
Regards,
TetsuyaQuoted 48 lines
Sergio
Quoted 45 lines
-dynamic-linker
/lib64/ld-linux-x86-64.so.2-z relro -o testacl/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o/usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o(quoted diff) +0
-15-L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -L/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. -Map=testacl.map --cref main.o -export-dynamic --whole-archive -lrte_distributor -lrte_kni -lrte_pipeline -lrte_table -lrte_port -lrte_timer -lrte_hash -lrte_lpm -lrte_power -lrte_acl -lrte_meter -lrte_sched -lm -lrt --start-group -lrte_kvargs -lrte_mbuf -lrte_ip_frag -lethdev -lrte_malloc -lrte_mempool -lrte_ring -lrte_eal -lrte_cmdline -lrte_cfgfile -lrte_pmd_bond -lrt -lm -lgcc_s -ldl --end-group --no-whole-archive -lgcc --as-needed -lgcc_s --no-as-needed -lpthread -lc -lgcc --as-needed -lgcc_s --no-as-needed
/usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
undefined reference to `rte_mempool_lookup'/home/mukawa/tmp/dpdk/x86_64-native-linuxapp-gcc/lib/librte_eal.so:
undefined reference to `rte_mempool_create'
collect2: error: ld returned 1 exit statusRegards,
TetsuyaQuoted 15 lines
Sergio
Quoted 12 lines
----------------------------------------------------------------------
I just enabled the following option, then compile DPDK.
CONFIG_RTE_BUILD_SHARED_LIB
Is this collect to compile PMDs as dynamic link libraries?With the option, all libraries include are compiled as dynamic link library. Does "--start-group/--end-group" options work with dynamic link libraries?
Regards,
Tetsuya
Re: [PATCH] Fix linking errors when CONFIG_RTE_BUILD_SHARED_LIB is enabled
In reply to a message not in the archiveQuoted 3 lines · Neil Horman
I'm not sure why thats necesecary. We add a --start-group/--end-group pair halfway through this makefile. If we just encompassed the entire set of libraries in that group, order would be irrelevant.
I haven't known the options. Thanks.
Anyway, I understand I shouldn't change link order, but should check why '--start-group/--end-group' doesn't work on my environment. I will describe more in the email for Thomas.
Regards,
Tetsuya
Quoted 59 lines
Neil
Quoted 57 lines
--- mk/rte.app.mk | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)mk/rte.app.mk +8
-8@@ -121,10 +121,6 @@ endif LDLIBS += --start-group -ifeq ($(CONFIG_RTE_LIBRTE_KVARGS),y) -LDLIBS += -lrte_kvargs -endif - ifeq ($(CONFIG_RTE_LIBRTE_MBUF),y) LDLIBS += -lrte_mbuf endif@@ -137,6 +133,10 @@ ifeq ($(CONFIG_RTE_LIBRTE_ETHER),y) LDLIBS += -lethdev endif +ifeq ($(CONFIG_RTE_LIBRTE_EAL),y) +LDLIBS += -lrte_eal +endif + ifeq ($(CONFIG_RTE_LIBRTE_MALLOC),y) LDLIBS += -lrte_malloc endif@@ -158,10 +158,6 @@ ifeq ($(CONFIG_RTE_LIBGLOSS),y) LDLIBS += -lgloss endif -ifeq ($(CONFIG_RTE_LIBRTE_EAL),y) -LDLIBS += -lrte_eal -endif - ifeq ($(CONFIG_RTE_LIBRTE_CMDLINE),y) LDLIBS += -lrte_cmdline endif@@ -174,6 +170,10 @@ ifeq ($(CONFIG_RTE_LIBRTE_PMD_BOND),y) LDLIBS += -lrte_pmd_bond endif +ifeq ($(CONFIG_RTE_LIBRTE_KVARGS),y) +LDLIBS += -lrte_kvargs +endif + ifeq ($(CONFIG_RTE_LIBRTE_PMD_XENVIRT),y) LDLIBS += -lrte_pmd_xenvirt LDLIBS += -lxenstoreSignature · 1 line
1.9.1
A message that is not in the archive (sent off-list or not yet received): 542CADD8.9070402-AlSX/UN32fvPDbFq/[email protected]
Re: [PATCH] Fix linking errors when CONFIG_RTE_BUILD_SHARED_LIB is enabled
Quoted 7 lines · Tetsuya Mukawa
I haven't known the options. Thanks.
Anyway, I understand I shouldn't change link order, but should check why '--start-group/--end-group' doesn't work on my environment. I will describe more in the email for Thomas.Regards,
Tetsuya
It's worth pointing out that you're likely better off using COMBINE_LIBS to make one big static lib rather than using a shared lib or you're facing a performance loss from the dynamic linking overhead.
Matthew.
A message that is not in the archive (sent off-list or not yet received): [email protected]
Re: [PATCH] Fix linking errors when CONFIG_RTE_BUILD_SHARED_LIB is enabled
Quoted 5 lines · Matthew Hall
On Thu, Oct 02, 2014 at 10:43:52AM +0900, Tetsuya Mukawa wrote:
It's worth pointing out that you're likely better off usingCOMBINE_LIBSto make one big static lib rather than using a shared lib or you're facing a performance loss from the dynamic linking overhead. Matthew.
Thanks. I will go over it
Regards,
Tetsuya
PATCH v2 1/1 PMD for performance measurement
In reply to a message not in the archiveFrom: Tetsuya Mukawa <mukawa-AlSX/UN32fvPDbFq/[email protected]>
Hi,
Here are patches to add the new PMD like '/dev/null'.
This PMD is a driver for virtual device. When an application call rx, it just allocates mbufs and returns those. Also tx, it just frees mbufs.
Main purpose of the PMD is measuring rough throughputs of a VDEV PMD. To measure rough throughputs between PMD1 and PMD2, prepare following environment.
+-------------------------------+
| testpmd1 |
+-------------+------+----------+
| Target PMD1 | | null PMD |
+---++--------+ +----------+
||
|| Target path
||
+---++--------+ +----------+
| Target PMD2 | | null PMD |
+-------------+------+----------+
| testpmd2 |
+-------------------------------+changes from v1:
* change the copyright of Makefile.
* change commit log.
* change config file not to link the PMD statically.
changes from RFC:
* change the copyright of this PMD.
* change commit logs.
Tetsuya Mukawa (1):
librte_pmd_null: Add null PMD
config/common_bsdapp | 5 + config/common_linuxapp | 5 + lib/Makefile | 1 + lib/librte_pmd_null/Makefile | 58 +++++ lib/librte_pmd_null/rte_eth_null.c | 474 +++++++++++++++++++++++++++++++++++++ 5 files changed, 543 insertions(+) create mode 100644 lib/librte_pmd_null/Makefile create mode 100644 lib/librte_pmd_null/rte_eth_null.c
Signature · 1 line
1.9.1
A message that is not in the archive (sent off-list or not yet received): 1412139437-26749-1-git-send-email-mukawa-AlSX/UN32fvPDbFq/[email protected]
PATCH v2 1/1 librte_pmd_null: Add null PMD
From: Tetsuya Mukawa <mukawa-AlSX/UN32fvPDbFq/[email protected]>
'null PMD' is a driver of the virtual device particulary designed to measure performance of DPDK PMDs. When an application call rx, null PMD just allocates mbufs and returns those. Also tx, the PMD just frees mbufs.
The PMD has following options.
- size: specify packe size allocated by RX. Default packet size is 64.
- copy: specify 1 or 0 to enable or disable copy while RX and TX. Default value is 0(disbaled).
This option is used for emulating more realistic data transfer. Copy size is equal to packet size.
To use the PMD, enable CONFIG_RTE_BUILD_SHARED_LIB in config file. Then compile the PMD as shared library. The library can be linked using '-d' option when an application invokes.
Here is an example.
$ sudo ./testpmd -c f -n 4 -d librte_pmd_null.so \ --vdev 'eth_null0' --vdev 'eth_null1' -- -i
If testpmd is compiled with CONFIG_RTE_BUILD_SHARED_LIB, it may need to specify more libraries using '-d' option.
--- config/common_bsdapp | 5 + config/common_linuxapp | 5 + lib/Makefile | 1 + lib/librte_pmd_null/Makefile | 58 +++++ lib/librte_pmd_null/rte_eth_null.c | 474 +++++++++++++++++++++++++++++++++++++ 5 files changed, 543 insertions(+) create mode 100644 lib/librte_pmd_null/Makefile create mode 100644 lib/librte_pmd_null/rte_eth_null.c
config/common_bsdapp +5 -0
@@ -224,6 +224,11 @@ CONFIG_RTE_LIBRTE_PMD_PCAP=y CONFIG_RTE_LIBRTE_PMD_BOND=y # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=y
config/common_linuxapp +5 -0
@@ -252,6 +252,11 @@ CONFIG_RTE_LIBRTE_PMD_BOND=y CONFIG_RTE_LIBRTE_PMD_XENVIRT=n # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=y
lib/Makefile +1 -0
@@ -50,6 +50,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_PMD_PCAP) += librte_pmd_pcap DIRS-$(CONFIG_RTE_LIBRTE_VIRTIO_PMD) += librte_pmd_virtio DIRS-$(CONFIG_RTE_LIBRTE_VMXNET3_PMD) += librte_pmd_vmxnet3 DIRS-$(CONFIG_RTE_LIBRTE_PMD_XENVIRT) += librte_pmd_xenvirt +DIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += librte_pmd_null DIRS-$(CONFIG_RTE_LIBRTE_HASH) += librte_hash DIRS-$(CONFIG_RTE_LIBRTE_LPM) += librte_lpm DIRS-$(CONFIG_RTE_LIBRTE_ACL) += librte_acl
lib/librte_pmd_null/Makefile new file +58 -0
58 lines not on this page · raw message
lib/librte_pmd_null/rte_eth_null.c new file +474 -0
474 lines not on this page · raw message
Signature · 1 line
1.9.1
A message that is not in the archive (sent off-list or not yet received): 1412139437-26749-2-git-send-email-mukawa-AlSX/UN32fvPDbFq/[email protected]
Re: [PATCH v2] librte_pmd_null: Add null PMD
Hi,
2014-10-01 13:57, mukawa-AlSX/UN32fvPDbFq/[email protected]:
Quoted 15 lines
'null PMD' is a driver of the virtual device particulary designed to measure performance of DPDK PMDs. When an application call rx, null PMD just allocates mbufs and returns those. Also tx, the PMD just frees mbufs.
The PMD has following options.
- size: specify packe size allocated by RX. Default packet size is 64.
- copy: specify 1 or 0 to enable or disable copy while RX and TX. Default value is 0(disbaled).
This option is used for emulating more realistic data transfer. Copy size is equal to packet size.To use the PMD, enable
CONFIG_RTE_BUILD_SHARED_LIBin config file. Then compile the PMD as shared library. The library can be linked using '-d' option when an application invokes.
Quoted 8 lines
Here is an example.
$ sudo ./testpmd -c f -n 4 -d librte_pmd_null.so \ --vdev 'eth_null0' --vdev 'eth_null1' -- -iIf testpmd is compiled with
CONFIG_RTE_BUILD_SHARED_LIB, it may need to specify more libraries using '-d' option.
This patch is still pending because nobody reviewed it.
Signature · 1 line
Thomas
PATCH v3 1/1 librte_pmd_null: Add null PMD
In reply to a message not in the archive'null PMD' is a driver of the virtual device particulary designed to measure performance of DPDK PMDs. When an application call rx, null PMD just allocates mbufs and returns those. Also tx, the PMD just frees mbufs.
The PMD has following options.
- size: specify packe size allocated by RX. Default packet size is 64.
- copy: specify 1 or 0 to enable or disable copy while RX and TX. Default value is 0(disbaled).
This option is used for emulating more realistic data transfer. Copy size is equal to packet size.
To use the PMD, enable CONFIG_RTE_BUILD_SHARED_LIB in config file. Then compile the PMD as shared library. The library can be linked using '-d' option when an application invokes.
Here is an example.
$ sudo ./testpmd -c f -n 4 -d librte_pmd_null.so \ --vdev 'eth_null0' --vdev 'eth_null1' -- -i
If testpmd is compiled with CONFIG_RTE_BUILD_SHARED_LIB, it may need to specify more libraries using '-d' option.
--- config/common_bsdapp | 5 + config/common_linuxapp | 5 + lib/Makefile | 1 + lib/librte_pmd_null/Makefile | 58 +++++ lib/librte_pmd_null/rte_eth_null.c | 474 +++++++++++++++++++++++++++++++++++++ 5 files changed, 543 insertions(+) create mode 100644 lib/librte_pmd_null/Makefile create mode 100644 lib/librte_pmd_null/rte_eth_null.c
config/common_bsdapp +5 -0
@@ -224,6 +224,11 @@ CONFIG_RTE_LIBRTE_PMD_PCAP=y CONFIG_RTE_LIBRTE_PMD_BOND=y # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=y
config/common_linuxapp +5 -0
@@ -232,6 +232,11 @@ CONFIG_RTE_LIBRTE_PMD_AF_PACKET=y CONFIG_RTE_LIBRTE_PMD_XENVIRT=n # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=y
lib/Makefile +1 -0
@@ -52,6 +52,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_VIRTIO_PMD) += librte_pmd_virtio DIRS-$(CONFIG_RTE_LIBRTE_VMXNET3_PMD) += librte_pmd_vmxnet3 DIRS-$(CONFIG_RTE_LIBRTE_PMD_XENVIRT) += librte_pmd_xenvirt DIRS-$(CONFIG_RTE_LIBRTE_VHOST) += librte_vhost +DIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += librte_pmd_null DIRS-$(CONFIG_RTE_LIBRTE_HASH) += librte_hash DIRS-$(CONFIG_RTE_LIBRTE_LPM) += librte_lpm DIRS-$(CONFIG_RTE_LIBRTE_ACL) += librte_acl
lib/librte_pmd_null/Makefile new file +58 -0
58 lines not on this page · raw message
lib/librte_pmd_null/rte_eth_null.c new file +474 -0
474 lines not on this page · raw message
Signature · 1 line
1.9.1
A message that is not in the archive (sent off-list or not yet received): 1418719167-8235-1-git-send-email-mukawa-AlSX/UN32fvPDbFq/[email protected]
Re: [PATCH v3] librte_pmd_null: Add null PMD
I've updated the null PMD to apply it to latest DPDK. Also I've sent a port hotplug patch for null PMD.
Thanks,
Tetsuya
Quoted 621 lines · Tetsuya Mukawa
'null PMD' is a driver of the virtual device particulary designed to measure performance of DPDK PMDs. When an application call rx, null PMD just allocates mbufs and returns those. Also tx, the PMD just frees mbufs.
The PMD has following options.
- size: specify packe size allocated by RX. Default packet size is 64.
- copy: specify 1 or 0 to enable or disable copy while RX and TX. Default value is 0(disbaled).
This option is used for emulating more realistic data transfer. Copy size is equal to packet size.To use the PMD, enable
CONFIG_RTE_BUILD_SHARED_LIBin config file. Then compile the PMD as shared library. The library can be linked using '-d' option when an application invokes.Here is an example.
$ sudo ./testpmd -c f -n 4 -d librte_pmd_null.so \ --vdev 'eth_null0' --vdev 'eth_null1' -- -iIf testpmd is compiled with
CONFIG_RTE_BUILD_SHARED_LIB, it may need to specify more libraries using '-d' option.--- config/common_bsdapp | 5 + config/common_linuxapp | 5 + lib/Makefile | 1 + lib/librte_pmd_null/Makefile | 58 +++++ lib/librte_pmd_null/rte_eth_null.c | 474 +++++++++++++++++++++++++++++++++++++ 5 files changed, 543 insertions(+) create mode 100644 lib/librte_pmd_null/Makefile create mode 100644 lib/librte_pmd_null/rte_eth_null.cconfig/common_bsdapp +5
-0@@ -224,6 +224,11 @@ CONFIG_RTE_LIBRTE_PMD_PCAP=y CONFIG_RTE_LIBRTE_PMD_BOND=y # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=yconfig/common_linuxapp +5
-0@@ -232,6 +232,11 @@ CONFIG_RTE_LIBRTE_PMD_AF_PACKET=y CONFIG_RTE_LIBRTE_PMD_XENVIRT=n # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=ylib/Makefile +1
-0@@ -52,6 +52,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_VIRTIO_PMD) += librte_pmd_virtio DIRS-$(CONFIG_RTE_LIBRTE_VMXNET3_PMD) += librte_pmd_vmxnet3 DIRS-$(CONFIG_RTE_LIBRTE_PMD_XENVIRT) += librte_pmd_xenvirt DIRS-$(CONFIG_RTE_LIBRTE_VHOST) += librte_vhost +DIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += librte_pmd_null DIRS-$(CONFIG_RTE_LIBRTE_HASH) += librte_hash DIRS-$(CONFIG_RTE_LIBRTE_LPM) += librte_lpm DIRS-$(CONFIG_RTE_LIBRTE_ACL) += librte_acllib/librte_pmd_null/Makefile new file +58
-0@@ -0,0 +1,58 @@ +# BSD LICENSE +# +# Copyright (C) IGEL Co.,Ltd. +# 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 IGEL Co.,Ltd. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +include $(RTE_SDK)/mk/rte.vars.mk + +# +# library name +# +LIB = librte_pmd_null.a + +CFLAGS += -O3 +CFLAGS += $(WERROR_FLAGS) + +# +# all source are stored in SRCS-y +# +SRCS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += rte_eth_null.c + +# +# Export include files +# +SYMLINK-y-include += + +# this lib depends upon: +DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += lib/librte_mbuf +DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += lib/librte_ether +DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += lib/librte_malloc +DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += lib/librte_kvargs + +include $(RTE_SDK)/mk/rte.lib.mklib/librte_pmd_null/rte_eth_null.c new file +474
-0@@ -0,0 +1,474 @@ +/*- +* BSD LICENSE +* +* Copyright (C) IGEL Co.,Ltd. +* 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 IGEL Co.,Ltd. nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include <rte_mbuf.h> +#include <rte_ethdev.h> +#include <rte_malloc.h> +#include <rte_memcpy.h> +#include <rte_dev.h> +#include <rte_kvargs.h> + +#define ETH_NULL_PACKET_SIZE_ARG "size" +#define ETH_NULL_PACKET_COPY_ARG "copy" + +static unsigned default_packet_size =64 ; +static unsigned default_packet_copy; + +static const char const *valid_arguments[] = { +ETH_NULL_PACKET_SIZE_ARG , +ETH_NULL_PACKET_COPY_ARG , +NULL +}; + +struct pmd_internals ; + +struct null_queue { +struct pmd_internals *internals; + +struct rte_mempool *mb_pool; +struct rte_mbuf *dummy_packet; + +rte_atomic64_t rx_pkts; +rte_atomic64_t tx_pkts; +rte_atomic64_t err_pkts; +}; + +struct pmd_internals { +unsigned packet_size; +unsigned packet_copy; +unsigned numa_node; + +unsigned nb_rx_queues; +unsigned nb_tx_queues; + +struct null_queue rx_null_queues[1 ]; +struct null_queue tx_null_queues[1 ]; +}; + + +static struct ether_addr eth_addr = { .addr_bytes = {0 } }; +static const char *drivername ="Null PMD" ; +static struct rte_eth_link pmd_link = { + .link_speed =10000 , + .link_duplex =ETH_LINK_FULL_DUPLEX , + .link_status =0 +}; + +static uint16_t +eth_null_rx (void *q,struct rte_mbuf **bufs,uint16_t nb_bufs) +{ +int i; +struct null_queue *h = q; +unsigned packet_size = h->internals->packet_size; + +for (i =0 ; i < nb_bufs; i++) { + bufs[i] =rte_pktmbuf_alloc (h->mb_pool); +if (!bufs[i]) +break ; + bufs[i]->data_len = (uint16_t )packet_size; + bufs[i]->pkt_len = packet_size; + bufs[i]->nb_segs =1 ; + bufs[i]->next =NULL ; + } + +rte_atomic64_add (&(h->rx_pkts), i); + +return i; +} + +static uint16_t +eth_null_copy_rx (void *q,struct rte_mbuf **bufs,uint16_t nb_bufs) +{ +int i; +struct null_queue *h = q; +unsigned packet_size = h->internals->packet_size; + +for (i =0 ; i < nb_bufs; i++) { + bufs[i] =rte_pktmbuf_alloc (h->mb_pool); +if (!bufs[i]) +break ; + rte_memcpy(rte_pktmbuf_mtod(bufs[i], void *), h->dummy_packet, + packet_size); + bufs[i]->data_len = (uint16_t )packet_size; + bufs[i]->pkt_len = packet_size; + bufs[i]->nb_segs =1 ; + bufs[i]->next =NULL ; + } + +rte_atomic64_add (&(h->rx_pkts), i); + +return i; +} + +static uint16_t +eth_null_tx(void *q, struct rte_mbuf **bufs __rte_unused, uint16_t nb_bufs) +{ +int i; +struct null_queue *h = q; + +for (i =0 ; i < nb_bufs; i++) +rte_pktmbuf_free (bufs[i]); + +rte_atomic64_add (&(h->tx_pkts), i); + +return i; +} + +static uint16_t +eth_null_copy_tx (void *q,struct rte_mbuf **bufs,uint16_t nb_bufs) +{ +int i; +struct null_queue *h = q; +unsigned packet_size = h->internals->packet_size; + +for (i =0 ; i < nb_bufs; i++) { + rte_memcpy(h->dummy_packet, rte_pktmbuf_mtod(bufs[i], void *), + packet_size); +rte_pktmbuf_free (bufs[i]); + } + +rte_atomic64_add (&(h->tx_pkts), i); + +return i; +} + +static int +eth_dev_configure(struct rte_eth_dev *dev __rte_unused) { return 0; } + +static int +eth_dev_start (struct rte_eth_dev *dev) +{ + dev->data->dev_link.link_status =1 ; +return 0 ; +} + +static void +eth_dev_stop (struct rte_eth_dev *dev) +{ + dev->data->dev_link.link_status =0 ; +} + +static int +eth_rx_queue_setup (struct rte_eth_dev *dev,uint16_t rx_queue_id, + uint16_t nb_rx_desc __rte_unused, + unsigned int socket_id __rte_unused, + const struct rte_eth_rxconf *rx_conf __rte_unused, + struct rte_mempool *mb_pool __rte_unused) +{ +struct rte_mbuf *dummy_packet; +struct pmd_internals *internals = dev->data->dev_private; +unsigned packet_size = internals->packet_size; + +if (rx_queue_id !=0 ) +return -ENODEV ; + + internals->rx_null_queues[rx_queue_id].mb_pool = mb_pool; + dev->data->rx_queues[rx_queue_id] = + &internals->rx_null_queues[rx_queue_id]; + dummy_packet =rte_zmalloc_socket (NULL , + packet_size,0 , internals->numa_node); +if (dummy_packet ==NULL ) +return -ENOMEM ; + + internals->rx_null_queues[rx_queue_id].internals = internals; + internals->rx_null_queues[rx_queue_id].dummy_packet = dummy_packet; + +return 0 ; +} + +static int +eth_tx_queue_setup (struct rte_eth_dev *dev,uint16_t tx_queue_id, + uint16_t nb_tx_desc __rte_unused, + unsigned int socket_id __rte_unused, + const struct rte_eth_txconf *tx_conf __rte_unused) +{ +struct rte_mbuf *dummy_packet; +struct pmd_internals *internals = dev->data->dev_private; +unsigned packet_size = internals->packet_size; + +if (tx_queue_id !=0 ) +return -ENODEV ; + + dev->data->tx_queues[tx_queue_id] = + &internals->tx_null_queues[tx_queue_id]; + dummy_packet =rte_zmalloc_socket (NULL , + packet_size,0 , internals->numa_node); +if (dummy_packet ==NULL ) +return -ENOMEM ; + + internals->tx_null_queues[tx_queue_id].internals = internals; + internals->tx_null_queues[tx_queue_id].dummy_packet = dummy_packet; + +return 0 ; +} + + +static void +eth_dev_info (struct rte_eth_dev *dev, +struct rte_eth_dev_info *dev_info) +{ +struct pmd_internals *internals = dev->data->dev_private; + + dev_info->driver_name = drivername; + dev_info->max_mac_addrs =1 ; + dev_info->max_rx_pktlen = (uint32_t )-1 ; + dev_info->max_rx_queues = (uint16_t )internals->nb_rx_queues; + dev_info->max_tx_queues = (uint16_t )internals->nb_tx_queues; + dev_info->min_rx_bufsize =0 ; + dev_info->pci_dev =NULL ; +} + +static void +eth_stats_get (struct rte_eth_dev *dev,struct rte_eth_stats *igb_stats) +{ +unsigned i; +unsigned long rx_total =0 , tx_total =0 , tx_err_total =0 ; +const struct pmd_internals *internal = dev->data->dev_private; + +memset (igb_stats,0 ,sizeof (*igb_stats)); +for (i =0 ; i <RTE_ETHDEV_QUEUE_STAT_CNTRS && + i < internal->nb_rx_queues; i++) { + igb_stats->q_ipackets[i] = + internal->rx_null_queues[i].rx_pkts.cnt; + rx_total += igb_stats->q_ipackets[i]; + } + +for (i =0 ; i <RTE_ETHDEV_QUEUE_STAT_CNTRS && + i < internal->nb_tx_queues; i++) { + igb_stats->q_opackets[i] = + internal->tx_null_queues[i].tx_pkts.cnt; + igb_stats->q_errors[i] = + internal->tx_null_queues[i].err_pkts.cnt; + tx_total += igb_stats->q_opackets[i]; + tx_err_total += igb_stats->q_errors[i]; + } + + igb_stats->ipackets = rx_total; + igb_stats->opackets = tx_total; + igb_stats->oerrors = tx_err_total; +} + +static void +eth_stats_reset (struct rte_eth_dev *dev) +{ +unsigned i; +struct pmd_internals *internal = dev->data->dev_private; + +for (i =0 ; i < internal->nb_rx_queues; i++) + internal->rx_null_queues[i].rx_pkts.cnt =0 ; +for (i =0 ; i < internal->nb_tx_queues; i++) { + internal->tx_null_queues[i].tx_pkts.cnt =0 ; + internal->tx_null_queues[i].err_pkts.cnt =0 ; + } +} + +static void +eth_queue_release(void *q __rte_unused) { ; } +static int +eth_link_update(struct rte_eth_dev *dev __rte_unused, + int wait_to_complete __rte_unused) { return 0; } + +static struct eth_dev_ops ops = { + .dev_start = eth_dev_start, + .dev_stop = eth_dev_stop, + .dev_configure = eth_dev_configure, + .dev_infos_get = eth_dev_info, + .rx_queue_setup = eth_rx_queue_setup, + .tx_queue_setup = eth_tx_queue_setup, + .rx_queue_release = eth_queue_release, + .tx_queue_release = eth_queue_release, + .link_update = eth_link_update, + .stats_get = eth_stats_get, + .stats_reset = eth_stats_reset, +}; + +static int +eth_dev_null_create(const char *name __rte_unused, +const unsigned numa_node, +unsigned packet_size, +unsigned packet_copy) +{ +const unsigned nb_rx_queues =1 ; +const unsigned nb_tx_queues =1 ; +struct rte_eth_dev_data *data =NULL ; +struct rte_pci_device *pci_dev =NULL ; +struct pmd_internals *internals =NULL ; +struct rte_eth_dev *eth_dev =NULL ; + +RTE_LOG (INFO ,PMD ,"Creating null ethdev on numa socket %u\n" , + numa_node); + +/* now do all data allocation - for eth_dev structure, dummy pci driver +* and internal (private) data +*/ + data =rte_zmalloc_socket (name,sizeof (*data),0 , numa_node); +if (data ==NULL ) + goto error; + + pci_dev =rte_zmalloc_socket (name,sizeof (*pci_dev),0 , numa_node); +if (pci_dev ==NULL ) + goto error; + + internals =rte_zmalloc_socket (name,sizeof (*internals),0 , numa_node); +if (internals ==NULL ) + goto error; + +/* reserve an ethdev entry */ + eth_dev =rte_eth_dev_allocate (name); +if (eth_dev ==NULL ) + goto error; + +/* now put it all together +* - store queue data in internals, +* - store numa_node info in pci_driver +* - point eth_dev_data to internals and pci_driver +* - and point eth_dev structure to new eth_dev_data structure +*/ +/* NOTE: we'll replace the data element, of originally allocated eth_dev +* so the nulls are local per-process */ + + internals->nb_rx_queues = nb_rx_queues; + internals->nb_tx_queues = nb_tx_queues; + internals->packet_size = packet_size; + internals->packet_copy = packet_copy; + internals->numa_node = numa_node; + + pci_dev->numa_node = numa_node; + + data->dev_private = internals; + data->port_id = eth_dev->data->port_id; + data->nb_rx_queues = (uint16_t )nb_rx_queues; + data->nb_tx_queues = (uint16_t )nb_tx_queues; + data->dev_link = pmd_link; + data->mac_addrs = ð_addr; + + eth_dev->data = data; + eth_dev->dev_ops = &ops; + eth_dev->pci_dev = pci_dev; + +/* finally assign rx and tx ops */ +if (packet_copy) { + eth_dev->rx_pkt_burst = eth_null_copy_rx; + eth_dev->tx_pkt_burst = eth_null_copy_tx; + }else { + eth_dev->rx_pkt_burst = eth_null_rx; + eth_dev->tx_pkt_burst = eth_null_tx; + } + +return 0 ; + +error: +if (data) +rte_free (data); +if (pci_dev) +rte_free (pci_dev); +if (internals) +rte_free (internals); +return -1 ; +} + +static inline int +get_packet_size_arg(const char *key __rte_unused, +const char *value,void *extra_args) +{ +const char *a = value; +unsigned *packet_size = extra_args; + + *packet_size = (unsigned )strtoul (a,NULL ,0 ); +if (*packet_size ==UINT_MAX ) +return -1 ; + +return 0 ; +} + +static inline int +get_packet_copy_arg(const char *key __rte_unused, +const char *value,void *extra_args) +{ +const char *a = value; +unsigned *packet_copy = extra_args; + + *packet_copy = (unsigned )strtoul (a,NULL ,0 ); +if (*packet_copy ==UINT_MAX ) +return -1 ; + +return 0 ; +} + +static int +rte_pmd_null_devinit (const char *name,const char *params) +{ +unsigned numa_node; +unsigned packet_size = default_packet_size; +unsigned packet_copy = default_packet_copy; +struct rte_kvargs *kvlist; +int ret; + +RTE_LOG (INFO ,PMD ,"Initializing pmd_null for %s\n" , name); + + numa_node =rte_socket_id (); + + kvlist =rte_kvargs_parse (params, valid_arguments); +if (kvlist ==NULL ) +return -1 ; + +if (rte_kvargs_count (kvlist,ETH_NULL_PACKET_SIZE_ARG ) ==1 ) { + + ret =rte_kvargs_process (kvlist,ETH_NULL_PACKET_SIZE_ARG , + &get_packet_size_arg, &packet_size); +if (ret <0 ) +return -1 ; + } + +if (rte_kvargs_count (kvlist,ETH_NULL_PACKET_COPY_ARG ) ==1 ) { + + ret =rte_kvargs_process (kvlist,ETH_NULL_PACKET_COPY_ARG , + &get_packet_copy_arg, &packet_copy); +if (ret <0 ) +return -1 ; + } + +RTE_LOG (INFO ,PMD ,"Configure pmd_null: packet size is %d, " +"packet copy is %s\n" , packet_size, + packet_copy ?"enabled" :"disabled" ); + +return eth_dev_null_create (name, numa_node, packet_size, packet_copy); +} + +static struct rte_driver pmd_null_drv = { + .name ="eth_null" , + .type =PMD_VDEV , + .init = rte_pmd_null_devinit, +}; + +PMD_REGISTER_DRIVER (pmd_null_drv);
A message that is not in the archive (sent off-list or not yet received): 548FF0EA.3010501-AlSX/UN32fvPDbFq/[email protected]
Re: [PATCH v3] librte_pmd_null: Add null PMD
2014-12-16 17:44, Tetsuya Mukawa:
Quoted 2 lines
I've updated the null PMD to apply it to latest DPDK. Also I've sent a port hotplug patch for null PMD.
As explained in http://dpdk.org/dev#send, do not hesitate to use --annotate to add this kind of changelog when sending patch. Example:
http://dpdk.org/ml/archives/dev/2014-December/010060.html
Thanks
Signature · 1 line
Thomas
Re: [PATCH v3] librte_pmd_null: Add null PMD
Quoted 9 lines · Thomas Monjalon
2014-12-16 17:44, Tetsuya Mukawa:
Quoted 2 lines
I've updated the null PMD to apply it to latest DPDK. Also I've sent a port hotplug patch for null PMD.
As explained in http://dpdk.org/dev#send, do not hesitate to use --annotate to add this kind of changelog when sending patch. Example:
http://dpdk.org/ml/archives/dev/2014-December/010060.htmlThanks
Thanks, I will do it next time.
Regards,
Tetsuya
PATCH v4 1/2 librte_pmd_null: Add null PMD
In reply to a message not in the archive'null PMD' is a driver of the virtual device particulary designed to measure performance of DPDK PMDs. When an application call rx, null PMD just allocates mbufs and returns those. Also tx, the PMD just frees mbufs.
The PMD has following options.
- size: specify packe size allocated by RX. Default packet size is 64.
- copy: specify 1 or 0 to enable or disable copy while RX and TX. Default value is 0(disbaled).
This option is used for emulating more realistic data transfer. Copy size is equal to packet size.
To use the PMD, enable CONFIG_RTE_BUILD_SHARED_LIB in config file. Then compile the PMD as shared library. The library can be linked using '-d' option when an application invokes.
Here is an example.
$ sudo ./testpmd -c f -n 4 -d librte_pmd_null.so \ --vdev 'eth_null0' --vdev 'eth_null1' -- -i --no-flush-rx
If testpmd is compiled with CONFIG_RTE_BUILD_SHARED_LIB, it may need to specify more libraries using '-d' option.
v4:
- Fix memory leak.
(Thanks to Iremonger, Bernard)
--- config/common_bsdapp | 5 + config/common_linuxapp | 5 + lib/Makefile | 1 + lib/librte_pmd_null/Makefile | 58 +++++ lib/librte_pmd_null/rte_eth_null.c | 485 +++++++++++++++++++++++++++++++++++++ 5 files changed, 554 insertions(+) create mode 100644 lib/librte_pmd_null/Makefile create mode 100644 lib/librte_pmd_null/rte_eth_null.c
config/common_bsdapp +5 -0
@@ -224,6 +224,11 @@ CONFIG_RTE_LIBRTE_PMD_PCAP=y CONFIG_RTE_LIBRTE_PMD_BOND=y # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=y
config/common_linuxapp +5 -0
@@ -237,6 +237,11 @@ CONFIG_RTE_LIBRTE_PMD_AF_PACKET=y CONFIG_RTE_LIBRTE_PMD_XENVIRT=n # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=y
lib/Makefile +1 -0
@@ -52,6 +52,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_VIRTIO_PMD) += librte_pmd_virtio DIRS-$(CONFIG_RTE_LIBRTE_VMXNET3_PMD) += librte_pmd_vmxnet3 DIRS-$(CONFIG_RTE_LIBRTE_PMD_XENVIRT) += librte_pmd_xenvirt DIRS-$(CONFIG_RTE_LIBRTE_VHOST) += librte_vhost +DIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += librte_pmd_null DIRS-$(CONFIG_RTE_LIBRTE_HASH) += librte_hash DIRS-$(CONFIG_RTE_LIBRTE_LPM) += librte_lpm DIRS-$(CONFIG_RTE_LIBRTE_ACL) += librte_acl
lib/librte_pmd_null/Makefile new file +58 -0
58 lines not on this page · raw message
lib/librte_pmd_null/rte_eth_null.c new file +485 -0
485 lines not on this page · raw message
Signature · 1 line
1.9.1
A message that is not in the archive (sent off-list or not yet received): 1421722821-18158-1-git-send-email-mukawa-AlSX/UN32fvPDbFq/[email protected]
PATCH v4 2/2 librte_pmd_null: Support port hotplug function
This patch adds port hotplug support to null PMD.
v4:
- Fix commit title.
--- lib/librte_pmd_null/rte_eth_null.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+)
lib/librte_pmd_null/rte_eth_null.c +32 -0
@@ -292,6 +292,13 @@ eth_stats_reset(struct rte_eth_dev *dev) } } +static struct eth_driver rte_null_pmd = { + .pci_drv = { + .name ="rte_null_pmd" , + .drv_flags =RTE_PCI_DRV_DETACHABLE , + }, +}; +static void eth_queue_release (void *q) {
@@ -382,10 +389,12 @@ eth_dev_null_create(const char *name __rte_unused, data->nb_tx_queues = (uint16_t )nb_tx_queues; data->dev_link = pmd_link; data->mac_addrs = ð_addr; +strncpy (data->name, eth_dev->data->name,strlen (eth_dev->data->name)); eth_dev->data = data; eth_dev->dev_ops = &ops; eth_dev->pci_dev = pci_dev; + eth_dev->driver = &rte_null_pmd;/* finally assign rx and tx ops */ if (packet_copy) {
@@ -476,10 +485,33 @@ rte_pmd_null_devinit(const char *name, const char *params)return eth_dev_null_create (name, numa_node, packet_size, packet_copy); } +static int +rte_pmd_null_devuninit(const char *name, const char *params __rte_unused) +{ +struct rte_eth_dev *eth_dev =NULL ; + +RTE_LOG (INFO ,PMD ,"Closing null ethdev on numa socket %u\n" , +rte_socket_id ()); + +/* reserve an ethdev entry */ + eth_dev =rte_eth_dev_allocated (name); +if (eth_dev ==NULL ) +return -1 ; + +rte_free (eth_dev->data->dev_private); +rte_free (eth_dev->data); +rte_free (eth_dev->pci_dev); + +rte_eth_dev_free (name); + +return 0 ; +} +static struct rte_driver pmd_null_drv = { .name ="eth_null" , .type =PMD_VDEV , .init = rte_pmd_null_devinit, + .uninit = rte_pmd_null_devuninit, };PMD_REGISTER_DRIVER (pmd_null_drv);
Signature · 1 line
1.9.1
A message that is not in the archive (sent off-list or not yet received): 1421722821-18158-2-git-send-email-mukawa-AlSX/UN32fvPDbFq/[email protected]
PATCH v6 1/2 librte_pmd_null: Add null PMD
'null PMD' is a driver of the virtual device particulary designed to measure performance of DPDK PMDs. When an application call rx, null PMD just allocates mbufs and returns those. Also tx, the PMD just frees mbufs.
The PMD has following options.
- size: specify packe size allocated by RX. Default packet size is 64.
- copy: specify 1 or 0 to enable or disable copy while RX and TX. Default value is 0(disbaled).
This option is used for emulating more realistic data transfer. Copy size is equal to packet size.
To use the PMD, enable CONFIG_RTE_BUILD_SHARED_LIB in config file. Then compile the PMD as shared library. The library can be linked using '-d' option when an application invokes.
Here is an example.
$ sudo ./testpmd -c f -n 4 -d librte_pmd_null.so \ --vdev 'eth_null0' --vdev 'eth_null1' -- -i --no-flush-rx
If testpmd is compiled with CONFIG_RTE_BUILD_SHARED_LIB, it may need to specify more libraries using '-d' option.
v4:
- Fix memory leak.
(Thanks to Iremonger, Bernard)
--- config/common_bsdapp | 5 + config/common_linuxapp | 5 + lib/Makefile | 1 + lib/librte_pmd_null/Makefile | 58 +++++ lib/librte_pmd_null/rte_eth_null.c | 485 +++++++++++++++++++++++++++++++++++++ 5 files changed, 554 insertions(+) create mode 100644 lib/librte_pmd_null/Makefile create mode 100644 lib/librte_pmd_null/rte_eth_null.c
config/common_bsdapp +5 -0
@@ -224,6 +224,11 @@ CONFIG_RTE_LIBRTE_PMD_PCAP=y CONFIG_RTE_LIBRTE_PMD_BOND=y # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=y
config/common_linuxapp +5 -0
@@ -237,6 +237,11 @@ CONFIG_RTE_LIBRTE_PMD_AF_PACKET=y CONFIG_RTE_LIBRTE_PMD_XENVIRT=n # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=y
lib/Makefile +1 -0
@@ -52,6 +52,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_VIRTIO_PMD) += librte_pmd_virtio DIRS-$(CONFIG_RTE_LIBRTE_VMXNET3_PMD) += librte_pmd_vmxnet3 DIRS-$(CONFIG_RTE_LIBRTE_PMD_XENVIRT) += librte_pmd_xenvirt DIRS-$(CONFIG_RTE_LIBRTE_VHOST) += librte_vhost +DIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += librte_pmd_null DIRS-$(CONFIG_RTE_LIBRTE_HASH) += librte_hash DIRS-$(CONFIG_RTE_LIBRTE_LPM) += librte_lpm DIRS-$(CONFIG_RTE_LIBRTE_ACL) += librte_acl
lib/librte_pmd_null/Makefile new file +58 -0
58 lines not on this page · raw message
lib/librte_pmd_null/rte_eth_null.c new file +485 -0
485 lines not on this page · raw message
Signature · 1 line
1.9.1
A message that is not in the archive (sent off-list or not yet received): 1423197495-1758-1-git-send-email-mukawa-AlSX/UN32fvPDbFq/[email protected]
PATCH v6 2/2 librte_pmd_null: Support port hotplug function
This patch adds port hotplug support to null PMD.
v6:
- Fix a paramter of rte_eth_dev_free().
v4:
- Fix commit title.
--- lib/librte_pmd_null/rte_eth_null.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+)
lib/librte_pmd_null/rte_eth_null.c +32 -0
@@ -292,6 +292,13 @@ eth_stats_reset(struct rte_eth_dev *dev) } } +static struct eth_driver rte_null_pmd = { + .pci_drv = { + .name ="rte_null_pmd" , + .drv_flags =RTE_PCI_DRV_DETACHABLE , + }, +}; +static void eth_queue_release (void *q) {
@@ -382,10 +389,12 @@ eth_dev_null_create(const char *name __rte_unused, data->nb_tx_queues = (uint16_t )nb_tx_queues; data->dev_link = pmd_link; data->mac_addrs = ð_addr; +strncpy (data->name, eth_dev->data->name,strlen (eth_dev->data->name)); eth_dev->data = data; eth_dev->dev_ops = &ops; eth_dev->pci_dev = pci_dev; + eth_dev->driver = &rte_null_pmd;/* finally assign rx and tx ops */ if (packet_copy) {
@@ -476,10 +485,33 @@ rte_pmd_null_devinit(const char *name, const char *params)return eth_dev_null_create (name, numa_node, packet_size, packet_copy); } +static int +rte_pmd_null_devuninit(const char *name, const char *params __rte_unused) +{ +struct rte_eth_dev *eth_dev =NULL ; + +RTE_LOG (INFO ,PMD ,"Closing null ethdev on numa socket %u\n" , +rte_socket_id ()); + +/* reserve an ethdev entry */ + eth_dev =rte_eth_dev_allocated (name); +if (eth_dev ==NULL ) +return -1 ; + +rte_free (eth_dev->data->dev_private); +rte_free (eth_dev->data); +rte_free (eth_dev->pci_dev); + +rte_eth_dev_free (eth_dev); + +return 0 ; +} +static struct rte_driver pmd_null_drv = { .name ="eth_null" , .type =PMD_VDEV , .init = rte_pmd_null_devinit, + .uninit = rte_pmd_null_devuninit, };PMD_REGISTER_DRIVER (pmd_null_drv);
Signature · 1 line
1.9.1
A message that is not in the archive (sent off-list or not yet received): 1423197495-1758-2-git-send-email-mukawa-AlSX/UN32fvPDbFq/[email protected]
Re: [PATCH v6 2/2] librte_pmd_null: Support port hotplug function
Hi Tetsuya,
My comments are inline below.
Quoted 51 lines
-----Original Message-----
From: Tetsuya Mukawa [mailto:mukawa-AlSX/UN32fvPDbFq/[email protected]]
Sent: Friday, February 6, 2015 4:38 AM
To: [email protected]
Cc: Iremonger, Bernard; Tetsuya Mukawa
Subject: [PATCH v6 2/2]librte_pmd_null: Support port hotplug functionThis patch adds port hotplug support to null PMD.
v6:
- Fix a paramter ofrte_eth_dev_free().
v4:
- Fix commit title.--- lib/librte_pmd_null/rte_eth_null.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+)lib/librte_pmd_null/rte_eth_null.c +9
-0@@ -292,6 +292,13 @@ eth_stats_reset(struct rte_eth_dev *dev) } } +static struct eth_driver rte_null_pmd = { + .pci_drv = { + .name ="rte_null_pmd" , + .drv_flags =RTE_PCI_DRV_DETACHABLE , + }, +}; +static void eth_queue_release (void *q) {@@ -382,10 +389,12 @@ eth_dev_null_create(const char *name __rte_unused, data->nb_tx_queues = (uint16_t )nb_tx_queues; data->dev_link = pmd_link; data->mac_addrs = ð_addr; +strncpy (data->name, eth_dev->data->name,strlen (eth_dev->data->name)); eth_dev->data = data; eth_dev->dev_ops = &ops; eth_dev->pci_dev = pci_dev; + eth_dev->driver = &rte_null_pmd;/* finally assign rx and tx ops */ if (packet_copy) {
lib/librte_pmd_null/rte_eth_null.c rte_pmd_null_devinit(const char *name, const char *params) · line 490
Quoted 6 lines
lib/librte_pmd_null/rte_eth_null.c +4
-0@@ -476,10 +485,33 @@ rte_pmd_null_devinit(const char *name, const char *params)return eth_dev_null_create (name, numa_node, packet_size, packet_copy); } +static int +rte_pmd_null_devuninit(const char *name, const char *params +__rte_unused) { +struct rte_eth_dev *eth_dev =NULL ;
Input parameter name should be checked.
Quoted 28 lines
lib/librte_pmd_null/rte_eth_null.c +19
-1+ +RTE_LOG (INFO ,PMD ,"Closing null ethdev on numa socket %u\n" , +rte_socket_id ()); + +/* reserve an ethdev entry */ + eth_dev =rte_eth_dev_allocated (name); +if (eth_dev ==NULL ) +return -1 ; + +rte_free (eth_dev->data->dev_private); +rte_free (eth_dev->data); +rte_free (eth_dev->pci_dev); + +rte_eth_dev_free (eth_dev); + +return 0 ; +} +static struct rte_driver pmd_null_drv = { .name ="eth_null" , .type =PMD_VDEV , .init = rte_pmd_null_devinit, + .uninit = rte_pmd_null_devuninit, };PMD_REGISTER_DRIVER (pmd_null_drv); --1.9.1
Re: [PATCH v6 1/2] librte_pmd_null: Add null PMD
In reply to a message not in the archiveHi Tetsuya,
My comments are in line below.
Quoted 235 lines
-----Original Message-----
From: Tetsuya Mukawa [mailto:mukawa-AlSX/UN32fvPDbFq/[email protected]]
Sent: Friday, February 6, 2015 4:38 AM
To: [email protected]
Cc: Iremonger, Bernard; Tetsuya Mukawa
Subject: [PATCH v6 1/2]librte_pmd_null: Add null PMD'null PMD' is a driver of the virtual device particulary designed to measure performance of DPDK PMDs. When an application call rx, null PMD just allocates mbufs and returns those. Also tx, the PMD just frees mbufs.
The PMD has following options.
- size: specify packe size allocated by RX. Default packet size is 64.
- copy: specify 1 or 0 to enable or disable copy while RX and TX. Default value is 0(disbaled).
This option is used for emulating more realistic data transfer. Copy size is equal to packet size.To use the PMD, enable
CONFIG_RTE_BUILD_SHARED_LIBin config file. Then compile the PMD as shared library. The library can be linked using '-d'
option when an application invokes.Here is an example.
$ sudo ./testpmd -c f -n 4 -d librte_pmd_null.so \ --vdev 'eth_null0' --vdev 'eth_null1' -- -i --no-flush-rxIf testpmd is compiled with
CONFIG_RTE_BUILD_SHARED_LIB, it may need to specify more libraries using '-d' option.v4:
- Fix memory leak.
(Thanks to Iremonger, Bernard)--- config/common_bsdapp | 5 + config/common_linuxapp | 5 + lib/Makefile | 1 + lib/librte_pmd_null/Makefile | 58 +++++ lib/librte_pmd_null/rte_eth_null.c | 485 +++++++++++++++++++++++++++++++++++++ 5 files changed, 554 insertions(+) create mode 100644 lib/librte_pmd_null/Makefile create mode 100644
lib/librte_pmd_null/rte_eth_null.cconfig/common_bsdapp +5
-0@@ -224,6 +224,11 @@ CONFIG_RTE_LIBRTE_PMD_PCAP=y CONFIG_RTE_LIBRTE_PMD_BOND=y # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function #
CONFIG_RTE_PMD_PACKET_PREFETCH=ydiff --git a/config/common_linuxapp b/config/common_linuxapp index 27d05be..456fbfe 100644config/common_linuxapp +0
-0@@ -237,6 +237,11 @@ CONFIG_RTE_LIBRTE_PMD_AF_PACKET=y
CONFIG_RTE_LIBRTE_PMD_XENVIRT=n#
config/common_linuxapp +5
-0+# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function #
CONFIG_RTE_PMD_PACKET_PREFETCH=ydiff --git a/lib/Makefile b/lib/Makefile index 0ffc982..d246c53 100644lib/Makefile +1
-0@@ -52,6 +52,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_VIRTIO_PMD) += librte_pmd_virtio DIRS-$(CONFIG_RTE_LIBRTE_VMXNET3_PMD) += librte_pmd_vmxnet3 DIRS-$(CONFIG_RTE_LIBRTE_PMD_XENVIRT) += librte_pmd_xenvirt DIRS-$(CONFIG_RTE_LIBRTE_VHOST) += librte_vhost +DIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += librte_pmd_null DIRS-$(CONFIG_RTE_LIBRTE_HASH) += librte_hash DIRS-$(CONFIG_RTE_LIBRTE_LPM) += librte_lpm DIRS-$(CONFIG_RTE_LIBRTE_ACL) += librte_acl diff --git a/lib/librte_pmd_null/Makefileb/lib/librte_pmd_null/Makefile new file mode 100644 index 0000000..0ec4db9
lib/librte_pmd_null/Makefile new file +58
-0@@ -0,0 +1,58 @@ +# BSD LICENSE +# +# Copyright (C) IGEL Co.,Ltd. +# 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 IGEL Co.,Ltd. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +include $(RTE_SDK)/mk/rte.vars.mk + +# +# library name +# +LIB = librte_pmd_null.a + +CFLAGS += -O3 +CFLAGS += $(WERROR_FLAGS) + +# +# all source are stored in SRCS-y +# +SRCS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += rte_eth_null.c + +# +# Export include files +# +SYMLINK-y-include += + +# this lib depends upon: +DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += lib/librte_mbuf +DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += lib/librte_ether +DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += lib/librte_malloc +DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += lib/librte_kvargs + +include $(RTE_SDK)/mk/rte.lib.mklib/librte_pmd_null/rte_eth_null.c new file +85
-0@@ -0,0 +1,485 @@ +/*- +* BSD LICENSE +* +* Copyright (C) IGEL Co.,Ltd. +* 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 IGEL Co.,Ltd. nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include <rte_mbuf.h> +#include <rte_ethdev.h> +#include <rte_malloc.h> +#include <rte_memcpy.h> +#include <rte_dev.h> +#include <rte_kvargs.h> + +#define ETH_NULL_PACKET_SIZE_ARG "size" +#define ETH_NULL_PACKET_COPY_ARG "copy" + +static unsigned default_packet_size =64 ;static unsigned +default_packet_copy; + +static const char const *valid_arguments[] = { +ETH_NULL_PACKET_SIZE_ARG , +ETH_NULL_PACKET_COPY_ARG , +NULL +}; + +struct pmd_internals ; + +struct null_queue { +struct pmd_internals *internals; + +struct rte_mempool *mb_pool; +struct rte_mbuf *dummy_packet; + +rte_atomic64_t rx_pkts; +rte_atomic64_t tx_pkts; +rte_atomic64_t err_pkts; +}; + +struct pmd_internals { +unsigned packet_size; +unsigned packet_copy; +unsigned numa_node; + +unsigned nb_rx_queues; +unsigned nb_tx_queues; + +struct null_queue rx_null_queues[1 ]; +struct null_queue tx_null_queues[1 ]; +}; + + +static struct ether_addr eth_addr = { .addr_bytes = {0 } };static const +char *drivername ="Null PMD" ;static struct rte_eth_link pmd_link = { + .link_speed =10000 , + .link_duplex =ETH_LINK_FULL_DUPLEX , + .link_status =0 +}; +
lib/librte_pmd_null/rte_eth_null.c line 95
Quoted 10 lines
lib/librte_pmd_null/rte_eth_null.c new file +10
-0+static uint16_t +eth_null_rx (void *q,struct rte_mbuf **bufs,uint16_t nb_bufs) { +int i; +struct null_queue *h = q; +unsigned packet_size = h->internals->packet_size; + +for (i =0 ; i < nb_bufs; i++) { + bufs[i] =rte_pktmbuf_alloc (h->mb_pool); +if (!bufs[i]) +break ;
Should the code return an error here rather than break?
Quoted 11 lines
lib/librte_pmd_null/rte_eth_null.c new file +11
-0+ bufs[i]->data_len = (uint16_t )packet_size; + bufs[i]->pkt_len = packet_size; + bufs[i]->nb_segs =1 ; + bufs[i]->next =NULL ; + } + +rte_atomic64_add (&(h->rx_pkts), i); + +return i; +} +
lib/librte_pmd_null/rte_eth_null.c line 119
Quoted 10 lines
lib/librte_pmd_null/rte_eth_null.c new file +10
-0+static uint16_t +eth_null_copy_rx (void *q,struct rte_mbuf **bufs,uint16_t nb_bufs) { +int i; +struct null_queue *h = q; +unsigned packet_size = h->internals->packet_size; + +for (i =0 ; i < nb_bufs; i++) { + bufs[i] =rte_pktmbuf_alloc (h->mb_pool); +if (!bufs[i]) +break ;
Should the code return an error here rather than break?
Quoted 8 lines
lib/librte_pmd_null/rte_eth_null.c new file +8
-0+ rte_memcpy(rte_pktmbuf_mtod(bufs[i], void *), h->dummy_packet, + packet_size); + bufs[i]->data_len = (uint16_t )packet_size; + bufs[i]->pkt_len = packet_size; + bufs[i]->nb_segs =1 ; + bufs[i]->next =NULL ; + } +
lib/librte_pmd_null/rte_eth_null.c line 137
Quoted 10 lines
lib/librte_pmd_null/rte_eth_null.c new file +10
-0+rte_atomic64_add (&(h->rx_pkts), i); + +return i; +} + +static uint16_t +eth_null_tx(void *q, struct rte_mbuf **bufs __rte_unused, uint16_t +nb_bufs) { +int i; +struct null_queue *h = q;
Input parameters q and bufs should be checked.
Quoted 4 lines
lib/librte_pmd_null/rte_eth_null.c new file +4
-0+ +for (i =0 ; i < nb_bufs; i++) +rte_pktmbuf_free (bufs[i]); +
lib/librte_pmd_null/rte_eth_null.c line 152
Quoted 10 lines
lib/librte_pmd_null/rte_eth_null.c new file +10
-0+rte_atomic64_add (&(h->tx_pkts), i); + +return i; +} + +static uint16_t +eth_null_copy_tx (void *q,struct rte_mbuf **bufs,uint16_t nb_bufs) { +int i; +struct null_queue *h = q; +unsigned packet_size = h->internals->packet_size;
Input parameters q and bufs should be checked.
Quoted 8 lines
lib/librte_pmd_null/rte_eth_null.c new file +8
-0+ +for (i =0 ; i < nb_bufs; i++) { + rte_memcpy(h->dummy_packet, rte_pktmbuf_mtod(bufs[i], void *), + packet_size); +rte_pktmbuf_free (bufs[i]); + } + +rte_atomic64_add (&(h->tx_pkts), i);
lib/librte_pmd_null/rte_eth_null.c line 170
Quoted 10 lines
lib/librte_pmd_null/rte_eth_null.c new file +10
-0+ +return i; +} + +static int +eth_dev_configure(struct rte_eth_dev *dev __rte_unused) { return 0; } + +static int +eth_dev_start (struct rte_eth_dev *dev) +{
Input parameter dev should be checked.
lib/librte_pmd_null/rte_eth_null.c line 177
Quoted 7 lines
lib/librte_pmd_null/rte_eth_null.c new file +7
-0+ dev->data->dev_link.link_status =1 ; +return 0 ; +} + +static void +eth_dev_stop (struct rte_eth_dev *dev) +{
Input parameter dev should be checked.
lib/librte_pmd_null/rte_eth_null.c line 191
Quoted 13 lines
lib/librte_pmd_null/rte_eth_null.c new file +13
-0+ dev->data->dev_link.link_status =0 ; +} + +static int +eth_rx_queue_setup (struct rte_eth_dev *dev,uint16_t rx_queue_id, + uint16_t nb_rx_desc __rte_unused, + unsigned int socket_id __rte_unused, + const struct rte_eth_rxconf *rx_conf __rte_unused, + struct rte_mempool *mb_pool __rte_unused) { +struct rte_mbuf *dummy_packet; +struct pmd_internals *internals = dev->data->dev_private; +unsigned packet_size = internals->packet_size; +
Input parameter dev should be checked.
Quoted 16 lines
lib/librte_pmd_null/rte_eth_null.c new file +16
-0+if (rx_queue_id !=0 ) +return -ENODEV ; + + internals->rx_null_queues[rx_queue_id].mb_pool = mb_pool; + dev->data->rx_queues[rx_queue_id] = + &internals->rx_null_queues[rx_queue_id]; + dummy_packet =rte_zmalloc_socket (NULL , + packet_size,0 , internals->numa_node); +if (dummy_packet ==NULL ) +return -ENOMEM ; + + internals->rx_null_queues[rx_queue_id].internals = internals; + internals->rx_null_queues[rx_queue_id].dummy_packet = dummy_packet; + +return 0 ; +}
lib/librte_pmd_null/rte_eth_null.c line 218
Quoted 10 lines
lib/librte_pmd_null/rte_eth_null.c new file +10
-0+ +static int +eth_tx_queue_setup (struct rte_eth_dev *dev,uint16_t tx_queue_id, + uint16_t nb_tx_desc __rte_unused, + unsigned int socket_id __rte_unused, + const struct rte_eth_txconf *tx_conf __rte_unused) { +struct rte_mbuf *dummy_packet; +struct pmd_internals *internals = dev->data->dev_private; +unsigned packet_size = internals->packet_size; +
Input parameter dev should be checked.
Quoted 12 lines
lib/librte_pmd_null/rte_eth_null.c new file +12
-0+if (tx_queue_id !=0 ) +return -ENODEV ; + + dev->data->tx_queues[tx_queue_id] = + &internals->tx_null_queues[tx_queue_id]; + dummy_packet =rte_zmalloc_socket (NULL , + packet_size,0 , internals->numa_node); +if (dummy_packet ==NULL ) +return -ENOMEM ; + + internals->tx_null_queues[tx_queue_id].internals = internals; + internals->tx_null_queues[tx_queue_id].dummy_packet = dummy_packet;
lib/librte_pmd_null/rte_eth_null.c line 240
Quoted 10 lines
lib/librte_pmd_null/rte_eth_null.c new file +10
-0+ +return 0 ; +} + + +static void +eth_dev_info (struct rte_eth_dev *dev, +struct rte_eth_dev_info *dev_info) +{ +struct pmd_internals *internals = dev->data->dev_private;
Input parameters dev and dev_info should be checked.
Quoted 6 lines
lib/librte_pmd_null/rte_eth_null.c new file +6
-0+ + dev_info->driver_name = drivername; + dev_info->max_mac_addrs =1 ; + dev_info->max_rx_pktlen = (uint32_t )-1 ; + dev_info->max_rx_queues = (uint16_t )internals->nb_rx_queues; + dev_info->max_tx_queues = (uint16_t )internals->nb_tx_queues;
lib/librte_pmd_null/rte_eth_null.c line 256
Quoted 10 lines
lib/librte_pmd_null/rte_eth_null.c new file +10
-0+ dev_info->min_rx_bufsize =0 ; + dev_info->pci_dev =NULL ; +} + +static void +eth_stats_get (struct rte_eth_dev *dev,struct rte_eth_stats *igb_stats) +{ +unsigned i; +unsigned long rx_total =0 , tx_total =0 , tx_err_total =0 ; +const struct pmd_internals *internal = dev->data->dev_private;
Input parameters dev and igb_stats should be checked.
Quoted 18 lines
lib/librte_pmd_null/rte_eth_null.c new file +18
-0+ +memset (igb_stats,0 ,sizeof (*igb_stats)); +for (i =0 ; i <RTE_ETHDEV_QUEUE_STAT_CNTRS && + i < internal->nb_rx_queues; i++) { + igb_stats->q_ipackets[i] = + internal->rx_null_queues[i].rx_pkts.cnt; + rx_total += igb_stats->q_ipackets[i]; + } + +for (i =0 ; i <RTE_ETHDEV_QUEUE_STAT_CNTRS && + i < internal->nb_tx_queues; i++) { + igb_stats->q_opackets[i] = + internal->tx_null_queues[i].tx_pkts.cnt; + igb_stats->q_errors[i] = + internal->tx_null_queues[i].err_pkts.cnt; + tx_total += igb_stats->q_opackets[i]; + tx_err_total += igb_stats->q_errors[i]; + }
lib/librte_pmd_null/rte_eth_null.c line 285
Quoted 10 lines
lib/librte_pmd_null/rte_eth_null.c new file +10
-0+ + igb_stats->ipackets = rx_total; + igb_stats->opackets = tx_total; + igb_stats->oerrors = tx_err_total; +} + +static void +eth_stats_reset (struct rte_eth_dev *dev) { +unsigned i; +struct pmd_internals *internal = dev->data->dev_private;
Input parameter dev should be checked.
Quoted 121 lines
lib/librte_pmd_null/rte_eth_null.c new file +121
-0+ +for (i =0 ; i < internal->nb_rx_queues; i++) + internal->rx_null_queues[i].rx_pkts.cnt =0 ; +for (i =0 ; i < internal->nb_tx_queues; i++) { + internal->tx_null_queues[i].tx_pkts.cnt =0 ; + internal->tx_null_queues[i].err_pkts.cnt =0 ; + } +} + +static void +eth_queue_release (void *q) +{ +struct null_queue *nq; + +if (q ==NULL ) +return ; + + nq = q; +if (nq->dummy_packet) +rte_free (nq->dummy_packet); +} + +static int +eth_link_update(struct rte_eth_dev *dev __rte_unused, + int wait_to_complete __rte_unused) { return 0; } + +static struct eth_dev_ops ops = { + .dev_start = eth_dev_start, + .dev_stop = eth_dev_stop, + .dev_configure = eth_dev_configure, + .dev_infos_get = eth_dev_info, + .rx_queue_setup = eth_rx_queue_setup, + .tx_queue_setup = eth_tx_queue_setup, + .rx_queue_release = eth_queue_release, + .tx_queue_release = eth_queue_release, + .link_update = eth_link_update, + .stats_get = eth_stats_get, + .stats_reset = eth_stats_reset, +}; + +static int +eth_dev_null_create(const char *name __rte_unused, +const unsigned numa_node, +unsigned packet_size, +unsigned packet_copy) +{ +const unsigned nb_rx_queues =1 ; +const unsigned nb_tx_queues =1 ; +struct rte_eth_dev_data *data =NULL ; +struct rte_pci_device *pci_dev =NULL ; +struct pmd_internals *internals =NULL ; +struct rte_eth_dev *eth_dev =NULL ; + +RTE_LOG (INFO ,PMD ,"Creating null ethdev on numa socket %u\n" , + numa_node); + +/* now do all data allocation - for eth_dev structure, dummy pci driver +* and internal (private) data +*/ + data =rte_zmalloc_socket (name,sizeof (*data),0 , numa_node); +if (data ==NULL ) + goto error; + + pci_dev =rte_zmalloc_socket (name,sizeof (*pci_dev),0 , numa_node); +if (pci_dev ==NULL ) + goto error; + + internals =rte_zmalloc_socket (name,sizeof (*internals),0 , numa_node); +if (internals ==NULL ) + goto error; + +/* reserve an ethdev entry */ + eth_dev =rte_eth_dev_allocate (name,RTE_ETH_DEV_VIRTUAL ); +if (eth_dev ==NULL ) + goto error; + +/* now put it all together +* - store queue data in internals, +* - store numa_node info in pci_driver +* - point eth_dev_data to internals and pci_driver +* - and point eth_dev structure to new eth_dev_data structure +*/ +/* NOTE: we'll replace the data element, of originally allocated eth_dev +* so the nulls are local per-process */ + + internals->nb_rx_queues = nb_rx_queues; + internals->nb_tx_queues = nb_tx_queues; + internals->packet_size = packet_size; + internals->packet_copy = packet_copy; + internals->numa_node = numa_node; + + pci_dev->numa_node = numa_node; + + data->dev_private = internals; + data->port_id = eth_dev->data->port_id; + data->nb_rx_queues = (uint16_t )nb_rx_queues; + data->nb_tx_queues = (uint16_t )nb_tx_queues; + data->dev_link = pmd_link; + data->mac_addrs = ð_addr; + + eth_dev->data = data; + eth_dev->dev_ops = &ops; + eth_dev->pci_dev = pci_dev; + +/* finally assign rx and tx ops */ +if (packet_copy) { + eth_dev->rx_pkt_burst = eth_null_copy_rx; + eth_dev->tx_pkt_burst = eth_null_copy_tx; + }else { + eth_dev->rx_pkt_burst = eth_null_rx; + eth_dev->tx_pkt_burst = eth_null_tx; + } + +return 0 ; + +error: +if (data) +rte_free (data); +if (pci_dev) +rte_free (pci_dev); +if (internals)
lib/librte_pmd_null/rte_eth_null.c line 416
Quoted 10 lines
lib/librte_pmd_null/rte_eth_null.c new file +10
-0+rte_free (internals); +return -1 ; +} + +static inline int +get_packet_size_arg(const char *key __rte_unused, +const char *value,void *extra_args) +{ +const char *a = value; +unsigned *packet_size = extra_args;
Parameters value and extra_args should be checked.
Quoted 4 lines
lib/librte_pmd_null/rte_eth_null.c new file +4
-0+ + *packet_size = (unsigned )strtoul (a,NULL ,0 ); +if (*packet_size ==UINT_MAX ) +return -1 ;
lib/librte_pmd_null/rte_eth_null.c line 430
Quoted 10 lines
lib/librte_pmd_null/rte_eth_null.c new file +10
-0+ +return 0 ; +} + +static inline int +get_packet_copy_arg(const char *key __rte_unused, +const char *value,void *extra_args) +{ +const char *a = value; +unsigned *packet_copy = extra_args;
Parameters value and extra_args should be checked.
Quoted 6 lines
lib/librte_pmd_null/rte_eth_null.c new file +6
-0+ + *packet_copy = (unsigned )strtoul (a,NULL ,0 ); +if (*packet_copy ==UINT_MAX ) +return -1 ; + +return 0 ;
lib/librte_pmd_null/rte_eth_null.c line 447
Quoted 10 lines
lib/librte_pmd_null/rte_eth_null.c new file +10
-0+} + +static int +rte_pmd_null_devinit (const char *name,const char *params) { +unsigned numa_node; +unsigned packet_size = default_packet_size; +unsigned packet_copy = default_packet_copy; +struct rte_kvargs *kvlist; +int ret; +
Input parameters name and params should be checked.
Quoted 39 lines
lib/librte_pmd_null/rte_eth_null.c new file +38
-1+RTE_LOG (INFO ,PMD ,"Initializing pmd_null for %s\n" , name); + + numa_node =rte_socket_id (); + + kvlist =rte_kvargs_parse (params, valid_arguments); +if (kvlist ==NULL ) +return -1 ; + +if (rte_kvargs_count (kvlist,ETH_NULL_PACKET_SIZE_ARG ) ==1 ) { + + ret =rte_kvargs_process (kvlist,ETH_NULL_PACKET_SIZE_ARG , + &get_packet_size_arg, &packet_size); +if (ret <0 ) +return -1 ; + } + +if (rte_kvargs_count (kvlist,ETH_NULL_PACKET_COPY_ARG ) ==1 ) { + + ret =rte_kvargs_process (kvlist,ETH_NULL_PACKET_COPY_ARG , + &get_packet_copy_arg, &packet_copy); +if (ret <0 ) +return -1 ; + } + +RTE_LOG (INFO ,PMD ,"Configure pmd_null: packet size is %d, " +"packet copy is %s\n" , packet_size, + packet_copy ?"enabled" :"disabled" ); + +return eth_dev_null_create (name, numa_node, packet_size, packet_copy); +} + +static struct rte_driver pmd_null_drv = { + .name ="eth_null" , + .type =PMD_VDEV , + .init = rte_pmd_null_devinit, +}; + +PMD_REGISTER_DRIVER (pmd_null_drv); --
Quoted 1 line
1.9.1
Regards,
Bernard.
A message that is not in the archive (sent off-list or not yet received): 8CEF83825BEC744B83065625E567D7C2049DDE4A-kPTMFJFq+rEMvF1YICWikbfspsVTdybXVpNB7YpNyf8@public.gmane.org
Re: [PATCH v6 1/2] librte_pmd_null: Add null PMD
Quoted 242 lines · Bernard
Hi Tetsuya,
My comments are in line below.
Quoted 238 lines
-----Original Message-----
From: Tetsuya Mukawa [mailto:mukawa-AlSX/UN32fvPDbFq/[email protected]]
Sent: Friday, February 6, 2015 4:38 AM
To: [email protected]
Cc: Iremonger, Bernard; Tetsuya Mukawa
Subject: [PATCH v6 1/2]librte_pmd_null: Add null PMD'null PMD' is a driver of the virtual device particulary designed to measure performance of DPDK PMDs. When an application call rx, null PMD just allocates mbufs and returns those. Also tx, the PMD just frees mbufs.
The PMD has following options.
- size: specify packe size allocated by RX. Default packet size is 64.
- copy: specify 1 or 0 to enable or disable copy while RX and TX. Default value is 0(disbaled).
This option is used for emulating more realistic data transfer. Copy size is equal to packet size.To use the PMD, enable
CONFIG_RTE_BUILD_SHARED_LIBin config file. Then compile the PMD as shared library. The library can be linked using '-d'
option when an application invokes.Here is an example.
$ sudo ./testpmd -c f -n 4 -d librte_pmd_null.so \ --vdev 'eth_null0' --vdev 'eth_null1' -- -i --no-flush-rxIf testpmd is compiled with
CONFIG_RTE_BUILD_SHARED_LIB, it may need to specify more libraries using '-d' option.v4:
- Fix memory leak.
(Thanks to Iremonger, Bernard)--- config/common_bsdapp | 5 + config/common_linuxapp | 5 + lib/Makefile | 1 + lib/librte_pmd_null/Makefile | 58 +++++ lib/librte_pmd_null/rte_eth_null.c | 485 +++++++++++++++++++++++++++++++++++++ 5 files changed, 554 insertions(+) create mode 100644 lib/librte_pmd_null/Makefile create mode 100644
lib/librte_pmd_null/rte_eth_null.cconfig/common_bsdapp +5
-0@@ -224,6 +224,11 @@ CONFIG_RTE_LIBRTE_PMD_PCAP=y CONFIG_RTE_LIBRTE_PMD_BOND=y # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function #
CONFIG_RTE_PMD_PACKET_PREFETCH=ydiff --git a/config/common_linuxapp b/config/common_linuxapp index 27d05be..456fbfe 100644config/common_linuxapp +0
-0@@ -237,6 +237,11 @@ CONFIG_RTE_LIBRTE_PMD_AF_PACKET=y
CONFIG_RTE_LIBRTE_PMD_XENVIRT=n#
config/common_linuxapp +5
-0+# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function #
CONFIG_RTE_PMD_PACKET_PREFETCH=ydiff --git a/lib/Makefile b/lib/Makefile index 0ffc982..d246c53 100644lib/Makefile +1
-0@@ -52,6 +52,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_VIRTIO_PMD) += librte_pmd_virtio DIRS-$(CONFIG_RTE_LIBRTE_VMXNET3_PMD) += librte_pmd_vmxnet3 DIRS-$(CONFIG_RTE_LIBRTE_PMD_XENVIRT) += librte_pmd_xenvirt DIRS-$(CONFIG_RTE_LIBRTE_VHOST) += librte_vhost +DIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += librte_pmd_null DIRS-$(CONFIG_RTE_LIBRTE_HASH) += librte_hash DIRS-$(CONFIG_RTE_LIBRTE_LPM) += librte_lpm DIRS-$(CONFIG_RTE_LIBRTE_ACL) += librte_acl diff --git a/lib/librte_pmd_null/Makefileb/lib/librte_pmd_null/Makefile new file mode 100644 index 0000000..0ec4db9
lib/librte_pmd_null/Makefile new file +58
-0@@ -0,0 +1,58 @@ +# BSD LICENSE +# +# Copyright (C) IGEL Co.,Ltd. +# 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 IGEL Co.,Ltd. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +include $(RTE_SDK)/mk/rte.vars.mk + +# +# library name +# +LIB = librte_pmd_null.a + +CFLAGS += -O3 +CFLAGS += $(WERROR_FLAGS) + +# +# all source are stored in SRCS-y +# +SRCS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += rte_eth_null.c + +# +# Export include files +# +SYMLINK-y-include += + +# this lib depends upon: +DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += lib/librte_mbuf +DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += lib/librte_ether +DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += lib/librte_malloc +DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += lib/librte_kvargs + +include $(RTE_SDK)/mk/rte.lib.mklib/librte_pmd_null/rte_eth_null.c new file +88
-0@@ -0,0 +1,485 @@ +/*- +* BSD LICENSE +* +* Copyright (C) IGEL Co.,Ltd. +* 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 IGEL Co.,Ltd. nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include <rte_mbuf.h> +#include <rte_ethdev.h> +#include <rte_malloc.h> +#include <rte_memcpy.h> +#include <rte_dev.h> +#include <rte_kvargs.h> + +#define ETH_NULL_PACKET_SIZE_ARG "size" +#define ETH_NULL_PACKET_COPY_ARG "copy" + +static unsigned default_packet_size =64 ;static unsigned +default_packet_copy; + +static const char const *valid_arguments[] = { +ETH_NULL_PACKET_SIZE_ARG , +ETH_NULL_PACKET_COPY_ARG , +NULL +}; + +struct pmd_internals ; + +struct null_queue { +struct pmd_internals *internals; + +struct rte_mempool *mb_pool; +struct rte_mbuf *dummy_packet; + +rte_atomic64_t rx_pkts; +rte_atomic64_t tx_pkts; +rte_atomic64_t err_pkts; +}; + +struct pmd_internals { +unsigned packet_size; +unsigned packet_copy; +unsigned numa_node; + +unsigned nb_rx_queues; +unsigned nb_tx_queues; + +struct null_queue rx_null_queues[1 ]; +struct null_queue tx_null_queues[1 ]; +}; + + +static struct ether_addr eth_addr = { .addr_bytes = {0 } };static const +char *drivername ="Null PMD" ;static struct rte_eth_link pmd_link = { + .link_speed =10000 , + .link_duplex =ETH_LINK_FULL_DUPLEX , + .link_status =0 +}; + +static uint16_t +eth_null_rx (void *q,struct rte_mbuf **bufs,uint16_t nb_bufs) { +int i;
Quoted 8 lines
lib/librte_pmd_null/rte_eth_null.c line 97
Quoted 7 lines
lib/librte_pmd_null/rte_eth_null.c new file +7
-0+struct null_queue *h = q; +unsigned packet_size = h->internals->packet_size; + +for (i =0 ; i < nb_bufs; i++) { + bufs[i] =rte_pktmbuf_alloc (h->mb_pool); +if (!bufs[i]) +break ;Should the code return an error here rather than break?
Hi Bernard,
I appreciate for your comments.
I guess it's not an error.
The function should return the number of packets actually allocated.
Quoted 15 lines
Quoted 15 lines
lib/librte_pmd_null/rte_eth_null.c new file +14
-0+ bufs[i]->data_len = (uint16_t )packet_size; + bufs[i]->pkt_len = packet_size; + bufs[i]->nb_segs =1 ; + bufs[i]->next =NULL ; + } + +rte_atomic64_add (&(h->rx_pkts), i); + +return i; +} + +static uint16_t +eth_null_copy_rx (void *q,struct rte_mbuf **bufs,uint16_t nb_bufs) { +int i;
Quoted 8 lines
lib/librte_pmd_null/rte_eth_null.c line 97
Quoted 7 lines
lib/librte_pmd_null/rte_eth_null.c new file +7
-0+struct null_queue *h = q; +unsigned packet_size = h->internals->packet_size; + +for (i =0 ; i < nb_bufs; i++) { + bufs[i] =rte_pktmbuf_alloc (h->mb_pool); +if (!bufs[i]) +break ;Should the code return an error here rather than break?
Also, the function should return the number of packets actually sent.
Quoted 11 lines
Quoted 11 lines
lib/librte_pmd_null/rte_eth_null.c new file +11
-0+ rte_memcpy(rte_pktmbuf_mtod(bufs[i], void *), h->dummy_packet, + packet_size); + bufs[i]->data_len = (uint16_t )packet_size; + bufs[i]->pkt_len = packet_size; + bufs[i]->nb_segs =1 ; + bufs[i]->next =NULL ; + } + +rte_atomic64_add (&(h->rx_pkts), i); + +return i;
Quoted 8 lines
lib/librte_pmd_null/rte_eth_null.c line 113
Quoted 7 lines
lib/librte_pmd_null/rte_eth_null.c new file +7
-0+} + +static uint16_t +eth_null_tx(void *q, struct rte_mbuf **bufs __rte_unused, uint16_t +nb_bufs) { +int i; +struct null_queue *h = q;Input parameters q and bufs should be checked.
Thanks, I will fix these suggestions.
Regards,
Tetsuya
Quoted 371 lines
Quoted 4 lines
lib/librte_pmd_null/rte_eth_null.c new file +4
-0+ +for (i =0 ; i < nb_bufs; i++) +rte_pktmbuf_free (bufs[i]); +lib/librte_pmd_null/rte_eth_null.c line 152
Quoted 10 lines
lib/librte_pmd_null/rte_eth_null.c new file +10
-0+rte_atomic64_add (&(h->tx_pkts), i); + +return i; +} + +static uint16_t +eth_null_copy_tx (void *q,struct rte_mbuf **bufs,uint16_t nb_bufs) { +int i; +struct null_queue *h = q; +unsigned packet_size = h->internals->packet_size;Input parameters q and bufs should be checked.
Quoted 8 lines
lib/librte_pmd_null/rte_eth_null.c new file +8
-0+ +for (i =0 ; i < nb_bufs; i++) { + rte_memcpy(h->dummy_packet, rte_pktmbuf_mtod(bufs[i], void *), + packet_size); +rte_pktmbuf_free (bufs[i]); + } + +rte_atomic64_add (&(h->tx_pkts), i);lib/librte_pmd_null/rte_eth_null.c line 170
Quoted 10 lines
lib/librte_pmd_null/rte_eth_null.c new file +10
-0+ +return i; +} + +static int +eth_dev_configure(struct rte_eth_dev *dev __rte_unused) { return 0; } + +static int +eth_dev_start (struct rte_eth_dev *dev) +{Input parameter dev should be checked.
lib/librte_pmd_null/rte_eth_null.c line 177
Quoted 7 lines
lib/librte_pmd_null/rte_eth_null.c new file +7
-0+ dev->data->dev_link.link_status =1 ; +return 0 ; +} + +static void +eth_dev_stop (struct rte_eth_dev *dev) +{Input parameter dev should be checked.
lib/librte_pmd_null/rte_eth_null.c line 191
Quoted 13 lines
lib/librte_pmd_null/rte_eth_null.c new file +13
-0+ dev->data->dev_link.link_status =0 ; +} + +static int +eth_rx_queue_setup (struct rte_eth_dev *dev,uint16_t rx_queue_id, + uint16_t nb_rx_desc __rte_unused, + unsigned int socket_id __rte_unused, + const struct rte_eth_rxconf *rx_conf __rte_unused, + struct rte_mempool *mb_pool __rte_unused) { +struct rte_mbuf *dummy_packet; +struct pmd_internals *internals = dev->data->dev_private; +unsigned packet_size = internals->packet_size; +Input parameter dev should be checked.
Quoted 16 lines
lib/librte_pmd_null/rte_eth_null.c new file +16
-0+if (rx_queue_id !=0 ) +return -ENODEV ; + + internals->rx_null_queues[rx_queue_id].mb_pool = mb_pool; + dev->data->rx_queues[rx_queue_id] = + &internals->rx_null_queues[rx_queue_id]; + dummy_packet =rte_zmalloc_socket (NULL , + packet_size,0 , internals->numa_node); +if (dummy_packet ==NULL ) +return -ENOMEM ; + + internals->rx_null_queues[rx_queue_id].internals = internals; + internals->rx_null_queues[rx_queue_id].dummy_packet = dummy_packet; + +return 0 ; +}lib/librte_pmd_null/rte_eth_null.c line 218
Quoted 10 lines
lib/librte_pmd_null/rte_eth_null.c new file +10
-0+ +static int +eth_tx_queue_setup (struct rte_eth_dev *dev,uint16_t tx_queue_id, + uint16_t nb_tx_desc __rte_unused, + unsigned int socket_id __rte_unused, + const struct rte_eth_txconf *tx_conf __rte_unused) { +struct rte_mbuf *dummy_packet; +struct pmd_internals *internals = dev->data->dev_private; +unsigned packet_size = internals->packet_size; +Input parameter dev should be checked.
Quoted 12 lines
lib/librte_pmd_null/rte_eth_null.c new file +12
-0+if (tx_queue_id !=0 ) +return -ENODEV ; + + dev->data->tx_queues[tx_queue_id] = + &internals->tx_null_queues[tx_queue_id]; + dummy_packet =rte_zmalloc_socket (NULL , + packet_size,0 , internals->numa_node); +if (dummy_packet ==NULL ) +return -ENOMEM ; + + internals->tx_null_queues[tx_queue_id].internals = internals; + internals->tx_null_queues[tx_queue_id].dummy_packet = dummy_packet;lib/librte_pmd_null/rte_eth_null.c line 240
Quoted 10 lines
lib/librte_pmd_null/rte_eth_null.c new file +10
-0+ +return 0 ; +} + + +static void +eth_dev_info (struct rte_eth_dev *dev, +struct rte_eth_dev_info *dev_info) +{ +struct pmd_internals *internals = dev->data->dev_private;Input parameters dev and
dev_infoshould be checked.Quoted 6 lines
lib/librte_pmd_null/rte_eth_null.c new file +6
-0+ + dev_info->driver_name = drivername; + dev_info->max_mac_addrs =1 ; + dev_info->max_rx_pktlen = (uint32_t )-1 ; + dev_info->max_rx_queues = (uint16_t )internals->nb_rx_queues; + dev_info->max_tx_queues = (uint16_t )internals->nb_tx_queues;lib/librte_pmd_null/rte_eth_null.c line 256
Quoted 10 lines
lib/librte_pmd_null/rte_eth_null.c new file +10
-0+ dev_info->min_rx_bufsize =0 ; + dev_info->pci_dev =NULL ; +} + +static void +eth_stats_get (struct rte_eth_dev *dev,struct rte_eth_stats *igb_stats) +{ +unsigned i; +unsigned long rx_total =0 , tx_total =0 , tx_err_total =0 ; +const struct pmd_internals *internal = dev->data->dev_private;Input parameters dev and
igb_statsshould be checked.Quoted 18 lines
lib/librte_pmd_null/rte_eth_null.c new file +18
-0+ +memset (igb_stats,0 ,sizeof (*igb_stats)); +for (i =0 ; i <RTE_ETHDEV_QUEUE_STAT_CNTRS && + i < internal->nb_rx_queues; i++) { + igb_stats->q_ipackets[i] = + internal->rx_null_queues[i].rx_pkts.cnt; + rx_total += igb_stats->q_ipackets[i]; + } + +for (i =0 ; i <RTE_ETHDEV_QUEUE_STAT_CNTRS && + i < internal->nb_tx_queues; i++) { + igb_stats->q_opackets[i] = + internal->tx_null_queues[i].tx_pkts.cnt; + igb_stats->q_errors[i] = + internal->tx_null_queues[i].err_pkts.cnt; + tx_total += igb_stats->q_opackets[i]; + tx_err_total += igb_stats->q_errors[i]; + }lib/librte_pmd_null/rte_eth_null.c line 285
Quoted 10 lines
lib/librte_pmd_null/rte_eth_null.c new file +10
-0+ + igb_stats->ipackets = rx_total; + igb_stats->opackets = tx_total; + igb_stats->oerrors = tx_err_total; +} + +static void +eth_stats_reset (struct rte_eth_dev *dev) { +unsigned i; +struct pmd_internals *internal = dev->data->dev_private;Input parameter dev should be checked.
Quoted 121 lines
lib/librte_pmd_null/rte_eth_null.c new file +121
-0+ +for (i =0 ; i < internal->nb_rx_queues; i++) + internal->rx_null_queues[i].rx_pkts.cnt =0 ; +for (i =0 ; i < internal->nb_tx_queues; i++) { + internal->tx_null_queues[i].tx_pkts.cnt =0 ; + internal->tx_null_queues[i].err_pkts.cnt =0 ; + } +} + +static void +eth_queue_release (void *q) +{ +struct null_queue *nq; + +if (q ==NULL ) +return ; + + nq = q; +if (nq->dummy_packet) +rte_free (nq->dummy_packet); +} + +static int +eth_link_update(struct rte_eth_dev *dev __rte_unused, + int wait_to_complete __rte_unused) { return 0; } + +static struct eth_dev_ops ops = { + .dev_start = eth_dev_start, + .dev_stop = eth_dev_stop, + .dev_configure = eth_dev_configure, + .dev_infos_get = eth_dev_info, + .rx_queue_setup = eth_rx_queue_setup, + .tx_queue_setup = eth_tx_queue_setup, + .rx_queue_release = eth_queue_release, + .tx_queue_release = eth_queue_release, + .link_update = eth_link_update, + .stats_get = eth_stats_get, + .stats_reset = eth_stats_reset, +}; + +static int +eth_dev_null_create(const char *name __rte_unused, +const unsigned numa_node, +unsigned packet_size, +unsigned packet_copy) +{ +const unsigned nb_rx_queues =1 ; +const unsigned nb_tx_queues =1 ; +struct rte_eth_dev_data *data =NULL ; +struct rte_pci_device *pci_dev =NULL ; +struct pmd_internals *internals =NULL ; +struct rte_eth_dev *eth_dev =NULL ; + +RTE_LOG (INFO ,PMD ,"Creating null ethdev on numa socket %u\n" , + numa_node); + +/* now do all data allocation - for eth_dev structure, dummy pci driver +* and internal (private) data +*/ + data =rte_zmalloc_socket (name,sizeof (*data),0 , numa_node); +if (data ==NULL ) + goto error; + + pci_dev =rte_zmalloc_socket (name,sizeof (*pci_dev),0 , numa_node); +if (pci_dev ==NULL ) + goto error; + + internals =rte_zmalloc_socket (name,sizeof (*internals),0 , numa_node); +if (internals ==NULL ) + goto error; + +/* reserve an ethdev entry */ + eth_dev =rte_eth_dev_allocate (name,RTE_ETH_DEV_VIRTUAL ); +if (eth_dev ==NULL ) + goto error; + +/* now put it all together +* - store queue data in internals, +* - store numa_node info in pci_driver +* - point eth_dev_data to internals and pci_driver +* - and point eth_dev structure to new eth_dev_data structure +*/ +/* NOTE: we'll replace the data element, of originally allocated eth_dev +* so the nulls are local per-process */ + + internals->nb_rx_queues = nb_rx_queues; + internals->nb_tx_queues = nb_tx_queues; + internals->packet_size = packet_size; + internals->packet_copy = packet_copy; + internals->numa_node = numa_node; + + pci_dev->numa_node = numa_node; + + data->dev_private = internals; + data->port_id = eth_dev->data->port_id; + data->nb_rx_queues = (uint16_t )nb_rx_queues; + data->nb_tx_queues = (uint16_t )nb_tx_queues; + data->dev_link = pmd_link; + data->mac_addrs = ð_addr; + + eth_dev->data = data; + eth_dev->dev_ops = &ops; + eth_dev->pci_dev = pci_dev; + +/* finally assign rx and tx ops */ +if (packet_copy) { + eth_dev->rx_pkt_burst = eth_null_copy_rx; + eth_dev->tx_pkt_burst = eth_null_copy_tx; + }else { + eth_dev->rx_pkt_burst = eth_null_rx; + eth_dev->tx_pkt_burst = eth_null_tx; + } + +return 0 ; + +error: +if (data) +rte_free (data); +if (pci_dev) +rte_free (pci_dev); +if (internals)lib/librte_pmd_null/rte_eth_null.c line 416
Quoted 10 lines
lib/librte_pmd_null/rte_eth_null.c new file +10
-0+rte_free (internals); +return -1 ; +} + +static inline int +get_packet_size_arg(const char *key __rte_unused, +const char *value,void *extra_args) +{ +const char *a = value; +unsigned *packet_size = extra_args;Parameters value and
extra_argsshould be checked.Quoted 4 lines
lib/librte_pmd_null/rte_eth_null.c new file +4
-0+ + *packet_size = (unsigned )strtoul (a,NULL ,0 ); +if (*packet_size ==UINT_MAX ) +return -1 ;lib/librte_pmd_null/rte_eth_null.c line 430
Quoted 10 lines
lib/librte_pmd_null/rte_eth_null.c new file +10
-0+ +return 0 ; +} + +static inline int +get_packet_copy_arg(const char *key __rte_unused, +const char *value,void *extra_args) +{ +const char *a = value; +unsigned *packet_copy = extra_args;Parameters value and
extra_argsshould be checked.Quoted 6 lines
lib/librte_pmd_null/rte_eth_null.c new file +6
-0+ + *packet_copy = (unsigned )strtoul (a,NULL ,0 ); +if (*packet_copy ==UINT_MAX ) +return -1 ; + +return 0 ;lib/librte_pmd_null/rte_eth_null.c line 447
Quoted 10 lines
lib/librte_pmd_null/rte_eth_null.c new file +10
-0+} + +static int +rte_pmd_null_devinit (const char *name,const char *params) { +unsigned numa_node; +unsigned packet_size = default_packet_size; +unsigned packet_copy = default_packet_copy; +struct rte_kvargs *kvlist; +int ret; +Input parameters name and params should be checked.
Quoted 39 lines
lib/librte_pmd_null/rte_eth_null.c new file +38
-1+RTE_LOG (INFO ,PMD ,"Initializing pmd_null for %s\n" , name); + + numa_node =rte_socket_id (); + + kvlist =rte_kvargs_parse (params, valid_arguments); +if (kvlist ==NULL ) +return -1 ; + +if (rte_kvargs_count (kvlist,ETH_NULL_PACKET_SIZE_ARG ) ==1 ) { + + ret =rte_kvargs_process (kvlist,ETH_NULL_PACKET_SIZE_ARG , + &get_packet_size_arg, &packet_size); +if (ret <0 ) +return -1 ; + } + +if (rte_kvargs_count (kvlist,ETH_NULL_PACKET_COPY_ARG ) ==1 ) { + + ret =rte_kvargs_process (kvlist,ETH_NULL_PACKET_COPY_ARG , + &get_packet_copy_arg, &packet_copy); +if (ret <0 ) +return -1 ; + } + +RTE_LOG (INFO ,PMD ,"Configure pmd_null: packet size is %d, " +"packet copy is %s\n" , packet_size, + packet_copy ?"enabled" :"disabled" ); + +return eth_dev_null_create (name, numa_node, packet_size, packet_copy); +} + +static struct rte_driver pmd_null_drv = { + .name ="eth_null" , + .type =PMD_VDEV , + .init = rte_pmd_null_devinit, +}; + +PMD_REGISTER_DRIVER (pmd_null_drv); --Quoted 1 line
1.9.1
Regards,
Bernard.
PATCH v7 1/2 librte_pmd_null: Add Null PMD
In reply to a message not in the archiveNull PMD is a driver of the virtual device particularly designed to measure performance of DPDK PMDs. When an application call rx, Null PMD just allocates mbufs and returns those. Also tx, the PMD just frees mbufs.
The PMD has following options.
- size: specify packe size allocated by RX. Default packet size is 64.
- copy: specify 1 or 0 to enable or disable copy while RX and TX. Default value is 0(disabled).
This option is used for emulating more realistic data transfer. Copy size is equal to packet size.
To use the PMD, enable CONFIG_RTE_BUILD_SHARED_LIB in config file. Then compile the PMD as shared library. The library can be linked using '-d' option when an application invokes.
Here is an example.
$ sudo ./testpmd -c f -n 4 -d librte_pmd_null.so \ --vdev 'eth_null0' --vdev 'eth_null1' -- -i --no-flush-rx
If testpmd is compiled with CONFIG_RTE_BUILD_SHARED_LIB, it may need to specify more libraries using '-d' option.
v7:
- Add parameter checkings.
(Thanks to Iremonger, Bernard)
- Remove needless "__rte_unused".
v4:
- Fix memory leak.
(Thanks to Iremonger, Bernard)
--- config/common_bsdapp | 5 + config/common_linuxapp | 5 + lib/Makefile | 1 + lib/librte_pmd_null/Makefile | 58 ++++ lib/librte_pmd_null/rte_eth_null.c | 541 +++++++++++++++++++++++++++++++++++++ 5 files changed, 610 insertions(+) create mode 100644 lib/librte_pmd_null/Makefile create mode 100644 lib/librte_pmd_null/rte_eth_null.c
config/common_bsdapp +5 -0
@@ -224,6 +224,11 @@ CONFIG_RTE_LIBRTE_PMD_PCAP=y CONFIG_RTE_LIBRTE_PMD_BOND=y # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=y
config/common_linuxapp +5 -0
@@ -237,6 +237,11 @@ CONFIG_RTE_LIBRTE_PMD_AF_PACKET=y CONFIG_RTE_LIBRTE_PMD_XENVIRT=n # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=y
lib/Makefile +1 -0
@@ -53,6 +53,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_VIRTIO_PMD) += librte_pmd_virtio DIRS-$(CONFIG_RTE_LIBRTE_VMXNET3_PMD) += librte_pmd_vmxnet3 DIRS-$(CONFIG_RTE_LIBRTE_PMD_XENVIRT) += librte_pmd_xenvirt DIRS-$(CONFIG_RTE_LIBRTE_VHOST) += librte_vhost +DIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += librte_pmd_null DIRS-$(CONFIG_RTE_LIBRTE_HASH) += librte_hash DIRS-$(CONFIG_RTE_LIBRTE_LPM) += librte_lpm DIRS-$(CONFIG_RTE_LIBRTE_ACL) += librte_acl
lib/librte_pmd_null/Makefile new file +58 -0
58 lines not on this page · raw message
lib/librte_pmd_null/rte_eth_null.c new file +541 -0
541 lines not on this page · raw message
Signature · 1 line
1.9.1
A message that is not in the archive (sent off-list or not yet received): 1423709078-20999-1-git-send-email-mukawa-AlSX/UN32fvPDbFq/[email protected]
PATCH v7 2/2 librte_pmd_null: Support port hotplug function
This patch adds port hotplug support to Null PMD.
v7:
- Add parameter checkings.
(Thanks to Iremonger, Bernard)
v6:
- Fix a parameter of rte_eth_dev_free().
v4:
- Fix commit title.
--- lib/librte_pmd_null/rte_eth_null.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+)
lib/librte_pmd_null/rte_eth_null.c +35 -0
@@ -336,6 +336,13 @@ eth_stats_reset(struct rte_eth_dev *dev) } } +static struct eth_driver rte_null_pmd = { + .pci_drv = { + .name ="rte_null_pmd" , + .drv_flags =RTE_PCI_DRV_DETACHABLE , + }, +}; +static void eth_queue_release (void *q) {
@@ -429,10 +436,12 @@ eth_dev_null_create(const char *name, data->nb_tx_queues = (uint16_t )nb_tx_queues; data->dev_link = pmd_link; data->mac_addrs = ð_addr; +strncpy (data->name, eth_dev->data->name,strlen (eth_dev->data->name)); eth_dev->data = data; eth_dev->dev_ops = &ops; eth_dev->pci_dev = pci_dev; + eth_dev->driver = &rte_null_pmd;/* finally assign rx and tx ops */ if (packet_copy) {
@@ -532,10 +541,36 @@ rte_pmd_null_devinit(const char *name, const char *params)return eth_dev_null_create (name, numa_node, packet_size, packet_copy); } +static int +rte_pmd_null_devuninit(const char *name, const char *params __rte_unused) +{ +struct rte_eth_dev *eth_dev =NULL ; + +if (name ==NULL ) +return -EINVAL ; + +RTE_LOG (INFO ,PMD ,"Closing null ethdev on numa socket %u\n" , +rte_socket_id ()); + +/* reserve an ethdev entry */ + eth_dev =rte_eth_dev_allocated (name); +if (eth_dev ==NULL ) +return -1 ; + +rte_free (eth_dev->data->dev_private); +rte_free (eth_dev->data); +rte_free (eth_dev->pci_dev); + +rte_eth_dev_free (eth_dev); + +return 0 ; +} +static struct rte_driver pmd_null_drv = { .name ="eth_null" , .type =PMD_VDEV , .init = rte_pmd_null_devinit, + .uninit = rte_pmd_null_devuninit, };PMD_REGISTER_DRIVER (pmd_null_drv);
Signature · 1 line
1.9.1
PATCH v8 1/2 librte_pmd_null: Add Null PMD
In reply to a message not in the archiveNull PMD is a driver of the virtual device particularly designed to measure performance of DPDK PMDs. When an application call rx, Null PMD just allocates mbufs and returns those. Also tx, the PMD just frees mbufs.
The PMD has following options.
- size: specify packe size allocated by RX. Default packet size is 64.
- copy: specify 1 or 0 to enable or disable copy while RX and TX. Default value is 0(disabled).
This option is used for emulating more realistic data transfer. Copy size is equal to packet size.
To use the PMD, enable CONFIG_RTE_BUILD_SHARED_LIB in config file. Then compile the PMD as shared library. The library can be linked using '-d' option when an application invokes.
Here is an example.
$ sudo ./testpmd -c f -n 4 -d librte_pmd_null.so \ --vdev 'eth_null0' --vdev 'eth_null1' -- -i --no-flush-rx
If testpmd is compiled with CONFIG_RTE_BUILD_SHARED_LIB, it may need to specify more libraries using '-d' option.
v8:
- Fix Makefile and add version map file. (Thanks to Qiu, Michael and Iremonger, Bernard)
v7:
- Add parameter checkings.
(Thanks to Iremonger, Bernard)
- Remove needless "__rte_unused".
v4:
- Fix memory leak.
(Thanks to Iremonger, Bernard)
--- config/common_bsdapp | 5 + config/common_linuxapp | 5 + lib/Makefile | 1 + lib/librte_pmd_null/Makefile | 62 +++ lib/librte_pmd_null/rte_eth_null.c | 541 +++++++++++++++++++++++++++ lib/librte_pmd_null/rte_pmd_null_version.map | 4 + 6 files changed, 618 insertions(+) create mode 100644 lib/librte_pmd_null/Makefile create mode 100644 lib/librte_pmd_null/rte_eth_null.c create mode 100644 lib/librte_pmd_null/rte_pmd_null_version.map
config/common_bsdapp +5 -0
@@ -224,6 +224,11 @@ CONFIG_RTE_LIBRTE_PMD_PCAP=y CONFIG_RTE_LIBRTE_PMD_BOND=y # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=y
config/common_linuxapp +5 -0
@@ -237,6 +237,11 @@ CONFIG_RTE_LIBRTE_PMD_AF_PACKET=y CONFIG_RTE_LIBRTE_PMD_XENVIRT=n # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=y
lib/Makefile +1 -0
@@ -53,6 +53,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_VIRTIO_PMD) += librte_pmd_virtio DIRS-$(CONFIG_RTE_LIBRTE_VMXNET3_PMD) += librte_pmd_vmxnet3 DIRS-$(CONFIG_RTE_LIBRTE_PMD_XENVIRT) += librte_pmd_xenvirt DIRS-$(CONFIG_RTE_LIBRTE_VHOST) += librte_vhost +DIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += librte_pmd_null DIRS-$(CONFIG_RTE_LIBRTE_HASH) += librte_hash DIRS-$(CONFIG_RTE_LIBRTE_LPM) += librte_lpm DIRS-$(CONFIG_RTE_LIBRTE_ACL) += librte_acl
lib/librte_pmd_null/Makefile new file +62 -0
62 lines not on this page · raw message
lib/librte_pmd_null/rte_eth_null.c new file +541 -0
541 lines not on this page · raw message
lib/librte_pmd_null/rte_pmd_null_version.map new file +4 -0
@@ -0,0 +1,4 @@ +DPDK_2.0 { + + local: *; +};
Signature · 1 line
1.9.1
A message that is not in the archive (sent off-list or not yet received): 1424060349-23693-1-git-send-email-mukawa-AlSX/UN32fvPDbFq/[email protected]
PATCH v8 2/2 librte_pmd_null: Support port hotplug function
This patch adds port hotplug support to Null PMD.
v7:
- Add parameter checkings.
(Thanks to Iremonger, Bernard)
v6:
- Fix a parameter of rte_eth_dev_free().
v4:
- Fix commit title.
--- lib/librte_pmd_null/rte_eth_null.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+)
lib/librte_pmd_null/rte_eth_null.c +35 -0
@@ -336,6 +336,13 @@ eth_stats_reset(struct rte_eth_dev *dev) } } +static struct eth_driver rte_null_pmd = { + .pci_drv = { + .name ="rte_null_pmd" , + .drv_flags =RTE_PCI_DRV_DETACHABLE , + }, +}; +static void eth_queue_release (void *q) {
@@ -429,10 +436,12 @@ eth_dev_null_create(const char *name, data->nb_tx_queues = (uint16_t )nb_tx_queues; data->dev_link = pmd_link; data->mac_addrs = ð_addr; +strncpy (data->name, eth_dev->data->name,strlen (eth_dev->data->name)); eth_dev->data = data; eth_dev->dev_ops = &ops; eth_dev->pci_dev = pci_dev; + eth_dev->driver = &rte_null_pmd;/* finally assign rx and tx ops */ if (packet_copy) {
@@ -532,10 +541,36 @@ rte_pmd_null_devinit(const char *name, const char *params)return eth_dev_null_create (name, numa_node, packet_size, packet_copy); } +static int +rte_pmd_null_devuninit(const char *name, const char *params __rte_unused) +{ +struct rte_eth_dev *eth_dev =NULL ; + +if (name ==NULL ) +return -EINVAL ; + +RTE_LOG (INFO ,PMD ,"Closing null ethdev on numa socket %u\n" , +rte_socket_id ()); + +/* reserve an ethdev entry */ + eth_dev =rte_eth_dev_allocated (name); +if (eth_dev ==NULL ) +return -1 ; + +rte_free (eth_dev->data->dev_private); +rte_free (eth_dev->data); +rte_free (eth_dev->pci_dev); + +rte_eth_dev_free (eth_dev); + +return 0 ; +} +static struct rte_driver pmd_null_drv = { .name ="eth_null" , .type =PMD_VDEV , .init = rte_pmd_null_devinit, + .uninit = rte_pmd_null_devuninit, };PMD_REGISTER_DRIVER (pmd_null_drv);
Signature · 1 line
1.9.1
A message that is not in the archive (sent off-list or not yet received): 1424060349-23693-2-git-send-email-mukawa-AlSX/UN32fvPDbFq/[email protected]
Iremonger, Bernard
Acked-byRe: [PATCH v8 2/2] librte_pmd_null: Support port hotplug function
Quoted 17 lines
-----Original Message-----
From: Tetsuya Mukawa [mailto:mukawa-AlSX/UN32fvPDbFq/[email protected]]
Sent: Monday, February 16, 2015 4:19 AM
To: [email protected]
Cc: Qiu, Michael; Iremonger, Bernard; Tetsuya Mukawa
Subject: [PATCH v8 2/2]librte_pmd_null: Support port hotplug functionThis patch adds port hotplug support to Null PMD.
v7:
- Add parameter checkings.
(Thanks to Iremonger, Bernard)
v6:
- Fix a parameter ofrte_eth_dev_free().
v4:
- Fix commit title.
Quoted 1 line
Iremonger, Bernard
Acked-byRe: [PATCH v8 1/2] librte_pmd_null: Add Null PMD
In reply to a message not in the archiveQuoted 40 lines
-----Original Message-----
From: Tetsuya Mukawa [mailto:mukawa-AlSX/UN32fvPDbFq/[email protected]]
Sent: Monday, February 16, 2015 4:19 AM
To: [email protected]
Cc: Qiu, Michael; Iremonger, Bernard; Tetsuya Mukawa
Subject: [PATCH v8 1/2]librte_pmd_null: Add Null PMDNull PMD is a driver of the virtual device particularly designed to measure performance of DPDK PMDs. When an application call rx, Null PMD just allocates mbufs and returns those. Also tx, the PMD just frees mbufs.
The PMD has following options.
- size: specify packe size allocated by RX. Default packet size is 64.
- copy: specify 1 or 0 to enable or disable copy while RX and TX. Default value is 0(disabled).
This option is used for emulating more realistic data transfer. Copy size is equal to packet size.To use the PMD, enable
CONFIG_RTE_BUILD_SHARED_LIBin config file. Then compile the PMD as shared library. The library can be linked using '-d'
option when an application invokes.Here is an example.
$ sudo ./testpmd -c f -n 4 -d librte_pmd_null.so \ --vdev 'eth_null0' --vdev 'eth_null1' -- -i --no-flush-rxIf testpmd is compiled with
CONFIG_RTE_BUILD_SHARED_LIB, it may need to specify more libraries using '-d' option.v8:
- FixMakefileand add version map file. (Thanks to Qiu, Michael and Iremonger, Bernard)
v7:
- Add parameter checkings.
(Thanks to Iremonger, Bernard)
- Remove needless "__rte_unused".
v4:
- Fix memory leak.
(Thanks to Iremonger, Bernard)
Quoted 1 line
PATCH v9 1/2 librte_pmd_null: Add Null PMD
In reply to a message not in the archiveNull PMD is a driver of the virtual device particularly designed to measure performance of DPDK PMDs. When an application call rx, Null PMD just allocates mbufs and returns those. Also tx, the PMD just frees mbufs.
The PMD has following options.
- size: specify packe size allocated by RX. Default packet size is 64.
- copy: specify 1 or 0 to enable or disable copy while RX and TX. Default value is 0(disabled).
This option is used for emulating more realistic data transfer. Copy size is equal to packet size.
To use the PMD, enable CONFIG_RTE_BUILD_SHARED_LIB in config file. Then compile the PMD as shared library. The library can be linked using '-d' option when an application invokes.
Here is an example.
$ sudo ./testpmd -c f -n 4 -d librte_pmd_null.so \ --vdev 'eth_null0' --vdev 'eth_null1' -- -i --no-flush-rx
If testpmd is compiled with CONFIG_RTE_BUILD_SHARED_LIB, it may need to specify more libraries using '-d' option.
v8:
- Fix Makefile and add version map file. (Thanks to Qiu, Michael and Iremonger, Bernard)
v7:
- Add parameter checkings.
(Thanks to Iremonger, Bernard)
- Remove needless "__rte_unused".
v4:
- Fix memory leak.
(Thanks to Iremonger, Bernard)
--- config/common_bsdapp | 5 + config/common_linuxapp | 5 + lib/Makefile | 1 + lib/librte_pmd_null/Makefile | 62 +++ lib/librte_pmd_null/rte_eth_null.c | 541 +++++++++++++++++++++++++++ lib/librte_pmd_null/rte_pmd_null_version.map | 4 + 6 files changed, 618 insertions(+) create mode 100644 lib/librte_pmd_null/Makefile create mode 100644 lib/librte_pmd_null/rte_eth_null.c create mode 100644 lib/librte_pmd_null/rte_pmd_null_version.map
config/common_bsdapp +5 -0
@@ -241,6 +241,11 @@ CONFIG_RTE_LIBRTE_PMD_PCAP=y CONFIG_RTE_LIBRTE_PMD_BOND=y # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=y
config/common_linuxapp +5 -0
@@ -248,6 +248,11 @@ CONFIG_RTE_LIBRTE_PMD_AF_PACKET=y CONFIG_RTE_LIBRTE_PMD_XENVIRT=n # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=y
lib/Makefile +1 -0
@@ -54,6 +54,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_VIRTIO_PMD) += librte_pmd_virtio DIRS-$(CONFIG_RTE_LIBRTE_VMXNET3_PMD) += librte_pmd_vmxnet3 DIRS-$(CONFIG_RTE_LIBRTE_PMD_XENVIRT) += librte_pmd_xenvirt DIRS-$(CONFIG_RTE_LIBRTE_VHOST) += librte_vhost +DIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += librte_pmd_null DIRS-$(CONFIG_RTE_LIBRTE_HASH) += librte_hash DIRS-$(CONFIG_RTE_LIBRTE_LPM) += librte_lpm DIRS-$(CONFIG_RTE_LIBRTE_ACL) += librte_acl
lib/librte_pmd_null/Makefile new file +62 -0
62 lines not on this page · raw message
lib/librte_pmd_null/rte_eth_null.c new file +541 -0
541 lines not on this page · raw message
lib/librte_pmd_null/rte_pmd_null_version.map new file +4 -0
@@ -0,0 +1,4 @@ +DPDK_2.0 { + + local: *; +};
Signature · 1 line
1.9.1
A message that is not in the archive (sent off-list or not yet received): 1424342510-1107-1-git-send-email-mukawa-AlSX/UN32fvPDbFq/[email protected]
PATCH v9 2/2 librte_pmd_null: Support port hotplug function
This patch adds port hotplug support to Null PMD.
v9:
- Use rte_eth_dev_release_port() instead of rte_eth_dev_free().
v7:
- Add parameter checkings.
(Thanks to Iremonger, Bernard)
v6:
- Fix a parameter of rte_eth_dev_free().
v4:
- Fix commit title.
--- lib/librte_pmd_null/rte_eth_null.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+)
lib/librte_pmd_null/rte_eth_null.c +35 -0
@@ -336,6 +336,13 @@ eth_stats_reset(struct rte_eth_dev *dev) } } +static struct eth_driver rte_null_pmd = { + .pci_drv = { + .name ="rte_null_pmd" , + .drv_flags =RTE_PCI_DRV_DETACHABLE , + }, +}; +static void eth_queue_release (void *q) {
@@ -429,10 +436,12 @@ eth_dev_null_create(const char *name, data->nb_tx_queues = (uint16_t )nb_tx_queues; data->dev_link = pmd_link; data->mac_addrs = ð_addr; +strncpy (data->name, eth_dev->data->name,strlen (eth_dev->data->name)); eth_dev->data = data; eth_dev->dev_ops = &ops; eth_dev->pci_dev = pci_dev; + eth_dev->driver = &rte_null_pmd;/* finally assign rx and tx ops */ if (packet_copy) {
@@ -532,10 +541,36 @@ rte_pmd_null_devinit(const char *name, const char *params)return eth_dev_null_create (name, numa_node, packet_size, packet_copy); } +static int +rte_pmd_null_devuninit (const char *name) +{ +struct rte_eth_dev *eth_dev =NULL ; + +if (name ==NULL ) +return -EINVAL ; + +RTE_LOG (INFO ,PMD ,"Closing null ethdev on numa socket %u\n" , +rte_socket_id ()); + +/* reserve an ethdev entry */ + eth_dev =rte_eth_dev_allocated (name); +if (eth_dev ==NULL ) +return -1 ; + +rte_free (eth_dev->data->dev_private); +rte_free (eth_dev->data); +rte_free (eth_dev->pci_dev); + +rte_eth_dev_release_port (eth_dev); + +return 0 ; +} +static struct rte_driver pmd_null_drv = { .name ="eth_null" , .type =PMD_VDEV , .init = rte_pmd_null_devinit, + .uninit = rte_pmd_null_devuninit, };PMD_REGISTER_DRIVER (pmd_null_drv);
Signature · 1 line
1.9.1
PATCH v10 1/2 librte_pmd_null: Add Null PMD
In reply to a message not in the archiveNull PMD is a driver of the virtual device particularly designed to measure performance of DPDK PMDs. When an application call rx, Null PMD just allocates mbufs and returns those. Also tx, the PMD just frees mbufs.
The PMD has following options.
- size: specify packe size allocated by RX. Default packet size is 64.
- copy: specify 1 or 0 to enable or disable copy while RX and TX. Default value is 0(disabled).
This option is used for emulating more realistic data transfer. Copy size is equal to packet size.
To use the PMD, enable CONFIG_RTE_BUILD_SHARED_LIB in config file. Then compile the PMD as shared library. The library can be linked using '-d' option when an application invokes.
Here is an example.
$ sudo ./testpmd -c f -n 4 -d librte_pmd_null.so \ --vdev 'eth_null0' --vdev 'eth_null1' -- -i --no-flush-rx
If testpmd is compiled with CONFIG_RTE_BUILD_SHARED_LIB, it may need to specify more libraries using '-d' option.
v10:
- Fix driver initilization code not to return error when param is NULL. v8:
- Fix Makefile and add version map file.
(Thanks to Qiu, Michael and Iremonger, Bernard)
v7:
- Add parameter checkings.
(Thanks to Iremonger, Bernard)
- Remove needless "__rte_unused".
v4:
- Fix memory leak.
(Thanks to Iremonger, Bernard)
--- config/common_bsdapp | 5 + config/common_linuxapp | 5 + lib/Makefile | 1 + lib/librte_pmd_null/Makefile | 62 +++ lib/librte_pmd_null/rte_eth_null.c | 543 +++++++++++++++++++++++++++ lib/librte_pmd_null/rte_pmd_null_version.map | 4 + 6 files changed, 620 insertions(+) create mode 100644 lib/librte_pmd_null/Makefile create mode 100644 lib/librte_pmd_null/rte_eth_null.c create mode 100644 lib/librte_pmd_null/rte_pmd_null_version.map
config/common_bsdapp +5 -0
@@ -241,6 +241,11 @@ CONFIG_RTE_LIBRTE_PMD_PCAP=y CONFIG_RTE_LIBRTE_PMD_BOND=y # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=y
config/common_linuxapp +5 -0
@@ -248,6 +248,11 @@ CONFIG_RTE_LIBRTE_PMD_AF_PACKET=y CONFIG_RTE_LIBRTE_PMD_XENVIRT=n # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=y
lib/Makefile +1 -0
@@ -54,6 +54,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_VIRTIO_PMD) += librte_pmd_virtio DIRS-$(CONFIG_RTE_LIBRTE_VMXNET3_PMD) += librte_pmd_vmxnet3 DIRS-$(CONFIG_RTE_LIBRTE_PMD_XENVIRT) += librte_pmd_xenvirt DIRS-$(CONFIG_RTE_LIBRTE_VHOST) += librte_vhost +DIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += librte_pmd_null DIRS-$(CONFIG_RTE_LIBRTE_HASH) += librte_hash DIRS-$(CONFIG_RTE_LIBRTE_LPM) += librte_lpm DIRS-$(CONFIG_RTE_LIBRTE_ACL) += librte_acl
lib/librte_pmd_null/Makefile new file +62 -0
62 lines not on this page · raw message
lib/librte_pmd_null/rte_eth_null.c new file +543 -0
543 lines not on this page · raw message
lib/librte_pmd_null/rte_pmd_null_version.map new file +4 -0
@@ -0,0 +1,4 @@ +DPDK_2.0 { + + local: *; +};
Signature · 1 line
1.9.1
A message that is not in the archive (sent off-list or not yet received): 1424414516-18609-1-git-send-email-mukawa-AlSX/UN32fvPDbFq/[email protected]
PATCH v10 2/2 librte_pmd_null: Support port hotplug function
This patch adds port hotplug support to Null PMD.
v9:
- Use rte_eth_dev_release_port() instead of rte_eth_dev_free().
v7:
- Add parameter checkings.
(Thanks to Iremonger, Bernard)
v6:
- Fix a parameter of rte_eth_dev_free().
v4:
- Fix commit title.
--- lib/librte_pmd_null/rte_eth_null.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+)
lib/librte_pmd_null/rte_eth_null.c +35 -0
@@ -336,6 +336,13 @@ eth_stats_reset(struct rte_eth_dev *dev) } } +static struct eth_driver rte_null_pmd = { + .pci_drv = { + .name ="rte_null_pmd" , + .drv_flags =RTE_PCI_DRV_DETACHABLE , + }, +}; +static void eth_queue_release (void *q) {
@@ -429,10 +436,12 @@ eth_dev_null_create(const char *name, data->nb_tx_queues = (uint16_t )nb_tx_queues; data->dev_link = pmd_link; data->mac_addrs = ð_addr; +strncpy (data->name, eth_dev->data->name,strlen (eth_dev->data->name)); eth_dev->data = data; eth_dev->dev_ops = &ops; eth_dev->pci_dev = pci_dev; + eth_dev->driver = &rte_null_pmd;/* finally assign rx and tx ops */ if (packet_copy) {
@@ -534,10 +543,36 @@ rte_pmd_null_devinit(const char *name, const char *params)return eth_dev_null_create (name, numa_node, packet_size, packet_copy); } +static int +rte_pmd_null_devuninit (const char *name) +{ +struct rte_eth_dev *eth_dev =NULL ; + +if (name ==NULL ) +return -EINVAL ; + +RTE_LOG (INFO ,PMD ,"Closing null ethdev on numa socket %u\n" , +rte_socket_id ()); + +/* reserve an ethdev entry */ + eth_dev =rte_eth_dev_allocated (name); +if (eth_dev ==NULL ) +return -1 ; + +rte_free (eth_dev->data->dev_private); +rte_free (eth_dev->data); +rte_free (eth_dev->pci_dev); + +rte_eth_dev_release_port (eth_dev); + +return 0 ; +} +static struct rte_driver pmd_null_drv = { .name ="eth_null" , .type =PMD_VDEV , .init = rte_pmd_null_devinit, + .uninit = rte_pmd_null_devuninit, };PMD_REGISTER_DRIVER (pmd_null_drv);
Signature · 1 line
1.9.1
PATCH v11 1/2 librte_pmd_null: Add Null PMD
In reply to a message not in the archiveNull PMD is a driver of the virtual device particularly designed to measure performance of DPDK PMDs. When an application call rx, Null PMD just allocates mbufs and returns those. Also tx, the PMD just frees mbufs.
The PMD has following options.
- size: specify packe size allocated by RX. Default packet size is 64.
- copy: specify 1 or 0 to enable or disable copy while RX and TX. Default value is 0(disabled).
This option is used for emulating more realistic data transfer. Copy size is equal to packet size.
To use the PMD, enable CONFIG_RTE_BUILD_SHARED_LIB in config file. Then compile the PMD as shared library. The library can be linked using '-d' option when an application invokes.
Here is an example.
$ sudo ./testpmd -c f -n 4 -d librte_pmd_null.so \ --vdev 'eth_null0' --vdev 'eth_null1' -- -i --no-flush-rx
If testpmd is compiled with CONFIG_RTE_BUILD_SHARED_LIB, it may need to specify more libraries using '-d' option.
v11:
- Fix warning of checkpatch.pl.
v10:
- Fix driver initilization code not to return error when param is NULL. v8:
- Fix Makefile and add version map file.
(Thanks to Qiu, Michael and Iremonger, Bernard)
v7:
- Add parameter checkings.
(Thanks to Iremonger, Bernard)
- Remove needless "__rte_unused".
v4:
- Fix memory leak.
(Thanks to Iremonger, Bernard)
--- config/common_bsdapp | 5 + config/common_linuxapp | 5 + lib/Makefile | 1 + lib/librte_pmd_null/Makefile | 62 +++ lib/librte_pmd_null/rte_eth_null.c | 545 +++++++++++++++++++++++++++ lib/librte_pmd_null/rte_pmd_null_version.map | 4 + 6 files changed, 622 insertions(+) create mode 100644 lib/librte_pmd_null/Makefile create mode 100644 lib/librte_pmd_null/rte_eth_null.c create mode 100644 lib/librte_pmd_null/rte_pmd_null_version.map
config/common_bsdapp +5 -0
@@ -243,6 +243,11 @@ CONFIG_RTE_LIBRTE_BOND_DEBUG_ALB=n CONFIG_RTE_LIBRTE_BOND_DEBUG_ALB_L1=n # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=y
config/common_linuxapp +5 -0
@@ -250,6 +250,11 @@ CONFIG_RTE_LIBRTE_PMD_AF_PACKET=y CONFIG_RTE_LIBRTE_PMD_XENVIRT=n # +# Compile null PMD +# +CONFIG_RTE_LIBRTE_PMD_NULL=y + +# # Do prefetch of packet data within PMD driver receive function # CONFIG_RTE_PMD_PACKET_PREFETCH=y
lib/Makefile +1 -0
@@ -54,6 +54,7 @@ DIRS-$(CONFIG_RTE_LIBRTE_VIRTIO_PMD) += librte_pmd_virtio DIRS-$(CONFIG_RTE_LIBRTE_VMXNET3_PMD) += librte_pmd_vmxnet3 DIRS-$(CONFIG_RTE_LIBRTE_PMD_XENVIRT) += librte_pmd_xenvirt DIRS-$(CONFIG_RTE_LIBRTE_VHOST) += librte_vhost +DIRS-$(CONFIG_RTE_LIBRTE_PMD_NULL) += librte_pmd_null DIRS-$(CONFIG_RTE_LIBRTE_HASH) += librte_hash DIRS-$(CONFIG_RTE_LIBRTE_LPM) += librte_lpm DIRS-$(CONFIG_RTE_LIBRTE_ACL) += librte_acl
lib/librte_pmd_null/Makefile new file +62 -0
62 lines not on this page · raw message
lib/librte_pmd_null/rte_eth_null.c new file +545 -0
545 lines not on this page · raw message
lib/librte_pmd_null/rte_pmd_null_version.map new file +4 -0
@@ -0,0 +1,4 @@ +DPDK_2.0 { + + local: *; +};
Signature · 1 line
1.9.1
A message that is not in the archive (sent off-list or not yet received): 1424668355-8794-1-git-send-email-mukawa-AlSX/UN32fvPDbFq/[email protected]
PATCH v11 2/2 librte_pmd_null: Support port hotplug function
This patch adds port hotplug support to Null PMD.
v9:
- Use rte_eth_dev_release_port() instead of rte_eth_dev_free().
v7:
- Add parameter checkings.
(Thanks to Iremonger, Bernard)
v6:
- Fix a parameter of rte_eth_dev_free().
v4:
- Fix commit title.
--- lib/librte_pmd_null/rte_eth_null.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+)
lib/librte_pmd_null/rte_eth_null.c +35 -0
@@ -336,6 +336,13 @@ eth_stats_reset(struct rte_eth_dev *dev) } } +static struct eth_driver rte_null_pmd = { + .pci_drv = { + .name ="rte_null_pmd" , + .drv_flags =RTE_PCI_DRV_DETACHABLE , + }, +}; +static void eth_queue_release (void *q) {
@@ -429,10 +436,12 @@ eth_dev_null_create(const char *name, data->nb_tx_queues = (uint16_t )nb_tx_queues; data->dev_link = pmd_link; data->mac_addrs = ð_addr; +strncpy (data->name, eth_dev->data->name,strlen (eth_dev->data->name)); eth_dev->data = data; eth_dev->dev_ops = &ops; eth_dev->pci_dev = pci_dev; + eth_dev->driver = &rte_null_pmd;/* finally assign rx and tx ops */ if (packet_copy) {
@@ -536,10 +545,36 @@ rte_pmd_null_devinit(const char *name, const char *params)return eth_dev_null_create (name, numa_node, packet_size, packet_copy); } +static int +rte_pmd_null_devuninit (const char *name) +{ +struct rte_eth_dev *eth_dev =NULL ; + +if (name ==NULL ) +return -EINVAL ; + +RTE_LOG (INFO ,PMD ,"Closing null ethdev on numa socket %u\n" , +rte_socket_id ()); + +/* reserve an ethdev entry */ + eth_dev =rte_eth_dev_allocated (name); +if (eth_dev ==NULL ) +return -1 ; + +rte_free (eth_dev->data->dev_private); +rte_free (eth_dev->data); +rte_free (eth_dev->pci_dev); + +rte_eth_dev_release_port (eth_dev); + +return 0 ; +} +static struct rte_driver pmd_null_drv = { .name ="eth_null" , .type =PMD_VDEV , .init = rte_pmd_null_devinit, + .uninit = rte_pmd_null_devuninit, };PMD_REGISTER_DRIVER (pmd_null_drv);
Signature · 1 line
1.9.1
A message that is not in the archive (sent off-list or not yet received): 1424668355-8794-2-git-send-email-mukawa-AlSX/UN32fvPDbFq/[email protected]
Thomas Monjalon
AppliedRe: [PATCH v11 2/2] librte_pmd_null: Support port hotplug function
Quoted 12 lines
This patch adds port hotplug support to Null PMD.
v9:
- Userte_eth_dev_release_port()instead ofrte_eth_dev_free().
v7:
- Add parameter checkings.
(Thanks to Iremonger, Bernard)
v6:
- Fix a parameter ofrte_eth_dev_free().
v4:
- Fix commit title.
Quoted 1 line
Applied, thanks
I assumed you are OK to be the maintainer of Null PMD.
Re: [PATCH v11 2/2] librte_pmd_null: Support port hotplug function
Build fails if HOTPLUG is disabled
== Build lib/librte_ether
CC rte_ethdev.o/var/src/dpdk/lib/librte_ether/rte_ethdev.c:430:1: error: ‘rte_eth_dev_get_device_type’ defined but not used [-Werror=unused-function]
rte_eth_dev_get_device_type(uint8_t port_id)
^/var/src/dpdk/lib/librte_ether/rte_ethdev.c:438:1: error: ‘rte_eth_dev_save’ defined but not used [-Werror=unused-function]
rte_eth_dev_save(struct rte_eth_dev *devs, size_t size)
^/var/src/dpdk/lib/librte_ether/rte_ethdev.c:450:1: error: ‘rte_eth_dev_get_changed_port’ defined but not used [-Werror=unused-function]
rte_eth_dev_get_changed_port(struct rte_eth_dev *devs, uint8_t *port_id)
^/var/src/dpdk/lib/librte_ether/rte_ethdev.c:464:1: error: ‘rte_eth_dev_get_addr_by_port’ defined but not used [-Werror=unused-function]
rte_eth_dev_get_addr_by_port(uint8_t port_id, struct rte_pci_addr *addr)
^/var/src/dpdk/lib/librte_ether/rte_ethdev.c:481:1: error: ‘rte_eth_dev_get_name_by_port’ defined but not used [-Werror=unused-function]
rte_eth_dev_get_name_by_port(uint8_t port_id, char *name)
^/var/src/dpdk/lib/librte_ether/rte_ethdev.c:503:1: error: ‘rte_eth_dev_is_detachable’ defined but not used [-Werror=unused-function]
rte_eth_dev_is_detachable(uint8_t port_id)
^
cc1: all warnings being treated as errors
Re: [PATCH v11 2/2] librte_pmd_null: Support port hotplug function
2015-02-25 16:49, Stephen Hemminger:
Quoted 1 line
Build fails if HOTPLUG is disabled
OK thanks for reporting.
Actually there is no good reason to disable hotplug on Linux. Though it means that it's impossible to build on FreeBSD.
Tetsuya, the right fix is to remove this option.
You should manage to graceful degrades hotplug in not supported cases supported: devices cannot be detachable in case of VFIO or nic_uio. What about uio_pci_generic?
Re: [PATCH v11 2/2] librte_pmd_null: Support port hotplug function
2015-02-26 16:03 GMT+09:00 Thomas Monjalon <[email protected]>:
Quoted 2 lines
2015-02-25 16:49, Stephen Hemminger:
Quoted 1 line
Build fails if HOTPLUG is disabled
Hi Stephen,
I appreciate for you reporting.
Quoted 6 lines
OK thanks for reporting.
Actually there is no good reason to disable hotplug on Linux. Though it means that it's impossible to build on FreeBSD.Tetsuya, the right fix is to remove this option.
Hi Thomas,
Yes, I agree with it. I will add some codes to remove the option. Please let me have a few days, I need to prepare BSD machine for compile test.
Quoted 3 lines
You should manage to graceful degrades hotplug in not supported cases supported: devices cannot be detachable in case of VFIO or
nic_uio. What aboutuio_pci_generic?
We cannot detach a vfio device so far. But we can detach a igb_uio and uio_pci_generic device.
About a vfio ddevice, I haven't checked related code yet, but I guess I will submit code to detach a vfio device in post-rc1.
Thanks,
Tetsuya
A message that is not in the archive (sent off-list or not yet received): CAKU8wkcwLqHnHSx3qREXVcQJZQJpZ0rWtDu7We=kGM9iG4zjSA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org
Re: [PATCH v11 2/2] librte_pmd_null: Support port hotplug function
2015-02-26 18:06, Tetsuya Mukawa:
Quoted 20 lines
2015-02-26 16:03 GMT+09:00 Thomas Monjalon <[email protected]>:
Quoted 2 lines
2015-02-25 16:49, Stephen Hemminger:
Quoted 1 line
Build fails if HOTPLUG is disabled
Hi Stephen,
I appreciate for you reporting.
Quoted 6 lines
OK thanks for reporting.
Actually there is no good reason to disable hotplug on Linux. Though it means that it's impossible to build on FreeBSD.Tetsuya, the right fix is to remove this option.
Hi Thomas,
Yes, I agree with it. I will add some codes to remove the option. Please let me have a few days, I need to prepare BSD machine for compile test.
Quoted 8 lines
Quoted 3 lines
You should manage to graceful degrades hotplug in not supported cases supported: devices cannot be detachable in case of VFIO or
nic_uio. What aboutuio_pci_generic?We cannot detach a vfio device so far. But we can detach a
igb_uioanduio_pci_genericdevice.
About a vfio ddevice, I haven't checked related code yet, but I guess I will submit code to detach a vfio device in post-rc1.
OK thanks.
I made a quick fix (moving #ifdef) waiting the option removal:
http://dpdk.org/browse/dpdk/commit/?id=7609e6609350
Re: [PATCH v11 2/2] librte_pmd_null: Support port hotplug function
2015-02-26 19:57 GMT+09:00 Thomas Monjalon <[email protected]>:
Quoted 25 lines
2015-02-26 18:06, Tetsuya Mukawa:
Quoted 24 lines
2015-02-26 16:03 GMT+09:00 Thomas Monjalon <[email protected]>:
Quoted 2 lines
2015-02-25 16:49, Stephen Hemminger:
Quoted 1 line
Build fails if HOTPLUG is disabled
Hi Stephen,
I appreciate for you reporting.
Quoted 6 lines
OK thanks for reporting.
Actually there is no good reason to disable hotplug on Linux. Though it means that it's impossible to build on FreeBSD.Tetsuya, the right fix is to remove this option.
Hi Thomas,
Yes, I agree with it. I will add some codes to remove the option. Please let me have a few days, I need to prepare BSD machine for compile test.
Quoted 3 lines
You should manage to graceful degrades hotplug in not supported cases supported: devices cannot be detachable in case of VFIO or
nic_uio. What aboutuio_pci_generic?
Quoted 9 lines
Quoted 4 lines
We cannot detach a vfio device so far. But we can detach a
igb_uioanduio_pci_genericdevice.
About a vfio ddevice, I haven't checked related code yet, but I guess I will submit code to detach a vfio device in post-rc1.OK thanks.
I made a quick fix (moving #ifdef) waiting the option removal:http://dpdk.org/browse/dpdk/commit/?id=7609e6609350
Thank you so much for that.
Tetsuya,
Re: [PATCH v11 2/2] librte_pmd_null: Support port hotplug function
In reply to Thomas Monjalon2015-02-26 19:57 GMT+09:00 Thomas Monjalon <[email protected]>:
Quoted 25 lines
2015-02-26 18:06, Tetsuya Mukawa:
Quoted 24 lines
2015-02-26 16:03 GMT+09:00 Thomas Monjalon <[email protected]>:
Quoted 2 lines
2015-02-25 16:49, Stephen Hemminger:
Quoted 1 line
Build fails if HOTPLUG is disabled
Hi Stephen,
I appreciate for you reporting.
Quoted 6 lines
OK thanks for reporting.
Actually there is no good reason to disable hotplug on Linux. Though it means that it's impossible to build on FreeBSD.Tetsuya, the right fix is to remove this option.
Hi Thomas,
Yes, I agree with it. I will add some codes to remove the option. Please let me have a few days, I need to prepare BSD machine for compile test.
Quoted 3 lines
You should manage to graceful degrades hotplug in not supported cases supported: devices cannot be detachable in case of VFIO or
nic_uio. What aboutuio_pci_generic?
Quoted 9 lines
Quoted 4 lines
We cannot detach a vfio device so far. But we can detach a
igb_uioanduio_pci_genericdevice.
About a vfio ddevice, I haven't checked related code yet, but I guess I will submit code to detach a vfio device in post-rc1.OK thanks.
I made a quick fix (moving #ifdef) waiting the option removal:http://dpdk.org/browse/dpdk/commit/?id=7609e6609350
Hi Thomas,
I submit the patches to remove HOTPLUG config macro.
Thanks,
Tetsuya
Re: [PATCH v11 2/2] librte_pmd_null: Support port hotplug function
In reply to a message not in the archiveHi,
The HEAD doesn't compile with gcc 4.7.2:
$ git clone http://dpdk.org/git/dpdk $ cd dpdk $ make T=x86_64-native-linuxapp-gcc -j install
...
== Build lib/librte_pipeline
SYMLINK-FILE include/rte_pipeline.h
CC rte_pipeline.o
/tmp/dpdk/lib/librte_pmd_null/rte_eth_null.c: In function 'eth_stats_get':
/tmp/dpdk/lib/librte_pmd_null/rte_eth_null.c:302:28:
error: array subscript is above array bounds [-Werror=array-bounds]
/tmp/dpdk/lib/librte_pmd_null/rte_eth_null.c:302:28:
error: array subscript is above array bounds [-Werror=array-bounds]
/tmp/dpdk/lib/librte_pmd_null/rte_eth_null.c:302:28:
error: array subscript is above array bounds [-Werror=array-bounds]
...
cc1: all warnings being treated as errors
make[5]: *** [rte_eth_null.o] Error 1
make[4]: *** [librte_pmd_null] Error 2The following commit introduced this issue:
$ git bisect good
c743e50c475f73edf78e5ba26445d7c6ea217f40 is the first bad commit
commit c743e50c475f73edf78e5ba26445d7c6ea217f40
Author: Tetsuya Mukawa <[email protected]>
Date: Mon Feb 23 14:12:34 2015 +0900null: new poll mode driver
I don't see the issue with gcc 4.9.
Regards,
John
A message that is not in the archive (sent off-list or not yet received): B27915DBBA3421428155699D51E4CFE2EC8A08-kPTMFJFq+rELt2AQoY/[email protected]
Re: [PATCH v11 2/2] librte_pmd_null: Support port hotplug function
Quoted 8 lines
-----Original Message-----
From: dev [mailto:[email protected]] On Behalf Of Mcnamara, John
Sent: Thursday, February 26, 2015 12:21 PM
To: Tetsuya Mukawa; Thomas Monjalon
Cc: [email protected]
Subject: Re: [dpdk-dev] [PATCH v11 2/2]librte_pmd_null: Support port hotplug function
Quoted 5 lines
The following commit introduced this issue:
$ git bisect good c743e50c475f73edf78e5ba26445d7c6ea217f40 is the first bad commit commit c743e50c475f73edf78e5ba26445d7c6ea217f40
Hi,
The above commit also has throws a warning with ICC:
lib/librte_pmd_null/rte_eth_null.c(47): error #83:
type qualifier specified more than once
static const char const *valid_arguments[] = {
^An earlier commit also throws a warning with ICC:
lib/librte_pmd_null/rte_eth_null.c(47): error #83:
type qualifier specified more than once
static const char const *valid_arguments[] = {
^ Commit:
92d94d3744d7760d8d5e490be810612cf4a9cfb0 is the first bad commit
commit 92d94d3744d7760d8d5e490be810612cf4a9cfb0
Author: Tetsuya Mukawa <[email protected]>
Date: Thu Feb 26 04:32:26 2015 +0900
ethdev: attach or detach portI applied the following patch to fix these issues, (in order to test with the HEAD). You can review them to see if they are valid and apply something similar:
lib/librte_ether/rte_ethdev.c +1 -1
@@ -433,7 +433,7 @@ static enum rte_eth_dev_type rte_eth_dev_get_device_type(uint8_t port_id) {if (!rte_eth_dev_is_valid_port (port_id)) -return -1 ; +return RTE_ETH_DEV_UNKNOWN ;return rte_eth_devices[port_id].dev_type; }
lib/librte_pmd_null/rte_eth_null.c +1 -1
@@ -44,7 +44,7 @@static unsigned default_packet_size =64 ;static unsigned default_packet_copy; -static const char const *valid_arguments[] = { +static const char *valid_arguments[] = {ETH_NULL_PACKET_SIZE_ARG ,ETH_NULL_PACKET_COPY_ARG ,NULL
John.
A message that is not in the archive (sent off-list or not yet received): B27915DBBA3421428155699D51E4CFE2EC8B34-kPTMFJFq+rELt2AQoY/[email protected]
Re: [PATCH v11 2/2] librte_pmd_null: Support port hotplug function
Quoted 73 lines · John
Quoted 8 lines
-----Original Message-----
From: dev [mailto:[email protected]] On Behalf Of Mcnamara, John
Sent: Thursday, February 26, 2015 12:21 PM
To: Tetsuya Mukawa; Thomas Monjalon
Cc: [email protected]
Subject: Re: [dpdk-dev] [PATCH v11 2/2]librte_pmd_null: Support port hotplug functionQuoted 5 lines
The following commit introduced this issue:
$ git bisect good c743e50c475f73edf78e5ba26445d7c6ea217f40 is the first bad commit commit c743e50c475f73edf78e5ba26445d7c6ea217f40Hi,
The above commit also has throws a warning with ICC:
lib/librte_pmd_null/rte_eth_null.c(47): error #83: type qualifier specified more than once static const char const *valid_arguments[] = { ^An earlier commit also throws a warning with ICC:
lib/librte_pmd_null/rte_eth_null.c(47): error #83: type qualifier specified more than once static const char const *valid_arguments[] = { ^Commit:
92d94d3744d7760d8d5e490be810612cf4a9cfb0 is the first bad commit commit 92d94d3744d7760d8d5e490be810612cf4a9cfb0 Author: Tetsuya Mukawa <mukawa-AlSX/UN32fvPDbFq/[email protected]> Date: Thu Feb 26 04:32:26 2015 +0900 ethdev: attach or detach portI applied the following patch to fix these issues, (in order to test with the HEAD). You can review them to see if they are valid and apply something similar:
lib/librte_ether/rte_ethdev.c +1
-1@@ -433,7 +433,7 @@ static enum rte_eth_dev_type rte_eth_dev_get_device_type(uint8_t port_id) {if (!rte_eth_dev_is_valid_port (port_id)) -return -1 ; +return RTE_ETH_DEV_UNKNOWN ;return rte_eth_devices[port_id].dev_type; }lib/librte_pmd_null/rte_eth_null.c +1
-1@@ -44,7 +44,7 @@static unsigned default_packet_size =64 ;static unsigned default_packet_copy; -static const char const *valid_arguments[] = { +static const char *valid_arguments[] = {ETH_NULL_PACKET_SIZE_ARG ,ETH_NULL_PACKET_COPY_ARG ,NULL
Quoted 1 line
John.
Hi Mcnamara and Stephen,
I appreciate for reporting.
I start checking all compile issues of null pmd.
Thanks,
Tetsuya
Re: [PATCH v11 2/2] librte_pmd_null: Support port hotplug function
In reply to a message not in the archive2015-02-26 12:21, Mcnamara, John:
Quoted 35 lines
Hi,
The HEAD doesn't compile with gcc 4.7.2:
$ git clone http://dpdk.org/git/dpdk $ cd dpdk $ make T=x86_64-native-linuxapp-gcc -j install... == Build lib/librte_pipeline SYMLINK-FILE include/rte_pipeline.h CC rte_pipeline.o /tmp/dpdk/lib/librte_pmd_null/rte_eth_null.c: In function 'eth_stats_get': /tmp/dpdk/lib/librte_pmd_null/rte_eth_null.c:302:28: error: array subscript is above array bounds [-Werror=array-bounds] /tmp/dpdk/lib/librte_pmd_null/rte_eth_null.c:302:28: error: array subscript is above array bounds [-Werror=array-bounds] /tmp/dpdk/lib/librte_pmd_null/rte_eth_null.c:302:28: error: array subscript is above array bounds [-Werror=array-bounds] ... cc1: all warnings being treated as errors make[5]: *** [rte_eth_null.o] Error 1 make[4]: *** [librte_pmd_null] Error 2The following commit introduced this issue:
$ git bisect good c743e50c475f73edf78e5ba26445d7c6ea217f40 is the first bad commit commit c743e50c475f73edf78e5ba26445d7c6ea217f40 Author: Tetsuya Mukawa <mukawa-AlSX/UN32fvPDbFq/[email protected]> Date: Mon Feb 23 14:12:34 2015 +0900
Quoted 4 lines
null: new poll mode driver
I don't see the issue with gcc 4.9.
Fixed: http://dpdk.org/browse/dpdk/commit/?id=e34550c8b97826