| @@ -1330,7 +1330,8 @@ static inline int rt_mutex_slowtrylock(struct rt_mutex *lock) · 1329 unmodified lines |
| 1330 | 1330 | |
| 1331 | 1331 | /* |
| 1332 | 1332 | * Slow path to release a rt-mutex. |
| 1333 | | − * Return whether the current task needs to undo a potential priority boosting. |
| 1333 | + * |
| 1334 | + * Return whether the current task needs to call rt_mutex_postunlock(). |
| 1334 | 1335 | */ |
| 1335 | 1336 | static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock, |
| 1336 | 1337 | struct wake_q_head *wake_q) |
| @@ -1401,8 +1402,7 @@ static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock, · 64 unmodified lines |
| 1401 | 1402 | |
| 1402 | 1403 | raw_spin_unlock_irqrestore(&lock->wait_lock, flags); |
| 1403 | 1404 | |
| 1404 | | − /* check PI boosting */ |
| 1405 | | − return true; |
| 1405 | + return true; /* call rt_mutex_postunlock() */ |
| 1406 | 1406 | } |
| 1407 | 1407 | |
| 1408 | 1408 | /* |
| @@ -1449,15 +1449,14 @@ rt_mutex_fasttrylock(struct rt_mutex *lock, · 40 unmodified lines |
| 1449 | 1449 | } |
| 1450 | 1450 | |
| 1451 | 1451 | /* |
| 1452 | | − * Undo pi boosting (if necessary) and wake top waiter. |
| 1452 | + * Performs the wakeup of the the top-waiter and re-enables preemption. |
| 1453 | 1453 | */ |
| 1454 | | −void rt_mutex_postunlock(struct wake_q_head *wake_q, bool deboost) |
| 1454 | +void rt_mutex_postunlock(struct wake_q_head *wake_q) |
| 1455 | 1455 | { |
| 1456 | 1456 | wake_up_q(wake_q); |
| 1457 | 1457 | |
| 1458 | 1458 | /* Pairs with preempt_disable() in rt_mutex_slowunlock() */ |
| 1459 | | − if (deboost) |
| 1460 | | − preempt_enable(); |
| 1459 | + preempt_enable(); |
| 1461 | 1460 | } |
| 1462 | 1461 | |
| 1463 | 1462 | static inline void |
| @@ -1466,14 +1465,12 @@ rt_mutex_fastunlock(struct rt_mutex *lock, · 2 unmodified lines |
| 1466 | 1465 | struct wake_q_head *wqh)) |
| 1467 | 1466 | { |
| 1468 | 1467 | DEFINE_WAKE_Q(wake_q); |
| 1469 | | − bool deboost; |
| 1470 | 1468 | |
| 1471 | 1469 | if (likely(rt_mutex_cmpxchg_release(lock, current, NULL))) |
| 1472 | 1470 | return; |
| 1473 | 1471 | |
| 1474 | | − deboost = slowfn(lock, &wake_q); |
| 1475 | | − |
| 1476 | | − rt_mutex_postunlock(&wake_q, deboost); |
| 1472 | + if (slowfn(lock, &wake_q)) |
| 1473 | + rt_mutex_postunlock(&wake_q); |
| 1477 | 1474 | } |
| 1478 | 1475 | |
| 1479 | 1476 | /** |
| @@ -1593,19 +1590,20 @@ bool __sched __rt_mutex_futex_unlock(struct rt_mutex *lock, · 113 unmodified lines |
| 1593 | 1590 | */ |
| 1594 | 1591 | preempt_disable(); |
| 1595 | 1592 | |
| 1596 | | − return true; /* deboost and wakeups */ |
| 1593 | + return true; /* call postunlock() */ |
| 1597 | 1594 | } |
| 1598 | 1595 | |
| 1599 | 1596 | void __sched rt_mutex_futex_unlock(struct rt_mutex *lock) |
| 1600 | 1597 | { |
| 1601 | 1598 | DEFINE_WAKE_Q(wake_q); |
| 1602 | | − bool deboost; |
| 1599 | + bool postunlock; |
| 1603 | 1600 | |
| 1604 | 1601 | raw_spin_lock_irq(&lock->wait_lock); |
| 1605 | | − deboost = __rt_mutex_futex_unlock(lock, &wake_q); |
| 1602 | + postunlock = __rt_mutex_futex_unlock(lock, &wake_q); |
| 1606 | 1603 | raw_spin_unlock_irq(&lock->wait_lock); |
| 1607 | 1604 | |
| 1608 | | − rt_mutex_postunlock(&wake_q, deboost); |
| 1605 | + if (postunlock) |
| 1606 | + rt_mutex_postunlock(&wake_q); |
| 1609 | 1607 | } |
| 1610 | 1608 | |
| 1611 | 1609 | /** |