lkml.org 
[lkml]   [2019]   [Jul]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
From
SubjectRE: [PATCH] platform: release resource itself instead of resource tree
Date
Hi Greg,

Thank you for looking at it.

Below example is simplified description. Our detail problem is:
1. ACPI driver registers a MEM resource during bootup;
2. Our PUNIT(Intel CPU power management module) platform device reads ACPI driver's resource, and registers same MEM resource;
3. According to current resource management logic, if two resources are same, later registered resource will be parent. That is, PUNIT platform device's resource will be ACPI driver resource's parent.
4. PUNIT kernel module is removed, its resource will be removed. If we use original API "release_resource", ACPI driver's resource will be released as well because it is PUNIT device's child;
5. Next time PUNIT platform device kernel module is inserted, it might read wrong ACPI MEM resource because it has been released in step 4.

How should we handle this case? :)
We should not register same MEM resource in step 2? Or, make change in resource management logic, if two resources are same, later registered resource should be child instead of parent?

Thanks,
Junxiao

-----Original Message-----
From: Greg KH [mailto:gregkh@linuxfoundation.org]
Sent: Thursday, July 25, 2019 9:39 PM
To: Chang, Junxiao <junxiao.chang@intel.com>
Cc: linux-kernel@vger.kernel.org; rafael@kernel.org; Li, Lili <lili.li@intel.com>
Subject: Re: [PATCH] platform: release resource itself instead of resource tree

On Thu, Apr 25, 2019 at 02:24:18PM +0800, junxiao.chang@intel.com wrote:
> From: Junxiao Chang <junxiao.chang@intel.com>
>
> When platform device is deleted or there is error in adding device,
> platform device resources should be released. Currently API
> release_resource is used to release platform device resources.
> However, this API releases not only platform resource itself but also
> its child resources. It might release resources which are still in
> use. Calling remove_resource only releases current resource itself,
> not resource tree, it moves its child resources to up level.

But shouldn't the parent device not get removed until all of the children are removed? What is causing this "inversion" to happen?

>
> For example, platform device 1 and device 2 are registered, then only
> device 1 is unregistered in below code:
>
> ...
> // Register platform test device 1, resource 0xfed1a000 ~ 0xfed1afff
> pdev1 = platform_device_register_full(&pdevinfo1);
>
> // Register platform test device 2, resource 0xfed1a200 ~ 0xfed1a2ff
> pdev2 = platform_device_register_full(&pdevinfo2);
>
> // Now platform device 2 resource should be device 1 resource's
> child
>
> // Unregister device 1 only
> platform_device_unregister(pdev1);
> ...

Don't do that. :)

You created this mess of platform devices, so you need to keep track of them.


> Platform device 2 resource will be released as well because its parent
> resource(device 1's resource) is released, this is not expected.
> If using API remove_resource, device 2 resource will not be released.
>
> This change fixed an intel pmc platform device resource issue when
> intel pmc ipc kernel module is inserted/removed for twice.

Why not fix that kernel module instead? It seems like that is the real problem here, not a driver core issue.

thanks,

greg k-h

\
 
 \ /
  Last update: 2019-07-26 12:26    [W:0.049 / U:0.044 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site