From: Tomasz Jozwiak Date: Fri, 15 Feb 2019 09:44:32 +0000 (+0100) Subject: compress/qat: add fallback to fixed compression X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=a720e6740afcd6d21955d188c6e6a7136fcc7d6c;p=dpdk.git compress/qat: add fallback to fixed compression This patch adds fallback to fixed compression feature during dynamic compression, when the input data size is greater than IM buffer size / 1.1. This feature doesn't stop compression proccess when IM buffer can be too small to handle produced data. Signed-off-by: Tomasz Jozwiak Acked-by: Fiona Trahe --- diff --git a/doc/guides/cryptodevs/qat.rst b/doc/guides/cryptodevs/qat.rst index b7eace1b3f..beb6760161 100644 --- a/doc/guides/cryptodevs/qat.rst +++ b/doc/guides/cryptodevs/qat.rst @@ -188,11 +188,11 @@ allocated while for GEN1 devices, 12 buffers are allocated, plus 1472 bytes over If the compressed output of a Deflate operation using Dynamic Huffman Encoding is too big to fit in an intermediate buffer, then the - operation will return RTE_COMP_OP_STATUS_ERROR and an error will be - displayed. Options for the application in this case - are to split the input data into smaller chunks and resubmit - in multiple operations or to configure QAT with - larger intermediate buffers. + operation will fall back to fixed compression rather than failing the operation. + To avoid this less performant case, applications should configure + the intermediate buffer size to be larger than the expected input data size + (compressed output size is usually unknown, so the only option is to make + larger than the input size). Device and driver naming diff --git a/drivers/compress/qat/qat_comp.c b/drivers/compress/qat/qat_comp.c index 32ca753b78..b9367d3773 100644 --- a/drivers/compress/qat/qat_comp.c +++ b/drivers/compress/qat/qat_comp.c @@ -43,6 +43,30 @@ qat_comp_build_request(void *in_op, uint8_t *out_msg, rte_mov128(out_msg, tmpl); comp_req->comn_mid.opaque_data = (uint64_t)(uintptr_t)op; + if (likely(qat_xform->qat_comp_request_type == + QAT_COMP_REQUEST_DYNAMIC_COMP_STATELESS)) { + if (unlikely(op->src.length > QAT_FALLBACK_THLD)) { + + /* fallback to fixed compression */ + comp_req->comn_hdr.service_cmd_id = + ICP_QAT_FW_COMP_CMD_STATIC; + + ICP_QAT_FW_COMN_NEXT_ID_SET(&comp_req->comp_cd_ctrl, + ICP_QAT_FW_SLICE_DRAM_WR); + + ICP_QAT_FW_COMN_NEXT_ID_SET(&comp_req->u2.xlt_cd_ctrl, + ICP_QAT_FW_SLICE_NULL); + ICP_QAT_FW_COMN_CURR_ID_SET(&comp_req->u2.xlt_cd_ctrl, + ICP_QAT_FW_SLICE_NULL); + + QAT_DP_LOG(DEBUG, "QAT PMD: fallback to fixed " + "compression! IM buffer size can be too low " + "for produced data.\n Please use input " + "buffer length lower than %d bytes", + QAT_FALLBACK_THLD); + } + } + /* common for sgl and flat buffers */ comp_req->comp_pars.comp_len = op->src.length; comp_req->comp_pars.out_buffer_sz = rte_pktmbuf_pkt_len(op->m_dst) - diff --git a/drivers/compress/qat/qat_comp.h b/drivers/compress/qat/qat_comp.h index 19f48df590..12b37b1055 100644 --- a/drivers/compress/qat/qat_comp.h +++ b/drivers/compress/qat/qat_comp.h @@ -21,6 +21,9 @@ #define ERR_CODE_QAT_COMP_WRONG_FW -99 +/* fallback to fixed compression threshold */ +#define QAT_FALLBACK_THLD ((uint32_t)(RTE_PMD_QAT_COMP_IM_BUFFER_SIZE / 1.1)) + enum qat_comp_request_type { QAT_COMP_REQUEST_FIXED_COMP_STATELESS, QAT_COMP_REQUEST_DYNAMIC_COMP_STATELESS,