Commit bdda4a08 authored by Yihang Li's avatar Yihang Li Committed by JiangShui
Browse files

scsi: hisi_sas: Directly call register snapshot instead of using workqueue

mainline inclusion
from mainline-v6.7-rc1
commit 2ff07b5c6fe9173e7a7de3b23f300d71ad4d8fde
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I8IL6H
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=2ff07b5c6fe9173e7a7de3b23f300d71ad4d8fde



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

Currently, register information dump is performed via workqueue, regardless
of the trigger mode (automatic or manual). There is a delay in dumping
register through workqueue, the exact register information at trigger time
cannot be obtained.

Call register snapshot directly instead of through a workqueue.

Signed-off-by: default avatarYihang Li <liyihang9@huawei.com>
Signed-off-by: default avatarXiang Chen <chenxiang66@hisilicon.com>
Link: https://lore.kernel.org/r/1694571327-78697-3-git-send-email-chenxiang66@hisilicon.com


Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: default avatarxiabing <xiabing12@h-partners.com>
parent 81955cc8
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -459,7 +459,6 @@ struct hisi_hba {
	const struct hisi_sas_hw *hw;	/* Low level hw interface */
	unsigned long sata_dev_bitmap[BITS_TO_LONGS(HISI_SAS_MAX_DEVICES)];
	struct work_struct rst_work;
	struct work_struct debugfs_work;
	u32 phy_state;
	u32 intr_coal_ticks;	/* Time of interrupt coalesce in us */
	u32 intr_coal_count;	/* Interrupt count to coalesce */
+5 −2
Original line number Diff line number Diff line
@@ -2215,8 +2215,11 @@ _hisi_sas_internal_task_abort(struct hisi_hba *hisi_hba,

	/* Internal abort timed out */
	if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) {
		if (hisi_sas_debugfs_enable && hisi_hba->debugfs_itct[0].itct)
			queue_work(hisi_hba->wq, &hisi_hba->debugfs_work);
		if (hisi_sas_debugfs_enable && hisi_hba->debugfs_itct[0].itct) {
			down(&hisi_hba->sem);
			hisi_hba->hw->debugfs_snapshot_regs(hisi_hba);
			up(&hisi_hba->sem);
		}

		if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) {
			struct hisi_sas_slot *slot = task->lldd_task;
+3 −11
Original line number Diff line number Diff line
@@ -550,7 +550,6 @@ static int prot_mask;
module_param(prot_mask, int, 0444);
MODULE_PARM_DESC(prot_mask, " host protection capabilities mask, def=0x0 ");

static void debugfs_work_handler_v3_hw(struct work_struct *work);
static void debugfs_snapshot_regs_v3_hw(struct hisi_hba *hisi_hba);

static u32 hisi_sas_read32(struct hisi_hba *hisi_hba, u32 off)
@@ -3336,7 +3335,6 @@ hisi_sas_shost_alloc_pci(struct pci_dev *pdev)
	hisi_hba = shost_priv(shost);

	INIT_WORK(&hisi_hba->rst_work, hisi_sas_rst_work_handler);
	INIT_WORK(&hisi_hba->debugfs_work, debugfs_work_handler_v3_hw);
	hisi_hba->hw = &hisi_sas_v3_hw;
	hisi_hba->pci_dev = pdev;
	hisi_hba->dev = dev;
@@ -3851,7 +3849,9 @@ static ssize_t debugfs_trigger_dump_v3_hw_write(struct file *file,
	if (buf[0] != '1')
		return -EFAULT;

	queue_work(hisi_hba->wq, &hisi_hba->debugfs_work);
	down(&hisi_hba->sem);
	debugfs_snapshot_regs_v3_hw(hisi_hba);
	up(&hisi_hba->sem);

	return count;
}
@@ -4602,14 +4602,6 @@ static void debugfs_fifo_init_v3_hw(struct hisi_hba *hisi_hba)
	}
}

static void debugfs_work_handler_v3_hw(struct work_struct *work)
{
	struct hisi_hba *hisi_hba =
		container_of(work, struct hisi_hba, debugfs_work);

	debugfs_snapshot_regs_v3_hw(hisi_hba);
}

static void debugfs_release_v3_hw(struct hisi_hba *hisi_hba, int dump_index)
{
	struct device *dev = hisi_hba->dev;