Hannes Reinecke 77572d
From: James Smart <jsmart2021@gmail.com>
Hannes Reinecke 77572d
Date: Thu, 21 Nov 2019 09:55:56 -0800
Hannes Reinecke 77572d
Subject: [PATCH] lpfc: size cpu map by last cpu id set
Petr Tesarik 7d5cc1
Patch-mainline: v5.5-rc1
Petr Tesarik 7d5cc1
Git-commit: eede4970fb6c29f2056d7d016a3764c90e9d8a65
Hannes Reinecke 77572d
References: bsc#1157160
Hannes Reinecke 77572d
Hannes Reinecke 77572d
Currently the lpfc driver sizes its cpu_map array based on
Hannes Reinecke 77572d
num_possible_cpus(). However, that can be a value that is less
Hannes Reinecke 77572d
than the highest cpu id bit that is set. As such, if a thread
Hannes Reinecke 77572d
runs on a cpu with a larger cpu id, or for_each_possible_cpu()
Hannes Reinecke 77572d
is used, the driver could index off the end of the array and
Hannes Reinecke 77572d
return garbage or GPF.
Hannes Reinecke 77572d
Hannes Reinecke 77572d
The driver maintains it's own internal copy of the "num_possible"
Hannes Reinecke 77572d
cpu value and sizes arrays by it.
Hannes Reinecke 77572d
Hannes Reinecke 77572d
Fix by setting the driver's value to the value of the last cpu id
Hannes Reinecke 77572d
bit set in the possible_mask - plus 1. Thus cpu_map will be sized
Hannes Reinecke 77572d
to allow access by any cpu id possible.
Hannes Reinecke 77572d
Hannes Reinecke 77572d
Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Hannes Reinecke 77572d
Signed-off-by: James Smart <jsmart2021@gmail.com>
Hannes Reinecke 77572d
Acked-by: Hannes Reinecke <hare@suse.de>
Hannes Reinecke 77572d
---
Hannes Reinecke 77572d
 drivers/scsi/lpfc/lpfc_init.c | 2 +-
Hannes Reinecke 77572d
 1 file changed, 1 insertion(+), 1 deletion(-)
Hannes Reinecke 77572d
Hannes Reinecke 77572d
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c
Hannes Reinecke 77572d
index e9323889f199..cd83617354a1 100644
Hannes Reinecke 77572d
--- a/drivers/scsi/lpfc/lpfc_init.c
Hannes Reinecke 77572d
+++ b/drivers/scsi/lpfc/lpfc_init.c
Hannes Reinecke 77572d
@@ -6460,7 +6460,7 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
Hannes Reinecke 77572d
 	u32 if_fam;
Hannes Reinecke 77572d
 
Hannes Reinecke 77572d
 	phba->sli4_hba.num_present_cpu = lpfc_present_cpu;
Hannes Reinecke 77572d
-	phba->sli4_hba.num_possible_cpu = num_possible_cpus();
Hannes Reinecke 77572d
+	phba->sli4_hba.num_possible_cpu = cpumask_last(cpu_possible_mask) + 1;
Hannes Reinecke 77572d
 	phba->sli4_hba.curr_disp_cpu = 0;
Hannes Reinecke 77572d
 	lpfc_cpumask_of_node_init(phba);
Hannes Reinecke 77572d
 
Hannes Reinecke 77572d
-- 
Hannes Reinecke 77572d
2.16.4
Hannes Reinecke 77572d