]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - include/linux/ww_mutex.h
locking: Implement an algorithm choice for Wound-Wait mutexes
[linux.git] / include / linux / ww_mutex.h
index f82fce2229c8d30148b402514f81731350ec4f8e..3af7c0e03be5444d92fd2b80d49bc916c139550d 100644 (file)
@@ -8,6 +8,8 @@
  *
  * Wait/Die implementation:
  *  Copyright (C) 2013 Canonical Ltd.
+ * Choice of algorithm:
+ *  Copyright (C) 2018 WMWare Inc.
  *
  * This file contains the main data structure and API definitions.
  */
@@ -23,12 +25,15 @@ struct ww_class {
        struct lock_class_key mutex_key;
        const char *acquire_name;
        const char *mutex_name;
+       unsigned int is_wait_die;
 };
 
 struct ww_acquire_ctx {
        struct task_struct *task;
        unsigned long stamp;
        unsigned int acquired;
+       unsigned short wounded;
+       unsigned short is_wait_die;
 #ifdef CONFIG_DEBUG_MUTEXES
        unsigned int done_acquire;
        struct ww_class *ww_class;
@@ -58,17 +63,21 @@ struct ww_mutex {
 # define __WW_CLASS_MUTEX_INITIALIZER(lockname, class)
 #endif
 
-#define __WW_CLASS_INITIALIZER(ww_class) \
+#define __WW_CLASS_INITIALIZER(ww_class, _is_wait_die)     \
                { .stamp = ATOMIC_LONG_INIT(0) \
                , .acquire_name = #ww_class "_acquire" \
-               , .mutex_name = #ww_class "_mutex" }
+               , .mutex_name = #ww_class "_mutex" \
+               , .is_wait_die = _is_wait_die }
 
 #define __WW_MUTEX_INITIALIZER(lockname, class) \
                { .base =  __MUTEX_INITIALIZER(lockname.base) \
                __WW_CLASS_MUTEX_INITIALIZER(lockname, class) }
 
+#define DEFINE_WD_CLASS(classname) \
+       struct ww_class classname = __WW_CLASS_INITIALIZER(classname, 1)
+
 #define DEFINE_WW_CLASS(classname) \
-       struct ww_class classname = __WW_CLASS_INITIALIZER(classname)
+       struct ww_class classname = __WW_CLASS_INITIALIZER(classname, 0)
 
 #define DEFINE_WW_MUTEX(mutexname, ww_class) \
        struct ww_mutex mutexname = __WW_MUTEX_INITIALIZER(mutexname, ww_class)
@@ -123,6 +132,8 @@ static inline void ww_acquire_init(struct ww_acquire_ctx *ctx,
        ctx->task = current;
        ctx->stamp = atomic_long_inc_return_relaxed(&ww_class->stamp);
        ctx->acquired = 0;
+       ctx->wounded = false;
+       ctx->is_wait_die = ww_class->is_wait_die;
 #ifdef CONFIG_DEBUG_MUTEXES
        ctx->ww_class = ww_class;
        ctx->done_acquire = 0;