[PATCH] genirq/msi: Fix fwnode leak

From: Alex Williamson
Date: Wed Jan 25 2023 - 18:14:46 EST


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@xxxxxxxxxx>
---
kernel/irq/msi.c | 3 +++
1 file changed, 3 insertions(+)

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: