lkml.org 
[lkml]   [2012]   [Mar]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    SubjectRe: [PATCH 08/23] PNPACPI: Fix device ref leaking in acpi_pnp_match
    From
    On Tue, Mar 6, 2012 at 12:13 AM, Yinghai Lu <yinghai@kernel.org> wrote:
    > During testing pci root bus removal, found some root bus bridge is not freed.
    >
    > If booting with pnpacpi=off, those hostbridge could be freed without problem.
    >
    > It turns out that some devices reference are not released during acpi_pnp_match.
    >
    > that match should not hold one device ref during every calling.
    >
    > Add put_device calling before returning.
    >
    > Signed-off-by: Yinghai Lu <yinghai@kernel.org>
    > Cc: stable@kernel.org
    > Cc: Len Brown <lenb@kernel.org>
    > Cc: Adam Belay <abelay@mit.edu>
    > Cc: Bjorn Helgaas <bhelgaas@google.com>
    > Cc: linux-acpi@vger.kernel.org
    > ---
    >  drivers/pnp/pnpacpi/core.c |    7 ++++++-
    >  1 files changed, 6 insertions(+), 1 deletions(-)
    >
    > diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c
    > index b00c176..d21e8f5 100644
    > --- a/drivers/pnp/pnpacpi/core.c
    > +++ b/drivers/pnp/pnpacpi/core.c
    > @@ -321,9 +321,14 @@ static int __init acpi_pnp_match(struct device *dev, void *_pnp)
    >  {
    >        struct acpi_device *acpi = to_acpi_device(dev);
    >        struct pnp_dev *pnp = _pnp;
    > +       struct device *physical_device;
    > +
    > +       physical_device = acpi_get_physical_device(acpi->handle);
    > +       if (physical_device)
    > +               put_device(physical_device);
    >
    >        /* true means it matched */
    > -       return !acpi_get_physical_device(acpi->handle)
    > +       return !physical_device
    >            && compare_pnp_id(pnp->id, acpi_device_hid(acpi));
    >  }
    >

    I spent about an hour convincing myself that this patch does the right
    thing. I *think* it does, but it certainly is not obvious. It's
    always nicer if the get/put are in the same function or in functions
    that obviously correspond to each other. But you didn't create this
    mess, so I don't hold you responsible for fixing it :)

    Bjorn
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2012-03-07 04:57    [W:0.029 / U:1.984 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site