From bbae0ca11850da2793282896206974656859a73e Mon Sep 17 00:00:00 2001 From: Steven Song Date: Thu, 2 Mar 2023 09:42:42 +0800 Subject: [PATCH] SCSI: SSSRAID: Introduce map_queue in sssraid module 3snic inclusion category: feature feature: sssraid bugzilla: https://gitee.com/openeuler/kernel/issues/I6IWOA CVE: NA ------------------------------------------ Introduce map_queue in sssraid module for performance enhancement. Signed-off-by: Steven Song Reviewed-by: liangry Reviewed-by: Jiang Yu --- drivers/scsi/sssraid/sssraid_os.c | 78 ++++++++++++++++++++++++++++++- 1 file changed, 77 insertions(+), 1 deletion(-) diff --git a/drivers/scsi/sssraid/sssraid_os.c b/drivers/scsi/sssraid/sssraid_os.c index 6cf0b085bb6b..ac49a439b68e 100644 --- a/drivers/scsi/sssraid/sssraid_os.c +++ b/drivers/scsi/sssraid/sssraid_os.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -1462,6 +1463,17 @@ void sssraid_back_all_io(struct sssraid_ioc *sdioc) } } +static int sssraid_get_first_sibling(unsigned int cpu) +{ + unsigned int ret; + + ret = cpumask_first(topology_sibling_cpumask(cpu)); + if (ret < nr_cpu_ids) + return ret; + + return cpu; +} + /* * static struct scsi_host_template sssraid_driver_template */ @@ -1536,6 +1548,69 @@ static int sssraid_sysfs_host_reset(struct Scsi_Host *shost, int reset_type) return ret; } +static int sssraid_map_queues(struct Scsi_Host *shost) +{ + struct sssraid_ioc *sdioc = shost_priv(shost); + struct pci_dev *pdev = sdioc->pdev; + struct msi_desc *entry = NULL; + struct irq_affinity_desc *affinity = NULL; + struct blk_mq_tag_set *tag_set = &shost->tag_set; + struct blk_mq_queue_map *queue_map = &tag_set->map[HCTX_TYPE_DEFAULT]; + const struct cpumask *node_mask = NULL; + unsigned int queue_offset = queue_map->queue_offset; + unsigned int *map = queue_map->mq_map; + unsigned int nr_queues = queue_map->nr_queues; + unsigned int node_id, node_id_last = 0xFFFFFFFF; + int cpu, first_sibling, cpu_index = 0; + u8 node_count = 0, i; + unsigned int node_id_array[100]; + + for_each_pci_msi_entry(entry, pdev) { + struct list_head *msi_list = &pdev->dev.msi_list; + + if (list_is_last(msi_list, &entry->list)) + goto get_next_numa_node; + + if (entry->irq) { + affinity = entry->affinity; + node_mask = &affinity->mask; + + cpu = cpumask_first(node_mask); + node_id = cpu_to_node(cpu); + if (node_id_last == node_id) + continue; + + for (i = 0; i < node_count; i++) { + if (node_id == node_id_array[i]) + goto get_next_numa_node; + } + node_id_array[node_count++] = node_id; + node_id_last = node_id; + } +get_next_numa_node: + continue; + } + + for (i = 0; i < node_count; i++) { + node_mask = cpumask_of_node(node_id_array[i]); + dbgprint(sdioc, "NUMA_node = %d\n", node_id_array[i]); + for_each_cpu(cpu, node_mask) { + if (cpu_index < nr_queues) { + map[cpu_index++] = queue_offset + (cpu % nr_queues); + } else { + first_sibling = sssraid_get_first_sibling(cpu); + if (first_sibling == cpu) + map[cpu_index++] = queue_offset + (cpu % nr_queues); + else + map[cpu_index++] = map[first_sibling]; + } + dbgprint(sdioc, "map[%d] = %d\n", cpu_index - 1, map[cpu_index - 1]); + } + } + + return 0; +} + /* queuecommand call back */ static int sssraid_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *scmd) @@ -1989,6 +2064,7 @@ static struct scsi_host_template sssraid_driver_template = { .name = "3SNIC Logic sssraid driver", .proc_name = "sssraid", .queuecommand = sssraid_qcmd, + .map_queues = sssraid_map_queues, .slave_alloc = sssraid_slave_alloc, .slave_destroy = sssraid_slave_destroy, .slave_configure = sssraid_slave_configure, @@ -2330,7 +2406,7 @@ static void __exit sssraid_exit(void) pci_unregister_driver(&sssraid_pci_driver); } -MODULE_AUTHOR("liangry1@3snic.com"); +MODULE_AUTHOR("steven.song@3snic.com"); MODULE_DESCRIPTION("3SNIC Information Technology SSSRAID Driver"); MODULE_LICENSE("GPL"); MODULE_VERSION(SSSRAID_DRIVER_VERSION); -- GitLab