#include <rte_bus_vdev.h>
#include <rte_common.h>
+#include <rte_cpuflags.h>
#include <rte_malloc.h>
#include <rte_mbuf.h>
#include <rte_compressdev_pmd.h>
#define RTE_COMP_ISAL_LEVEL_ONE 1
#define RTE_COMP_ISAL_LEVEL_TWO 2
#define RTE_COMP_ISAL_LEVEL_THREE 3 /* Optimised for AVX512 & AVX2 only */
+#define CHKSUM_SZ_CRC 8
+#define CHKSUM_SZ_ADLER 4
-int isal_logtype_driver;
+#define STRINGIFY(s) #s
+#define ISAL_TOSTRING(maj, min, patch) \
+ STRINGIFY(maj)"."STRINGIFY(min)"."STRINGIFY(patch)
+#define ISAL_VERSION_STRING \
+ ISAL_TOSTRING(ISAL_MAJOR_VERSION, ISAL_MINOR_VERSION, ISAL_PATCH_VERSION)
/* Verify and set private xform parameters */
int
}
priv_xform->compress.algo = RTE_COMP_ALGO_DEFLATE;
- /* Set private xform checksum - raw deflate by default */
- if (xform->compress.chksum != RTE_COMP_CHECKSUM_NONE) {
- ISAL_PMD_LOG(ERR, "Checksum not supported\n");
- return -ENOTSUP;
- }
-
/* Set private xform window size, 32K supported */
if (xform->compress.window_size == RTE_COMP_ISAL_WINDOW_SIZE)
priv_xform->compress.window_size =
return -ENOTSUP;
}
+ /* Set private xform checksum */
+ switch (xform->compress.chksum) {
+ /* Raw deflate by default */
+ case(RTE_COMP_CHECKSUM_NONE):
+ priv_xform->compress.chksum = IGZIP_DEFLATE;
+ break;
+ case(RTE_COMP_CHECKSUM_CRC32):
+ priv_xform->compress.chksum = IGZIP_GZIP_NO_HDR;
+ break;
+ case(RTE_COMP_CHECKSUM_ADLER32):
+ priv_xform->compress.chksum = IGZIP_ZLIB_NO_HDR;
+ break;
+ case(RTE_COMP_CHECKSUM_CRC32_ADLER32):
+ ISAL_PMD_LOG(ERR, "Combined CRC and ADLER checksum not"
+ " supported\n");
+ return -ENOTSUP;
+ default:
+ ISAL_PMD_LOG(ERR, "Checksum type not supported\n");
+ priv_xform->compress.chksum = IGZIP_DEFLATE;
+ break;
+ }
+
/* Set private xform level.
* Checking compliance with compressdev API, -1 <= level => 9
*/
break;
/* Level 3 or higher requested */
default:
+#ifdef RTE_ARCH_X86
/* Check for AVX512, to use ISA-L level 3 */
if (rte_cpu_get_flag_enabled(
RTE_CPUFLAG_AVX512F)) {
RTE_COMP_ISAL_LEVEL_THREE;
priv_xform->level_buffer_size =
ISAL_DEF_LVL3_DEFAULT;
- } else {
+ } else
+#endif
+ {
ISAL_PMD_LOG(DEBUG, "Requested ISA-L level"
" 3 or above; Level 3 optimized"
" for AVX512 & AVX2 only."
}
priv_xform->decompress.algo = RTE_COMP_ALGO_DEFLATE;
- /* Set private xform checksum - raw deflate by default */
- if (xform->compress.chksum != RTE_COMP_CHECKSUM_NONE) {
- ISAL_PMD_LOG(ERR, "Checksum not supported\n");
+ /* Set private xform checksum */
+ switch (xform->decompress.chksum) {
+ /* Raw deflate by default */
+ case(RTE_COMP_CHECKSUM_NONE):
+ priv_xform->decompress.chksum = ISAL_DEFLATE;
+ break;
+ case(RTE_COMP_CHECKSUM_CRC32):
+ priv_xform->decompress.chksum = ISAL_GZIP_NO_HDR;
+ break;
+ case(RTE_COMP_CHECKSUM_ADLER32):
+ priv_xform->decompress.chksum = ISAL_ZLIB_NO_HDR;
+ break;
+ case(RTE_COMP_CHECKSUM_CRC32_ADLER32):
+ ISAL_PMD_LOG(ERR, "Combined CRC and ADLER checksum not"
+ " supported\n");
return -ENOTSUP;
+ default:
+ ISAL_PMD_LOG(ERR, "Checksum type not supported\n");
+ priv_xform->decompress.chksum = ISAL_DEFLATE;
+ break;
}
/* Set private xform window size, 32K supported */
ret = isal_inflate(qp->state);
- if (ret != ISAL_DECOMP_OK) {
- ISAL_PMD_LOG(ERR, "Decompression operation failed\n");
- op->status = RTE_COMP_OP_STATUS_ERROR;
- return ret;
- }
-
/* Check for first segment, offset needs to be accounted for */
if (remaining_data == op->src.length) {
consumed_data = src->data_len - src_remaining_offset;
}
}
+ if (ret == ISAL_OUT_OVERFLOW) {
+ ISAL_PMD_LOG(ERR, "Decompression operation ran "
+ "out of space, but can be recovered.\n%d bytes "
+ "consumed\t%d bytes produced\n",
+ consumed_data, qp->state->total_out);
+ op->status =
+ RTE_COMP_OP_STATUS_OUT_OF_SPACE_RECOVERABLE;
+ return ret;
+ } else if (ret < 0) {
+ ISAL_PMD_LOG(ERR, "Decompression operation failed\n");
+ op->status = RTE_COMP_OP_STATUS_ERROR;
+ return ret;
+ }
+
if (qp->state->avail_out == 0 &&
qp->state->block_state != ISAL_BLOCK_FINISH) {
if (dst->next != NULL) {
uint8_t *temp_level_buf = qp->stream->level_buf;
/* Initialize compression stream */
- isal_deflate_stateless_init(qp->stream);
+ isal_deflate_init(qp->stream);
qp->stream->level_buf = temp_level_buf;
+ /* Set Checksum flag */
+ qp->stream->gzip_flag = priv_xform->compress.chksum;
+
/* Stateless operation, input will be consumed in one go */
qp->stream->flush = NO_FLUSH;
return ret;
}
}
+
op->consumed = qp->stream->total_in;
- op->produced = qp->stream->total_out;
- isal_deflate_reset(qp->stream);
+ if (qp->stream->gzip_flag == IGZIP_DEFLATE) {
+ op->produced = qp->stream->total_out;
+ } else if (qp->stream->gzip_flag == IGZIP_ZLIB_NO_HDR) {
+ op->produced = qp->stream->total_out - CHKSUM_SZ_ADLER;
+ op->output_chksum = qp->stream->internal_state.crc + 1;
+ } else {
+ op->produced = qp->stream->total_out - CHKSUM_SZ_CRC;
+ op->output_chksum = qp->stream->internal_state.crc;
+ }
return ret;
}
/* Stateless Decompression Function */
static int
-process_isal_inflate(struct rte_comp_op *op, struct isal_comp_qp *qp)
+process_isal_inflate(struct rte_comp_op *op, struct isal_comp_qp *qp,
+ struct isal_priv_xform *priv_xform)
{
int ret = 0;
/* Initialize decompression state */
isal_inflate_init(qp->state);
+ /* Set Checksum flag */
+ qp->state->crc_flag = priv_xform->decompress.chksum;
+
if (op->m_src->pkt_len < (op->src.length + op->src.offset)) {
ISAL_PMD_LOG(ERR, "Input mbuf(s) not big enough.\n");
op->status = RTE_COMP_OP_STATUS_INVALID_ARGS;
return -1;
}
- if (ret != ISAL_DECOMP_OK) {
+ if (ret != ISAL_DECOMP_OK && ret != ISAL_END_INPUT) {
+ ISAL_PMD_LOG(ERR, "Decompression operation failed\n");
op->status = RTE_COMP_OP_STATUS_ERROR;
return ret;
}
op->consumed = op->src.length - qp->state->avail_in;
}
- op->produced = qp->state->total_out;
- isal_inflate_reset(qp->state);
+ op->produced = qp->state->total_out;
+ op->output_chksum = qp->state->crc;
return ret;
}
process_isal_deflate(op, qp, priv_xform);
break;
case RTE_COMP_DECOMPRESS:
- process_isal_inflate(op, qp);
+ process_isal_inflate(op, qp, priv_xform);
break;
default:
ISAL_PMD_LOG(ERR, "Operation Not Supported\n");
dev->dequeue_burst = isal_comp_pmd_dequeue_burst;
dev->enqueue_burst = isal_comp_pmd_enqueue_burst;
+ ISAL_PMD_LOG(INFO, "\nISA-L library version used: "ISAL_VERSION_STRING);
+
return 0;
}
RTE_PMD_REGISTER_VDEV(COMPDEV_NAME_ISAL_PMD, compdev_isal_pmd_drv);
RTE_PMD_REGISTER_PARAM_STRING(COMPDEV_NAME_ISAL_PMD,
"socket_id=<int>");
-
-RTE_INIT(isal_init_log)
-{
- isal_logtype_driver = rte_log_register("pmd.compress.isal");
- if (isal_logtype_driver >= 0)
- rte_log_set_level(isal_logtype_driver, RTE_LOG_INFO);
-}
+RTE_LOG_REGISTER_DEFAULT(isal_logtype_driver, INFO);