> Subject: [EXTERNAL] Re: [net-next,v3,4/6] net: mana: Use GIC functions to
> allocate global EQs
> 
> This is an AI-generated review of your patch. The human sending this email has
> considered the AI review valid, or at least plausible.
> 
> For local reproduction steps see
> https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fnetdev-
> ai.bots.linux.dev%2Fai-
> local.html&data=05%7C02%7Clongli%40microsoft.com%7Cb43e1b10bd564c760
> a4d08de7eb17c82%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C6390
> 87497958656662%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWU
> sIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%
> 7C0%7C%7C%7C&sdata=r63AcJ7Cd3APZSSpl4SPBcGxSdosinxkIurfTp9yZmc%3D&
> reserved=0
> ---
> net: mana: Use GIC functions to allocate global EQs
> 
> Replace the GDMA global interrupt setup code with the new GIC allocation and
> release functions for managing interrupt contexts.
> 
> > diff --git a/drivers/net/ethernet/microsoft/mana/gdma_main.c
> > b/drivers/net/ethernet/microsoft/mana/gdma_main.c
> > index c43fd8089e77..bdc9dc437fb7 100644
> > --- a/drivers/net/ethernet/microsoft/mana/gdma_main.c
> > +++ b/drivers/net/ethernet/microsoft/mana/gdma_main.c
> 
> [ ... ]
> 
> > @@ -2052,26 +1998,17 @@ static int mana_gd_setup_remaining_irqs(struct
> > pci_dev *pdev)  static void mana_gd_remove_irqs(struct pci_dev *pdev)
> > {
> >     struct gdma_context *gc = pci_get_drvdata(pdev);
> > -   struct gdma_irq_context *gic;
> >     int irq, i;
> >
> >     if (gc->max_num_msix < 1)
> >             return;
> >
> > -   for (i = 0; i < gc->max_num_msix; i++) {
> > -           irq = pci_irq_vector(pdev, i);
> > -           if (irq < 0)
> > -                   continue;
> > -
> > -           gic = xa_load(&gc->irq_contexts, i);
> > -           if (WARN_ON(!gic))
> > -                   continue;
> > -
> > +   for (i = 0; i < (gc->msi_sharing ? gc->max_num_msix : 1); i++) {
>                                                                ^^^ Does this 
> loop condition leak GIC
> references when msi_sharing is false?
> 
> When msi_sharing is false, the loop only releases the GIC at index 0.
> However, mana_gd_setup_dyn_irqs allocates GICs at indices 1 through nvec:
> 
> drivers/net/ethernet/microsoft/mana/gdma_main.c:mana_gd_setup_dyn_irqs()
> {
>     for (i = 1; i <= nvec; i++) {
>         gic = mana_gd_get_gic(gc, false, &i);
>         ...
>     }
> }
> 
> Each mana_gd_get_gic call initializes the GIC with refcount=1. These GICs at
> indices 1..nvec are never released because mana_gd_remove_irqs only processes
> index 0 when msi_sharing is false.
> 
> The old code iterated over all gc->max_num_msix entries unconditionally:
> 
>     for (i = 0; i < gc->max_num_msix; i++) {
>         ...
>         gic = xa_load(&gc->irq_contexts, i);
>         ...
>         free_irq(irq, gic);
>         xa_erase(&gc->irq_contexts, i);
>         kfree(gic);
>     }
> 
> This ensured every allocated GIC was freed. The new code with the conditional
> loop breaks this, resulting in:
> 
> 1. Leaked IRQ handlers - request_irq without matching free_irq for indices
>    1..nvec
> 2. Leaked gdma_irq_context memory - the GIC structures are never freed 3.
> Leaked xarray entries - the entries remain in gc->irq_contexts
> 
> Additionally, pci_free_irq_vectors is called immediately after the loop, which
> attempts to tear down MSI-X vectors while IRQ handlers at indices 1..nvec are
> still registered. Can this trigger warnings or use-after-free if an interrupt 
> fires
> during teardown?
> 
> The next commit in the series (4475f13983ab "net: mana: Allocate interrupt
> context for each EQ when creating vPort") adds per-EQ get/put of GICs, but the
> EQ teardown only drops the EQ's reference (refcount goes from 2 to 1). The 
> base
> reference from mana_gd_setup_dyn_irqs remains unreleased.

Thank you, I'm sending v4 to fix this.

Long


Reply via email to