aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/compiler.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/compiler.h')
-rw-r--r--include/linux/compiler.h20
1 files changed, 4 insertions, 16 deletions
diff --git a/include/linux/compiler.h b/include/linux/compiler.h
index 1b45e4a0519b..867722591be2 100644
--- a/include/linux/compiler.h
+++ b/include/linux/compiler.h
@@ -169,6 +169,10 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
169# define barrier() __memory_barrier() 169# define barrier() __memory_barrier()
170#endif 170#endif
171 171
172#ifndef barrier_data
173# define barrier_data(ptr) barrier()
174#endif
175
172/* Unreachable code */ 176/* Unreachable code */
173#ifndef unreachable 177#ifndef unreachable
174# define unreachable() do { } while (1) 178# define unreachable() do { } while (1)
@@ -192,29 +196,16 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
192 196
193#include <uapi/linux/types.h> 197#include <uapi/linux/types.h>
194 198
195static __always_inline void data_access_exceeds_word_size(void)
196#ifdef __compiletime_warning
197__compiletime_warning("data access exceeds word size and won't be atomic")
198#endif
199;
200
201static __always_inline void data_access_exceeds_word_size(void)
202{
203}
204
205static __always_inline void __read_once_size(const volatile void *p, void *res, int size) 199static __always_inline void __read_once_size(const volatile void *p, void *res, int size)
206{ 200{
207 switch (size) { 201 switch (size) {
208 case 1: *(__u8 *)res = *(volatile __u8 *)p; break; 202 case 1: *(__u8 *)res = *(volatile __u8 *)p; break;
209 case 2: *(__u16 *)res = *(volatile __u16 *)p; break; 203 case 2: *(__u16 *)res = *(volatile __u16 *)p; break;
210 case 4: *(__u32 *)res = *(volatile __u32 *)p; break; 204 case 4: *(__u32 *)res = *(volatile __u32 *)p; break;
211#ifdef CONFIG_64BIT
212 case 8: *(__u64 *)res = *(volatile __u64 *)p; break; 205 case 8: *(__u64 *)res = *(volatile __u64 *)p; break;
213#endif
214 default: 206 default:
215 barrier(); 207 barrier();
216 __builtin_memcpy((void *)res, (const void *)p, size); 208 __builtin_memcpy((void *)res, (const void *)p, size);
217 data_access_exceeds_word_size();
218 barrier(); 209 barrier();
219 } 210 }
220} 211}
@@ -225,13 +216,10 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s
225 case 1: *(volatile __u8 *)p = *(__u8 *)res; break; 216 case 1: *(volatile __u8 *)p = *(__u8 *)res; break;
226 case 2: *(volatile __u16 *)p = *(__u16 *)res; break; 217 case 2: *(volatile __u16 *)p = *(__u16 *)res; break;
227 case 4: *(volatile __u32 *)p = *(__u32 *)res; break; 218 case 4: *(volatile __u32 *)p = *(__u32 *)res; break;
228#ifdef CONFIG_64BIT
229 case 8: *(volatile __u64 *)p = *(__u64 *)res; break; 219 case 8: *(volatile __u64 *)p = *(__u64 *)res; break;
230#endif
231 default: 220 default:
232 barrier(); 221 barrier();
233 __builtin_memcpy((void *)p, (const void *)res, size); 222 __builtin_memcpy((void *)p, (const void *)res, size);
234 data_access_exceeds_word_size();
235 barrier(); 223 barrier();
236 } 224 }
237} 225}