This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "".
The branch, 2.0 has been updated via 7074b71b266de9c4eb5bf03513186a72ea27b2bc (commit) via 69b652f16d08a7d45169ce224a8a9efe03dd20e4 (commit) via 4477da1a8ef61cff56b021dc8bf28bfde40ee8ba (commit) from 6cd43041e55bd73a02ca202f835e590b3ad5c354 (commit)
Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below.
- Log ----------------------------------------------------------------- commit 7074b71b266de9c4eb5bf03513186a72ea27b2bc Author: Bogdan Pricope bogdan.pricope@linaro.org Date: Mon Nov 20 14:33:19 2017 +0200
linux-gen: pktio: use pktio operations data pool
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 bogdan.pricope@linaro.org Reviewed-by: Honnappa Nagarahalli honnappa.nagarahalli@arm.com Reviewed-by: Yi He yi.he@linaro.org
diff --git a/platform/linux-dpdk/pktio/dpdk.c b/platform/linux-dpdk/pktio/dpdk.c index a6e2573e..832ac7ac 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 7df11618..6912b851 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 cb107fed..f93011e9 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 <odp_module.h> #include <odp/api/packet_io.h> +#include <odp_packet_io_pool_access.h>
/* 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 4ef111c3..7d39bb1b 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 5ab95740..9d928c72 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 60bee591..ff08364a 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 29c449e4..2631c816 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 @@ error:
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 5bfaeef0..f3f00057 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 d9f85b29..7e0485b9 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 b5c27ef4..271c2f0f 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 @@ error: 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 5bc7481d..bb404d91 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 @@ sock_err: 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 @@ sock_err: 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 @@ sock_err: 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); }
commit 69b652f16d08a7d45169ce224a8a9efe03dd20e4 Author: Bogdan Pricope bogdan.pricope@linaro.org Date: Mon Nov 20 11:02:14 2017 +0200
linux-gen: pktio: add pktio operations data pool
Pktio instances need a memory area where to store configuration or state information. The size and structure of this area depends on pktio type. This pool is meant to be used for allocation of such memory areas.
Signed-off-by: Bogdan Pricope bogdan.pricope@linaro.org Reviewed-by: Honnappa Nagarahalli honnappa.nagarahalli@arm.com Reviewed-by: Yi He yi.he@linaro.org
diff --git a/platform/linux-dpdk/Makefile.am b/platform/linux-dpdk/Makefile.am index f27d2b50..ee6c36e2 100644 --- a/platform/linux-dpdk/Makefile.am +++ b/platform/linux-dpdk/Makefile.am @@ -206,6 +206,8 @@ noinst_HEADERS = \ ${top_srcdir}/platform/linux-generic/include/odp_packet_io_internal.h \ ${srcdir}/include/odp_errno_define.h \ ${top_srcdir}/platform/linux-generic/include/odp_packet_io_ring_internal.h \ + ${top_srcdir}/platform/linux-generic/include/odp_packet_io_pool.h \ + ${top_srcdir}/platform/linux-generic/include/odp_packet_io_pool_access.h \ ${top_srcdir}/platform/linux-generic/include/odp_pkt_queue_internal.h \ ${srcdir}/include/odp_pool_internal.h \ ${top_srcdir}/platform/linux-generic/include/odp_pool_subsystem.h \ @@ -260,6 +262,7 @@ __LIB__libodp_dpdk_la_SOURCES = \ ../linux-generic/pktio/subsystem.c \ odp_packet_flags.c \ ../linux-generic/odp_packet_io.c \ + ../linux-generic/odp_packet_io_pool.c \ ../linux-generic/pktio/loopback.c \ ../linux-generic/odp_pkt_queue.c \ pool/dpdk.c \ diff --git a/platform/linux-generic/Makefile.am b/platform/linux-generic/Makefile.am index 56ef03c6..a4aaa769 100644 --- a/platform/linux-generic/Makefile.am +++ b/platform/linux-generic/Makefile.am @@ -175,6 +175,8 @@ noinst_HEADERS = \ include/odp_name_table_internal.h \ include/odp_packet_internal.h \ include/odp_packet_io_internal.h \ + include/odp_packet_io_pool.h \ + include/odp_packet_io_pool_access.h \ include/odp_packet_io_ring_internal.h \ pktio/ethtool.h \ pktio/common.h \ @@ -244,6 +246,7 @@ __LIB__libodp_linux_la_SOURCES = \ odp_packet.c \ odp_packet_flags.c \ odp_packet_io.c \ + odp_packet_io_pool.c \ pktio/ethtool.c \ pktio/subsystem.c \ pktio/ipc.c \ diff --git a/platform/linux-generic/include/odp_packet_io_pool.h b/platform/linux-generic/include/odp_packet_io_pool.h new file mode 100644 index 00000000..59ad053b --- /dev/null +++ b/platform/linux-generic/include/odp_packet_io_pool.h @@ -0,0 +1,27 @@ +/* Copyright (c) 2017, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/** + * @file + * + * ODP packet IO pool + */ + +#ifndef ODP_PACKET_IO_POOL_H_ +#define ODP_PACKET_IO_POOL_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +int _odp_packet_io_pool_create(void); +int _odp_packet_io_pool_destroy(void); + +#ifdef __cplusplus +} +#endif + +#endif /* ODP_PACKET_IO_POOL_H_*/ diff --git a/platform/linux-generic/include/odp_packet_io_pool_access.h b/platform/linux-generic/include/odp_packet_io_pool_access.h new file mode 100644 index 00000000..cdd7dd96 --- /dev/null +++ b/platform/linux-generic/include/odp_packet_io_pool_access.h @@ -0,0 +1,58 @@ +/* Copyright (c) 2017, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/** + * @file + * + * ODP packet IO pool + */ + +#ifndef ODP_PACKET_IO_POOL_ACCESS_H_ +#define ODP_PACKET_IO_POOL_ACCESS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include <odp/api/align.h> +#include <odp/drv/shm.h> + +/** + * Packet IO operations data pool name + */ +#define ODP_PKTIO_OPS_DATA_POOL_NAME "ODP_PKTIO_OPS_DATA" + +#define ODP_OPS_DATA_ALLOC(_size) \ +({ \ + odpdrv_shm_pool_t _pool; \ + void *_ops_data = NULL; \ + \ + _pool = odpdrv_shm_pool_lookup(ODP_PKTIO_OPS_DATA_POOL_NAME); \ + if (_pool != ODPDRV_SHM_POOL_INVALID) \ + _ops_data = odpdrv_shm_pool_alloc(_pool, \ + ROUNDUP_CACHE_LINE(_size)); \ + \ + _ops_data; \ +}) + +#define ODP_OPS_DATA_FREE(_ops_data) \ +({ \ + odpdrv_shm_pool_t _pool; \ + int _result = -1; \ + \ + _pool = odpdrv_shm_pool_lookup(ODP_PKTIO_OPS_DATA_POOL_NAME); \ + if (_pool != ODPDRV_SHM_POOL_INVALID) { \ + odpdrv_shm_pool_free(_pool, _ops_data); \ + _result = 0; \ + } \ + _result; \ +}) + +#ifdef __cplusplus +} +#endif + +#endif /* ODP_PACKET_IO_POOL_ACCESS_H_*/ diff --git a/platform/linux-generic/odp_packet_io.c b/platform/linux-generic/odp_packet_io.c index a1c70861..efeac026 100644 --- a/platform/linux-generic/odp_packet_io.c +++ b/platform/linux-generic/odp_packet_io.c @@ -10,6 +10,7 @@
#include <odp/api/packet_io.h> #include <odp_packet_io_internal.h> +#include <odp_packet_io_pool.h> #include <odp/api/packet.h> #include <odp_packet_internal.h> #include <odp_internal.h> @@ -76,6 +77,10 @@ int odp_pktio_init_global(void) pktio_entry_ptr[i] = pktio_entry; }
+ if (_odp_packet_io_pool_create()) { + odp_shm_free(shm); + return -1; + } return odp_pktio_ops_init_global(true); }
@@ -1122,6 +1127,10 @@ int odp_pktio_term_global(void)
ret = odp_pktio_ops_term_global(false);
+ ret = _odp_packet_io_pool_destroy(); + if (ret) + ODP_ERR("unable to destroy pktio pool\n"); + ret = odp_shm_free(odp_shm_lookup("odp_pktio_entries")); if (ret != 0) ODP_ERR("shm free failed for odp_pktio_entries"); diff --git a/platform/linux-generic/odp_packet_io_pool.c b/platform/linux-generic/odp_packet_io_pool.c new file mode 100644 index 00000000..3e186047 --- /dev/null +++ b/platform/linux-generic/odp_packet_io_pool.c @@ -0,0 +1,55 @@ +/* Copyright (c) 2017, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "config.h" + +#include <odp_posix_extensions.h> +#include <odp/api/packet_io.h> +#include <odp/api/std_clib.h> +#include <odp/drv/shm.h> +#include "odp_packet_io_pool.h" +#include "odp_packet_io_pool_access.h" +#include "odp_debug_internal.h" + +#define ODP_PKTIO_OPS_DATA_POOL_SIZE 160000 + +int _odp_packet_io_pool_create(void) +{ + odpdrv_shm_pool_t pktio_ops_pool; + odpdrv_shm_pool_param_t pktio_ops_param; + + odp_memset(&pktio_ops_param, 0, sizeof(pktio_ops_param)); + pktio_ops_param.pool_size = ODP_PKTIO_OPS_DATA_POOL_SIZE; + pktio_ops_param.min_alloc = 1; + pktio_ops_param.max_alloc = ODP_PKTIO_OPS_DATA_POOL_SIZE; + + pktio_ops_pool = odpdrv_shm_pool_create(ODP_PKTIO_OPS_DATA_POOL_NAME, + &pktio_ops_param); + if (pktio_ops_pool == ODPDRV_SHM_POOL_INVALID) { + ODP_ERR("error to pool_create pktio_ops pool\n"); + return -1; + } + + return 0; +} + +int _odp_packet_io_pool_destroy(void) +{ + odpdrv_shm_pool_t pktio_ops_pool; + + pktio_ops_pool = odpdrv_shm_pool_lookup(ODP_PKTIO_OPS_DATA_POOL_NAME); + if (pktio_ops_pool == ODPDRV_SHM_POOL_INVALID) { + ODP_ERR("error pool_lookup pktio_ops pool\n"); + return -1; + } + + if (odpdrv_shm_pool_destroy(pktio_ops_pool)) { + ODP_ERR("error pool_destroy pktio_ops pool\n"); + return -1; + } + + return 0; +}
commit 4477da1a8ef61cff56b021dc8bf28bfde40ee8ba Author: Josep Puigdemont josep.puigdemont@linaro.org Date: Thu Jun 8 13:18:51 2017 +0200
driver.h: add parameter when registering enumerators
If a class registers more than once the same enumerator, as it could happen for different PCI platforms, we need to provide information for the enumerator probe function to know where to act.
This information shall be provided in the odpdrv_enumr_param_t structure as a void pointer, which will be passed to the probe() function of the enumerator.
Signed-off-by: Josep Puigdemont josep.puigdemont@linaro.org Reviewed-by: Honnappa Nagarahalli honnappa.nagarahalli@arm.com Reviewed-by: Yi He yi.he@linaro.org
diff --git a/example/ddf_ifs/ddf_ifs_enumr_dpdk.c b/example/ddf_ifs/ddf_ifs_enumr_dpdk.c index 782f7b74..258865df 100644 --- a/example/ddf_ifs/ddf_ifs_enumr_dpdk.c +++ b/example/ddf_ifs/ddf_ifs_enumr_dpdk.c @@ -17,7 +17,7 @@ static odpdrv_enumr_t dpdk_enumr;
static odpdrv_device_t dpdk_dev[DDF_DPDK_DEV_MAX]; static int dpdk_dev_cnt; -static int dpdk_enumr_probe(void) +static int dpdk_enumr_probe(void *data __attribute__((__unused__))) { int dpdk_dev_cnt_detected = TEST_DPDK_DEV_CNT; /* detected with dpdk APIs*/ @@ -46,7 +46,7 @@ static int dpdk_enumr_probe(void) return 0; }
-static int dpdk_enumr_remove(void) +static int dpdk_enumr_remove(void *data __attribute__((__unused__))) { printf("%s()\n", __func__); return 0; diff --git a/example/ddf_ifs/ddf_ifs_enumr_generic.c b/example/ddf_ifs/ddf_ifs_enumr_generic.c index f5e1a2cb..5cfa1d9a 100644 --- a/example/ddf_ifs/ddf_ifs_enumr_generic.c +++ b/example/ddf_ifs/ddf_ifs_enumr_generic.c @@ -11,13 +11,13 @@
static odpdrv_enumr_t gen_enumr;
-static int gen_enumr_probe(void) +static int gen_enumr_probe(void *data __attribute__((__unused__))) { printf("%s() - no devices found\n", __func__); return 0; }
-static int gen_enumr_remove(void) +static int gen_enumr_remove(void *data __attribute__((__unused__))) { printf("%s()\n", __func__); return 0; diff --git a/include/odp/drv/spec/driver.h b/include/odp/drv/spec/driver.h index 224baf4f..51baedb5 100644 --- a/include/odp/drv/spec/driver.h +++ b/include/odp/drv/spec/driver.h @@ -205,12 +205,12 @@ struct odpdrv_enumr_param_t { * Called by ODP when it is ready for device creation/deletion * returns an negative value on error or 0 on success. */ - int (*probe)(void); + int (*probe)(void *enumr_data);
/** Remove function: * destroy all enumerated devices and release all resources */ - int (*remove)(void); + int (*remove)(void *enumr_data);
/** Register event notifier function for hotplug events: * register_notifier(fcnt,event_mask) registers fcnt as a callback when @@ -218,6 +218,12 @@ struct odpdrv_enumr_param_t { */ int (*register_notifier)(void (*event_handler) (uint64_t event), int64_t event_mask); + + /** Class dependent part + * This part is allocated by the enumerator class for use by the + * enumerator, it is passed as a parameter to the probe function. + */ + void *enumr_data; };
/* The following events are supported by enumerators */ diff --git a/platform/linux-generic/drv_driver.c b/platform/linux-generic/drv_driver.c index ecf75ab9..cfb42f11 100644 --- a/platform/linux-generic/drv_driver.c +++ b/platform/linux-generic/drv_driver.c @@ -851,7 +851,7 @@ void _odpdrv_driver_probe_drv_items(void) enumr = enumr_lst.head; while (enumr) { if (!enumr->probed) { - enumr->param.probe(); + enumr->param.probe(enumr->param.enumr_data); enumr->probed = 1; } enumr = enumr->next; @@ -1055,7 +1055,7 @@ int _odpdrv_driver_term_global(void) while (enumr_lst.head) { enumr = enumr_lst.head; if (enumr->param.remove) { /* run remove callback, if any */ - if (enumr->param.remove()) + if (enumr->param.remove(enumr->param.enumr_data)) ODP_ERR("Enumerator (API %s) removal failed.\n", enumr->param.api_name); } diff --git a/test/validation/drv/drvdriver/drvdriver_device.c b/test/validation/drv/drvdriver/drvdriver_device.c index d010026f..eaf7dcfa 100644 --- a/test/validation/drv/drvdriver/drvdriver_device.c +++ b/test/validation/drv/drvdriver/drvdriver_device.c @@ -22,8 +22,8 @@ typedef struct dev_enumr_data_t { /* enumerator data for registered devices */ #define NB_DEVICES 5
/* forward declaration */ -static int enumr1_probe(void); -static int enumr1_remove(void); +static int enumr1_probe(void *); +static int enumr1_remove(void *); static int enumr_class1_probe(void); static int enumr_class1_remove(void);
@@ -68,7 +68,8 @@ static odpdrv_enumr_t enumr1_register(void) .api_version = 1, .probe = enumr1_probe, .remove = enumr1_remove, - .register_notifier = NULL + .register_notifier = NULL, + .enumr_data = NULL };
enumr1 = odpdrv_enumr_register(¶m); @@ -76,7 +77,7 @@ static odpdrv_enumr_t enumr1_register(void) }
/*enumerator probe functions, just making sure they have been run: */ -static int enumr1_probe(void) +static int enumr1_probe(void *enumr_data __attribute__((__unused__))) { int dev; odpdrv_shm_t shm; @@ -128,7 +129,7 @@ static void enumr5_device_destroy_terminate(void *priv_data) }
/*enumerator remove functions, to remove the enumerated devices: */ -static int enumr1_remove(void) +static int enumr1_remove(void *data __attribute__((__unused__))) { odpdrv_device_t *my_devices; odpdrv_device_t *dev; diff --git a/test/validation/drv/drvdriver/drvdriver_driver.c b/test/validation/drv/drvdriver/drvdriver_driver.c index edcb0f43..eeb424cc 100644 --- a/test/validation/drv/drvdriver/drvdriver_driver.c +++ b/test/validation/drv/drvdriver/drvdriver_driver.c @@ -56,10 +56,10 @@ static int driver1_probed_index; static int driver2_probed_index;
/* forward declaration */ -static int enumr1_probe(void); -static int enumr2_probe(void); -static int enumr1_remove(void); -static int enumr2_remove(void); +static int enumr1_probe(void *); +static int enumr2_probe(void *); +static int enumr1_remove(void *); +static int enumr2_remove(void *); static int enumr_class1_probe(void); static int enumr_class2_probe(void); static int driver1_probe(odpdrv_device_t dev, odpdrv_devio_t devio, int idx); @@ -167,8 +167,10 @@ static int enumr_class2_probe(void) return 0; }
+#define UNUSED __attribute__((__unused__)) + /*enumerator probe functions, creating four devices each: */ -static int enumr1_probe(void) +static int enumr1_probe(void *enumr_data UNUSED) { int dev;
@@ -189,7 +191,7 @@ static int enumr1_probe(void) return 0; }
-static int enumr2_probe(void) +static int enumr2_probe(void *enumr_data UNUSED) { int dev;
@@ -211,7 +213,7 @@ static int enumr2_probe(void) }
/*enumerator remove functions, to remove the enumerated devices: */ -static int enumr1_remove(void) +static int enumr1_remove(void *data UNUSED) { odpdrv_device_t *my_devices; odpdrv_device_t *dev; @@ -231,7 +233,7 @@ static int enumr1_remove(void) return 0; }
-static int enumr2_remove(void) +static int enumr2_remove(void *data UNUSED) { odpdrv_device_t *my_devices; odpdrv_device_t *dev; diff --git a/test/validation/drv/drvdriver/drvdriver_enumr.c b/test/validation/drv/drvdriver/drvdriver_enumr.c index 38aac3d0..04b6dcdb 100644 --- a/test/validation/drv/drvdriver/drvdriver_enumr.c +++ b/test/validation/drv/drvdriver/drvdriver_enumr.c @@ -20,15 +20,15 @@ static int enumr3_probed; static int enumr4_probed;
/* forward declaration */ -static int enumr1_probe(void); -static int enumr2_probe(void); -static int enumr3_probe(void); -static int enumr4_probe(void); +static int enumr1_probe(void *); +static int enumr2_probe(void *); +static int enumr3_probe(void *); +static int enumr4_probe(void *);
-static int enumr1_remove(void); -static int enumr2_remove(void); -static int enumr3_remove(void); -static int enumr4_remove(void); +static int enumr1_remove(void *); +static int enumr2_remove(void *); +static int enumr3_remove(void *); +static int enumr4_remove(void *);
static int enumr_class1_probe(void); static int enumr_class2_probe(void); @@ -68,6 +68,8 @@ static int tests_global_term(void) return 0; }
+#define ENUMR1_PROBE_DATA ((void *)0x1000) + /*enumerator register functions */ static odpdrv_enumr_t enumr1_register(void) { @@ -77,7 +79,8 @@ static odpdrv_enumr_t enumr1_register(void) .api_version = 1, .probe = enumr1_probe, .remove = enumr1_remove, - .register_notifier = NULL + .register_notifier = NULL, + .enumr_data = ENUMR1_PROBE_DATA };
return odpdrv_enumr_register(¶m); @@ -91,7 +94,8 @@ static odpdrv_enumr_t enumr2_register(void) .api_version = 1, .probe = enumr2_probe, .remove = enumr2_remove, - .register_notifier = NULL + .register_notifier = NULL, + .enumr_data = NULL };
return odpdrv_enumr_register(¶m); @@ -105,7 +109,8 @@ static odpdrv_enumr_t enumr3_register(void) .api_version = 1, .probe = enumr3_probe, .remove = enumr3_remove, - .register_notifier = NULL + .register_notifier = NULL, + .enumr_data = NULL };
return odpdrv_enumr_register(¶m); @@ -119,7 +124,8 @@ static odpdrv_enumr_t enumr4_register(void) .api_version = 1, .probe = enumr4_probe, .remove = enumr4_remove, - .register_notifier = NULL + .register_notifier = NULL, + .enumr_data = NULL };
return odpdrv_enumr_register(¶m); @@ -133,57 +139,61 @@ static odpdrv_enumr_t enumr_invalid_register(void) .api_version = 1, .probe = enumr4_probe, .remove = enumr4_remove, - .register_notifier = NULL + .register_notifier = NULL, + .enumr_data = NULL };
return odpdrv_enumr_register(¶m); }
/*enumerator probe functions, just making sure they have been run: */ -static int enumr1_probe(void) +static int enumr1_probe(void *data) { + CU_ASSERT(data == ENUMR1_PROBE_DATA); enumr1_probed = 1; return 0; }
-static int enumr2_probe(void) +#define UNUSED __attribute__((__unused__)) + +static int enumr2_probe(void *data UNUSED) { enumr2_probed = 1; return 0; }
-static int enumr3_probe(void) +static int enumr3_probe(void *data UNUSED) { enumr3_probed = 1; return 0; }
-static int enumr4_probe(void) +static int enumr4_probe(void *data UNUSED) { enumr4_probed = 1; return 0; }
/*enumerator remove functions, just making sure they have been run: */ -static int enumr1_remove(void) +static int enumr1_remove(void *data UNUSED) { enumr1_probed = -1; return 0; }
-static int enumr2_remove(void) +static int enumr2_remove(void *data UNUSED) { enumr2_probed = -1; return 0; }
-static int enumr3_remove(void) +static int enumr3_remove(void *data UNUSED) { enumr3_probed = -1; return 0; }
-static int enumr4_remove(void) +static int enumr4_remove(void *data UNUSED) { enumr4_probed = -1; return 0;
-----------------------------------------------------------------------
Summary of changes: example/ddf_ifs/ddf_ifs_enumr_dpdk.c | 4 +- example/ddf_ifs/ddf_ifs_enumr_generic.c | 4 +- include/odp/drv/spec/driver.h | 10 ++- platform/linux-dpdk/Makefile.am | 3 + platform/linux-dpdk/pktio/dpdk.c | 57 ++++++--------- platform/linux-generic/Makefile.am | 3 + platform/linux-generic/drv_driver.c | 4 +- .../linux-generic/include/odp_packet_io_internal.h | 4 +- .../{odp/drv/hints.h => odp_packet_io_pool.h} | 19 ++--- .../include/odp_packet_io_pool_access.h | 58 +++++++++++++++ .../include/odp_pktio_ops_subsystem.h | 8 +-- platform/linux-generic/odp_packet_io.c | 9 +++ platform/linux-generic/odp_packet_io_pool.c | 55 ++++++++++++++ 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 +++++++----- test/validation/drv/drvdriver/drvdriver_device.c | 11 +-- test/validation/drv/drvdriver/drvdriver_driver.c | 18 ++--- test/validation/drv/drvdriver/drvdriver_enumr.c | 52 ++++++++------ 24 files changed, 451 insertions(+), 295 deletions(-) copy platform/linux-generic/include/{odp/drv/hints.h => odp_packet_io_pool.h} (51%) create mode 100644 platform/linux-generic/include/odp_packet_io_pool_access.h create mode 100644 platform/linux-generic/odp_packet_io_pool.c
hooks/post-receive