linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] PCI: vmd: Fix wrong kfree() in vmd_msi_free()
@ 2025-08-07  6:38 Nam Cao
  2025-08-07  9:02 ` Thomas Gleixner
  2025-08-07 12:24 ` Jinjie Ruan
  0 siblings, 2 replies; 3+ messages in thread
From: Nam Cao @ 2025-08-07  6:38 UTC (permalink / raw)
  To: Nirmal Patel, Jonathan Derrick, Lorenzo Pieralisi,
	Krzysztof Wilczyński, Manivannan Sadhasivam, Rob Herring,
	Bjorn Helgaas, Thomas Gleixner, linux-pci, linux-kernel
  Cc: Nam Cao, Kenneth Crudup, Ammar Faizi

vmd_msi_alloc() allocates struct vmd_irq and stashes it into
irq_domain->irq-data->chip_data. vmd_msi_free() extracts the pointer by
calling irq_get_chip_data() and frees it.

irq_get_chip_data() returns the chip_data of the top interrupt domain. This
worked in the past, because VMD's interrupt domain was the top domain.

But since commit d7d8ab87e3e7 ("PCI: vmd: Switch to
msi_create_parent_irq_domain()") changed the interrupt domain hierarchy,
VMD's interrupt domain is not the top domain anymore. irq_get_chip_data()
now returns the chip_data of the MSI devices' interrupt domain. It is
therefore broken for vmd_msi_free() to kfree() this irq_data.

Fix this issue, correctly extract the chip_data of VMD's interrupt domain.

Fixes: d7d8ab87e3e7 ("PCI: vmd: Switch to msi_create_parent_irq_domain()")
Reported-by: Kenneth Crudup <kenny@panix.com>
Closes: https://lore.kernel.org/linux-pci/dfa40e48-8840-4e61-9fda-25cdb3ad81c1@panix.com/
Reported-by: Ammar Faizi <ammarfaizi2@gnuweeb.org>
Closes: https://lore.kernel.org/linux-pci/ed53280ed15d1140700b96cca2734bf327ee92539e5eb68e80f5bbbf0f01@linux.gnuweeb.org/
Tested-by: Ammar Faizi <ammarfaizi2@gnuweeb.org>
Tested-by: Kenneth Crudup <kenny@panix.com>
Signed-off-by: Nam Cao <namcao@linutronix.de>
---
 drivers/pci/controller/vmd.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c
index 9bbb0ff4cc15..b679c7f28f51 100644
--- a/drivers/pci/controller/vmd.c
+++ b/drivers/pci/controller/vmd.c
@@ -280,10 +280,12 @@ static int vmd_msi_alloc(struct irq_domain *domain, unsigned int virq,
 static void vmd_msi_free(struct irq_domain *domain, unsigned int virq,
 			 unsigned int nr_irqs)
 {
+	struct irq_data *irq_data;
 	struct vmd_irq *vmdirq;
 
 	for (int i = 0; i < nr_irqs; ++i) {
-		vmdirq = irq_get_chip_data(virq + i);
+		irq_data = irq_domain_get_irq_data(domain, virq + i);
+		vmdirq = irq_data->chip_data;
 
 		synchronize_srcu(&vmdirq->irq->srcu);
 
-- 
2.39.5


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] PCI: vmd: Fix wrong kfree() in vmd_msi_free()
  2025-08-07  6:38 [PATCH] PCI: vmd: Fix wrong kfree() in vmd_msi_free() Nam Cao
@ 2025-08-07  9:02 ` Thomas Gleixner
  2025-08-07 12:24 ` Jinjie Ruan
  1 sibling, 0 replies; 3+ messages in thread
From: Thomas Gleixner @ 2025-08-07  9:02 UTC (permalink / raw)
  To: Nam Cao, Nirmal Patel, Jonathan Derrick, Lorenzo Pieralisi,
	Krzysztof Wilczyński, Manivannan Sadhasivam, Rob Herring,
	Bjorn Helgaas, linux-pci, linux-kernel
  Cc: Nam Cao, Kenneth Crudup, Ammar Faizi

On Thu, Aug 07 2025 at 08:38, Nam Cao wrote:

> vmd_msi_alloc() allocates struct vmd_irq and stashes it into
> irq_domain->irq-data->chip_data. vmd_msi_free() extracts the pointer by
> calling irq_get_chip_data() and frees it.
>
> irq_get_chip_data() returns the chip_data of the top interrupt domain. This
> worked in the past, because VMD's interrupt domain was the top domain.
>
> But since commit d7d8ab87e3e7 ("PCI: vmd: Switch to
> msi_create_parent_irq_domain()") changed the interrupt domain hierarchy,
> VMD's interrupt domain is not the top domain anymore. irq_get_chip_data()
> now returns the chip_data of the MSI devices' interrupt domain. It is
> therefore broken for vmd_msi_free() to kfree() this irq_data.
>
> Fix this issue, correctly extract the chip_data of VMD's interrupt domain.
>
> Fixes: d7d8ab87e3e7 ("PCI: vmd: Switch to msi_create_parent_irq_domain()")
> Reported-by: Kenneth Crudup <kenny@panix.com>
> Closes: https://lore.kernel.org/linux-pci/dfa40e48-8840-4e61-9fda-25cdb3ad81c1@panix.com/
> Reported-by: Ammar Faizi <ammarfaizi2@gnuweeb.org>
> Closes: https://lore.kernel.org/linux-pci/ed53280ed15d1140700b96cca2734bf327ee92539e5eb68e80f5bbbf0f01@linux.gnuweeb.org/
> Tested-by: Ammar Faizi <ammarfaizi2@gnuweeb.org>
> Tested-by: Kenneth Crudup <kenny@panix.com>
> Signed-off-by: Nam Cao <namcao@linutronix.de>

Reviewed-by: Thomas Gleixner <tglx@linutronix.de>

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] PCI: vmd: Fix wrong kfree() in vmd_msi_free()
  2025-08-07  6:38 [PATCH] PCI: vmd: Fix wrong kfree() in vmd_msi_free() Nam Cao
  2025-08-07  9:02 ` Thomas Gleixner
@ 2025-08-07 12:24 ` Jinjie Ruan
  1 sibling, 0 replies; 3+ messages in thread
From: Jinjie Ruan @ 2025-08-07 12:24 UTC (permalink / raw)
  To: Nam Cao, Nirmal Patel, Jonathan Derrick, Lorenzo Pieralisi,
	Krzysztof Wilczyński, Manivannan Sadhasivam, Rob Herring,
	Bjorn Helgaas, Thomas Gleixner, linux-pci, linux-kernel
  Cc: Kenneth Crudup, Ammar Faizi



On 2025/8/7 14:38, Nam Cao wrote:
> vmd_msi_alloc() allocates struct vmd_irq and stashes it into
> irq_domain->irq-data->chip_data. vmd_msi_free() extracts the pointer by
> calling irq_get_chip_data() and frees it.
> 
> irq_get_chip_data() returns the chip_data of the top interrupt domain. This
> worked in the past, because VMD's interrupt domain was the top domain.
> 
> But since commit d7d8ab87e3e7 ("PCI: vmd: Switch to
> msi_create_parent_irq_domain()") changed the interrupt domain hierarchy,
> VMD's interrupt domain is not the top domain anymore. irq_get_chip_data()
> now returns the chip_data of the MSI devices' interrupt domain. It is
> therefore broken for vmd_msi_free() to kfree() this irq_data.
> 
> Fix this issue, correctly extract the chip_data of VMD's interrupt domain.
> 
> Fixes: d7d8ab87e3e7 ("PCI: vmd: Switch to msi_create_parent_irq_domain()")
> Reported-by: Kenneth Crudup <kenny@panix.com>
> Closes: https://lore.kernel.org/linux-pci/dfa40e48-8840-4e61-9fda-25cdb3ad81c1@panix.com/
> Reported-by: Ammar Faizi <ammarfaizi2@gnuweeb.org>
> Closes: https://lore.kernel.org/linux-pci/ed53280ed15d1140700b96cca2734bf327ee92539e5eb68e80f5bbbf0f01@linux.gnuweeb.org/
> Tested-by: Ammar Faizi <ammarfaizi2@gnuweeb.org>
> Tested-by: Kenneth Crudup <kenny@panix.com>
> Signed-off-by: Nam Cao <namcao@linutronix.de>
> ---
>  drivers/pci/controller/vmd.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c
> index 9bbb0ff4cc15..b679c7f28f51 100644
> --- a/drivers/pci/controller/vmd.c
> +++ b/drivers/pci/controller/vmd.c
> @@ -280,10 +280,12 @@ static int vmd_msi_alloc(struct irq_domain *domain, unsigned int virq,
>  static void vmd_msi_free(struct irq_domain *domain, unsigned int virq,
>  			 unsigned int nr_irqs)
>  {
> +	struct irq_data *irq_data;
>  	struct vmd_irq *vmdirq;
>  
>  	for (int i = 0; i < nr_irqs; ++i) {
> -		vmdirq = irq_get_chip_data(virq + i);
> +		irq_data = irq_domain_get_irq_data(domain, virq + i);
> +		vmdirq = irq_data->chip_data;

Reviewed-by: Jinjie Ruan <ruanjinjie@huawei.com>

>  
>  		synchronize_srcu(&vmdirq->irq->srcu);
>  

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2025-08-07 12:24 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-07  6:38 [PATCH] PCI: vmd: Fix wrong kfree() in vmd_msi_free() Nam Cao
2025-08-07  9:02 ` Thomas Gleixner
2025-08-07 12:24 ` Jinjie Ruan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).