app/crypto-perf: honour min headroom/tailroom
authorAnoob Joseph <anoob.joseph@caviumnetworks.com>
Tue, 10 Jul 2018 14:42:38 +0000 (20:12 +0530)
committerPablo de Lara <pablo.de.lara.guarch@intel.com>
Wed, 11 Jul 2018 01:57:24 +0000 (03:57 +0200)
Crypto dev would specify its headroom and tailroom requirement and the
application is expected to honour this while creating buffers.

Signed-off-by: Anoob Joseph <anoob.joseph@caviumnetworks.com>
Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
app/test-crypto-perf/cperf_options.h
app/test-crypto-perf/cperf_test_common.c
app/test-crypto-perf/main.c

index 350ad7e..f5bf03c 100644 (file)
@@ -76,6 +76,8 @@ struct cperf_options {
 
        uint32_t pool_sz;
        uint32_t total_ops;
+       uint32_t headroom_sz;
+       uint32_t tailroom_sz;
        uint32_t segment_sz;
        uint32_t test_buffer_size;
        uint32_t *imix_buffer_sizes;
index 423782c..e803dc1 100644 (file)
@@ -11,12 +11,15 @@ struct obj_params {
        uint32_t src_buf_offset;
        uint32_t dst_buf_offset;
        uint16_t segment_sz;
+       uint16_t headroom_sz;
+       uint16_t data_len;
        uint16_t segments_nb;
 };
 
 static void
 fill_single_seg_mbuf(struct rte_mbuf *m, struct rte_mempool *mp,
-               void *obj, uint32_t mbuf_offset, uint16_t segment_sz)
+               void *obj, uint32_t mbuf_offset, uint16_t segment_sz,
+               uint16_t headroom, uint16_t data_len)
 {
        uint32_t mbuf_hdr_size = sizeof(struct rte_mbuf);
 
@@ -26,10 +29,10 @@ fill_single_seg_mbuf(struct rte_mbuf *m, struct rte_mempool *mp,
        m->buf_iova = rte_mempool_virt2iova(obj) +
                mbuf_offset + mbuf_hdr_size;
        m->buf_len = segment_sz;
-       m->data_len = segment_sz;
+       m->data_len = data_len;
 
-       /* No headroom needed for the buffer */
-       m->data_off = 0;
+       /* Use headroom specified for the buffer */
+       m->data_off = headroom;
 
        /* init some constant fields */
        m->pool = mp;
@@ -42,7 +45,7 @@ fill_single_seg_mbuf(struct rte_mbuf *m, struct rte_mempool *mp,
 static void
 fill_multi_seg_mbuf(struct rte_mbuf *m, struct rte_mempool *mp,
                void *obj, uint32_t mbuf_offset, uint16_t segment_sz,
-               uint16_t segments_nb)
+               uint16_t headroom, uint16_t data_len, uint16_t segments_nb)
 {
        uint16_t mbuf_hdr_size = sizeof(struct rte_mbuf);
        uint16_t remaining_segments = segments_nb;
@@ -57,10 +60,10 @@ fill_multi_seg_mbuf(struct rte_mbuf *m, struct rte_mempool *mp,
                m->buf_iova = next_seg_phys_addr;
                next_seg_phys_addr += mbuf_hdr_size + segment_sz;
                m->buf_len = segment_sz;
-               m->data_len = segment_sz;
+               m->data_len = data_len;
 
-               /* No headroom needed for the buffer */
-               m->data_off = 0;
+               /* Use headroom specified for the buffer */
+               m->data_off = headroom;
 
                /* init some constant fields */
                m->pool = mp;
@@ -99,10 +102,12 @@ mempool_obj_init(struct rte_mempool *mp,
        op->sym->m_src = m;
        if (params->segments_nb == 1)
                fill_single_seg_mbuf(m, mp, obj, params->src_buf_offset,
-                               params->segment_sz);
+                               params->segment_sz, params->headroom_sz,
+                               params->data_len);
        else
                fill_multi_seg_mbuf(m, mp, obj, params->src_buf_offset,
-                               params->segment_sz, params->segments_nb);
+                               params->segment_sz, params->headroom_sz,
+                               params->data_len, params->segments_nb);
 
 
        /* Set destination buffer */
@@ -110,7 +115,8 @@ mempool_obj_init(struct rte_mempool *mp,
                m = (struct rte_mbuf *) ((uint8_t *) obj +
                                params->dst_buf_offset);
                fill_single_seg_mbuf(m, mp, obj, params->dst_buf_offset,
-                               params->segment_sz);
+                               params->segment_sz, params->headroom_sz,
+                               params->data_len);
                op->sym->m_dst = m;
        } else
                op->sym->m_dst = NULL;
@@ -172,6 +178,11 @@ cperf_alloc_common_memory(const struct cperf_options *options,
 
        struct obj_params params = {
                .segment_sz = options->segment_sz,
+               .headroom_sz = options->headroom_sz,
+               /* Data len = segment size - (headroom + tailroom) */
+               .data_len = options->segment_sz -
+                           options->headroom_sz -
+                           options->tailroom_sz,
                .segments_nb = segments_nb,
                .src_buf_offset = crypto_op_total_size_padded,
                .dst_buf_offset = 0
index 2181d01..34873af 100644 (file)
@@ -149,6 +149,23 @@ cperf_initialize_cryptodev(struct cperf_options *opts, uint8_t *enabled_cdevs,
                        .nb_descriptors = opts->nb_descriptors
                };
 
+               /**
+                * Device info specifies the min headroom and tailroom
+                * requirement for the crypto PMD. This need to be honoured
+                * by the application, while creating mbuf.
+                */
+               if (opts->headroom_sz < cdev_info.min_mbuf_headroom_req) {
+                       /* Update headroom */
+                       opts->headroom_sz = cdev_info.min_mbuf_headroom_req;
+               }
+               if (opts->tailroom_sz < cdev_info.min_mbuf_tailroom_req) {
+                       /* Update tailroom */
+                       opts->tailroom_sz = cdev_info.min_mbuf_tailroom_req;
+               }
+
+               /* Update segment size to include headroom & tailroom */
+               opts->segment_sz += (opts->headroom_sz + opts->tailroom_sz);
+
                uint32_t dev_max_nb_sess = cdev_info.sym.max_nb_sessions;
                /*
                 * Two sessions objects are required for each session