Skip to contentSkip to conversation

module_param: avoid bool abuse, add bint for special cases.

PATCH Applied Rusty Russell 3 participants 3 messages Dec 15, 2011

Subsystems (8)
lore
Share & tools
lore
#0 lore raw

PATCH 2/15 module_param: avoid bool abuse, add bint for special cases.

For historical reasons, we allow module_param(bool) to take an int (or an unsigned int). That's going away.

A few drivers really want an int: they set it to -1 and a parameter will set it to 0 or 1. This sucks: reading them from sysfs will give 'Y' for both -1 and 1, but if we change it to an int, then the users might be broken (if they did "param" instead of "param=1").

Use a new 'bint' parser for them.

(ntfs has a different problem: it needs an int for debug_msgs because it's also exposed via sysctl.)

Cc Steve Glendinning <[email protected]>
Cc Jean Delvare <[email protected]>
Cc Guenter Roeck <guenter.roeck-IzeFyvvaP7pWk0Htik3J/[email protected]>
Cc Hoang-Nam Nguyen <[email protected]>
Cc Christoph Raisch <[email protected]>
Cc Roland Dreier <[email protected]>
Cc Sean Hefty <[email protected]>
Cc Hal Rosenstock <[email protected]>
Cc Anton Altaparmakov <[email protected]>
Cc Jaroslav Kysela <perex-/Fr2/[email protected]>
Cc Takashi Iwai <[email protected]>
Cc alsa-devel-K7yf7f+aM1XWsZ/[email protected]
---
 drivers/hwmon/emc2103.c                |    2 +-
 drivers/infiniband/hw/ehca/ehca_main.c |    2 +-
 drivers/s390/cio/cmf.c                 |    2 +-
 fs/ntfs/super.c                        |    2 +-
 include/linux/moduleparam.h            |    6 ++++++
 kernel/params.c                        |   24 ++++++++++++++++++++++++
 sound/pci/intel8x0.c                   |    4 ++--
 7 files changed, 36 insertions(+), 6 deletions(-)
drivers/hwmon/emc2103.c +1 -1
@@ -55,7 +55,7 @@ static const u8 REG_TEMP_MAX[4] = { 0x34
  * it.  Default is to leave the device in the state it's already in (-1).
  * This parameter allows APD mode to be optionally forced on or off */
 static int apd = -1;
-module_param(apd, bool, 0);
+module_param(apd, bint, 0);
 MODULE_PARM_DESC(init, "Set to zero to disable anti-parallel diode mode");
 
 struct temperature {
drivers/infiniband/hw/ehca/ehca_main.c +1 -1
@@ -82,7 +82,7 @@ module_param_named(port_act_time, ehca_p
 module_param_named(poll_all_eqs,  ehca_poll_all_eqs,  bool, S_IRUGO);
 module_param_named(static_rate,   ehca_static_rate,   int,  S_IRUGO);
 module_param_named(scaling_code,  ehca_scaling_code,  bool, S_IRUGO);
-module_param_named(lock_hcalls,   ehca_lock_hcalls,   bool, S_IRUGO);
+module_param_named(lock_hcalls,   ehca_lock_hcalls,   bint, S_IRUGO);
 module_param_named(number_of_cqs, ehca_max_cq,        int,  S_IRUGO);
 module_param_named(number_of_qps, ehca_max_qp,        int,  S_IRUGO);
 
drivers/s390/cio/cmf.c +1 -1
@@ -98,7 +98,7 @@ enum cmb_format {
  * enum cmb_format.
  */
 static int format = CMF_AUTODETECT;
-module_param(format, bool, 0444);
+module_param(format, bint, 0444);
 
 /**
  * struct cmb_operations - functions to use depending on cmb_format
fs/ntfs/super.c +1 -1
@@ -3198,7 +3198,7 @@ MODULE_DESCRIPTION("NTFS 1.2/3.x driver 
 MODULE_VERSION(NTFS_VERSION);
 MODULE_LICENSE("GPL");
 #ifdef DEBUG
-module_param(debug_msgs, bool, 0);
+module_param(debug_msgs, bint, 0);
 MODULE_PARM_DESC(debug_msgs, "Enable debug messages.");
 #endif
 
include/linux/moduleparam.h +6 -0
@@ -367,6 +367,12 @@ extern int param_set_invbool(const char 
 extern int param_get_invbool(char *buffer, const struct kernel_param *kp);
 #define param_check_invbool(name, p) __param_check(name, p, bool)
 
+/* An int, which can only be set like a bool (though it shows as an int). */
+extern struct kernel_param_ops param_ops_bint;
+extern int param_set_bint(const char *val, const struct kernel_param *kp);
+#define param_get_bint param_get_int
+#define param_check_bint param_check_int
+
 /**
  * module_param_array - a parameter which is an array of some type
  * @name: the name of the array variable
kernel/params.c +24 -0
@@ -369,6 +369,30 @@ struct kernel_param_ops param_ops_invboo
 };
 EXPORT_SYMBOL(param_ops_invbool);
 
+int param_set_bint(const char *val, const struct kernel_param *kp)
+{
+	struct kernel_param boolkp;
+	bool v;
+	int ret;
+
+	/* Match bool exactly, by re-using it. */
+	boolkp = *kp;
+	boolkp.arg = &v;
+	boolkp.flags |= KPARAM_ISBOOL;
+
+	ret = param_set_bool(val, &boolkp);
+	if (ret == 0)
+		*(int *)kp->arg = v;
+	return ret;
+}
+EXPORT_SYMBOL(param_set_bint);
+
+struct kernel_param_ops param_ops_bint = {
+	.set = param_set_bint,
+	.get = param_get_int,
+};
+EXPORT_SYMBOL(param_ops_bint);
+
 /* We break the rule and mangle the string. */
 static int param_array(const char *name,
 		       const char *val,
sound/pci/intel8x0.c +2 -2
@@ -95,13 +95,13 @@ module_param(ac97_quirk, charp, 0444);
 MODULE_PARM_DESC(ac97_quirk, "AC'97 workaround for strange hardware.");
 module_param(buggy_semaphore, bool, 0444);
 MODULE_PARM_DESC(buggy_semaphore, "Enable workaround for hardwares with problematic codec semaphores.");
-module_param(buggy_irq, bool, 0444);
+module_param(buggy_irq, bint, 0444);
 MODULE_PARM_DESC(buggy_irq, "Enable workaround for buggy interrupts on some motherboards.");
 module_param(xbox, bool, 0444);
 MODULE_PARM_DESC(xbox, "Set to 1 for Xbox, if you have problems with the AC'97 codec detection.");
 module_param(spdif_aclink, int, 0444);
 MODULE_PARM_DESC(spdif_aclink, "S/PDIF over AC-link.");
-module_param(inside_vm, bool, 0444);
+module_param(inside_vm, bint, 0444);
 MODULE_PARM_DESC(inside_vm, "KVM/Parallels optimization.");
 
 /* just for backward compatibility */

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html

Acked-by on v1 2/15
#1 lore raw

At Thu, 15 Dec 2011 13:32:26 +1030,

Quoted 14 lines · Rusty Russell

For historical reasons, we allow module_param(bool) to take an int (or an unsigned int). That's going away.

A few drivers really want an int: they set it to -1 and a parameter will set it to 0 or 1. This sucks: reading them from sysfs will give 'Y' for both -1 and 1, but if we change it to an int, then the users might be broken (if they did "param" instead of "param=1").

Use a new 'bint' parser for them.

(ntfs has a different problem: it needs an int for debug_msgs because it's also exposed via sysctl.)

Quoted 12 lines
Cc Steve Glendinning <[email protected]>
Cc Jean Delvare <[email protected]>
Cc Guenter Roeck <guenter.roeck-IzeFyvvaP7pWk0Htik3J/[email protected]>
Cc Hoang-Nam Nguyen <[email protected]>
Cc Christoph Raisch <[email protected]>
Cc Roland Dreier <[email protected]>
Cc Sean Hefty <[email protected]>
Cc Hal Rosenstock <[email protected]>
Cc Anton Altaparmakov <[email protected]>
Cc Jaroslav Kysela <perex-/Fr2/[email protected]>
Cc Takashi Iwai <[email protected]>

For the sound part,

It's a nice feature. I know many drivers can be replaced with bint gracefully now (e.g. i915 driver).

thanks,

Takashi

Quoted 124 lines
---
 drivers/hwmon/emc2103.c                |    2 +-
 drivers/infiniband/hw/ehca/ehca_main.c |    2 +-
 drivers/s390/cio/cmf.c                 |    2 +-
 fs/ntfs/super.c                        |    2 +-
 include/linux/moduleparam.h            |    6 ++++++
 kernel/params.c                        |   24 ++++++++++++++++++++++++
 sound/pci/intel8x0.c                   |    4 ++--
 7 files changed, 36 insertions(+), 6 deletions(-)
drivers/hwmon/emc2103.c +1 -1
@@ -55,7 +55,7 @@ static const u8 REG_TEMP_MAX[4] = { 0x34
  * it.  Default is to leave the device in the state it's already in (-1).
  * This parameter allows APD mode to be optionally forced on or off */
 static int apd = -1;
-module_param(apd, bool, 0);
+module_param(apd, bint, 0);
 MODULE_PARM_DESC(init, "Set to zero to disable anti-parallel diode mode");
 
 struct temperature {
drivers/infiniband/hw/ehca/ehca_main.c +1 -1
@@ -82,7 +82,7 @@ module_param_named(port_act_time, ehca_p
 module_param_named(poll_all_eqs,  ehca_poll_all_eqs,  bool, S_IRUGO);
 module_param_named(static_rate,   ehca_static_rate,   int,  S_IRUGO);
 module_param_named(scaling_code,  ehca_scaling_code,  bool, S_IRUGO);
-module_param_named(lock_hcalls,   ehca_lock_hcalls,   bool, S_IRUGO);
+module_param_named(lock_hcalls,   ehca_lock_hcalls,   bint, S_IRUGO);
 module_param_named(number_of_cqs, ehca_max_cq,        int,  S_IRUGO);
 module_param_named(number_of_qps, ehca_max_qp,        int,  S_IRUGO);
 
drivers/s390/cio/cmf.c +1 -1
@@ -98,7 +98,7 @@ enum cmb_format {
  * enum cmb_format.
  */
 static int format = CMF_AUTODETECT;
-module_param(format, bool, 0444);
+module_param(format, bint, 0444);
 
 /**
  * struct cmb_operations - functions to use depending on cmb_format
fs/ntfs/super.c +1 -1
@@ -3198,7 +3198,7 @@ MODULE_DESCRIPTION("NTFS 1.2/3.x driver 
 MODULE_VERSION(NTFS_VERSION);
 MODULE_LICENSE("GPL");
 #ifdef DEBUG
-module_param(debug_msgs, bool, 0);
+module_param(debug_msgs, bint, 0);
 MODULE_PARM_DESC(debug_msgs, "Enable debug messages.");
 #endif
 
include/linux/moduleparam.h +6 -0
@@ -367,6 +367,12 @@ extern int param_set_invbool(const char 
 extern int param_get_invbool(char *buffer, const struct kernel_param *kp);
 #define param_check_invbool(name, p) __param_check(name, p, bool)
 
+/* An int, which can only be set like a bool (though it shows as an int). */
+extern struct kernel_param_ops param_ops_bint;
+extern int param_set_bint(const char *val, const struct kernel_param *kp);
+#define param_get_bint param_get_int
+#define param_check_bint param_check_int
+
 /**
  * module_param_array - a parameter which is an array of some type
  * @name: the name of the array variable
kernel/params.c +24 -0
@@ -369,6 +369,30 @@ struct kernel_param_ops param_ops_invboo
 };
 EXPORT_SYMBOL(param_ops_invbool);
 
+int param_set_bint(const char *val, const struct kernel_param *kp)
+{
+	struct kernel_param boolkp;
+	bool v;
+	int ret;
+
+	/* Match bool exactly, by re-using it. */
+	boolkp = *kp;
+	boolkp.arg = &v;
+	boolkp.flags |= KPARAM_ISBOOL;
+
+	ret = param_set_bool(val, &boolkp);
+	if (ret == 0)
+		*(int *)kp->arg = v;
+	return ret;
+}
+EXPORT_SYMBOL(param_set_bint);
+
+struct kernel_param_ops param_ops_bint = {
+	.set = param_set_bint,
+	.get = param_get_int,
+};
+EXPORT_SYMBOL(param_ops_bint);
+
 /* We break the rule and mangle the string. */
 static int param_array(const char *name,
 		       const char *val,
sound/pci/intel8x0.c +1 -1
@@ -95,13 +95,13 @@ module_param(ac97_quirk, charp, 0444);
 MODULE_PARM_DESC(ac97_quirk, "AC'97 workaround for strange hardware.");
 module_param(buggy_semaphore, bool, 0444);
 MODULE_PARM_DESC(buggy_semaphore, "Enable workaround for hardwares with problematic codec semaphores.");
-module_param(buggy_irq, bool, 0444);
+module_param(buggy_irq, bint, 0444);

sound/pci/intel8x0.c module_param(ac97_quirk, charp, 0444); · line 107

Quoted 10 lines
sound/pci/intel8x0.c +1 -1
 MODULE_PARM_DESC(buggy_irq, "Enable workaround for buggy interrupts on some motherboards.");
 module_param(xbox, bool, 0444);
 MODULE_PARM_DESC(xbox, "Set to 1 for Xbox, if you have problems with the AC'97 codec detection.");
 module_param(spdif_aclink, int, 0444);
 MODULE_PARM_DESC(spdif_aclink, "S/PDIF over AC-link.");
-module_param(inside_vm, bool, 0444);
+module_param(inside_vm, bint, 0444);
 MODULE_PARM_DESC(inside_vm, "KVM/Parallels optimization.");
 
 /* just for backward compatibility */

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html

Acked-by on v1 2/15
#2 lore raw
In reply to Rusty Russell
Quoted 31 lines · Rusty Russell

For historical reasons, we allow module_param(bool) to take an int (or an unsigned int). That's going away.

A few drivers really want an int: they set it to -1 and a parameter will set it to 0 or 1. This sucks: reading them from sysfs will give 'Y' for both -1 and 1, but if we change it to an int, then the users might be broken (if they did "param" instead of "param=1").

Use a new 'bint' parser for them.

(ntfs has a different problem: it needs an int for debug_msgs because it's also exposed via sysctl.)

Cc Steve Glendinning <[email protected]>
Cc Jean Delvare <[email protected]>
Cc Guenter Roeck <guenter.roeck-IzeFyvvaP7pWk0Htik3J/[email protected]>
Cc Hoang-Nam Nguyen <[email protected]>
Cc Christoph Raisch <[email protected]>
Cc Roland Dreier <[email protected]>
Cc Sean Hefty <[email protected]>
Cc Hal Rosenstock <[email protected]>
Cc Anton Altaparmakov <[email protected]>
Cc Jaroslav Kysela <perex-/Fr2/[email protected]>
Cc Takashi Iwai <[email protected]>
Cc alsa-devel-K7yf7f+aM1XWsZ/[email protected]
Quoted 2 lines
---
 drivers/hwmon/emc2103.c                |    2 +-

For the hwmon driver:

Quoted 125 lines
 drivers/infiniband/hw/ehca/ehca_main.c |    2 +-
 drivers/s390/cio/cmf.c                 |    2 +-
 fs/ntfs/super.c                        |    2 +-
 include/linux/moduleparam.h            |    6 ++++++
 kernel/params.c                        |   24 ++++++++++++++++++++++++
 sound/pci/intel8x0.c                   |    4 ++--
 7 files changed, 36 insertions(+), 6 deletions(-)
drivers/hwmon/emc2103.c +1 -1
@@ -55,7 +55,7 @@ static const u8 REG_TEMP_MAX[4] = { 0x34
  * it.  Default is to leave the device in the state it's already in (-1).
  * This parameter allows APD mode to be optionally forced on or off */
 static int apd = -1;
-module_param(apd, bool, 0);
+module_param(apd, bint, 0);
 MODULE_PARM_DESC(init, "Set to zero to disable anti-parallel diode mode");
 
 struct temperature {
drivers/infiniband/hw/ehca/ehca_main.c +1 -1
@@ -82,7 +82,7 @@ module_param_named(port_act_time, ehca_p
 module_param_named(poll_all_eqs,  ehca_poll_all_eqs,  bool, S_IRUGO);
 module_param_named(static_rate,   ehca_static_rate,   int,  S_IRUGO);
 module_param_named(scaling_code,  ehca_scaling_code,  bool, S_IRUGO);
-module_param_named(lock_hcalls,   ehca_lock_hcalls,   bool, S_IRUGO);
+module_param_named(lock_hcalls,   ehca_lock_hcalls,   bint, S_IRUGO);
 module_param_named(number_of_cqs, ehca_max_cq,        int,  S_IRUGO);
 module_param_named(number_of_qps, ehca_max_qp,        int,  S_IRUGO);
 
drivers/s390/cio/cmf.c +1 -1
@@ -98,7 +98,7 @@ enum cmb_format {
  * enum cmb_format.
  */
 static int format = CMF_AUTODETECT;
-module_param(format, bool, 0444);
+module_param(format, bint, 0444);
 
 /**
  * struct cmb_operations - functions to use depending on cmb_format
fs/ntfs/super.c +1 -1
@@ -3198,7 +3198,7 @@ MODULE_DESCRIPTION("NTFS 1.2/3.x driver 
 MODULE_VERSION(NTFS_VERSION);
 MODULE_LICENSE("GPL");
 #ifdef DEBUG
-module_param(debug_msgs, bool, 0);
+module_param(debug_msgs, bint, 0);
 MODULE_PARM_DESC(debug_msgs, "Enable debug messages.");
 #endif
 
include/linux/moduleparam.h +6 -0
@@ -367,6 +367,12 @@ extern int param_set_invbool(const char 
 extern int param_get_invbool(char *buffer, const struct kernel_param *kp);
 #define param_check_invbool(name, p) __param_check(name, p, bool)
 
+/* An int, which can only be set like a bool (though it shows as an int). */
+extern struct kernel_param_ops param_ops_bint;
+extern int param_set_bint(const char *val, const struct kernel_param *kp);
+#define param_get_bint param_get_int
+#define param_check_bint param_check_int
+
 /**
  * module_param_array - a parameter which is an array of some type
  * @name: the name of the array variable
kernel/params.c +24 -0
@@ -369,6 +369,30 @@ struct kernel_param_ops param_ops_invboo
 };
 EXPORT_SYMBOL(param_ops_invbool);
 
+int param_set_bint(const char *val, const struct kernel_param *kp)
+{
+	struct kernel_param boolkp;
+	bool v;
+	int ret;
+
+	/* Match bool exactly, by re-using it. */
+	boolkp = *kp;
+	boolkp.arg = &v;
+	boolkp.flags |= KPARAM_ISBOOL;
+
+	ret = param_set_bool(val, &boolkp);
+	if (ret == 0)
+		*(int *)kp->arg = v;
+	return ret;
+}
+EXPORT_SYMBOL(param_set_bint);
+
+struct kernel_param_ops param_ops_bint = {
+	.set = param_set_bint,
+	.get = param_get_int,
+};
+EXPORT_SYMBOL(param_ops_bint);
+
 /* We break the rule and mangle the string. */
 static int param_array(const char *name,
 		       const char *val,
sound/pci/intel8x0.c +2 -2
@@ -95,13 +95,13 @@ module_param(ac97_quirk, charp, 0444);
 MODULE_PARM_DESC(ac97_quirk, "AC'97 workaround for strange hardware.");
 module_param(buggy_semaphore, bool, 0444);
 MODULE_PARM_DESC(buggy_semaphore, "Enable workaround for hardwares with problematic codec semaphores.");
-module_param(buggy_irq, bool, 0444);
+module_param(buggy_irq, bint, 0444);
 MODULE_PARM_DESC(buggy_irq, "Enable workaround for buggy interrupts on some motherboards.");
 module_param(xbox, bool, 0444);
 MODULE_PARM_DESC(xbox, "Set to 1 for Xbox, if you have problems with the AC'97 codec detection.");
 module_param(spdif_aclink, int, 0444);
 MODULE_PARM_DESC(spdif_aclink, "S/PDIF over AC-link.");
-module_param(inside_vm, bool, 0444);
+module_param(inside_vm, bint, 0444);
 MODULE_PARM_DESC(inside_vm, "KVM/Parallels optimization.");
 
 /* just for backward compatibility */
Signature · 7 lines
Guenter Roeck
Distinguished Engineer
PDU IP Systems
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html