258 lines
7.7 KiB
Diff
258 lines
7.7 KiB
Diff
From b05fdcf79d18f6a29e00ae9ec18e6067d952aaab Mon Sep 17 00:00:00 2001
|
|
From: Luo Jiaxing <luojiaxing@huawei.com>
|
|
Date: Fri, 6 Sep 2019 20:55:35 +0800
|
|
Subject: [PATCH 021/108] scsi: hisi_sas: Add hisi_sas_debugfs_alloc() to
|
|
centralise allocation
|
|
|
|
mainline inclusion
|
|
from mainline-v5.4-rc1
|
|
commit 7ec7082c57ecdd8d37040d31203951f7e2e8e218
|
|
category: feature
|
|
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8F808
|
|
|
|
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=7ec7082c57ecdd8d37040d31203951f7e2e8e218
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
We extract the code of memory allocate and construct an new function for
|
|
it. We think it's convenient for subsequent optimization.
|
|
|
|
Link: https://lore.kernel.org/r/1567774537-20003-12-git-send-email-john.garry@huawei.com
|
|
Signed-off-by: Luo Jiaxing <luojiaxing@huawei.com>
|
|
Signed-off-by: John Garry <john.garry@huawei.com>
|
|
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
|
|
Signed-off-by: YunYi Yang <yangyunyi2@huawei.com>
|
|
|
|
Conflicts:
|
|
drivers/scsi/hisi_sas/hisi_sas_main.c
|
|
---
|
|
drivers/scsi/hisi_sas/hisi_sas_main.c | 117 +++++++++++++++-----------
|
|
1 file changed, 66 insertions(+), 51 deletions(-)
|
|
|
|
diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
|
|
index 7df98ca85e86..6e49a91aa492 100644
|
|
--- a/drivers/scsi/hisi_sas/hisi_sas_main.c
|
|
+++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
|
|
@@ -3783,60 +3783,77 @@ void hisi_sas_debugfs_work_handler(struct work_struct *work)
|
|
}
|
|
EXPORT_SYMBOL_GPL(hisi_sas_debugfs_work_handler);
|
|
|
|
-void hisi_sas_debugfs_init(struct hisi_hba *hisi_hba)
|
|
+void hisi_sas_debugfs_release(struct hisi_hba *hisi_hba)
|
|
+{
|
|
+ struct device *dev = hisi_hba->dev;
|
|
+ int i;
|
|
+
|
|
+ devm_kfree(dev, hisi_hba->debugfs_iost_cache);
|
|
+ devm_kfree(dev, hisi_hba->debugfs_itct_cache);
|
|
+ devm_kfree(dev, hisi_hba->debugfs_iost);
|
|
+
|
|
+ for (i = 0; i < hisi_hba->queue_count; i++)
|
|
+ devm_kfree(dev, hisi_hba->debugfs_cmd_hdr[i]);
|
|
+
|
|
+ for (i = 0; i < hisi_hba->queue_count; i++)
|
|
+ devm_kfree(dev, hisi_hba->debugfs_complete_hdr[i]);
|
|
+
|
|
+ for (i = 0; i < DEBUGFS_REGS_NUM; i++)
|
|
+ devm_kfree(dev, hisi_hba->debugfs_regs[i]);
|
|
+
|
|
+ for (i = 0; i < hisi_hba->n_phy; i++)
|
|
+ devm_kfree(dev, hisi_hba->debugfs_port_reg[i]);
|
|
+}
|
|
+
|
|
+int hisi_sas_debugfs_alloc(struct hisi_hba *hisi_hba)
|
|
{
|
|
- int max_command_entries = HISI_SAS_MAX_COMMANDS;
|
|
const struct hisi_sas_hw *hw = hisi_hba->hw;
|
|
struct device *dev = hisi_hba->dev;
|
|
- int p, i, c, d;
|
|
+ int p, c, d;
|
|
size_t sz;
|
|
|
|
- hisi_hba->debugfs_dir = debugfs_create_dir(dev_name(dev),
|
|
- hisi_sas_debugfs_dir);
|
|
+ hisi_hba->debugfs_dump_dentry =
|
|
+ debugfs_create_dir("dump", hisi_hba->debugfs_dir);
|
|
|
|
- debugfs_create_file("trigger_dump", 0600,
|
|
- hisi_hba->debugfs_dir,
|
|
- hisi_hba,
|
|
- &hisi_sas_debugfs_trigger_dump_fops);
|
|
/* create bist structures */
|
|
hisi_hba->debugfs_bist_dentry = debugfs_create_dir("bist",
|
|
hisi_hba->debugfs_dir);
|
|
if (!hisi_hba->debugfs_bist_dentry)
|
|
- goto fail_global;
|
|
+ goto fail;
|
|
|
|
if (!debugfs_create_file("link_rate", 0644,
|
|
hisi_hba->debugfs_bist_dentry, hisi_hba,
|
|
&hisi_sas_debugfs_bist_linkrate_ops))
|
|
- goto fail_global;
|
|
+ goto fail;
|
|
|
|
if (!debugfs_create_file("code_mode", 0644,
|
|
hisi_hba->debugfs_bist_dentry, hisi_hba,
|
|
&hisi_sas_debugfs_bist_code_mode_ops))
|
|
- goto fail_global;
|
|
+ goto fail;
|
|
|
|
if (!debugfs_create_file("phy_id", 0644, hisi_hba->debugfs_bist_dentry,
|
|
hisi_hba, &hisi_sas_debugfs_bist_phy_ops))
|
|
- goto fail_global;
|
|
+ goto fail;
|
|
|
|
if (!debugfs_create_u32("cnt", 0644, hisi_hba->debugfs_bist_dentry,
|
|
&hisi_hba->bist_loopback_cnt))
|
|
- goto fail_global;
|
|
+ goto fail;
|
|
|
|
if (!debugfs_create_file("loopback_mode", 0400,
|
|
hisi_hba->debugfs_bist_dentry,
|
|
hisi_hba, &hisi_sas_debugfs_bist_mode_ops))
|
|
- goto fail_global;
|
|
+ goto fail;
|
|
|
|
if (!debugfs_create_file("enable", 0644, hisi_hba->debugfs_bist_dentry,
|
|
hisi_hba, &hisi_sas_debugfs_bist_enable_ops))
|
|
- goto fail_global;
|
|
+ goto fail;
|
|
|
|
sz = hw->debugfs_reg_array[DEBUGFS_GLOBAL]->count * 4;
|
|
hisi_hba->debugfs_regs[DEBUGFS_GLOBAL] =
|
|
devm_kmalloc(dev, sz, GFP_KERNEL);
|
|
|
|
if (!hisi_hba->debugfs_regs[DEBUGFS_GLOBAL])
|
|
- goto fail_global;
|
|
+ goto fail;
|
|
|
|
sz = hw->debugfs_reg_port->count * 4;
|
|
for (p = 0; p < hisi_hba->n_phy; p++) {
|
|
@@ -3844,7 +3861,7 @@ void hisi_sas_debugfs_init(struct hisi_hba *hisi_hba)
|
|
devm_kmalloc(dev, sz, GFP_KERNEL);
|
|
|
|
if (!hisi_hba->debugfs_port_reg[p])
|
|
- goto fail_port;
|
|
+ goto fail;
|
|
}
|
|
|
|
sz = hw->debugfs_reg_array[DEBUGFS_AXI]->count * 4;
|
|
@@ -3852,14 +3869,14 @@ void hisi_sas_debugfs_init(struct hisi_hba *hisi_hba)
|
|
devm_kmalloc(dev, sz, GFP_KERNEL);
|
|
|
|
if (!hisi_hba->debugfs_regs[DEBUGFS_AXI])
|
|
- goto fail_axi;
|
|
+ goto fail;
|
|
|
|
sz = hw->debugfs_reg_array[DEBUGFS_RAS]->count * 4;
|
|
hisi_hba->debugfs_regs[DEBUGFS_RAS] =
|
|
devm_kmalloc(dev, sz, GFP_KERNEL);
|
|
|
|
if (!hisi_hba->debugfs_regs[DEBUGFS_RAS])
|
|
- goto fail_ras;
|
|
+ goto fail;
|
|
|
|
sz = hw->complete_hdr_size * HISI_SAS_QUEUE_SLOTS;
|
|
for (c = 0; c < hisi_hba->queue_count; c++) {
|
|
@@ -3867,7 +3884,7 @@ void hisi_sas_debugfs_init(struct hisi_hba *hisi_hba)
|
|
devm_kmalloc(dev, sz, GFP_KERNEL);
|
|
|
|
if (!hisi_hba->debugfs_complete_hdr[c])
|
|
- goto fail_cq;
|
|
+ goto fail;
|
|
}
|
|
|
|
sz = sizeof(struct hisi_sas_cmd_hdr) * HISI_SAS_QUEUE_SLOTS;
|
|
@@ -3876,60 +3893,58 @@ void hisi_sas_debugfs_init(struct hisi_hba *hisi_hba)
|
|
devm_kmalloc(dev, sz, GFP_KERNEL);
|
|
|
|
if (!hisi_hba->debugfs_cmd_hdr[d])
|
|
- goto fail_iost_dq;
|
|
+ goto fail;
|
|
}
|
|
|
|
- sz = max_command_entries * sizeof(struct hisi_sas_iost);
|
|
+ sz = HISI_SAS_MAX_COMMANDS * sizeof(struct hisi_sas_iost);
|
|
|
|
hisi_hba->debugfs_iost = devm_kmalloc(dev, sz, GFP_KERNEL);
|
|
if (!hisi_hba->debugfs_iost)
|
|
- goto fail_iost_dq;
|
|
+ goto fail;
|
|
|
|
sz = HISI_SAS_IOST_ITCT_CACHE_NUM *
|
|
sizeof(struct hisi_sas_iost_itct_cache);
|
|
|
|
hisi_hba->debugfs_iost_cache = devm_kmalloc(dev, sz, GFP_KERNEL);
|
|
if (!hisi_hba->debugfs_iost_cache)
|
|
- goto fail_iost_cache;
|
|
+ goto fail;
|
|
|
|
sz = HISI_SAS_IOST_ITCT_CACHE_NUM *
|
|
sizeof(struct hisi_sas_iost_itct_cache);
|
|
|
|
hisi_hba->debugfs_itct_cache = devm_kmalloc(dev, sz, GFP_KERNEL);
|
|
if (!hisi_hba->debugfs_itct_cache)
|
|
- goto fail_itct_cache;
|
|
+ goto fail;
|
|
|
|
/* New memory allocation must be locate before itct */
|
|
sz = HISI_SAS_MAX_ITCT_ENTRIES * sizeof(struct hisi_sas_itct);
|
|
|
|
hisi_hba->debugfs_itct = devm_kmalloc(dev, sz, GFP_KERNEL);
|
|
if (!hisi_hba->debugfs_itct)
|
|
- goto fail_itct;
|
|
+ goto fail;
|
|
+
|
|
+ return 0;
|
|
+fail:
|
|
+ hisi_sas_debugfs_release(hisi_hba);
|
|
+ return -ENOMEM;
|
|
+}
|
|
+
|
|
+void hisi_sas_debugfs_init(struct hisi_hba *hisi_hba)
|
|
+{
|
|
+ struct device *dev = hisi_hba->dev;
|
|
+
|
|
+ hisi_hba->debugfs_dir = debugfs_create_dir(dev_name(dev),
|
|
+ hisi_sas_debugfs_dir);
|
|
+ debugfs_create_file("trigger_dump", 0600,
|
|
+ hisi_hba->debugfs_dir,
|
|
+ hisi_hba,
|
|
+ &hisi_sas_debugfs_trigger_dump_fops);
|
|
+
|
|
+ if (hisi_sas_debugfs_alloc(hisi_hba)) {
|
|
+ debugfs_remove_recursive(hisi_hba->debugfs_dir);
|
|
+ dev_dbg(dev, "failed to init debugfs!\n");
|
|
+ }
|
|
|
|
- return;
|
|
-fail_itct:
|
|
- devm_kfree(dev, hisi_hba->debugfs_iost_cache);
|
|
-fail_itct_cache:
|
|
- devm_kfree(dev, hisi_hba->debugfs_iost_cache);
|
|
-fail_iost_cache:
|
|
- devm_kfree(dev, hisi_hba->debugfs_iost);
|
|
-fail_iost_dq:
|
|
- for (i = 0; i < d; i++)
|
|
- devm_kfree(dev, hisi_hba->debugfs_cmd_hdr[i]);
|
|
-fail_cq:
|
|
- for (i = 0; i < c; i++)
|
|
- devm_kfree(dev, hisi_hba->debugfs_complete_hdr[i]);
|
|
- devm_kfree(dev, hisi_hba->debugfs_regs[DEBUGFS_RAS]);
|
|
-fail_ras:
|
|
- devm_kfree(dev, hisi_hba->debugfs_regs[DEBUGFS_AXI]);
|
|
-fail_axi:
|
|
-fail_port:
|
|
- for (i = 0; i < p; i++)
|
|
- devm_kfree(dev, hisi_hba->debugfs_port_reg[i]);
|
|
- devm_kfree(dev, hisi_hba->debugfs_regs[DEBUGFS_GLOBAL]);
|
|
-fail_global:
|
|
- hisi_sas_debugfs_exit(hisi_hba);
|
|
- dev_info(dev, "failed to init debugfs!\n");
|
|
}
|
|
EXPORT_SYMBOL_GPL(hisi_sas_debugfs_init);
|
|
|
|
--
|
|
2.27.0
|
|
|