From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by dpdk.org (Postfix) with ESMTP id D9E3D7CE1 for ; Sat, 28 Apr 2018 01:39:33 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 27 Apr 2018 16:39:33 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.49,336,1520924400"; d="scan'208";a="45186665" Received: from silpixa00399501.ir.intel.com ([10.237.223.69]) by FMSMGA003.fm.intel.com with ESMTP; 27 Apr 2018 16:39:32 -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: Sat, 28 Apr 2018 00:38:31 +0100 Message-Id: <1524872313-196340-9-git-send-email-lee.daly@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1524872313-196340-1-git-send-email-lee.daly@intel.com> References: <1523972132-6894-12-git-send-email-lee.daly@intel.com> <1524872313-196340-1-git-send-email-lee.daly@intel.com> Subject: [dpdk-dev] [PATCH v4 08/10] compress/isal: add ISA-L compression 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: Fri, 27 Apr 2018 23:39:34 -0000 Adds compression functionality, this sets internal ISA-L structures, provides input & output mbuf addresses, executes compression, which ISA-L calls deflate, and finally error checks. Signed-off-by: Lee Daly --- drivers/compress/isal/isal_compress_pmd.c | 93 ++++++++++++++++++++++- drivers/compress/isal/isal_compress_pmd_ops.c | 28 +++++++ drivers/compress/isal/isal_compress_pmd_private.h | 2 + 3 files changed, 121 insertions(+), 2 deletions(-) diff --git a/drivers/compress/isal/isal_compress_pmd.c b/drivers/compress/isal/isal_compress_pmd.c index b13822a..e09fd3f 100644 --- a/drivers/compress/isal/isal_compress_pmd.c +++ b/drivers/compress/isal/isal_compress_pmd.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include "isal_compress_pmd_private.h" @@ -208,14 +209,102 @@ isal_comp_set_priv_xform_parameters(struct isal_priv_xform *priv_xform, return 0; } +/* Stateless Compression Function */ +static int +process_isal_deflate(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; + + /* Required due to init clearing level_buf */ + uint8_t *temp_level_buf = qp->stream->level_buf; + + /* Initialize compression stream */ + isal_deflate_stateless_init(qp->stream); + + qp->stream->level_buf = temp_level_buf; + + qp->stream->flush = NO_FLUSH; + + /* Set op checksum, none by default */ + qp->stream->gzip_flag = priv_xform->compress.chksum; + + /* set op level & intermediate level buffer */ + qp->stream->level = priv_xform->compress.level; + qp->stream->level_buf_size = priv_xform->level_buffer_size; + + /* Point compression stream structure to input/output buffers */ + qp->stream->avail_in = op->src.length; + qp->stream->next_in = rte_pktmbuf_mtod(op->m_src, uint8_t *); + qp->stream->avail_out = op->m_dst->data_len; + qp->stream->next_out = rte_pktmbuf_mtod(op->m_dst, uint8_t *); + qp->stream->end_of_stream = 1; /* All input consumed in one go */ + + if (unlikely(!qp->stream->next_in || !qp->stream->next_out)) { + ISAL_PMD_LOG(ERR, "Invalid source or destination buffers\n"); + op->status = RTE_COMP_OP_STATUS_INVALID_ARGS; + return -1; + } + + /* Set op huffman code */ + if (priv_xform->compress.deflate.huffman == RTE_COMP_HUFFMAN_FIXED) + isal_deflate_set_hufftables(qp->stream, NULL, + IGZIP_HUFFTABLE_STATIC); + else if (priv_xform->compress.deflate.huffman == + RTE_COMP_HUFFMAN_DEFAULT) + isal_deflate_set_hufftables(qp->stream, NULL, + IGZIP_HUFFTABLE_DEFAULT); + /* Dynamically change the huffman code to suit the input data */ + else if (priv_xform->compress.deflate.huffman == + RTE_COMP_HUFFMAN_DYNAMIC) { + struct isal_hufftables hufftable; + struct isal_huff_histogram histogram; + memset(&histogram, 0, sizeof(struct isal_huff_histogram)); + + isal_update_histogram(qp->stream->next_in, qp->stream->avail_in, + &histogram); + isal_create_hufftables(&hufftable, &histogram); + isal_deflate_set_hufftables(qp->stream, &hufftable, + IGZIP_HUFFTABLE_CUSTOM); + } + + /* Execute compression operation */ + ret = isal_deflate_stateless(qp->stream); + + /* Check that output buffer did not run out of space */ + if (ret == STATELESS_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->stream->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 != COMP_OK) { + op->status = RTE_COMP_OP_STATUS_ERROR; + return ret; + } + + op->consumed = op->src.length - qp->stream->avail_in; + op->produced = qp->stream->total_out; + + return ret; +} + /* Process compression/decompression operation */ static int -process_op(struct isal_comp_qp *qp __rte_unused, - struct rte_comp_op *op __rte_unused, +process_op(struct isal_comp_qp *qp, struct rte_comp_op *op, struct isal_priv_xform *priv_xform) { switch (priv_xform->type) { case RTE_COMP_COMPRESS: + process_isal_deflate(op, qp, priv_xform); break; case RTE_COMP_DECOMPRESS: break; diff --git a/drivers/compress/isal/isal_compress_pmd_ops.c b/drivers/compress/isal/isal_compress_pmd_ops.c index dcf79bf..a72a886 100644 --- a/drivers/compress/isal/isal_compress_pmd_ops.c +++ b/drivers/compress/isal/isal_compress_pmd_ops.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: BSD-3-Clause * Copyright(c) 2018 Intel Corporation */ +#include #include #include @@ -9,6 +10,17 @@ #include "isal_compress_pmd_private.h" static const struct rte_compressdev_capabilities isal_pmd_capabilities[] = { + { + .algo = RTE_COMP_ALGO_DEFLATE, + .comp_feature_flags = RTE_COMP_FF_ADLER32_CHECKSUM | + RTE_COMP_FF_CRC32_CHECKSUM | + RTE_COMP_FF_SHAREABLE_PRIV_XFORM, + .window_size = { + .min = 15, + .max = 15, + .increment = 0 + }, + }, RTE_COMP_END_OF_CAPABILITIES_LIST() }; @@ -146,6 +158,12 @@ isal_comp_pmd_qp_release(struct rte_compressdev *dev, uint16_t qp_id) if (qp == NULL) return -EINVAL; + if (qp->stream != NULL) + rte_free(qp->stream); + + if (qp->stream->level_buf != NULL) + rte_free(qp->stream->level_buf); + if (dev->data->queue_pairs[qp_id] != NULL) rte_free(dev->data->queue_pairs[qp_id]); @@ -214,6 +232,16 @@ isal_comp_pmd_qp_setup(struct rte_compressdev *dev, uint16_t qp_id, return (-ENOMEM); } + /* Initialize memory for compression stream structure */ + qp->stream = rte_zmalloc_socket("Isa-l compression stream ", + sizeof(struct isal_zstream), RTE_CACHE_LINE_SIZE, + socket_id); + + /* Initialize memory for compression level buffer */ + qp->stream->level_buf = rte_zmalloc_socket("Isa-l compression lev_buf", + ISAL_DEF_LVL3_DEFAULT, 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 7505c76..6ba34a6 100644 --- a/drivers/compress/isal/isal_compress_pmd_private.h +++ b/drivers/compress/isal/isal_compress_pmd_private.h @@ -28,6 +28,8 @@ struct isal_comp_qp { struct rte_ring *processed_pkts; /* Queue pair statistics */ struct rte_compressdev_stats qp_stats; + /* Compression stream information*/ + struct isal_zstream *stream; /* Number of free elements on ring */ uint16_t num_free_elements; } __rte_cache_aligned; -- 2.7.4