What's the status of this?

On 16.10.2017 14:36, Emil Velikov wrote:
On 16 October 2017 at 08:06, Timothy Arceri <tarc...@itsqueeze.com> wrote:
While modern pthread mutexes are very fast, they still incur a call to an
external DSO and overhead of the generality and features of pthread mutexes.
Most mutexes in mesa only needs lock/unlock, and the idea here is that we can
inline the atomic operation and make the fast case just two intructions.
Mutexes are subtle and finicky to implement, so we carefully copy the
implementation from Ulrich Dreppers well-written and well-reviewed paper:

   "Futexes Are Tricky"
   http://www.akkadia.org/drepper/futex.pdf

We implement "mutex3", which gives us a mutex that has no syscalls on
uncontended lock or unlock.  Further, the uncontended case boils down to a
cmpxchg and an untaken branch and the uncontended unlock is just a locked decr
and an untaken branch.  We use __builtin_expect() to indicate that contention
is unlikely so that gcc will put the contention code out of the main code
flow.

Worth using likely/unlikely macros from src/util/macros.h?

  configure.ac                     |   3 +
  src/intel/vulkan/anv_allocator.c |  24 +-----
  src/util/Makefile.sources        |   1 +
  src/util/meson.build             |   1 +
  src/util/simple_mtx.h            | 153 +++++++++++++++++++++++++++++++++++++++
  5 files changed, 159 insertions(+), 23 deletions(-)
  create mode 100644 src/util/simple_mtx.h

diff --git a/configure.ac b/configure.ac
index 62d33a1941c..c113e714638 100644
--- a/configure.ac
+++ b/configure.ac
@@ -894,6 +894,9 @@ if test "x$pthread_stubs_possible" = xyes; then
      PKG_CHECK_MODULES(PTHREADSTUBS, pthread-stubs >= 0.4)
  fi

+dnl Check for futex for fast inline simple_mtx_t.
+AC_CHECK_HEADER([linux/futex.h], [DEFINES="$DEFINES -DHAVE_FUTEX"])
+
Dylan you might want a similar check for Meson?


+static inline int futex_wake(uint32_t *addr, int count) {
+   return sys_futex(addr, FUTEX_WAKE, count, NULL, NULL, 0);
+}
+
+static inline int futex_wait(uint32_t *addr, int32_t value) {
+   return sys_futex(addr, FUTEX_WAIT, value, NULL, NULL, 0);
+}
Coding style: please keep { on the next line.

-Emil
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev



--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to