History

membarrier: Provide register expedited private command

This introduces a "register private expedited" membarrier command which allows eventual removal of important memory barrier constraints on the scheduler fast-paths. It changes how the "private expedited" membarrier command (new to 4.14) is used from user-space. This new command allows processes to register their intent to use the private expedited command. This affects how the expedited private command introduced in 4.14-rc is meant to be used, and should be merged before 4.14 final. Processes are now required to register before using MEMBARRIER_CMD_PRIVATE_EXPEDITED, otherwise that command returns EPERM. This fixes a problem that arose when designing requested extensions to sys_membarrier() to allow JITs to efficiently flush old code from instruction caches. Several potential algorithms are much less painful if the user register intent to use this functionality early on, for example, before the process spawns the second thread. Registering at this time removes the need to interrupt each and every thread in that process at the first expedited sys_membarrier() system call.

Mathieu Desnoyers committed 9 years ago

Commit a961e401 parent 96f893a5 files · +66 −11Browse files

Showing the changes to include/uapi/linux (1 of 5 files). Show all

Unified · Split

include/uapi/linux/membarrier.h+16−7
@@ -52,21 +52,30 @@ · 51 unmodified lines
52 * (non-running threads are de facto in such a52 * (non-running threads are de facto in such a
53 * state). This only covers threads from the53 * state). This only covers threads from the
54 * same processes as the caller thread. This54 * same processes as the caller thread. This
55 * command returns 0. The "expedited" commands55 * command returns 0 on success. The
56 * complete faster than the non-expedited ones,56 * "expedited" commands complete faster than
57 * they never block, but have the downside of57 * the non-expedited ones, they never block,
58 * causing extra overhead.58 * but have the downside of causing extra
59 * overhead. A process needs to register its
60 * intent to use the private expedited command
61 * prior to using it, otherwise this command
62 * returns -EPERM.
63 * @MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED:
64 * Register the process intent to use
65 * MEMBARRIER_CMD_PRIVATE_EXPEDITED. Always
66 * returns 0.
59 *67 *
60 * Command to be passed to the membarrier system call. The commands need to68 * Command to be passed to the membarrier system call. The commands need to
61 * be a single bit each, except for MEMBARRIER_CMD_QUERY which is assigned to69 * be a single bit each, except for MEMBARRIER_CMD_QUERY which is assigned to
62 * the value 0.70 * the value 0.
63 */71 */
64enum membarrier_cmd {72enum membarrier_cmd {
65 MEMBARRIER_CMD_QUERY = 0,73 MEMBARRIER_CMD_QUERY = 0,
66 MEMBARRIER_CMD_SHARED = (1 << 0),74 MEMBARRIER_CMD_SHARED = (1 << 0),
67 /* reserved for MEMBARRIER_CMD_SHARED_EXPEDITED (1 << 1) */75 /* reserved for MEMBARRIER_CMD_SHARED_EXPEDITED (1 << 1) */
68 /* reserved for MEMBARRIER_CMD_PRIVATE (1 << 2) */76 /* reserved for MEMBARRIER_CMD_PRIVATE (1 << 2) */
69 MEMBARRIER_CMD_PRIVATE_EXPEDITED = (1 << 3),77 MEMBARRIER_CMD_PRIVATE_EXPEDITED = (1 << 3),
78 MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED = (1 << 4),
70};79};
71 80
72#endif /* _UAPI_LINUX_MEMBARRIER_H */81#endif /* _UAPI_LINUX_MEMBARRIER_H */