Skip to contentSkip to conversation

fix broken topology functions

PATCH In review Matthew Dobson 2 participants 3 messages Dec 4, 2002 – Dec 5, 2002 Driver core

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 fix broken topology functions

Linus,
The register_(node|memblk)_driver functions are broken. Pat Mochel
recently updated sysfs to make sure that when you register a driver that it's associated devclass is already registered. The way node/memblk registration is done now is backwards and causes panic's on NUMA systems. Please apply this patch to fix it.

Cheers!

-Matt

drivers/base/memblk.c +2 -2
diff -Nur --exclude-from=/usr/src/.dontdiff linux-2.5.50-vanilla/drivers/base/memblk.c linux-2.5.50-topo_ordering/drivers/base/memblk.c
@@ -49,7 +49,7 @@
 
 static int __init register_memblk_type(void)
 {
-	driver_register(&memblk_driver);
-	return devclass_register(&memblk_devclass);
+	devclass_register(&memblk_devclass);
+	return driver_register(&memblk_driver);
 }
 postcore_initcall(register_memblk_type);
drivers/base/node.c +2 -2
diff -Nur --exclude-from=/usr/src/.dontdiff linux-2.5.50-vanilla/drivers/base/node.c linux-2.5.50-topo_ordering/drivers/base/node.c
@@ -93,7 +93,7 @@
 
 static int __init register_node_type(void)
 {
-	driver_register(&node_driver);
-	return devclass_register(&node_devclass);
+	devclass_register(&node_devclass);
+	return driver_register(&node_driver);
 }
 postcore_initcall(register_node_type);
#1 lore raw
Quoted 7 lines · Matthew Dobson

Linus,
The register_(node|memblk)_driver functions are broken. Pat Mochel
recently updated sysfs to make sure that when you register a driver that it's associated devclass is already registered. The way node/memblk registration is done now is backwards and causes panic's on NUMA systems. Please apply this patch to fix it.
Cheers!

That didn't check the return value of devclass_register():

Reorder devclass_register() and driver_register() so these things stop oopsing.

 memblk.c |    4 ++--
 node.c   |    4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)
drivers/base/memblk.c +2 -2
diff -urpN mm1-2.5.50/drivers/base/memblk.c mm1-2.5.50-1/drivers/base/memblk.c
@@ -49,7 +49,7 @@ int __init register_memblk(struct memblk
 
 static int __init register_memblk_type(void)
 {
-	driver_register(&memblk_driver);
-	return devclass_register(&memblk_devclass);
+	int error = devclass_register(&memblk_devclass);
+	return error ? error : driver_register(&memblk_driver);
 }
 postcore_initcall(register_memblk_type);
drivers/base/node.c +2 -2
diff -urpN mm1-2.5.50/drivers/base/node.c mm1-2.5.50-1/drivers/base/node.c
@@ -93,7 +93,7 @@ int __init register_node(struct node *no
 
 static int __init register_node_type(void)
 {
-	driver_register(&node_driver);
-	return devclass_register(&node_devclass);
+	int error = devclass_register(&node_devclass);
+	return error ? error : driver_register(&node_driver);
 }
 postcore_initcall(register_node_type);
#2 lore raw
Quoted 8 lines · William Lee Irwin III
Quoted 4 lines · Matthew Dobson

Linus,
The register_(node|memblk)_driver functions are broken. Pat Mochel
recently updated sysfs to make sure that when you register a driver that it's associated devclass is already registered. The way node/memblk registration is done now is backwards and causes panic's on NUMA systems. Please apply this patch to fix it. Cheers!

Quoted 6 lines

That didn't check the return value of devclass_register():

Reorder devclass_register() and driver_register() so these things stop oopsing.

Even better. Thanks Bill!

Cheers!

-Matt

Quoted 33 lines
 memblk.c |    4 ++--
 node.c   |    4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff -urpN mm1-2.5.50/drivers/base/memblk.c mm1-2.5.50-1/drivers/base/memblk.c

drivers/base/memblk.c +2 -2
@@ -49,7 +49,7 @@ int __init register_memblk(struct memblk
 
 static int __init register_memblk_type(void)
 {
-	driver_register(&memblk_driver);
-	return devclass_register(&memblk_devclass);
+	int error = devclass_register(&memblk_devclass);
+	return error ? error : driver_register(&memblk_driver);
 }
 postcore_initcall(register_memblk_type);

diff -urpN mm1-2.5.50/drivers/base/node.c mm1-2.5.50-1/drivers/base/node.c

drivers/base/node.c +2 -2
@@ -93,7 +93,7 @@ int __init register_node(struct node *no
 
 static int __init register_node_type(void)
 {
-	driver_register(&node_driver);
-	return devclass_register(&node_devclass);
+	int error = devclass_register(&node_devclass);
+	return error ? error : driver_register(&node_driver);
 }
 postcore_initcall(register_node_type);