lkml.org 
[lkml]   [2021]   [Sep]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.14 07/99] scsi: lpfc: Remove use of kmalloc() in trace event logging
    Date
    From: James Smart <jsmart2021@gmail.com>

    [ Upstream commit e8613084053d406c22914385a488e8b85072100c ]

    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.com
    Co-developed-by: Justin Tee <justin.tee@broadcom.com>
    Signed-off-by: Justin Tee <justin.tee@broadcom.com>
    Signed-off-by: James Smart <jsmart2021@gmail.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/scsi/lpfc/lpfc_init.c | 25 +++++++++++++++++--------
    1 file changed, 17 insertions(+), 8 deletions(-)

    diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c
    index 4bbc621e77e9..cb7773a9167d 100644
    --- a/drivers/scsi/lpfc/lpfc_init.c
    +++ b/drivers/scsi/lpfc/lpfc_init.c
    @@ -14163,8 +14163,9 @@ void lpfc_dmp_dbg(struct lpfc_hba *phba)
    unsigned int temp_idx;
    int i;
    int j = 0;
    - unsigned long rem_nsec;
    - struct lpfc_vport **vports;
    + unsigned long rem_nsec, iflags;
    + bool log_verbose = false;
    + struct lpfc_vport *port_iterator;

    /* Don't dump messages if we explicitly set log_verbose for the
    * physical port or any vport.
    @@ -14172,16 +14173,24 @@ void lpfc_dmp_dbg(struct lpfc_hba *phba)
    if (phba->cfg_log_verbose)
    return;

    - vports = lpfc_create_vport_work_array(phba);
    - if (vports != NULL) {
    - for (i = 0; i <= phba->max_vpi && vports[i] != NULL; i++) {
    - if (vports[i]->cfg_log_verbose) {
    - lpfc_destroy_vport_work_array(phba, vports);
    + spin_lock_irqsave(&phba->port_list_lock, iflags);
    + list_for_each_entry(port_iterator, &phba->port_list, listentry) {
    + if (port_iterator->load_flag & FC_UNLOADING)
    + continue;
    + 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;
    }
    }
    }
    - 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)
    return;
    --
    2.30.2
    \
     
     \ /
      Last update: 2021-09-10 02:16    [W:3.018 / U:0.112 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site