diff options
Diffstat (limited to 'lib/kobject.c')
-rw-r--r-- | lib/kobject.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/lib/kobject.c b/lib/kobject.c index 4a1f33d43548..1d46c151a4ae 100644 --- a/lib/kobject.c +++ b/lib/kobject.c | |||
@@ -545,8 +545,8 @@ static void kobject_cleanup(struct kobject *kobj) | |||
545 | struct kobj_type *t = get_ktype(kobj); | 545 | struct kobj_type *t = get_ktype(kobj); |
546 | const char *name = kobj->name; | 546 | const char *name = kobj->name; |
547 | 547 | ||
548 | pr_debug("kobject: '%s' (%p): %s\n", | 548 | pr_debug("kobject: '%s' (%p): %s, parent %p\n", |
549 | kobject_name(kobj), kobj, __func__); | 549 | kobject_name(kobj), kobj, __func__, kobj->parent); |
550 | 550 | ||
551 | if (t && !t->release) | 551 | if (t && !t->release) |
552 | pr_debug("kobject: '%s' (%p): does not have a release() " | 552 | pr_debug("kobject: '%s' (%p): does not have a release() " |
@@ -580,9 +580,25 @@ static void kobject_cleanup(struct kobject *kobj) | |||
580 | } | 580 | } |
581 | } | 581 | } |
582 | 582 | ||
583 | #ifdef CONFIG_DEBUG_KOBJECT_RELEASE | ||
584 | static void kobject_delayed_cleanup(struct work_struct *work) | ||
585 | { | ||
586 | kobject_cleanup(container_of(to_delayed_work(work), | ||
587 | struct kobject, release)); | ||
588 | } | ||
589 | #endif | ||
590 | |||
583 | static void kobject_release(struct kref *kref) | 591 | static void kobject_release(struct kref *kref) |
584 | { | 592 | { |
585 | kobject_cleanup(container_of(kref, struct kobject, kref)); | 593 | struct kobject *kobj = container_of(kref, struct kobject, kref); |
594 | #ifdef CONFIG_DEBUG_KOBJECT_RELEASE | ||
595 | pr_debug("kobject: '%s' (%p): %s, parent %p (delayed)\n", | ||
596 | kobject_name(kobj), kobj, __func__, kobj->parent); | ||
597 | INIT_DELAYED_WORK(&kobj->release, kobject_delayed_cleanup); | ||
598 | schedule_delayed_work(&kobj->release, HZ); | ||
599 | #else | ||
600 | kobject_cleanup(kobj); | ||
601 | #endif | ||
586 | } | 602 | } |
587 | 603 | ||
588 | /** | 604 | /** |