Commit fe566a6b authored by Furong Zhou's avatar Furong Zhou Committed by Aichun Shi
Browse files

crypto: qat - limit heartbeat notifications

mainline inclusion
from mainline-v6.9-rc1
commit 750fa7c20e60926431ec50d63899771ffcd9fd5c
category: feature
bugzilla: https://gitee.com/openeuler/intel-kernel/issues/I9A5BW
CVE: N/A
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=750fa7c20e60926431ec50d63899771ffcd9fd5c



-------------------------------------

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.

Intel-SIG: commit 750fa7c20e60 crypto: qat - limit heartbeat notifications
Backport to support QAT in-tree driver

Signed-off-by: default avatarFurong Zhou <furong.zhou@intel.com>
Reviewed-by: default avatarAhsan Atta <ahsan.atta@intel.com>
Reviewed-by: default avatarMarkas Rapoportas <markas.rapoportas@intel.com>
Reviewed-by: default avatarGiovanni Cabiddu <giovanni.cabiddu@intel.com>
Signed-off-by: default avatarMun Chun Yep <mun.chun.yep@intel.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
[ Aichun Shi: amend commit log ]
Signed-off-by: default avatarAichun Shi <aichun.shi@intel.com>
parent 80c21462
Loading
Loading
Loading
Loading
+14 −3
Original line number Diff line number Diff line
@@ -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;
	}

+3 −0
Original line number Diff line number Diff line
@@ -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;