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: <5AE40830.2090007@gmail.com> Date: Sat, 28 Apr 2018 11:05:44 +0530 From: arvindY <arvind.yadav.cs@...il.com> To: Michal Hocko <mhocko@...nel.org> Cc: gregkh@...uxfoundation.org, linux-kernel@...r.kernel.org Subject: Re: [PATCH] mm: memory_hotplug: use put_device() if device_register fail On Friday 27 April 2018 08:26 PM, Michal Hocko wrote: > On Thu 26-04-18 21:12:09, Arvind Yadav wrote: >> if device_register() returned an error. Always use put_device() >> to give up the initialized reference and release allocated memory. > Is this patch correct? The docummentation says > * NOTE: _Never_ directly free @dev after calling this function, even > * if it returned an error! Always use put_device() to give up your > * reference instead. > > but we do not have _our_ reference in this path AFAICS. Maybe this is > just a documentation issue? How have you tested this change btw.? The document is correct. Here device_register() will initialize object by making reference count as 1 and also increment reference count for device. device_register() { device_initialize()->kobject_init()->kref_init() - initialize object( reference count = 1). device_add()->get_device() - increment reference count for device. } If device_register() will fail then we have to release the object by making reference count 0. So we need to call put_object() which will release the object and other resources like memory etc. so long as the reference count is nonzero, the object continue to exist in memory. I have not tested this peace of code. But I have tested other code which is using Kboject. ~arvind > >> Signed-off-by: Arvind Yadav <arvind.yadav.cs@...il.com> >> --- >> drivers/base/memory.c | 8 +++++++- >> 1 file changed, 7 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/base/memory.c b/drivers/base/memory.c >> index bffe861..f5e5601 100644 >> --- a/drivers/base/memory.c >> +++ b/drivers/base/memory.c >> @@ -649,13 +649,19 @@ static const struct attribute_group *memory_memblk_attr_groups[] = { >> static >> int register_memory(struct memory_block *memory) >> { >> + int ret; >> + >> memory->dev.bus = &memory_subsys; >> memory->dev.id = memory->start_section_nr / sections_per_block; >> memory->dev.release = memory_block_release; >> memory->dev.groups = memory_memblk_attr_groups; >> memory->dev.offline = memory->state == MEM_OFFLINE; >> >> - return device_register(&memory->dev); >> + ret = device_register(&memory->dev); >> + if (ret) >> + put_device(&memory->dev); >> + >> + return ret; >> } >> >> static int init_memory_block(struct memory_block **memory, >> -- >> 2.7.4
Powered by blists - more mailing lists