All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH RFC] x86: enforce inlining for atomics
@ 2015-04-20 21:27 Hagen Paul Pfeifer
  2015-04-20 21:56 ` Borislav Petkov
                   ` (2 more replies)
  0 siblings, 3 replies; 20+ messages in thread
From: Hagen Paul Pfeifer @ 2015-04-20 21:27 UTC (permalink / raw)
  To: linux-kernel
  Cc: Hagen Paul Pfeifer, Thomas Gleixner, Ingo Molnar, H. Peter Anvin,
	Peter Zijlstra

During some code analysis I realized that atomic_add, atomic_sub and
friends are not necessarily inlined AND that each function is defined
multiple times:

atomic_inc:          544 duplicates
atomic_dec:          215 duplicates
atomic_dec_and_test: 107 duplicates
atomic64_inc:         38 duplicates
[...]

Each definition is exact equally, e.g.:

ffffffff813171b8 <atomic_add>:
55         push   %rbp
48 89 e5   mov    %rsp,%rbp
f0 01 3e   lock add %edi,(%rsi)
5d         pop    %rbp
c3         retq

In turn each definition has one or more callsites (sure):

ffffffff81317c78: e8 3b f5 ff ff  callq  ffffffff813171b8 <atomic_add>
[...]
ffffffff8131a062: e8 51 d1 ff ff  callq  ffffffff813171b8 <atomic_add>
[...]
ffffffff8131a190: e8 23 d0 ff ff  callq  ffffffff813171b8 <atomic_add>
[...]

The other way around would be to remove the static linkage - but I prefer
an enforced inlining here.

Before:
  text     data	  bss      dec       hex     filename
  81467393 19874720 20168704 121510817 73e1ba1 vmlinux.orig

After:
  text     data     bss      dec       hex     filename
  81461323 19874720 20168704 121504747 73e03eb vmlinux.inlined

Yes, the inlining here makes the kernel even smaller! ;)

Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Hagen Paul Pfeifer <hagen@jauu.net>
---
 arch/x86/include/asm/atomic.h      | 16 ++++++++--------
 arch/x86/include/asm/atomic64_64.h |  8 ++++----
 2 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/arch/x86/include/asm/atomic.h b/arch/x86/include/asm/atomic.h
index 5e5cd12..75a9ee8 100644
--- a/arch/x86/include/asm/atomic.h
+++ b/arch/x86/include/asm/atomic.h
@@ -46,7 +46,7 @@ static inline void atomic_set(atomic_t *v, int i)
  *
  * Atomically adds @i to @v.
  */
-static inline void atomic_add(int i, atomic_t *v)
+static __always_inline void atomic_add(int i, atomic_t *v)
 {
 	asm volatile(LOCK_PREFIX "addl %1,%0"
 		     : "+m" (v->counter)
@@ -60,7 +60,7 @@ static inline void atomic_add(int i, atomic_t *v)
  *
  * Atomically subtracts @i from @v.
  */
-static inline void atomic_sub(int i, atomic_t *v)
+static __always_inline void atomic_sub(int i, atomic_t *v)
 {
 	asm volatile(LOCK_PREFIX "subl %1,%0"
 		     : "+m" (v->counter)
@@ -76,7 +76,7 @@ static inline void atomic_sub(int i, atomic_t *v)
  * true if the result is zero, or false for all
  * other cases.
  */
-static inline int atomic_sub_and_test(int i, atomic_t *v)
+static __always_inline int atomic_sub_and_test(int i, atomic_t *v)
 {
 	GEN_BINARY_RMWcc(LOCK_PREFIX "subl", v->counter, "er", i, "%0", "e");
 }
@@ -87,7 +87,7 @@ static inline int atomic_sub_and_test(int i, atomic_t *v)
  *
  * Atomically increments @v by 1.
  */
-static inline void atomic_inc(atomic_t *v)
+static __always_inline void atomic_inc(atomic_t *v)
 {
 	asm volatile(LOCK_PREFIX "incl %0"
 		     : "+m" (v->counter));
@@ -99,7 +99,7 @@ static inline void atomic_inc(atomic_t *v)
  *
  * Atomically decrements @v by 1.
  */
-static inline void atomic_dec(atomic_t *v)
+static __always_inline void atomic_dec(atomic_t *v)
 {
 	asm volatile(LOCK_PREFIX "decl %0"
 		     : "+m" (v->counter));
@@ -113,7 +113,7 @@ static inline void atomic_dec(atomic_t *v)
  * returns true if the result is 0, or false for all other
  * cases.
  */
-static inline int atomic_dec_and_test(atomic_t *v)
+static __always_inline int atomic_dec_and_test(atomic_t *v)
 {
 	GEN_UNARY_RMWcc(LOCK_PREFIX "decl", v->counter, "%0", "e");
 }
@@ -152,7 +152,7 @@ static inline int atomic_add_negative(int i, atomic_t *v)
  *
  * Atomically adds @i to @v and returns @i + @v
  */
-static inline int atomic_add_return(int i, atomic_t *v)
+static __always_inline int atomic_add_return(int i, atomic_t *v)
 {
 	return i + xadd(&v->counter, i);
 }
@@ -191,7 +191,7 @@ static inline int atomic_xchg(atomic_t *v, int new)
  * Atomically adds @a to @v, so long as @v was not already @u.
  * Returns the old value of @v.
  */
-static inline int __atomic_add_unless(atomic_t *v, int a, int u)
+static __always_inline int __atomic_add_unless(atomic_t *v, int a, int u)
 {
 	int c, old;
 	c = atomic_read(v);
diff --git a/arch/x86/include/asm/atomic64_64.h b/arch/x86/include/asm/atomic64_64.h
index f8d273e..b965f9e 100644
--- a/arch/x86/include/asm/atomic64_64.h
+++ b/arch/x86/include/asm/atomic64_64.h
@@ -40,7 +40,7 @@ static inline void atomic64_set(atomic64_t *v, long i)
  *
  * Atomically adds @i to @v.
  */
-static inline void atomic64_add(long i, atomic64_t *v)
+static __always_inline void atomic64_add(long i, atomic64_t *v)
 {
 	asm volatile(LOCK_PREFIX "addq %1,%0"
 		     : "=m" (v->counter)
@@ -81,7 +81,7 @@ static inline int atomic64_sub_and_test(long i, atomic64_t *v)
  *
  * Atomically increments @v by 1.
  */
-static inline void atomic64_inc(atomic64_t *v)
+static __always_inline void atomic64_inc(atomic64_t *v)
 {
 	asm volatile(LOCK_PREFIX "incq %0"
 		     : "=m" (v->counter)
@@ -94,7 +94,7 @@ static inline void atomic64_inc(atomic64_t *v)
  *
  * Atomically decrements @v by 1.
  */
-static inline void atomic64_dec(atomic64_t *v)
+static __always_inline void atomic64_dec(atomic64_t *v)
 {
 	asm volatile(LOCK_PREFIX "decq %0"
 		     : "=m" (v->counter)
@@ -148,7 +148,7 @@ static inline int atomic64_add_negative(long i, atomic64_t *v)
  *
  * Atomically adds @i to @v and returns @i + @v
  */
-static inline long atomic64_add_return(long i, atomic64_t *v)
+static __always_inline long atomic64_add_return(long i, atomic64_t *v)
 {
 	return i + xadd(&v->counter, i);
 }
-- 
2.1.4


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

end of thread, other threads:[~2015-07-13 21:12 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-04-20 21:27 [PATCH RFC] x86: enforce inlining for atomics Hagen Paul Pfeifer
2015-04-20 21:56 ` Borislav Petkov
2015-04-20 22:08   ` Hagen Paul Pfeifer
2015-04-21  7:42     ` Ingo Molnar
2015-04-21 10:56       ` Hagen Paul Pfeifer
2015-04-21 22:57       ` Hagen Paul Pfeifer
2015-04-22  0:57         ` Linus Torvalds
2015-04-22  5:24         ` Markus Trippelsdorf
2015-04-22  5:58           ` Hagen Paul Pfeifer
2015-04-22  9:20             ` Markus Trippelsdorf
2015-04-22  9:28               ` Ingo Molnar
2015-04-22  9:31                 ` Hagen Paul Pfeifer
2015-04-30  1:52                   ` Henrique de Moraes Holschuh
2015-07-13 18:27                 ` Denys Vlasenko
2015-07-13 19:20                   ` Hagen Paul Pfeifer
2015-07-13 21:06                     ` Denys Vlasenko
2015-07-13 21:12                       ` Hagen Paul Pfeifer
2015-07-13 18:25               ` Denys Vlasenko
2015-04-20 23:46 ` Peter Zijlstra
2015-04-22 14:10 ` [tip:x86/asm] x86/asm: Always inline atomics tip-bot for Hagen Paul Pfeifer

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.