Skip to contentSkip to conversation

kobject: mark object as not initialized after release

PATCH In review Laura Abbott 2 participants 2 messages Jun 2, 2011

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 kobject: mark object as not initialized after release

During kobject initalization, state_initialized is set to 1. This state is never set back to 0, even after release. This results in re-initialized object warnings if the kobject needs to be reinitialized after release. On a statically allocated platform device and driver:

platform_device_register(&my_device)
platform_driver_register(&my_matching_driver)
platform_device_unregister(&my_device)
platform_device_register(&my_device)

gives

kobject (bf000128): tried to init an initialized object, something is seriously wrong.
[<c0053964>] (unwind_backtrace+0x0/0x128) from [<c02bd444>] (kobject_init+0x38/0x8c)
[<c02bd444>] (kobject_init+0x38/0x8c) from [<c03445cc>] (device_initialize+0x20/0x68)
[<c03445cc>] (device_initialize+0x20/0x68) from [<c0348924>] (platform_device_register+0x10/0x1c) [<c0348924>] (platform_device_register+0x10/0x1c) from [<bf00305c>] (platform_driver_test_init+0x5c/0x7c [platform_driver_test]) [<bf00305c>] (platform_driver_test_init+0x5c/0x7c [platform_driver_test]) from [<c00466e8>] (do_one_initcall+0xd0/0x1a4) [<c00466e8>] (do_one_initcall+0xd0/0x1a4) from [<c0109ea4>] (sys_init_module+0x90/0x1ac)

since the kobject that is part of the platform device (mydevice.dev.kobj) never had the state_initialized reset despite eventually calling kobject_release.

Fix this by setting state_initialized on a released kobject back to 0 as any state referenced after releasing is undefined.

---
 lib/kobject.c |    5 ++++-
 1 files changed, 4 insertions(+), 1 deletions(-)
lib/kobject.c +4 -1
index 82dc34c..00390e3 100644
@@ -577,7 +577,10 @@ static void kobject_cleanup(struct kobject *kobj)
 
 static void kobject_release(struct kref *kref)
 {
-	kobject_cleanup(container_of(kref, struct kobject, kref));
+	struct kobject *kobj = container_of(kref, struct kobject, kref);
+
+	kobject_cleanup(kobj);
+	kobj->state_initialized = 0;
 }
 
 /**
Signature · 1 line
1.7.3.3
#1 lore raw
Quoted 20 lines · Laura Abbott

During kobject initalization, state_initialized is set to 1. This state is never set back to 0, even after release. This results in re-initialized object warnings if the kobject needs to be reinitialized after release. On a statically allocated platform device and driver:

platform_device_register(&my_device)
platform_driver_register(&my_matching_driver)
platform_device_unregister(&my_device)
platform_device_register(&my_device)

gives

kobject (bf000128): tried to init an initialized object, something is seriously wrong.
[<c0053964>] (unwind_backtrace+0x0/0x128) from [<c02bd444>] (kobject_init+0x38/0x8c)
[<c02bd444>] (kobject_init+0x38/0x8c) from [<c03445cc>] (device_initialize+0x20/0x68)
[<c03445cc>] (device_initialize+0x20/0x68) from [<c0348924>] (platform_device_register+0x10/0x1c) [<c0348924>] (platform_device_register+0x10/0x1c) from [<bf00305c>] (platform_driver_test_init+0x5c/0x7c [platform_driver_test]) [<bf00305c>] (platform_driver_test_init+0x5c/0x7c [platform_driver_test]) from [<c00466e8>] (do_one_initcall+0xd0/0x1a4) [<c00466e8>] (do_one_initcall+0xd0/0x1a4) from [<c0109ea4>] (sys_init_module+0x90/0x1ac)

Quoted 5 lines

since the kobject that is part of the platform device (mydevice.dev.kobj) never had the state_initialized reset despite eventually calling kobject_release.

Fix this by setting state_initialized on a released kobject back to 0 as any state referenced after releasing is undefined.

Nope.

We've been through this before numerous times, please see the archives for why I will not accept this change (hint, don't use a static kobject. If you do, you had better know exactly how to use it correctly...)

Quoted 10 lines
---
 lib/kobject.c |    5 ++++-
 1 files changed, 4 insertions(+), 1 deletions(-)
lib/kobject.c +0 -0
index 82dc34c..00390e3 100644

lib/kobject.c static void kobject_cleanup(struct kobject *kobj) · line 584

Quoted 9 lines
lib/kobject.c +4 -1
@@ -577,7 +577,10 @@ static void kobject_cleanup(struct kobject *kobj)
 
 static void kobject_release(struct kref *kref)
 {
-	kobject_cleanup(container_of(kref, struct kobject, kref));
+	struct kobject *kobj = container_of(kref, struct kobject, kref);
+
+	kobject_cleanup(kobj);
+	kobj->state_initialized = 0;
 }

You really didn't test this code, did you. It's totally broken and will cause crashes all over the place (hint, run it with slab debugging...)

{sigh}

greg k-h