Commit Graph

6 Commits

Author SHA1 Message Date
Waiman Long c5a50cc2d1 futex: factor out the futex wake handling
JIRA: https://issues.redhat.com/browse/RHEL-28616

commit 12a4be50aff30ee8f2c6a64020c82a4e997e8d6c
Author: Jens Axboe <axboe@kernel.dk>
Date:   Thu, 8 Jun 2023 11:56:06 -0600

    futex: factor out the futex wake handling

    In preparation for having another waker that isn't futex_wake_mark(),
    add a wake handler in futex_q. No extra data is associated with the
    handler outside of struct futex_q itself. futex_wake_mark() is defined as
    the standard wakeup helper, now set through futex_q_init like other
    defaults.

    Normal sync futex waiting relies on wake_q holding tasks that should
    be woken up. This is what futex_wake_mark() does, it'll unqueue the
    futex and add the associated task to the wake queue. For async usage of
    futex waiting, rather than having tasks sleeping on the futex, we'll
    need to deal with a futex wake differently. For the planned io_uring
    case, that means posting a completion event for the task in question.
    Having a definable wake handler can help support that use case.

    Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: Jens Axboe <axboe@kernel.dk>

Signed-off-by: Waiman Long <longman@redhat.com>
2024-03-27 10:12:18 -04:00
Waiman Long cadf4031b1 futex/requeue: Remove unnecessary ‘NULL’ initialization from futex_proxy_trylock_atomic()
JIRA: https://issues.redhat.com/browse/RHEL-28616

commit 01a99a750a4f414c221781de2e5570e0ceae04b5
Author: Li zeming <zeming@nfschina.com>
Date:   Wed, 26 Jul 2023 03:50:47 +0800

    futex/requeue: Remove unnecessary ‘NULL’ initialization from futex_proxy_trylock_atomic()

    'top_waiter' is assigned unconditionally before first use,
    so it does not need an initialization.

    [ mingo: Created legible changelog. ]

    Signed-off-by: Li zeming <zeming@nfschina.com>
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Link: https://lore.kernel.org/r/20230725195047.3106-1-zeming@nfschina.com

Signed-off-by: Waiman Long <longman@redhat.com>
2024-03-27 10:11:51 -04:00
Waiman Long fc0c1c6469 futex: Add flags2 argument to futex_requeue()
JIRA: https://issues.redhat.com/browse/RHEL-28616

commit 27b88f3519e72d71c8cead6b835a26c171109c9b
Author: peterz@infradead.org <peterz@infradead.org>
Date:   Thu, 21 Sep 2023 12:45:14 +0200

    futex: Add flags2 argument to futex_requeue()

    In order to support mixed size requeue, add a second flags argument to
    the internal futex_requeue() function.

    No functional change intended.

    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
    Link: https://lore.kernel.org/r/20230921105248.396780136@noisy.programming.kicks-ass.net

Signed-off-by: Waiman Long <longman@redhat.com>
2024-03-27 10:06:08 -04:00
Waiman Long 0b09ae9329 futex: Propagate flags into get_futex_key()
JIRA: https://issues.redhat.com/browse/RHEL-28616

commit 3b63a55f498b763aba0886b244df613587a73c46
Author: peterz@infradead.org <peterz@infradead.org>
Date:   Thu, 21 Sep 2023 12:45:13 +0200

    futex: Propagate flags into get_futex_key()

    Instead of only passing FLAGS_SHARED as a boolean, pass down flags as
    a whole.

    No functional change intended.

    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
    Link: https://lore.kernel.org/r/20230921105248.282857501@noisy.programming.kicks-ass.net

Signed-off-by: Waiman Long <longman@redhat.com>
2024-03-27 10:06:06 -04:00
Waiman Long 98a92815a8 futex/pi: Fix recursive rt_mutex waiter state
JIRA: https://issues.redhat.com/browse/RHEL-28616

commit fbeb558b0dd0d6348e0872bbbbe96e30c65867b7
Author: Peter Zijlstra <peterz@infradead.org>
Date:   Fri, 15 Sep 2023 17:19:44 +0200

    futex/pi: Fix recursive rt_mutex waiter state

    Some new assertions pointed out that the existing code has nested rt_mutex wait
    state in the futex code.

    Specifically, the futex_lock_pi() cancel case uses spin_lock() while there
    still is a rt_waiter enqueued for this task, resulting in a state where there
    are two waiters for the same task (and task_struct::pi_blocked_on gets
    scrambled).

    The reason to take hb->lock at this point is to avoid the wake_futex_pi()
    EAGAIN case.

    This happens when futex_top_waiter() and rt_mutex_top_waiter() state becomes
    inconsistent. The current rules are such that this inconsistency will not be
    observed.

    Notably the case that needs to be avoided is where futex_lock_pi() and
    futex_unlock_pi() interleave such that unlock will fail to observe a new
    waiter.

    *However* the case at hand is where a waiter is leaving, in this case the race
    means a waiter that is going away is not observed -- which is harmless,
    provided this race is explicitly handled.

    This is a somewhat dangerous proposition because the converse race is not
    observing a new waiter, which must absolutely not happen. But since the race is
    valid this cannot be asserted.

    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
    Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    Tested-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    Link: https://lkml.kernel.org/r/20230915151943.GD6743@noisy.programming.kicks-ass.net

Signed-off-by: Waiman Long <longman@redhat.com>
2024-03-27 10:06:01 -04:00
Joel Savitz ab9104f5b9 futex: Split out requeue
commit e5c6828493b5fa6a3c4606b43e80ab6c5ec1111f
Author: Peter Zijlstra <peterz@infradead.org>
Date:   Thu Sep 23 14:11:02 2021 -0300

    futex: Split out requeue

    Move all the requeue bits into their own file.

    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: André Almeida <andrealmeid@collabora.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: André Almeida <andrealmeid@collabora.com>
    Link: https://lore.kernel.org/r/20210923171111.300673-14-andrealmeid@collabora.com

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2038794
Signed-off-by: Joel Savitz <jsavitz@redhat.com>
2022-03-10 16:55:08 -05:00