From: Dmitry Torokhov <dtor@vmware.com>
To: LKML <linux-kernel@vger.kernel.org>
Cc: David Miller <davem@davemloft.net>,
	Geert Uytterhoeven <geert@linux-m68k.org>,
	Rusty Russell <rusty@rustcorp.com.au>,
	Linux/m68k <linux-m68k@vger.kernel.org>,
	Linux-Arch <linux-arch@vger.kernel.org>,
	Dmitry Torokhov <dtor@vmware.com>
Subject: [PATCH 2/3] module: deal with alignment issues in built-in module parameters
Date: Mon,  7 Feb 2011 16:02:26 -0800	[thread overview]
Message-ID: <1297123347-2170-2-git-send-email-dtor@vmware.com> (raw)
In-Reply-To: <1297123347-2170-1-git-send-email-dtor@vmware.com>
As DaveM said, we can't reliably put structures into independent
objects, put them into a special section, and then expect array
access over them (via the section boundaries) after linking the
objects together to just "work" due to variable alignment choices
in different situations. The only solution that seems to work
reliably is to make an array of plain pointers to the objects in
question and put those pointers in the special section.
Signed-off-by: Dmitry Torokhov <dtor@vmware.com>
---
 include/linux/moduleparam.h |   14 ++++++++------
 kernel/params.c             |   10 ++++++----
 2 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h
index 07b4195..05b92c0 100644
--- a/include/linux/moduleparam.h
+++ b/include/linux/moduleparam.h
@@ -147,15 +147,17 @@ struct kparam_array
 	BUILD_BUG_ON_ZERO((perm) < 0 || (perm) > 0777 || ((perm) & 2))	\
 	+ BUILD_BUG_ON_ZERO(sizeof(""prefix) > MAX_PARAM_PREFIX_LEN);	\
 	static const char __param_str_##name[] = prefix #name;		\
-	static struct kernel_param __moduleparam_const __param_##name	\
-	__used								\
-    __attribute__ ((unused,__section__ ("__param"),aligned(sizeof(void *)))) \
-	= { __param_str_##name, ops, perm, isbool ? KPARAM_ISBOOL : 0,	\
-	    { arg } }
+	static const struct kernel_param ___param_##name = {		\
+	    __param_str_##name, ops, perm, isbool ? KPARAM_ISBOOL : 0,	\
+	    { arg }							\
+	};								\
+	static const struct kernel_param				\
+	__used __attribute__ ((__section__ ("__param")))		\
+	* __moduleparam_const __param_##name = &___param_##name
 
 /* Obsolete - use module_param_cb() */
 #define module_param_call(name, set, get, arg, perm)			\
-	static struct kernel_param_ops __param_ops_##name =		\
+	static const struct kernel_param_ops __param_ops_##name =	\
 		 { (void *)set, (void *)get };				\
 	__module_param_call(MODULE_PARAM_PREFIX,			\
 			    name, &__param_ops_##name, arg,		\
diff --git a/kernel/params.c b/kernel/params.c
index 09a08cb..66f7e66 100644
--- a/kernel/params.c
+++ b/kernel/params.c
@@ -498,7 +498,8 @@ EXPORT_SYMBOL(param_ops_string);
 #define to_module_attr(n) container_of(n, struct module_attribute, attr)
 #define to_module_kobject(n) container_of(n, struct module_kobject, kobj)
 
-extern struct kernel_param __start___param[], __stop___param[];
+extern const struct kernel_param *__start___param[];
+extern const struct kernel_param *__stop___param[];
 
 struct param_attribute
 {
@@ -754,7 +755,7 @@ static struct module_kobject * __init locate_module_kobject(const char *name)
 }
 
 static void __init kernel_add_sysfs_param(const char *name,
-					  struct kernel_param *kparam,
+					  const struct kernel_param *kparam,
 					  unsigned int name_skip)
 {
 	struct module_kobject *mk;
@@ -789,11 +790,12 @@ static void __init kernel_add_sysfs_param(const char *name,
  */
 static void __init param_sysfs_builtin(void)
 {
-	struct kernel_param *kp;
+	const struct kernel_param **p;
 	unsigned int name_len;
 	char modname[MODULE_NAME_LEN];
 
-	for (kp = __start___param; kp < __stop___param; kp++) {
+	for (p = __start___param; p < __stop___param; p++) {
+		const struct kernel_param *kp = *p;
 		char *dot;
 
 		if (kp->perm == 0)
-- 
1.7.3.2
next prev parent reply	other threads:[~2011-02-08  0:02 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-02-08  0:02 [PATCH 1/3] module: deal with alignment issues in built-in module versions Dmitry Torokhov
2011-02-08  0:02 ` Dmitry Torokhov [this message]
2011-02-08  0:02 ` [PATCH 3/3] module: do not hide __modver_version_show declaration behind ifdef Dmitry Torokhov
2011-02-08 21:12 ` [PATCH 1/3] module: deal with alignment issues in built-in module versions Geert Uytterhoeven
2011-02-08 21:12   ` Geert Uytterhoeven
2011-02-17 12:43   ` Geert Uytterhoeven
2011-02-17 12:43     ` Geert Uytterhoeven
2011-02-11 22:03 ` [PATCH v2] module: deal with alignment issues in built-in module parameters Dmitry Torokhov
2011-02-13 23:04   ` Rusty Russell
2011-02-13 23:04     ` Rusty Russell
2011-02-17 17:24 ` [PATCH 1/3] module: deal with alignment issues in built-in module versions Linus Torvalds
2011-02-17 17:24   ` Linus Torvalds
2011-02-17 17:31   ` Dmitry Torokhov
2011-02-17 17:31     ` Dmitry Torokhov
2011-02-17 17:45     ` Linus Torvalds
2011-02-17 17:45       ` Linus Torvalds
2011-02-17 18:00       ` Dmitry Torokhov
2011-02-17 18:06         ` Linus Torvalds
2011-02-17 18:06           ` Linus Torvalds
2011-02-17 21:01           ` David Miller
2011-02-17 21:01             ` David Miller
2011-02-17 21:11             ` Linus Torvalds
2011-02-17 21:17               ` David Miller
2011-02-17 21:54                 ` Linus Torvalds
2011-02-17 22:01                   ` David Miller
2011-02-17 22:19                     ` Dmitry Torokhov
2011-02-17 22:23                       ` David Miller
2011-02-17 22:23                         ` David Miller
2011-02-17 22:48                         ` Linus Torvalds
2011-02-17 22:48                           ` Linus Torvalds
2011-02-17 23:08                           ` Linus Torvalds
2011-02-17 23:19                             ` David Miller
2011-02-19  0:14                             ` Benjamin Herrenschmidt
2011-02-21  4:00                               ` Rusty Russell
2011-02-21  4:00                                 ` Rusty Russell
2011-02-21  7:38                                 ` Geert Uytterhoeven
2011-02-21  7:49                                   ` Dmitry Torokhov
2011-02-21  7:49                                     ` Dmitry Torokhov
2011-02-21 13:25                                     ` Geert Uytterhoeven
2011-02-21 13:25                                       ` Geert Uytterhoeven
2011-02-22  1:58                                 ` Benjamin Herrenschmidt
2011-02-22  1:58                                   ` Benjamin Herrenschmidt
2011-02-22  2:03                                   ` Linus Torvalds
2011-02-22  2:03                                     ` Linus Torvalds
2011-02-22  7:02                                     ` Dmitry Torokhov
2011-02-22 17:08                                       ` Jesper Nilsson
2011-02-22 20:47                                         ` Linus Torvalds
2011-02-22 20:47                                           ` Linus Torvalds
2011-02-23 15:00                                           ` Jesper Nilsson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox
  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):
  git send-email \
    --in-reply-to=1297123347-2170-2-git-send-email-dtor@vmware.com \
    --to=dtor@vmware.com \
    --cc=davem@davemloft.net \
    --cc=geert@linux-m68k.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-m68k@vger.kernel.org \
    --cc=rusty@rustcorp.com.au \
    /path/to/YOUR_REPLY
  https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
  Be sure your reply has a Subject: header at the top and a blank line
  before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).