From: Bjorn Helgaas <helgaas@kernel.org>
To: "Han / 한상우Sangwoo" <sangwoo.han@nearthlab.com>
Cc: jim2101024@gmail.com, florian.fainelli@broadcom.com,
lpieralisi@kernel.org, kwilczynski@kernel.org, mani@kernel.org,
bhelgaas@google.com, bcm-kernel-feedback-list@broadcom.com,
robh@kernel.org, linux-pci@vger.kernel.org,
linux-rpi-kernel@lists.infradead.org,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, Marc Zyngier <maz@kernel.org>,
Thomas Gleixner <tglx@kernel.org>
Subject: Re: [PATCH] PCI: brcmstb: Reserve only the MSI vectors that are handed out
Date: Tue, 4 Aug 2026 07:50:57 -0500 [thread overview]
Message-ID: <20260804125057.GA1834533@bhelgaas> (raw)
In-Reply-To: <CAFg7d9YX3dXYHFvhXX6VBR_Wd5QzAD77Rgugso5sYD-SwANnLQ@mail.gmail.com>
[+cc Marc, author of 4615fbc3788d ("genirq/irqdomain: Don't try to
free an interrupt that has no mapping"), Thomas; beginning of thread
about multiple MSI vector alloc/free:
https://lore.kernel.org/all/20260730072215.2090974-1-sangwoo.han@nearthlab.com]
On Tue, Aug 04, 2026 at 08:31:23PM +0900, Han / 한상우Sangwoo wrote:
> > Several other PCI controller drivers have similar code.
>
> I agree - eleven of them look like they can have the same problem.
>
> > I think we should fix them all at once (or explain why they don't need
> > similar fixes). Might be worth a little helper so they all work the
> > same way (e.g., some use order_base_2(), others use get_count_order(),
> > which seems like a pointless difference).
>
> I am working on a related fix for drivers/irqchip/irq-bcm2712-mip.c,
Similar pattern there, but it uses ilog2(), which differs from
order_base_2() and get_count_order() in more cases.
> which I can test here. I would rather not send changes to drivers I
> cannot test, though, so I am leaving the eleven to whoever has the boards.
> What I looked at is in the appendix, in case it is useful to them.
>
> Two things seem more useful from where I am sitting.
>
> - The failure is silent. Appendix A describes the symptom, so that
> anyone who hits it later can find this thread.
>
> - The contract is not written down. It changed in 4615fbc3788d, where
> irq_domain_free_irqs_hierarchy() started freeing one vector at a time.
>
> order_base_2() and get_count_order() give the same answer for any
> nr_irqs >= 1, so consolidating those two is just cleanup. Where a shared
> helper should live I am not sure either.
I don't know either, but I hate fixing an issue in one place and
leaving the same issue unfixed nearby.
> Appendix A - the symptom
> ========================
>
> A PCIe device whose driver is unbound and rebound a few times, or whose
> module is reloaded, ends up with fewer MSI vectors than it asked for. It
> does not recover until reboot.
>
> Two things have to be true for it to happen: the device uses multi-MSI,
> and the vector count it asks for is not a power of two. Devices that ask
> for a power of two are unaffected, and so is anything on MSI-X.
>
> I have only seen the reduced-vector case. A driver that insists on the
> full count would fail to probe instead, but I have not seen that happen.
>
>
> Appendix B - how I sorted the drivers
> =====================================
>
> I went through drivers/pci/controller/ while working out what my own fix
> had to do, so this is that rather than a full audit. Twenty of the
> drivers own an MSI hwirq pool. I asked three things about each:
>
> - does .alloc reserve a rounded-up block, or a single slot
> - does the core hand .free one vector at a time
> - can nr_irqs > 1 reach the driver at all
>
> Eleven answer yes to all three:
>
> dwc/pcie-designware-host.c pci-aardvark.c pcie-apple.c
> pcie-aspeed.c pcie-iproc-msi.c pcie-mediatek-gen3.c
> pcie-rcar-host.c pcie-rzg3s-host.c pcie-xilinx-dma-pl.c
> pcie-xilinx-nwl.c pci-hyperv.c
>
> The other nine:
>
> - five reserve a single slot, so nothing rounds up:
> mobiveil/pcie-mobiveil-host.c, pci-xgene-msi.c, pcie-altera-msi.c,
> pcie-mediatek.c, plda/pcie-plda-host.c
>
> - vmd.c keeps a per-vector refcount instead of a bitmap
>
> - pci-tegra.c and pcie-xilinx.c reserve a rounded-up block, but neither
> lists MSI_FLAG_MULTI_PCI_MSI in msi_parent_ops.supported_flags
>
> - pcie-brcmstb.c is the one you applied
prev parent reply other threads:[~2026-08-04 12:51 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-30 7:22 [PATCH] PCI: brcmstb: Reserve only the MSI vectors that are handed out Sangwoo Han
2026-08-03 16:11 ` Manivannan Sadhasivam
2026-08-03 22:22 ` Bjorn Helgaas
2026-08-04 11:31 ` Han / 한상우Sangwoo
2026-08-04 12:50 ` Bjorn Helgaas [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260804125057.GA1834533@bhelgaas \
--to=helgaas@kernel.org \
--cc=bcm-kernel-feedback-list@broadcom.com \
--cc=bhelgaas@google.com \
--cc=florian.fainelli@broadcom.com \
--cc=jim2101024@gmail.com \
--cc=kwilczynski@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=linux-rpi-kernel@lists.infradead.org \
--cc=lpieralisi@kernel.org \
--cc=mani@kernel.org \
--cc=maz@kernel.org \
--cc=robh@kernel.org \
--cc=sangwoo.han@nearthlab.com \
--cc=tglx@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox