i2o: fix notifiers when max_drivers is configured
PATCH 1/1 i2o: fix notifiers when max_drivers is configured
Maxinum number of I2O drivers which could be registered is configurable by max_drivers module parameter.
But the module parameter is ignored and default value (I2O_MAX_DRIVERS = 8) is used in the loops to notify all registered drivers.
--- drivers/message/i2o/driver.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
drivers/message/i2o/driver.c +7 -7
@@ -20,6 +20,7 @@#include <linux/workqueue.h> #include <linux/string.h> #include <linux/slab.h> +#include <linux/log2.h> #include "core.h" #define OSM_NAME "i2o"
@@ -260,7 +261,7 @@ void i2o_driver_notify_controller_add_alint i;struct i2o_driver *drv; -for (i =0 ; i <I2O_MAX_DRIVERS ; i++) { +for (i =0 ; i < i2o_max_drivers; i++) { drv = i2o_drivers[i];if (drv)
@@ -280,7 +281,7 @@ void i2o_driver_notify_controller_removeint i;struct i2o_driver *drv; -for (i =0 ; i <I2O_MAX_DRIVERS ; i++) { +for (i =0 ; i < i2o_max_drivers; i++) { drv = i2o_drivers[i];if (drv)
@@ -299,7 +300,7 @@ void i2o_driver_notify_device_add_all(stint i;struct i2o_driver *drv; -for (i =0 ; i <I2O_MAX_DRIVERS ; i++) { +for (i =0 ; i < i2o_max_drivers; i++) { drv = i2o_drivers[i];if (drv)
@@ -318,7 +319,7 @@ void i2o_driver_notify_device_remove_allint i;struct i2o_driver *drv; -for (i =0 ; i <I2O_MAX_DRIVERS ; i++) { +for (i =0 ; i < i2o_max_drivers; i++) { drv = i2o_drivers[i];if (drv)
@@ -340,8 +341,7 @@ int __init i2o_driver_init(void)spin_lock_init (&i2o_drivers_lock);if ((i2o_max_drivers <2 ) || (i2o_max_drivers >64 ) || - ((i2o_max_drivers ^ (i2o_max_drivers -1 )) != - (2 * i2o_max_drivers -1 ))) { + !is_power_of_2 (i2o_max_drivers)) {osm_warn ("max_drivers set to %d, but must be >=2 and <= 64 and " "a power of 2\n" , i2o_max_drivers); i2o_max_drivers =I2O_MAX_DRIVERS ;
@@ -349,7 +349,7 @@ int __init i2o_driver_init(void)osm_info ("max drivers = %d\n" , i2o_max_drivers); i2o_drivers = -kzalloc (i2o_max_drivers *sizeof (*i2o_drivers),GFP_KERNEL ); +kcalloc (i2o_max_drivers,sizeof (*i2o_drivers),GFP_KERNEL );if (!i2o_drivers)return -ENOMEM ;
Quoted 72 lines · On Sun, 20 May 2007 23:27:28 +0900 Akinobu Mita <[email protected]> wrote:
Maxinum number of I2O drivers which could be registered is configurable by
max_driversmodule parameter.But the module parameter is ignored and default value (
I2O_MAX_DRIVERS= 8) is used in the loops to notify all registered drivers.Cc Markus Lidel <[email protected]>Signed-off-by Akinobu Mita <[email protected]>--- drivers/message/i2o/driver.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)Index:
2.6-mm/drivers/message/i2o/driver.c
===================================================================drivers/message/i2o/driver.c +6
-6@@ -20,6 +20,7 @@#include <linux/workqueue.h> #include <linux/string.h> #include <linux/slab.h> +#include <linux/log2.h> #include "core.h" #define OSM_NAME "i2o"@@ -260,7 +261,7 @@ void i2o_driver_notify_controller_add_alint i;struct i2o_driver *drv; -for (i =0 ; i <I2O_MAX_DRIVERS ; i++) { +for (i =0 ; i < i2o_max_drivers; i++) { drv = i2o_drivers[i];if (drv)@@ -280,7 +281,7 @@ void i2o_driver_notify_controller_removeint i;struct i2o_driver *drv; -for (i =0 ; i <I2O_MAX_DRIVERS ; i++) { +for (i =0 ; i < i2o_max_drivers; i++) { drv = i2o_drivers[i];if (drv)@@ -299,7 +300,7 @@ void i2o_driver_notify_device_add_all(stint i;struct i2o_driver *drv; -for (i =0 ; i <I2O_MAX_DRIVERS ; i++) { +for (i =0 ; i < i2o_max_drivers; i++) { drv = i2o_drivers[i];if (drv)@@ -318,7 +319,7 @@ void i2o_driver_notify_device_remove_allint i;struct i2o_driver *drv; -for (i =0 ; i <I2O_MAX_DRIVERS ; i++) { +for (i =0 ; i < i2o_max_drivers; i++) { drv = i2o_drivers[i];if (drv)@@ -340,8 +341,7 @@ int __init i2o_driver_init(void)spin_lock_init (&i2o_drivers_lock);if ((i2o_max_drivers <2 ) || (i2o_max_drivers >64 ) || - ((i2o_max_drivers ^ (i2o_max_drivers -1 )) != - (2 * i2o_max_drivers -1 ))) { + !is_power_of_2 (i2o_max_drivers)) {osm_warn ("max_drivers set to %d, but must be >=2 and <= 64 and " "a power of 2\n" , i2o_max_drivers); i2o_max_drivers =I2O_MAX_DRIVERS ;
drivers/message/i2o/driver.c int __init i2o_driver_init(void) · line 355
Quoted 8 lines
drivers/message/i2o/driver.c +1
-1@@ -349,7 +349,7 @@ int __init i2o_driver_init(void)osm_info ("max drivers = %d\n" , i2o_max_drivers); i2o_drivers = -kzalloc (i2o_max_drivers *sizeof (*i2o_drivers),GFP_KERNEL ); +kcalloc (i2o_max_drivers,sizeof (*i2o_drivers),GFP_KERNEL );if (!i2o_drivers)return -ENOMEM ;
Is there any particular reason why i2o_max_drivers must be a power of two? It seems a peculiar constraint.
Quoted 13 lines · Andrew Morton
Review int __init i2o_driver_init(void) · line 347
Quoted 10 lines
(quoted diff) +1
-2@@ -340,8 +341,7 @@ int __init i2o_driver_init(void) spin_lock_init(&i2o_drivers_lock); if ((i2o_max_drivers < 2) || (i2o_max_drivers > 64) || - ((i2o_max_drivers ^ (i2o_max_drivers - 1)) != - (2 * i2o_max_drivers - 1))) { + !is_power_of_2(i2o_max_drivers)) { osm_warn("max_drivers set to %d, but must be >=2 and <= 64 and " "a power of 2\n", i2o_max_drivers); i2o_max_drivers = I2O_MAX_DRIVERS;Is there any particular reason why
i2o_max_driversmust be a power of two? It seems a peculiar constraint.
I can't find the reason.
Subject: [patch -mm] i2o: eliminate a peculiar constraint on i2o_max_drivers
There is no reason i2o_max_drivers must be a power of two. This patch eliminates such a constraint.
--- drivers/message/i2o/driver.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
drivers/message/i2o/driver.c +3 -5
@@ -20,7 +20,6 @@#include <linux/workqueue.h> #include <linux/string.h> #include <linux/slab.h> -#include <linux/log2.h> #include "core.h" #define OSM_NAME "i2o"
@@ -340,10 +339,9 @@ int __init i2o_driver_init(void)spin_lock_init (&i2o_drivers_lock); -if ((i2o_max_drivers <2 ) || (i2o_max_drivers >64 ) || - !is_power_of_2 (i2o_max_drivers)) { -osm_warn ("max_drivers set to %d, but must be >=2 and <= 64 and " -"a power of 2\n" , i2o_max_drivers); +if ((i2o_max_drivers <2 ) || (i2o_max_drivers >64 )) { +osm_warn ("max_drivers set to %d, but must be >=2 and <= 64\n" , + i2o_max_drivers); i2o_max_drivers =I2O_MAX_DRIVERS ; }osm_info ("max drivers = %d\n" , i2o_max_drivers);