scsi: lpfc: Use a dedicated lock for ras_fwlog state

[ Upstream commit f733a76ea0 ]

To reduce usage of and contention for hbalock, a separate dedicated lock is
used to protect ras_fwlog state.

Signed-off-by: Justin Tee <justin.tee@broadcom.com>
Link: https://lore.kernel.org/r/20240305200503.57317-8-justintee8345@gmail.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Justin Tee 2024-03-05 12:04:58 -08:00 committed by Greg Kroah-Hartman
parent e8bf2c05e8
commit e29758e73e
6 changed files with 32 additions and 28 deletions

View File

@ -1429,6 +1429,7 @@ struct lpfc_hba {
struct timer_list inactive_vmid_poll; struct timer_list inactive_vmid_poll;
/* RAS Support */ /* RAS Support */
spinlock_t ras_fwlog_lock; /* do not take while holding another lock */
struct lpfc_ras_fwlog ras_fwlog; struct lpfc_ras_fwlog ras_fwlog;
uint32_t iocb_cnt; uint32_t iocb_cnt;

View File

@ -5864,9 +5864,9 @@ lpfc_ras_fwlog_buffsize_set(struct lpfc_hba *phba, uint val)
if (phba->cfg_ras_fwlog_func != PCI_FUNC(phba->pcidev->devfn)) if (phba->cfg_ras_fwlog_func != PCI_FUNC(phba->pcidev->devfn))
return -EINVAL; return -EINVAL;
spin_lock_irq(&phba->hbalock); spin_lock_irq(&phba->ras_fwlog_lock);
state = phba->ras_fwlog.state; state = phba->ras_fwlog.state;
spin_unlock_irq(&phba->hbalock); spin_unlock_irq(&phba->ras_fwlog_lock);
if (state == REG_INPROGRESS) { if (state == REG_INPROGRESS) {
lpfc_printf_log(phba, KERN_ERR, LOG_SLI, "6147 RAS Logging " lpfc_printf_log(phba, KERN_ERR, LOG_SLI, "6147 RAS Logging "

View File

@ -5070,12 +5070,12 @@ lpfc_bsg_get_ras_config(struct bsg_job *job)
bsg_reply->reply_data.vendor_reply.vendor_rsp; bsg_reply->reply_data.vendor_reply.vendor_rsp;
/* Current logging state */ /* Current logging state */
spin_lock_irq(&phba->hbalock); spin_lock_irq(&phba->ras_fwlog_lock);
if (ras_fwlog->state == ACTIVE) if (ras_fwlog->state == ACTIVE)
ras_reply->state = LPFC_RASLOG_STATE_RUNNING; ras_reply->state = LPFC_RASLOG_STATE_RUNNING;
else else
ras_reply->state = LPFC_RASLOG_STATE_STOPPED; ras_reply->state = LPFC_RASLOG_STATE_STOPPED;
spin_unlock_irq(&phba->hbalock); spin_unlock_irq(&phba->ras_fwlog_lock);
ras_reply->log_level = phba->ras_fwlog.fw_loglevel; ras_reply->log_level = phba->ras_fwlog.fw_loglevel;
ras_reply->log_buff_sz = phba->cfg_ras_fwlog_buffsize; ras_reply->log_buff_sz = phba->cfg_ras_fwlog_buffsize;
@ -5132,13 +5132,13 @@ lpfc_bsg_set_ras_config(struct bsg_job *job)
if (action == LPFC_RASACTION_STOP_LOGGING) { if (action == LPFC_RASACTION_STOP_LOGGING) {
/* Check if already disabled */ /* Check if already disabled */
spin_lock_irq(&phba->hbalock); spin_lock_irq(&phba->ras_fwlog_lock);
if (ras_fwlog->state != ACTIVE) { if (ras_fwlog->state != ACTIVE) {
spin_unlock_irq(&phba->hbalock); spin_unlock_irq(&phba->ras_fwlog_lock);
rc = -ESRCH; rc = -ESRCH;
goto ras_job_error; goto ras_job_error;
} }
spin_unlock_irq(&phba->hbalock); spin_unlock_irq(&phba->ras_fwlog_lock);
/* Disable logging */ /* Disable logging */
lpfc_ras_stop_fwlog(phba); lpfc_ras_stop_fwlog(phba);
@ -5149,10 +5149,10 @@ lpfc_bsg_set_ras_config(struct bsg_job *job)
* FW-logging with new log-level. Return status * FW-logging with new log-level. Return status
* "Logging already Running" to caller. * "Logging already Running" to caller.
**/ **/
spin_lock_irq(&phba->hbalock); spin_lock_irq(&phba->ras_fwlog_lock);
if (ras_fwlog->state != INACTIVE) if (ras_fwlog->state != INACTIVE)
action_status = -EINPROGRESS; action_status = -EINPROGRESS;
spin_unlock_irq(&phba->hbalock); spin_unlock_irq(&phba->ras_fwlog_lock);
/* Enable logging */ /* Enable logging */
rc = lpfc_sli4_ras_fwlog_init(phba, log_level, rc = lpfc_sli4_ras_fwlog_init(phba, log_level,
@ -5268,13 +5268,13 @@ lpfc_bsg_get_ras_fwlog(struct bsg_job *job)
goto ras_job_error; goto ras_job_error;
/* Logging to be stopped before reading */ /* Logging to be stopped before reading */
spin_lock_irq(&phba->hbalock); spin_lock_irq(&phba->ras_fwlog_lock);
if (ras_fwlog->state == ACTIVE) { if (ras_fwlog->state == ACTIVE) {
spin_unlock_irq(&phba->hbalock); spin_unlock_irq(&phba->ras_fwlog_lock);
rc = -EINPROGRESS; rc = -EINPROGRESS;
goto ras_job_error; goto ras_job_error;
} }
spin_unlock_irq(&phba->hbalock); spin_unlock_irq(&phba->ras_fwlog_lock);
if (job->request_len < if (job->request_len <
sizeof(struct fc_bsg_request) + sizeof(struct fc_bsg_request) +

View File

@ -2196,12 +2196,12 @@ static int lpfc_debugfs_ras_log_data(struct lpfc_hba *phba,
memset(buffer, 0, size); memset(buffer, 0, size);
spin_lock_irq(&phba->hbalock); spin_lock_irq(&phba->ras_fwlog_lock);
if (phba->ras_fwlog.state != ACTIVE) { if (phba->ras_fwlog.state != ACTIVE) {
spin_unlock_irq(&phba->hbalock); spin_unlock_irq(&phba->ras_fwlog_lock);
return -EINVAL; return -EINVAL;
} }
spin_unlock_irq(&phba->hbalock); spin_unlock_irq(&phba->ras_fwlog_lock);
list_for_each_entry_safe(dmabuf, next, list_for_each_entry_safe(dmabuf, next,
&phba->ras_fwlog.fwlog_buff_list, list) { &phba->ras_fwlog.fwlog_buff_list, list) {
@ -2252,13 +2252,13 @@ lpfc_debugfs_ras_log_open(struct inode *inode, struct file *file)
int size; int size;
int rc = -ENOMEM; int rc = -ENOMEM;
spin_lock_irq(&phba->hbalock); spin_lock_irq(&phba->ras_fwlog_lock);
if (phba->ras_fwlog.state != ACTIVE) { if (phba->ras_fwlog.state != ACTIVE) {
spin_unlock_irq(&phba->hbalock); spin_unlock_irq(&phba->ras_fwlog_lock);
rc = -EINVAL; rc = -EINVAL;
goto out; goto out;
} }
spin_unlock_irq(&phba->hbalock); spin_unlock_irq(&phba->ras_fwlog_lock);
if (check_mul_overflow(LPFC_RAS_MIN_BUFF_POST_SIZE, if (check_mul_overflow(LPFC_RAS_MIN_BUFF_POST_SIZE,
phba->cfg_ras_fwlog_buffsize, &size)) phba->cfg_ras_fwlog_buffsize, &size))

View File

@ -7698,6 +7698,9 @@ lpfc_setup_driver_resource_phase1(struct lpfc_hba *phba)
"NVME" : " "), "NVME" : " "),
(phba->nvmet_support ? "NVMET" : " ")); (phba->nvmet_support ? "NVMET" : " "));
/* ras_fwlog state */
spin_lock_init(&phba->ras_fwlog_lock);
/* Initialize the IO buffer list used by driver for SLI3 SCSI */ /* Initialize the IO buffer list used by driver for SLI3 SCSI */
spin_lock_init(&phba->scsi_buf_list_get_lock); spin_lock_init(&phba->scsi_buf_list_get_lock);
INIT_LIST_HEAD(&phba->lpfc_scsi_buf_list_get); INIT_LIST_HEAD(&phba->lpfc_scsi_buf_list_get);

View File

@ -6844,9 +6844,9 @@ lpfc_ras_stop_fwlog(struct lpfc_hba *phba)
{ {
struct lpfc_ras_fwlog *ras_fwlog = &phba->ras_fwlog; struct lpfc_ras_fwlog *ras_fwlog = &phba->ras_fwlog;
spin_lock_irq(&phba->hbalock); spin_lock_irq(&phba->ras_fwlog_lock);
ras_fwlog->state = INACTIVE; ras_fwlog->state = INACTIVE;
spin_unlock_irq(&phba->hbalock); spin_unlock_irq(&phba->ras_fwlog_lock);
/* Disable FW logging to host memory */ /* Disable FW logging to host memory */
writel(LPFC_CTL_PDEV_CTL_DDL_RAS, writel(LPFC_CTL_PDEV_CTL_DDL_RAS,
@ -6889,9 +6889,9 @@ lpfc_sli4_ras_dma_free(struct lpfc_hba *phba)
ras_fwlog->lwpd.virt = NULL; ras_fwlog->lwpd.virt = NULL;
} }
spin_lock_irq(&phba->hbalock); spin_lock_irq(&phba->ras_fwlog_lock);
ras_fwlog->state = INACTIVE; ras_fwlog->state = INACTIVE;
spin_unlock_irq(&phba->hbalock); spin_unlock_irq(&phba->ras_fwlog_lock);
} }
/** /**
@ -6993,9 +6993,9 @@ lpfc_sli4_ras_mbox_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
goto disable_ras; goto disable_ras;
} }
spin_lock_irq(&phba->hbalock); spin_lock_irq(&phba->ras_fwlog_lock);
ras_fwlog->state = ACTIVE; ras_fwlog->state = ACTIVE;
spin_unlock_irq(&phba->hbalock); spin_unlock_irq(&phba->ras_fwlog_lock);
mempool_free(pmb, phba->mbox_mem_pool); mempool_free(pmb, phba->mbox_mem_pool);
return; return;
@ -7027,9 +7027,9 @@ lpfc_sli4_ras_fwlog_init(struct lpfc_hba *phba,
uint32_t len = 0, fwlog_buffsize, fwlog_entry_count; uint32_t len = 0, fwlog_buffsize, fwlog_entry_count;
int rc = 0; int rc = 0;
spin_lock_irq(&phba->hbalock); spin_lock_irq(&phba->ras_fwlog_lock);
ras_fwlog->state = INACTIVE; ras_fwlog->state = INACTIVE;
spin_unlock_irq(&phba->hbalock); spin_unlock_irq(&phba->ras_fwlog_lock);
fwlog_buffsize = (LPFC_RAS_MIN_BUFF_POST_SIZE * fwlog_buffsize = (LPFC_RAS_MIN_BUFF_POST_SIZE *
phba->cfg_ras_fwlog_buffsize); phba->cfg_ras_fwlog_buffsize);
@ -7090,9 +7090,9 @@ lpfc_sli4_ras_fwlog_init(struct lpfc_hba *phba,
mbx_fwlog->u.request.lwpd.addr_lo = putPaddrLow(ras_fwlog->lwpd.phys); mbx_fwlog->u.request.lwpd.addr_lo = putPaddrLow(ras_fwlog->lwpd.phys);
mbx_fwlog->u.request.lwpd.addr_hi = putPaddrHigh(ras_fwlog->lwpd.phys); mbx_fwlog->u.request.lwpd.addr_hi = putPaddrHigh(ras_fwlog->lwpd.phys);
spin_lock_irq(&phba->hbalock); spin_lock_irq(&phba->ras_fwlog_lock);
ras_fwlog->state = REG_INPROGRESS; ras_fwlog->state = REG_INPROGRESS;
spin_unlock_irq(&phba->hbalock); spin_unlock_irq(&phba->ras_fwlog_lock);
mbox->vport = phba->pport; mbox->vport = phba->pport;
mbox->mbox_cmpl = lpfc_sli4_ras_mbox_cmpl; mbox->mbox_cmpl = lpfc_sli4_ras_mbox_cmpl;