Skip to content

Commit

Permalink
scsi: hisi_sas: Add hisi_sas_debugfs_alloc() to centralise allocation
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Luo Jiaxing authored and Martin K. Petersen committed Sep 11, 2019
1 parent 4bc0580 commit 7ec7082
Showing 1 changed file with 58 additions and 44 deletions.
102 changes: 58 additions & 44 deletions drivers/scsi/hisi_sas/hisi_sas_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -3306,58 +3306,75 @@ 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);
debugfs_create_file("trigger_dump", 0600,
hisi_hba->debugfs_dir,
hisi_hba,
&hisi_sas_debugfs_trigger_dump_fops);
hisi_hba->debugfs_dump_dentry =
debugfs_create_dir("dump", hisi_hba->debugfs_dir);

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++) {
hisi_hba->debugfs_port_reg[p] =
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;
hisi_hba->debugfs_regs[DEBUGFS_AXI] =
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++) {
hisi_hba->debugfs_complete_hdr[c] =
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;
Expand All @@ -3366,60 +3383,57 @@ 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;
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:
debugfs_remove_recursive(hisi_hba->debugfs_dir);
dev_dbg(dev, "failed to init debugfs!\n");
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");
}
}
EXPORT_SYMBOL_GPL(hisi_sas_debugfs_init);

Expand Down

0 comments on commit 7ec7082

Please sign in to comment.