xref: /openbmc/linux/io_uring/notif.h (revision eb42cebb)
1 // SPDX-License-Identifier: GPL-2.0
2 
3 #include <linux/net.h>
4 #include <linux/uio.h>
5 #include <net/sock.h>
6 #include <linux/nospec.h>
7 
8 struct io_notif {
9 	struct ubuf_info	uarg;
10 	struct io_ring_ctx	*ctx;
11 
12 	/* cqe->user_data, io_notif_slot::tag if not overridden */
13 	u64			tag;
14 	/* see struct io_notif_slot::seq */
15 	u32			seq;
16 
17 	union {
18 		struct callback_head	task_work;
19 		struct work_struct	commit_work;
20 	};
21 };
22 
23 struct io_notif_slot {
24 	/*
25 	 * Current/active notifier. A slot holds only one active notifier at a
26 	 * time and keeps one reference to it. Flush releases the reference and
27 	 * lazily replaces it with a new notifier.
28 	 */
29 	struct io_notif		*notif;
30 
31 	/*
32 	 * Default ->user_data for this slot notifiers CQEs
33 	 */
34 	u64			tag;
35 	/*
36 	 * Notifiers of a slot live in generations, we create a new notifier
37 	 * only after flushing the previous one. Track the sequential number
38 	 * for all notifiers and copy it into notifiers's cqe->cflags
39 	 */
40 	u32			seq;
41 };
42 
43 int io_notif_unregister(struct io_ring_ctx *ctx);
44 
45 struct io_notif *io_alloc_notif(struct io_ring_ctx *ctx,
46 				struct io_notif_slot *slot);
47 
48 static inline struct io_notif *io_get_notif(struct io_ring_ctx *ctx,
49 					    struct io_notif_slot *slot)
50 {
51 	if (!slot->notif)
52 		slot->notif = io_alloc_notif(ctx, slot);
53 	return slot->notif;
54 }
55 
56 static inline struct io_notif_slot *io_get_notif_slot(struct io_ring_ctx *ctx,
57 						      int idx)
58 	__must_hold(&ctx->uring_lock)
59 {
60 	if (idx >= ctx->nr_notif_slots)
61 		return NULL;
62 	idx = array_index_nospec(idx, ctx->nr_notif_slots);
63 	return &ctx->notif_slots[idx];
64 }
65