Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 45fcc70c authored by Rusty Russell's avatar Rusty Russell
Browse files

module_param: split perm field into flags and perm



Impact: cleanup

Rather than hack KPARAM_KMALLOCED into the perm field, separate it out.
Since the perm field was 32 bits and only needs 16, we don't add bloat.

Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
parent 9a71af2c
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -36,9 +36,13 @@ typedef int (*param_set_fn)(const char *val, struct kernel_param *kp);
/* Returns length written or -errno.  Buffer is 4k (ie. be short!) */
typedef int (*param_get_fn)(char *buffer, struct kernel_param *kp);

/* Flag bits for kernel_param.flags */
#define KPARAM_KMALLOCED	1

struct kernel_param {
	const char *name;
	unsigned int perm;
	u16 perm;
	u16 flags;
	param_set_fn set;
	param_get_fn get;
	union {
@@ -88,7 +92,7 @@ struct kparam_array
	static struct kernel_param __moduleparam_const __param_##name	\
	__used								\
    __attribute__ ((unused,__section__ ("__param"),aligned(sizeof(void *)))) \
	= { __param_str_##name, perm, set, get, { arg } }
	= { __param_str_##name, perm, 0, set, get, { arg } }

#define module_param_call(name, set, get, arg, perm)			      \
	__module_param_call(MODULE_PARAM_PREFIX, name, set, get, arg, perm)
+3 −6
Original line number Diff line number Diff line
@@ -24,9 +24,6 @@
#include <linux/err.h>
#include <linux/slab.h>

/* We abuse the high bits of "perm" to record whether we kmalloc'ed. */
#define KPARAM_KMALLOCED	0x80000000

#if 0
#define DEBUGP printk
#else
@@ -220,13 +217,13 @@ int param_set_charp(const char *val, struct kernel_param *kp)
		return -ENOSPC;
	}

	if (kp->perm & KPARAM_KMALLOCED)
	if (kp->flags & KPARAM_KMALLOCED)
		kfree(*(char **)kp->arg);

	/* This is a hack.  We can't need to strdup in early boot, and we
	 * don't need to; this mangled commandline is preserved. */
	if (slab_is_available()) {
		kp->perm |= KPARAM_KMALLOCED;
		kp->flags |= KPARAM_KMALLOCED;
		*(char **)kp->arg = kstrdup(val, GFP_KERNEL);
		if (!kp->arg)
			return -ENOMEM;
@@ -591,7 +588,7 @@ void destroy_params(const struct kernel_param *params, unsigned num)
	unsigned int i;

	for (i = 0; i < num; i++)
		if (params[i].perm & KPARAM_KMALLOCED)
		if (params[i].flags & KPARAM_KMALLOCED)
			kfree(*(char **)params[i].arg);
}