mirror of
https://github.com/SCST-project/scst.git
synced 2026-08-17 12:46:27 +00:00
qla2x00t-32gbit: Fix NULL pointer dereference in target mode
When target mode is enabled, the pci_irq_get_affinity() function may return
a NULL value in qla_mapq_init_qp_cpu_map() due to the qla24xx_enable_msix()
code that handles IRQ settings for target mode. This leads to a crash due
to a NULL pointer dereference.
This patch fixes the issue by adding a check for the NULL value returned by
pci_irq_get_affinity() and introducing a 'cpu_mapped' boolean flag to the
qla_qpair structure, ensuring that the qpair's CPU affinity is updated when
it has not been mapped to a CPU.
Fixes: 1d201c81d4cc ("scsi: qla2xxx: Select qpair depending on which CPU post_cmd() gets called")
Signed-off-by: Gleb Chesnokov <gleb.chesnokov@scst.dev>
Link: https://lore.kernel.org/r/56b416f2-4e0f-b6cf-d6d5-b7c372e3c6a2@scst.dev
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
[ commit d54820b22e40 upstream ]
Fixes: https://github.com/SCST-project/scst/issues/156
This commit is contained in:
@@ -3848,6 +3848,7 @@ struct qla_qpair {
|
||||
uint64_t retry_term_jiff;
|
||||
struct qla_tgt_counters tgt_counters;
|
||||
uint16_t cpuid;
|
||||
bool cpu_mapped;
|
||||
struct qla_fw_resources fwres ____cacheline_aligned;
|
||||
struct qla_buf_pool buf_pool;
|
||||
u32 cmd_cnt;
|
||||
|
||||
@@ -9428,12 +9428,9 @@ struct qla_qpair *qla2xxx_create_qpair(struct scsi_qla_host *vha, int qos,
|
||||
qpair->req = ha->req_q_map[req_id];
|
||||
qpair->rsp->req = qpair->req;
|
||||
qpair->rsp->qpair = qpair;
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0) && \
|
||||
(!defined(RHEL_RELEASE_CODE) || \
|
||||
RHEL_RELEASE_CODE -0 < RHEL_RELEASE_VERSION(7, 5))
|
||||
/* init qpair to this cpu. Will adjust at run time. */
|
||||
qla_cpu_update(qpair, raw_smp_processor_id());
|
||||
#endif
|
||||
|
||||
if (!qpair->cpu_mapped)
|
||||
qla_cpu_update(qpair, raw_smp_processor_id());
|
||||
|
||||
if (IS_T10_PI_CAPABLE(ha) && ql2xenabledif) {
|
||||
if (ha->fw_attributes & BIT_4)
|
||||
|
||||
@@ -550,11 +550,14 @@ qla_mapq_init_qp_cpu_map(struct qla_hw_data *ha,
|
||||
if (!ha->qp_cpu_map)
|
||||
return;
|
||||
mask = pci_irq_get_affinity(ha->pdev, msix->vector_base0);
|
||||
if (!mask)
|
||||
return;
|
||||
qpair->cpuid = cpumask_first(mask);
|
||||
for_each_cpu(cpu, mask) {
|
||||
ha->qp_cpu_map[cpu] = qpair;
|
||||
}
|
||||
msix->cpuid = qpair->cpuid;
|
||||
qpair->cpu_mapped = true;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -3791,14 +3791,11 @@ void qla24xx_process_response_queue(struct scsi_qla_host *vha,
|
||||
if (!ha->flags.fw_started)
|
||||
return;
|
||||
|
||||
if (rsp->qpair->cpuid != raw_smp_processor_id() ||
|
||||
!rsp->qpair->rcv_intr) {
|
||||
if (rsp->qpair->cpuid != raw_smp_processor_id() || !rsp->qpair->rcv_intr) {
|
||||
rsp->qpair->rcv_intr = 1;
|
||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0) && \
|
||||
(!defined(RHEL_RELEASE_CODE) || \
|
||||
RHEL_RELEASE_CODE -0 < RHEL_RELEASE_VERSION(7, 5))
|
||||
qla_cpu_update(rsp->qpair, raw_smp_processor_id());
|
||||
#endif
|
||||
|
||||
if (!rsp->qpair->cpu_mapped)
|
||||
qla_cpu_update(rsp->qpair, raw_smp_processor_id());
|
||||
}
|
||||
|
||||
#define __update_rsp_in(_is_shadow_hba, _rsp, _rsp_in) \
|
||||
|
||||
Reference in New Issue
Block a user