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, master has been updated via 83eb1d9d4cabb56a6afd3b45b8db178d28cb7ea8 (commit) via 25e3e77fc41de7d90a9195941fb9ddc6e15fe6dd (commit) via 576f69f97fa5ba1ef93bf3fbc14076760991bdb6 (commit) via c978c1ed62901815ab4abd484a820665157f85d6 (commit) via d074c91300194e7fa527f8f5186328e8d0613c1a (commit) via 6586675011635bb26d701d9c940d76b0c1d53709 (commit) via 8e1a2b2efd96405f9304984703fc6368a39dba46 (commit) via e5f8a95eeea5a8f4261f8e5bcff95a4cd5cc9b79 (commit) via 4ec7054a33c24c745cee20448055a003c7d1e4bc (commit) via 5caadb73c59095fe6520b26accea26148cc83100 (commit) via 10a0418039d3d8770e80766d33bd3224d1bd88a3 (commit) via ab5574db4e04e097170dff2d30a77281ebc85278 (commit) from 807aa18bcd266a7e7f66e2293db7ee2fe4923a2d (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 83eb1d9d4cabb56a6afd3b45b8db178d28cb7ea8 Author: Petri Savolainen petri.savolainen@nokia.com Date: Wed Nov 20 12:22:27 2019 +0200
linux-gen: netmap: implement frame offset config
Signed-off-by: Petri Savolainen petri.savolainen@nokia.com Reviewed-by: Matias Elo matias.elo@nokia.com
diff --git a/platform/linux-generic/pktio/netmap.c b/platform/linux-generic/pktio/netmap.c index 313ebd5e..47611724 100644 --- a/platform/linux-generic/pktio/netmap.c +++ b/platform/linux-generic/pktio/netmap.c @@ -790,12 +790,14 @@ static inline int netmap_pkt_to_odp(pktio_entry_t *pktio_entry, odp_packet_hdr_t parsed_hdr; int i; int num; - int alloc_len; + uint32_t max_len; + uint16_t frame_offset = pktio_entry->s.pktin_frame_offset;
/* Allocate maximum sized packets */ - alloc_len = pkt_priv(pktio_entry)->mtu; + max_len = pkt_priv(pktio_entry)->mtu;
- num = packet_alloc_multi(pool, alloc_len, pkt_tbl, slot_num); + num = packet_alloc_multi(pool, max_len + frame_offset, + pkt_tbl, slot_num);
for (i = 0; i < num; i++) { netmap_slot_t slot; @@ -815,10 +817,10 @@ static inline int netmap_pkt_to_odp(pktio_entry_t *pktio_entry,
pkt = pkt_tbl[i]; pkt_hdr = packet_hdr(pkt); - pull_tail(pkt_hdr, alloc_len - len); + pull_tail(pkt_hdr, max_len - len); + if (frame_offset) + pull_head(pkt_hdr, frame_offset);
- /* For now copy the data in the mbuf, - worry about zero-copy later */ if (odp_packet_copy_from_mem(pkt, 0, len, slot.buf) != 0) goto fail;
commit 25e3e77fc41de7d90a9195941fb9ddc6e15fe6dd Author: Petri Savolainen petri.savolainen@nokia.com Date: Wed Nov 20 09:55:10 2019 +0200
linux-gen: pcap: implement frame offset config
Signed-off-by: Petri Savolainen petri.savolainen@nokia.com Reviewed-by: Matias Elo matias.elo@nokia.com
diff --git a/platform/linux-generic/pktio/pcap.c b/platform/linux-generic/pktio/pcap.c index e5709e5f..9bb7f203 100644 --- a/platform/linux-generic/pktio/pcap.c +++ b/platform/linux-generic/pktio/pcap.c @@ -227,6 +227,7 @@ static int pcapif_recv_pkt(pktio_entry_t *pktio_entry, int index ODP_UNUSED, pkt_pcap_t *pcap = pkt_priv(pktio_entry); odp_time_t ts_val; odp_time_t *ts = NULL; + uint16_t frame_offset = pktio_entry->s.pktin_frame_offset;
odp_ticketlock_lock(&pktio_entry->s.rxl);
@@ -252,7 +253,8 @@ static int pcapif_recv_pkt(pktio_entry_t *pktio_entry, int index ODP_UNUSED,
pkt_len = hdr->caplen;
- ret = packet_alloc_multi(pcap->pool, pkt_len, &pkt, 1); + ret = packet_alloc_multi(pcap->pool, pkt_len + frame_offset, + &pkt, 1); if (odp_unlikely(ret != 1)) break;
@@ -260,8 +262,10 @@ static int pcapif_recv_pkt(pktio_entry_t *pktio_entry, int index ODP_UNUSED, ts_val = odp_time_global();
pkt_hdr = packet_hdr(pkt); + if (frame_offset) + pull_head(pkt_hdr, frame_offset);
- if (odp_packet_copy_from_mem(pkt, 0, hdr->caplen, data) != 0) { + if (odp_packet_copy_from_mem(pkt, 0, pkt_len, data) != 0) { ODP_ERR("failed to copy packet data\n"); break; }
commit 576f69f97fa5ba1ef93bf3fbc14076760991bdb6 Author: Petri Savolainen petri.savolainen@nokia.com Date: Tue Nov 19 16:57:46 2019 +0200
linux-gen: tap: implement frame offset config
Signed-off-by: Petri Savolainen petri.savolainen@nokia.com Reviewed-by: Matias Elo matias.elo@nokia.com
diff --git a/platform/linux-generic/pktio/tap.c b/platform/linux-generic/pktio/tap.c index 638edec9..db5c701b 100644 --- a/platform/linux-generic/pktio/tap.c +++ b/platform/linux-generic/pktio/tap.c @@ -276,6 +276,7 @@ static odp_packet_t pack_odp_pkt(pktio_entry_t *pktio_entry, const void *data, odp_packet_hdr_t *pkt_hdr; odp_packet_hdr_t parsed_hdr; int num; + uint16_t frame_offset = pktio_entry->s.pktin_frame_offset;
if (pktio_cls_enabled(pktio_entry)) { if (cls_classify_packet(pktio_entry, data, len, len, @@ -285,19 +286,22 @@ static odp_packet_t pack_odp_pkt(pktio_entry_t *pktio_entry, const void *data, } }
- num = packet_alloc_multi(pkt_priv(pktio_entry)->pool, len, &pkt, 1); - + num = packet_alloc_multi(pkt_priv(pktio_entry)->pool, + len + frame_offset, &pkt, 1); if (num != 1) return ODP_PACKET_INVALID;
+ pkt_hdr = packet_hdr(pkt); + + if (frame_offset) + pull_head(pkt_hdr, frame_offset); + if (odp_packet_copy_from_mem(pkt, 0, len, data) < 0) { ODP_ERR("failed to copy packet data\n"); odp_packet_free(pkt); return ODP_PACKET_INVALID; }
- pkt_hdr = packet_hdr(pkt); - if (pktio_cls_enabled(pktio_entry)) copy_packet_cls_metadata(&parsed_hdr, pkt_hdr); else
commit c978c1ed62901815ab4abd484a820665157f85d6 Author: Petri Savolainen petri.savolainen@nokia.com Date: Tue Nov 19 16:49:36 2019 +0200
linux-gen: socket: implement frame offset config
Signed-off-by: Petri Savolainen petri.savolainen@nokia.com Reviewed-by: Matias Elo matias.elo@nokia.com
diff --git a/platform/linux-generic/pktio/socket.c b/platform/linux-generic/pktio/socket.c index 76fee0ad..d148edf0 100644 --- a/platform/linux-generic/pktio/socket.c +++ b/platform/linux-generic/pktio/socket.c @@ -221,11 +221,15 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, int nb_pkts; int recv_msgs; int i; + uint16_t frame_offset = pktio_entry->s.pktin_frame_offset; + uint32_t alloc_len = pkt_sock->mtu + frame_offset;
memset(msgvec, 0, sizeof(msgvec));
- nb_pkts = packet_alloc_multi(pool, pkt_sock->mtu, pkt_table, num); + nb_pkts = packet_alloc_multi(pool, alloc_len, pkt_table, num); for (i = 0; i < nb_pkts; i++) { + if (frame_offset) + pull_head(packet_hdr(pkt_table[i]), frame_offset); msgvec[i].msg_hdr.msg_iovlen = _rx_pkt_to_iovec(pkt_table[i], iovecs[i]); msgvec[i].msg_hdr.msg_iov = iovecs[i];
commit d074c91300194e7fa527f8f5186328e8d0613c1a Author: Petri Savolainen petri.savolainen@nokia.com Date: Tue Nov 19 14:43:07 2019 +0200
linux-gen: socket_mmap: implement frame offset config
Signed-off-by: Petri Savolainen petri.savolainen@nokia.com Reviewed-by: Matias Elo matias.elo@nokia.com
diff --git a/platform/linux-generic/pktio/socket_mmap.c b/platform/linux-generic/pktio/socket_mmap.c index 6ae0e295..2cceb564 100644 --- a/platform/linux-generic/pktio/socket_mmap.c +++ b/platform/linux-generic/pktio/socket_mmap.c @@ -168,6 +168,7 @@ static inline unsigned pkt_mmap_v2_rx(pktio_entry_t *pktio_entry, unsigned nb_rx; struct ring *ring; odp_pool_t pool = pkt_sock->pool; + uint16_t frame_offset = pktio_entry->s.pktin_frame_offset;
if (pktio_entry->s.config.pktin.bit.ts_all || pktio_entry->s.config.pktin.bit.ts_ptp) @@ -207,7 +208,7 @@ static inline unsigned pkt_mmap_v2_rx(pktio_entry_t *pktio_entry, continue; }
- ret = packet_alloc_multi(pool, pkt_len, &pkt, 1); + ret = packet_alloc_multi(pool, pkt_len + frame_offset, &pkt, 1);
if (odp_unlikely(ret != 1)) { /* Stop receiving packets when pool is empty. Leave @@ -237,6 +238,9 @@ static inline unsigned pkt_mmap_v2_rx(pktio_entry_t *pktio_entry, }
hdr = packet_hdr(pkt); + if (frame_offset) + pull_head(hdr, frame_offset); + ret = odp_packet_copy_from_mem(pkt, 0, pkt_len, pkt_buf); if (ret != 0) { odp_packet_free(pkt);
commit 6586675011635bb26d701d9c940d76b0c1d53709 Author: Petri Savolainen petri.savolainen@nokia.com Date: Tue Nov 19 13:50:34 2019 +0200
linux-gen: dpdk: implement frame offset config
Implement frame start offset configuration option for (normal) DPDK pktio. Zero-copy version does not support the config.
Signed-off-by: Petri Savolainen petri.savolainen@nokia.com Reviewed-by: Matias Elo matias.elo@nokia.com
diff --git a/platform/linux-generic/include/odp_packet_internal.h b/platform/linux-generic/include/odp_packet_internal.h index cd6ca084..3ba76449 100644 --- a/platform/linux-generic/include/odp_packet_internal.h +++ b/platform/linux-generic/include/odp_packet_internal.h @@ -235,6 +235,14 @@ static inline void copy_packet_cls_metadata(odp_packet_hdr_t *src_hdr, dst_hdr->timestamp = src_hdr->timestamp; }
+static inline void pull_head(odp_packet_hdr_t *pkt_hdr, uint32_t len) +{ + pkt_hdr->headroom += len; + pkt_hdr->frame_len -= len; + pkt_hdr->seg_data += len; + pkt_hdr->seg_len -= len; +} + static inline void pull_tail(odp_packet_hdr_t *pkt_hdr, uint32_t len) { odp_packet_hdr_t *last = packet_last_seg(pkt_hdr); diff --git a/platform/linux-generic/include/odp_packet_io_internal.h b/platform/linux-generic/include/odp_packet_io_internal.h index f7eca579..0e6a8a33 100644 --- a/platform/linux-generic/include/odp_packet_io_internal.h +++ b/platform/linux-generic/include/odp_packet_io_internal.h @@ -70,6 +70,7 @@ struct pktio_entry { odp_ticketlock_t txl; /**< TX ticketlock */ uint8_t cls_enabled; /**< classifier enabled */ uint8_t chksum_insert_ena; /**< pktout checksum offload enabled */ + uint16_t pktin_frame_offset; odp_pktio_t handle; /**< pktio handle */ unsigned char ODP_ALIGNED_CACHE pkt_priv[PKTIO_PRIVATE_SIZE]; enum { diff --git a/platform/linux-generic/odp_packet.c b/platform/linux-generic/odp_packet.c index a0bfce6e..d17674f4 100644 --- a/platform/linux-generic/odp_packet.c +++ b/platform/linux-generic/odp_packet.c @@ -160,14 +160,6 @@ static inline void push_head(odp_packet_hdr_t *pkt_hdr, uint32_t len) pkt_hdr->seg_len += len; }
-static inline void pull_head(odp_packet_hdr_t *pkt_hdr, uint32_t len) -{ - pkt_hdr->headroom += len; - pkt_hdr->frame_len -= len; - pkt_hdr->seg_data += len; - pkt_hdr->seg_len -= len; -} - static inline void push_tail(odp_packet_hdr_t *pkt_hdr, uint32_t len) { odp_packet_hdr_t *last_seg = packet_last_seg(pkt_hdr); diff --git a/platform/linux-generic/odp_packet_io.c b/platform/linux-generic/odp_packet_io.c index 019d3537..7c4b72a6 100644 --- a/platform/linux-generic/odp_packet_io.c +++ b/platform/linux-generic/odp_packet_io.c @@ -285,6 +285,7 @@ static odp_pktio_t setup_pktio_entry(const char *name, odp_pool_t pool, int pktio_if; char pktio_type[PKTIO_NAME_LEN]; const char *if_name; + uint16_t pktin_frame_offset = pktio_global->config.pktin_frame_offset;
if (strlen(name) >= PKTIO_NAME_LEN - 1) { /* ioctl names limitation */ @@ -311,6 +312,7 @@ static odp_pktio_t setup_pktio_entry(const char *name, odp_pool_t pool, pktio_entry->s.pool = pool; memcpy(&pktio_entry->s.param, param, sizeof(odp_pktio_param_t)); pktio_entry->s.handle = hdl; + pktio_entry->s.pktin_frame_offset = pktin_frame_offset;
odp_pktio_config_init(&pktio_entry->s.config);
diff --git a/platform/linux-generic/pktio/dpdk.c b/platform/linux-generic/pktio/dpdk.c index 61099668..043a467f 100644 --- a/platform/linux-generic/pktio/dpdk.c +++ b/platform/linux-generic/pktio/dpdk.c @@ -538,19 +538,21 @@ static inline int mbuf_to_pkt(pktio_entry_t *pktio_entry, uint16_t pkt_len; struct rte_mbuf *mbuf; void *data; - int i, j; - int alloc_len, num; + int i, j, num; + uint32_t max_len; int nb_pkts = 0; pkt_dpdk_t *pkt_dpdk = pkt_priv(pktio_entry); odp_pool_t pool = pkt_dpdk->pool; odp_pktin_config_opt_t pktin_cfg = pktio_entry->s.config.pktin; odp_proto_layer_t parse_layer = pktio_entry->s.config.parser.layer; odp_pktio_t input = pktio_entry->s.handle; + uint16_t frame_offset = pktio_entry->s.pktin_frame_offset;
/* Allocate maximum sized packets */ - alloc_len = pkt_dpdk->data_room; + max_len = pkt_dpdk->data_room;
- num = packet_alloc_multi(pool, alloc_len, pkt_table, mbuf_num); + num = packet_alloc_multi(pool, max_len + frame_offset, + pkt_table, mbuf_num); if (num != mbuf_num) { ODP_DBG("packet_alloc_multi() unable to allocate all packets: " "%d/%" PRIu16 " allocated\n", num, mbuf_num); @@ -596,7 +598,9 @@ static inline int mbuf_to_pkt(pktio_entry_t *pktio_entry,
pkt = pkt_table[i]; pkt_hdr = packet_hdr(pkt); - pull_tail(pkt_hdr, alloc_len - pkt_len); + pull_tail(pkt_hdr, max_len - pkt_len); + if (frame_offset) + pull_head(pkt_hdr, frame_offset);
if (odp_packet_copy_from_mem(pkt, 0, pkt_len, data) != 0) goto fail; @@ -1621,6 +1625,9 @@ static int dpdk_open(odp_pktio_t id ODP_UNUSED, RTE_PKTMBUF_HEADROOM; pkt_dpdk->data_room = RTE_MIN(pool_entry->seg_len, data_room);
+ /* Reserve room for packet input offset */ + pkt_dpdk->data_room -= pktio_entry->s.pktin_frame_offset; + /* Mbuf chaining not yet supported */ pkt_dpdk->mtu = RTE_MIN(pkt_dpdk->mtu, pkt_dpdk->data_room);
commit 8e1a2b2efd96405f9304984703fc6368a39dba46 Author: Petri Savolainen petri.savolainen@nokia.com Date: Tue Nov 19 10:22:03 2019 +0200
linux-gen: pktio: add pktin frame offset config option
Added config file option to control frame start offset in packet input.
Signed-off-by: Petri Savolainen petri.savolainen@nokia.com Reviewed-by: Matias Elo matias.elo@nokia.com
diff --git a/config/odp-linux-generic.conf b/config/odp-linux-generic.conf index 4b19c102..5a3ca72f 100644 --- a/config/odp-linux-generic.conf +++ b/config/odp-linux-generic.conf @@ -16,7 +16,7 @@
# Mandatory fields odp_implementation = "linux-generic" -config_file_version = "0.1.11" +config_file_version = "0.1.12"
# Shared memory options shm: { @@ -74,6 +74,16 @@ pool: { } }
+# General pktio options +pktio: { + # Frame start offset from packet base pointer at packet input. This can + # be used (together with pool.pkt.base_align option) to tune packet data + # alignment for received frames. Currently, packet IO drivers + # (zero-copy DPDK, loop and ipc) that do not copy data ignore this + # option. + pktin_frame_offset = 0 +} + # DPDK pktio options pktio_dpdk: { # Default options diff --git a/platform/linux-generic/include/odp_packet_io_internal.h b/platform/linux-generic/include/odp_packet_io_internal.h index fe26612a..f7eca579 100644 --- a/platform/linux-generic/include/odp_packet_io_internal.h +++ b/platform/linux-generic/include/odp_packet_io_internal.h @@ -139,6 +139,11 @@ typedef struct { odp_spinlock_t lock; odp_shm_t shm;
+ struct { + /* Frame start offset from base pointer at packet input */ + uint16_t pktin_frame_offset; + } config; + pktio_entry_t entries[ODP_CONFIG_PKTIO_ENTRIES];
} pktio_global_t; diff --git a/platform/linux-generic/odp_packet_io.c b/platform/linux-generic/odp_packet_io.c index 81ce4846..019d3537 100644 --- a/platform/linux-generic/odp_packet_io.c +++ b/platform/linux-generic/odp_packet_io.c @@ -28,6 +28,7 @@ #include <odp/api/plat/time_inlines.h> #include <odp_pcapng.h> #include <odp/api/plat/queue_inlines.h> +#include <odp_libconfig_internal.h>
#include <string.h> #include <inttypes.h> @@ -58,6 +59,32 @@ static inline pktio_entry_t *pktio_entry_by_index(int index) return pktio_entry_ptr[index]; }
+static int read_config_file(pktio_global_t *pktio_glb) +{ + const char *str; + int val = 0; + + ODP_PRINT("Packet IO config:\n"); + + str = "pktio.pktin_frame_offset"; + if (!_odp_libconfig_lookup_int(str, &val)) { + ODP_ERR("Config option '%s' not found.\n", str); + return -1; + } + + if (val < 0 || val > UINT16_MAX) { + ODP_ERR("Bad value %s = %i\n", str, val); + return -1; + } + + pktio_glb->config.pktin_frame_offset = val; + ODP_PRINT(" %s: %i\n", str, val); + + ODP_PRINT("\n"); + + return 0; +} + int _odp_pktio_init_global(void) { pktio_entry_t *pktio_entry; @@ -76,6 +103,12 @@ int _odp_pktio_init_global(void)
odp_spinlock_init(&pktio_global->lock);
+ if (read_config_file(pktio_global)) { + odp_shm_free(shm); + pktio_global = NULL; + return -1; + } + for (i = 0; i < ODP_CONFIG_PKTIO_ENTRIES; ++i) { pktio_entry = &pktio_global->entries[i];
diff --git a/platform/linux-generic/test/inline-timer.conf b/platform/linux-generic/test/inline-timer.conf index 45b456e8..42ed09fb 100644 --- a/platform/linux-generic/test/inline-timer.conf +++ b/platform/linux-generic/test/inline-timer.conf @@ -1,6 +1,6 @@ # Mandatory fields odp_implementation = "linux-generic" -config_file_version = "0.1.11" +config_file_version = "0.1.12"
timer: { # Enable inline timer implementation diff --git a/platform/linux-generic/test/process-mode.conf b/platform/linux-generic/test/process-mode.conf index fd766e62..10cf4891 100644 --- a/platform/linux-generic/test/process-mode.conf +++ b/platform/linux-generic/test/process-mode.conf @@ -1,6 +1,6 @@ # Mandatory fields odp_implementation = "linux-generic" -config_file_version = "0.1.11" +config_file_version = "0.1.12"
# Shared memory options shm: {
commit e5f8a95eeea5a8f4261f8e5bcff95a4cd5cc9b79 Author: Petri Savolainen petri.savolainen@nokia.com Date: Fri Nov 15 16:51:47 2019 +0200
linux-gen: pktio: rename global variable
Renamed pktio global variable for better code readability. Also save SHM handle into global data and use it, instead of doing lookup by name.
Signed-off-by: Petri Savolainen petri.savolainen@nokia.com Reviewed-by: Matias Elo matias.elo@nokia.com
diff --git a/platform/linux-generic/include/odp_packet_io_internal.h b/platform/linux-generic/include/odp_packet_io_internal.h index ba2e7c6b..fe26612a 100644 --- a/platform/linux-generic/include/odp_packet_io_internal.h +++ b/platform/linux-generic/include/odp_packet_io_internal.h @@ -134,10 +134,14 @@ typedef union { uint8_t pad[ROUNDUP_CACHE_LINE(sizeof(struct pktio_entry))]; } pktio_entry_t;
+/* Global variables */ typedef struct { odp_spinlock_t lock; + odp_shm_t shm; + pktio_entry_t entries[ODP_CONFIG_PKTIO_ENTRIES]; -} pktio_table_t; + +} pktio_global_t;
typedef struct pktio_if_ops { const char *name; diff --git a/platform/linux-generic/odp_packet_io.c b/platform/linux-generic/odp_packet_io.c index 33ba8fdb..81ce4846 100644 --- a/platform/linux-generic/odp_packet_io.c +++ b/platform/linux-generic/odp_packet_io.c @@ -47,7 +47,8 @@ /* Max wait time supported to avoid potential overflow */ #define MAX_WAIT_TIME (UINT64_MAX / 1024)
-static pktio_table_t *pktio_tbl; +/* Global variables */ +static pktio_global_t *pktio_global;
/* pktio pointer entries ( for inlines) */ void *pktio_entry_ptr[ODP_CONFIG_PKTIO_ENTRIES]; @@ -64,20 +65,19 @@ int _odp_pktio_init_global(void) odp_shm_t shm; int pktio_if;
- shm = odp_shm_reserve("_odp_pktio_entries", - sizeof(pktio_table_t), - sizeof(pktio_entry_t), - 0); + shm = odp_shm_reserve("_odp_pktio_global", sizeof(pktio_global_t), + ODP_CACHE_LINE_SIZE, 0); if (shm == ODP_SHM_INVALID) return -1;
- pktio_tbl = odp_shm_addr(shm); - memset(pktio_tbl, 0, sizeof(pktio_table_t)); + pktio_global = odp_shm_addr(shm); + memset(pktio_global, 0, sizeof(pktio_global_t)); + pktio_global->shm = shm;
- odp_spinlock_init(&pktio_tbl->lock); + odp_spinlock_init(&pktio_global->lock);
for (i = 0; i < ODP_CONFIG_PKTIO_ENTRIES; ++i) { - pktio_entry = &pktio_tbl->entries[i]; + pktio_entry = &pktio_global->entries[i];
odp_ticketlock_init(&pktio_entry->s.rxl); odp_ticketlock_init(&pktio_entry->s.txl); @@ -175,7 +175,7 @@ static odp_pktio_t alloc_lock_pktio_entry(void) int i;
for (i = 0; i < ODP_CONFIG_PKTIO_ENTRIES; ++i) { - entry = &pktio_tbl->entries[i]; + entry = &pktio_global->entries[i]; if (is_free(entry)) { lock_entry(entry); if (is_free(entry)) { @@ -356,9 +356,9 @@ odp_pktio_t odp_pktio_open(const char *name, odp_pool_t pool, return ODP_PKTIO_INVALID; }
- odp_spinlock_lock(&pktio_tbl->lock); + odp_spinlock_lock(&pktio_global->lock); hdl = setup_pktio_entry(name, pool, param); - odp_spinlock_unlock(&pktio_tbl->lock); + odp_spinlock_unlock(&pktio_global->lock);
ODP_DBG("interface: %s, driver: %s\n", name, driver_name(hdl));
@@ -467,9 +467,9 @@ int odp_pktio_close(odp_pktio_t hdl) entry->s.num_in_queue = 0; entry->s.num_out_queue = 0;
- odp_spinlock_lock(&pktio_tbl->lock); + odp_spinlock_lock(&pktio_global->lock); res = _pktio_close(entry); - odp_spinlock_unlock(&pktio_tbl->lock); + odp_spinlock_unlock(&pktio_global->lock); if (res) ODP_ABORT("unable to close pktio\n");
@@ -652,7 +652,7 @@ odp_pktio_t odp_pktio_lookup(const char *name)
ifname = strip_pktio_type(name, NULL);
- odp_spinlock_lock(&pktio_tbl->lock); + odp_spinlock_lock(&pktio_global->lock);
for (i = 0; i < ODP_CONFIG_PKTIO_ENTRIES; ++i) { entry = pktio_entry_by_index(i); @@ -671,7 +671,7 @@ odp_pktio_t odp_pktio_lookup(const char *name) break; }
- odp_spinlock_unlock(&pktio_tbl->lock); + odp_spinlock_unlock(&pktio_global->lock);
return hdl; } @@ -1312,14 +1312,17 @@ void odp_pktio_print(odp_pktio_t hdl)
int _odp_pktio_term_global(void) { + odp_shm_t shm; + int i, pktio_if; int ret = 0; - int i; - int pktio_if; + + if (pktio_global == NULL) + return 0;
for (i = 0; i < ODP_CONFIG_PKTIO_ENTRIES; ++i) { pktio_entry_t *pktio_entry;
- pktio_entry = &pktio_tbl->entries[i]; + pktio_entry = &pktio_global->entries[i];
if (is_free(pktio_entry)) continue; @@ -1353,9 +1356,10 @@ int _odp_pktio_term_global(void) ODP_ERR("Failed to terminate pcapng\n"); }
- ret = odp_shm_free(odp_shm_lookup("_odp_pktio_entries")); + shm = pktio_global->shm; + ret = odp_shm_free(shm); if (ret != 0) - ODP_ERR("shm free failed for _odp_pktio_entries"); + ODP_ERR("shm free failed\n");
return ret; }
commit 4ec7054a33c24c745cee20448055a003c7d1e4bc Author: Petri Savolainen petri.savolainen@nokia.com Date: Tue Nov 19 10:56:57 2019 +0200
linux-gen: pool: check global pointer on terminate
Global pointer is NULL, if init fails.
Signed-off-by: Petri Savolainen petri.savolainen@nokia.com Reviewed-by: Matias Elo matias.elo@nokia.com
diff --git a/platform/linux-generic/odp_pool.c b/platform/linux-generic/odp_pool.c index 02f934d8..5d5217aa 100644 --- a/platform/linux-generic/odp_pool.c +++ b/platform/linux-generic/odp_pool.c @@ -261,6 +261,7 @@ int _odp_pool_init_global(void)
if (read_config_file(_odp_pool_glb)) { odp_shm_free(shm); + _odp_pool_glb = NULL; return -1; }
@@ -286,6 +287,9 @@ int _odp_pool_term_global(void) int ret = 0; int rc = 0;
+ if (_odp_pool_glb == NULL) + return 0; + for (i = 0; i < ODP_CONFIG_POOLS; i++) { pool = pool_entry(i);
commit 5caadb73c59095fe6520b26accea26148cc83100 Author: Petri Savolainen petri.savolainen@nokia.com Date: Fri Nov 15 15:58:05 2019 +0200
linux-gen: pool: use align config options
Setup alignment according to config file options.
Signed-off-by: Petri Savolainen petri.savolainen@nokia.com Reviewed-by: Matias Elo matias.elo@nokia.com
diff --git a/platform/linux-generic/odp_pool.c b/platform/linux-generic/odp_pool.c index 82083356..02f934d8 100644 --- a/platform/linux-generic/odp_pool.c +++ b/platform/linux-generic/odp_pool.c @@ -44,10 +44,6 @@ /* Define a practical limit for contiguous memory allocations */ #define MAX_SIZE (10 * 1024 * 1024)
-/* Minimum supported buffer alignment. Requests for values below this will be - * rounded up to this value. */ -#define BUFFER_ALIGN_MIN ODP_CACHE_LINE_SIZE - ODP_STATIC_ASSERT(CONFIG_PACKET_SEG_LEN_MIN >= 256, "ODP Segment size must be a minimum of 256 bytes");
@@ -502,11 +498,15 @@ static odp_pool_t pool_create(const char *name, odp_pool_param_t *params,
align = 0;
- if (params->type == ODP_POOL_BUFFER) - align = params->buf.align; + if (params->type == ODP_POOL_PACKET) { + align = _odp_pool_glb->config.pkt_base_align; + } else { + if (params->type == ODP_POOL_BUFFER) + align = params->buf.align;
- if (align < BUFFER_ALIGN_MIN) - align = BUFFER_ALIGN_MIN; + if (align < _odp_pool_glb->config.buf_min_align) + align = _odp_pool_glb->config.buf_min_align; + }
/* Validate requested buffer alignment */ if (align > ODP_CONFIG_BUFFER_ALIGN_MAX ||
commit 10a0418039d3d8770e80766d33bd3224d1bd88a3 Author: Petri Savolainen petri.savolainen@nokia.com Date: Fri Nov 15 15:39:32 2019 +0200
linux-gen: pool: add data align config file options
Added packet and buffer data alignment options into the config file. For packets, this is the segment base address alignment. For buffers, this is minimum data alignment, application alignment requirements are rounded up to this value.
Signed-off-by: Petri Savolainen petri.savolainen@nokia.com Reviewed-by: Matias Elo matias.elo@nokia.com
diff --git a/config/odp-linux-generic.conf b/config/odp-linux-generic.conf index b3508994..4b19c102 100644 --- a/config/odp-linux-generic.conf +++ b/config/odp-linux-generic.conf @@ -16,7 +16,7 @@
# Mandatory fields odp_implementation = "linux-generic" -config_file_version = "0.1.10" +config_file_version = "0.1.11"
# Shared memory options shm: { @@ -60,6 +60,17 @@ pool: { # Maximum number of packets per pool. Power of two minus one # results optimal memory usage (e.g. (256 * 1024) - 1). max_num = 262143 + + # Base alignment for segment data. When set to zero, + # cache line size is used. Use power of two values. + base_align = 0 + } + + buf: { + # Minimum data alignment. The alignment request in pool + # parameters is rounded up to this value. When set to zero, + # cache line size is used. Use power of two values. + min_align = 0 } }
diff --git a/platform/linux-generic/include/odp_pool_internal.h b/platform/linux-generic/include/odp_pool_internal.h index 37b10aa1..a74f4660 100644 --- a/platform/linux-generic/include/odp_pool_internal.h +++ b/platform/linux-generic/include/odp_pool_internal.h @@ -97,6 +97,8 @@ typedef struct pool_global_t { uint32_t pkt_max_num; uint32_t local_cache_size; uint32_t burst_size; + uint32_t pkt_base_align; + uint32_t buf_min_align; } config;
} pool_global_t; diff --git a/platform/linux-generic/odp_pool.c b/platform/linux-generic/odp_pool.c index 0937c8b3..82083356 100644 --- a/platform/linux-generic/odp_pool.c +++ b/platform/linux-generic/odp_pool.c @@ -142,7 +142,7 @@ static void cache_flush(pool_cache_t *cache, pool_t *pool)
static int read_config_file(pool_global_t *pool_glb) { - uint32_t local_cache_size, burst_size; + uint32_t local_cache_size, burst_size, align; const char *str; int val = 0;
@@ -155,7 +155,7 @@ static int read_config_file(pool_global_t *pool_glb) }
if (val > CONFIG_POOL_CACHE_MAX_SIZE || val < 0) { - ODP_ERR("Bad value %s = %u, max %d\n", str, val, + ODP_ERR("Bad value %s = %i, max %i\n", str, val, CONFIG_POOL_CACHE_MAX_SIZE); return -1; } @@ -171,7 +171,7 @@ static int read_config_file(pool_global_t *pool_glb) }
if (val <= 0) { - ODP_ERR("Bad value %s = %u\n", str, val); + ODP_ERR("Bad value %s = %i\n", str, val); return -1; }
@@ -197,13 +197,49 @@ static int read_config_file(pool_global_t *pool_glb) }
if (val > CONFIG_POOL_MAX_NUM || val < POOL_MAX_NUM_MIN) { - ODP_ERR("Bad value %s = %u\n", str, val); + ODP_ERR("Bad value %s = %i\n", str, val); return -1; }
pool_glb->config.pkt_max_num = val; ODP_PRINT(" %s: %i\n", str, val);
+ str = "pool.pkt.base_align"; + if (!_odp_libconfig_lookup_int(str, &val)) { + ODP_ERR("Config option '%s' not found.\n", str); + return -1; + } + + align = val; + if (val == 0) + align = ODP_CACHE_LINE_SIZE; + + if (!CHECK_IS_POWER2(align)) { + ODP_ERR("Not a power of two: %s = %i\n", str, val); + return -1; + } + + pool_glb->config.pkt_base_align = align; + ODP_PRINT(" %s: %u\n", str, align); + + str = "pool.buf.min_align"; + if (!_odp_libconfig_lookup_int(str, &val)) { + ODP_ERR("Config option '%s' not found.\n", str); + return -1; + } + + align = val; + if (val == 0) + align = ODP_CACHE_LINE_SIZE; + + if (!CHECK_IS_POWER2(align)) { + ODP_ERR("Not a power of two: %s = %i\n", str, val); + return -1; + } + + pool_glb->config.buf_min_align = align; + ODP_PRINT(" %s: %u\n", str, align); + ODP_PRINT("\n");
return 0; diff --git a/platform/linux-generic/test/inline-timer.conf b/platform/linux-generic/test/inline-timer.conf index 362ecd55..45b456e8 100644 --- a/platform/linux-generic/test/inline-timer.conf +++ b/platform/linux-generic/test/inline-timer.conf @@ -1,6 +1,6 @@ # Mandatory fields odp_implementation = "linux-generic" -config_file_version = "0.1.10" +config_file_version = "0.1.11"
timer: { # Enable inline timer implementation diff --git a/platform/linux-generic/test/process-mode.conf b/platform/linux-generic/test/process-mode.conf index 6fb08aea..fd766e62 100644 --- a/platform/linux-generic/test/process-mode.conf +++ b/platform/linux-generic/test/process-mode.conf @@ -1,6 +1,6 @@ # Mandatory fields odp_implementation = "linux-generic" -config_file_version = "0.1.10" +config_file_version = "0.1.11"
# Shared memory options shm: {
commit ab5574db4e04e097170dff2d30a77281ebc85278 Author: Petri Savolainen petri.savolainen@nokia.com Date: Fri Nov 15 14:40:42 2019 +0200
linux-gen: pool: rename pool global variable
Renamed global variable for better code readability. Use _odp prefix as the name is visible to application when APIs are inlined.
Signed-off-by: Petri Savolainen petri.savolainen@nokia.com Reviewed-by: Matias Elo matias.elo@nokia.com
diff --git a/platform/linux-generic/include/odp_pool_internal.h b/platform/linux-generic/include/odp_pool_internal.h index 42a2cf16..37b10aa1 100644 --- a/platform/linux-generic/include/odp_pool_internal.h +++ b/platform/linux-generic/include/odp_pool_internal.h @@ -89,7 +89,7 @@ typedef struct pool_t {
} pool_t;
-typedef struct pool_table_t { +typedef struct pool_global_t { pool_t pool[ODP_CONFIG_POOLS]; odp_shm_t shm;
@@ -99,18 +99,18 @@ typedef struct pool_table_t { uint32_t burst_size; } config;
-} pool_table_t; +} pool_global_t;
-extern pool_table_t *pool_tbl; +extern pool_global_t *_odp_pool_glb;
static inline pool_t *pool_entry(uint32_t pool_idx) { - return &pool_tbl->pool[pool_idx]; + return &_odp_pool_glb->pool[pool_idx]; }
static inline pool_t *pool_entry_from_hdl(odp_pool_t pool_hdl) { - return &pool_tbl->pool[_odp_typeval(pool_hdl) - 1]; + return &_odp_pool_glb->pool[_odp_typeval(pool_hdl) - 1]; }
static inline odp_buffer_hdr_t *buf_hdl_to_hdr(odp_buffer_t buf) diff --git a/platform/linux-generic/odp_pool.c b/platform/linux-generic/odp_pool.c index 95dcb688..0937c8b3 100644 --- a/platform/linux-generic/odp_pool.c +++ b/platform/linux-generic/odp_pool.c @@ -60,7 +60,7 @@ typedef struct pool_local_t { int thr_id; } pool_local_t;
-pool_table_t *pool_tbl; +pool_global_t *_odp_pool_glb; static __thread pool_local_t local;
#include <odp/visibility_begin.h> @@ -89,8 +89,8 @@ static inline void cache_init(pool_cache_t *cache) { memset(cache, 0, sizeof(pool_cache_t));
- cache->size = pool_tbl->config.local_cache_size; - cache->burst_size = pool_tbl->config.burst_size; + cache->size = _odp_pool_glb->config.local_cache_size; + cache->burst_size = _odp_pool_glb->config.burst_size; }
static inline uint32_t cache_pop(pool_cache_t *cache, @@ -140,8 +140,9 @@ static void cache_flush(pool_cache_t *cache, pool_t *pool) ring_ptr_enq(ring, mask, buf_hdr); }
-static int read_config_file(pool_table_t *pool_tbl) +static int read_config_file(pool_global_t *pool_glb) { + uint32_t local_cache_size, burst_size; const char *str; int val = 0;
@@ -159,7 +160,8 @@ static int read_config_file(pool_table_t *pool_tbl) return -1; }
- pool_tbl->config.local_cache_size = val; + local_cache_size = val; + pool_glb->config.local_cache_size = local_cache_size; ODP_PRINT(" %s: %i\n", str, val);
str = "pool.burst_size"; @@ -173,18 +175,17 @@ static int read_config_file(pool_table_t *pool_tbl) return -1; }
- pool_tbl->config.burst_size = val; + burst_size = val; + pool_glb->config.burst_size = burst_size; ODP_PRINT(" %s: %i\n", str, val);
/* Check local cache size and burst size relation */ - if (pool_tbl->config.local_cache_size % pool_tbl->config.burst_size) { + if (local_cache_size % burst_size) { ODP_ERR("Pool cache size not multiple of burst size\n"); return -1; }
- if (pool_tbl->config.local_cache_size && - (pool_tbl->config.local_cache_size / - pool_tbl->config.burst_size < 2)) { + if (local_cache_size && (local_cache_size / burst_size < 2)) { ODP_ERR("Cache burst size too large compared to cache size\n"); return -1; } @@ -200,7 +201,7 @@ static int read_config_file(pool_table_t *pool_tbl) return -1; }
- pool_tbl->config.pkt_max_num = val; + pool_glb->config.pkt_max_num = val; ODP_PRINT(" %s: %i\n", str, val);
ODP_PRINT("\n"); @@ -214,19 +215,19 @@ int _odp_pool_init_global(void) odp_shm_t shm;
shm = odp_shm_reserve("_odp_pool_table", - sizeof(pool_table_t), + sizeof(pool_global_t), ODP_CACHE_LINE_SIZE, 0);
- pool_tbl = odp_shm_addr(shm); + _odp_pool_glb = odp_shm_addr(shm);
- if (pool_tbl == NULL) + if (_odp_pool_glb == NULL) return -1;
- memset(pool_tbl, 0, sizeof(pool_table_t)); - pool_tbl->shm = shm; + memset(_odp_pool_glb, 0, sizeof(pool_global_t)); + _odp_pool_glb->shm = shm;
- if (read_config_file(pool_tbl)) { + if (read_config_file(_odp_pool_glb)) { odp_shm_free(shm); return -1; } @@ -264,7 +265,7 @@ int _odp_pool_term_global(void) UNLOCK(&pool->lock); }
- ret = odp_shm_free(pool_tbl->shm); + ret = odp_shm_free(_odp_pool_glb->shm); if (ret < 0) { ODP_ERR("SHM free failed\n"); rc = -1; @@ -678,7 +679,7 @@ static int check_params(odp_pool_param_t *params) { odp_pool_capability_t capa; odp_bool_t cache_warning = false; - uint32_t cache_size = pool_tbl->config.local_cache_size; + uint32_t cache_size = _odp_pool_glb->config.local_cache_size; int num_threads = odp_global_ro.init_param.num_control + odp_global_ro.init_param.num_worker;
@@ -686,7 +687,7 @@ static int check_params(odp_pool_param_t *params) return -1;
if (num_threads) - cache_size = num_threads * pool_tbl->config.local_cache_size; + cache_size = num_threads * cache_size;
switch (params->type) { case ODP_POOL_BUFFER: @@ -1064,7 +1065,7 @@ int odp_pool_capability(odp_pool_capability_t *capa) /* Packet pools */ capa->pkt.max_pools = max_pools; capa->pkt.max_len = CONFIG_PACKET_MAX_LEN; - capa->pkt.max_num = pool_tbl->config.pkt_max_num; + capa->pkt.max_num = _odp_pool_glb->config.pkt_max_num; capa->pkt.min_headroom = CONFIG_PACKET_HEADROOM; capa->pkt.max_headroom = CONFIG_PACKET_HEADROOM; capa->pkt.min_tailroom = CONFIG_PACKET_TAILROOM;
-----------------------------------------------------------------------
Summary of changes: config/odp-linux-generic.conf | 23 ++++- .../linux-generic/include/odp_packet_internal.h | 8 ++ .../linux-generic/include/odp_packet_io_internal.h | 12 ++- platform/linux-generic/include/odp_pool_internal.h | 12 ++- platform/linux-generic/odp_packet.c | 8 -- platform/linux-generic/odp_packet_io.c | 81 +++++++++++----- platform/linux-generic/odp_pool.c | 105 ++++++++++++++------- platform/linux-generic/pktio/dpdk.c | 17 +++- platform/linux-generic/pktio/netmap.c | 14 +-- platform/linux-generic/pktio/pcap.c | 8 +- platform/linux-generic/pktio/socket.c | 6 +- platform/linux-generic/pktio/socket_mmap.c | 6 +- platform/linux-generic/pktio/tap.c | 12 ++- platform/linux-generic/test/inline-timer.conf | 2 +- platform/linux-generic/test/process-mode.conf | 2 +- 15 files changed, 227 insertions(+), 89 deletions(-)
hooks/post-receive