Message ID | 20190212130439.14501-5-ming.lei@redhat.com (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
Series | genirq/affinity: add .calc_sets for improving IRQ allocation & spread | expand |
On Tue, Feb 12, 2019 at 09:04:39PM +0800, Ming Lei wrote: > Now NVMe has implemented the .calc_sets callback for caculating each > set's vectors. > > For other cases of multiple irq sets, it isn't a good way to pre-caculate > each set's vectors before allocating IRQ vectors because NVMe's same issue > exists too. s/irq/IRQ/ so it's consistent in the paragraph. > Document .calc_sets as required explicitly for multiple sets. > > Signed-off-by: Ming Lei <ming.lei@redhat.com> Acked-by: Bjorn Helgaas <bhelgaas@google.com> Note minor comments below. > --- > drivers/pci/msi.c | 4 ++-- > include/linux/interrupt.h | 3 ++- > 2 files changed, 4 insertions(+), 3 deletions(-) > > diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c > index 4c0b47867258..9f91fa713141 100644 > --- a/drivers/pci/msi.c > +++ b/drivers/pci/msi.c > @@ -1039,7 +1039,7 @@ static int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, > * If the caller is passing in sets, we can't support a range of > * vectors. The caller needs to handle that. Looks like this comment needs to be tweaked, maybe along the lines of: If the caller requests multiple sets of IRQs where each set requires different affinity, it must also supply a ->calc_sets() callback to compute the affinity cpumask for each set. (I'm not 100% clear on how calc_sets() works, so I might not have described this exactly right.) > */ > - if (affd && affd->nr_sets && minvec != maxvec) > + if (affd && affd->nr_sets > 1 && !affd->calc_sets) > return -EINVAL; > > if (WARN_ON_ONCE(dev->msi_enabled)) > @@ -1097,7 +1097,7 @@ static int __pci_enable_msix_range(struct pci_dev *dev, > * If the caller is passing in sets, we can't support a range of > * supported vectors. The caller needs to handle that. Similar comment update here? > */ > - if (affd && affd->nr_sets && minvec != maxvec) > + if (affd && affd->nr_sets > 1 && !affd->calc_sets) > return -EINVAL; > > if (WARN_ON_ONCE(dev->msix_enabled)) > diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h > index 7a27f6ba1f2f..a053f7fb0ff1 100644 > --- a/include/linux/interrupt.h > +++ b/include/linux/interrupt.h > @@ -269,7 +269,8 @@ struct irq_affinity_notify { > * the MSI(-X) vector space > * @nr_sets: Length of passed in *sets array > * @set_vectors: Number of affinitized sets > - * @calc_sets: Callback for caculating set vectors > + * @calc_sets: Callback for caculating set vectors, required for > + * multiple irq sets. > * @priv: Private data of @calc_sets > */ > struct irq_affinity { > -- > 2.9.5 >
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index 4c0b47867258..9f91fa713141 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c @@ -1039,7 +1039,7 @@ static int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, * If the caller is passing in sets, we can't support a range of * vectors. The caller needs to handle that. */ - if (affd && affd->nr_sets && minvec != maxvec) + if (affd && affd->nr_sets > 1 && !affd->calc_sets) return -EINVAL; if (WARN_ON_ONCE(dev->msi_enabled)) @@ -1097,7 +1097,7 @@ static int __pci_enable_msix_range(struct pci_dev *dev, * If the caller is passing in sets, we can't support a range of * supported vectors. The caller needs to handle that. */ - if (affd && affd->nr_sets && minvec != maxvec) + if (affd && affd->nr_sets > 1 && !affd->calc_sets) return -EINVAL; if (WARN_ON_ONCE(dev->msix_enabled)) diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index 7a27f6ba1f2f..a053f7fb0ff1 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h @@ -269,7 +269,8 @@ struct irq_affinity_notify { * the MSI(-X) vector space * @nr_sets: Length of passed in *sets array * @set_vectors: Number of affinitized sets - * @calc_sets: Callback for caculating set vectors + * @calc_sets: Callback for caculating set vectors, required for + * multiple irq sets. * @priv: Private data of @calc_sets */ struct irq_affinity {
Now NVMe has implemented the .calc_sets callback for caculating each set's vectors. For other cases of multiple irq sets, it isn't a good way to pre-caculate each set's vectors before allocating IRQ vectors because NVMe's same issue exists too. Document .calc_sets as required explicitly for multiple sets. Signed-off-by: Ming Lei <ming.lei@redhat.com> --- drivers/pci/msi.c | 4 ++-- include/linux/interrupt.h | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-)