18 #ifndef _COBALT_UAPI_KERNEL_URW_H
19 #define _COBALT_UAPI_KERNEL_URW_H
21 #include <linux/types.h>
53 #define URW_INITIALIZER { 0 }
54 #define DEFINE_URW(__name) urw_t __name = URW_INITIALIZER
57 #define READ_ONCE ACCESS_ONCE
60 static inline void __try_read_start(
const urw_t *urw, urwstate_t *tmp)
64 token = READ_ONCE(urw->sequence);
75 static inline void __try_read_end(
const urw_t *urw, urwstate_t *tmp)
78 if (urw->sequence != tmp->token) {
79 __try_read_start(urw, tmp);
86 static inline void __do_write_start(urw_t *urw, urwstate_t *tmp)
93 static inline void __do_write_end(urw_t *urw, urwstate_t *tmp)
100 static inline void unsynced_rw_init(urw_t *urw)
105 #define unsynced_read_block(__tmp, __urw) \
106 for (__try_read_start(__urw, __tmp); \
107 (__tmp)->dirty; __try_read_end(__urw, __tmp))
109 #define unsynced_write_block(__tmp, __urw) \
110 for (__do_write_start(__urw, __tmp); \
111 (__tmp)->dirty; __do_write_end(__urw, __tmp))