From patchwork Mon Nov 20 13:00:08 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Github ODP bot X-Patchwork-Id: 119279 Delivered-To: patch@linaro.org Received: by 10.80.225.132 with SMTP id k4csp3774654edl; Mon, 20 Nov 2017 05:02:41 -0800 (PST) X-Google-Smtp-Source: AGs4zMZJmqlt2ZxsM+rPmxCR/+Q7wIHfAS6a8K8IWdIH3IQKclGaxAUJOVofhAy1F1wlqE5vtP1z X-Received: by 10.55.195.216 with SMTP id r85mr19439294qkl.218.1511182961006; Mon, 20 Nov 2017 05:02:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1511182960; cv=none; d=google.com; s=arc-20160816; b=RRVSvv/g7BNolOqmtMo+tVmiEnawUuc4AU6dobTNsNByGhx+WMp0mzC/A0tCa3fX8h jIAwaCOIQI1vGHJA3kM4PS08yKRWYYxYEnuEWc85GVIEhBpeivbsW+itm9y7stMeE6r9 kkRj05P7LQXqJu1jOM4ka/Q8aPhzkLRZ33gMVFJuPQI0f5AaNwUsu1C6ZzhBusaa0D6m MWptSt/CRM32kolSTzVEuEUNNR9a2IufZTH4YlYZ4p5oL8Z01iSXbM4O8kBsCzFU0B4I xVs8JWmBZywpWklDCIhVdnSM6JIKk7Ut6gRKrfgWGu7VJBLLwchpygxOsvGYEwoLLN3u ofkQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:github-pr-num :references:in-reply-to:message-id:date:to:from:delivered-to :arc-authentication-results; bh=ZCcKKEgg9wor4aSrs2Odrp42N9jncIi5CUf9bGPpCBo=; b=vPpuLfjm2XfFcxWNpTL9ZPZym+ZdXSjCVZx+r+hDaJEqDMxNNUkBS57x7uWTEjGuM4 OdrQIdyXYaUOOuAACOsPPVxkiUmpvOjbIpO5ZxqDfy9uiWz2d9uCQ4cA13oCk31OgdhU erKg5iXGcYW6BZDwiqi8s2fJ1k6t2N4B41jU5tRMfeBv2Qdm8C0nyFjCJBohgte/NV0O NKKFKXilbwJXo04/QH2/LMwubKZ/jp43FeWiGRTwYA6Hk25MjQF9+K7Nh84Rlcdnvat7 PFG4d5ZFvAfpz9t4ZGTLm9SFshdvq59V7VsvK5Hsx0Gd609bdGBKEQAY806kZo7GNyOh LN0w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Return-Path: Received: from lists.linaro.org (ec2-54-197-127-237.compute-1.amazonaws.com. [54.197.127.237]) by mx.google.com with ESMTP id 41si4455798qtz.175.2017.11.20.05.02.40; Mon, 20 Nov 2017 05:02:40 -0800 (PST) Received-SPF: pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) client-ip=54.197.127.237; Authentication-Results: mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Received: by lists.linaro.org (Postfix, from userid 109) id 8C95B608E7; Mon, 20 Nov 2017 13:02:40 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on ip-10-142-244-252 X-Spam-Level: X-Spam-Status: No, score=-5.4 required=5.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, URIBL_BLOCKED autolearn=disabled version=3.4.0 Received: from [127.0.0.1] (localhost [127.0.0.1]) by lists.linaro.org (Postfix) with ESMTP id E9B1D6087F; Mon, 20 Nov 2017 13:00:45 +0000 (UTC) X-Original-To: lng-odp@lists.linaro.org Delivered-To: lng-odp@lists.linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id 1EAA060604; Mon, 20 Nov 2017 13:00:22 +0000 (UTC) Received: from forward104p.mail.yandex.net (forward104p.mail.yandex.net [77.88.28.107]) by lists.linaro.org (Postfix) with ESMTPS id 600F560692 for ; Mon, 20 Nov 2017 13:00:14 +0000 (UTC) Received: from mxback4o.mail.yandex.net (mxback4o.mail.yandex.net [IPv6:2a02:6b8:0:1a2d::1e]) by forward104p.mail.yandex.net (Yandex) with ESMTP id C5D1D18115A for ; Mon, 20 Nov 2017 16:00:12 +0300 (MSK) Received: from smtp4o.mail.yandex.net (smtp4o.mail.yandex.net [2a02:6b8:0:1a2d::28]) by mxback4o.mail.yandex.net (nwsmtp/Yandex) with ESMTP id dRO4EVQ3rV-0CbOT5nv; Mon, 20 Nov 2017 16:00:12 +0300 Received: by smtp4o.mail.yandex.net (nwsmtp/Yandex) with ESMTPSA id l67znhGFCa-0BBurihY; Mon, 20 Nov 2017 16:00:11 +0300 (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (Client certificate not present) From: Github ODP bot To: lng-odp@lists.linaro.org Date: Mon, 20 Nov 2017 16:00:08 +0300 Message-Id: <1511182808-32328-3-git-send-email-odpbot@yandex.ru> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1511182808-32328-1-git-send-email-odpbot@yandex.ru> References: <1511182808-32328-1-git-send-email-odpbot@yandex.ru> Github-pr-num: 297 Subject: [lng-odp] [PATCH 2.0 v3 2/2] linux-gen: pktio: use pktio operations data pool X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: "The OpenDataPlane \(ODP\) List" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: lng-odp-bounces@lists.linaro.org Sender: "lng-odp" From: Bogdan Pricope Pktio instances need a memory area where to store configuration or state information. This patch replaces utilization of a fixed size memory area with a variable size memory area allocated from a predefined pool. This reduces the memory size needed to store pktio array. Signed-off-by: Bogdan Pricope --- /** Email created from pull request 297 (bogdanPricope:2_0_ops_alloc_pr) ** https://github.com/Linaro/odp/pull/297 ** Patch: https://github.com/Linaro/odp/pull/297.patch ** Base sha: 6cd43041e55bd73a02ca202f835e590b3ad5c354 ** Merge commit sha: 7b05757dc100acc261053cf8e9cb253091ceaf91 **/ platform/linux-dpdk/pktio/dpdk.c | 57 ++++++--------- .../linux-generic/include/odp_packet_io_internal.h | 4 +- .../include/odp_pktio_ops_subsystem.h | 8 +-- platform/linux-generic/pktio/dpdk.c | 75 ++++++++----------- platform/linux-generic/pktio/ipc.c | 41 +++++++---- platform/linux-generic/pktio/loopback.c | 40 +++++++---- platform/linux-generic/pktio/netmap.c | 83 ++++++++++------------ platform/linux-generic/pktio/pcap.c | 26 ++++--- platform/linux-generic/pktio/socket.c | 58 +++++++-------- platform/linux-generic/pktio/socket_mmap.c | 58 +++++++-------- platform/linux-generic/pktio/tap.c | 46 +++++++----- 11 files changed, 256 insertions(+), 240 deletions(-) diff --git a/platform/linux-dpdk/pktio/dpdk.c b/platform/linux-dpdk/pktio/dpdk.c index a6e2573e5..832ac7acf 100644 --- a/platform/linux-dpdk/pktio/dpdk.c +++ b/platform/linux-dpdk/pktio/dpdk.c @@ -99,8 +99,7 @@ static void _dpdk_print_port_mac(uint8_t portid) static int input_queues_config_pkt_dpdk(pktio_entry_t *pktio_entry, const odp_pktin_queue_param_t *p) { - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; odp_pktin_mode_t mode = pktio_entry->s.param.in_mode; /** @@ -129,8 +128,7 @@ static int input_queues_config_pkt_dpdk(pktio_entry_t *pktio_entry, static int output_queues_config_pkt_dpdk(pktio_entry_t *pktio_entry, const odp_pktout_queue_param_t *p) { - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; if (p->op_mode == ODP_PKTIO_OP_MT_UNSAFE) pkt_dpdk->lockless_tx = 1; @@ -147,8 +145,7 @@ static int setup_pkt_dpdk(odp_pktio_t pktio ODP_UNUSED, { uint8_t portid = 0; struct rte_eth_dev_info dev_info; - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = NULL; int i; if (!_dpdk_netdev_is_valid(netdev)) { @@ -157,10 +154,14 @@ static int setup_pkt_dpdk(odp_pktio_t pktio ODP_UNUSED, return -1; } - if (odp_unlikely(pkt_dpdk == NULL)) { + pktio_entry->s.ops_data = ODP_OPS_DATA_ALLOC(sizeof(*pkt_dpdk)); + if (odp_unlikely(pktio_entry->s.ops_data == NULL)) { ODP_ERR("Failed to allocate pktio_ops_dpdk_data_t struct"); return -1; } + pkt_dpdk = pktio_entry->s.ops_data; + + memset(pkt_dpdk, 0, sizeof(*pkt_dpdk)); portid = atoi(netdev); pkt_dpdk->portid = portid; @@ -168,6 +169,7 @@ static int setup_pkt_dpdk(odp_pktio_t pktio ODP_UNUSED, rte_eth_dev_info_get(portid, &dev_info); if (dev_info.driver_name == NULL) { ODP_DBG("No driver found for interface: %s\n", netdev); + ODP_OPS_DATA_FREE(pktio_entry->s.ops_data); return -1; } if (!strcmp(dev_info.driver_name, "rte_ixgbe_pmd")) @@ -191,20 +193,18 @@ static int setup_pkt_dpdk(odp_pktio_t pktio ODP_UNUSED, static int close_pkt_dpdk(pktio_entry_t *pktio_entry) { - const pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + const pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; if (pktio_entry->s.state == PKTIO_STATE_STOPPED) rte_eth_dev_close(pkt_dpdk->portid); - return 0; + return ODP_OPS_DATA_FREE(pktio_entry->s.ops_data); } static int start_pkt_dpdk(pktio_entry_t *pktio_entry) { int ret, i; - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; uint8_t portid = pkt_dpdk->portid; int sid = rte_eth_dev_socket_id(pkt_dpdk->portid); int socket_id = sid < 0 ? 0 : sid; @@ -312,8 +312,7 @@ static int start_pkt_dpdk(pktio_entry_t *pktio_entry) static int stop_pkt_dpdk(pktio_entry_t *pktio_entry) { - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; rte_eth_dev_stop(pkt_dpdk->portid); return 0; @@ -362,8 +361,7 @@ static int recv_pkt_dpdk(pktio_entry_t *pktio_entry, int index, odp_packet_t pkt_table[], int len) { uint16_t nb_rx, i; - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; odp_packet_t *saved_pkt_table; uint8_t min = pkt_dpdk->min_rx_burst; odp_time_t ts_val; @@ -479,8 +477,7 @@ static int send_pkt_dpdk(pktio_entry_t *pktio_entry, int index, const odp_packet_t pkt_table[], int len) { int pkts; - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; if (!pkt_dpdk->lockless_tx) odp_ticketlock_lock(&pkt_dpdk->tx_lock[index]); @@ -532,8 +529,7 @@ static uint32_t _dpdk_vdev_mtu(uint8_t port_id) static uint32_t mtu_get_pkt_dpdk(pktio_entry_t *pktio_entry) { - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; uint16_t mtu = 0; int ret; @@ -593,8 +589,7 @@ static int _dpdk_vdev_promisc_mode_set(uint8_t port_id, int enable) static int promisc_mode_set_pkt_dpdk(pktio_entry_t *pktio_entry, int enable) { - const pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + const pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; uint8_t portid = pkt_dpdk->portid; if (enable) @@ -637,8 +632,7 @@ static int _dpdk_vdev_promisc_mode(uint8_t port_id) static int promisc_mode_get_pkt_dpdk(pktio_entry_t *pktio_entry) { - const pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + const pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; uint8_t portid = pkt_dpdk->portid; if (pkt_dpdk->vdev_sysc_promisc) @@ -649,8 +643,7 @@ static int promisc_mode_get_pkt_dpdk(pktio_entry_t *pktio_entry) static int mac_get_pkt_dpdk(pktio_entry_t *pktio_entry, void *mac_addr) { - const pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + const pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; rte_eth_macaddr_get(pkt_dpdk->portid, (struct ether_addr *)mac_addr); @@ -660,8 +653,7 @@ static int mac_get_pkt_dpdk(pktio_entry_t *pktio_entry, void *mac_addr) static int capability_pkt_dpdk(pktio_entry_t *pktio_entry, odp_pktio_capability_t *capa) { - const pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + const pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; *capa = pkt_dpdk->capa; return 0; @@ -669,8 +661,7 @@ static int capability_pkt_dpdk(pktio_entry_t *pktio_entry, static int link_status_pkt_dpdk(pktio_entry_t *pktio_entry) { - const pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + const pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; struct rte_eth_link link; rte_eth_link_get(pkt_dpdk->portid, &link); @@ -693,8 +684,7 @@ static void stats_convert(struct rte_eth_stats *rte_stats, static int stats_pkt_dpdk(pktio_entry_t *pktio_entry, odp_pktio_stats_t *stats) { - const pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + const pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; int ret; struct rte_eth_stats rte_stats; @@ -712,8 +702,7 @@ static int stats_pkt_dpdk(pktio_entry_t *pktio_entry, odp_pktio_stats_t *stats) static int stats_reset_pkt_dpdk(pktio_entry_t *pktio_entry) { - const pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + const pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; rte_eth_stats_reset(pkt_dpdk->portid); return 0; diff --git a/platform/linux-generic/include/odp_packet_io_internal.h b/platform/linux-generic/include/odp_packet_io_internal.h index 7df11618e..6912b8519 100644 --- a/platform/linux-generic/include/odp_packet_io_internal.h +++ b/platform/linux-generic/include/odp_packet_io_internal.h @@ -43,8 +43,8 @@ typedef union pktio_entry_u pktio_entry_t; struct pktio_entry { const pktio_ops_module_t *ops; /**< Implementation specific methods */ - uint8_t ops_data[ODP_PKTIO_ODPS_DATA_MAX_SIZE]; /**< IO operation - specific data */ + void *ops_data; /**< IO operation specific data */ + /* These two locks together lock the whole pktio device */ odp_ticketlock_t rxl; /**< RX ticketlock */ odp_ticketlock_t txl; /**< TX ticketlock */ diff --git a/platform/linux-generic/include/odp_pktio_ops_subsystem.h b/platform/linux-generic/include/odp_pktio_ops_subsystem.h index cb107fed2..f93011e9e 100644 --- a/platform/linux-generic/include/odp_pktio_ops_subsystem.h +++ b/platform/linux-generic/include/odp_pktio_ops_subsystem.h @@ -16,6 +16,7 @@ extern "C" { #include #include +#include /* ODP packet IO operations subsystem declaration */ ODP_SUBSYSTEM_DECLARE(pktio_ops); @@ -85,13 +86,6 @@ typedef ODP_MODULE_CLASS(pktio_ops) { odp_api_proto(pktio_ops, print) print; } pktio_ops_module_t; -/* Maximum size of pktio specific ops data.*/ -#define ODP_PKTIO_ODPS_DATA_MAX_SIZE 80000 - -/* Extract pktio ops data from pktio entry structure */ -#define odp_ops_data(_p, _mod) \ - ((pktio_ops_ ## _mod ## _data_t *)(uintptr_t)_p->s.ops_data) - #ifdef __cplusplus } #endif diff --git a/platform/linux-generic/pktio/dpdk.c b/platform/linux-generic/pktio/dpdk.c index 4ef111c34..7d39bb1bc 100644 --- a/platform/linux-generic/pktio/dpdk.c +++ b/platform/linux-generic/pktio/dpdk.c @@ -382,7 +382,7 @@ static inline int mbuf_to_pkt(pktio_entry_t *pktio_entry, struct rte_mbuf *mbuf_table[], uint16_t mbuf_num, odp_time_t *ts) { - pktio_ops_dpdk_data_t *pkt_dpdk = odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; odp_packet_t pkt; odp_packet_hdr_t *pkt_hdr; uint16_t pkt_len; @@ -564,8 +564,7 @@ static inline int pkt_to_mbuf(pktio_entry_t *pktio_entry, struct rte_mbuf *mbuf_table[], const odp_packet_t pkt_table[], uint16_t num) { - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; int i, j; char *data; uint16_t pkt_len; @@ -609,8 +608,7 @@ static inline int mbuf_to_pkt_zero(pktio_entry_t *pktio_entry, struct rte_mbuf *mbuf_table[], uint16_t mbuf_num, odp_time_t *ts) { - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; odp_packet_t pkt; odp_packet_hdr_t *pkt_hdr; uint16_t pkt_len; @@ -683,8 +681,7 @@ static inline int pkt_to_mbuf_zero(pktio_entry_t *pktio_entry, const odp_packet_t pkt_table[], uint16_t num, uint16_t *copy_count) { - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; odp_pktout_config_opt_t *pktout_cfg = &pktio_entry->s.config.pktout; int i; *copy_count = 0; @@ -778,8 +775,7 @@ static uint32_t dpdk_vdev_mtu_get(uint8_t port_id) static uint32_t dpdk_mtu_get(pktio_entry_t *pktio_entry) { - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; uint32_t mtu = 0; if (rte_eth_dev_get_mtu(pkt_dpdk->port_id, (uint16_t *)&mtu)) @@ -872,8 +868,7 @@ static void rss_conf_to_hash_proto(struct rte_eth_rss_conf *rss_conf, static int dpdk_setup_port(pktio_entry_t *pktio_entry) { int ret; - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; struct rte_eth_rss_conf rss_conf; uint16_t hw_ip_checksum = 0; @@ -921,8 +916,7 @@ static int dpdk_setup_port(pktio_entry_t *pktio_entry) static int dpdk_close(pktio_entry_t *pktio_entry) { - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; unsigned idx; unsigned i, j; @@ -934,7 +928,7 @@ static int dpdk_close(pktio_entry_t *pktio_entry) rte_pktmbuf_free(pkt_dpdk->rx_cache[i].s.pkt[idx++]); } - return 0; + return ODP_OPS_DATA_FREE(pktio_entry->s.ops_data); } static int dpdk_pktio_init(void) @@ -1088,8 +1082,7 @@ static int dpdk_pktio_term(void) static int dpdk_input_queues_config(pktio_entry_t *pktio_entry, const odp_pktin_queue_param_t *p) { - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; odp_pktin_mode_t mode = pktio_entry->s.param.in_mode; odp_bool_t lockless; @@ -1113,8 +1106,7 @@ static int dpdk_input_queues_config(pktio_entry_t *pktio_entry, static int dpdk_output_queues_config(pktio_entry_t *pktio_entry, const odp_pktout_queue_param_t *p) { - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; odp_bool_t lockless; if (p->op_mode == ODP_PKTIO_OP_MT_UNSAFE) @@ -1130,8 +1122,7 @@ static int dpdk_output_queues_config(pktio_entry_t *pktio_entry, static void dpdk_init_capability(pktio_entry_t *pktio_entry, struct rte_eth_dev_info *dev_info) { - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; odp_pktio_capability_t *capa = &pkt_dpdk->capa; int ptype_cnt; int ptype_l3_ipv4 = 0; @@ -1208,8 +1199,7 @@ static int dpdk_open(odp_pktio_t id ODP_UNUSED, const char *netdev, odp_pool_t pool) { - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = NULL; struct rte_eth_dev_info dev_info; struct rte_mempool *pkt_pool; char pool_name[RTE_MEMPOOL_NAMESIZE]; @@ -1223,6 +1213,7 @@ static int dpdk_open(odp_pktio_t id ODP_UNUSED, if (pool == ODP_POOL_INVALID) return -1; + pool_entry = pool_entry_from_hdl(pool); if (!dpdk_netdev_is_valid(netdev)) { @@ -1237,10 +1228,12 @@ static int dpdk_open(odp_pktio_t id ODP_UNUSED, dpdk_initialized = 1; } - if (odp_unlikely(pkt_dpdk == NULL)) { + pktio_entry->s.ops_data = ODP_OPS_DATA_ALLOC(sizeof(*pkt_dpdk)); + if (odp_unlikely(pktio_entry->s.ops_data == NULL)) { ODP_ERR("Failed to allocate pktio_ops_dpdk_data_t struct"); return -1; } + pkt_dpdk = pktio_entry->s.ops_data; /* Init pktio entry */ memset(pkt_dpdk, 0, sizeof(*pkt_dpdk)); @@ -1250,6 +1243,7 @@ static int dpdk_open(odp_pktio_t id ODP_UNUSED, if (rte_eth_dev_count() == 0) { ODP_ERR("No DPDK ports found\n"); + ODP_OPS_DATA_FREE(pktio_entry->s.ops_data); return -1; } @@ -1258,6 +1252,7 @@ static int dpdk_open(odp_pktio_t id ODP_UNUSED, mtu = dpdk_mtu_get(pktio_entry); if (mtu == 0) { ODP_ERR("Failed to read interface MTU\n"); + ODP_OPS_DATA_FREE(pktio_entry->s.ops_data); return -1; } pkt_dpdk->mtu = mtu + _ODP_ETHHDR_LEN; @@ -1294,6 +1289,7 @@ static int dpdk_open(odp_pktio_t id ODP_UNUSED, } if (pkt_pool == NULL) { ODP_ERR("Cannot init mbuf packet pool\n"); + ODP_OPS_DATA_FREE(pktio_entry->s.ops_data); return -1; } @@ -1318,8 +1314,7 @@ static int dpdk_open(odp_pktio_t id ODP_UNUSED, static int dpdk_start(pktio_entry_t *pktio_entry) { - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; uint8_t port_id = pkt_dpdk->port_id; int ret; unsigned i; @@ -1370,8 +1365,7 @@ static int dpdk_start(pktio_entry_t *pktio_entry) static int dpdk_stop(pktio_entry_t *pktio_entry) { - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; rte_eth_dev_stop(pkt_dpdk->port_id); @@ -1381,8 +1375,7 @@ static int dpdk_stop(pktio_entry_t *pktio_entry) static int dpdk_recv(pktio_entry_t *pktio_entry, int index, odp_packet_t pkt_table[], int num) { - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; pkt_cache_t *rx_cache = &pkt_dpdk->rx_cache[index]; odp_time_t ts_val; odp_time_t *ts = NULL; @@ -1457,8 +1450,7 @@ static int dpdk_send(pktio_entry_t *pktio_entry, int index, const odp_packet_t pkt_table[], int num) { struct rte_mbuf *tx_mbufs[num]; - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; uint16_t copy_count = 0; int tx_pkts; int i; @@ -1521,8 +1513,7 @@ static int dpdk_send(pktio_entry_t *pktio_entry, int index, static int dpdk_mac_addr_get(pktio_entry_t *pktio_entry, void *mac_addr) { - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; rte_eth_macaddr_get(pkt_dpdk->port_id, (struct ether_addr *)mac_addr); @@ -1531,8 +1522,7 @@ static int dpdk_mac_addr_get(pktio_entry_t *pktio_entry, void *mac_addr) static int dpdk_promisc_mode_set(pktio_entry_t *pktio_entry, odp_bool_t enable) { - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; uint8_t port_id = pkt_dpdk->port_id; if (pkt_dpdk->vdev_sysc_promisc) @@ -1548,8 +1538,7 @@ static int dpdk_promisc_mode_set(pktio_entry_t *pktio_entry, odp_bool_t enable) static int dpdk_promisc_mode_get(pktio_entry_t *pktio_entry) { - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; uint8_t port_id = pkt_dpdk->port_id; if (pkt_dpdk->vdev_sysc_promisc) @@ -1561,8 +1550,7 @@ static int dpdk_promisc_mode_get(pktio_entry_t *pktio_entry) static int dpdk_capability(pktio_entry_t *pktio_entry, odp_pktio_capability_t *capa) { - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; *capa = pkt_dpdk->capa; return 0; @@ -1570,8 +1558,7 @@ static int dpdk_capability(pktio_entry_t *pktio_entry, static int dpdk_link_status(pktio_entry_t *pktio_entry) { - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; struct rte_eth_link link; memset(&link, 0, sizeof(struct rte_eth_link)); @@ -1595,8 +1582,7 @@ static void stats_convert(const struct rte_eth_stats *rte_stats, static int dpdk_stats(pktio_entry_t *pktio_entry, odp_pktio_stats_t *stats) { - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; int ret; struct rte_eth_stats rte_stats; @@ -1611,8 +1597,7 @@ static int dpdk_stats(pktio_entry_t *pktio_entry, odp_pktio_stats_t *stats) static int dpdk_stats_reset(pktio_entry_t *pktio_entry) { - pktio_ops_dpdk_data_t *pkt_dpdk = - odp_ops_data(pktio_entry, dpdk); + pktio_ops_dpdk_data_t *pkt_dpdk = pktio_entry->s.ops_data; rte_eth_stats_reset(pkt_dpdk->port_id); return 0; diff --git a/platform/linux-generic/pktio/ipc.c b/platform/linux-generic/pktio/ipc.c index 5ab957403..9d928c72a 100644 --- a/platform/linux-generic/pktio/ipc.c +++ b/platform/linux-generic/pktio/ipc.c @@ -49,7 +49,7 @@ static const char *_ipc_odp_buffer_pool_shm_name(odp_pool_t pool_hdl) static int _ipc_master_start(pktio_entry_t *pktio_entry) { - pktio_ops_ipc_data_t *pkt_ipc = odp_ops_data(pktio_entry, ipc); + pktio_ops_ipc_data_t *pkt_ipc = pktio_entry->s.ops_data; struct pktio_info *pinfo = pkt_ipc->pinfo; odp_shm_t shm; @@ -78,7 +78,7 @@ static int _ipc_init_master(pktio_entry_t *pktio_entry, const char *dev, odp_pool_t pool_hdl) { - pktio_ops_ipc_data_t *pkt_ipc = odp_ops_data(pktio_entry, ipc); + pktio_ops_ipc_data_t *pkt_ipc = pktio_entry->s.ops_data; char ipc_shm_name[ODP_POOL_NAME_LEN + sizeof("_m_prod")]; pool_t *pool; struct pktio_info *pinfo; @@ -230,7 +230,7 @@ static int _ipc_init_slave(const char *dev, pktio_entry_t *pktio_entry, odp_pool_t pool) { - pktio_ops_ipc_data_t *pkt_ipc = odp_ops_data(pktio_entry, ipc); + pktio_ops_ipc_data_t *pkt_ipc = pktio_entry->s.ops_data; if (strlen(dev) > (ODP_POOL_NAME_LEN - sizeof("_slave_r"))) ODP_ABORT("too big ipc name\n"); @@ -241,7 +241,7 @@ static int _ipc_init_slave(const char *dev, static int _ipc_slave_start(pktio_entry_t *pktio_entry) { - pktio_ops_ipc_data_t *pkt_ipc = odp_ops_data(pktio_entry, ipc); + pktio_ops_ipc_data_t *pkt_ipc = pktio_entry->s.ops_data; char ipc_shm_name[ODP_POOL_NAME_LEN + sizeof("_slave_r")]; struct pktio_info *pinfo; odp_shm_t shm; @@ -343,7 +343,7 @@ static int ipc_pktio_open(odp_pktio_t id ODP_UNUSED, char name[ODP_POOL_NAME_LEN + sizeof("_info")]; char tail[ODP_POOL_NAME_LEN]; odp_shm_t shm; - pktio_ops_ipc_data_t *pkt_ipc = odp_ops_data(pktio_entry, ipc); + pktio_ops_ipc_data_t *pkt_ipc; ODP_STATIC_ASSERT(ODP_POOL_NAME_LEN == _RING_NAMESIZE, "mismatch pool and ring name arrays"); @@ -351,6 +351,15 @@ static int ipc_pktio_open(odp_pktio_t id ODP_UNUSED, if (strncmp(dev, "ipc", 3)) return -1; + pktio_entry->s.ops_data = ODP_OPS_DATA_ALLOC(sizeof(*pkt_ipc)); + if (odp_unlikely(pktio_entry->s.ops_data == NULL)) { + ODP_ERR("Failed to allocate pktio_ops_ipc_data_t struct"); + return -1; + } + + pkt_ipc = pktio_entry->s.ops_data; + memset(pkt_ipc, 0, sizeof(*pkt_ipc)); + odp_atomic_init_u32(&pkt_ipc->ready, 0); pkt_ipc->rx.cache = _ring_create("ipc_rx_cache", @@ -364,12 +373,15 @@ static int ipc_pktio_open(odp_pktio_t id ODP_UNUSED, snprintf(name, sizeof(name), "ipc:%s_info", tail); IPC_ODP_DBG("lookup for name %s for pid %d\n", name, pid); shm = odp_shm_import(name, pid, name); - if (ODP_SHM_INVALID == shm) + if (ODP_SHM_INVALID == shm) { + ODP_OPS_DATA_FREE(pktio_entry->s.ops_data); return -1; + } pinfo = odp_shm_addr(shm); if (!pinfo->master.init_done) { odp_shm_free(shm); + ODP_OPS_DATA_FREE(pktio_entry->s.ops_data); return -1; } pkt_ipc->pinfo = pinfo; @@ -384,6 +396,7 @@ static int ipc_pktio_open(odp_pktio_t id ODP_UNUSED, _ODP_ISHM_EXPORT | _ODP_ISHM_LOCK); if (ODP_SHM_INVALID == shm) { ODP_ERR("can not create shm %s\n", name); + ODP_OPS_DATA_FREE(pktio_entry->s.ops_data); return -1; } @@ -396,12 +409,14 @@ static int ipc_pktio_open(odp_pktio_t id ODP_UNUSED, ret = _ipc_init_master(pktio_entry, dev, pool); } + if (ret) + ODP_OPS_DATA_FREE(pktio_entry->s.ops_data); return ret; } static void _ipc_free_ring_packets(pktio_entry_t *pktio_entry, _ring_t *r) { - pktio_ops_ipc_data_t *pkt_ipc = odp_ops_data(pktio_entry, ipc); + pktio_ops_ipc_data_t *pkt_ipc = pktio_entry->s.ops_data; uintptr_t offsets[PKTIO_IPC_ENTRIES]; int ret; void **rbuf_p; @@ -437,7 +452,7 @@ static void _ipc_free_ring_packets(pktio_entry_t *pktio_entry, _ring_t *r) static int ipc_pktio_recv_lockless(pktio_entry_t *pktio_entry, odp_packet_t pkt_table[], int len) { - pktio_ops_ipc_data_t *pkt_ipc = odp_ops_data(pktio_entry, ipc); + pktio_ops_ipc_data_t *pkt_ipc = pktio_entry->s.ops_data; int pkts = 0; int i; _ring_t *r; @@ -590,7 +605,7 @@ static int ipc_pktio_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, static int ipc_pktio_send_lockless(pktio_entry_t *pktio_entry, const odp_packet_t pkt_table[], int len) { - pktio_ops_ipc_data_t *pkt_ipc = odp_ops_data(pktio_entry, ipc); + pktio_ops_ipc_data_t *pkt_ipc = pktio_entry->s.ops_data; _ring_t *r; void **rbuf_p; int ret; @@ -703,7 +718,7 @@ static int ipc_mac_addr_get(pktio_entry_t *pktio_entry ODP_UNUSED, static int ipc_start(pktio_entry_t *pktio_entry) { - pktio_ops_ipc_data_t *pkt_ipc = odp_ops_data(pktio_entry, ipc); + pktio_ops_ipc_data_t *pkt_ipc = pktio_entry->s.ops_data; uint32_t ready = odp_atomic_load_u32(&pkt_ipc->ready); if (ready) { @@ -719,7 +734,7 @@ static int ipc_start(pktio_entry_t *pktio_entry) static int ipc_stop(pktio_entry_t *pktio_entry) { - pktio_ops_ipc_data_t *pkt_ipc = odp_ops_data(pktio_entry, ipc); + pktio_ops_ipc_data_t *pkt_ipc = pktio_entry->s.ops_data; unsigned tx_send = 0, tx_free = 0; odp_atomic_store_u32(&pkt_ipc->ready, 0); @@ -746,7 +761,7 @@ static int ipc_stop(pktio_entry_t *pktio_entry) static int ipc_close(pktio_entry_t *pktio_entry) { - pktio_ops_ipc_data_t *pkt_ipc = odp_ops_data(pktio_entry, ipc); + pktio_ops_ipc_data_t *pkt_ipc = pktio_entry->s.ops_data; char ipc_shm_name[ODP_POOL_NAME_LEN + sizeof("_m_prod")]; char *dev = pktio_entry->s.name; char name[ODP_POOL_NAME_LEN]; @@ -776,7 +791,7 @@ static int ipc_close(pktio_entry_t *pktio_entry) _ring_destroy(ipc_shm_name); _ring_destroy("ipc_rx_cache"); - return 0; + return ODP_OPS_DATA_FREE(pktio_entry->s.ops_data); } static int ipc_pktio_init_global(void) diff --git a/platform/linux-generic/pktio/loopback.c b/platform/linux-generic/pktio/loopback.c index 60bee5913..ff08364a2 100644 --- a/platform/linux-generic/pktio/loopback.c +++ b/platform/linux-generic/pktio/loopback.c @@ -32,20 +32,30 @@ static int loopback_stats_reset(pktio_entry_t *pktio_entry); static int loopback_open(odp_pktio_t id, pktio_entry_t *pktio_entry, const char *devname, odp_pool_t pool ODP_UNUSED) { - pktio_ops_loopback_data_t *pkt_lbk = - odp_ops_data(pktio_entry, loopback); + pktio_ops_loopback_data_t *pkt_lbk = NULL; if (strcmp(devname, "loop")) return -1; + pktio_entry->s.ops_data = ODP_OPS_DATA_ALLOC(sizeof(*pkt_lbk)); + if (odp_unlikely(pktio_entry->s.ops_data == NULL)) { + ODP_ERR("Failed to allocate pktio_ops_loopback_data_t struct"); + return -1; + } + + pkt_lbk = pktio_entry->s.ops_data; + memset(pkt_lbk, 0, sizeof(*pkt_lbk)); + char loopq_name[ODP_QUEUE_NAME_LEN]; snprintf(loopq_name, sizeof(loopq_name), "%" PRIu64 "-pktio_loopq", odp_pktio_to_u64(id)); pkt_lbk->loopq = odp_queue_create(loopq_name, NULL); - if (pkt_lbk->loopq == ODP_QUEUE_INVALID) + if (pkt_lbk->loopq == ODP_QUEUE_INVALID) { + ODP_OPS_DATA_FREE(pktio_entry->s.ops_data); return -1; + } loopback_stats_reset(pktio_entry); @@ -54,10 +64,16 @@ static int loopback_open(odp_pktio_t id, pktio_entry_t *pktio_entry, static int loopback_close(pktio_entry_t *pktio_entry) { - pktio_ops_loopback_data_t *pkt_lbk = - odp_ops_data(pktio_entry, loopback); + int result = 0; + pktio_ops_loopback_data_t *pkt_lbk = pktio_entry->s.ops_data; + + if (odp_queue_destroy(pkt_lbk->loopq)) + result = -1; + + if (ODP_OPS_DATA_FREE(pktio_entry->s.ops_data)) + result = -1; - return odp_queue_destroy(pkt_lbk->loopq); + return result; } static int loopback_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, @@ -72,8 +88,7 @@ static int loopback_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, odp_time_t *ts = NULL; int num_rx = 0; int failed = 0; - pktio_ops_loopback_data_t *pkt_lbk = - odp_ops_data(pktio_entry, loopback); + pktio_ops_loopback_data_t *pkt_lbk = pktio_entry->s.ops_data; if (odp_unlikely(len > QUEUE_MULTI_MAX)) len = QUEUE_MULTI_MAX; @@ -170,8 +185,7 @@ static int loopback_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, int i; int ret; uint32_t bytes = 0; - pktio_ops_loopback_data_t *pkt_lbk = - odp_ops_data(pktio_entry, loopback); + pktio_ops_loopback_data_t *pkt_lbk = pktio_entry->s.ops_data; if (odp_unlikely(len > QUEUE_MULTI_MAX)) len = QUEUE_MULTI_MAX; @@ -255,8 +269,7 @@ static int loopback_capability(pktio_entry_t *pktio_entry ODP_UNUSED, static int loopback_promisc_mode_set(pktio_entry_t *pktio_entry, odp_bool_t enable) { - pktio_ops_loopback_data_t *pkt_lbk = - odp_ops_data(pktio_entry, loopback); + pktio_ops_loopback_data_t *pkt_lbk = pktio_entry->s.ops_data; pkt_lbk->promisc = enable; return 0; @@ -264,8 +277,7 @@ static int loopback_promisc_mode_set(pktio_entry_t *pktio_entry, static int loopback_promisc_mode_get(pktio_entry_t *pktio_entry) { - pktio_ops_loopback_data_t *pkt_lbk = - odp_ops_data(pktio_entry, loopback); + pktio_ops_loopback_data_t *pkt_lbk = pktio_entry->s.ops_data; return pkt_lbk->promisc ? 1 : 0; } diff --git a/platform/linux-generic/pktio/netmap.c b/platform/linux-generic/pktio/netmap.c index 29c449e40..2631c816d 100644 --- a/platform/linux-generic/pktio/netmap.c +++ b/platform/linux-generic/pktio/netmap.c @@ -50,8 +50,7 @@ static int netmap_stats_reset(pktio_entry_t *pktio_entry); static int netmap_do_ioctl(pktio_entry_t *pktio_entry, unsigned long cmd, int subcmd) { - pktio_ops_netmap_data_t *pkt_nm = - odp_ops_data(pktio_entry, netmap); + pktio_ops_netmap_data_t *pkt_nm = pktio_entry->s.ops_data; struct ethtool_value eval; struct ifreq ifr; int err; @@ -138,8 +137,7 @@ static inline void map_netmap_rings(netmap_ring_t *rings, static int netmap_input_queues_config(pktio_entry_t *pktio_entry, const odp_pktin_queue_param_t *p) { - pktio_ops_netmap_data_t *pkt_nm = - odp_ops_data(pktio_entry, netmap); + pktio_ops_netmap_data_t *pkt_nm = pktio_entry->s.ops_data; odp_pktin_mode_t mode = pktio_entry->s.param.in_mode; unsigned num_queues = p->num_queues; odp_bool_t lockless; @@ -167,8 +165,7 @@ static int netmap_input_queues_config(pktio_entry_t *pktio_entry, static int netmap_output_queues_config(pktio_entry_t *pktio_entry, const odp_pktout_queue_param_t *p) { - pktio_ops_netmap_data_t *pkt_nm = - odp_ops_data(pktio_entry, netmap); + pktio_ops_netmap_data_t *pkt_nm = pktio_entry->s.ops_data; pkt_nm->lockless_tx = (p->op_mode == ODP_PKTIO_OP_MT_UNSAFE); @@ -185,8 +182,7 @@ static int netmap_output_queues_config(pktio_entry_t *pktio_entry, static inline void netmap_close_descriptors(pktio_entry_t *pktio_entry) { int i, j; - pktio_ops_netmap_data_t *pkt_nm = - odp_ops_data(pktio_entry, netmap); + pktio_ops_netmap_data_t *pkt_nm = pktio_entry->s.ops_data; for (i = 0; i < PKTIO_MAX_QUEUES; i++) { for (j = 0; j < NM_MAX_DESC; j++) { @@ -209,23 +205,30 @@ static inline void netmap_close_descriptors(pktio_entry_t *pktio_entry) static int netmap_close(pktio_entry_t *pktio_entry) { - pktio_ops_netmap_data_t *pkt_nm = - odp_ops_data(pktio_entry, netmap); + int status = 0; + pktio_ops_netmap_data_t *pkt_nm = pktio_entry->s.ops_data; netmap_close_descriptors(pktio_entry); if (pkt_nm->sockfd != -1 && close(pkt_nm->sockfd) != 0) { __odp_errno = errno; ODP_ERR("close(sockfd): %s\n", strerror(errno)); - return -1; + + status = -1; } - return 0; + + if (ODP_OPS_DATA_FREE(pktio_entry->s.ops_data)) { + ODP_ERR("ops_data_free(netmap) failed\n"); + + status = -1; + } + + return status; } static int netmap_link_status(pktio_entry_t *pktio_entry) { - pktio_ops_netmap_data_t *pkt_nm = - odp_ops_data(pktio_entry, netmap); + pktio_ops_netmap_data_t *pkt_nm = pktio_entry->s.ops_data; if (pkt_nm->is_virtual) return 1; @@ -246,8 +249,7 @@ static inline int netmap_wait_for_link(pktio_entry_t *pktio_entry) { int i; int ret; - pktio_ops_netmap_data_t *pkt_nm = - odp_ops_data(pktio_entry, netmap); + pktio_ops_netmap_data_t *pkt_nm = pktio_entry->s.ops_data; /* Wait for the link to come up */ for (i = 0; i <= NM_WAIT_TIMEOUT; i++) { @@ -275,8 +277,7 @@ static inline int netmap_wait_for_link(pktio_entry_t *pktio_entry) */ static void netmap_init_capability(pktio_entry_t *pktio_entry) { - pktio_ops_netmap_data_t *pkt_nm = - odp_ops_data(pktio_entry, netmap); + pktio_ops_netmap_data_t *pkt_nm = pktio_entry->s.ops_data; odp_pktio_capability_t *capa = &pkt_nm->capa; memset(&pkt_nm->capa, 0, sizeof(odp_pktio_capability_t)); @@ -343,8 +344,7 @@ static int netmap_open(odp_pktio_t id ODP_UNUSED, pktio_entry_t *pktio_entry, const char *prefix; uint32_t mtu; uint32_t buf_size; - pktio_ops_netmap_data_t *pkt_nm = - odp_ops_data(pktio_entry, netmap); + pktio_ops_netmap_data_t *pkt_nm = NULL; struct nm_desc *desc; struct netmap_ring *ring; odp_pktin_hash_proto_t hash_proto; @@ -356,6 +356,13 @@ static int netmap_open(odp_pktio_t id ODP_UNUSED, pktio_entry_t *pktio_entry, if (pool == ODP_POOL_INVALID) return -1; + pktio_entry->s.ops_data = ODP_OPS_DATA_ALLOC(sizeof(*pkt_nm)); + if (odp_unlikely(pktio_entry->s.ops_data == NULL)) { + ODP_ERR("Failed to allocate pktio_ops_netmap_data_t struct"); + return -1; + } + pkt_nm = pktio_entry->s.ops_data; + /* Init pktio entry */ memset(pkt_nm, 0, sizeof(*pkt_nm)); pkt_nm->sockfd = -1; @@ -476,8 +483,7 @@ static int netmap_open(odp_pktio_t id ODP_UNUSED, pktio_entry_t *pktio_entry, static int netmap_start(pktio_entry_t *pktio_entry) { - pktio_ops_netmap_data_t *pkt_nm = - odp_ops_data(pktio_entry, netmap); + pktio_ops_netmap_data_t *pkt_nm = pktio_entry->s.ops_data; netmap_ring_t *desc_ring; struct nm_desc *desc_ptr; unsigned i; @@ -633,8 +639,7 @@ static inline int netmap_pkt_to_odp(pktio_entry_t *pktio_entry, netmap_slot_t slot_tbl[], int16_t slot_num, odp_time_t *ts) { - pktio_ops_netmap_data_t *pkt_nm = - odp_ops_data(pktio_entry, netmap); + pktio_ops_netmap_data_t *pkt_nm = pktio_entry->s.ops_data; odp_packet_t pkt; odp_pool_t pool = pkt_nm->pool; odp_packet_hdr_t *pkt_hdr; @@ -750,8 +755,7 @@ static int netmap_recv(pktio_entry_t *pktio_entry, int index, odp_packet_t pkt_table[], int num) { struct nm_desc *desc; - pktio_ops_netmap_data_t *pkt_nm = - odp_ops_data(pktio_entry, netmap); + pktio_ops_netmap_data_t *pkt_nm = pktio_entry->s.ops_data; unsigned first_desc_id = pkt_nm->rx_desc_ring[index].s.first; unsigned last_desc_id = pkt_nm->rx_desc_ring[index].s.last; unsigned desc_id; @@ -804,8 +808,7 @@ static int netmap_recv(pktio_entry_t *pktio_entry, int index, static int netmap_send(pktio_entry_t *pktio_entry, int index, const odp_packet_t pkt_table[], int num) { - pktio_ops_netmap_data_t *pkt_nm = - odp_ops_data(pktio_entry, netmap); + pktio_ops_netmap_data_t *pkt_nm = pktio_entry->s.ops_data; struct pollfd polld; struct nm_desc *desc; struct netmap_ring *ring; @@ -880,8 +883,7 @@ static int netmap_send(pktio_entry_t *pktio_entry, int index, static int netmap_mac_addr_get(pktio_entry_t *pktio_entry, void *mac_addr) { - pktio_ops_netmap_data_t *pkt_nm = - odp_ops_data(pktio_entry, netmap); + pktio_ops_netmap_data_t *pkt_nm = pktio_entry->s.ops_data; memcpy(mac_addr, pkt_nm->if_mac, ETH_ALEN); return ETH_ALEN; @@ -889,8 +891,7 @@ static int netmap_mac_addr_get(pktio_entry_t *pktio_entry, void *mac_addr) static uint32_t netmap_mtu_get(pktio_entry_t *pktio_entry) { - pktio_ops_netmap_data_t *pkt_nm = - odp_ops_data(pktio_entry, netmap); + pktio_ops_netmap_data_t *pkt_nm = pktio_entry->s.ops_data; return pkt_nm->mtu; } @@ -898,8 +899,7 @@ static uint32_t netmap_mtu_get(pktio_entry_t *pktio_entry) static int netmap_promisc_mode_set(pktio_entry_t *pktio_entry, odp_bool_t enable) { - pktio_ops_netmap_data_t *pkt_nm = - odp_ops_data(pktio_entry, netmap); + pktio_ops_netmap_data_t *pkt_nm = pktio_entry->s.ops_data; if (pkt_nm->is_virtual) { __odp_errno = ENOTSUP; @@ -911,8 +911,7 @@ static int netmap_promisc_mode_set(pktio_entry_t *pktio_entry, static int netmap_promisc_mode_get(pktio_entry_t *pktio_entry) { - pktio_ops_netmap_data_t *pkt_nm = - odp_ops_data(pktio_entry, netmap); + pktio_ops_netmap_data_t *pkt_nm = pktio_entry->s.ops_data; if (pkt_nm->is_virtual) return 0; @@ -923,8 +922,7 @@ static int netmap_promisc_mode_get(pktio_entry_t *pktio_entry) static int netmap_capability(pktio_entry_t *pktio_entry, odp_pktio_capability_t *capa) { - pktio_ops_netmap_data_t *pkt_nm = - odp_ops_data(pktio_entry, netmap); + pktio_ops_netmap_data_t *pkt_nm = pktio_entry->s.ops_data; *capa = pkt_nm->capa; return 0; @@ -933,8 +931,7 @@ static int netmap_capability(pktio_entry_t *pktio_entry, static int netmap_stats(pktio_entry_t *pktio_entry, odp_pktio_stats_t *stats) { - pktio_ops_netmap_data_t *pkt_nm = - odp_ops_data(pktio_entry, netmap); + pktio_ops_netmap_data_t *pkt_nm = pktio_entry->s.ops_data; if (pktio_entry->s.stats_type == STATS_UNSUPPORTED) { memset(stats, 0, sizeof(*stats)); @@ -947,8 +944,7 @@ static int netmap_stats(pktio_entry_t *pktio_entry, static int netmap_stats_reset(pktio_entry_t *pktio_entry) { - pktio_ops_netmap_data_t *pkt_nm = - odp_ops_data(pktio_entry, netmap); + pktio_ops_netmap_data_t *pkt_nm = pktio_entry->s.ops_data; if (pktio_entry->s.stats_type == STATS_UNSUPPORTED) { memset(&pktio_entry->s.stats, 0, @@ -962,8 +958,7 @@ static int netmap_stats_reset(pktio_entry_t *pktio_entry) static void netmap_print(pktio_entry_t *pktio_entry) { odp_pktin_hash_proto_t hash_proto; - pktio_ops_netmap_data_t *pkt_nm = - odp_ops_data(pktio_entry, netmap); + pktio_ops_netmap_data_t *pkt_nm = pktio_entry->s.ops_data; if (rss_conf_get_fd(pkt_nm->sockfd, pkt_nm->if_name, &hash_proto)) rss_conf_print(&hash_proto); diff --git a/platform/linux-generic/pktio/pcap.c b/platform/linux-generic/pktio/pcap.c index 5bfaeef0e..f3f000574 100644 --- a/platform/linux-generic/pktio/pcap.c +++ b/platform/linux-generic/pktio/pcap.c @@ -140,10 +140,17 @@ static int _pcapif_init_tx(pktio_ops_pcap_data_t *pcap) static int pcapif_init(odp_pktio_t id ODP_UNUSED, pktio_entry_t *pktio_entry, const char *devname, odp_pool_t pool) { - pktio_ops_pcap_data_t *pcap = odp_ops_data(pktio_entry, pcap); + pktio_ops_pcap_data_t *pcap = NULL; int ret; - memset(pcap, 0, sizeof(pktio_ops_pcap_data_t)); + pktio_entry->s.ops_data = ODP_OPS_DATA_ALLOC(sizeof(*pcap)); + if (odp_unlikely(pktio_entry->s.ops_data == NULL)) { + ODP_ERR("Failed to allocate pktio_ops_pcap_data_t struct"); + return -1; + } + pcap = pktio_entry->s.ops_data; + + memset(pcap, 0, sizeof(*pcap)); pcap->loop_cnt = 1; pcap->loops = 1; pcap->pool = pool; @@ -162,12 +169,15 @@ static int pcapif_init(odp_pktio_t id ODP_UNUSED, pktio_entry_t *pktio_entry, (void)pcapif_stats_reset(pktio_entry); + if (ret) + ODP_OPS_DATA_FREE(pktio_entry->s.ops_data); + return ret; } static int pcapif_close(pktio_entry_t *pktio_entry) { - pktio_ops_pcap_data_t *pcap = odp_ops_data(pktio_entry, pcap); + pktio_ops_pcap_data_t *pcap = pktio_entry->s.ops_data; if (pcap->tx_dump) pcap_dump_close(pcap->tx_dump); @@ -182,7 +192,7 @@ static int pcapif_close(pktio_entry_t *pktio_entry) free(pcap->fname_rx); free(pcap->fname_tx); - return 0; + return ODP_OPS_DATA_FREE(pktio_entry->s.ops_data); } static int _pcapif_reopen(pktio_ops_pcap_data_t *pcap) @@ -214,7 +224,7 @@ static int pcapif_recv_pkt(pktio_entry_t *pktio_entry, int index ODP_UNUSED, odp_packet_t pkt; odp_packet_hdr_t *pkt_hdr; uint32_t pkt_len; - pktio_ops_pcap_data_t *pcap = odp_ops_data(pktio_entry, pcap); + pktio_ops_pcap_data_t *pcap = pktio_entry->s.ops_data; odp_time_t ts_val; odp_time_t *ts = NULL; @@ -297,7 +307,7 @@ static int _pcapif_dump_pkt(pktio_ops_pcap_data_t *pcap, odp_packet_t pkt) static int pcapif_send_pkt(pktio_entry_t *pktio_entry, int index ODP_UNUSED, const odp_packet_t pkts[], int len) { - pktio_ops_pcap_data_t *pcap = odp_ops_data(pktio_entry, pcap); + pktio_ops_pcap_data_t *pcap = pktio_entry->s.ops_data; int i; odp_ticketlock_lock(&pktio_entry->s.txl); @@ -365,7 +375,7 @@ static int pcapif_promisc_mode_set(pktio_entry_t *pktio_entry, { char filter_exp[64] = {0}; struct bpf_program bpf; - pktio_ops_pcap_data_t *pcap = odp_ops_data(pktio_entry, pcap); + pktio_ops_pcap_data_t *pcap = pktio_entry->s.ops_data; if (!pcap->rx) { pcap->promisc = enable; @@ -405,7 +415,7 @@ static int pcapif_promisc_mode_set(pktio_entry_t *pktio_entry, static int pcapif_promisc_mode_get(pktio_entry_t *pktio_entry) { - pktio_ops_pcap_data_t *pcap = odp_ops_data(pktio_entry, pcap); + pktio_ops_pcap_data_t *pcap = pktio_entry->s.ops_data; return pcap->promisc; } diff --git a/platform/linux-generic/pktio/socket.c b/platform/linux-generic/pktio/socket.c index d9f85b29a..7e0485b99 100644 --- a/platform/linux-generic/pktio/socket.c +++ b/platform/linux-generic/pktio/socket.c @@ -110,16 +110,21 @@ int sendmmsg(int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags) */ static int sock_close(pktio_entry_t *pktio_entry) { - pktio_ops_socket_data_t *pkt_sock = - odp_ops_data(pktio_entry, socket); + int result = 0; + pktio_ops_socket_data_t *pkt_sock = pktio_entry->s.ops_data; if (pkt_sock->sockfd != -1 && close(pkt_sock->sockfd) != 0) { __odp_errno = errno; ODP_ERR("close(sockfd): %s\n", strerror(errno)); - return -1; + result = -1; } - return 0; + if (ODP_OPS_DATA_FREE(pktio_entry->s.ops_data)) { + ODP_ERR("ops_data_free(socket) failed\n"); + result = -1; + } + + return result; } /* @@ -134,18 +139,25 @@ static int sock_setup_pkt(pktio_entry_t *pktio_entry, const char *netdev, struct ifreq ethreq; struct sockaddr_ll sa_ll; char shm_name[ODP_SHM_NAME_LEN]; - pktio_ops_socket_data_t *pkt_sock = - odp_ops_data(pktio_entry, socket); + pktio_ops_socket_data_t *pkt_sock = NULL; odp_pktio_stats_t cur_stats; + if (pool == ODP_POOL_INVALID) + return -1; + + pktio_entry->s.ops_data = ODP_OPS_DATA_ALLOC(sizeof(*pkt_sock)); + if (odp_unlikely(pktio_entry->s.ops_data == NULL)) { + ODP_ERR("Failed to allocate pktio_ops_socket_data_t struct"); + return -1; + } + pkt_sock = pktio_entry->s.ops_data; + /* Init pktio entry */ memset(pkt_sock, 0, sizeof(*pkt_sock)); /* set sockfd to -1, because a valid socked might be initialized to 0 */ pkt_sock->sockfd = -1; - - if (pool == ODP_POOL_INVALID) - return -1; pkt_sock->pool = pool; + snprintf(shm_name, ODP_SHM_NAME_LEN, "%s-%s", "pktio", netdev); shm_name[ODP_SHM_NAME_LEN - 1] = '\0'; @@ -212,7 +224,6 @@ static int sock_setup_pkt(pktio_entry_t *pktio_entry, const char *netdev, error: sock_close(pktio_entry); - return -1; } @@ -259,8 +270,7 @@ static uint32_t _rx_pkt_to_iovec(odp_packet_t pkt, static int sock_mmsg_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, odp_packet_t pkt_table[], int len) { - pktio_ops_socket_data_t *pkt_sock = - odp_ops_data(pktio_entry, socket); + pktio_ops_socket_data_t *pkt_sock = pktio_entry->s.ops_data; odp_pool_t pool = pkt_sock->pool; odp_time_t ts_val; odp_time_t *ts = NULL; @@ -375,8 +385,7 @@ static uint32_t _tx_pkt_to_iovec(odp_packet_t pkt, static int sock_mmsg_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, const odp_packet_t pkt_table[], int len) { - pktio_ops_socket_data_t *pkt_sock = - odp_ops_data(pktio_entry, socket); + pktio_ops_socket_data_t *pkt_sock = pktio_entry->s.ops_data; struct mmsghdr msgvec[len]; struct iovec iovecs[len][MAX_SEGS]; int ret; @@ -422,8 +431,7 @@ static int sock_mmsg_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, */ static uint32_t sock_mtu_get(pktio_entry_t *pktio_entry) { - pktio_ops_socket_data_t *pkt_sock = - odp_ops_data(pktio_entry, socket); + pktio_ops_socket_data_t *pkt_sock = pktio_entry->s.ops_data; return pkt_sock->mtu; } @@ -434,8 +442,7 @@ static uint32_t sock_mtu_get(pktio_entry_t *pktio_entry) static int sock_mac_addr_get(pktio_entry_t *pktio_entry, void *mac_addr) { - pktio_ops_socket_data_t *pkt_sock = - odp_ops_data(pktio_entry, socket); + pktio_ops_socket_data_t *pkt_sock = pktio_entry->s.ops_data; memcpy(mac_addr, pkt_sock->if_mac, ETH_ALEN); return ETH_ALEN; @@ -447,8 +454,7 @@ static int sock_mac_addr_get(pktio_entry_t *pktio_entry, static int sock_promisc_mode_set(pktio_entry_t *pktio_entry, odp_bool_t enable) { - pktio_ops_socket_data_t *pkt_sock = - odp_ops_data(pktio_entry, socket); + pktio_ops_socket_data_t *pkt_sock = pktio_entry->s.ops_data; return promisc_mode_set_fd(pkt_sock->sockfd, pktio_entry->s.name, enable); @@ -459,8 +465,7 @@ static int sock_promisc_mode_set(pktio_entry_t *pktio_entry, */ static int sock_promisc_mode_get(pktio_entry_t *pktio_entry) { - pktio_ops_socket_data_t *pkt_sock = - odp_ops_data(pktio_entry, socket); + pktio_ops_socket_data_t *pkt_sock = pktio_entry->s.ops_data; return promisc_mode_get_fd(pkt_sock->sockfd, pktio_entry->s.name); @@ -468,8 +473,7 @@ static int sock_promisc_mode_get(pktio_entry_t *pktio_entry) static int sock_link_status(pktio_entry_t *pktio_entry) { - pktio_ops_socket_data_t *pkt_sock = - odp_ops_data(pktio_entry, socket); + pktio_ops_socket_data_t *pkt_sock = pktio_entry->s.ops_data; return link_status_fd(pkt_sock->sockfd, pktio_entry->s.name); @@ -493,8 +497,7 @@ static int sock_capability(pktio_entry_t *pktio_entry ODP_UNUSED, static int sock_stats(pktio_entry_t *pktio_entry, odp_pktio_stats_t *stats) { - pktio_ops_socket_data_t *pkt_sock = - odp_ops_data(pktio_entry, socket); + pktio_ops_socket_data_t *pkt_sock = pktio_entry->s.ops_data; if (pktio_entry->s.stats_type == STATS_UNSUPPORTED) { memset(stats, 0, sizeof(*stats)); @@ -506,8 +509,7 @@ static int sock_stats(pktio_entry_t *pktio_entry, static int sock_stats_reset(pktio_entry_t *pktio_entry) { - pktio_ops_socket_data_t *pkt_sock = - odp_ops_data(pktio_entry, socket); + pktio_ops_socket_data_t *pkt_sock = pktio_entry->s.ops_data; if (pktio_entry->s.stats_type == STATS_UNSUPPORTED) { memset(&pktio_entry->s.stats, 0, diff --git a/platform/linux-generic/pktio/socket_mmap.c b/platform/linux-generic/pktio/socket_mmap.c index b5c27ef4b..271c2f0f7 100644 --- a/platform/linux-generic/pktio/socket_mmap.c +++ b/platform/linux-generic/pktio/socket_mmap.c @@ -494,23 +494,27 @@ static int mmap_bind_sock(pktio_ops_socket_mmap_data_t *pkt_sock, static int sock_mmap_close(pktio_entry_t *entry) { - pktio_ops_socket_mmap_data_t - *const pkt_sock = odp_ops_data(entry, socket_mmap); + pktio_ops_socket_mmap_data_t *const pkt_sock = entry->s.ops_data; int ret; + int status = 0; ret = mmap_unmap_sock(pkt_sock); if (ret != 0) { ODP_ERR("mmap_unmap_sock() %s\n", strerror(errno)); - return -1; + status = -1; } if (pkt_sock->sockfd != -1 && close(pkt_sock->sockfd) != 0) { __odp_errno = errno; ODP_ERR("close(sockfd): %s\n", strerror(errno)); - return -1; + status = -1; } - return 0; + if (ODP_OPS_DATA_FREE(entry->s.ops_data)) { + ODP_ERR("ops_data_free(sock_mmap) failed\n"); + status = -1; + } + return status; } static int sock_mmap_open(odp_pktio_t id ODP_UNUSED, @@ -520,22 +524,27 @@ static int sock_mmap_open(odp_pktio_t id ODP_UNUSED, int if_idx; int ret = 0; odp_pktio_stats_t cur_stats; + pktio_ops_socket_mmap_data_t *pkt_sock; + int fanout = 1; if (disable_pktio) return -1; - pktio_ops_socket_mmap_data_t - *const pkt_sock = odp_ops_data(pktio_entry, socket_mmap); - int fanout = 1; + if (pool == ODP_POOL_INVALID) + return -1; + + pktio_entry->s.ops_data = ODP_OPS_DATA_ALLOC(sizeof(*pkt_sock)); + if (odp_unlikely(pktio_entry->s.ops_data == NULL)) { + ODP_ERR("Failed to allocate pktio_ops_socket_mmap_data_t struct"); + return -1; + } + pkt_sock = pktio_entry->s.ops_data; /* Init pktio entry */ memset(pkt_sock, 0, sizeof(*pkt_sock)); /* set sockfd to -1, because a valid socked might be initialized to 0 */ pkt_sock->sockfd = -1; - if (pool == ODP_POOL_INVALID) - return -1; - /* Store eth buffer offset for pkt buffers from this pool */ pkt_sock->frame_offset = 0; @@ -610,8 +619,7 @@ static int sock_mmap_open(odp_pktio_t id ODP_UNUSED, static int sock_mmap_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, odp_packet_t pkt_table[], int len) { - pktio_ops_socket_mmap_data_t - *const pkt_sock = odp_ops_data(pktio_entry, socket_mmap); + pktio_ops_socket_mmap_data_t *const pkt_sock = pktio_entry->s.ops_data; int ret; odp_ticketlock_lock(&pktio_entry->s.rxl); @@ -626,8 +634,7 @@ static int sock_mmap_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, const odp_packet_t pkt_table[], int len) { int ret; - pktio_ops_socket_mmap_data_t - *const pkt_sock = odp_ops_data(pktio_entry, socket_mmap); + pktio_ops_socket_mmap_data_t *const pkt_sock = pktio_entry->s.ops_data; odp_ticketlock_lock(&pktio_entry->s.txl); ret = pkt_mmap_v2_tx(pkt_sock->tx_ring.sock, &pkt_sock->tx_ring, @@ -639,16 +646,14 @@ static int sock_mmap_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, static uint32_t sock_mmap_mtu_get(pktio_entry_t *pktio_entry) { - pktio_ops_socket_mmap_data_t - *const pkt_sock = odp_ops_data(pktio_entry, socket_mmap); + pktio_ops_socket_mmap_data_t *const pkt_sock = pktio_entry->s.ops_data; return mtu_get_fd(pkt_sock->sockfd, pktio_entry->s.name); } static int sock_mmap_mac_addr_get(pktio_entry_t *pktio_entry, void *mac_addr) { - pktio_ops_socket_mmap_data_t - *const pkt_sock = odp_ops_data(pktio_entry, socket_mmap); + pktio_ops_socket_mmap_data_t *const pkt_sock = pktio_entry->s.ops_data; memcpy(mac_addr, pkt_sock->if_mac, ETH_ALEN); return ETH_ALEN; @@ -657,8 +662,7 @@ static int sock_mmap_mac_addr_get(pktio_entry_t *pktio_entry, void *mac_addr) static int sock_mmap_promisc_mode_set(pktio_entry_t *pktio_entry, odp_bool_t enable) { - pktio_ops_socket_mmap_data_t - *const pkt_sock = odp_ops_data(pktio_entry, socket_mmap); + pktio_ops_socket_mmap_data_t *const pkt_sock = pktio_entry->s.ops_data; return promisc_mode_set_fd(pkt_sock->sockfd, pktio_entry->s.name, enable); @@ -666,8 +670,7 @@ static int sock_mmap_promisc_mode_set(pktio_entry_t *pktio_entry, static int sock_mmap_promisc_mode_get(pktio_entry_t *pktio_entry) { - pktio_ops_socket_mmap_data_t - *const pkt_sock = odp_ops_data(pktio_entry, socket_mmap); + pktio_ops_socket_mmap_data_t *const pkt_sock = pktio_entry->s.ops_data; return promisc_mode_get_fd(pkt_sock->sockfd, pktio_entry->s.name); @@ -675,8 +678,7 @@ static int sock_mmap_promisc_mode_get(pktio_entry_t *pktio_entry) static int sock_mmap_link_status(pktio_entry_t *pktio_entry) { - pktio_ops_socket_mmap_data_t - *const pkt_sock = odp_ops_data(pktio_entry, socket_mmap); + pktio_ops_socket_mmap_data_t *const pkt_sock = pktio_entry->s.ops_data; return link_status_fd(pkt_sock->sockfd, pktio_entry->s.name); } @@ -699,8 +701,7 @@ static int sock_mmap_capability(pktio_entry_t *pktio_entry ODP_UNUSED, static int sock_mmap_stats(pktio_entry_t *pktio_entry, odp_pktio_stats_t *stats) { - pktio_ops_socket_mmap_data_t - *const pkt_sock = odp_ops_data(pktio_entry, socket_mmap); + pktio_ops_socket_mmap_data_t *const pkt_sock = pktio_entry->s.ops_data; if (pktio_entry->s.stats_type == STATS_UNSUPPORTED) { memset(stats, 0, sizeof(*stats)); @@ -713,8 +714,7 @@ static int sock_mmap_stats(pktio_entry_t *pktio_entry, static int sock_mmap_stats_reset(pktio_entry_t *pktio_entry) { - pktio_ops_socket_mmap_data_t - *const pkt_sock = odp_ops_data(pktio_entry, socket_mmap); + pktio_ops_socket_mmap_data_t *const pkt_sock = pktio_entry->s.ops_data; if (pktio_entry->s.stats_type == STATS_UNSUPPORTED) { memset(&pktio_entry->s.stats, 0, diff --git a/platform/linux-generic/pktio/tap.c b/platform/linux-generic/pktio/tap.c index 5bc7481d8..bb404d914 100644 --- a/platform/linux-generic/pktio/tap.c +++ b/platform/linux-generic/pktio/tap.c @@ -92,23 +92,31 @@ static int tap_pktio_open(odp_pktio_t id ODP_UNUSED, int fd, skfd, flags; uint32_t mtu; struct ifreq ifr; - pktio_ops_tap_data_t *tap = odp_ops_data(pktio_entry, tap); + pktio_ops_tap_data_t *tap = NULL; if (strncmp(devname, "tap:", 4) != 0) return -1; + if (pool == ODP_POOL_INVALID) + return -1; + + pktio_entry->s.ops_data = ODP_OPS_DATA_ALLOC(sizeof(*tap)); + if (odp_unlikely(pktio_entry->s.ops_data == NULL)) { + ODP_ERR("Failed to allocate pktio_ops_tap_data_t struct"); + return -1; + } + tap = pktio_entry->s.ops_data; + /* Init pktio entry */ memset(tap, 0, sizeof(*tap)); tap->fd = -1; tap->skfd = -1; - if (pool == ODP_POOL_INVALID) - return -1; - fd = open("/dev/net/tun", O_RDWR); if (fd < 0) { __odp_errno = errno; ODP_ERR("failed to open /dev/net/tun: %s\n", strerror(errno)); + ODP_OPS_DATA_FREE(pktio_entry->s.ops_data); return -1; } @@ -170,13 +178,14 @@ static int tap_pktio_open(odp_pktio_t id ODP_UNUSED, tap_err: close(fd); ODP_ERR("Tap device alloc failed.\n"); + ODP_OPS_DATA_FREE(pktio_entry->s.ops_data); return -1; } static int tap_pktio_start(pktio_entry_t *pktio_entry) { struct ifreq ifr; - pktio_ops_tap_data_t *tap = odp_ops_data(pktio_entry, tap); + pktio_ops_tap_data_t *tap = pktio_entry->s.ops_data; odp_memset(&ifr, 0, sizeof(ifr)); snprintf(ifr.ifr_name, IF_NAMESIZE, "%s", @@ -207,7 +216,7 @@ static int tap_pktio_start(pktio_entry_t *pktio_entry) static int tap_pktio_stop(pktio_entry_t *pktio_entry) { struct ifreq ifr; - pktio_ops_tap_data_t *tap = odp_ops_data(pktio_entry, tap); + pktio_ops_tap_data_t *tap = pktio_entry->s.ops_data; odp_memset(&ifr, 0, sizeof(ifr)); snprintf(ifr.ifr_name, IF_NAMESIZE, "%s", @@ -238,7 +247,7 @@ static int tap_pktio_stop(pktio_entry_t *pktio_entry) static int tap_pktio_close(pktio_entry_t *pktio_entry) { int ret = 0; - pktio_ops_tap_data_t *tap = odp_ops_data(pktio_entry, tap); + pktio_ops_tap_data_t *tap = pktio_entry->s.ops_data; if (tap->fd != -1 && close(tap->fd) != 0) { __odp_errno = errno; @@ -252,13 +261,18 @@ static int tap_pktio_close(pktio_entry_t *pktio_entry) ret = -1; } + if (ODP_OPS_DATA_FREE(pktio_entry->s.ops_data)) { + ODP_ERR("ops_data_free(tap) failed\n"); + ret = -1; + } + return ret; } static odp_packet_t pack_odp_pkt(pktio_entry_t *pktio_entry, const void *data, unsigned int len, odp_time_t *ts) { - pktio_ops_tap_data_t *tap = odp_ops_data(pktio_entry, tap); + pktio_ops_tap_data_t *tap = pktio_entry->s.ops_data; odp_packet_t pkt; odp_packet_hdr_t *pkt_hdr; odp_packet_hdr_t parsed_hdr; @@ -302,7 +316,7 @@ static int tap_pktio_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, ssize_t retval; int i; uint8_t buf[BUF_SIZE]; - pktio_ops_tap_data_t *tap = odp_ops_data(pktio_entry, tap); + pktio_ops_tap_data_t *tap = pktio_entry->s.ops_data; odp_time_t ts_val; odp_time_t *ts = NULL; @@ -342,7 +356,7 @@ static int tap_pktio_send_lockless(pktio_entry_t *pktio_entry, int i, n; uint32_t pkt_len; uint8_t buf[BUF_SIZE]; - pktio_ops_tap_data_t *tap = odp_ops_data(pktio_entry, tap); + pktio_ops_tap_data_t *tap = pktio_entry->s.ops_data; for (i = 0; i < len; i++) { pkt_len = odp_packet_len(pkts[i]); @@ -404,7 +418,7 @@ static int tap_pktio_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, static uint32_t tap_mtu_get(pktio_entry_t *pktio_entry) { uint32_t ret; - pktio_ops_tap_data_t *tap = odp_ops_data(pktio_entry, tap); + pktio_ops_tap_data_t *tap = pktio_entry->s.ops_data; ret = mtu_get_fd(tap->skfd, pktio_entry->s.name + 4); if (ret > 0) @@ -416,7 +430,7 @@ static uint32_t tap_mtu_get(pktio_entry_t *pktio_entry) static int tap_promisc_mode_set(pktio_entry_t *pktio_entry, odp_bool_t enable) { - pktio_ops_tap_data_t *tap = odp_ops_data(pktio_entry, tap); + pktio_ops_tap_data_t *tap = pktio_entry->s.ops_data; return promisc_mode_set_fd(tap->skfd, pktio_entry->s.name + 4, enable); @@ -424,14 +438,14 @@ static int tap_promisc_mode_set(pktio_entry_t *pktio_entry, static int tap_promisc_mode_get(pktio_entry_t *pktio_entry) { - pktio_ops_tap_data_t *tap = odp_ops_data(pktio_entry, tap); + pktio_ops_tap_data_t *tap = pktio_entry->s.ops_data; return promisc_mode_get_fd(tap->skfd, pktio_entry->s.name + 4); } static int tap_mac_addr_get(pktio_entry_t *pktio_entry, void *mac_addr) { - pktio_ops_tap_data_t *tap = odp_ops_data(pktio_entry, tap); + pktio_ops_tap_data_t *tap = pktio_entry->s.ops_data; memcpy(mac_addr, tap->if_mac, ETH_ALEN); return ETH_ALEN; @@ -439,7 +453,7 @@ static int tap_mac_addr_get(pktio_entry_t *pktio_entry, void *mac_addr) static int tap_mac_addr_set(pktio_entry_t *pktio_entry, const void *mac_addr) { - pktio_ops_tap_data_t *tap = odp_ops_data(pktio_entry, tap); + pktio_ops_tap_data_t *tap = pktio_entry->s.ops_data; memcpy(tap->if_mac, mac_addr, ETH_ALEN); @@ -449,7 +463,7 @@ static int tap_mac_addr_set(pktio_entry_t *pktio_entry, const void *mac_addr) static int tap_link_status(pktio_entry_t *pktio_entry) { - pktio_ops_tap_data_t *tap = odp_ops_data(pktio_entry, tap); + pktio_ops_tap_data_t *tap = pktio_entry->s.ops_data; return link_status_fd(tap->skfd, pktio_entry->s.name + 4); }