mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
io_uring/bpf-ops: restrict ctx access to BPF
BPF programs should have no need in looking into struct io_ring_ctx, if
anything, most of such cases would be anti patterns like looking up ring
indices directly via the context.
Replace it with a new empty structure, which is just an alias to struct
io_ring_ctx. It'll create a new BTF type and fail verification if a BPF
program tries to access it (beyond the first byte). It'll also give more
flexibility for the future, and otherwise it can be made aligned with
io_ring_ctx as before with struct groups if ever needed or extended in a
different way.
Fixes: d0e437b76b ("io_uring/bpf-ops: implement loop_step with BPF struct_ops")
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://patch.msgid.link/5f6ca3649e9e0bae8667db4357e28dd00cd07901.1780394491.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
29bef9934b
commit
ec02fe217f
|
|
@ -290,6 +290,8 @@ enum {
|
||||||
IO_RING_F_IOWQ_LIMITS_SET = BIT(12),
|
IO_RING_F_IOWQ_LIMITS_SET = BIT(12),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct iou_ctx {};
|
||||||
|
|
||||||
struct io_ring_ctx {
|
struct io_ring_ctx {
|
||||||
/* const or read-mostly hot data */
|
/* const or read-mostly hot data */
|
||||||
struct {
|
struct {
|
||||||
|
|
@ -366,7 +368,7 @@ struct io_ring_ctx {
|
||||||
struct io_alloc_cache rw_cache;
|
struct io_alloc_cache rw_cache;
|
||||||
struct io_alloc_cache cmd_cache;
|
struct io_alloc_cache cmd_cache;
|
||||||
|
|
||||||
int (*loop_step)(struct io_ring_ctx *ctx,
|
int (*loop_step)(struct iou_ctx *,
|
||||||
struct iou_loop_params *);
|
struct iou_loop_params *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
|
|
@ -14,15 +14,18 @@ static const struct btf_type *loop_params_type;
|
||||||
|
|
||||||
__bpf_kfunc_start_defs();
|
__bpf_kfunc_start_defs();
|
||||||
|
|
||||||
__bpf_kfunc int bpf_io_uring_submit_sqes(struct io_ring_ctx *ctx, u32 nr)
|
__bpf_kfunc int bpf_io_uring_submit_sqes(struct iou_ctx *loop_ctx, u32 nr)
|
||||||
{
|
{
|
||||||
|
struct io_ring_ctx *ctx = io_loop_demangle_ctx(loop_ctx);
|
||||||
|
|
||||||
return io_submit_sqes(ctx, nr);
|
return io_submit_sqes(ctx, nr);
|
||||||
}
|
}
|
||||||
|
|
||||||
__bpf_kfunc
|
__bpf_kfunc
|
||||||
__u8 *bpf_io_uring_get_region(struct io_ring_ctx *ctx, __u32 region_id,
|
__u8 *bpf_io_uring_get_region(struct iou_ctx *loop_ctx, __u32 region_id,
|
||||||
const size_t rdwr_buf_size)
|
const size_t rdwr_buf_size)
|
||||||
{
|
{
|
||||||
|
struct io_ring_ctx *ctx = io_loop_demangle_ctx(loop_ctx);
|
||||||
struct io_mapped_region *r;
|
struct io_mapped_region *r;
|
||||||
|
|
||||||
lockdep_assert_held(&ctx->uring_lock);
|
lockdep_assert_held(&ctx->uring_lock);
|
||||||
|
|
@ -58,7 +61,7 @@ static const struct btf_kfunc_id_set bpf_io_uring_kfunc_set = {
|
||||||
.set = &io_uring_kfunc_set,
|
.set = &io_uring_kfunc_set,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int io_bpf_ops__loop_step(struct io_ring_ctx *ctx,
|
static int io_bpf_ops__loop_step(struct iou_ctx *ctx,
|
||||||
struct iou_loop_params *lp)
|
struct iou_loop_params *lp)
|
||||||
{
|
{
|
||||||
return IOU_LOOP_STOP;
|
return IOU_LOOP_STOP;
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ enum {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct io_uring_bpf_ops {
|
struct io_uring_bpf_ops {
|
||||||
int (*loop_step)(struct io_ring_ctx *ctx, struct iou_loop_params *lp);
|
int (*loop_step)(struct iou_ctx *, struct iou_loop_params *lp);
|
||||||
|
|
||||||
__u32 ring_fd;
|
__u32 ring_fd;
|
||||||
void *priv;
|
void *priv;
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,7 @@ static int __io_run_loop(struct io_ring_ctx *ctx)
|
||||||
if (unlikely(!ctx->loop_step))
|
if (unlikely(!ctx->loop_step))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
step_res = ctx->loop_step(ctx, &lp);
|
step_res = ctx->loop_step(io_loop_mangle_ctx(ctx), &lp);
|
||||||
if (step_res == IOU_LOOP_STOP)
|
if (step_res == IOU_LOOP_STOP)
|
||||||
break;
|
break;
|
||||||
if (step_res != IOU_LOOP_CONTINUE)
|
if (step_res != IOU_LOOP_CONTINUE)
|
||||||
|
|
|
||||||
|
|
@ -24,4 +24,14 @@ static inline bool io_has_loop_ops(struct io_ring_ctx *ctx)
|
||||||
|
|
||||||
int io_run_loop(struct io_ring_ctx *ctx);
|
int io_run_loop(struct io_ring_ctx *ctx);
|
||||||
|
|
||||||
|
static inline struct iou_ctx *io_loop_mangle_ctx(struct io_ring_ctx *ctx)
|
||||||
|
{
|
||||||
|
return (struct iou_ctx *)ctx;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline struct io_ring_ctx *io_loop_demangle_ctx(struct iou_ctx *ctx)
|
||||||
|
{
|
||||||
|
return (struct io_ring_ctx *)ctx;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user