genirq/msi: Take the per-device MSI lock before validating the control structure
Subsystems (3)
A message that is not in the archive (sent off-list or not yet received): [email protected]
The following commit has been merged into the irq/urgent branch of tip:
Commit-ID: 0af2795f936f1ea1f9f1497447145dfcc7ed2823 Gitweb: https://git.kernel.org/tip/0af2795f936f1ea1f9f1497447145dfcc7ed2823 Author: Marc Zyngier <[email protected]> AuthorDate: Mon, 20 Feb 2023 19:01:01 Committer: Thomas Gleixner <[email protected]> CommitterDate: Mon, 20 Feb 2023 22:29:54 +01:00
genirq/msi: Take the per-device MSI lock before validating the control structure
Calling msi_ctrl_valid() ultimately results in calling msi_get_device_domain(), which requires holding the device MSI lock.
However, in msi_domain_populate_irqs() the lock is taken right after having called msi_ctrl_valid(), which is just a tad too late.
Take the lock before invoking msi_ctrl_valid().
Fixes 40742716f294 ("genirq/msi: Make msi_add_simple_msi_descs() device domain aware")
Reported-by "Russell King (Oracle)" <[email protected]>
Signed-off-by Marc Zyngier <[email protected]>
Signed-off-by Thomas Gleixner <[email protected]>
--- kernel/irq/msi.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
kernel/irq/msi.c +6 -3
@@ -1084,10 +1084,13 @@ int msi_domain_populate_irqs(struct irq_domain *domain, struct device *dev,struct xarray *xa;int ret, virq; -if (!msi_ctrl_valid (dev, &ctrl)) -return -EINVAL ; -msi_lock_descs (dev); + +if (!msi_ctrl_valid (dev, &ctrl)) { + ret = -EINVAL ; + goto unlock; + } + ret =msi_domain_add_simple_msi_descs (dev, &ctrl);if (ret) goto unlock;