Skip to content

Commit

Permalink
QAT related bug fixes
Browse files Browse the repository at this point in the history
1. Fix issue:  Kernel BUG with QAT during decompression  openzfs#9276.
   Now it is uninterruptible for a specific given QAT request,
   but Ctrl-C interrupt still works in user-space process.

2. Copy the digest result to the buffer only when doing encryption,
   and vise-versa for decryption.

Reviewed-by: Tom Caputi <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Chengfei Zhu <[email protected]>
Closes openzfs#9276 
Closes openzfs#9303
  • Loading branch information
cfzhux authored and tonyhutter committed Sep 17, 2019
1 parent aa37a28 commit 628654a
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 32 deletions.
2 changes: 1 addition & 1 deletion module/zfs/qat.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

#if defined(_KERNEL) && defined(HAVE_QAT)
#include <sys/zfs_context.h>
#include "qat.h"
#include <sys/qat.h>

qat_stats_t qat_stats = {
{ "comp_requests", KSTAT_DATA_UINT64 },
Expand Down
5 changes: 0 additions & 5 deletions module/zfs/qat.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,6 @@ typedef enum qat_encrypt_dir {
#include "dc/cpa_dc.h"
#include "lac/cpa_cy_sym.h"

/*
* Timeout - no response from hardware after 0.5 seconds
*/
#define QAT_TIMEOUT_MS 500

/*
* The minimal and maximal buffer size which are not restricted
* in the QAT hardware, but with the input buffer size between 4KB
Expand Down
14 changes: 3 additions & 11 deletions module/zfs/qat_compress.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
#include <sys/zfs_context.h>
#include <sys/byteorder.h>
#include <sys/zio.h>
#include "qat.h"
#include <sys/qat.h>

/*
* Max instances in a QAT device, each instance is a channel to submit
Expand Down Expand Up @@ -404,11 +404,7 @@ qat_compress_impl(qat_compress_dir_t dir, char *src, int src_len,
}

/* we now wait until the completion of the operation. */
if (!wait_for_completion_interruptible_timeout(&complete,
QAT_TIMEOUT_MS)) {
status = CPA_STATUS_FAIL;
goto fail;
}
wait_for_completion(&complete);

if (dc_results.status != CPA_STATUS_SUCCESS) {
status = CPA_STATUS_FAIL;
Expand Down Expand Up @@ -463,11 +459,7 @@ qat_compress_impl(qat_compress_dir_t dir, char *src, int src_len,
}

/* we now wait until the completion of the operation. */
if (!wait_for_completion_interruptible_timeout(&complete,
QAT_TIMEOUT_MS)) {
status = CPA_STATUS_FAIL;
goto fail;
}
wait_for_completion(&complete);

if (dc_results.status != CPA_STATUS_SUCCESS) {
status = CPA_STATUS_FAIL;
Expand Down
29 changes: 14 additions & 15 deletions module/zfs/qat_crypt.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
#include <sys/zio_crypt.h>
#include "lac/cpa_cy_im.h"
#include "lac/cpa_cy_common.h"
#include "qat.h"
#include <sys/qat.h>

/*
* Max instances in a QAT device, each instance is a channel to submit
Expand Down Expand Up @@ -415,6 +415,9 @@ qat_crypt(qat_encrypt_dir_t dir, uint8_t *src_buf, uint8_t *dst_buf,
op_data.messageLenToCipherInBytes = enc_len;
op_data.ivLenInBytes = ZIO_DATA_IV_LEN;
bcopy(iv_buf, op_data.pIv, ZIO_DATA_IV_LEN);
/* if dir is QAT_DECRYPT, copy digest_buf to pDigestResult */
if (dir == QAT_DECRYPT)
bcopy(digest_buf, op_data.pDigestResult, ZIO_DATA_MAC_LEN);

cb.verify_result = CPA_FALSE;
init_completion(&cb.complete);
Expand All @@ -423,23 +426,21 @@ qat_crypt(qat_encrypt_dir_t dir, uint8_t *src_buf, uint8_t *dst_buf,
if (status != CPA_STATUS_SUCCESS)
goto fail;

if (!wait_for_completion_interruptible_timeout(&cb.complete,
QAT_TIMEOUT_MS)) {
status = CPA_STATUS_FAIL;
goto fail;
}
/* we now wait until the completion of the operation. */
wait_for_completion(&cb.complete);

if (cb.verify_result == CPA_FALSE) {
status = CPA_STATUS_FAIL;
goto fail;
}

/* save digest result to digest_buf */
bcopy(op_data.pDigestResult, digest_buf, ZIO_DATA_MAC_LEN);
if (dir == QAT_ENCRYPT)
if (dir == QAT_ENCRYPT) {
/* if dir is QAT_ENCRYPT, save pDigestResult to digest_buf */
bcopy(op_data.pDigestResult, digest_buf, ZIO_DATA_MAC_LEN);
QAT_STAT_INCR(encrypt_total_out_bytes, enc_len);
else
} else {
QAT_STAT_INCR(decrypt_total_out_bytes, enc_len);
}

fail:
if (status != CPA_STATUS_SUCCESS)
Expand Down Expand Up @@ -549,11 +550,9 @@ qat_checksum(uint64_t cksum, uint8_t *buf, uint64_t size, zio_cksum_t *zcp)
if (status != CPA_STATUS_SUCCESS)
goto fail;

if (!wait_for_completion_interruptible_timeout(&cb.complete,
QAT_TIMEOUT_MS)) {
status = CPA_STATUS_FAIL;
goto fail;
}
/* we now wait until the completion of the operation. */
wait_for_completion(&cb.complete);

if (cb.verify_result == CPA_FALSE) {
status = CPA_STATUS_FAIL;
goto fail;
Expand Down

0 comments on commit 628654a

Please sign in to comment.