genirq/msi: Fix fwnode leak

Message ID 167468839713.2297784.1309086853550595503.stgit@omen
State New
Headers
Series genirq/msi: Fix fwnode leak |

Commit Message

Alex Williamson Jan. 25, 2023, 11:13 p.m. UTC
  kmemleak is reporting pairs of leaked buffers when PCI devices are
unbound from their drivers.  One of these buffers contains the name of
the interrupt as generated for the msi_domain_template bundle in
msi_create_device_irq_domain().  This name is passed through
irq_domain_alloc_named_fwnode(), where an irqchip_rwid is allocated,
along with a separate allocation via kasprintf() for another copy of
the name.  These are the two leaked buffers.

Resolve this by adding the missing call to irq_domain_free_fwnode() in
msi_remove_device_irq_domain().

Fixes: 27a6dea3ebaa ("genirq/msi: Provide msi_create/free_device_irq_domain()")
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
---
 kernel/irq/msi.c |    3 +++
 1 file changed, 3 insertions(+)
  

Comments

Marc Zyngier Jan. 26, 2023, 8:10 a.m. UTC | #1
On Wed, 25 Jan 2023 23:13:48 +0000,
Alex Williamson <alex.williamson@redhat.com> wrote:
> 
> kmemleak is reporting pairs of leaked buffers when PCI devices are
> unbound from their drivers.  One of these buffers contains the name of
> the interrupt as generated for the msi_domain_template bundle in
> msi_create_device_irq_domain().  This name is passed through
> irq_domain_alloc_named_fwnode(), where an irqchip_rwid is allocated,
> along with a separate allocation via kasprintf() for another copy of
> the name.  These are the two leaked buffers.
> 
> Resolve this by adding the missing call to irq_domain_free_fwnode() in
> msi_remove_device_irq_domain().
> 
> Fixes: 27a6dea3ebaa ("genirq/msi: Provide msi_create/free_device_irq_domain()")
> Signed-off-by: Alex Williamson <alex.williamson@redhat.com>

Thomas has already queued this:

commit ac8f29aef2f1695956ff6773b33f975290437f29 (tip/irq/urgent)
Author: Jason Gunthorpe <jgg@ziepe.ca>
Date:   Tue Jan 17 15:16:17 2023 -0400

    genirq/msi: Free the fwnode created by msi_create_device_irq_domain()

which I assume will make it into Linus' tree shortly.

Thanks,

	M.
  

Patch

diff --git a/kernel/irq/msi.c b/kernel/irq/msi.c
index 955267bbc2be..66dc956505b8 100644
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -1015,6 +1015,7 @@  void msi_remove_device_irq_domain(struct device *dev, unsigned int domid)
 {
 	struct msi_domain_info *info;
 	struct irq_domain *domain;
+	struct fwnode_handle *fwnode;
 
 	msi_lock_descs(dev);
 
@@ -1025,7 +1026,9 @@  void msi_remove_device_irq_domain(struct device *dev, unsigned int domid)
 
 	dev->msi.data->__domains[domid].domain = NULL;
 	info = domain->host_data;
+	fwnode = domain->fwnode;
 	irq_domain_remove(domain);
+	irq_domain_free_fwnode(fwnode);
 	kfree(container_of(info, struct msi_domain_template, info));
 
 unlock: