Message ID | 1468933367-23159-7-git-send-email-eric.auger@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Tue, 19 Jul 2016, Eric Auger wrote: > +bool msi_doorbell_safe(void) > +{ > + struct irqchip_doorbell *db; > + bool irq_remapping = true; > + > + mutex_lock(&irqchip_doorbell_mutex); > + list_for_each_entry(db, &irqchip_doorbell_list, next) { > + irq_remapping &= db->info.irq_remapping; db->info.irq_remapping is set in msi_doorbell_register(). So you can keep book about that there. No need to iterate here. Thanks, tglx -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi, On 20/07/2016 10:12, Thomas Gleixner wrote: > On Tue, 19 Jul 2016, Eric Auger wrote: >> +bool msi_doorbell_safe(void) >> +{ >> + struct irqchip_doorbell *db; >> + bool irq_remapping = true; >> + >> + mutex_lock(&irqchip_doorbell_mutex); >> + list_for_each_entry(db, &irqchip_doorbell_list, next) { >> + irq_remapping &= db->info.irq_remapping; > > db->info.irq_remapping is set in msi_doorbell_register(). So you can keep book > about that there. No need to iterate here. Yes makes sense to store the info at registration time. Currently this function is not in any fast path but that's cleaner from a general perspective. I will need to do such iteration at un-registration though. Thanks Eric > > Thanks, > > tglx > > -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thu, 21 Jul 2016, Auger Eric wrote: > On 20/07/2016 10:12, Thomas Gleixner wrote: > > On Tue, 19 Jul 2016, Eric Auger wrote: > >> +bool msi_doorbell_safe(void) > >> +{ > >> + struct irqchip_doorbell *db; > >> + bool irq_remapping = true; > >> + > >> + mutex_lock(&irqchip_doorbell_mutex); > >> + list_for_each_entry(db, &irqchip_doorbell_list, next) { > >> + irq_remapping &= db->info.irq_remapping; > > > > db->info.irq_remapping is set in msi_doorbell_register(). So you can keep book > > about that there. No need to iterate here. > Yes makes sense to store the info at registration time. Currently this > function is not in any fast path but that's cleaner from a general > perspective. I will need to do such iteration at un-registration though. Two simple counter should be sufficient. nr_registered_bells; nr_remapped_bells; .... Thanks, tglx -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Thomas, On 22/07/2016 14:44, Thomas Gleixner wrote: > On Thu, 21 Jul 2016, Auger Eric wrote: >> On 20/07/2016 10:12, Thomas Gleixner wrote: >>> On Tue, 19 Jul 2016, Eric Auger wrote: >>>> +bool msi_doorbell_safe(void) >>>> +{ >>>> + struct irqchip_doorbell *db; >>>> + bool irq_remapping = true; >>>> + >>>> + mutex_lock(&irqchip_doorbell_mutex); >>>> + list_for_each_entry(db, &irqchip_doorbell_list, next) { >>>> + irq_remapping &= db->info.irq_remapping; >>> >>> db->info.irq_remapping is set in msi_doorbell_register(). So you can keep book >>> about that there. No need to iterate here. >> Yes makes sense to store the info at registration time. Currently this >> function is not in any fast path but that's cleaner from a general >> perspective. I will need to do such iteration at un-registration though. > > Two simple counter should be sufficient. > > nr_registered_bells; > nr_remapped_bells; Yes definitively smarter to use counters! mental viscosity. Thanks Eric > > .... > > Thanks, > > tglx > -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/include/linux/msi-doorbell.h b/include/linux/msi-doorbell.h index 146bfbc..9c30141 100644 --- a/include/linux/msi-doorbell.h +++ b/include/linux/msi-doorbell.h @@ -43,6 +43,13 @@ void msi_doorbell_unregister_global(struct irq_chip_msi_doorbell_info *db); */ int msi_doorbell_pages(unsigned int order); +/** + * msi_doorbell_safe: return whether all registered doorbells + * do implement irq_remapping and are safe to assign (coarse safety + * assessment) + */ +bool msi_doorbell_safe(void); + #else static inline struct irq_chip_msi_doorbell_info * @@ -61,6 +68,11 @@ msi_doorbell_pages(unsigned int order) return 0; } +static inline bool +msi_doorbell_safe(void) +{ + return true; +} #endif /* CONFIG_MSI_DOORBELL */ #endif diff --git a/kernel/irq/msi-doorbell.c b/kernel/irq/msi-doorbell.c index a5bde37..fa5b429 100644 --- a/kernel/irq/msi-doorbell.c +++ b/kernel/irq/msi-doorbell.c @@ -112,3 +112,18 @@ int msi_doorbell_pages(unsigned int order) return ret; } EXPORT_SYMBOL_GPL(msi_doorbell_pages); + +bool msi_doorbell_safe(void) +{ + struct irqchip_doorbell *db; + bool irq_remapping = true; + + mutex_lock(&irqchip_doorbell_mutex); + list_for_each_entry(db, &irqchip_doorbell_list, next) { + irq_remapping &= db->info.irq_remapping; + } + mutex_unlock(&irqchip_doorbell_mutex); + + return irq_remapping; +} +EXPORT_SYMBOL_GPL(msi_doorbell_safe); \ No newline at end of file
msi_doorbell_safe returns whether all the registered doorbells implement irq_remapping. When assigning a PCIe device whose host controller is upstream to an IOMMU, we currently do not know whether the MSI controller is upstream or downstream to the IOMMU. Signed-off-by: Eric Auger <eric.auger@redhat.com> --- include/linux/msi-doorbell.h | 12 ++++++++++++ kernel/irq/msi-doorbell.c | 15 +++++++++++++++ 2 files changed, 27 insertions(+)