As the futex_state structure will be overloaded in later patches
to be used by non-PI futexes, it is necessary to add a type field to
distinguish among different types of futexes.

Signed-off-by: Waiman Long <long...@redhat.com>
---
 kernel/futex.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/kernel/futex.c b/kernel/futex.c
index cff711d..fd365b2 100644
--- a/kernel/futex.c
+++ b/kernel/futex.c
@@ -193,6 +193,10 @@
 #define FLAGS_CLOCKRT          0x02
 #define FLAGS_HAS_TIMEOUT      0x04
 
+enum futex_type {
+       TYPE_PI = 0,
+};
+
 /*
  * Futex state object:
  *  - Priority Inheritance state
@@ -212,6 +216,7 @@ struct futex_state {
        struct task_struct *owner;
        atomic_t refcount;
 
+       enum futex_type type;
        union futex_key key;
 };
 
@@ -905,13 +910,14 @@ static void put_futex_state(struct futex_state *state)
                return;
 
        /*
-        * If state->owner is NULL, the owner is most probably dying
-        * and has cleaned up the futex state already
+        * If state->owner is NULL and the type is TYPE_PI, the owner is
+        * most probably dying and has cleaned up the futex state already.
         */
        if (state->owner) {
                task_pi_list_del(state, false);
 
-               rt_mutex_proxy_unlock(&state->pi_mutex, state->owner);
+               if (state->type == TYPE_PI)
+                       rt_mutex_proxy_unlock(&state->pi_mutex, state->owner);
        }
 
        if (current->pi_state_cache)
@@ -1064,7 +1070,7 @@ static int attach_to_pi_state(u32 uval, struct 
futex_state *pi_state,
        /*
         * Userspace might have messed up non-PI and PI futexes [3]
         */
-       if (unlikely(!pi_state))
+       if (unlikely(!pi_state || (pi_state->type != TYPE_PI)))
                return -EINVAL;
 
        WARN_ON(!atomic_read(&pi_state->refcount));
@@ -1182,6 +1188,7 @@ static int attach_to_pi_owner(u32 uval, union futex_key 
*key,
 
        /* Store the key for possible exit cleanups: */
        pi_state->key = *key;
+       pi_state->type = TYPE_PI;
 
        WARN_ON(!list_empty(&pi_state->list));
        list_add(&pi_state->list, &p->pi_state_list);
-- 
1.8.3.1

--
To unsubscribe from this list: send the line "unsubscribe linux-doc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to