#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/fs.h>
#include <linux/file.h>
#include <linux/io_uring.h>
#include <uapi/linux/io_uring.h>
#include "../kernel/futex/futex.h"
#include "io_uring.h"
#include "alloc_cache.h"
#include "futex.h"
struct io_futex { … };
struct io_futex_data { … };
#define IO_FUTEX_ALLOC_CACHE_MAX …
bool io_futex_cache_init(struct io_ring_ctx *ctx)
{ … }
void io_futex_cache_free(struct io_ring_ctx *ctx)
{ … }
static void __io_futex_complete(struct io_kiocb *req, struct io_tw_state *ts)
{ … }
static void io_futex_complete(struct io_kiocb *req, struct io_tw_state *ts)
{ … }
static void io_futexv_complete(struct io_kiocb *req, struct io_tw_state *ts)
{ … }
static bool io_futexv_claim(struct io_futex *iof)
{ … }
static bool __io_futex_cancel(struct io_ring_ctx *ctx, struct io_kiocb *req)
{ … }
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 task_struct *task,
bool cancel_all)
{ … }
int io_futex_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
{ … }
static void io_futex_wakev_fn(struct wake_q_head *wake_q, struct futex_q *q)
{ … }
int io_futexv_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
{ … }
static void io_futex_wake_fn(struct wake_q_head *wake_q, struct futex_q *q)
{ … }
static struct io_futex_data *io_alloc_ifd(struct io_ring_ctx *ctx)
{ … }
int io_futexv_wait(struct io_kiocb *req, unsigned int issue_flags)
{ … }
int io_futex_wait(struct io_kiocb *req, unsigned int issue_flags)
{ … }
int io_futex_wake(struct io_kiocb *req, unsigned int issue_flags)
{ … }