Message ID | 20241113-refactor-blk-affinity-helpers-v4-7-dd3baa1e267f@kernel.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | blk: refactor queue affinity helpers | expand |
Hi Daniel, kernel test robot noticed the following build errors: [auto build test ERROR on c9af98a7e8af266bae73e9d662b8341da1ec5824] url: https://github.com/intel-lab-lkp/linux/commits/Daniel-Wagner/driver-core-bus-add-irq_get_affinity-callback-to-bus_type/20241113-223232 base: c9af98a7e8af266bae73e9d662b8341da1ec5824 patch link: https://lore.kernel.org/r/20241113-refactor-blk-affinity-helpers-v4-7-dd3baa1e267f%40kernel.org patch subject: [PATCH v4 07/10] scsi: hisi_sas: use blk_mq_hctx_map_queues to map queues config: i386-buildonly-randconfig-006-20241114 (https://download.01.org/0day-ci/archive/20241114/202411140822.ZRutrwWP-lkp@intel.com/config) compiler: clang version 19.1.3 (https://github.com/llvm/llvm-project ab51eccf88f5321e7c60591c5546b254b6afab99) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241114/202411140822.ZRutrwWP-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202411140822.ZRutrwWP-lkp@intel.com/ All errors (new ones prefixed by >>): In file included from drivers/scsi/hisi_sas/hisi_sas_v2_hw.c:7: In file included from drivers/scsi/hisi_sas/hisi_sas.h:11: In file included from include/linux/blk-mq.h:5: In file included from include/linux/blkdev.h:9: In file included from include/linux/blk_types.h:10: In file included from include/linux/bvec.h:10: In file included from include/linux/highmem.h:8: In file included from include/linux/cacheflush.h:5: In file included from arch/x86/include/asm/cacheflush.h:5: In file included from include/linux/mm.h:2213: include/linux/vmstat.h:518:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion] 518 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_" | ~~~~~~~~~~~ ^ ~~~ >> drivers/scsi/hisi_sas/hisi_sas_v2_hw.c:3375:45: error: use of undeclared identifier 'COQ_IRQ_INDEX' 3375 | cq->irq_no = hisi_hba->irq_map[queue_no + COQ_IRQ_INDEX]; | ^ 1 warning and 1 error generated. vim +/COQ_IRQ_INDEX +3375 drivers/scsi/hisi_sas/hisi_sas_v2_hw.c 3322 3323 /* 3324 * There is a limitation in the hip06 chipset that we need 3325 * to map in all mbigen interrupts, even if they are not used. 3326 */ 3327 static int interrupt_init_v2_hw(struct hisi_hba *hisi_hba) 3328 { 3329 struct platform_device *pdev = hisi_hba->platform_dev; 3330 struct device *dev = &pdev->dev; 3331 int irq, rc = 0; 3332 int i, phy_no, fatal_no, queue_no; 3333 3334 for (i = 0; i < HISI_SAS_PHY_INT_NR; i++) { 3335 irq = hisi_hba->irq_map[i + 1]; /* Phy up/down is irq1 */ 3336 rc = devm_request_irq(dev, irq, phy_interrupts[i], 0, 3337 DRV_NAME " phy", hisi_hba); 3338 if (rc) { 3339 dev_err(dev, "irq init: could not request phy interrupt %d, rc=%d\n", 3340 irq, rc); 3341 rc = -ENOENT; 3342 goto err_out; 3343 } 3344 } 3345 3346 for (phy_no = 0; phy_no < hisi_hba->n_phy; phy_no++) { 3347 struct hisi_sas_phy *phy = &hisi_hba->phy[phy_no]; 3348 3349 irq = hisi_hba->irq_map[phy_no + 72]; 3350 rc = devm_request_irq(dev, irq, sata_int_v2_hw, 0, 3351 DRV_NAME " sata", phy); 3352 if (rc) { 3353 dev_err(dev, "irq init: could not request sata interrupt %d, rc=%d\n", 3354 irq, rc); 3355 rc = -ENOENT; 3356 goto err_out; 3357 } 3358 } 3359 3360 for (fatal_no = 0; fatal_no < HISI_SAS_FATAL_INT_NR; fatal_no++) { 3361 irq = hisi_hba->irq_map[fatal_no + 81]; 3362 rc = devm_request_irq(dev, irq, fatal_interrupts[fatal_no], 0, 3363 DRV_NAME " fatal", hisi_hba); 3364 if (rc) { 3365 dev_err(dev, "irq init: could not request fatal interrupt %d, rc=%d\n", 3366 irq, rc); 3367 rc = -ENOENT; 3368 goto err_out; 3369 } 3370 } 3371 3372 for (queue_no = 0; queue_no < hisi_hba->cq_nvecs; queue_no++) { 3373 struct hisi_sas_cq *cq = &hisi_hba->cq[queue_no]; 3374 > 3375 cq->irq_no = hisi_hba->irq_map[queue_no + COQ_IRQ_INDEX]; 3376 rc = devm_request_threaded_irq(dev, cq->irq_no, 3377 cq_interrupt_v2_hw, 3378 cq_thread_v2_hw, IRQF_ONESHOT, 3379 DRV_NAME " cq", cq); 3380 if (rc) { 3381 dev_err(dev, "irq init: could not request cq interrupt %d, rc=%d\n", 3382 cq->irq_no, rc); 3383 rc = -ENOENT; 3384 goto err_out; 3385 } 3386 cq->irq_mask = irq_get_affinity_mask(cq->irq_no); 3387 } 3388 err_out: 3389 return rc; 3390 } 3391
Hi Daniel, kernel test robot noticed the following build errors: [auto build test ERROR on c9af98a7e8af266bae73e9d662b8341da1ec5824] url: https://github.com/intel-lab-lkp/linux/commits/Daniel-Wagner/driver-core-bus-add-irq_get_affinity-callback-to-bus_type/20241113-223232 base: c9af98a7e8af266bae73e9d662b8341da1ec5824 patch link: https://lore.kernel.org/r/20241113-refactor-blk-affinity-helpers-v4-7-dd3baa1e267f%40kernel.org patch subject: [PATCH v4 07/10] scsi: hisi_sas: use blk_mq_hctx_map_queues to map queues config: arc-allyesconfig (https://download.01.org/0day-ci/archive/20241114/202411141102.q2IPCJ7K-lkp@intel.com/config) compiler: arceb-elf-gcc (GCC) 13.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241114/202411141102.q2IPCJ7K-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202411141102.q2IPCJ7K-lkp@intel.com/ All errors (new ones prefixed by >>): drivers/scsi/hisi_sas/hisi_sas_v2_hw.c: In function 'interrupt_init_v2_hw': >> drivers/scsi/hisi_sas/hisi_sas_v2_hw.c:3375:59: error: 'COQ_IRQ_INDEX' undeclared (first use in this function); did you mean 'CQ0_IRQ_INDEX'? 3375 | cq->irq_no = hisi_hba->irq_map[queue_no + COQ_IRQ_INDEX]; | ^~~~~~~~~~~~~ | CQ0_IRQ_INDEX drivers/scsi/hisi_sas/hisi_sas_v2_hw.c:3375:59: note: each undeclared identifier is reported only once for each function it appears in drivers/scsi/hisi_sas/hisi_sas_v2_hw.c: At top level: drivers/scsi/hisi_sas/hisi_sas_v2_hw.c:3624:36: warning: 'sas_v2_acpi_match' defined but not used [-Wunused-const-variable=] 3624 | static const struct acpi_device_id sas_v2_acpi_match[] = { | ^~~~~~~~~~~~~~~~~ vim +3375 drivers/scsi/hisi_sas/hisi_sas_v2_hw.c 3322 3323 /* 3324 * There is a limitation in the hip06 chipset that we need 3325 * to map in all mbigen interrupts, even if they are not used. 3326 */ 3327 static int interrupt_init_v2_hw(struct hisi_hba *hisi_hba) 3328 { 3329 struct platform_device *pdev = hisi_hba->platform_dev; 3330 struct device *dev = &pdev->dev; 3331 int irq, rc = 0; 3332 int i, phy_no, fatal_no, queue_no; 3333 3334 for (i = 0; i < HISI_SAS_PHY_INT_NR; i++) { 3335 irq = hisi_hba->irq_map[i + 1]; /* Phy up/down is irq1 */ 3336 rc = devm_request_irq(dev, irq, phy_interrupts[i], 0, 3337 DRV_NAME " phy", hisi_hba); 3338 if (rc) { 3339 dev_err(dev, "irq init: could not request phy interrupt %d, rc=%d\n", 3340 irq, rc); 3341 rc = -ENOENT; 3342 goto err_out; 3343 } 3344 } 3345 3346 for (phy_no = 0; phy_no < hisi_hba->n_phy; phy_no++) { 3347 struct hisi_sas_phy *phy = &hisi_hba->phy[phy_no]; 3348 3349 irq = hisi_hba->irq_map[phy_no + 72]; 3350 rc = devm_request_irq(dev, irq, sata_int_v2_hw, 0, 3351 DRV_NAME " sata", phy); 3352 if (rc) { 3353 dev_err(dev, "irq init: could not request sata interrupt %d, rc=%d\n", 3354 irq, rc); 3355 rc = -ENOENT; 3356 goto err_out; 3357 } 3358 } 3359 3360 for (fatal_no = 0; fatal_no < HISI_SAS_FATAL_INT_NR; fatal_no++) { 3361 irq = hisi_hba->irq_map[fatal_no + 81]; 3362 rc = devm_request_irq(dev, irq, fatal_interrupts[fatal_no], 0, 3363 DRV_NAME " fatal", hisi_hba); 3364 if (rc) { 3365 dev_err(dev, "irq init: could not request fatal interrupt %d, rc=%d\n", 3366 irq, rc); 3367 rc = -ENOENT; 3368 goto err_out; 3369 } 3370 } 3371 3372 for (queue_no = 0; queue_no < hisi_hba->cq_nvecs; queue_no++) { 3373 struct hisi_sas_cq *cq = &hisi_hba->cq[queue_no]; 3374 > 3375 cq->irq_no = hisi_hba->irq_map[queue_no + COQ_IRQ_INDEX]; 3376 rc = devm_request_threaded_irq(dev, cq->irq_no, 3377 cq_interrupt_v2_hw, 3378 cq_thread_v2_hw, IRQF_ONESHOT, 3379 DRV_NAME " cq", cq); 3380 if (rc) { 3381 dev_err(dev, "irq init: could not request cq interrupt %d, rc=%d\n", 3382 cq->irq_no, rc); 3383 rc = -ENOENT; 3384 goto err_out; 3385 } 3386 cq->irq_mask = irq_get_affinity_mask(cq->irq_no); 3387 } 3388 err_out: 3389 return rc; 3390 } 3391
On Thu, Nov 14, 2024 at 08:36:35AM +0800, kernel test robot wrote: > >> drivers/scsi/hisi_sas/hisi_sas_v2_hw.c:3375:45: error: use of undeclared identifier 'COQ_IRQ_INDEX' > 3375 | cq->irq_no = hisi_hba->irq_map[queue_no + COQ_IRQ_INDEX]; > | ^ Argh, I forgot to fold my fix in...
diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c index 342d75f12051d28fb1a0692b45ff568dd5b6f814..faa85fbf3e267cf883568d1808207e9a56c70674 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c +++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c @@ -3372,7 +3372,7 @@ static int interrupt_init_v2_hw(struct hisi_hba *hisi_hba) for (queue_no = 0; queue_no < hisi_hba->cq_nvecs; queue_no++) { struct hisi_sas_cq *cq = &hisi_hba->cq[queue_no]; - cq->irq_no = hisi_hba->irq_map[queue_no + 96]; + cq->irq_no = hisi_hba->irq_map[queue_no + COQ_IRQ_INDEX]; rc = devm_request_threaded_irq(dev, cq->irq_no, cq_interrupt_v2_hw, cq_thread_v2_hw, IRQF_ONESHOT, @@ -3389,6 +3389,14 @@ static int interrupt_init_v2_hw(struct hisi_hba *hisi_hba) return rc; } +static const struct cpumask *hisi_sas_v2_irq_get_affinity(struct device *dev, + unsigned int irq_vec) +{ + struct hisi_hba *hisi_hba = dev->driver_data; + + return irq_get_affinity_mask(hisi_hba->irq_map[irq_vec]); +} + static int hisi_sas_v2_init(struct hisi_hba *hisi_hba) { int rc; @@ -3553,17 +3561,8 @@ static void map_queues_v2_hw(struct Scsi_Host *shost) { struct hisi_hba *hisi_hba = shost_priv(shost); struct blk_mq_queue_map *qmap = &shost->tag_set.map[HCTX_TYPE_DEFAULT]; - const struct cpumask *mask; - unsigned int queue, cpu; - for (queue = 0; queue < qmap->nr_queues; queue++) { - mask = irq_get_affinity_mask(hisi_hba->irq_map[96 + queue]); - if (!mask) - continue; - - for_each_cpu(cpu, mask) - qmap->mq_map[cpu] = qmap->queue_offset + queue; - } + blk_mq_hctx_map_queues(qmap, hisi_hba->dev, CQ0_IRQ_INDEX); } static const struct scsi_host_template sht_v2_hw = { @@ -3636,6 +3635,7 @@ static struct platform_driver hisi_sas_v2_driver = { .name = DRV_NAME, .of_match_table = sas_v2_of_match, .acpi_match_table = ACPI_PTR(sas_v2_acpi_match), + .irq_get_affinity = hisi_sas_v2_irq_get_affinity, }, };
The PCI struct bus_type irq_get_affinity callback can't be used here as hisi_sas v2 implements its own irq affinity code. Thus install a driver specific irq_get_affinity callback. With this in place it's possible to replace the open coded queue mapping with blk_mq_hctx_map_queues function. Signed-off-by: Daniel Wagner <wagi@kernel.org> --- drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-)