| 1 | #ifndef _UAPI_LINUX_MEMBARRIER_H | 
|---|
| 2 | #define _UAPI_LINUX_MEMBARRIER_H | 
|---|
| 3 |  | 
|---|
| 4 | /* | 
|---|
| 5 | * linux/membarrier.h | 
|---|
| 6 | * | 
|---|
| 7 | * membarrier system call API | 
|---|
| 8 | * | 
|---|
| 9 | * Copyright (c) 2010, 2015 Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | 
|---|
| 10 | * | 
|---|
| 11 | * Permission is hereby granted, free of charge, to any person obtaining a copy | 
|---|
| 12 | * of this software and associated documentation files (the "Software"), to deal | 
|---|
| 13 | * in the Software without restriction, including without limitation the rights | 
|---|
| 14 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | 
|---|
| 15 | * copies of the Software, and to permit persons to whom the Software is | 
|---|
| 16 | * furnished to do so, subject to the following conditions: | 
|---|
| 17 | * | 
|---|
| 18 | * The above copyright notice and this permission notice shall be included in | 
|---|
| 19 | * all copies or substantial portions of the Software. | 
|---|
| 20 | * | 
|---|
| 21 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | 
|---|
| 22 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 
|---|
| 23 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | 
|---|
| 24 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | 
|---|
| 25 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | 
|---|
| 26 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | 
|---|
| 27 | * SOFTWARE. | 
|---|
| 28 | */ | 
|---|
| 29 |  | 
|---|
| 30 | /** | 
|---|
| 31 | * enum membarrier_cmd - membarrier system call command | 
|---|
| 32 | * @MEMBARRIER_CMD_QUERY:   Query the set of supported commands. It returns | 
|---|
| 33 | *                          a bitmask of valid commands. | 
|---|
| 34 | * @MEMBARRIER_CMD_GLOBAL:  Execute a memory barrier on all running threads. | 
|---|
| 35 | *                          Upon return from system call, the caller thread | 
|---|
| 36 | *                          is ensured that all running threads have passed | 
|---|
| 37 | *                          through a state where all memory accesses to | 
|---|
| 38 | *                          user-space addresses match program order between | 
|---|
| 39 | *                          entry to and return from the system call | 
|---|
| 40 | *                          (non-running threads are de facto in such a | 
|---|
| 41 | *                          state). This covers threads from all processes | 
|---|
| 42 | *                          running on the system. This command returns 0. | 
|---|
| 43 | * @MEMBARRIER_CMD_GLOBAL_EXPEDITED: | 
|---|
| 44 | *                          Execute a memory barrier on all running threads | 
|---|
| 45 | *                          of all processes which previously registered | 
|---|
| 46 | *                          with MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED. | 
|---|
| 47 | *                          Upon return from system call, the caller thread | 
|---|
| 48 | *                          is ensured that all running threads have passed | 
|---|
| 49 | *                          through a state where all memory accesses to | 
|---|
| 50 | *                          user-space addresses match program order between | 
|---|
| 51 | *                          entry to and return from the system call | 
|---|
| 52 | *                          (non-running threads are de facto in such a | 
|---|
| 53 | *                          state). This only covers threads from processes | 
|---|
| 54 | *                          which registered with | 
|---|
| 55 | *                          MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED. | 
|---|
| 56 | *                          This command returns 0. Given that | 
|---|
| 57 | *                          registration is about the intent to receive | 
|---|
| 58 | *                          the barriers, it is valid to invoke | 
|---|
| 59 | *                          MEMBARRIER_CMD_GLOBAL_EXPEDITED from a | 
|---|
| 60 | *                          non-registered process. | 
|---|
| 61 | * @MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED: | 
|---|
| 62 | *                          Register the process intent to receive | 
|---|
| 63 | *                          MEMBARRIER_CMD_GLOBAL_EXPEDITED memory | 
|---|
| 64 | *                          barriers. Always returns 0. | 
|---|
| 65 | * @MEMBARRIER_CMD_PRIVATE_EXPEDITED: | 
|---|
| 66 | *                          Execute a memory barrier on each running | 
|---|
| 67 | *                          thread belonging to the same process as the current | 
|---|
| 68 | *                          thread. Upon return from system call, the | 
|---|
| 69 | *                          caller thread is ensured that all its running | 
|---|
| 70 | *                          threads siblings have passed through a state | 
|---|
| 71 | *                          where all memory accesses to user-space | 
|---|
| 72 | *                          addresses match program order between entry | 
|---|
| 73 | *                          to and return from the system call | 
|---|
| 74 | *                          (non-running threads are de facto in such a | 
|---|
| 75 | *                          state). This only covers threads from the | 
|---|
| 76 | *                          same process as the caller thread. This | 
|---|
| 77 | *                          command returns 0 on success. The | 
|---|
| 78 | *                          "expedited" commands complete faster than | 
|---|
| 79 | *                          the non-expedited ones, they never block, | 
|---|
| 80 | *                          but have the downside of causing extra | 
|---|
| 81 | *                          overhead. A process needs to register its | 
|---|
| 82 | *                          intent to use the private expedited command | 
|---|
| 83 | *                          prior to using it, otherwise this command | 
|---|
| 84 | *                          returns -EPERM. | 
|---|
| 85 | * @MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED: | 
|---|
| 86 | *                          Register the process intent to use | 
|---|
| 87 | *                          MEMBARRIER_CMD_PRIVATE_EXPEDITED. Always | 
|---|
| 88 | *                          returns 0. | 
|---|
| 89 | * @MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE: | 
|---|
| 90 | *                          In addition to provide memory ordering | 
|---|
| 91 | *                          guarantees described in | 
|---|
| 92 | *                          MEMBARRIER_CMD_PRIVATE_EXPEDITED, ensure | 
|---|
| 93 | *                          the caller thread, upon return from system | 
|---|
| 94 | *                          call, that all its running threads siblings | 
|---|
| 95 | *                          have executed a core serializing | 
|---|
| 96 | *                          instruction. (architectures are required to | 
|---|
| 97 | *                          guarantee that non-running threads issue | 
|---|
| 98 | *                          core serializing instructions before they | 
|---|
| 99 | *                          resume user-space execution). This only | 
|---|
| 100 | *                          covers threads from the same process as the | 
|---|
| 101 | *                          caller thread. This command returns 0 on | 
|---|
| 102 | *                          success. The "expedited" commands complete | 
|---|
| 103 | *                          faster than the non-expedited ones, they | 
|---|
| 104 | *                          never block, but have the downside of | 
|---|
| 105 | *                          causing extra overhead. If this command is | 
|---|
| 106 | *                          not implemented by an architecture, -EINVAL | 
|---|
| 107 | *                          is returned. A process needs to register its | 
|---|
| 108 | *                          intent to use the private expedited sync | 
|---|
| 109 | *                          core command prior to using it, otherwise | 
|---|
| 110 | *                          this command returns -EPERM. | 
|---|
| 111 | * @MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE: | 
|---|
| 112 | *                          Register the process intent to use | 
|---|
| 113 | *                          MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE. | 
|---|
| 114 | *                          If this command is not implemented by an | 
|---|
| 115 | *                          architecture, -EINVAL is returned. | 
|---|
| 116 | *                          Returns 0 on success. | 
|---|
| 117 | * @MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ: | 
|---|
| 118 | *                          Ensure the caller thread, upon return from | 
|---|
| 119 | *                          system call, that all its running thread | 
|---|
| 120 | *                          siblings have any currently running rseq | 
|---|
| 121 | *                          critical sections restarted if @flags | 
|---|
| 122 | *                          parameter is 0; if @flags parameter is | 
|---|
| 123 | *                          MEMBARRIER_CMD_FLAG_CPU, | 
|---|
| 124 | *                          then this operation is performed only | 
|---|
| 125 | *                          on CPU indicated by @cpu_id. If this command is | 
|---|
| 126 | *                          not implemented by an architecture, -EINVAL | 
|---|
| 127 | *                          is returned. A process needs to register its | 
|---|
| 128 | *                          intent to use the private expedited rseq | 
|---|
| 129 | *                          command prior to using it, otherwise | 
|---|
| 130 | *                          this command returns -EPERM. | 
|---|
| 131 | * @MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ: | 
|---|
| 132 | *                          Register the process intent to use | 
|---|
| 133 | *                          MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ. | 
|---|
| 134 | *                          If this command is not implemented by an | 
|---|
| 135 | *                          architecture, -EINVAL is returned. | 
|---|
| 136 | *                          Returns 0 on success. | 
|---|
| 137 | * @MEMBARRIER_CMD_SHARED: | 
|---|
| 138 | *                          Alias to MEMBARRIER_CMD_GLOBAL. Provided for | 
|---|
| 139 | *                          header backward compatibility. | 
|---|
| 140 | * @MEMBARRIER_CMD_GET_REGISTRATIONS: | 
|---|
| 141 | *                          Returns a bitmask of previously issued | 
|---|
| 142 | *                          registration commands. | 
|---|
| 143 | * | 
|---|
| 144 | * Command to be passed to the membarrier system call. The commands need to | 
|---|
| 145 | * be a single bit each, except for MEMBARRIER_CMD_QUERY which is assigned to | 
|---|
| 146 | * the value 0. | 
|---|
| 147 | */ | 
|---|
| 148 | enum membarrier_cmd { | 
|---|
| 149 | MEMBARRIER_CMD_QUERY					= 0, | 
|---|
| 150 | MEMBARRIER_CMD_GLOBAL					= (1 << 0), | 
|---|
| 151 | MEMBARRIER_CMD_GLOBAL_EXPEDITED				= (1 << 1), | 
|---|
| 152 | MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED		= (1 << 2), | 
|---|
| 153 | MEMBARRIER_CMD_PRIVATE_EXPEDITED			= (1 << 3), | 
|---|
| 154 | MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED		= (1 << 4), | 
|---|
| 155 | MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE		= (1 << 5), | 
|---|
| 156 | MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE	= (1 << 6), | 
|---|
| 157 | MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ			= (1 << 7), | 
|---|
| 158 | MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ		= (1 << 8), | 
|---|
| 159 | MEMBARRIER_CMD_GET_REGISTRATIONS			= (1 << 9), | 
|---|
| 160 |  | 
|---|
| 161 | /* Alias for header backward compatibility. */ | 
|---|
| 162 | MEMBARRIER_CMD_SHARED			= MEMBARRIER_CMD_GLOBAL, | 
|---|
| 163 | }; | 
|---|
| 164 |  | 
|---|
| 165 | enum membarrier_cmd_flag { | 
|---|
| 166 | MEMBARRIER_CMD_FLAG_CPU		= (1 << 0), | 
|---|
| 167 | }; | 
|---|
| 168 |  | 
|---|
| 169 | #endif /* _UAPI_LINUX_MEMBARRIER_H */ | 
|---|
| 170 |  | 
|---|