Skip to contentSkip to conversation

patch "Revert "kobject: Make sure the parent does not get released before" added to driver-core-linus

PATCH [email protected] 1 participant 1 message May 23, 2020

Subsystems (3)
lore
Share & tools
lore

[email protected]

author maintainer Applied
#0 lore raw

This is a note to let you know that I've just added the patch titled

Revert "kobject: Make sure the parent does not get released before

to my driver-core git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git
in the driver-core-linus branch.

The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)

The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.

If you have any questions about this process, please let me know.

From e6764aa0e5530066dd969eccea2a1a7d177859a8 Mon Sep 17 00:00:00 2001
From: Greg Kroah-Hartman <[email protected]>
Date: Sat, 23 May 2020 17:11:11 +0200
Subject: Revert "kobject: Make sure the parent does not get released before
its children"

This reverts commit 4ef12f7198023c09ad6d25b652bd8748c965c7fa.

Guenter reports:

All my arm64be (arm64 big endian) boot tests crash with this patch applied. Reverting it fixes the problem. Crash log and bisect results (from pending-fixes branch) below.

And also:
arm64 images don't crash but report lots of "poison overwritten" backtraces like the one below. On arm, I see "refcount_t:
underflow", also attached. I didn't bisect those, but given the context I would suspect the same culprit.

Cc Naresh Kamboju <[email protected]>
Cc kernel test robot <[email protected]>
Cc "Rafael J. Wysocki" <[email protected]>
Cc Heikki Krogerus <[email protected]>
Cc Brendan Higgins <[email protected]>
Cc Randy Dunlap <[email protected]>
Cc stable <[email protected]>
---
 lib/kobject.c | 30 ++++++++++--------------------
 1 file changed, 10 insertions(+), 20 deletions(-)
lib/kobject.c +10 -20
index 2bd631460e18..83198cb37d8d 100644
@@ -599,7 +599,14 @@ int kobject_move(struct kobject *kobj, struct kobject *new_parent)
 }
 EXPORT_SYMBOL_GPL(kobject_move);
 
-static void __kobject_del(struct kobject *kobj)
+/**
+ * kobject_del() - Unlink kobject from hierarchy.
+ * @kobj: object.
+ *
+ * This is the function that should be called to delete an object
+ * successfully added via kobject_add().
+ */
+void kobject_del(struct kobject *kobj)
 {
 	struct kernfs_node *sd;
 	const struct kobj_type *ktype;
@@ -618,23 +625,9 @@ static void __kobject_del(struct kobject *kobj)
 
 	kobj->state_in_sysfs = 0;
 	kobj_kset_leave(kobj);
+	kobject_put(kobj->parent);
 	kobj->parent = NULL;
 }
-
-/**
- * kobject_del() - Unlink kobject from hierarchy.
- * @kobj: object.
- *
- * This is the function that should be called to delete an object
- * successfully added via kobject_add().
- */
-void kobject_del(struct kobject *kobj)
-{
-	struct kobject *parent = kobj->parent;
-
-	__kobject_del(kobj);
-	kobject_put(parent);
-}
 EXPORT_SYMBOL(kobject_del);
 
 /**
@@ -670,7 +663,6 @@ EXPORT_SYMBOL(kobject_get_unless_zero);
  */
 static void kobject_cleanup(struct kobject *kobj)
 {
-	struct kobject *parent = kobj->parent;
 	struct kobj_type *t = get_ktype(kobj);
 	const char *name = kobj->name;
 
@@ -692,7 +684,7 @@ static void kobject_cleanup(struct kobject *kobj)
 	if (kobj->state_in_sysfs) {
 		pr_debug("kobject: '%s' (%p): auto cleanup kobject_del\n",
 			 kobject_name(kobj), kobj);
-		__kobject_del(kobj);
+		kobject_del(kobj);
 	}
 
 	if (t && t->release) {
@@ -706,8 +698,6 @@ static void kobject_cleanup(struct kobject *kobj)
 		pr_debug("kobject: '%s': free name\n", name);
 		kfree_const(name);
 	}
-
-	kobject_put(parent);
 }
 
 #ifdef CONFIG_DEBUG_KOBJECT_RELEASE
Signature · 1 line
2.26.2