]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
crypto: qat - limit heartbeat notifications
authorFurong Zhou <furong.zhou@intel.com>
Fri, 2 Feb 2024 10:53:23 +0000 (18:53 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 9 Feb 2024 04:57:18 +0000 (12:57 +0800)
When the driver detects an heartbeat failure, it starts the recovery
flow. Set a limit so that the number of events is limited in case the
heartbeat status is read too frequently.

Signed-off-by: Furong Zhou <furong.zhou@intel.com>
Reviewed-by: Ahsan Atta <ahsan.atta@intel.com>
Reviewed-by: Markas Rapoportas <markas.rapoportas@intel.com>
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Signed-off-by: Mun Chun Yep <mun.chun.yep@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/intel/qat/qat_common/adf_heartbeat.c
drivers/crypto/intel/qat/qat_common/adf_heartbeat.h

index fe8428d4ff392abbbe2477df173e4b03c84311b4..b19aa1ef8eeed9f55a89426cddebe165c4717cb5 100644 (file)
@@ -205,6 +205,19 @@ static int adf_hb_get_status(struct adf_accel_dev *accel_dev)
        return ret;
 }
 
+static void adf_heartbeat_reset(struct adf_accel_dev *accel_dev)
+{
+       u64 curr_time = adf_clock_get_current_time();
+       u64 time_since_reset = curr_time - accel_dev->heartbeat->last_hb_reset_time;
+
+       if (time_since_reset < ADF_CFG_HB_RESET_MS)
+               return;
+
+       accel_dev->heartbeat->last_hb_reset_time = curr_time;
+       if (adf_notify_fatal_error(accel_dev))
+               dev_err(&GET_DEV(accel_dev), "Failed to notify fatal error\n");
+}
+
 void adf_heartbeat_status(struct adf_accel_dev *accel_dev,
                          enum adf_device_heartbeat_status *hb_status)
 {
@@ -229,9 +242,7 @@ void adf_heartbeat_status(struct adf_accel_dev *accel_dev,
                        "Heartbeat ERROR: QAT is not responding.\n");
                *hb_status = HB_DEV_UNRESPONSIVE;
                hb->hb_failed_counter++;
-               if (adf_notify_fatal_error(accel_dev))
-                       dev_err(&GET_DEV(accel_dev),
-                               "Failed to notify fatal error\n");
+               adf_heartbeat_reset(accel_dev);
                return;
        }
 
index 24c3f4f24c8660df8543d3e281ba1b63b3867863..16fdfb48b196acd33f020f9cd580a5d026b5a2f7 100644 (file)
@@ -13,6 +13,8 @@ struct dentry;
 #define ADF_CFG_HB_TIMER_DEFAULT_MS 500
 #define ADF_CFG_HB_COUNT_THRESHOLD 3
 
+#define ADF_CFG_HB_RESET_MS 5000
+
 enum adf_device_heartbeat_status {
        HB_DEV_UNRESPONSIVE = 0,
        HB_DEV_ALIVE,
@@ -30,6 +32,7 @@ struct adf_heartbeat {
        unsigned int hb_failed_counter;
        unsigned int hb_timer;
        u64 last_hb_check_time;
+       u64 last_hb_reset_time;
        bool ctrs_cnt_checked;
        struct hb_dma_addr {
                dma_addr_t phy_addr;