mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-09-18 23:19:34 +02:00
Commit079afb081c("io_uring/futex: mark wait requests as inflight") added inflight tracking to ensure that do_exit() -> io_uring_files_cancel() finds and cancels pending futex waits before the mm goes away, as a private futex wait depends on the mm private futex hash staying alive for the duration of the request. However, as io_futex_prep() is shared between FUTEX_WAIT and FUTEX_WAKE, wake requests got marked as inflight as well. A futex wake executes fully inline at issue time and never depends on the mm staying alive after completion, hence there's no need to track it. Kill it. Cc: stable@vger.kernel.org Fixes:079afb081c("io_uring/futex: mark wait requests as inflight") Reported-by: Chengfeng Lin <lin2530632123@gmail.com> Link: https://lore.kernel.org/io-uring/CANGjgdn=R_qyUdE=j9za+vkmqcxacbP-84OHXF4nZ4ho9qRyVg@mail.gmail.com/ Signed-off-by: Jens Axboe <axboe@kernel.dk>
39 lines
1.2 KiB
C
39 lines
1.2 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
#include "cancel.h"
|
|
|
|
int io_futex_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe);
|
|
int io_futex_wait_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe);
|
|
int io_futexv_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe);
|
|
int io_futex_wait(struct io_kiocb *req, unsigned int issue_flags);
|
|
int io_futexv_wait(struct io_kiocb *req, unsigned int issue_flags);
|
|
int io_futex_wake(struct io_kiocb *req, unsigned int issue_flags);
|
|
|
|
#if defined(CONFIG_FUTEX)
|
|
int io_futex_cancel(struct io_ring_ctx *ctx, struct io_cancel_data *cd,
|
|
unsigned int issue_flags);
|
|
bool io_futex_remove_all(struct io_ring_ctx *ctx, struct io_uring_task *tctx,
|
|
bool cancel_all);
|
|
bool io_futex_cache_init(struct io_ring_ctx *ctx);
|
|
void io_futex_cache_free(struct io_ring_ctx *ctx);
|
|
#else
|
|
static inline int io_futex_cancel(struct io_ring_ctx *ctx,
|
|
struct io_cancel_data *cd,
|
|
unsigned int issue_flags)
|
|
{
|
|
return 0;
|
|
}
|
|
static inline bool io_futex_remove_all(struct io_ring_ctx *ctx,
|
|
struct io_uring_task *tctx, bool cancel_all)
|
|
{
|
|
return false;
|
|
}
|
|
static inline bool io_futex_cache_init(struct io_ring_ctx *ctx)
|
|
{
|
|
return false;
|
|
}
|
|
static inline void io_futex_cache_free(struct io_ring_ctx *ctx)
|
|
{
|
|
}
|
|
#endif
|