mirror of
https://github.com/followmsi/android_kernel_google_msm.git
synced 2024-11-06 23:17:41 +00:00
kernel: Change ASSIGN_ONCE(val, x) to WRITE_ONCE(x, val)
[ Upstream commit 43239cbe79fc369f5d2160bd7f69e28b5c50a58c ] Feedback has shown that WRITE_ONCE(x, val) is easier to use than ASSIGN_ONCE(val,x). There are no in-tree users yet, so lets change it for 3.19. Change-Id: I6903079f06bb16b1bde71124920d055b1fb4f0bf Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> Acked-by: Peter Zijlstra <peterz@infradead.org> Acked-by: Davidlohr Bueso <dave@stgolabs.net> Acked-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
This commit is contained in:
parent
59507e2b58
commit
85346f5b6b
1 changed files with 72 additions and 0 deletions
|
@ -164,6 +164,78 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
|
||||||
(typeof(ptr)) (__ptr + (off)); })
|
(typeof(ptr)) (__ptr + (off)); })
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef OPTIMIZER_HIDE_VAR
|
||||||
|
#define OPTIMIZER_HIDE_VAR(var) barrier()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <linux/types.h>
|
||||||
|
|
||||||
|
static __always_inline void data_access_exceeds_word_size(void)
|
||||||
|
#ifdef __compiletime_warning
|
||||||
|
__compiletime_warning("data access exceeds word size and won't be atomic")
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
|
static __always_inline void data_access_exceeds_word_size(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static __always_inline void __read_once_size(volatile void *p, void *res, int size)
|
||||||
|
{
|
||||||
|
switch (size) {
|
||||||
|
case 1: *(__u8 *)res = *(volatile __u8 *)p; break;
|
||||||
|
case 2: *(__u16 *)res = *(volatile __u16 *)p; break;
|
||||||
|
case 4: *(__u32 *)res = *(volatile __u32 *)p; break;
|
||||||
|
default:
|
||||||
|
barrier();
|
||||||
|
__builtin_memcpy((void *)res, (const void *)p, size);
|
||||||
|
data_access_exceeds_word_size();
|
||||||
|
barrier();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static __always_inline void __write_once_size(volatile void *p, void *res, int size)
|
||||||
|
{
|
||||||
|
switch (size) {
|
||||||
|
case 1: *(volatile __u8 *)p = *(__u8 *)res; break;
|
||||||
|
case 2: *(volatile __u16 *)p = *(__u16 *)res; break;
|
||||||
|
case 4: *(volatile __u32 *)p = *(__u32 *)res; break;
|
||||||
|
default:
|
||||||
|
barrier();
|
||||||
|
__builtin_memcpy((void *)p, (const void *)res, size);
|
||||||
|
data_access_exceeds_word_size();
|
||||||
|
barrier();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Prevent the compiler from merging or refetching reads or writes. The
|
||||||
|
* compiler is also forbidden from reordering successive instances of
|
||||||
|
* READ_ONCE, WRITE_ONCE and ACCESS_ONCE (see below), but only when the
|
||||||
|
* compiler is aware of some particular ordering. One way to make the
|
||||||
|
* compiler aware of ordering is to put the two invocations of READ_ONCE,
|
||||||
|
* WRITE_ONCE or ACCESS_ONCE() in different C statements.
|
||||||
|
*
|
||||||
|
* In contrast to ACCESS_ONCE these two macros will also work on aggregate
|
||||||
|
* data types like structs or unions. If the size of the accessed data
|
||||||
|
* type exceeds the word size of the machine (e.g., 32 bits or 64 bits)
|
||||||
|
* READ_ONCE() and WRITE_ONCE() will fall back to memcpy and print a
|
||||||
|
* compile-time warning.
|
||||||
|
*
|
||||||
|
* Their two major use cases are: (1) Mediating communication between
|
||||||
|
* process-level code and irq/NMI handlers, all running on the same CPU,
|
||||||
|
* and (2) Ensuring that the compiler does not fold, spindle, or otherwise
|
||||||
|
* mutilate accesses that either do not require ordering or that interact
|
||||||
|
* with an explicit memory barrier or atomic instruction that provides the
|
||||||
|
* required ordering.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define READ_ONCE(x) \
|
||||||
|
({ typeof(x) __val; __read_once_size(&x, &__val, sizeof(__val)); __val; })
|
||||||
|
|
||||||
|
#define WRITE_ONCE(x, val) \
|
||||||
|
({ typeof(x) __val; __val = val; __write_once_size(&x, &__val, sizeof(__val)); __val; })
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
|
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
Loading…
Reference in a new issue