[PATCH 2/2] staging: greybus: loopback: fix oops on rmmod gb_loopback
Bryan O'Donoghue
pure.logic at nexus-software.ie
Sun Jan 8 15:27:19 UTC 2017
Doing an rmmod gb_loopback will cause an oops with the following backtrace.
Call Trace:
debugfs_remove+0xaf/0x180
gb_loopback_disconnect+0x36/0x160 [gb_loopback]
greybus_remove+0x87/0x1a0 [greybus]
device_release_driver_internal+0x14a/0x200
driver_detach+0x39/0x60
bus_remove_driver+0x47/0xa0
driver_unregister+0x27/0x50
greybus_deregister_driver+0xd/0x10 [greybus]
loopback_exit+0x1c/0x36 [gb_loopback]
SyS_delete_module+0x170/0x1b0
entry_SYSCALL_64_fastpath+0x13/0x93
This happens because gb_dev.root is removed prior to
greybus_deregister_driver which itself will trigger gb_loopback_disconnect
to run - leading to the parent of gb->file being NULL.
Typically up to this point when tearing down greybus modules we have
removed gb_es2 prior to removing gb_loopback. In this case gb_es2 will run
subordinate greybus->disconnect() routines. A subsequent rmmod of
gb_loopback then will not re-run gb_loopback_disconnect().
On project Ara the second module removal flow was the only practiced flow
hence it's only now in gbsim where we have more freedom to rmmod that this
bug is apparent. The fix itself is pretty straight-forward.
Signed-off-by: Bryan O'Donoghue <pure.logic at nexus-software.ie>
---
drivers/staging/greybus/loopback.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/staging/greybus/loopback.c b/drivers/staging/greybus/loopback.c
index 88d4f5c..8f3eb33 100644
--- a/drivers/staging/greybus/loopback.c
+++ b/drivers/staging/greybus/loopback.c
@@ -1260,9 +1260,9 @@ module_init(loopback_init);
static void __exit loopback_exit(void)
{
- debugfs_remove_recursive(gb_dev.root);
greybus_deregister(&gb_loopback_driver);
class_unregister(&loopback_class);
+ debugfs_remove_recursive(gb_dev.root);
ida_destroy(&loopback_ida);
}
module_exit(loopback_exit);
--
2.7.4
More information about the devel
mailing list