public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] numa: Mark __node_set as __always_inline
@ 2013-07-25 18:26 Tom Rini
  2013-07-25 19:16 ` KOSAKI Motohiro
  2013-07-26 20:04 ` [tip:sched/core] numa: Mark __node_set() " tip-bot for Tom Rini
  0 siblings, 2 replies; 3+ messages in thread
From: Tom Rini @ 2013-07-25 18:26 UTC (permalink / raw)
  To: linux-kernel, x86
  Cc: Jianpeng Ma, Rusty Russell, Lai Jiangshan, Yasuaki Ishimatsu,
	Wen Congyang, Jiang Liu, KOSAKI Motohiro, Minchan Kim, Mel Gorman,
	David Rientjes, Yinghai Lu, Greg KH

It is posible for some compilers to decide that __node_set does not need
to be made turned into an inline function.  When the compiler does this
on an __init function calling it on __initdata we get a section mismatch
warning now.  Use __always_inline to ensure that we will be inlined.

Reported-by: Paul Bolle <pebolle@tiscali.nl>
Cc: Jianpeng Ma <majianpeng@gmail.com>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Lai Jiangshan <laijs@cn.fujitsu.com>
Cc: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
Cc: Wen Congyang <wency@cn.fujitsu.com>
Cc: Jiang Liu <jiang.liu@huawei.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Minchan Kim <minchan.kim@gmail.com>
Cc: Mel Gorman <mgorman@suse.de>
Cc: David Rientjes <rientjes@google.com>
Cc: Yinghai Lu <yinghai@kernel.org>
Cc: Greg KH <greg@kroah.com>
Signed-off-by: Tom Rini <trini@ti.com>

---
Changes in v2:
- As per KOSAKI Motohiro, add a comment as well about why we need
  __always_inline to the header.
---
 include/linux/nodemask.h |   11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/include/linux/nodemask.h b/include/linux/nodemask.h
index 4e2cbfa..58b9a02 100644
--- a/include/linux/nodemask.h
+++ b/include/linux/nodemask.h
@@ -98,8 +98,17 @@
 typedef struct { DECLARE_BITMAP(bits, MAX_NUMNODES); } nodemask_t;
 extern nodemask_t _unused_nodemask_arg_;
 
+/*
+ * The inline keyword gives the compiler room to decide to inline, or
+ * not inline a function as it sees best.  However, as these functions
+ * are called in both __init and non-__init functions, if they are not
+ * inlined we will end up with a section mis-match error (of the type of
+ * freeable items not being freed).  So we must use __always_inline here
+ * to fix the problem.  If other functions in the future also end up in
+ * this situation they will also need to be annotated as __always_inline
+ */
 #define node_set(node, dst) __node_set((node), &(dst))
-static inline void __node_set(int node, volatile nodemask_t *dstp)
+static __always_inline void __node_set(int node, volatile nodemask_t *dstp)
 {
 	set_bit(node, dstp->bits);
 }
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v2] numa: Mark __node_set as __always_inline
  2013-07-25 18:26 [PATCH v2] numa: Mark __node_set as __always_inline Tom Rini
@ 2013-07-25 19:16 ` KOSAKI Motohiro
  2013-07-26 20:04 ` [tip:sched/core] numa: Mark __node_set() " tip-bot for Tom Rini
  1 sibling, 0 replies; 3+ messages in thread
From: KOSAKI Motohiro @ 2013-07-25 19:16 UTC (permalink / raw)
  To: Tom Rini
  Cc: linux-kernel, x86, Jianpeng Ma, Rusty Russell, Lai Jiangshan,
	Yasuaki Ishimatsu, Wen Congyang, Jiang Liu, KOSAKI Motohiro,
	Minchan Kim, Mel Gorman, David Rientjes, Yinghai Lu, Greg KH,
	kosaki.motohiro

> +/*
> + * The inline keyword gives the compiler room to decide to inline, or
> + * not inline a function as it sees best.  However, as these functions
> + * are called in both __init and non-__init functions, if they are not
> + * inlined we will end up with a section mis-match error (of the type of
> + * freeable items not being freed).  So we must use __always_inline here
> + * to fix the problem.  If other functions in the future also end up in
> + * this situation they will also need to be annotated as __always_inline
> + */
>   #define node_set(node, dst) __node_set((node), &(dst))
> -static inline void __node_set(int node, volatile nodemask_t *dstp)
> +static __always_inline void __node_set(int node, volatile nodemask_t *dstp)
>   {
>   	set_bit(node, dstp->bits);
>   }
> 

Acked-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [tip:sched/core] numa: Mark __node_set() as __always_inline
  2013-07-25 18:26 [PATCH v2] numa: Mark __node_set as __always_inline Tom Rini
  2013-07-25 19:16 ` KOSAKI Motohiro
@ 2013-07-26 20:04 ` tip-bot for Tom Rini
  1 sibling, 0 replies; 3+ messages in thread
From: tip-bot for Tom Rini @ 2013-07-26 20:04 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: mingo, rusty, pebolle, isimatu.yasuaki, jiang.liu, tglx, rientjes,
	trini, laijs, linux-kernel, hpa, majianpeng, yinghai, greg, wency,
	minchan.kim, mgorman, kosaki.motohiro

Commit-ID:  323f54ed0f3ce20e9946c961fc928ccdb80d9345
Gitweb:     http://git.kernel.org/tip/323f54ed0f3ce20e9946c961fc928ccdb80d9345
Author:     Tom Rini <trini@ti.com>
AuthorDate: Thu, 25 Jul 2013 14:26:10 -0400
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Thu, 25 Jul 2013 21:54:01 +0200

numa: Mark __node_set() as __always_inline

It is posible for some compilers to decide that __node_set() does
not need to be made turned into an inline function.  When the
compiler does this on an __init function calling it on
__initdata we get a section mismatch warning now.  Use
__always_inline to ensure that we will be inlined.

Reported-by: Paul Bolle <pebolle@tiscali.nl>
Cc: Jianpeng Ma <majianpeng@gmail.com>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Lai Jiangshan <laijs@cn.fujitsu.com>
Cc: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
Cc: Wen Congyang <wency@cn.fujitsu.com>
Cc: Jiang Liu <jiang.liu@huawei.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Minchan Kim <minchan.kim@gmail.com>
Cc: Mel Gorman <mgorman@suse.de>
Cc: David Rientjes <rientjes@google.com>
Cc: Yinghai Lu <yinghai@kernel.org>
Cc: Greg KH <greg@kroah.com>
Signed-off-by: Tom Rini <trini@ti.com>
Link: http://lkml.kernel.org/r/1374776770-32361-1-git-send-email-trini@ti.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 include/linux/nodemask.h | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/include/linux/nodemask.h b/include/linux/nodemask.h
index 4e2cbfa..58b9a02 100644
--- a/include/linux/nodemask.h
+++ b/include/linux/nodemask.h
@@ -98,8 +98,17 @@
 typedef struct { DECLARE_BITMAP(bits, MAX_NUMNODES); } nodemask_t;
 extern nodemask_t _unused_nodemask_arg_;
 
+/*
+ * The inline keyword gives the compiler room to decide to inline, or
+ * not inline a function as it sees best.  However, as these functions
+ * are called in both __init and non-__init functions, if they are not
+ * inlined we will end up with a section mis-match error (of the type of
+ * freeable items not being freed).  So we must use __always_inline here
+ * to fix the problem.  If other functions in the future also end up in
+ * this situation they will also need to be annotated as __always_inline
+ */
 #define node_set(node, dst) __node_set((node), &(dst))
-static inline void __node_set(int node, volatile nodemask_t *dstp)
+static __always_inline void __node_set(int node, volatile nodemask_t *dstp)
 {
 	set_bit(node, dstp->bits);
 }

^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2013-07-26 20:05 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-07-25 18:26 [PATCH v2] numa: Mark __node_set as __always_inline Tom Rini
2013-07-25 19:16 ` KOSAKI Motohiro
2013-07-26 20:04 ` [tip:sched/core] numa: Mark __node_set() " tip-bot for Tom Rini

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox