From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by dpdk.org (Postfix) with ESMTP id 7955E1B745 for ; Wed, 9 May 2018 18:14:55 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 09 May 2018 09:14:55 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.49,382,1520924400"; d="scan'208";a="222921245" Received: from silpixa00399501.ir.intel.com ([10.237.223.69]) by orsmga005.jf.intel.com with ESMTP; 09 May 2018 09:14:53 -0700 From: Lee Daly To: dev@dpdk.org Cc: pablo.de.lara.guarch@intel.com, greg.b.tucker@intel.com, deepak.k.jain@intel.com, fiona.trahe@intel.com, Lee Daly Date: Wed, 9 May 2018 17:14:34 +0100 Message-Id: <1525882475-183214-10-git-send-email-lee.daly@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1525882475-183214-1-git-send-email-lee.daly@intel.com> References: <1525782775-138647-2-git-send-email-lee.daly@intel.com> <1525882475-183214-1-git-send-email-lee.daly@intel.com> Subject: [dpdk-dev] [PATCH v6 09/10] compress/isal: add ISA-L decomp functionality X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 09 May 2018 16:14:56 -0000 Adds decompression functionality, similar to compression, this sets internal ISA-L structures, provides input & output mbuf addresses, executes decompression, which ISA-L calls inflate and finally error checks. Signed-off-by: Lee Daly --- drivers/compress/isal/isal_compress_pmd.c | 52 +++++++++++++++++++++++ drivers/compress/isal/isal_compress_pmd_ops.c | 8 ++++ drivers/compress/isal/isal_compress_pmd_private.h | 2 + 3 files changed, 62 insertions(+) diff --git a/drivers/compress/isal/isal_compress_pmd.c b/drivers/compress/isal/isal_compress_pmd.c index dbdee39..9d1d413 100644 --- a/drivers/compress/isal/isal_compress_pmd.c +++ b/drivers/compress/isal/isal_compress_pmd.c @@ -266,6 +266,57 @@ process_isal_deflate(struct rte_comp_op *op, struct isal_comp_qp *qp, return ret; } +/* Stateless Decompression Function */ +static int +process_isal_inflate(struct rte_comp_op *op, struct isal_comp_qp *qp, + struct isal_priv_xform *priv_xform) +{ + int ret = 0; + + op->status = RTE_COMP_OP_STATUS_SUCCESS; + + /* Initialize decompression state */ + isal_inflate_init(qp->state); + + /* Point decompression state structure to input/output buffers */ + qp->state->avail_in = op->src.length; + qp->state->next_in = rte_pktmbuf_mtod(op->m_src, uint8_t *); + qp->state->avail_out = op->m_dst->data_len; + qp->state->next_out = rte_pktmbuf_mtod(op->m_dst, uint8_t *); + + if (unlikely(!qp->state->next_in || !qp->state->next_out)) { + ISAL_PMD_LOG(ERR, "Invalid source or destination buffers\n"); + op->status = RTE_COMP_OP_STATUS_INVALID_ARGS; + return -1; + } + + /* Execute decompression operation */ + ret = isal_inflate_stateless(qp->state); + + if (ret == ISAL_OUT_OVERFLOW) { + ISAL_PMD_LOG(ERR, "Output buffer not big enough\n"); + op->status = RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED; + return ret; + } + + /* Check that input buffer has been fully consumed */ + if (qp->state->avail_in != (uint32_t)0) { + ISAL_PMD_LOG(ERR, "Input buffer could not be read entirely\n"); + op->status = RTE_COMP_OP_STATUS_ERROR; + return -1; + } + + if (ret != ISAL_DECOMP_OK) { + op->status = RTE_COMP_OP_STATUS_ERROR; + return ret; + } + + op->consumed = op->src.length - qp->state->avail_in; + op->produced = qp->state->total_out; + +return ret; +} + /* Process compression/decompression operation */ static int process_op(struct isal_comp_qp *qp, struct rte_comp_op *op, @@ -276,6 +327,7 @@ process_op(struct isal_comp_qp *qp, struct rte_comp_op *op, process_isal_deflate(op, qp, priv_xform); break; case RTE_COMP_DECOMPRESS: + process_isal_inflate(op, qp, priv_xform); break; default: ISAL_PMD_LOG(ERR, "Operation Not Supported\n"); diff --git a/drivers/compress/isal/isal_compress_pmd_ops.c b/drivers/compress/isal/isal_compress_pmd_ops.c index 77d5d4b..970a041 100644 --- a/drivers/compress/isal/isal_compress_pmd_ops.c +++ b/drivers/compress/isal/isal_compress_pmd_ops.c @@ -162,6 +162,9 @@ isal_comp_pmd_qp_release(struct rte_compressdev *dev, uint16_t qp_id) if (qp->stream->level_buf != NULL) rte_free(qp->stream->level_buf); + if (qp->state != NULL) + rte_free(qp->state); + if (dev->data->queue_pairs[qp_id] != NULL) rte_free(dev->data->queue_pairs[qp_id]); @@ -240,6 +243,11 @@ isal_comp_pmd_qp_setup(struct rte_compressdev *dev, uint16_t qp_id, ISAL_DEF_LVL3_DEFAULT, RTE_CACHE_LINE_SIZE, socket_id); + /* Initialize memory for decompression state structure */ + qp->state = rte_zmalloc_socket("Isa-l decompression state", + sizeof(struct inflate_state), RTE_CACHE_LINE_SIZE, + socket_id); + qp->id = qp_id; dev->data->queue_pairs[qp_id] = qp; diff --git a/drivers/compress/isal/isal_compress_pmd_private.h b/drivers/compress/isal/isal_compress_pmd_private.h index 6ba34a6..46e9fcf 100644 --- a/drivers/compress/isal/isal_compress_pmd_private.h +++ b/drivers/compress/isal/isal_compress_pmd_private.h @@ -30,6 +30,8 @@ struct isal_comp_qp { struct rte_compressdev_stats qp_stats; /* Compression stream information*/ struct isal_zstream *stream; + /* Decompression state information*/ + struct inflate_state *state; /* Number of free elements on ring */ uint16_t num_free_elements; } __rte_cache_aligned; -- 2.7.4