diff options
author | Michael S. Tsirkin <mst@redhat.com> | 2018-01-25 18:36:42 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-01-29 12:02:55 -0500 |
commit | b4eab7de6685ee2691a7e297d511a126dbf53207 (patch) | |
tree | 1166be9a6383433ee2f030bb3f85f8be41c54b13 /tools | |
parent | 6dd42157830d875bdd3c6fefd05cbcf0875b51e8 (diff) |
tools/virtio: copy READ/WRITE_ONCE
This is to make ptr_ring test build again.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/virtio/ringtest/main.h | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/tools/virtio/ringtest/main.h b/tools/virtio/ringtest/main.h index 5706e075adf2..593a3289c87d 100644 --- a/tools/virtio/ringtest/main.h +++ b/tools/virtio/ringtest/main.h | |||
@@ -134,4 +134,61 @@ static inline void busy_wait(void) | |||
134 | barrier(); \ | 134 | barrier(); \ |
135 | } while (0) | 135 | } while (0) |
136 | 136 | ||
137 | #if defined(__i386__) || defined(__x86_64__) || defined(__s390x__) | ||
138 | #define smp_wmb() barrier() | ||
139 | #else | ||
140 | #define smp_wmb() smp_release() | ||
141 | #endif | ||
142 | |||
143 | #ifdef __alpha__ | ||
144 | #define smp_read_barrier_depends() smp_acquire() | ||
145 | #else | ||
146 | #define smp_read_barrier_depends() do {} while(0) | ||
147 | #endif | ||
148 | |||
149 | static __always_inline | ||
150 | void __read_once_size(const volatile void *p, void *res, int size) | ||
151 | { | ||
152 | switch (size) { \ | ||
153 | case 1: *(unsigned char *)res = *(volatile unsigned char *)p; break; \ | ||
154 | case 2: *(unsigned short *)res = *(volatile unsigned short *)p; break; \ | ||
155 | case 4: *(unsigned int *)res = *(volatile unsigned int *)p; break; \ | ||
156 | case 8: *(unsigned long long *)res = *(volatile unsigned long long *)p; break; \ | ||
157 | default: \ | ||
158 | barrier(); \ | ||
159 | __builtin_memcpy((void *)res, (const void *)p, size); \ | ||
160 | barrier(); \ | ||
161 | } \ | ||
162 | } | ||
163 | |||
164 | static __always_inline void __write_once_size(volatile void *p, void *res, int size) | ||
165 | { | ||
166 | switch (size) { | ||
167 | case 1: *(volatile unsigned char *)p = *(unsigned char *)res; break; | ||
168 | case 2: *(volatile unsigned short *)p = *(unsigned short *)res; break; | ||
169 | case 4: *(volatile unsigned int *)p = *(unsigned int *)res; break; | ||
170 | case 8: *(volatile unsigned long long *)p = *(unsigned long long *)res; break; | ||
171 | default: | ||
172 | barrier(); | ||
173 | __builtin_memcpy((void *)p, (const void *)res, size); | ||
174 | barrier(); | ||
175 | } | ||
176 | } | ||
177 | |||
178 | #define READ_ONCE(x) \ | ||
179 | ({ \ | ||
180 | union { typeof(x) __val; char __c[1]; } __u; \ | ||
181 | __read_once_size(&(x), __u.__c, sizeof(x)); \ | ||
182 | smp_read_barrier_depends(); /* Enforce dependency ordering from x */ \ | ||
183 | __u.__val; \ | ||
184 | }) | ||
185 | |||
186 | #define WRITE_ONCE(x, val) \ | ||
187 | ({ \ | ||
188 | union { typeof(x) __val; char __c[1]; } __u = \ | ||
189 | { .__val = (typeof(x)) (val) }; \ | ||
190 | __write_once_size(&(x), __u.__c, sizeof(x)); \ | ||
191 | __u.__val; \ | ||
192 | }) | ||
193 | |||
137 | #endif | 194 | #endif |