Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

scsi: smartpqi: switch to pci_alloc_irq_vectors

Which cleans up a lot of the MSI-X handling, and allows us to use the
PCI IRQ layer provided vector mapping, which we can then expose to
blk-mq.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Acked-by: Don Brace <don.brace@microsemi.com>
Tested-by: Don Brace <don.brace@microsemi.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

authored by

Christoph Hellwig and committed by
Martin K. Petersen
52198226 2d9c5c20

+32 -72
-2
drivers/scsi/smartpqi/smartpqi.h
··· 929 929 int max_msix_vectors; 930 930 int num_msix_vectors_enabled; 931 931 int num_msix_vectors_initialized; 932 - u32 msix_vectors[PQI_MAX_MSIX_VECTORS]; 933 - void *intr_data[PQI_MAX_MSIX_VECTORS]; 934 932 int event_irq; 935 933 struct Scsi_Host *scsi_host; 936 934
+32 -70
drivers/scsi/smartpqi/smartpqi_init.c
··· 25 25 #include <linux/rtc.h> 26 26 #include <linux/bcd.h> 27 27 #include <linux/cciss_ioctl.h> 28 + #include <linux/blk-mq-pci.h> 28 29 #include <scsi/scsi_host.h> 29 30 #include <scsi/scsi_cmnd.h> 30 31 #include <scsi/scsi_device.h> ··· 2888 2887 2889 2888 static int pqi_request_irqs(struct pqi_ctrl_info *ctrl_info) 2890 2889 { 2890 + struct pci_dev *pdev = ctrl_info->pci_dev; 2891 2891 int i; 2892 2892 int rc; 2893 2893 2894 - ctrl_info->event_irq = ctrl_info->msix_vectors[0]; 2894 + ctrl_info->event_irq = pci_irq_vector(pdev, 0); 2895 2895 2896 2896 for (i = 0; i < ctrl_info->num_msix_vectors_enabled; i++) { 2897 - rc = request_irq(ctrl_info->msix_vectors[i], 2898 - pqi_irq_handler, 0, 2899 - DRIVER_NAME_SHORT, ctrl_info->intr_data[i]); 2897 + rc = request_irq(pci_irq_vector(pdev, i), pqi_irq_handler, 0, 2898 + DRIVER_NAME_SHORT, &ctrl_info->queue_groups[i]); 2900 2899 if (rc) { 2901 - dev_err(&ctrl_info->pci_dev->dev, 2900 + dev_err(&pdev->dev, 2902 2901 "irq %u init failed with error %d\n", 2903 - ctrl_info->msix_vectors[i], rc); 2902 + pci_irq_vector(pdev, i), rc); 2904 2903 return rc; 2905 2904 } 2906 2905 ctrl_info->num_msix_vectors_initialized++; ··· 2909 2908 return 0; 2910 2909 } 2911 2910 2912 - static void pqi_free_irqs(struct pqi_ctrl_info *ctrl_info) 2913 - { 2914 - int i; 2915 - 2916 - for (i = 0; i < ctrl_info->num_msix_vectors_initialized; i++) 2917 - free_irq(ctrl_info->msix_vectors[i], 2918 - ctrl_info->intr_data[i]); 2919 - } 2920 - 2921 2911 static int pqi_enable_msix_interrupts(struct pqi_ctrl_info *ctrl_info) 2922 2912 { 2923 - unsigned int i; 2924 - int max_vectors; 2925 - int num_vectors_enabled; 2926 - struct msix_entry msix_entries[PQI_MAX_MSIX_VECTORS]; 2913 + int ret; 2927 2914 2928 - max_vectors = ctrl_info->num_queue_groups; 2929 - 2930 - for (i = 0; i < max_vectors; i++) 2931 - msix_entries[i].entry = i; 2932 - 2933 - num_vectors_enabled = pci_enable_msix_range(ctrl_info->pci_dev, 2934 - msix_entries, PQI_MIN_MSIX_VECTORS, max_vectors); 2935 - 2936 - if (num_vectors_enabled < 0) { 2915 + ret = pci_alloc_irq_vectors(ctrl_info->pci_dev, 2916 + PQI_MIN_MSIX_VECTORS, ctrl_info->num_queue_groups, 2917 + PCI_IRQ_MSIX | PCI_IRQ_AFFINITY); 2918 + if (ret < 0) { 2937 2919 dev_err(&ctrl_info->pci_dev->dev, 2938 - "MSI-X init failed with error %d\n", 2939 - num_vectors_enabled); 2940 - return num_vectors_enabled; 2920 + "MSI-X init failed with error %d\n", ret); 2921 + return ret; 2941 2922 } 2942 2923 2943 - ctrl_info->num_msix_vectors_enabled = num_vectors_enabled; 2944 - for (i = 0; i < num_vectors_enabled; i++) { 2945 - ctrl_info->msix_vectors[i] = msix_entries[i].vector; 2946 - ctrl_info->intr_data[i] = &ctrl_info->queue_groups[i]; 2947 - } 2948 - 2924 + ctrl_info->num_msix_vectors_enabled = ret; 2949 2925 return 0; 2950 - } 2951 - 2952 - static void pqi_irq_set_affinity_hint(struct pqi_ctrl_info *ctrl_info) 2953 - { 2954 - int i; 2955 - int rc; 2956 - int cpu; 2957 - 2958 - cpu = cpumask_first(cpu_online_mask); 2959 - for (i = 0; i < ctrl_info->num_msix_vectors_initialized; i++) { 2960 - rc = irq_set_affinity_hint(ctrl_info->msix_vectors[i], 2961 - get_cpu_mask(cpu)); 2962 - if (rc) 2963 - dev_err(&ctrl_info->pci_dev->dev, 2964 - "error %d setting affinity hint for irq vector %u\n", 2965 - rc, ctrl_info->msix_vectors[i]); 2966 - cpu = cpumask_next(cpu, cpu_online_mask); 2967 - } 2968 - } 2969 - 2970 - static void pqi_irq_unset_affinity_hint(struct pqi_ctrl_info *ctrl_info) 2971 - { 2972 - int i; 2973 - 2974 - for (i = 0; i < ctrl_info->num_msix_vectors_initialized; i++) 2975 - irq_set_affinity_hint(ctrl_info->msix_vectors[i], NULL); 2976 2926 } 2977 2927 2978 2928 static int pqi_alloc_operational_queues(struct pqi_ctrl_info *ctrl_info) ··· 4695 4743 return 0; 4696 4744 } 4697 4745 4746 + static int pqi_map_queues(struct Scsi_Host *shost) 4747 + { 4748 + struct pqi_ctrl_info *ctrl_info = shost_to_hba(shost); 4749 + 4750 + return blk_mq_pci_map_queues(&shost->tag_set, ctrl_info->pci_dev); 4751 + } 4752 + 4698 4753 static int pqi_getpciinfo_ioctl(struct pqi_ctrl_info *ctrl_info, 4699 4754 void __user *arg) 4700 4755 { ··· 5089 5130 .ioctl = pqi_ioctl, 5090 5131 .slave_alloc = pqi_slave_alloc, 5091 5132 .slave_configure = pqi_slave_configure, 5133 + .map_queues = pqi_map_queues, 5092 5134 .sdev_attrs = pqi_sdev_attrs, 5093 5135 .shost_attrs = pqi_shost_attrs, 5094 5136 }; ··· 5119 5159 shost->cmd_per_lun = shost->can_queue; 5120 5160 shost->sg_tablesize = ctrl_info->sg_tablesize; 5121 5161 shost->transportt = pqi_sas_transport_template; 5122 - shost->irq = ctrl_info->msix_vectors[0]; 5162 + shost->irq = pci_irq_vector(ctrl_info->pci_dev, 0); 5123 5163 shost->unique_id = shost->irq; 5124 5164 shost->nr_hw_queues = ctrl_info->num_queue_groups; 5125 5165 shost->hostdata[0] = (unsigned long)ctrl_info; ··· 5369 5409 if (rc) 5370 5410 return rc; 5371 5411 5372 - pqi_irq_set_affinity_hint(ctrl_info); 5373 - 5374 5412 rc = pqi_create_queues(ctrl_info); 5375 5413 if (rc) 5376 5414 return rc; ··· 5515 5557 5516 5558 static void pqi_free_interrupts(struct pqi_ctrl_info *ctrl_info) 5517 5559 { 5518 - pqi_irq_unset_affinity_hint(ctrl_info); 5519 - pqi_free_irqs(ctrl_info); 5520 - if (ctrl_info->num_msix_vectors_enabled) 5521 - pci_disable_msix(ctrl_info->pci_dev); 5560 + int i; 5561 + 5562 + for (i = 0; i < ctrl_info->num_msix_vectors_initialized; i++) { 5563 + free_irq(pci_irq_vector(ctrl_info->pci_dev, i), 5564 + &ctrl_info->queue_groups[i]); 5565 + } 5566 + 5567 + pci_free_irq_vectors(ctrl_info->pci_dev); 5522 5568 } 5523 5569 5524 5570 static void pqi_free_ctrl_resources(struct pqi_ctrl_info *ctrl_info)