On Wed, Aug 01, 2018 at 05:18:25PM +0530, Varun Prakash wrote: > On Wed, Aug 01, 2018 at 08:33:23AM +0200, Hannes Reinecke wrote: > > On 07/31/2018 05:07 PM, Varun Prakash wrote: > > > If number of interrupt vectors are more than num_online_cpus() > > > then pci_alloc_irq_vectors_affinity() assigns cpumask based > > > on num_possible_cpus() to the remaining vectors because of > > > this interrupt does not generate for these vectors. > > > > > > This patch fixes this issue by using pci_alloc_irq_vectors() > > > instead of pci_alloc_irq_vectors_affinity(). > > > > > > Signed-off-by: Varun Prakash <varun@xxxxxxxxxxx> > > > --- > > > drivers/scsi/csiostor/csio_isr.c | 4 +--- > > > 1 file changed, 1 insertion(+), 3 deletions(-) > > > > > > > > > > > - cnt = pci_alloc_irq_vectors_affinity(hw->pdev, min, cnt, > > > - PCI_IRQ_MSIX | PCI_IRQ_AFFINITY, &desc); > > > + cnt = pci_alloc_irq_vectors(hw->pdev, min, cnt, PCI_IRQ_MSIX); > > > if (cnt < 0) > > > return cnt; > > > > > > > > Hmm. > > That patch (and the reasoning leading up to it) really sound dodgy. > > I'd rather fix the interrupt affinity code to handle this case correctly. > > Yes, it is better to fix the affinity assignment code, I posted > this patch to start a discussion on this issue. > > I can confirm that if number of interrupt vectors are more than > num_online cpus() then pci_alloc_irq_vectors_affinity() assigns > cpumask based on cpu_possible_mask to the remaining vectors. > > Following is the logic for creating affinity masks > > struct cpumask * > irq_create_affinity_masks(int nvecs, const struct irq_affinity *affd) > { > ... > /* Spread on present CPUs starting from affd->pre_vectors */ > usedvecs = irq_build_affinity_masks(affd, curvec, affvecs, > node_to_cpumask, cpu_present_mask, > nmsk, masks); > > /* > * Spread on non present CPUs starting from the next vector to be > * handled. If the spreading of present CPUs already exhausted the > * vector space, assign the non present CPUs to the already spread > * out vectors. > */ > if (usedvecs >= affvecs) > curvec = affd->pre_vectors; > else > curvec = affd->pre_vectors + usedvecs; > cpumask_andnot(npresmsk, cpu_possible_mask, cpu_present_mask); > usedvecs += irq_build_affinity_masks(affd, curvec, affvecs, > node_to_cpumask, npresmsk, > nmsk, masks); > ... > } > > > Thomas, can you help here? Any comments on this issue?