History

asm-generic/atomic: Use __always_inline for fallback wrappers

Use __always_inline for atomic fallback wrappers. When building for size (CC_OPTIMIZE_FOR_SIZE), some compilers appear to be less inclined to inline even relatively small static inline functions that are assumed to be inlinable such as atomic ops. This can cause problems, for example in UACCESS regions. While the fallback wrappers aren't pure wrappers, they are trivial nonetheless, and the function they wrap should determine the final inlining policy. For x86 tinyconfig we observe: - vmlinux baseline: 1315988 - vmlinux with patch: 1315928 (-60 bytes)

Marco Elver committed 6 years ago

Commit 944bc9c1 parent c02039521 files · +192 −188Browse files

Showing the changes to scripts (20 of 21 files). Show all

Unified · Split

20 files
  1. scripts/atomic/fallbacks/acquire +1 −1
  2. scripts/atomic/fallbacks/add_negative +1 −1
  3. scripts/atomic/fallbacks/add_unless +1 −1
  4. scripts/atomic/fallbacks/andnot +1 −1
  5. scripts/atomic/fallbacks/dec +1 −1
  6. scripts/atomic/fallbacks/dec_and_test +1 −1
  7. scripts/atomic/fallbacks/dec_if_positive +1 −1
  8. scripts/atomic/fallbacks/dec_unless_positive +1 −1
  9. scripts/atomic/fallbacks/fence +1 −1
  10. scripts/atomic/fallbacks/fetch_add_unless +1 −1
  11. scripts/atomic/fallbacks/inc +1 −1
  12. scripts/atomic/fallbacks/inc_and_test +1 −1
  13. scripts/atomic/fallbacks/inc_not_zero +1 −1
  14. scripts/atomic/fallbacks/inc_unless_negative +1 −1
  15. scripts/atomic/fallbacks/read_acquire +1 −1
  16. scripts/atomic/fallbacks/release +1 −1
  17. scripts/atomic/fallbacks/set_release +1 −1
  18. scripts/atomic/fallbacks/sub_and_test +1 −1
  19. scripts/atomic/fallbacks/try_cmpxchg +1 −1
  20. scripts/atomic/gen-atomic-fallback.sh +2 −0
scripts/atomic/fallbacks/acquire+1−1
@@ -1,5 +1,5 @@
11 cat <<EOF
2−static inline ${ret}
2+static __always_inline ${ret}
33 ${atomic}_${pfx}${name}${sfx}_acquire(${params})
44 {
55 ${ret} ret = ${atomic}_${pfx}${name}${sfx}_relaxed(${args});
scripts/atomic/fallbacks/add_negative+1−1
@@ -8,7 +8,7 @@ cat <<EOF · 7 unmodified lines
88 * if the result is negative, or false when
99 * result is greater than or equal to zero.
1010 */
11−static inline bool
11+static __always_inline bool
1212 ${atomic}_add_negative(${int} i, ${atomic}_t *v)
1313 {
1414 return ${atomic}_add_return(i, v) < 0;
scripts/atomic/fallbacks/add_unless+1−1
@@ -8,7 +8,7 @@ cat << EOF · 7 unmodified lines
88 * Atomically adds @a to @v, if @v was not already @u.
99 * Returns true if the addition was done.
1010 */
11−static inline bool
11+static __always_inline bool
1212 ${atomic}_add_unless(${atomic}_t *v, ${int} a, ${int} u)
1313 {
1414 return ${atomic}_fetch_add_unless(v, a, u) != u;
scripts/atomic/fallbacks/andnot+1−1
@@ -1,5 +1,5 @@
11 cat <<EOF
2−static inline ${ret}
2+static __always_inline ${ret}
33 ${atomic}_${pfx}andnot${sfx}${order}(${int} i, ${atomic}_t *v)
44 {
55 ${retstmt}${atomic}_${pfx}and${sfx}${order}(~i, v);
scripts/atomic/fallbacks/dec+1−1
@@ -1,5 +1,5 @@
11 cat <<EOF
2−static inline ${ret}
2+static __always_inline ${ret}
33 ${atomic}_${pfx}dec${sfx}${order}(${atomic}_t *v)
44 {
55 ${retstmt}${atomic}_${pfx}sub${sfx}${order}(1, v);
scripts/atomic/fallbacks/dec_and_test+1−1
@@ -7,7 +7,7 @@ cat <<EOF · 6 unmodified lines
77 * returns true if the result is 0, or false for all other
88 * cases.
99 */
10−static inline bool
10+static __always_inline bool
1111 ${atomic}_dec_and_test(${atomic}_t *v)
1212 {
1313 return ${atomic}_dec_return(v) == 0;
scripts/atomic/fallbacks/dec_if_positive+1−1
@@ -1,5 +1,5 @@
11 cat <<EOF
2−static inline ${ret}
2+static __always_inline ${ret}
33 ${atomic}_dec_if_positive(${atomic}_t *v)
44 {
55 ${int} dec, c = ${atomic}_read(v);
scripts/atomic/fallbacks/dec_unless_positive+1−1
@@ -1,5 +1,5 @@
11 cat <<EOF
2−static inline bool
2+static __always_inline bool
33 ${atomic}_dec_unless_positive(${atomic}_t *v)
44 {
55 ${int} c = ${atomic}_read(v);
scripts/atomic/fallbacks/fence+1−1
@@ -1,5 +1,5 @@
11 cat <<EOF
2−static inline ${ret}
2+static __always_inline ${ret}
33 ${atomic}_${pfx}${name}${sfx}(${params})
44 {
55 ${ret} ret;
scripts/atomic/fallbacks/fetch_add_unless+1−1
@@ -8,7 +8,7 @@ cat << EOF · 7 unmodified lines
88 * Atomically adds @a to @v, so long as @v was not already @u.
99 * Returns original value of @v
1010 */
11−static inline ${int}
11+static __always_inline ${int}
1212 ${atomic}_fetch_add_unless(${atomic}_t *v, ${int} a, ${int} u)
1313 {
1414 ${int} c = ${atomic}_read(v);
scripts/atomic/fallbacks/inc+1−1
@@ -1,5 +1,5 @@
11 cat <<EOF
2−static inline ${ret}
2+static __always_inline ${ret}
33 ${atomic}_${pfx}inc${sfx}${order}(${atomic}_t *v)
44 {
55 ${retstmt}${atomic}_${pfx}add${sfx}${order}(1, v);
scripts/atomic/fallbacks/inc_and_test+1−1
@@ -7,7 +7,7 @@ cat <<EOF · 6 unmodified lines
77 * and returns true if the result is zero, or false for all
88 * other cases.
99 */
10−static inline bool
10+static __always_inline bool
1111 ${atomic}_inc_and_test(${atomic}_t *v)
1212 {
1313 return ${atomic}_inc_return(v) == 0;
scripts/atomic/fallbacks/inc_not_zero+1−1
@@ -6,7 +6,7 @@ cat <<EOF · 5 unmodified lines
66 * Atomically increments @v by 1, if @v is non-zero.
77 * Returns true if the increment was done.
88 */
9−static inline bool
9+static __always_inline bool
1010 ${atomic}_inc_not_zero(${atomic}_t *v)
1111 {
1212 return ${atomic}_add_unless(v, 1, 0);
scripts/atomic/fallbacks/inc_unless_negative+1−1
@@ -1,5 +1,5 @@
11 cat <<EOF
2−static inline bool
2+static __always_inline bool
33 ${atomic}_inc_unless_negative(${atomic}_t *v)
44 {
55 ${int} c = ${atomic}_read(v);
scripts/atomic/fallbacks/read_acquire+1−1
@@ -1,5 +1,5 @@
11 cat <<EOF
2−static inline ${ret}
2+static __always_inline ${ret}
33 ${atomic}_read_acquire(const ${atomic}_t *v)
44 {
55 return smp_load_acquire(&(v)->counter);
scripts/atomic/fallbacks/release+1−1
@@ -1,5 +1,5 @@
11 cat <<EOF
2−static inline ${ret}
2+static __always_inline ${ret}
33 ${atomic}_${pfx}${name}${sfx}_release(${params})
44 {
55 __atomic_release_fence();
scripts/atomic/fallbacks/set_release+1−1
@@ -1,5 +1,5 @@
11 cat <<EOF
2−static inline void
2+static __always_inline void
33 ${atomic}_set_release(${atomic}_t *v, ${int} i)
44 {
55 smp_store_release(&(v)->counter, i);
scripts/atomic/fallbacks/sub_and_test+1−1
@@ -8,7 +8,7 @@ cat <<EOF · 7 unmodified lines
88 * true if the result is zero, or false for all
99 * other cases.
1010 */
11−static inline bool
11+static __always_inline bool
1212 ${atomic}_sub_and_test(${int} i, ${atomic}_t *v)
1313 {
1414 return ${atomic}_sub_return(i, v) == 0;
scripts/atomic/fallbacks/try_cmpxchg+1−1
@@ -1,5 +1,5 @@
11 cat <<EOF
2−static inline bool
2+static __always_inline bool
33 ${atomic}_try_cmpxchg${order}(${atomic}_t *v, ${int} *old, ${int} new)
44 {
55 ${int} r, o = *old;
scripts/atomic/gen-atomic-fallback.sh+2−0
@@ -149,6 +149,8 @@ cat << EOF · 148 unmodified lines
149149 #ifndef _LINUX_ATOMIC_FALLBACK_H
150150 #define _LINUX_ATOMIC_FALLBACK_H
151151
152+#include <linux/compiler.h>
153+
152154 EOF
153155
154156 for xchg in "xchg" "cmpxchg" "cmpxchg64"; do

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t