Re: [PATCH] hwmon: (pc87360) Fix device resource declaration

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



hi Jean

On Wed, Jul 7, 2010 at 6:58 AM, Jean Delvare <khali@xxxxxxxxxxxx> wrote:
> It's not OK to call platform_device_add_resources() multiple times
> in a row. Despite its name, this functions sets the resources, it
> doesn't add them. So we have to prepare an array with all the
> resources, and then call platform_device_add_resources() once.
>
> Before this fix, only the last I/O resource would be actually
> registered. The other I/O resources were leaked.
>
> Signed-off-by: Jean Delvare <khali@xxxxxxxxxxxx>
> Cc: Jim Cromie <jim.cromie@xxxxxxxxx>
> Cc: stable@xxxxxxxxxx
> ---
> Jim, do you still have your system with a PC8736x device? If you do,
> can you please test this fix and report? Thanks.

Its not handy, but I see about arranging access.

Did you catch this by inspection?
was there another thread that triggered your recollection/association ?
Any simple check for this ?
I dont suppose a /proc/<file> is gonna shout RESOURCE LEAK ..
that said, I'll look before&after for something more subtle.

thanks Jean
Jim

>
>  drivers/hwmon/pc87360.c |   30 ++++++++++++++++--------------
>  1 file changed, 16 insertions(+), 14 deletions(-)
>
> --- linux-2.6.35-rc4.orig/drivers/hwmon/pc87360.c       2010-05-17 18:20:27.000000000 +0200
> +++ linux-2.6.35-rc4/drivers/hwmon/pc87360.c    2010-07-07 14:11:03.000000000 +0200
> @@ -1610,11 +1610,8 @@ static struct pc87360_data *pc87360_upda
>
>  static int __init pc87360_device_add(unsigned short address)
>  {
> -       struct resource res = {
> -               .name   = "pc87360",
> -               .flags  = IORESOURCE_IO,
> -       };
> -       int err, i;
> +       struct resource res[3];
> +       int err, i, res_count;
>
>        pdev = platform_device_alloc("pc87360", address);
>        if (!pdev) {
> @@ -1623,22 +1620,27 @@ static int __init pc87360_device_add(uns
>                goto exit;
>        }
>
> +       memset(res, 0, 3 * sizeof(struct resource));
>        for (i = 0; i < 3; i++) {
>                if (!extra_isa[i])
>                        continue;
> -               res.start = extra_isa[i];
> -               res.end = extra_isa[i] + PC87360_EXTENT - 1;
> +               res[res_count].start = extra_isa[i];
> +               res[res_count].end = extra_isa[i] + PC87360_EXTENT - 1;
> +               res[res_count].name = "pc87360",
> +               res[res_count].flags = IORESOURCE_IO,
>
> -               err = acpi_check_resource_conflict(&res);
> +               err = acpi_check_resource_conflict(&res[res_count]);
>                if (err)
>                        goto exit_device_put;
>
> -               err = platform_device_add_resources(pdev, &res, 1);
> -               if (err) {
> -                       printk(KERN_ERR "pc87360: Device resource[%d] "
> -                              "addition failed (%d)\n", i, err);
> -                       goto exit_device_put;
> -               }
> +               res_count++;
> +       }
> +
> +       err = platform_device_add_resources(pdev, res, res_count);
> +       if (err) {
> +               printk(KERN_ERR "pc87360: Device resources addition failed "
> +                      "(%d)\n", err);
> +               goto exit_device_put;
>        }
>
>        err = platform_device_add(pdev);
>
>
> --
> Jean Delvare
>

_______________________________________________
lm-sensors mailing list
lm-sensors@xxxxxxxxxxxxxx
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors



[Index of Archives]     [Linux Kernel]     [Linux Hardware Monitoring]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux