diff options
Diffstat (limited to 'kernel/futex.c')
-rw-r--r-- | kernel/futex.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/kernel/futex.c b/kernel/futex.c index be3bff2315ff..fdd312da0992 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
@@ -1452,11 +1452,7 @@ static void mark_wake_futex(struct wake_q_head *wake_q, struct futex_q *q) | |||
1452 | if (WARN(q->pi_state || q->rt_waiter, "refusing to wake PI futex\n")) | 1452 | if (WARN(q->pi_state || q->rt_waiter, "refusing to wake PI futex\n")) |
1453 | return; | 1453 | return; |
1454 | 1454 | ||
1455 | /* | 1455 | get_task_struct(p); |
1456 | * Queue the task for later wakeup for after we've released | ||
1457 | * the hb->lock. wake_q_add() grabs reference to p. | ||
1458 | */ | ||
1459 | wake_q_add(wake_q, p); | ||
1460 | __unqueue_futex(q); | 1456 | __unqueue_futex(q); |
1461 | /* | 1457 | /* |
1462 | * The waiting task can free the futex_q as soon as q->lock_ptr = NULL | 1458 | * The waiting task can free the futex_q as soon as q->lock_ptr = NULL |
@@ -1466,6 +1462,13 @@ static void mark_wake_futex(struct wake_q_head *wake_q, struct futex_q *q) | |||
1466 | * plist_del in __unqueue_futex(). | 1462 | * plist_del in __unqueue_futex(). |
1467 | */ | 1463 | */ |
1468 | smp_store_release(&q->lock_ptr, NULL); | 1464 | smp_store_release(&q->lock_ptr, NULL); |
1465 | |||
1466 | /* | ||
1467 | * Queue the task for later wakeup for after we've released | ||
1468 | * the hb->lock. wake_q_add() grabs reference to p. | ||
1469 | */ | ||
1470 | wake_q_add(wake_q, p); | ||
1471 | put_task_struct(p); | ||
1469 | } | 1472 | } |
1470 | 1473 | ||
1471 | /* | 1474 | /* |