diff options
author | Janne Peltonen <janne.peltonen@nokia.com> | 2022-09-23 10:12:15 +0300 |
---|---|---|
committer | Matias Elo <matias.elo@nokia.com> | 2022-09-23 15:59:00 +0300 |
commit | 22097cd3c568b955d4cf3ad22da0ff8999cc7345 (patch) | |
tree | 73d4a932ce11a44c3c36fd8313c9a6ba30b0fdf3 | |
parent | c81dbe08b422a92e517bbd40645ad61931ccdd9e (diff) |
linux-dpdk: crypto: reuse input packet as output packet if possiblev1.37.2.0_DPDK_19.11
Do not allocate a new packet but reuse the input packet when a crypto
operation is requested to allocate the output packet and the input
packet and the session use the same packet pool.
Make the code cleaner by moving output packet allocation and preparation
to its own function from crypto_int().
Signed-off-by: Janne Peltonen <janne.peltonen@nokia.com>
Reviewed-by: Tuomas Taipale <tuomas.taipale@nokia.com>
-rw-r--r-- | platform/linux-dpdk/odp_crypto.c | 98 |
1 files changed, 56 insertions, 42 deletions
diff --git a/platform/linux-dpdk/odp_crypto.c b/platform/linux-dpdk/odp_crypto.c index 026132579..7de208f0d 100644 --- a/platform/linux-dpdk/odp_crypto.c +++ b/platform/linux-dpdk/odp_crypto.c @@ -1803,6 +1803,58 @@ static int linearize_pkt(const crypto_session_entry_t *session, odp_packet_t pkt return odp_packet_num_segs(pkt) != 1; } +static int copy_data_and_metadata(odp_packet_t dst, odp_packet_t src) +{ + int md_copy; + int rc; + + md_copy = _odp_packet_copy_md_possible(odp_packet_pool(dst), + odp_packet_pool(src)); + if (odp_unlikely(md_copy < 0)) { + ODP_ERR("Unable to copy packet metadata\n"); + return -1; + } + + rc = odp_packet_copy_from_pkt(dst, 0, src, 0, odp_packet_len(src)); + if (odp_unlikely(rc < 0)) { + ODP_ERR("Unable to copy packet data\n"); + return -1; + } + + _odp_packet_copy_md(packet_hdr(dst), packet_hdr(src), md_copy); + return 0; +} + +static odp_packet_t get_output_packet(const crypto_session_entry_t *session, + odp_packet_t pkt_in, + odp_packet_t pkt_out) +{ + int rc; + + if (odp_likely(pkt_in == pkt_out)) + return pkt_out; + + if (pkt_out == ODP_PACKET_INVALID) { + odp_pool_t pool = session->p.output_pool; + + ODP_ASSERT(pool != ODP_POOL_INVALID); + if (pool == odp_packet_pool(pkt_in)) { + pkt_out = pkt_in; + } else { + pkt_out = odp_packet_copy(pkt_in, pool); + if (odp_likely(pkt_out != ODP_PACKET_INVALID)) + odp_packet_free(pkt_in); + } + return pkt_out; + } + rc = copy_data_and_metadata(pkt_out, pkt_in); + if (odp_unlikely(rc < 0)) + return ODP_PACKET_INVALID; + + odp_packet_free(pkt_in); + return pkt_out; +} + static int odp_crypto_int(odp_packet_t pkt_in, odp_packet_t *pkt_out, @@ -1813,8 +1865,7 @@ int odp_crypto_int(odp_packet_t pkt_in, odp_crypto_alg_err_t rc_auth = ODP_CRYPTO_ALG_ERR_NONE; struct rte_cryptodev_sym_session *rte_session = NULL; struct rte_crypto_op *op = NULL; - odp_bool_t allocated = false; - odp_packet_t out_pkt = *pkt_out; + odp_packet_t out_pkt; odp_crypto_packet_result_t *op_result; odp_bool_t result_ok = true; @@ -1822,19 +1873,6 @@ int odp_crypto_int(odp_packet_t pkt_in, if (odp_unlikely(session == NULL)) return -1; - /* Resolve output buffer */ - if (ODP_PACKET_INVALID == out_pkt && - ODP_POOL_INVALID != session->p.output_pool) { - out_pkt = odp_packet_alloc(session->p.output_pool, - odp_packet_len(pkt_in)); - allocated = true; - } - - if (odp_unlikely(ODP_PACKET_INVALID == out_pkt)) { - ODP_DBG("Alloc failed.\n"); - return -1; - } - op = rte_crypto_op_alloc(global->crypto_op_pool, RTE_CRYPTO_OP_TYPE_SYMMETRIC); if (odp_unlikely(op == NULL)) { @@ -1842,29 +1880,9 @@ int odp_crypto_int(odp_packet_t pkt_in, goto err; } - if (pkt_in != out_pkt) { - int ret; - int md_copy; - - md_copy = _odp_packet_copy_md_possible(odp_packet_pool(out_pkt), - odp_packet_pool(pkt_in)); - if (odp_unlikely(md_copy < 0)) { - ODP_ERR("Unable to copy packet metadata\n"); - goto err; - } - - ret = odp_packet_copy_from_pkt(out_pkt, - 0, - pkt_in, - 0, - odp_packet_len(pkt_in)); - if (odp_unlikely(ret < 0)) - goto err; - - _odp_packet_copy_md(packet_hdr(out_pkt), packet_hdr(pkt_in), md_copy); - odp_packet_free(pkt_in); - pkt_in = ODP_PACKET_INVALID; - } + out_pkt = get_output_packet(session, pkt_in, *pkt_out); + if (odp_unlikely(out_pkt == ODP_PACKET_INVALID)) + goto err; if (odp_unlikely(linearize_pkt(session, out_pkt))) { result_ok = false; @@ -1995,10 +2013,6 @@ out: err: if (op) rte_crypto_op_free(op); - if (allocated) { - odp_packet_free(out_pkt); - out_pkt = ODP_PACKET_INVALID; - } return -1; } |