Commit e8613084 authored by James Smart's avatar James Smart Committed by Martin K. Petersen

scsi: lpfc: Remove use of kmalloc() in trace event logging

There are instances when trace event logs are triggered from an interrupt
context. The trace event log may attempt to alloc memory causing scheduling
while atomic bug call traces.

Remove the need for the kmalloc'ed vport array when checking the
log_verbose flag, which eliminates the need for any allocation.

Link: https://lore.kernel.org/r/20210707184351.67872-3-jsmart2021@gmail.comCo-developed-by: default avatarJustin Tee <justin.tee@broadcom.com>
Signed-off-by: default avatarJustin Tee <justin.tee@broadcom.com>
Signed-off-by: default avatarJames Smart <jsmart2021@gmail.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent ae463b60
...@@ -14162,8 +14162,9 @@ void lpfc_dmp_dbg(struct lpfc_hba *phba) ...@@ -14162,8 +14162,9 @@ void lpfc_dmp_dbg(struct lpfc_hba *phba)
unsigned int temp_idx; unsigned int temp_idx;
int i; int i;
int j = 0; int j = 0;
unsigned long rem_nsec; unsigned long rem_nsec, iflags;
struct lpfc_vport **vports; bool log_verbose = false;
struct lpfc_vport *port_iterator;
/* Don't dump messages if we explicitly set log_verbose for the /* Don't dump messages if we explicitly set log_verbose for the
* physical port or any vport. * physical port or any vport.
...@@ -14171,16 +14172,24 @@ void lpfc_dmp_dbg(struct lpfc_hba *phba) ...@@ -14171,16 +14172,24 @@ void lpfc_dmp_dbg(struct lpfc_hba *phba)
if (phba->cfg_log_verbose) if (phba->cfg_log_verbose)
return; return;
vports = lpfc_create_vport_work_array(phba); spin_lock_irqsave(&phba->port_list_lock, iflags);
if (vports != NULL) { list_for_each_entry(port_iterator, &phba->port_list, listentry) {
for (i = 0; i <= phba->max_vpi && vports[i] != NULL; i++) { if (port_iterator->load_flag & FC_UNLOADING)
if (vports[i]->cfg_log_verbose) { continue;
lpfc_destroy_vport_work_array(phba, vports); if (scsi_host_get(lpfc_shost_from_vport(port_iterator))) {
if (port_iterator->cfg_log_verbose)
log_verbose = true;
scsi_host_put(lpfc_shost_from_vport(port_iterator));
if (log_verbose) {
spin_unlock_irqrestore(&phba->port_list_lock,
iflags);
return; return;
} }
} }
} }
lpfc_destroy_vport_work_array(phba, vports); spin_unlock_irqrestore(&phba->port_list_lock, iflags);
if (atomic_cmpxchg(&phba->dbg_log_dmping, 0, 1) != 0) if (atomic_cmpxchg(&phba->dbg_log_dmping, 0, 1) != 0)
return; return;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment