Skip to content

Commit

Permalink
linux-gen: pktio: ipc fix packets free
Browse files Browse the repository at this point in the history
Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
Reviewed-and-tested-by: Bill Fischofer <bill.fischofer@linaro.org>
  • Loading branch information
muvarov committed Jul 11, 2017
1 parent 5a2ed3e commit b02fe5f
Showing 1 changed file with 26 additions and 5 deletions.
31 changes: 26 additions & 5 deletions platform/linux-generic/pktio/ipc.c
Expand Up @@ -389,10 +389,15 @@ static void _ipc_free_ring_packets(pktio_entry_t *pktio_entry, _ring_t *r)
int ret;
void **rbuf_p;
int i;
void *addr;
pool_t *pool;

if (!r)
return;

pool = pool_entry_from_hdl(pktio_entry->s.ipc.pool);
addr = odp_shm_addr(pool->shm);

rbuf_p = (void *)&offsets;

while (1) {
Expand All @@ -403,10 +408,10 @@ static void _ipc_free_ring_packets(pktio_entry_t *pktio_entry, _ring_t *r)
for (i = 0; i < ret; i++) {
odp_packet_hdr_t *phdr;
odp_packet_t pkt;
void *mbase = pktio_entry->s.ipc.pool_mdata_base;

phdr = (void *)((uint8_t *)mbase + offsets[i]);
phdr = (void *)((uint8_t *)addr + offsets[i]);
pkt = packet_handle(phdr);

odp_packet_free(pkt);
}
}
Expand All @@ -420,7 +425,7 @@ static int ipc_pktio_recv_lockless(pktio_entry_t *pktio_entry,
_ring_t *r;
_ring_t *r_p;
uintptr_t offsets[PKTIO_IPC_ENTRIES];
void **ipcbufs_p = (void *)&offsets;
void **ipcbufs_p = (void *)&offsets[0];
uint32_t ready;
int pkts_ring;

Expand All @@ -437,6 +442,11 @@ static int ipc_pktio_recv_lockless(pktio_entry_t *pktio_entry,
if (odp_unlikely(pkts < 0))
ODP_ABORT("internal error dequeue\n");

for (i = 0; i < pkts; i++) {
IPC_ODP_DBG("%d/%d recv packet offset %x\n",
i, pkts, offsets[i]);
}

/* fast path */
if (odp_likely(0 == pkts))
return 0;
Expand Down Expand Up @@ -511,9 +521,17 @@ static int ipc_pktio_recv_lockless(pktio_entry_t *pktio_entry,
r_p = pktio_entry->s.ipc.rx.free;

repeat:

ipcbufs_p = (void *)&offsets[0];
pkts_ring = _ring_mp_enqueue_burst(r_p, ipcbufs_p, pkts);
if (odp_unlikely(pkts_ring < 0))
ODP_ABORT("ipc: odp_ring_mp_enqueue_bulk r_p fail\n");

for (i = 0; i < pkts; i++) {
IPC_ODP_DBG("%d/%d send to be free packet offset %x\n",
i, pkts, offsets[i]);
}

if (odp_unlikely(pkts != pkts_ring)) {
IPC_ODP_DBG("odp_ring_full: %d, odp_ring_count %d,"
" _ring_free_count %d\n",
Expand Down Expand Up @@ -597,10 +615,13 @@ static int ipc_pktio_send_lockless(pktio_entry_t *pktio_entry,
/* compile all function code even if ipc disabled with config */
pkt_hdr->buf_hdr.ipc_data_offset = data_pool_off;
IPC_ODP_DBG("%d/%d send packet %llx, pool %llx,"
"phdr = %p, offset %x\n",
"phdr = %p, offset %x sendoff %x, addr %llx iaddr %llx\n",
i, len,
odp_packet_to_u64(pkt), odp_pool_to_u64(pool_hdl),
pkt_hdr, pkt_hdr->buf_hdr.ipc_data_offset);
pkt_hdr, pkt_hdr->buf_hdr.ipc_data_offset,
offsets[i], odp_shm_addr(pool->shm),
odp_shm_addr(pool_entry_from_hdl(
pktio_entry->s.ipc.pool)->shm));
}

/* Put packets to ring to be processed by other process. */
Expand Down

0 comments on commit b02fe5f

Please sign in to comment.