diff options
author | Tom Caputi <[email protected]> | 2018-03-29 20:40:34 -0400 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2018-03-29 17:40:34 -0700 |
commit | 32dce2da0c0d30321ccbddcfcb3f3238cd96f744 (patch) | |
tree | b79aa74ec214fea9fa0fb0d66e89a3b8584db6b5 /module/zfs/qat.h | |
parent | 13a2ff2727dd5fb46b08570279689373a7d5b26a (diff) |
Resolve QAT issues with incompressible data
Currently, when ZFS wants to accelerate compression with QAT, it
passes a destination buffer of the same size as the source buffer.
Unfortunately, if the data is incompressible, QAT can actually
"compress" the data to be larger than the source buffer. When this
happens, the QAT driver will return a FAILED error code and print
warnings to dmesg. This patch fixes these issues by providing the
QAT driver with an additional buffer to work with so that even
completely incompressible source data will not cause an overflow.
This patch also resolves an error handling issue where
incompressible data attempts compression twice: once by QAT and
once in software. To fix this issue, a new (and fake) error code
CPA_STATUS_INOMPRESSIBLE has been added so that the calling code
can correctly account for the difference between a hardware
failure and data that simply cannot be compressed.
Reviewed-by: Brian Behlendorf <[email protected]>
Reviewed-by: Weigang Li <[email protected]>
Signed-off-by: Tom Caputi <[email protected]>
Closes #7338
Diffstat (limited to 'module/zfs/qat.h')
-rw-r--r-- | module/zfs/qat.h | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/module/zfs/qat.h b/module/zfs/qat.h index dc8825de2..b2cd5a9c1 100644 --- a/module/zfs/qat.h +++ b/module/zfs/qat.h @@ -172,6 +172,9 @@ extern void qat_crypt_fini(void); extern int qat_init(void); extern void qat_fini(void); +/* fake CpaStatus used to indicate data was not compressible */ +#define CPA_STATUS_INCOMPRESSIBLE (-127) + extern boolean_t qat_dc_use_accel(size_t s_len); extern boolean_t qat_crypt_use_accel(size_t s_len); extern boolean_t qat_checksum_use_accel(size_t s_len); @@ -184,6 +187,7 @@ extern int qat_checksum(uint64_t cksum, uint8_t *buf, uint64_t size, zio_cksum_t *zcp); #else #define CPA_STATUS_SUCCESS 0 +#define CPA_STATUS_INCOMPRESSIBLE (-127) #define qat_init() #define qat_fini() #define qat_dc_use_accel(s_len) 0 |