]> granicus.if.org Git - zfs/commitdiff
QAT related bug fixes
authorChengfei ZHu <chengfeix.zhu@intel.com>
Thu, 12 Sep 2019 20:33:44 +0000 (04:33 +0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 12 Sep 2019 20:33:44 +0000 (13:33 -0700)
1. Fix issue:  Kernel BUG with QAT during decompression  #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 <tcaputi@datto.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Chengfei Zhu <chengfeix.zhu@intel.com>
Closes #9276
Closes #9303

include/sys/qat.h
module/os/linux/zfs/qat.c
module/os/linux/zfs/qat_compress.c
module/os/linux/zfs/qat_crypt.c

index fdd60813940248769f0b0fcfc0a6522d2af21156..9ae8eb1735723f7f8020efd29eb5e3b91ce75e1b 100644 (file)
@@ -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
index a6f024cb44d7c0d1b9dc75920f8bfb688b01d7c0..08613b3a2042683a48cf86cf37ba6d7d3ce60884 100644 (file)
@@ -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 },
index 4136b6555457bff8b594262b69b3d571a4989a7e..79457a1ed5989285869b9963672418e3fc1b9ef8 100644 (file)
@@ -27,7 +27,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
@@ -403,11 +403,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;
@@ -462,11 +458,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;
index 02e19d21da21ca20011f4908e4b97d5d45e039f8..4771b2f3bec572130aa5f77a5e43533787c4df4c 100644 (file)
@@ -35,7 +35,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
@@ -414,6 +414,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);
@@ -422,23 +425,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)
@@ -548,11 +549,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;