lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-Id: <1556173458-9318-1-git-send-email-junxiao.chang@intel.com> Date: Thu, 25 Apr 2019 14:24:18 +0800 From: junxiao.chang@...el.com To: linux-kernel@...r.kernel.org Cc: gregkh@...uxfoundation.org, rafael@...nel.org, junxiao.chang@...el.com, lili.li@...el.com Subject: [PATCH] platform: release resource itself instead of resource tree From: Junxiao Chang <junxiao.chang@...el.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. 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); ... 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. Signed-off-by: Junxiao Chang <junxiao.chang@...el.com> --- drivers/base/platform.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/base/platform.c b/drivers/base/platform.c index dab0a5a..5fd1a41 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c @@ -461,7 +461,7 @@ int platform_device_add(struct platform_device *pdev) while (--i >= 0) { struct resource *r = &pdev->resource[i]; if (r->parent) - release_resource(r); + remove_resource(r); } err_out: @@ -492,7 +492,7 @@ void platform_device_del(struct platform_device *pdev) for (i = 0; i < pdev->num_resources; i++) { struct resource *r = &pdev->resource[i]; if (r->parent) - release_resource(r); + remove_resource(r); } } } -- 2.7.4
Powered by blists - more mailing lists