Skip to content

Commit

Permalink
app/testpmd: add mempool with external data buffers
Browse files Browse the repository at this point in the history
The new mbuf pool type is added to testpmd. To engage the
mbuf pool with externally attached data buffers the parameter
"--mp-alloc=xbuf" should be specified in testpmd command line.

The objective of this patch is just to test whether mbuf pool
with externally attached data buffers works OK. The memory for
data buffers is allocated from DPDK memory, so this is not
"true" external memory from some physical device (this is
supposed the most common use case for such kind of mbuf pool).

The user should be aware that not all drivers support the mbuf
with EXT_ATTACHED_BUF flags set in newly allocated mbuf (many
PMDs just overwrite ol_flags field and flag value is getting
lost).

Signed-off-by: Viacheslav Ovsiienko <viacheslavo@mellanox.com>
Acked-by: Olivier Matz <olivier.matz@6wind.com>
  • Loading branch information
viacheslavo authored and tmonjalo committed Jan 20, 2020
1 parent 6c8e50c commit 72512e1
Show file tree
Hide file tree
Showing 6 changed files with 92 additions and 3 deletions.
2 changes: 2 additions & 0 deletions app/test-pmd/config.c
Original file line number Diff line number Diff line change
Expand Up @@ -2422,6 +2422,8 @@ mp_alloc_to_str(uint8_t mode)
return "xmem";
case MP_ALLOC_XMEM_HUGE:
return "xmemhuge";
case MP_ALLOC_XBUF:
return "xbuf";
default:
return "invalid";
}
Expand Down
3 changes: 2 additions & 1 deletion app/test-pmd/flowgen.c
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,8 @@ pkt_burst_flow_gen(struct fwd_stream *fs)
sizeof(*ip_hdr));
pkt->nb_segs = 1;
pkt->pkt_len = pkt_size;
pkt->ol_flags = ol_flags;
pkt->ol_flags &= EXT_ATTACHED_MBUF;
pkt->ol_flags |= ol_flags;
pkt->vlan_tci = vlan_tci;
pkt->vlan_tci_outer = vlan_tci_outer;
pkt->l2_len = sizeof(struct rte_ether_hdr);
Expand Down
2 changes: 2 additions & 0 deletions app/test-pmd/parameters.c
Original file line number Diff line number Diff line change
Expand Up @@ -841,6 +841,8 @@ launch_args_parse(int argc, char** argv)
mp_alloc_type = MP_ALLOC_XMEM;
else if (!strcmp(optarg, "xmemhuge"))
mp_alloc_type = MP_ALLOC_XMEM_HUGE;
else if (!strcmp(optarg, "xbuf"))
mp_alloc_type = MP_ALLOC_XBUF;
else
rte_exit(EXIT_FAILURE,
"mp-alloc %s invalid - must be: "
Expand Down
81 changes: 81 additions & 0 deletions app/test-pmd/testpmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@
#endif

#define EXTMEM_HEAP_NAME "extmem"
#define EXTBUF_ZONE_SIZE RTE_PGSIZE_2M

uint16_t verbose_level = 0; /**< Silent by default. */
int testpmd_logtype; /**< Log type for testpmd logs */
Expand Down Expand Up @@ -868,6 +869,66 @@ dma_map_cb(struct rte_mempool *mp __rte_unused, void *opaque __rte_unused,
}
}

static unsigned int
setup_extbuf(uint32_t nb_mbufs, uint16_t mbuf_sz, unsigned int socket_id,
char *pool_name, struct rte_pktmbuf_extmem **ext_mem)
{
struct rte_pktmbuf_extmem *xmem;
unsigned int ext_num, zone_num, elt_num;
uint16_t elt_size;

elt_size = RTE_ALIGN_CEIL(mbuf_sz, RTE_CACHE_LINE_SIZE);
elt_num = EXTBUF_ZONE_SIZE / elt_size;
zone_num = (nb_mbufs + elt_num - 1) / elt_num;

xmem = malloc(sizeof(struct rte_pktmbuf_extmem) * zone_num);
if (xmem == NULL) {
TESTPMD_LOG(ERR, "Cannot allocate memory for "
"external buffer descriptors\n");
*ext_mem = NULL;
return 0;
}
for (ext_num = 0; ext_num < zone_num; ext_num++) {
struct rte_pktmbuf_extmem *xseg = xmem + ext_num;
const struct rte_memzone *mz;
char mz_name[RTE_MEMZONE_NAMESIZE];
int ret;

ret = snprintf(mz_name, sizeof(mz_name),
RTE_MEMPOOL_MZ_FORMAT "_xb_%u", pool_name, ext_num);
if (ret < 0 || ret >= (int)sizeof(mz_name)) {
errno = ENAMETOOLONG;
ext_num = 0;
break;
}
mz = rte_memzone_reserve_aligned(mz_name, EXTBUF_ZONE_SIZE,
socket_id,
RTE_MEMZONE_IOVA_CONTIG |
RTE_MEMZONE_1GB |
RTE_MEMZONE_SIZE_HINT_ONLY,
EXTBUF_ZONE_SIZE);
if (mz == NULL) {
/*
* The caller exits on external buffer creation
* error, so there is no need to free memzones.
*/
errno = ENOMEM;
ext_num = 0;
break;
}
xseg->buf_ptr = mz->addr;
xseg->buf_iova = mz->iova;
xseg->buf_len = EXTBUF_ZONE_SIZE;
xseg->elt_size = elt_size;
}
if (ext_num == 0 && xmem != NULL) {
free(xmem);
xmem = NULL;
}
*ext_mem = xmem;
return ext_num;
}

/*
* Configuration initialisation done once at init time.
*/
Expand Down Expand Up @@ -936,6 +997,26 @@ mbuf_pool_create(uint16_t mbuf_seg_size, unsigned nb_mbuf,
heap_socket);
break;
}
case MP_ALLOC_XBUF:
{
struct rte_pktmbuf_extmem *ext_mem;
unsigned int ext_num;

ext_num = setup_extbuf(nb_mbuf, mbuf_seg_size,
socket_id, pool_name, &ext_mem);
if (ext_num == 0)
rte_exit(EXIT_FAILURE,
"Can't create pinned data buffers\n");

TESTPMD_LOG(INFO, "preferred mempool ops selected: %s\n",
rte_mbuf_best_mempool_ops());
rte_mp = rte_pktmbuf_pool_create_extbuf
(pool_name, nb_mbuf, mb_mempool_cache,
0, mbuf_seg_size, socket_id,
ext_mem, ext_num);
free(ext_mem);
break;
}
default:
{
rte_exit(EXIT_FAILURE, "Invalid mempool creation mode\n");
Expand Down
4 changes: 3 additions & 1 deletion app/test-pmd/testpmd.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,10 @@ enum {
/**< allocate mempool natively, but populate using anonymous memory */
MP_ALLOC_XMEM,
/**< allocate and populate mempool using anonymous memory */
MP_ALLOC_XMEM_HUGE
MP_ALLOC_XMEM_HUGE,
/**< allocate and populate mempool using anonymous hugepage memory */
MP_ALLOC_XBUF
/**< allocate mempool natively, use rte_pktmbuf_pool_create_extbuf */
};

#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
Expand Down
3 changes: 2 additions & 1 deletion app/test-pmd/txonly.c
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,8 @@ pkt_burst_prepare(struct rte_mbuf *pkt, struct rte_mempool *mbp,

rte_pktmbuf_reset_headroom(pkt);
pkt->data_len = tx_pkt_seg_lengths[0];
pkt->ol_flags = ol_flags;
pkt->ol_flags &= EXT_ATTACHED_MBUF;
pkt->ol_flags |= ol_flags;
pkt->vlan_tci = vlan_tci;
pkt->vlan_tci_outer = vlan_tci_outer;
pkt->l2_len = sizeof(struct rte_ether_hdr);
Expand Down

0 comments on commit 72512e1

Please sign in to comment.