Signed-off-by: Maxim Uvarov <[email protected]>
---
Note: by default ipc_pkt is turned on. But examples compilation and execution
is turned off. You need to add --enable-pktio_ipc-support to ./configure
I think there will be separate patch to finally enable it after several
loops in CI.
Maxim.
.../include/odp/api/plat/init_types.h | 1 +
platform/linux-generic/include/odp_internal.h | 1 +
platform/linux-generic/include/odp_shm_internal.h | 5 ++++
platform/linux-generic/odp_init.c | 5 +++-
platform/linux-generic/odp_shared_memory.c | 12 ++++++---
platform/linux-generic/pktio/ipc.c | 28 ++++++++++++++-------
platform/linux-generic/test/pktio_ipc/ipc_common.c | 20 ++++++++++++---
platform/linux-generic/test/pktio_ipc/ipc_common.h | 3 +++
platform/linux-generic/test/pktio_ipc/pktio_ipc1.c | 29 +++++++++++++---------
platform/linux-generic/test/pktio_ipc/pktio_ipc2.c | 24 +++++++++++-------
.../linux-generic/test/pktio_ipc/pktio_ipc_run | 17 ++++++-------
11 files changed, 96 insertions(+), 49 deletions(-)
diff --git a/platform/linux-generic/include/odp/api/plat/init_types.h
b/platform/linux-generic/include/odp/api/plat/init_types.h
index 6a1052d..888b04a 100644
--- a/platform/linux-generic/include/odp/api/plat/init_types.h
+++ b/platform/linux-generic/include/odp/api/plat/init_types.h
@@ -25,6 +25,7 @@ typedef uint64_t odp_instance_t;
* @internal platform specific data
*/
typedef struct odp_platform_init_t {
+ int ipc_ns; /**< Name space for ipc shared objects. */
} odp_platform_init_t;
#ifdef __cplusplus
diff --git a/platform/linux-generic/include/odp_internal.h
b/platform/linux-generic/include/odp_internal.h
index d8aa7af..28a4fc4 100644
--- a/platform/linux-generic/include/odp_internal.h
+++ b/platform/linux-generic/include/odp_internal.h
@@ -46,6 +46,7 @@ struct odp_global_data_s {
odp_cpumask_t control_cpus;
odp_cpumask_t worker_cpus;
int num_cpus_installed;
+ int ipc_ns;
};
enum init_stage {
diff --git a/platform/linux-generic/include/odp_shm_internal.h
b/platform/linux-generic/include/odp_shm_internal.h
index 1fd7a3c..30e60f7 100644
--- a/platform/linux-generic/include/odp_shm_internal.h
+++ b/platform/linux-generic/include/odp_shm_internal.h
@@ -11,6 +11,11 @@
extern "C" {
#endif
+#include <odp/api/shared_memory.h>
+
+#define SHM_DEVNAME_MAXLEN (ODP_SHM_NAME_LEN + 16)
+#define SHM_DEVNAME_FORMAT "/odp-%d-%s" /* /dev/shm/odp-<pid>-<name> */
+
#define _ODP_SHM_PROC_NOCREAT 0x4 /**< Do not create shm if not exist */
#define _ODP_SHM_O_EXCL 0x8 /**< Do not create shm if exist */
diff --git a/platform/linux-generic/odp_init.c
b/platform/linux-generic/odp_init.c
index 51aaa9a..e8d12c9 100644
--- a/platform/linux-generic/odp_init.c
+++ b/platform/linux-generic/odp_init.c
@@ -12,9 +12,12 @@ struct odp_global_data_s odp_global_data;
int odp_init_global(odp_instance_t *instance,
const odp_init_t *params,
- const odp_platform_init_t *platform_params ODP_UNUSED)
+ const odp_platform_init_t *platform_params)
{
+ memset(&odp_global_data, 0, sizeof(struct odp_global_data_s));
odp_global_data.main_pid = getpid();
+ if (platform_params)
+ odp_global_data.ipc_ns = platform_params->ipc_ns;
enum init_stage stage = NO_INIT;
odp_global_data.log_fn = odp_override_log;
diff --git a/platform/linux-generic/odp_shared_memory.c
b/platform/linux-generic/odp_shared_memory.c
index 276a785..568711a 100644
--- a/platform/linux-generic/odp_shared_memory.c
+++ b/platform/linux-generic/odp_shared_memory.c
@@ -27,9 +27,6 @@
#include <string.h>
#include <errno.h>
-#define SHM_DEVNAME_MAXLEN (ODP_SHM_NAME_LEN + 16)
-#define SHM_DEVNAME_FORMAT "/odp-%d-%s" /* /dev/shm/odp-<pid>-<name> */
-
ODP_STATIC_ASSERT(ODP_CONFIG_SHM_BLOCKS >= ODP_CONFIG_POOLS,
"ODP_CONFIG_SHM_BLOCKS < ODP_CONFIG_POOLS");
@@ -231,11 +228,18 @@ odp_shm_t odp_shm_reserve(const char *name, uint64_t
size, uint64_t align,
oflag |= O_EXCL;
if (flags & (ODP_SHM_PROC | _ODP_SHM_PROC_NOCREAT)) {
+ int shm_ns_id;
+
+ if (odp_global_data.ipc_ns)
+ shm_ns_id = odp_global_data.ipc_ns;
+ else
+ shm_ns_id = odp_global_data.main_pid;
+
need_huge_page = 0;
/* Creates a file to /dev/shm/odp */
snprintf(shm_devname, SHM_DEVNAME_MAXLEN,
- SHM_DEVNAME_FORMAT, odp_global_data.main_pid, name);
+ SHM_DEVNAME_FORMAT, shm_ns_id, name);
fd = shm_open(shm_devname, oflag,
S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
if (fd == -1) {
diff --git a/platform/linux-generic/pktio/ipc.c
b/platform/linux-generic/pktio/ipc.c
index 4a17e36..b16c611 100644
--- a/platform/linux-generic/pktio/ipc.c
+++ b/platform/linux-generic/pktio/ipc.c
@@ -45,13 +45,23 @@ static const char *_ipc_odp_buffer_pool_shm_name(odp_pool_t
pool_hdl)
static int _ipc_shm_lookup(const char *name)
{
int shm;
+ char shm_devname[SHM_DEVNAME_MAXLEN];
- shm = shm_open(name, O_RDWR, S_IRUSR | S_IWUSR);
+ if (!odp_global_data.ipc_ns)
+ ODP_ABORT("ipc_ns not set\n");
+
+ snprintf(shm_devname, SHM_DEVNAME_MAXLEN,
+ SHM_DEVNAME_FORMAT,
+ odp_global_data.ipc_ns, name);
+
+ shm = shm_open(shm_devname, O_RDWR, S_IRUSR | S_IWUSR);
if (shm == -1) {
- if (errno == ENOENT)
+ if (errno == ENOENT) {
+ ODP_DBG("no file %s\n", shm_devname);
return -1;
+ }
ODP_ABORT("shm_open for %s err %s\n",
- name, strerror(errno));
+ shm_devname, strerror(errno));
}
close(shm);
return 0;
@@ -583,6 +593,8 @@ static int ipc_pktio_send(pktio_entry_t *pktio_entry,
int ret;
unsigned i;
uint32_t ready = odp_atomic_load_u32(&pktio_entry->s.ipc.ready);
+ odp_packet_t pkt_table_mapped[len]; /**< Ready to send packet has to be
+ * in memory mapped pool. */
if (odp_unlikely(!ready))
return 0;
@@ -610,8 +622,9 @@ static int ipc_pktio_send(pktio_entry_t *pktio_entry,
ODP_ABORT("Unable to copy packet\n");
odp_packet_free(pkt);
- /* Cannot do this. Packet table is const. */
- /*pkt_table[i] = newpkt;*/
+ pkt_table_mapped[i] = newpkt;
+ } else {
+ pkt_table_mapped[i] = pkt;
}
rbuf_p = (void *)&pkt;
@@ -626,10 +639,7 @@ static int ipc_pktio_send(pktio_entry_t *pktio_entry,
}
/* Put packets to ring to be processed by other process. */
- /* BUG: Cannot store pointer to user provided memory,
- which is likely allocated from the stack and will be overwritten
- after this function returns. */
-/* rbuf_p = (void *)&pkt_table[0]; */
+ rbuf_p = (void *)&pkt_table_mapped[0];
r = pktio_entry->s.ipc.tx.send;
ret = _ring_mp_enqueue_burst(r, rbuf_p, len);
if (odp_unlikely(ret < 0)) {
diff --git a/platform/linux-generic/test/pktio_ipc/ipc_common.c
b/platform/linux-generic/test/pktio_ipc/ipc_common.c
index 101f597..34d2632 100644
--- a/platform/linux-generic/test/pktio_ipc/ipc_common.c
+++ b/platform/linux-generic/test/pktio_ipc/ipc_common.c
@@ -8,6 +8,7 @@
/** Run time in seconds */
int run_time_sec;
+int ipc_name_space;
int ipc_odp_packet_sendall(odp_pktio_t pktio,
odp_packet_t pkt_tbl[], int num)
@@ -80,14 +81,16 @@ void parse_args(int argc, char *argv[])
int long_index;
static struct option longopts[] = {
{"time", required_argument, NULL, 't'},
- {"help", no_argument, NULL, 'h'}, /* return 'h' */
+ {"ns", required_argument, NULL, 'n'}, /* ipc name space */
+ {"help", no_argument, NULL, 'h'}, /* return 'h' */
{NULL, 0, NULL, 0}
};
run_time_sec = 0; /* loop forever if time to run is 0 */
+ ipc_name_space = 0;
while (1) {
- opt = getopt_long(argc, argv, "+t:h",
+ opt = getopt_long(argc, argv, "+t:n:h",
longopts, &long_index);
if (opt == -1)
@@ -97,17 +100,24 @@ void parse_args(int argc, char *argv[])
case 't':
run_time_sec = atoi(optarg);
break;
+ case 'n':
+ ipc_name_space = atoi(optarg);
+ break;
case 'h':
usage(argv[0]);
exit(EXIT_SUCCESS);
break;
-
default:
break;
}
}
optind = 1; /* reset 'extern optind' from the getopt lib */
+
+ if (!ipc_name_space) {
+ usage(argv[0]);
+ exit(1);
+ }
}
/**
@@ -138,10 +148,12 @@ void usage(char *progname)
{
printf("\n"
"Usage: %s OPTIONS\n"
- " E.g. %s -t seconds\n"
+ " E.g. -n ipc_name_space %s -t seconds\n"
"\n"
"OpenDataPlane linux-generic ipc test application.\n"
"\n"
+ "Mandatory OPTIONS:\n"
+ " -n, --ns IPC name space ID
/dev/shm/odp-<ns>-objname.\n"
"Optional OPTIONS\n"
" -h, --help Display help and exit.\n"
" -t, --time Time to run in seconds.\n"
diff --git a/platform/linux-generic/test/pktio_ipc/ipc_common.h
b/platform/linux-generic/test/pktio_ipc/ipc_common.h
index c5e3eb7..7bc483f 100644
--- a/platform/linux-generic/test/pktio_ipc/ipc_common.h
+++ b/platform/linux-generic/test/pktio_ipc/ipc_common.h
@@ -62,6 +62,9 @@ char *pktio_name;
/** Run time in seconds */
int run_time_sec;
+/** IPC name space id /dev/shm/odp-nsid-objname */
+int ipc_name_space;
+
/* helper funcs */
void parse_args(int argc, char *argv[]);
void print_info(char *progname);
diff --git a/platform/linux-generic/test/pktio_ipc/pktio_ipc1.c
b/platform/linux-generic/test/pktio_ipc/pktio_ipc1.c
index cec2b07..a4eed88 100644
--- a/platform/linux-generic/test/pktio_ipc/pktio_ipc1.c
+++ b/platform/linux-generic/test/pktio_ipc/pktio_ipc1.c
@@ -113,9 +113,9 @@ static int pktio_run_loop(odp_pool_t pool)
EXAMPLE_ABORT("invalid l4 offset\n");
off += ODPH_UDPHDR_LEN;
- ret = odp_packet_copydata_out(pkt, off,
- sizeof(head),
- &head);
+ ret = odp_packet_copy_to_mem(pkt, off,
+ sizeof(head),
+ &head);
if (ret) {
stat_errors++;
odp_packet_free(pkt);
@@ -137,9 +137,9 @@ static int pktio_run_loop(odp_pool_t pool)
}
off = odp_packet_len(pkt) - sizeof(pkt_tail_t);
- ret = odp_packet_copydata_out(pkt, off,
- sizeof(tail),
- &tail);
+ ret = odp_packet_copy_to_mem(pkt, off,
+ sizeof(tail),
+ &tail);
if (ret) {
stat_errors++;
odp_packet_free(pkt);
@@ -210,15 +210,15 @@ static int pktio_run_loop(odp_pool_t pool)
head.seq = cnt++;
off += ODPH_UDPHDR_LEN;
- ret = odp_packet_copydata_in(pkt, off, sizeof(head),
- &head);
+ ret = odp_packet_copy_from_mem(pkt, off, sizeof(head),
+ &head);
if (ret)
EXAMPLE_ABORT("unable to copy in head data");
tail.magic = TEST_SEQ_MAGIC;
off = odp_packet_len(pkt) - sizeof(pkt_tail_t);
- ret = odp_packet_copydata_in(pkt, off, sizeof(tail),
- &tail);
+ ret = odp_packet_copy_from_mem(pkt, off, sizeof(tail),
+ &tail);
if (ret)
EXAMPLE_ABORT("unable to copy in tail data");
}
@@ -280,19 +280,24 @@ int main(int argc, char *argv[])
{
odp_pool_t pool;
odp_pool_param_t params;
+ odp_instance_t instance;
+ odp_platform_init_t plat_idata;
int ret;
/* Parse and store the application arguments */
parse_args(argc, argv);
+ memset(&plat_idata, 0, sizeof(odp_platform_init_t));
+ plat_idata.ipc_ns = ipc_name_space;
+
/* Init ODP before calling anything else */
- if (odp_init_global(NULL, NULL)) {
+ if (odp_init_global(&instance, NULL, &plat_idata)) {
EXAMPLE_ERR("Error: ODP global init failed.\n");
exit(EXIT_FAILURE);
}
/* Init this thread */
- if (odp_init_local(ODP_THREAD_CONTROL)) {
+ if (odp_init_local(instance, ODP_THREAD_CONTROL)) {
EXAMPLE_ERR("Error: ODP local init failed.\n");
exit(EXIT_FAILURE);
}
diff --git a/platform/linux-generic/test/pktio_ipc/pktio_ipc2.c
b/platform/linux-generic/test/pktio_ipc/pktio_ipc2.c
index a133d8b..c0c6ff5 100644
--- a/platform/linux-generic/test/pktio_ipc/pktio_ipc2.c
+++ b/platform/linux-generic/test/pktio_ipc/pktio_ipc2.c
@@ -101,8 +101,8 @@ static int ipc_second_process(void)
EXAMPLE_ABORT("invalid l4 offset\n");
off += ODPH_UDPHDR_LEN;
- ret = odp_packet_copydata_out(pkt, off, sizeof(head),
- &head);
+ ret = odp_packet_copy_to_mem(pkt, off, sizeof(head),
+ &head);
if (ret)
EXAMPLE_ABORT("unable copy out head data");
@@ -111,8 +111,8 @@ static int ipc_second_process(void)
/* Modify magic number in packet */
head.magic = TEST_SEQ_MAGIC_2;
- ret = odp_packet_copydata_in(pkt, off, sizeof(head),
- &head);
+ ret = odp_packet_copy_from_mem(pkt, off, sizeof(head),
+ &head);
if (ret)
EXAMPLE_ABORT("unable to copy in head data");
}
@@ -136,9 +136,9 @@ static int ipc_second_process(void)
off = odp_packet_l4_offset(alloc_pkt);
off += ODPH_UDPHDR_LEN;
- ret = odp_packet_copydata_in(alloc_pkt, off,
- sizeof(head),
- &head);
+ ret = odp_packet_copy_from_mem(alloc_pkt, off,
+ sizeof(head),
+ &head);
if (ret)
EXAMPLE_ABORT("unable to copy in head data");
@@ -173,16 +173,22 @@ exit:
int main(int argc, char *argv[])
{
+ odp_instance_t instance;
+ odp_platform_init_t plat_idata;
+
/* Parse and store the application arguments */
parse_args(argc, argv);
- if (odp_init_global(NULL, NULL)) {
+ memset(&plat_idata, 0, sizeof(odp_platform_init_t));
+ plat_idata.ipc_ns = ipc_name_space;
+
+ if (odp_init_global(&instance, NULL, &plat_idata)) {
EXAMPLE_ERR("Error: ODP global init failed.\n");
exit(EXIT_FAILURE);
}
/* Init this thread */
- if (odp_init_local(ODP_THREAD_CONTROL)) {
+ if (odp_init_local(instance, ODP_THREAD_CONTROL)) {
EXAMPLE_ERR("Error: ODP local init failed.\n");
exit(EXIT_FAILURE);
}
diff --git a/platform/linux-generic/test/pktio_ipc/pktio_ipc_run
b/platform/linux-generic/test/pktio_ipc/pktio_ipc_run
index 08a7457..1128002 100755
--- a/platform/linux-generic/test/pktio_ipc/pktio_ipc_run
+++ b/platform/linux-generic/test/pktio_ipc/pktio_ipc_run
@@ -20,18 +20,17 @@ PATH=.:$PATH
run()
{
local ret=0
+ IPC_NS=$$
#if test was interrupted with CTRL+c than files
#might remain in shm. Needed cleanely delete them.
- rm -rf /dev/shm/ipc_pktio_* 2>&1 > /dev/null
- rm -rf /dev/shm/packet_pool1 2>&1 > /dev/null
- rm -rf /dev/shm/packet_pool2 2>&1 > /dev/null
+ rm -rf /dev/shm/odp-${IPC_NS}* 2>&1 > /dev/null
echo "==== run pktio_ipc1 then pktio_ipc2 ===="
- pktio_ipc1${EXEEXT} -t 30 &
+ pktio_ipc1${EXEEXT} -n ${IPC_NS} -t 30 &
IPC_PID=$!
- pktio_ipc2${EXEEXT} -t 10
+ pktio_ipc2${EXEEXT} -n ${IPC_NS} -t 10
ret=$?
# pktio_ipc1 should do clean up and exit just
# after pktio_ipc2 exited. If it does not happen
@@ -39,9 +38,7 @@ run()
sleep 1
kill ${IPC_PID} 2>&1 > /dev/null
if [ $? -eq 0 ]; then
- rm -rf /dev/shm/ipc_pktio_* 2>&1 > /dev/null
- rm -rf /dev/shm/packet_pool1 2>&1 > /dev/null
- rm -rf /dev/shm/packet_pool2 2>&1 > /dev/null
+ rm -rf /dev/shm/odp-${IPC_NS}* 2>&1 > /dev/null
fi
if [ $ret -ne 0 ]; then
@@ -52,10 +49,10 @@ run()
fi
echo "==== run pktio_ipc2 then pktio_ipc1 ===="
- pktio_ipc2${EXEEXT} -t 10 &
+ pktio_ipc2${EXEEXT} -n ${IPC_NS} -t 10 &
IPC_PID=$!
- pktio_ipc1${EXEEXT} -t 20
+ pktio_ipc1${EXEEXT} -n ${IPC_NS} -t 20
ret=$?
(kill ${IPC_PID} 2>&1 > /dev/null) > /dev/null || true
--
2.7.1.250.gff4ea60
_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp