Commit ab072681 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'irq_urgent_for_v6.2_rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull irq fix from Borislav Petkov:

 - Cleanup the firmware node for the new IRQ MSI domain properly, to
   avoid leaking memory

* tag 'irq_urgent_for_v6.2_rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  genirq/msi: Free the fwnode created by msi_create_device_irq_domain()
parents bc6bc34b ac8f29ae
...@@ -114,7 +114,7 @@ void irq_domain_free_fwnode(struct fwnode_handle *fwnode) ...@@ -114,7 +114,7 @@ void irq_domain_free_fwnode(struct fwnode_handle *fwnode)
{ {
struct irqchip_fwid *fwid; struct irqchip_fwid *fwid;
if (WARN_ON(!is_fwnode_irqchip(fwnode))) if (!fwnode || WARN_ON(!is_fwnode_irqchip(fwnode)))
return; return;
fwid = container_of(fwnode, struct irqchip_fwid, fwnode); fwid = container_of(fwnode, struct irqchip_fwid, fwnode);
......
...@@ -1000,7 +1000,7 @@ bool msi_create_device_irq_domain(struct device *dev, unsigned int domid, ...@@ -1000,7 +1000,7 @@ bool msi_create_device_irq_domain(struct device *dev, unsigned int domid,
fail: fail:
msi_unlock_descs(dev); msi_unlock_descs(dev);
free_fwnode: free_fwnode:
kfree(fwnode); irq_domain_free_fwnode(fwnode);
free_bundle: free_bundle:
kfree(bundle); kfree(bundle);
return false; return false;
...@@ -1013,6 +1013,7 @@ bool msi_create_device_irq_domain(struct device *dev, unsigned int domid, ...@@ -1013,6 +1013,7 @@ bool msi_create_device_irq_domain(struct device *dev, unsigned int domid,
*/ */
void msi_remove_device_irq_domain(struct device *dev, unsigned int domid) void msi_remove_device_irq_domain(struct device *dev, unsigned int domid)
{ {
struct fwnode_handle *fwnode = NULL;
struct msi_domain_info *info; struct msi_domain_info *info;
struct irq_domain *domain; struct irq_domain *domain;
...@@ -1025,7 +1026,10 @@ void msi_remove_device_irq_domain(struct device *dev, unsigned int domid) ...@@ -1025,7 +1026,10 @@ void msi_remove_device_irq_domain(struct device *dev, unsigned int domid)
dev->msi.data->__domains[domid].domain = NULL; dev->msi.data->__domains[domid].domain = NULL;
info = domain->host_data; info = domain->host_data;
if (irq_domain_is_msi_device(domain))
fwnode = domain->fwnode;
irq_domain_remove(domain); irq_domain_remove(domain);
irq_domain_free_fwnode(fwnode);
kfree(container_of(info, struct msi_domain_template, info)); kfree(container_of(info, struct msi_domain_template, info));
unlock: unlock:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment