From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from out5-smtp.messagingengine.com (out5-smtp.messagingengine.com [66.111.4.29]) by dpdk.org (Postfix) with ESMTP id D14A61CCAC for ; Thu, 5 Apr 2018 17:33:34 +0200 (CEST) Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id 76E7D20CDF; Thu, 5 Apr 2018 11:33:34 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute1.internal (MEProxy); Thu, 05 Apr 2018 11:33:34 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=monjalon.net; h= cc:date:from:in-reply-to:message-id:references:subject:to :x-me-sender:x-me-sender:x-sasl-enc; s=mesmtp; bh=of/aH7ghlOHprg 4j4ghEkP77lsHhnd0tc6UYBBIjmnQ=; b=iEVEZq1asUHLqrWw4IDSpZwCsqZU5q apWS1YOCGNgmM+OJwZYu6fuSD6ktoC27puz0FzFBDjTbi0RSYwPKj7KJ6f+UcihP 6CQWmFj3PulQe9cAkA5zhGbCcbWcFu7FX+PqLSHwNWIuLsRAY6ukSE+qQURrtTDv 27vHYIjEA8QXE= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:date:from:in-reply-to:message-id :references:subject:to:x-me-sender:x-me-sender:x-sasl-enc; s= fm2; bh=of/aH7ghlOHprg4j4ghEkP77lsHhnd0tc6UYBBIjmnQ=; b=GRoTXbFI K4nXvAWusL+eQOMfTwpTTNL4vi6cIIDehoupS7qkrr8EL+kxXBJYUmFac3YKkBPm LgcqZ3tNKExM71KO8J9xowb6xMiU8h3ICD1alN+D2s4BrLBgkj+ZuI0vB8rxDeHF EE1Onfp+cBLiLOLbMtubmDfs8zddoWXk6/J2P8gY6A0v+LyzhrL9BtroswGpS42m KR5XOXpNUNnAVdnRg6ybqxALb4exLQ2/tLsAUeauEhHND7s2kn8L22/LdKiTIbi6 /aHKcBBeuJ74TbY3PDESSw0K1FrrAvSl/bINPG4r5ffBNzKdX/xTIDXqWBMHofUm +EEq7RVBhtsQMg== X-ME-Sender: Received: from xps.monjalon.net (184.203.134.77.rev.sfr.net [77.134.203.184]) by mail.messagingengine.com (Postfix) with ESMTPA id B00C8E4449; Thu, 5 Apr 2018 11:33:33 -0400 (EDT) From: Thomas Monjalon To: dev@dpdk.org Cc: ferruh.yigit@intel.com Date: Thu, 5 Apr 2018 17:33:22 +0200 Message-Id: <20180405153322.5488-4-thomas@monjalon.net> X-Mailer: git-send-email 2.16.2 In-Reply-To: <20180405153322.5488-1-thomas@monjalon.net> References: <20180309222255.27663-1-thomas@monjalon.net> <20180405153322.5488-1-thomas@monjalon.net> Subject: [dpdk-dev] [PATCH v2 3/3] ethdev: deprecate port count function X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 05 Apr 2018 15:33:35 -0000 Some DPDK applications wrongly assume these requirements: - no hotplug, i.e. ports are never detached - all allocated ports are available to the application Such application iterates over ports by its own mean. The most common pattern is to request the port count and assume ports with index in the range [0..count[ can be used. In order to fix this common mistake in all external applications, the function rte_eth_dev_count is deprecated, while introducing the new functions rte_eth_dev_count_avail and rte_eth_dev_count_total. Signed-off-by: Thomas Monjalon --- app/proc-info/main.c | 2 +- app/test-eventdev/test_perf_atq.c | 2 +- app/test-eventdev/test_perf_common.c | 2 +- app/test-eventdev/test_perf_queue.c | 2 +- app/test-eventdev/test_pipeline_atq.c | 4 ++-- app/test-eventdev/test_pipeline_common.c | 6 +++--- app/test-eventdev/test_pipeline_queue.c | 6 +++--- app/test-pmd/cmdline.c | 2 +- app/test-pmd/testpmd.c | 6 +++--- doc/guides/rel_notes/release_18_05.rst | 7 ++++++ doc/guides/sample_app_ug/quota_watermark.rst | 2 +- examples/bond/main.c | 2 +- examples/distributor/main.c | 6 +++--- examples/ethtool/ethtool-app/main.c | 2 +- examples/eventdev_pipeline/main.c | 4 ++-- examples/eventdev_pipeline/pipeline_worker_tx.c | 4 ++-- examples/exception_path/main.c | 2 +- examples/flow_classify/flow_classify.c | 4 ++-- examples/flow_filtering/Makefile | 3 +++ examples/flow_filtering/main.c | 4 ++-- examples/flow_filtering/meson.build | 1 + examples/ip_fragmentation/main.c | 4 ++-- examples/ip_reassembly/main.c | 2 +- examples/ipv4_multicast/main.c | 2 +- examples/kni/main.c | 2 +- examples/l2fwd-cat/l2fwd-cat.c | 2 +- examples/l2fwd-crypto/main.c | 2 +- examples/l2fwd-jobstats/main.c | 2 +- examples/l2fwd-keepalive/main.c | 2 +- examples/l2fwd/main.c | 2 +- examples/l3fwd-acl/main.c | 2 +- examples/l3fwd-power/main.c | 2 +- examples/l3fwd-vf/main.c | 2 +- examples/l3fwd/main.c | 2 +- examples/link_status_interrupt/Makefile | 3 +++ examples/link_status_interrupt/main.c | 2 +- examples/link_status_interrupt/meson.build | 1 + .../client_server_mp/mp_client/Makefile | 1 + .../client_server_mp/mp_client/client.c | 2 +- .../client_server_mp/mp_server/Makefile | 1 + .../client_server_mp/mp_server/init.c | 2 +- examples/multi_process/l2fwd_fork/main.c | 2 +- examples/multi_process/symmetric_mp/main.c | 2 +- examples/netmap_compat/bridge/Makefile | 1 + examples/netmap_compat/bridge/bridge.c | 2 +- examples/packet_ordering/main.c | 4 ++-- examples/performance-thread/l3fwd-thread/main.c | 2 +- examples/ptpclient/ptpclient.c | 2 +- examples/qos_sched/Makefile | 3 +++ examples/qos_sched/init.c | 2 +- examples/qos_sched/meson.build | 1 + examples/quota_watermark/qw/Makefile | 1 + examples/quota_watermark/qw/init.c | 2 +- examples/rxtx_callbacks/main.c | 2 +- examples/server_node_efd/node/Makefile | 1 + examples/server_node_efd/node/node.c | 2 +- examples/server_node_efd/server/Makefile | 1 + examples/server_node_efd/server/init.c | 2 +- examples/skeleton/basicfwd.c | 2 +- examples/skeleton/meson.build | 2 ++ examples/tep_termination/main.c | 2 +- examples/vhost/main.c | 2 +- examples/vm_power_manager/main.c | 2 +- examples/vmdq/main.c | 2 +- examples/vmdq_dcb/main.c | 2 +- lib/librte_ether/rte_ethdev.c | 25 +++++++++++++++++++--- lib/librte_ether/rte_ethdev.h | 23 ++++++++++++++++++++ lib/librte_ether/rte_ethdev_version.map | 4 +++- lib/librte_eventdev/rte_event_eth_rx_adapter.c | 3 ++- test/test/test_event_eth_rx_adapter.c | 4 ++-- test/test/test_kni.c | 2 +- test/test/test_link_bonding_mode4.c | 2 +- test/test/test_link_bonding_rssconf.c | 2 +- test/test/test_pmd_perf.c | 2 +- test/test/test_pmd_ring.c | 2 +- 75 files changed, 150 insertions(+), 78 deletions(-) diff --git a/app/proc-info/main.c b/app/proc-info/main.c index 115df9d96..539e13243 100644 --- a/app/proc-info/main.c +++ b/app/proc-info/main.c @@ -628,7 +628,7 @@ main(int argc, char **argv) return 0; } - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); if (nb_ports == 0) rte_exit(EXIT_FAILURE, "No Ethernet ports - bye\n"); diff --git a/app/test-eventdev/test_perf_atq.c b/app/test-eventdev/test_perf_atq.c index b36b22a77..64ac7b982 100644 --- a/app/test-eventdev/test_perf_atq.c +++ b/app/test-eventdev/test_perf_atq.c @@ -11,7 +11,7 @@ atq_nb_event_queues(struct evt_options *opt) { /* nb_queues = number of producers */ return opt->prod_type == EVT_PROD_TYPE_ETH_RX_ADPTR ? - rte_eth_dev_count() : evt_nr_active_lcores(opt->plcores); + rte_eth_dev_count_avail() : evt_nr_active_lcores(opt->plcores); } static inline __attribute__((always_inline)) void diff --git a/app/test-eventdev/test_perf_common.c b/app/test-eventdev/test_perf_common.c index 488cf0724..1736b6b52 100644 --- a/app/test-eventdev/test_perf_common.c +++ b/app/test-eventdev/test_perf_common.c @@ -491,7 +491,7 @@ perf_ethdev_setup(struct evt_test *test, struct evt_options *opt) if (opt->prod_type == EVT_PROD_TYPE_SYNT) return 0; - if (!rte_eth_dev_count()) { + if (!rte_eth_dev_count_avail()) { evt_err("No ethernet ports found."); return -ENODEV; } diff --git a/app/test-eventdev/test_perf_queue.c b/app/test-eventdev/test_perf_queue.c index db8f2f3e5..e381ed1eb 100644 --- a/app/test-eventdev/test_perf_queue.c +++ b/app/test-eventdev/test_perf_queue.c @@ -11,7 +11,7 @@ perf_queue_nb_event_queues(struct evt_options *opt) { /* nb_queues = number of producers * number of stages */ uint8_t nb_prod = opt->prod_type == EVT_PROD_TYPE_ETH_RX_ADPTR ? - rte_eth_dev_count() : evt_nr_active_lcores(opt->plcores); + rte_eth_dev_count_avail() : evt_nr_active_lcores(opt->plcores); return nb_prod * opt->nb_stages; } diff --git a/app/test-eventdev/test_pipeline_atq.c b/app/test-eventdev/test_pipeline_atq.c index dd7189776..26dc79f90 100644 --- a/app/test-eventdev/test_pipeline_atq.c +++ b/app/test-eventdev/test_pipeline_atq.c @@ -12,7 +12,7 @@ pipeline_atq_nb_event_queues(struct evt_options *opt) { RTE_SET_USED(opt); - return rte_eth_dev_count(); + return rte_eth_dev_count_avail(); } static int @@ -324,7 +324,7 @@ pipeline_atq_eventdev_setup(struct evt_test *test, struct evt_options *opt) uint8_t nb_worker_queues = 0; nb_ports = evt_nr_active_lcores(opt->wlcores); - nb_queues = rte_eth_dev_count(); + nb_queues = rte_eth_dev_count_avail(); /* One extra port and queueu for Tx service */ if (t->mt_unsafe) { diff --git a/app/test-eventdev/test_pipeline_common.c b/app/test-eventdev/test_pipeline_common.c index b4dbe3769..719518ff3 100644 --- a/app/test-eventdev/test_pipeline_common.c +++ b/app/test-eventdev/test_pipeline_common.c @@ -166,7 +166,7 @@ pipeline_opt_check(struct evt_options *opt, uint64_t nb_queues) */ lcores = 2; - if (!rte_eth_dev_count()) { + if (!rte_eth_dev_count_avail()) { evt_err("test needs minimum 1 ethernet dev"); return -1; } @@ -234,7 +234,7 @@ pipeline_ethdev_setup(struct evt_test *test, struct evt_options *opt) }; RTE_SET_USED(opt); - if (!rte_eth_dev_count()) { + if (!rte_eth_dev_count_avail()) { evt_err("No ethernet ports found.\n"); return -ENODEV; } @@ -419,7 +419,7 @@ pipeline_event_tx_service_setup(struct evt_test *test, struct evt_options *opt, tx->dev_id = opt->dev_id; tx->queue_id = tx_queue_id; tx->port_id = tx_port_id; - tx->nb_ethports = rte_eth_dev_count(); + tx->nb_ethports = rte_eth_dev_count_avail(); tx->t = t; /* Register Tx service */ diff --git a/app/test-eventdev/test_pipeline_queue.c b/app/test-eventdev/test_pipeline_queue.c index 02fc27cf8..ca5f4578e 100644 --- a/app/test-eventdev/test_pipeline_queue.c +++ b/app/test-eventdev/test_pipeline_queue.c @@ -10,7 +10,7 @@ static __rte_always_inline int pipeline_queue_nb_event_queues(struct evt_options *opt) { - uint16_t eth_count = rte_eth_dev_count(); + uint16_t eth_count = rte_eth_dev_count_avail(); return (eth_count * opt->nb_stages) + eth_count; } @@ -333,7 +333,7 @@ pipeline_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt) uint8_t nb_worker_queues = 0; nb_ports = evt_nr_active_lcores(opt->wlcores); - nb_queues = rte_eth_dev_count() * (nb_stages); + nb_queues = rte_eth_dev_count_avail() * (nb_stages); /* Extra port for Tx service. */ if (t->mt_unsafe) { @@ -341,7 +341,7 @@ pipeline_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt) nb_ports++; nb_queues++; } else - nb_queues += rte_eth_dev_count(); + nb_queues += rte_eth_dev_count_avail(); rte_event_dev_info_get(opt->dev_id, &info); diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index f22fa935c..6f0419ce1 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -5402,7 +5402,7 @@ static void cmd_create_bonded_device_parsed(void *parsed_result, port_id); /* Update number of ports */ - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); reconfig(port_id, res->socket); rte_eth_promiscuous_enable(port_id); } diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index 0708c32cb..5e0f24471 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -1873,7 +1873,7 @@ attach_port(char *identifier) reconfig(pi, socket_id); rte_eth_promiscuous_enable(pi); - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); ports[pi].port_status = RTE_PORT_STOPPED; @@ -1901,7 +1901,7 @@ detach_port(portid_t port_id) return; } - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); printf("Port '%s' is detached. Now total ports is %d\n", name, nb_ports); @@ -2496,7 +2496,7 @@ main(int argc, char** argv) rte_pdump_init(NULL); #endif - nb_ports = (portid_t) rte_eth_dev_count(); + nb_ports = (portid_t) rte_eth_dev_count_avail(); if (nb_ports == 0) TESTPMD_LOG(WARNING, "No probed ethernet devices\n"); diff --git a/doc/guides/rel_notes/release_18_05.rst b/doc/guides/rel_notes/release_18_05.rst index e5fac1cd1..0c801000a 100644 --- a/doc/guides/rel_notes/release_18_05.rst +++ b/doc/guides/rel_notes/release_18_05.rst @@ -72,6 +72,13 @@ API Changes Also, make sure to start the actual text at the margin. ========================================================= +* ethdev: The function ``rte_eth_dev_count``, often mis-used to iterate + over ports, is deprecated and replaced by ``rte_eth_dev_count_avail``. + There is also a new function ``rte_eth_dev_count_total`` to get the + total number of allocated ports, available or not. + The hotplug-proof applications should use ``RTE_ETH_FOREACH_DEV`` or + ``RTE_ETH_FOREACH_DEV_OWNED_BY`` as port iterators. + ABI Changes ----------- diff --git a/doc/guides/sample_app_ug/quota_watermark.rst b/doc/guides/sample_app_ug/quota_watermark.rst index 8baec4df8..67200e15d 100644 --- a/doc/guides/sample_app_ug/quota_watermark.rst +++ b/doc/guides/sample_app_ug/quota_watermark.rst @@ -163,7 +163,7 @@ Then, a call to init_dpdk(), defined in init.c, is made to initialize the poll m if (ret < 0) rte_exit(EXIT_FAILURE, "rte_pci_probe(): error %d\n", ret); - if (rte_eth_dev_count() < 2) + if (rte_eth_dev_count_avail() < 2) rte_exit(EXIT_FAILURE, "Not enough Ethernet port available\n"); } diff --git a/examples/bond/main.c b/examples/bond/main.c index d4097d04d..d8edc642b 100644 --- a/examples/bond/main.c +++ b/examples/bond/main.c @@ -748,7 +748,7 @@ main(int argc, char *argv[]) argc -= ret; argv += ret; - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); if (nb_ports == 0) rte_exit(EXIT_FAILURE, "Give at least one port\n"); else if (nb_ports > MAX_PORTS) diff --git a/examples/distributor/main.c b/examples/distributor/main.c index 2e6b09d21..2c5936489 100644 --- a/examples/distributor/main.c +++ b/examples/distributor/main.c @@ -193,7 +193,7 @@ struct lcore_params { static int lcore_rx(struct lcore_params *p) { - const uint16_t nb_ports = rte_eth_dev_count(); + const uint16_t nb_ports = rte_eth_dev_count_avail(); const int socket_id = rte_socket_id(); uint16_t port; struct rte_mbuf *bufs[BURST_SIZE*2]; @@ -542,7 +542,7 @@ lcore_worker(struct lcore_params *p) * for single port, xor_val will be zero so we won't modify the output * port, otherwise we send traffic from 0 to 1, 2 to 3, and vice versa */ - const unsigned xor_val = (rte_eth_dev_count() > 1); + const unsigned xor_val = (rte_eth_dev_count_avail() > 1); struct rte_mbuf *buf[8] __rte_cache_aligned; for (i = 0; i < 8; i++) @@ -678,7 +678,7 @@ main(int argc, char *argv[]) "1 lcore for packet TX\n" "and at least 1 lcore for worker threads\n"); - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); if (nb_ports == 0) rte_exit(EXIT_FAILURE, "Error: no ethernet ports detected\n"); if (nb_ports != 1 && (nb_ports & 1)) diff --git a/examples/ethtool/ethtool-app/main.c b/examples/ethtool/ethtool-app/main.c index 702feabe9..c1815bb94 100644 --- a/examples/ethtool/ethtool-app/main.c +++ b/examples/ethtool/ethtool-app/main.c @@ -251,7 +251,7 @@ int main(int argc, char **argv) if (cnt_args_parsed < 0) rte_exit(EXIT_FAILURE, "rte_eal_init(): Failed"); - cnt_ports = rte_eth_dev_count(); + cnt_ports = rte_eth_dev_count_avail(); printf("Number of NICs: %i\n", cnt_ports); if (cnt_ports == 0) rte_exit(EXIT_FAILURE, "No available NIC ports!\n"); diff --git a/examples/eventdev_pipeline/main.c b/examples/eventdev_pipeline/main.c index 48358a7d2..b698e4ca2 100644 --- a/examples/eventdev_pipeline/main.c +++ b/examples/eventdev_pipeline/main.c @@ -429,7 +429,7 @@ int main(int argc, char **argv) { struct worker_data *worker_data; - unsigned int num_ports; + uint16_t num_ports; int lcore_id; int err; @@ -451,7 +451,7 @@ main(int argc, char **argv) /* Parse cli options*/ parse_app_args(argc, argv); - num_ports = rte_eth_dev_count(); + num_ports = rte_eth_dev_count_avail(); if (num_ports == 0) rte_panic("No ethernet ports found\n"); diff --git a/examples/eventdev_pipeline/pipeline_worker_tx.c b/examples/eventdev_pipeline/pipeline_worker_tx.c index fc98128ec..3dbde92df 100644 --- a/examples/eventdev_pipeline/pipeline_worker_tx.c +++ b/examples/eventdev_pipeline/pipeline_worker_tx.c @@ -422,7 +422,7 @@ setup_eventdev_worker_tx(struct cons_data *cons_data, const uint8_t dev_id = 0; const uint8_t nb_ports = cdata.num_workers; uint8_t nb_slots = 0; - uint8_t nb_queues = rte_eth_dev_count(); + uint8_t nb_queues = rte_eth_dev_count_avail(); /* * In case where all type queues are not enabled, use queues equal to @@ -431,7 +431,7 @@ setup_eventdev_worker_tx(struct cons_data *cons_data, */ if (!atq) { nb_queues *= cdata.num_stages; - nb_queues += rte_eth_dev_count(); + nb_queues += rte_eth_dev_count_avail(); } struct rte_event_dev_config config = { diff --git a/examples/exception_path/main.c b/examples/exception_path/main.c index 996f4939d..2b381a5d8 100644 --- a/examples/exception_path/main.c +++ b/examples/exception_path/main.c @@ -559,7 +559,7 @@ main(int argc, char** argv) } /* Get number of ports found in scan */ - nb_sys_ports = rte_eth_dev_count(); + nb_sys_ports = rte_eth_dev_count_avail(); if (nb_sys_ports == 0) FATAL_ERROR("No supported Ethernet device found"); /* Find highest port set in portmask */ diff --git a/examples/flow_classify/flow_classify.c b/examples/flow_classify/flow_classify.c index d0e537e7d..3b087ce76 100644 --- a/examples/flow_classify/flow_classify.c +++ b/examples/flow_classify/flow_classify.c @@ -752,7 +752,7 @@ int main(int argc, char *argv[]) { struct rte_mempool *mbuf_pool; - uint8_t nb_ports; + uint16_t nb_ports; uint16_t portid; int ret; int socket_id; @@ -776,7 +776,7 @@ main(int argc, char *argv[]) rte_exit(EXIT_FAILURE, "Invalid flow_classify parameters\n"); /* Check that there is an even number of ports to send/receive on. */ - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); if (nb_ports < 2 || (nb_ports & 1)) rte_exit(EXIT_FAILURE, "Error: number of ports must be even\n"); diff --git a/examples/flow_filtering/Makefile b/examples/flow_filtering/Makefile index 01bb4cd81..f41b368fa 100644 --- a/examples/flow_filtering/Makefile +++ b/examples/flow_filtering/Makefile @@ -50,6 +50,8 @@ CFLAGS += -O3 $(shell pkg-config --cflags libdpdk) LDFLAGS_SHARED = $(shell pkg-config --libs libdpdk) LDFLAGS_STATIC = -Wl,-Bstatic $(shell pkg-config --static --libs libdpdk) +CFLAGS += -DALLOW_EXPERIMENTAL_API + build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build $(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_SHARED) @@ -75,6 +77,7 @@ RTE_TARGET ?= x86_64-native-linuxapp-gcc include $(RTE_SDK)/mk/rte.vars.mk +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) diff --git a/examples/flow_filtering/main.c b/examples/flow_filtering/main.c index 0bb81a8dd..db03c9c3a 100644 --- a/examples/flow_filtering/main.c +++ b/examples/flow_filtering/main.c @@ -232,7 +232,7 @@ int main(int argc, char **argv) { int ret; - uint8_t nr_ports; + uint16_t nr_ports; struct rte_flow_error error; ret = rte_eal_init(argc, argv); @@ -243,7 +243,7 @@ main(int argc, char **argv) signal(SIGINT, signal_handler); signal(SIGTERM, signal_handler); - nr_ports = rte_eth_dev_count(); + nr_ports = rte_eth_dev_count_avail(); if (nr_ports == 0) rte_exit(EXIT_FAILURE, ":: no Ethernet ports found\n"); port_id = 0; diff --git a/examples/flow_filtering/meson.build b/examples/flow_filtering/meson.build index 407795c42..949493300 100644 --- a/examples/flow_filtering/meson.build +++ b/examples/flow_filtering/meson.build @@ -9,3 +9,4 @@ sources = files( 'main.c', ) +allow_experimental_apis = true diff --git a/examples/ip_fragmentation/main.c b/examples/ip_fragmentation/main.c index f525c3a9c..8952ea456 100644 --- a/examples/ip_fragmentation/main.c +++ b/examples/ip_fragmentation/main.c @@ -843,7 +843,7 @@ main(int argc, char **argv) struct rte_eth_txconf *txconf; struct rx_queue *rxq; int socket, ret; - unsigned nb_ports; + uint16_t nb_ports; uint16_t queueid = 0; unsigned lcore_id = 0, rx_lcore_id = 0; uint32_t n_tx_queue, nb_lcores; @@ -861,7 +861,7 @@ main(int argc, char **argv) if (ret < 0) rte_exit(EXIT_FAILURE, "Invalid arguments"); - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); if (nb_ports == 0) rte_exit(EXIT_FAILURE, "No ports found!\n"); diff --git a/examples/ip_reassembly/main.c b/examples/ip_reassembly/main.c index ddff35880..3e8e79c21 100644 --- a/examples/ip_reassembly/main.c +++ b/examples/ip_reassembly/main.c @@ -1008,7 +1008,7 @@ main(int argc, char **argv) if (ret < 0) rte_exit(EXIT_FAILURE, "Invalid IP reassembly parameters\n"); - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); if (nb_ports == 0) rte_exit(EXIT_FAILURE, "No ports found!\n"); diff --git a/examples/ipv4_multicast/main.c b/examples/ipv4_multicast/main.c index 23b266bbe..ad2072f41 100644 --- a/examples/ipv4_multicast/main.c +++ b/examples/ipv4_multicast/main.c @@ -674,7 +674,7 @@ main(int argc, char **argv) if (clone_pool == NULL) rte_exit(EXIT_FAILURE, "Cannot init clone mbuf pool\n"); - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); if (nb_ports == 0) rte_exit(EXIT_FAILURE, "No physical ports!\n"); if (nb_ports > MAX_PORTS) diff --git a/examples/kni/main.c b/examples/kni/main.c index 1855c64ab..40d74ae15 100644 --- a/examples/kni/main.c +++ b/examples/kni/main.c @@ -921,7 +921,7 @@ main(int argc, char** argv) } /* Get number of ports found in scan */ - nb_sys_ports = rte_eth_dev_count(); + nb_sys_ports = rte_eth_dev_count_avail(); if (nb_sys_ports == 0) rte_exit(EXIT_FAILURE, "No supported Ethernet device found\n"); diff --git a/examples/l2fwd-cat/l2fwd-cat.c b/examples/l2fwd-cat/l2fwd-cat.c index ed4878043..0e6078aad 100644 --- a/examples/l2fwd-cat/l2fwd-cat.c +++ b/examples/l2fwd-cat/l2fwd-cat.c @@ -173,7 +173,7 @@ main(int argc, char *argv[]) argv += ret; /* Check that there is an even number of ports to send/receive on. */ - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); if (nb_ports < 2 || (nb_ports & 1)) rte_exit(EXIT_FAILURE, "Error: number of ports must be even\n"); diff --git a/examples/l2fwd-crypto/main.c b/examples/l2fwd-crypto/main.c index b1ad19284..422044898 100644 --- a/examples/l2fwd-crypto/main.c +++ b/examples/l2fwd-crypto/main.c @@ -2311,7 +2311,7 @@ initialize_ports(struct l2fwd_crypto_options *options) { uint16_t last_portid = 0, portid; unsigned enabled_portcount = 0; - unsigned nb_ports = rte_eth_dev_count(); + unsigned nb_ports = rte_eth_dev_count_avail(); if (nb_ports == 0) { printf("No Ethernet ports - bye\n"); diff --git a/examples/l2fwd-jobstats/main.c b/examples/l2fwd-jobstats/main.c index 248224840..34553faa2 100644 --- a/examples/l2fwd-jobstats/main.c +++ b/examples/l2fwd-jobstats/main.c @@ -770,7 +770,7 @@ main(int argc, char **argv) if (l2fwd_pktmbuf_pool == NULL) rte_exit(EXIT_FAILURE, "Cannot init mbuf pool\n"); - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); if (nb_ports == 0) rte_exit(EXIT_FAILURE, "No Ethernet ports - bye\n"); diff --git a/examples/l2fwd-keepalive/main.c b/examples/l2fwd-keepalive/main.c index e9ad91a1f..a18b707cd 100644 --- a/examples/l2fwd-keepalive/main.c +++ b/examples/l2fwd-keepalive/main.c @@ -561,7 +561,7 @@ main(int argc, char **argv) if (l2fwd_pktmbuf_pool == NULL) rte_exit(EXIT_FAILURE, "Cannot init mbuf pool\n"); - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); if (nb_ports == 0) rte_exit(EXIT_FAILURE, "No Ethernet ports - bye\n"); diff --git a/examples/l2fwd/main.c b/examples/l2fwd/main.c index f8ca29cf6..690843578 100644 --- a/examples/l2fwd/main.c +++ b/examples/l2fwd/main.c @@ -545,7 +545,7 @@ main(int argc, char **argv) /* convert to number of cycles */ timer_period *= rte_get_timer_hz(); - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); if (nb_ports == 0) rte_exit(EXIT_FAILURE, "No Ethernet ports - bye\n"); diff --git a/examples/l3fwd-acl/main.c b/examples/l3fwd-acl/main.c index 2c891b494..33ad467d3 100644 --- a/examples/l3fwd-acl/main.c +++ b/examples/l3fwd-acl/main.c @@ -1891,7 +1891,7 @@ main(int argc, char **argv) if (ret < 0) rte_exit(EXIT_FAILURE, "init_lcore_rx_queues failed\n"); - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); if (check_port_config() < 0) rte_exit(EXIT_FAILURE, "check_port_config failed\n"); diff --git a/examples/l3fwd-power/main.c b/examples/l3fwd-power/main.c index d6a092618..596d64548 100644 --- a/examples/l3fwd-power/main.c +++ b/examples/l3fwd-power/main.c @@ -1650,7 +1650,7 @@ main(int argc, char **argv) if (ret < 0) rte_exit(EXIT_FAILURE, "init_lcore_rx_queues failed\n"); - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); if (check_port_config() < 0) rte_exit(EXIT_FAILURE, "check_port_config failed\n"); diff --git a/examples/l3fwd-vf/main.c b/examples/l3fwd-vf/main.c index dd0e057ef..aaafb7bc2 100644 --- a/examples/l3fwd-vf/main.c +++ b/examples/l3fwd-vf/main.c @@ -949,7 +949,7 @@ main(int argc, char **argv) if (ret < 0) rte_exit(EXIT_FAILURE, "init_lcore_rx_queues failed\n"); - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); if (check_port_config() < 0) rte_exit(EXIT_FAILURE, "check_port_config failed\n"); diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c index ec1da5c18..bf7dbd814 100644 --- a/examples/l3fwd/main.c +++ b/examples/l3fwd/main.c @@ -826,7 +826,7 @@ main(int argc, char **argv) if (ret < 0) rte_exit(EXIT_FAILURE, "init_lcore_rx_queues failed\n"); - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); if (check_port_config() < 0) rte_exit(EXIT_FAILURE, "check_port_config failed\n"); diff --git a/examples/link_status_interrupt/Makefile b/examples/link_status_interrupt/Makefile index 160682123..d778fcbbf 100644 --- a/examples/link_status_interrupt/Makefile +++ b/examples/link_status_interrupt/Makefile @@ -23,6 +23,8 @@ CFLAGS += -O3 $(shell pkg-config --cflags libdpdk) LDFLAGS_SHARED = $(shell pkg-config --libs libdpdk) LDFLAGS_STATIC = -Wl,-Bstatic $(shell pkg-config --static --libs libdpdk) +CFLAGS += -DALLOW_EXPERIMENTAL_API + build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build $(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_SHARED) @@ -48,6 +50,7 @@ RTE_TARGET ?= x86_64-native-linuxapp-gcc include $(RTE_SDK)/mk/rte.vars.mk +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) diff --git a/examples/link_status_interrupt/main.c b/examples/link_status_interrupt/main.c index ad0dd390d..f56895680 100644 --- a/examples/link_status_interrupt/main.c +++ b/examples/link_status_interrupt/main.c @@ -542,7 +542,7 @@ main(int argc, char **argv) if (lsi_pktmbuf_pool == NULL) rte_panic("Cannot init mbuf pool\n"); - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); if (nb_ports == 0) rte_panic("No Ethernet port - bye\n"); diff --git a/examples/link_status_interrupt/meson.build b/examples/link_status_interrupt/meson.build index c34e11e36..2b0a25036 100644 --- a/examples/link_status_interrupt/meson.build +++ b/examples/link_status_interrupt/meson.build @@ -6,6 +6,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true sources = files( 'main.c' ) diff --git a/examples/multi_process/client_server_mp/mp_client/Makefile b/examples/multi_process/client_server_mp/mp_client/Makefile index 298e1b020..3bfcd75c5 100644 --- a/examples/multi_process/client_server_mp/mp_client/Makefile +++ b/examples/multi_process/client_server_mp/mp_client/Makefile @@ -14,6 +14,7 @@ APP = mp_client # all source are stored in SRCS-y SRCS-y := client.c +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += $(WERROR_FLAGS) -O3 CFLAGS += -I$(SRCDIR)/../shared diff --git a/examples/multi_process/client_server_mp/mp_client/client.c b/examples/multi_process/client_server_mp/mp_client/client.c index 92955e974..c23dd3f37 100644 --- a/examples/multi_process/client_server_mp/mp_client/client.c +++ b/examples/multi_process/client_server_mp/mp_client/client.c @@ -220,7 +220,7 @@ main(int argc, char *argv[]) if (parse_app_args(argc, argv) < 0) rte_exit(EXIT_FAILURE, "Invalid command-line arguments\n"); - if (rte_eth_dev_count() == 0) + if (rte_eth_dev_count_avail() == 0) rte_exit(EXIT_FAILURE, "No Ethernet ports - bye\n"); rx_ring = rte_ring_lookup(get_rx_queue_name(client_id)); diff --git a/examples/multi_process/client_server_mp/mp_server/Makefile b/examples/multi_process/client_server_mp/mp_server/Makefile index 3e244e283..af7246e6b 100644 --- a/examples/multi_process/client_server_mp/mp_server/Makefile +++ b/examples/multi_process/client_server_mp/mp_server/Makefile @@ -23,6 +23,7 @@ SRCS-y := main.c init.c args.c INC := $(sort $(wildcard *.h)) +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += $(WERROR_FLAGS) -O3 CFLAGS += -I$(SRCDIR)/../shared diff --git a/examples/multi_process/client_server_mp/mp_server/init.c b/examples/multi_process/client_server_mp/mp_server/init.c index 1c465ccbc..30c8e44bc 100644 --- a/examples/multi_process/client_server_mp/mp_server/init.c +++ b/examples/multi_process/client_server_mp/mp_server/init.c @@ -243,7 +243,7 @@ init(int argc, char *argv[]) argv += retval; /* get total number of ports */ - total_ports = rte_eth_dev_count(); + total_ports = rte_eth_dev_count_total(); /* set up array for port data */ mz = rte_memzone_reserve(MZ_PORT_INFO, sizeof(*ports), diff --git a/examples/multi_process/l2fwd_fork/main.c b/examples/multi_process/l2fwd_fork/main.c index 6b130f2f5..94318ab61 100644 --- a/examples/multi_process/l2fwd_fork/main.c +++ b/examples/multi_process/l2fwd_fork/main.c @@ -941,7 +941,7 @@ main(int argc, char **argv) for (i = 0; i < RTE_MAX_LCORE; i++) lcore_resource[i].lcore_id = i; - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); if (nb_ports == 0) rte_exit(EXIT_FAILURE, "No Ethernet ports - bye\n"); diff --git a/examples/multi_process/symmetric_mp/main.c b/examples/multi_process/symmetric_mp/main.c index 75cad0cca..16f21a187 100644 --- a/examples/multi_process/symmetric_mp/main.c +++ b/examples/multi_process/symmetric_mp/main.c @@ -418,7 +418,7 @@ main(int argc, char **argv) argv += ret; /* determine the NIC devices available */ - if (rte_eth_dev_count() == 0) + if (rte_eth_dev_count_avail() == 0) rte_exit(EXIT_FAILURE, "No Ethernet ports - bye\n"); /* parse application arguments (those after the EAL ones) */ diff --git a/examples/netmap_compat/bridge/Makefile b/examples/netmap_compat/bridge/Makefile index a7c9c14a8..071c09dd3 100644 --- a/examples/netmap_compat/bridge/Makefile +++ b/examples/netmap_compat/bridge/Makefile @@ -27,6 +27,7 @@ VPATH := $(SRCDIR)/../lib SRCS-y := bridge.c SRCS-y += compat_netmap.c +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += -O3 -I$(SRCDIR)/../lib -I$(SRCDIR)/../netmap CFLAGS += $(WERROR_FLAGS) diff --git a/examples/netmap_compat/bridge/bridge.c b/examples/netmap_compat/bridge/bridge.c index 59c5e4361..cb1882e65 100644 --- a/examples/netmap_compat/bridge/bridge.c +++ b/examples/netmap_compat/bridge/bridge.c @@ -236,7 +236,7 @@ int main(int argc, char *argv[]) if (ports.num == 0) rte_exit(EXIT_FAILURE, "no ports specified\n"); - if (rte_eth_dev_count() < 1) + if (rte_eth_dev_count_avail() < 1) rte_exit(EXIT_FAILURE, "Not enough ethernet ports available\n"); pool = rte_pktmbuf_pool_create("mbuf_pool", MBUF_PER_POOL, 32, 0, diff --git a/examples/packet_ordering/main.c b/examples/packet_ordering/main.c index 676cb6f71..7ace7d10e 100644 --- a/examples/packet_ordering/main.c +++ b/examples/packet_ordering/main.c @@ -430,7 +430,7 @@ rx_thread(struct rte_ring *ring_out) static int worker_thread(void *args_ptr) { - const uint8_t nb_ports = rte_eth_dev_count(); + const uint16_t nb_ports = rte_eth_dev_count_avail(); uint16_t i, ret = 0; uint16_t burst_size = 0; struct worker_thread_args *args; @@ -644,7 +644,7 @@ main(int argc, char **argv) "1 lcore for packet TX\n" "and at least 1 lcore for worker threads\n"); - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); if (nb_ports == 0) rte_exit(EXIT_FAILURE, "Error: no ethernet ports detected\n"); if (nb_ports != 1 && (nb_ports & 1)) diff --git a/examples/performance-thread/l3fwd-thread/main.c b/examples/performance-thread/l3fwd-thread/main.c index 699b99d00..f51e6b0fd 100644 --- a/examples/performance-thread/l3fwd-thread/main.c +++ b/examples/performance-thread/l3fwd-thread/main.c @@ -3514,7 +3514,7 @@ main(int argc, char **argv) if (ret < 0) rte_exit(EXIT_FAILURE, "init_rx_rings failed\n"); - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); if (check_port_config() < 0) rte_exit(EXIT_FAILURE, "check_port_config failed\n"); diff --git a/examples/ptpclient/ptpclient.c b/examples/ptpclient/ptpclient.c index 55be3f7cd..c44013bc1 100644 --- a/examples/ptpclient/ptpclient.c +++ b/examples/ptpclient/ptpclient.c @@ -727,7 +727,7 @@ main(int argc, char *argv[]) rte_exit(EXIT_FAILURE, "Error with PTP initialization\n"); /* Check that there is an even number of ports to send/receive on. */ - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); /* Creates a new mempool in memory to hold the mbufs. */ mbuf_pool = rte_pktmbuf_pool_create("MBUF_POOL", NUM_MBUFS * nb_ports, diff --git a/examples/qos_sched/Makefile b/examples/qos_sched/Makefile index 0f0a31ff2..e6dfbef1f 100644 --- a/examples/qos_sched/Makefile +++ b/examples/qos_sched/Makefile @@ -23,6 +23,8 @@ CFLAGS += -O3 $(shell pkg-config --cflags libdpdk) LDFLAGS_SHARED = $(shell pkg-config --libs libdpdk) LDFLAGS_STATIC = -Wl,-Bstatic $(shell pkg-config --static --libs libdpdk) +CFLAGS += -DALLOW_EXPERIMENTAL_API + build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build $(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_SHARED) @@ -55,6 +57,7 @@ all: clean: else +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) CFLAGS_args.o := -D_GNU_SOURCE diff --git a/examples/qos_sched/init.c b/examples/qos_sched/init.c index 8914f766f..c9e487975 100644 --- a/examples/qos_sched/init.c +++ b/examples/qos_sched/init.c @@ -298,7 +298,7 @@ int app_init(void) char ring_name[MAX_NAME_LEN]; char pool_name[MAX_NAME_LEN]; - if (rte_eth_dev_count() == 0) + if (rte_eth_dev_count_avail() == 0) rte_exit(EXIT_FAILURE, "No Ethernet port - bye\n"); /* load configuration profile */ diff --git a/examples/qos_sched/meson.build b/examples/qos_sched/meson.build index 289b81ce8..5101652af 100644 --- a/examples/qos_sched/meson.build +++ b/examples/qos_sched/meson.build @@ -7,6 +7,7 @@ # DPDK instance, use 'make' deps += ['sched', 'cfgfile'] +allow_experimental_apis = true sources = files( 'app_thread.c', 'args.c', 'cfg_file.c', 'cmdline.c', 'init.c', 'main.c', 'stats.c' diff --git a/examples/quota_watermark/qw/Makefile b/examples/quota_watermark/qw/Makefile index 84299e594..d0a9b3cf4 100644 --- a/examples/quota_watermark/qw/Makefile +++ b/examples/quota_watermark/qw/Makefile @@ -16,6 +16,7 @@ APP = qw # all source are stored in SRCS-y SRCS-y := args.c init.c main.c +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += -O3 -DQW_SOFTWARE_FC CFLAGS += $(WERROR_FLAGS) diff --git a/examples/quota_watermark/qw/init.c b/examples/quota_watermark/qw/init.c index d4a691839..00725bc95 100644 --- a/examples/quota_watermark/qw/init.c +++ b/examples/quota_watermark/qw/init.c @@ -112,7 +112,7 @@ void configure_eth_port(uint16_t port_id) void init_dpdk(void) { - if (rte_eth_dev_count() < 2) + if (rte_eth_dev_count_avail() < 2) rte_exit(EXIT_FAILURE, "Not enough ethernet port available\n"); } diff --git a/examples/rxtx_callbacks/main.c b/examples/rxtx_callbacks/main.c index 84b09cf05..e63ea288f 100644 --- a/examples/rxtx_callbacks/main.c +++ b/examples/rxtx_callbacks/main.c @@ -188,7 +188,7 @@ main(int argc, char *argv[]) argc -= ret; argv += ret; - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); if (nb_ports < 2 || (nb_ports & 1)) rte_exit(EXIT_FAILURE, "Error: number of ports must be even\n"); diff --git a/examples/server_node_efd/node/Makefile b/examples/server_node_efd/node/Makefile index fffbe3576..dc3191a5b 100644 --- a/examples/server_node_efd/node/Makefile +++ b/examples/server_node_efd/node/Makefile @@ -14,6 +14,7 @@ APP = node # all source are stored in SRCS-y SRCS-y := node.c +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += $(WERROR_FLAGS) -O3 CFLAGS += -I$(SRCDIR)/../shared diff --git a/examples/server_node_efd/node/node.c b/examples/server_node_efd/node/node.c index 84f7bcffe..3b97fbd45 100644 --- a/examples/server_node_efd/node/node.c +++ b/examples/server_node_efd/node/node.c @@ -320,7 +320,7 @@ main(int argc, char *argv[]) if (parse_app_args(argc, argv) < 0) rte_exit(EXIT_FAILURE, "Invalid command-line arguments\n"); - if (rte_eth_dev_count() == 0) + if (rte_eth_dev_count_avail() == 0) rte_exit(EXIT_FAILURE, "No Ethernet ports - bye\n"); rx_ring = rte_ring_lookup(get_rx_queue_name(node_id)); diff --git a/examples/server_node_efd/server/Makefile b/examples/server_node_efd/server/Makefile index cbb91ebe8..d5456f920 100644 --- a/examples/server_node_efd/server/Makefile +++ b/examples/server_node_efd/server/Makefile @@ -23,6 +23,7 @@ SRCS-y := main.c init.c args.c INC := $(sort $(wildcard *.h)) +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += $(WERROR_FLAGS) -O3 CFLAGS += -I$(SRCDIR)/../shared diff --git a/examples/server_node_efd/server/init.c b/examples/server_node_efd/server/init.c index 07b6882f8..7dfe2fa23 100644 --- a/examples/server_node_efd/server/init.c +++ b/examples/server_node_efd/server/init.c @@ -310,7 +310,7 @@ init(int argc, char *argv[]) argv += retval; /* get total number of ports */ - total_ports = rte_eth_dev_count(); + total_ports = rte_eth_dev_count_avail(); /* set up array for port data */ mz = rte_memzone_reserve(MZ_SHARED_INFO, sizeof(*info), diff --git a/examples/skeleton/basicfwd.c b/examples/skeleton/basicfwd.c index 5ac1dc820..03bc35856 100644 --- a/examples/skeleton/basicfwd.c +++ b/examples/skeleton/basicfwd.c @@ -173,7 +173,7 @@ main(int argc, char *argv[]) argv += ret; /* Check that there is an even number of ports to send/receive on. */ - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); if (nb_ports < 2 || (nb_ports & 1)) rte_exit(EXIT_FAILURE, "Error: number of ports must be even\n"); diff --git a/examples/skeleton/meson.build b/examples/skeleton/meson.build index ef46b187e..89ddba2ea 100644 --- a/examples/skeleton/meson.build +++ b/examples/skeleton/meson.build @@ -10,3 +10,5 @@ allow_experimental_apis = true sources = files( 'basicfwd.c' ) + +allow_experimental_apis = true diff --git a/examples/tep_termination/main.c b/examples/tep_termination/main.c index e86854176..8543a9803 100644 --- a/examples/tep_termination/main.c +++ b/examples/tep_termination/main.c @@ -1156,7 +1156,7 @@ main(int argc, char *argv[]) nb_switching_cores = rte_lcore_count()-1; /* Get the number of physical ports. */ - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); /* * Update the global var NB_PORTS and global array PORTS diff --git a/examples/vhost/main.c b/examples/vhost/main.c index 7cddac7d2..84e0d6366 100644 --- a/examples/vhost/main.c +++ b/examples/vhost/main.c @@ -1448,7 +1448,7 @@ main(int argc, char *argv[]) rte_exit(EXIT_FAILURE,"Not enough cores\n"); /* Get the number of physical ports. */ - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); /* * Update the global var NUM_PORTS and global array PORTS diff --git a/examples/vm_power_manager/main.c b/examples/vm_power_manager/main.c index db0ddb01d..c9805a461 100644 --- a/examples/vm_power_manager/main.c +++ b/examples/vm_power_manager/main.c @@ -278,7 +278,7 @@ main(int argc, char **argv) if (ret < 0) rte_exit(EXIT_FAILURE, "Invalid arguments\n"); - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); mbuf_pool = rte_pktmbuf_pool_create("MBUF_POOL", NUM_MBUFS * nb_ports, MBUF_CACHE_SIZE, 0, RTE_MBUF_DEFAULT_BUF_SIZE, rte_socket_id()); diff --git a/examples/vmdq/main.c b/examples/vmdq/main.c index 2f3eb74f5..52596dd5e 100644 --- a/examples/vmdq/main.c +++ b/examples/vmdq/main.c @@ -580,7 +580,7 @@ main(int argc, char *argv[]) if (rte_lcore_count() > RTE_MAX_LCORE) rte_exit(EXIT_FAILURE, "Not enough cores\n"); - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); /* * Update the global var NUM_PORTS and global array PORTS diff --git a/examples/vmdq_dcb/main.c b/examples/vmdq_dcb/main.c index 9c68ab089..2626a2f19 100644 --- a/examples/vmdq_dcb/main.c +++ b/examples/vmdq_dcb/main.c @@ -642,7 +642,7 @@ main(int argc, char *argv[]) " number of cores(1-%d)\n\n", RTE_MAX_LCORE); } - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); /* * Update the global var NUM_PORTS and global array PORTS diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index 2c74f7e04..4f9c6fc64 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -534,6 +534,12 @@ rte_eth_dev_get_sec_ctx(uint16_t port_id) uint16_t rte_eth_dev_count(void) +{ + return rte_eth_dev_count_avail(); +} + +uint16_t +rte_eth_dev_count_avail(void) { uint16_t p; uint16_t count; @@ -546,6 +552,18 @@ rte_eth_dev_count(void) return count; } +uint16_t +rte_eth_dev_count_total(void) +{ + uint16_t port, count = 0; + + for (port = 0; port < RTE_MAX_ETHPORTS; port++) + if (rte_eth_devices[port].state != RTE_ETH_DEV_UNUSED) + count++; + + return count; +} + int rte_eth_dev_get_name_by_port(uint16_t port_id, char *name) { @@ -601,7 +619,7 @@ int rte_eth_dev_attach(const char *devargs, uint16_t *port_id) { int ret = -1; - int current = rte_eth_dev_count(); + int current = rte_eth_dev_count_total(); char *name = NULL; char *args = NULL; @@ -619,7 +637,7 @@ rte_eth_dev_attach(const char *devargs, uint16_t *port_id) goto err; /* no point looking at the port count if no port exists */ - if (!rte_eth_dev_count()) { + if (!rte_eth_dev_count_total()) { ethdev_log(ERR, "No port found for device (%s)", name); ret = -1; goto err; @@ -627,8 +645,9 @@ rte_eth_dev_attach(const char *devargs, uint16_t *port_id) /* if nothing happened, there is a bug here, since some driver told us * it did attach a device, but did not create a port. + * FIXME: race condition in case of plug-out of another device */ - if (current == rte_eth_dev_count()) { + if (current == rte_eth_dev_count_total()) { ret = -1; goto err; } diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index 5e13dca6a..ffd8b5478 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -1360,8 +1360,31 @@ int __rte_experimental rte_eth_dev_owner_get(const uint16_t port_id, * @return * - The total number of usable Ethernet devices. */ +__rte_deprecated uint16_t rte_eth_dev_count(void); +/** + * Get the number of ports which are usable for the application. + * + * These devices must be iterated by using the macro + * ``RTE_ETH_FOREACH_DEV`` or ``RTE_ETH_FOREACH_DEV_OWNED_BY`` + * to deal with non-contiguous ranges of devices. + * + * @return + * The count of available Ethernet devices. + */ +uint16_t __rte_experimental rte_eth_dev_count_avail(void); + +/** + * Get the total number of ports which are allocated. + * + * Some devices may not be available for the application. + * + * @return + * The total count of Ethernet devices. + */ +uint16_t __rte_experimental rte_eth_dev_count_total(void); + /** * Attach a new Ethernet device specified by arguments. * diff --git a/lib/librte_ether/rte_ethdev_version.map b/lib/librte_ether/rte_ethdev_version.map index 34df6c8b5..8fe07880f 100644 --- a/lib/librte_ether/rte_ethdev_version.map +++ b/lib/librte_ether/rte_ethdev_version.map @@ -206,6 +206,8 @@ DPDK_18.02 { EXPERIMENTAL { global: + rte_eth_dev_count_avail; + rte_eth_dev_count_total; rte_eth_dev_is_removed; rte_eth_dev_owner_delete; rte_eth_dev_owner_get; @@ -228,4 +230,4 @@ EXPERIMENTAL { rte_mtr_stats_read; rte_mtr_stats_update; -} DPDK_17.11; +} DPDK_18.02; diff --git a/lib/librte_eventdev/rte_event_eth_rx_adapter.c b/lib/librte_eventdev/rte_event_eth_rx_adapter.c index 9297f4c4d..1b92fa33d 100644 --- a/lib/librte_eventdev/rte_event_eth_rx_adapter.c +++ b/lib/librte_eventdev/rte_event_eth_rx_adapter.c @@ -890,7 +890,8 @@ rte_event_eth_rx_adapter_create_ext(uint8_t id, uint8_t dev_id, rx_adapter->conf_arg = conf_arg; strcpy(rx_adapter->mem_name, mem_name); rx_adapter->eth_devices = rte_zmalloc_socket(rx_adapter->mem_name, - rte_eth_dev_count() * + /* FIXME: incompatible with hotplug */ + rte_eth_dev_count_total() * sizeof(struct eth_device_info), 0, socket_id); rte_convert_rss_key((const uint32_t *)default_rss_key, diff --git a/test/test/test_event_eth_rx_adapter.c b/test/test/test_event_eth_rx_adapter.c index 2234df0eb..ab5539809 100644 --- a/test/test/test_event_eth_rx_adapter.c +++ b/test/test/test_event_eth_rx_adapter.c @@ -164,7 +164,7 @@ testsuite_setup(void) * so rte_eth_dev_start invokes rte_event_dev_start internally, so * call init_ports after rte_event_dev_configure */ - err = init_ports(rte_eth_dev_count()); + err = init_ports(rte_eth_dev_count_total()); TEST_ASSERT(err == 0, "Port initialization failed err %d\n", err); err = rte_event_eth_rx_adapter_caps_get(TEST_DEV_ID, TEST_ETHDEV_ID, @@ -273,7 +273,7 @@ adapter_queue_add_del(void) queue_config.servicing_weight = 1; err = rte_event_eth_rx_adapter_queue_add(TEST_INST_ID, - rte_eth_dev_count(), + rte_eth_dev_count_total(), -1, &queue_config); TEST_ASSERT(err == -EINVAL, "Expected -EINVAL got %d", err); diff --git a/test/test/test_kni.c b/test/test/test_kni.c index e4839cdb7..01c6530d9 100644 --- a/test/test/test_kni.c +++ b/test/test/test_kni.c @@ -480,7 +480,7 @@ test_kni(void) return -1; } - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); if (nb_ports == 0) { printf("no supported nic port found\n"); return -1; diff --git a/test/test/test_link_bonding_mode4.c b/test/test/test_link_bonding_mode4.c index 426877a2a..33c1fab01 100644 --- a/test/test/test_link_bonding_mode4.c +++ b/test/test/test_link_bonding_mode4.c @@ -425,7 +425,7 @@ test_setup(void) TEST_ASSERT(retval >= 0, "Failed to create ring ethdev '%s'\n", name); - port->port_id = rte_eth_dev_count() - 1; + port->port_id = rte_eth_dev_count_avail() - 1; } retval = configure_ethdev(port->port_id, 1); diff --git a/test/test/test_link_bonding_rssconf.c b/test/test/test_link_bonding_rssconf.c index 4cc08f5a2..6a1a28d23 100644 --- a/test/test/test_link_bonding_rssconf.c +++ b/test/test/test_link_bonding_rssconf.c @@ -521,7 +521,7 @@ test_setup(void) FOR_EACH_PORT(n, port) { port = &test_params.slave_ports[n]; - port_id = rte_eth_dev_count(); + port_id = rte_eth_dev_count_avail(); snprintf(name, sizeof(name), SLAVE_DEV_NAME_FMT, port_id); retval = rte_vdev_init(name, "size=64,copy=0"); diff --git a/test/test/test_pmd_perf.c b/test/test/test_pmd_perf.c index 0e64a581b..54bc4f6b0 100644 --- a/test/test/test_pmd_perf.c +++ b/test/test/test_pmd_perf.c @@ -676,7 +676,7 @@ test_pmd_perf(void) signal(SIGUSR1, signal_handler); signal(SIGUSR2, signal_handler); - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); if (nb_ports < NB_ETHPORTS_USED) { printf("At least %u port(s) used for perf. test\n", NB_ETHPORTS_USED); diff --git a/test/test/test_pmd_ring.c b/test/test/test_pmd_ring.c index 0787e4ebf..219620125 100644 --- a/test/test/test_pmd_ring.c +++ b/test/test/test_pmd_ring.c @@ -399,7 +399,7 @@ test_pmd_ring(void) int port, cmdl_port0 = -1; uint8_t nb_ports; - nb_ports = rte_eth_dev_count(); + nb_ports = rte_eth_dev_count_avail(); printf("nb_ports=%d\n", (int)nb_ports); /* create the rings and eth_rings in the test code. -- 2.16.2