@@ -102,6 +102,8 @@ typedef struct {
packet, 0 - not yet ready */
void *pinfo;
odp_shm_t pinfo_shm;
+ odp_shm_t remote_pool_shm; /**< shm of remote pool get with
+ _ipc_map_remote_pool() */
} _ipc_pktio_t;
struct pktio_entry {
@@ -25,7 +25,7 @@
/* MAC address for the "ipc" interface */
static const char pktio_ipc_mac[] = {0x12, 0x12, 0x12, 0x12, 0x12, 0x12};
-static void *_ipc_map_remote_pool(const char *name, int pid);
+static odp_shm_t _ipc_map_remote_pool(const char *name, int pid);
static const char *_ipc_odp_buffer_pool_shm_name(odp_pool_t pool_hdl)
{
@@ -44,21 +44,22 @@ static const char *_ipc_odp_buffer_pool_shm_name(odp_pool_t pool_hdl)
static int _ipc_master_start(pktio_entry_t *pktio_entry)
{
struct pktio_info *pinfo = pktio_entry->s.ipc.pinfo;
- void *ipc_pool_base;
+ odp_shm_t shm;
if (pinfo->slave.init_done == 0)
return -1;
- ipc_pool_base = _ipc_map_remote_pool(pinfo->slave.pool_name,
- pinfo->slave.pid);
- if (ipc_pool_base == NULL) {
+ shm = _ipc_map_remote_pool(pinfo->slave.pool_name,
+ pinfo->slave.pid);
+ if (shm == ODP_SHM_INVALID) {
ODP_DBG("no pool file %s for pid %d\n",
pinfo->slave.pool_name, pinfo->slave.pid);
return -1;
}
- pktio_entry->s.ipc.pool_base = ipc_pool_base;
- pktio_entry->s.ipc.pool_mdata_base = (char *)ipc_pool_base +
+ pktio_entry->s.ipc.remote_pool_shm = shm;
+ pktio_entry->s.ipc.pool_base = odp_shm_addr(shm);
+ pktio_entry->s.ipc.pool_mdata_base = (char *)odp_shm_addr(shm) +
pinfo->slave.base_addr_offset;
odp_atomic_store_u32(&pktio_entry->s.ipc.ready, 1);
@@ -190,23 +191,20 @@ static void _ipc_export_pool(struct pktio_info *pinfo,
pinfo->slave.base_addr = pool->base_addr;
}
-static void *_ipc_map_remote_pool(const char *name, int pid)
+static odp_shm_t _ipc_map_remote_pool(const char *name, int pid)
{
odp_shm_t shm;
- void *addr;
char rname[ODP_SHM_NAME_LEN];
snprintf(rname, ODP_SHM_NAME_LEN, "remote-%s", name);
shm = odp_shm_import(name, pid, rname);
if (shm == ODP_SHM_INVALID) {
ODP_ERR("unable map %s\n", name);
- return NULL;
+ return ODP_SHM_INVALID;
}
- addr = odp_shm_addr(shm);
-
IPC_ODP_DBG("Mapped remote pool %s to local %s\n", name, rname);
- return addr;
+ return shm;
}
static void *_ipc_shm_map(char *name, int pid)
@@ -237,7 +235,6 @@ static int _ipc_slave_start(pktio_entry_t *pktio_entry)
{
char ipc_shm_name[ODP_POOL_NAME_LEN + sizeof("_slave_r")];
struct pktio_info *pinfo;
- void *ipc_pool_base;
odp_shm_t shm;
char tail[ODP_POOL_NAME_LEN];
char dev[ODP_POOL_NAME_LEN];
@@ -297,9 +294,10 @@ static int _ipc_slave_start(pktio_entry_t *pktio_entry)
/* Get info about remote pool */
pinfo = pktio_entry->s.ipc.pinfo;
- ipc_pool_base = _ipc_map_remote_pool(pinfo->master.pool_name,
- pid);
- pktio_entry->s.ipc.pool_mdata_base = (char *)ipc_pool_base +
+ shm = _ipc_map_remote_pool(pinfo->master.pool_name,
+ pid);
+ pktio_entry->s.ipc.remote_pool_shm = shm;
+ pktio_entry->s.ipc.pool_mdata_base = (char *)odp_shm_addr(shm) +
pinfo->master.base_addr_offset;
pktio_entry->s.ipc.pkt_size = pinfo->master.block_size;
@@ -684,23 +682,31 @@ static int ipc_close(pktio_entry_t *pktio_entry)
{
char ipc_shm_name[ODP_POOL_NAME_LEN + sizeof("_m_prod")];
char *dev = pktio_entry->s.name;
+ char name[ODP_POOL_NAME_LEN];
+ char tail[ODP_POOL_NAME_LEN];
+ int pid = 0;
ipc_stop(pktio_entry);
- if (pktio_entry->s.ipc.type == PKTIO_TYPE_IPC_MASTER) {
- /* unlink this pktio info for both master and slave */
- odp_shm_free(pktio_entry->s.ipc.pinfo_shm);
+ odp_shm_free(pktio_entry->s.ipc.remote_pool_shm);
- /* destroy rings */
- snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_s_cons", dev);
- _ring_destroy(ipc_shm_name);
- snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_s_prod", dev);
- _ring_destroy(ipc_shm_name);
- snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_m_cons", dev);
- _ring_destroy(ipc_shm_name);
- snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_m_prod", dev);
- _ring_destroy(ipc_shm_name);
- }
+ if (sscanf(dev, "ipc:%d:%s", &pid, tail) == 2)
+ snprintf(name, sizeof(name), "ipc:%s", tail);
+ else
+ snprintf(name, sizeof(name), "%s", dev);
+
+ /* unlink this pktio info for both master and slave */
+ odp_shm_free(pktio_entry->s.ipc.pinfo_shm);
+
+ /* destroy rings */
+ snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_s_cons", name);
+ _ring_destroy(ipc_shm_name);
+ snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_s_prod", name);
+ _ring_destroy(ipc_shm_name);
+ snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_m_cons", name);
+ _ring_destroy(ipc_shm_name);
+ snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_m_prod", name);
+ _ring_destroy(ipc_shm_name);
return 0;
}
@@ -25,19 +25,23 @@ run()
rm -rf /tmp/odp-* 2>&1 > /dev/null
echo "==== run pktio_ipc1 then pktio_ipc2 ===="
- pktio_ipc1${EXEEXT} -t 30 &
+ pktio_ipc1${EXEEXT} -t 10 &
IPC_PID=$!
- pktio_ipc2${EXEEXT} -p ${IPC_PID} -t 10
+ pktio_ipc2${EXEEXT} -p ${IPC_PID} -t 5
ret=$?
# pktio_ipc1 should do clean up and exit just
# after pktio_ipc2 exited. If it does not happen
# kill him in test.
- sleep 1
- kill ${IPC_PID} 2>&1 > /dev/null
+ sleep 13
+ (kill ${IPC_PID} 2>&1 > /dev/null ) > /dev/null
if [ $? -eq 0 ]; then
- ls -l /tmp/odp*
+ echo "pktio_ipc1${EXEEXT} was killed"
+ ls -l /tmp/odp* 2> /dev/null
rm -rf /tmp/odp-${IPC_PID}* 2>&1 > /dev/null
+ else
+ echo "normal exit of 2 application"
+ ls -l /tmp/odp* 2> /dev/null
fi
if [ $ret -ne 0 ]; then
@@ -47,21 +51,32 @@ run()
echo "First stage PASSED"
fi
-
echo "==== run pktio_ipc2 then pktio_ipc1 ===="
- pktio_ipc2${EXEEXT} -t 20 &
+ pktio_ipc2${EXEEXT} -t 10 &
IPC_PID=$!
- pktio_ipc1${EXEEXT} -p ${IPC_PID} -t 10
+ pktio_ipc1${EXEEXT} -p ${IPC_PID} -t 5
ret=$?
- (kill ${IPC_PID} 2>&1 > /dev/null) > /dev/null || true
+ # pktio_ipc2 do not exit on pktio_ipc1 disconnect
+ # wait until it exits cleanly
+ sleep 13
+ (kill ${IPC_PID} 2>&1 > /dev/null ) > /dev/null
+ if [ $? -eq 0 ]; then
+ echo "pktio_ipc2${EXEEXT} was killed"
+ ls -l /tmp/odp* 2> /dev/null
+ rm -rf /tmp/odp-${IPC_PID}* 2>&1 > /dev/null
+ else
+ echo "normal exit of 2 application"
+ ls -l /tmp/odp* 2> /dev/null
+ fi
if [ $ret -ne 0 ]; then
echo "!!! FAILED !!!"
- ls -l /tmp/odp*
+ ls -l /tmp/odp* 2> /dev/null
rm -rf /tmp/odp-${IPC_PID}* 2>&1 > /dev/null
exit $ret
else
+ ls -l /tmp/odp* 2> /dev/null
echo "Second stage PASSED"
fi
fix termination, removing using shared memory objects, and more debug to run script to debug issues in future. Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org> --- .../linux-generic/include/odp_packet_io_internal.h | 2 + platform/linux-generic/pktio/ipc.c | 66 ++++++++++++---------- test/linux-generic/pktio_ipc/pktio_ipc_run.sh | 35 ++++++++---- 3 files changed, 63 insertions(+), 40 deletions(-) -- 2.7.1.250.gff4ea60