diff mbox series

scsi: csiostor: remove automatic irq affinity assignment

Message ID 1533049669-10766-1-git-send-email-varun@chelsio.com (mailing list archive)
State Changes Requested
Headers show
Series scsi: csiostor: remove automatic irq affinity assignment | expand

Commit Message

Varun Prakash July 31, 2018, 3:07 p.m. UTC
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@chelsio.com>
---
 drivers/scsi/csiostor/csio_isr.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

Comments

Hannes Reinecke Aug. 1, 2018, 6:33 a.m. UTC | #1
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@chelsio.com>
> ---
>  drivers/scsi/csiostor/csio_isr.c | 4 +---
>  1 file changed, 1 insertion(+), 3 deletions(-)
> 
> diff --git a/drivers/scsi/csiostor/csio_isr.c b/drivers/scsi/csiostor/csio_isr.c
> index 7c88147..8b92c59 100644
> --- a/drivers/scsi/csiostor/csio_isr.c
> +++ b/drivers/scsi/csiostor/csio_isr.c
> @@ -480,7 +480,6 @@ csio_enable_msix(struct csio_hw *hw)
>  	int i, j, k, n, min, cnt;
>  	int extra = CSIO_EXTRA_VECS;
>  	struct csio_scsi_cpu_info *info;
> -	struct irq_affinity desc = { .pre_vectors = 2 };
>  
>  	min = hw->num_pports + extra;
>  	cnt = hw->num_sqsets + extra;
> @@ -491,8 +490,7 @@ csio_enable_msix(struct csio_hw *hw)
>  
>  	csio_dbg(hw, "FW supp #niq:%d, trying %d msix's\n", hw->cfg_niq, cnt);
>  
> -	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.
Thomas, can you help here?

Cheers,

Hannes
Varun Prakash Aug. 1, 2018, 11:48 a.m. UTC | #2
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@chelsio.com>
> > ---
> >  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?
>
Varun Prakash Aug. 9, 2018, 2:26 p.m. UTC | #3
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@chelsio.com>
> > > ---
> > >  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?
diff mbox series

Patch

diff --git a/drivers/scsi/csiostor/csio_isr.c b/drivers/scsi/csiostor/csio_isr.c
index 7c88147..8b92c59 100644
--- a/drivers/scsi/csiostor/csio_isr.c
+++ b/drivers/scsi/csiostor/csio_isr.c
@@ -480,7 +480,6 @@  csio_enable_msix(struct csio_hw *hw)
 	int i, j, k, n, min, cnt;
 	int extra = CSIO_EXTRA_VECS;
 	struct csio_scsi_cpu_info *info;
-	struct irq_affinity desc = { .pre_vectors = 2 };
 
 	min = hw->num_pports + extra;
 	cnt = hw->num_sqsets + extra;
@@ -491,8 +490,7 @@  csio_enable_msix(struct csio_hw *hw)
 
 	csio_dbg(hw, "FW supp #niq:%d, trying %d msix's\n", hw->cfg_niq, cnt);
 
-	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;