xref: /openbmc/linux/io_uring/rsrc.c (revision 73572984)
1*73572984SJens Axboe // SPDX-License-Identifier: GPL-2.0
2*73572984SJens Axboe #include <linux/kernel.h>
3*73572984SJens Axboe #include <linux/errno.h>
4*73572984SJens Axboe #include <linux/fs.h>
5*73572984SJens Axboe #include <linux/file.h>
6*73572984SJens Axboe #include <linux/mm.h>
7*73572984SJens Axboe #include <linux/slab.h>
8*73572984SJens Axboe #include <linux/nospec.h>
9*73572984SJens Axboe #include <linux/hugetlb.h>
10*73572984SJens Axboe #include <linux/compat.h>
11*73572984SJens Axboe #include <linux/io_uring.h>
12*73572984SJens Axboe 
13*73572984SJens Axboe #include <uapi/linux/io_uring.h>
14*73572984SJens Axboe 
15*73572984SJens Axboe #include "io_uring_types.h"
16*73572984SJens Axboe #include "io_uring.h"
17*73572984SJens Axboe #include "openclose.h"
18*73572984SJens Axboe #include "rsrc.h"
19*73572984SJens Axboe 
20*73572984SJens Axboe struct io_rsrc_update {
21*73572984SJens Axboe 	struct file			*file;
22*73572984SJens Axboe 	u64				arg;
23*73572984SJens Axboe 	u32				nr_args;
24*73572984SJens Axboe 	u32				offset;
25*73572984SJens Axboe };
26*73572984SJens Axboe 
27*73572984SJens Axboe static int io_sqe_buffer_register(struct io_ring_ctx *ctx, struct iovec *iov,
28*73572984SJens Axboe 				  struct io_mapped_ubuf **pimu,
29*73572984SJens Axboe 				  struct page **last_hpage);
30*73572984SJens Axboe 
31*73572984SJens Axboe #define IO_RSRC_REF_BATCH	100
32*73572984SJens Axboe 
33*73572984SJens Axboe /* only define max */
34*73572984SJens Axboe #define IORING_MAX_FIXED_FILES	(1U << 20)
35*73572984SJens Axboe #define IORING_MAX_REG_BUFFERS	(1U << 14)
36*73572984SJens Axboe 
37*73572984SJens Axboe void io_rsrc_refs_drop(struct io_ring_ctx *ctx)
38*73572984SJens Axboe 	__must_hold(&ctx->uring_lock)
39*73572984SJens Axboe {
40*73572984SJens Axboe 	if (ctx->rsrc_cached_refs) {
41*73572984SJens Axboe 		io_rsrc_put_node(ctx->rsrc_node, ctx->rsrc_cached_refs);
42*73572984SJens Axboe 		ctx->rsrc_cached_refs = 0;
43*73572984SJens Axboe 	}
44*73572984SJens Axboe }
45*73572984SJens Axboe 
46*73572984SJens Axboe static inline void __io_unaccount_mem(struct user_struct *user,
47*73572984SJens Axboe 				      unsigned long nr_pages)
48*73572984SJens Axboe {
49*73572984SJens Axboe 	atomic_long_sub(nr_pages, &user->locked_vm);
50*73572984SJens Axboe }
51*73572984SJens Axboe 
52*73572984SJens Axboe static inline int __io_account_mem(struct user_struct *user,
53*73572984SJens Axboe 				   unsigned long nr_pages)
54*73572984SJens Axboe {
55*73572984SJens Axboe 	unsigned long page_limit, cur_pages, new_pages;
56*73572984SJens Axboe 
57*73572984SJens Axboe 	/* Don't allow more pages than we can safely lock */
58*73572984SJens Axboe 	page_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT;
59*73572984SJens Axboe 
60*73572984SJens Axboe 	do {
61*73572984SJens Axboe 		cur_pages = atomic_long_read(&user->locked_vm);
62*73572984SJens Axboe 		new_pages = cur_pages + nr_pages;
63*73572984SJens Axboe 		if (new_pages > page_limit)
64*73572984SJens Axboe 			return -ENOMEM;
65*73572984SJens Axboe 	} while (atomic_long_cmpxchg(&user->locked_vm, cur_pages,
66*73572984SJens Axboe 					new_pages) != cur_pages);
67*73572984SJens Axboe 
68*73572984SJens Axboe 	return 0;
69*73572984SJens Axboe }
70*73572984SJens Axboe 
71*73572984SJens Axboe static void io_unaccount_mem(struct io_ring_ctx *ctx, unsigned long nr_pages)
72*73572984SJens Axboe {
73*73572984SJens Axboe 	if (ctx->user)
74*73572984SJens Axboe 		__io_unaccount_mem(ctx->user, nr_pages);
75*73572984SJens Axboe 
76*73572984SJens Axboe 	if (ctx->mm_account)
77*73572984SJens Axboe 		atomic64_sub(nr_pages, &ctx->mm_account->pinned_vm);
78*73572984SJens Axboe }
79*73572984SJens Axboe 
80*73572984SJens Axboe static int io_account_mem(struct io_ring_ctx *ctx, unsigned long nr_pages)
81*73572984SJens Axboe {
82*73572984SJens Axboe 	int ret;
83*73572984SJens Axboe 
84*73572984SJens Axboe 	if (ctx->user) {
85*73572984SJens Axboe 		ret = __io_account_mem(ctx->user, nr_pages);
86*73572984SJens Axboe 		if (ret)
87*73572984SJens Axboe 			return ret;
88*73572984SJens Axboe 	}
89*73572984SJens Axboe 
90*73572984SJens Axboe 	if (ctx->mm_account)
91*73572984SJens Axboe 		atomic64_add(nr_pages, &ctx->mm_account->pinned_vm);
92*73572984SJens Axboe 
93*73572984SJens Axboe 	return 0;
94*73572984SJens Axboe }
95*73572984SJens Axboe 
96*73572984SJens Axboe static int io_copy_iov(struct io_ring_ctx *ctx, struct iovec *dst,
97*73572984SJens Axboe 		       void __user *arg, unsigned index)
98*73572984SJens Axboe {
99*73572984SJens Axboe 	struct iovec __user *src;
100*73572984SJens Axboe 
101*73572984SJens Axboe #ifdef CONFIG_COMPAT
102*73572984SJens Axboe 	if (ctx->compat) {
103*73572984SJens Axboe 		struct compat_iovec __user *ciovs;
104*73572984SJens Axboe 		struct compat_iovec ciov;
105*73572984SJens Axboe 
106*73572984SJens Axboe 		ciovs = (struct compat_iovec __user *) arg;
107*73572984SJens Axboe 		if (copy_from_user(&ciov, &ciovs[index], sizeof(ciov)))
108*73572984SJens Axboe 			return -EFAULT;
109*73572984SJens Axboe 
110*73572984SJens Axboe 		dst->iov_base = u64_to_user_ptr((u64)ciov.iov_base);
111*73572984SJens Axboe 		dst->iov_len = ciov.iov_len;
112*73572984SJens Axboe 		return 0;
113*73572984SJens Axboe 	}
114*73572984SJens Axboe #endif
115*73572984SJens Axboe 	src = (struct iovec __user *) arg;
116*73572984SJens Axboe 	if (copy_from_user(dst, &src[index], sizeof(*dst)))
117*73572984SJens Axboe 		return -EFAULT;
118*73572984SJens Axboe 	return 0;
119*73572984SJens Axboe }
120*73572984SJens Axboe 
121*73572984SJens Axboe static int io_buffer_validate(struct iovec *iov)
122*73572984SJens Axboe {
123*73572984SJens Axboe 	unsigned long tmp, acct_len = iov->iov_len + (PAGE_SIZE - 1);
124*73572984SJens Axboe 
125*73572984SJens Axboe 	/*
126*73572984SJens Axboe 	 * Don't impose further limits on the size and buffer
127*73572984SJens Axboe 	 * constraints here, we'll -EINVAL later when IO is
128*73572984SJens Axboe 	 * submitted if they are wrong.
129*73572984SJens Axboe 	 */
130*73572984SJens Axboe 	if (!iov->iov_base)
131*73572984SJens Axboe 		return iov->iov_len ? -EFAULT : 0;
132*73572984SJens Axboe 	if (!iov->iov_len)
133*73572984SJens Axboe 		return -EFAULT;
134*73572984SJens Axboe 
135*73572984SJens Axboe 	/* arbitrary limit, but we need something */
136*73572984SJens Axboe 	if (iov->iov_len > SZ_1G)
137*73572984SJens Axboe 		return -EFAULT;
138*73572984SJens Axboe 
139*73572984SJens Axboe 	if (check_add_overflow((unsigned long)iov->iov_base, acct_len, &tmp))
140*73572984SJens Axboe 		return -EOVERFLOW;
141*73572984SJens Axboe 
142*73572984SJens Axboe 	return 0;
143*73572984SJens Axboe }
144*73572984SJens Axboe 
145*73572984SJens Axboe static void io_buffer_unmap(struct io_ring_ctx *ctx, struct io_mapped_ubuf **slot)
146*73572984SJens Axboe {
147*73572984SJens Axboe 	struct io_mapped_ubuf *imu = *slot;
148*73572984SJens Axboe 	unsigned int i;
149*73572984SJens Axboe 
150*73572984SJens Axboe 	if (imu != ctx->dummy_ubuf) {
151*73572984SJens Axboe 		for (i = 0; i < imu->nr_bvecs; i++)
152*73572984SJens Axboe 			unpin_user_page(imu->bvec[i].bv_page);
153*73572984SJens Axboe 		if (imu->acct_pages)
154*73572984SJens Axboe 			io_unaccount_mem(ctx, imu->acct_pages);
155*73572984SJens Axboe 		kvfree(imu);
156*73572984SJens Axboe 	}
157*73572984SJens Axboe 	*slot = NULL;
158*73572984SJens Axboe }
159*73572984SJens Axboe 
160*73572984SJens Axboe void io_rsrc_refs_refill(struct io_ring_ctx *ctx)
161*73572984SJens Axboe 	__must_hold(&ctx->uring_lock)
162*73572984SJens Axboe {
163*73572984SJens Axboe 	ctx->rsrc_cached_refs += IO_RSRC_REF_BATCH;
164*73572984SJens Axboe 	percpu_ref_get_many(&ctx->rsrc_node->refs, IO_RSRC_REF_BATCH);
165*73572984SJens Axboe }
166*73572984SJens Axboe 
167*73572984SJens Axboe static void __io_rsrc_put_work(struct io_rsrc_node *ref_node)
168*73572984SJens Axboe {
169*73572984SJens Axboe 	struct io_rsrc_data *rsrc_data = ref_node->rsrc_data;
170*73572984SJens Axboe 	struct io_ring_ctx *ctx = rsrc_data->ctx;
171*73572984SJens Axboe 	struct io_rsrc_put *prsrc, *tmp;
172*73572984SJens Axboe 
173*73572984SJens Axboe 	list_for_each_entry_safe(prsrc, tmp, &ref_node->rsrc_list, list) {
174*73572984SJens Axboe 		list_del(&prsrc->list);
175*73572984SJens Axboe 
176*73572984SJens Axboe 		if (prsrc->tag) {
177*73572984SJens Axboe 			if (ctx->flags & IORING_SETUP_IOPOLL)
178*73572984SJens Axboe 				mutex_lock(&ctx->uring_lock);
179*73572984SJens Axboe 
180*73572984SJens Axboe 			spin_lock(&ctx->completion_lock);
181*73572984SJens Axboe 			io_fill_cqe_aux(ctx, prsrc->tag, 0, 0);
182*73572984SJens Axboe 			io_commit_cqring(ctx);
183*73572984SJens Axboe 			spin_unlock(&ctx->completion_lock);
184*73572984SJens Axboe 			io_cqring_ev_posted(ctx);
185*73572984SJens Axboe 
186*73572984SJens Axboe 			if (ctx->flags & IORING_SETUP_IOPOLL)
187*73572984SJens Axboe 				mutex_unlock(&ctx->uring_lock);
188*73572984SJens Axboe 		}
189*73572984SJens Axboe 
190*73572984SJens Axboe 		rsrc_data->do_put(ctx, prsrc);
191*73572984SJens Axboe 		kfree(prsrc);
192*73572984SJens Axboe 	}
193*73572984SJens Axboe 
194*73572984SJens Axboe 	io_rsrc_node_destroy(ref_node);
195*73572984SJens Axboe 	if (atomic_dec_and_test(&rsrc_data->refs))
196*73572984SJens Axboe 		complete(&rsrc_data->done);
197*73572984SJens Axboe }
198*73572984SJens Axboe 
199*73572984SJens Axboe void io_rsrc_put_work(struct work_struct *work)
200*73572984SJens Axboe {
201*73572984SJens Axboe 	struct io_ring_ctx *ctx;
202*73572984SJens Axboe 	struct llist_node *node;
203*73572984SJens Axboe 
204*73572984SJens Axboe 	ctx = container_of(work, struct io_ring_ctx, rsrc_put_work.work);
205*73572984SJens Axboe 	node = llist_del_all(&ctx->rsrc_put_llist);
206*73572984SJens Axboe 
207*73572984SJens Axboe 	while (node) {
208*73572984SJens Axboe 		struct io_rsrc_node *ref_node;
209*73572984SJens Axboe 		struct llist_node *next = node->next;
210*73572984SJens Axboe 
211*73572984SJens Axboe 		ref_node = llist_entry(node, struct io_rsrc_node, llist);
212*73572984SJens Axboe 		__io_rsrc_put_work(ref_node);
213*73572984SJens Axboe 		node = next;
214*73572984SJens Axboe 	}
215*73572984SJens Axboe }
216*73572984SJens Axboe 
217*73572984SJens Axboe void io_wait_rsrc_data(struct io_rsrc_data *data)
218*73572984SJens Axboe {
219*73572984SJens Axboe 	if (data && !atomic_dec_and_test(&data->refs))
220*73572984SJens Axboe 		wait_for_completion(&data->done);
221*73572984SJens Axboe }
222*73572984SJens Axboe 
223*73572984SJens Axboe void io_rsrc_node_destroy(struct io_rsrc_node *ref_node)
224*73572984SJens Axboe {
225*73572984SJens Axboe 	percpu_ref_exit(&ref_node->refs);
226*73572984SJens Axboe 	kfree(ref_node);
227*73572984SJens Axboe }
228*73572984SJens Axboe 
229*73572984SJens Axboe static __cold void io_rsrc_node_ref_zero(struct percpu_ref *ref)
230*73572984SJens Axboe {
231*73572984SJens Axboe 	struct io_rsrc_node *node = container_of(ref, struct io_rsrc_node, refs);
232*73572984SJens Axboe 	struct io_ring_ctx *ctx = node->rsrc_data->ctx;
233*73572984SJens Axboe 	unsigned long flags;
234*73572984SJens Axboe 	bool first_add = false;
235*73572984SJens Axboe 	unsigned long delay = HZ;
236*73572984SJens Axboe 
237*73572984SJens Axboe 	spin_lock_irqsave(&ctx->rsrc_ref_lock, flags);
238*73572984SJens Axboe 	node->done = true;
239*73572984SJens Axboe 
240*73572984SJens Axboe 	/* if we are mid-quiesce then do not delay */
241*73572984SJens Axboe 	if (node->rsrc_data->quiesce)
242*73572984SJens Axboe 		delay = 0;
243*73572984SJens Axboe 
244*73572984SJens Axboe 	while (!list_empty(&ctx->rsrc_ref_list)) {
245*73572984SJens Axboe 		node = list_first_entry(&ctx->rsrc_ref_list,
246*73572984SJens Axboe 					    struct io_rsrc_node, node);
247*73572984SJens Axboe 		/* recycle ref nodes in order */
248*73572984SJens Axboe 		if (!node->done)
249*73572984SJens Axboe 			break;
250*73572984SJens Axboe 		list_del(&node->node);
251*73572984SJens Axboe 		first_add |= llist_add(&node->llist, &ctx->rsrc_put_llist);
252*73572984SJens Axboe 	}
253*73572984SJens Axboe 	spin_unlock_irqrestore(&ctx->rsrc_ref_lock, flags);
254*73572984SJens Axboe 
255*73572984SJens Axboe 	if (first_add)
256*73572984SJens Axboe 		mod_delayed_work(system_wq, &ctx->rsrc_put_work, delay);
257*73572984SJens Axboe }
258*73572984SJens Axboe 
259*73572984SJens Axboe static struct io_rsrc_node *io_rsrc_node_alloc(void)
260*73572984SJens Axboe {
261*73572984SJens Axboe 	struct io_rsrc_node *ref_node;
262*73572984SJens Axboe 
263*73572984SJens Axboe 	ref_node = kzalloc(sizeof(*ref_node), GFP_KERNEL);
264*73572984SJens Axboe 	if (!ref_node)
265*73572984SJens Axboe 		return NULL;
266*73572984SJens Axboe 
267*73572984SJens Axboe 	if (percpu_ref_init(&ref_node->refs, io_rsrc_node_ref_zero,
268*73572984SJens Axboe 			    0, GFP_KERNEL)) {
269*73572984SJens Axboe 		kfree(ref_node);
270*73572984SJens Axboe 		return NULL;
271*73572984SJens Axboe 	}
272*73572984SJens Axboe 	INIT_LIST_HEAD(&ref_node->node);
273*73572984SJens Axboe 	INIT_LIST_HEAD(&ref_node->rsrc_list);
274*73572984SJens Axboe 	ref_node->done = false;
275*73572984SJens Axboe 	return ref_node;
276*73572984SJens Axboe }
277*73572984SJens Axboe 
278*73572984SJens Axboe void io_rsrc_node_switch(struct io_ring_ctx *ctx,
279*73572984SJens Axboe 			 struct io_rsrc_data *data_to_kill)
280*73572984SJens Axboe 	__must_hold(&ctx->uring_lock)
281*73572984SJens Axboe {
282*73572984SJens Axboe 	WARN_ON_ONCE(!ctx->rsrc_backup_node);
283*73572984SJens Axboe 	WARN_ON_ONCE(data_to_kill && !ctx->rsrc_node);
284*73572984SJens Axboe 
285*73572984SJens Axboe 	io_rsrc_refs_drop(ctx);
286*73572984SJens Axboe 
287*73572984SJens Axboe 	if (data_to_kill) {
288*73572984SJens Axboe 		struct io_rsrc_node *rsrc_node = ctx->rsrc_node;
289*73572984SJens Axboe 
290*73572984SJens Axboe 		rsrc_node->rsrc_data = data_to_kill;
291*73572984SJens Axboe 		spin_lock_irq(&ctx->rsrc_ref_lock);
292*73572984SJens Axboe 		list_add_tail(&rsrc_node->node, &ctx->rsrc_ref_list);
293*73572984SJens Axboe 		spin_unlock_irq(&ctx->rsrc_ref_lock);
294*73572984SJens Axboe 
295*73572984SJens Axboe 		atomic_inc(&data_to_kill->refs);
296*73572984SJens Axboe 		percpu_ref_kill(&rsrc_node->refs);
297*73572984SJens Axboe 		ctx->rsrc_node = NULL;
298*73572984SJens Axboe 	}
299*73572984SJens Axboe 
300*73572984SJens Axboe 	if (!ctx->rsrc_node) {
301*73572984SJens Axboe 		ctx->rsrc_node = ctx->rsrc_backup_node;
302*73572984SJens Axboe 		ctx->rsrc_backup_node = NULL;
303*73572984SJens Axboe 	}
304*73572984SJens Axboe }
305*73572984SJens Axboe 
306*73572984SJens Axboe int io_rsrc_node_switch_start(struct io_ring_ctx *ctx)
307*73572984SJens Axboe {
308*73572984SJens Axboe 	if (ctx->rsrc_backup_node)
309*73572984SJens Axboe 		return 0;
310*73572984SJens Axboe 	ctx->rsrc_backup_node = io_rsrc_node_alloc();
311*73572984SJens Axboe 	return ctx->rsrc_backup_node ? 0 : -ENOMEM;
312*73572984SJens Axboe }
313*73572984SJens Axboe 
314*73572984SJens Axboe __cold static int io_rsrc_ref_quiesce(struct io_rsrc_data *data,
315*73572984SJens Axboe 				      struct io_ring_ctx *ctx)
316*73572984SJens Axboe {
317*73572984SJens Axboe 	int ret;
318*73572984SJens Axboe 
319*73572984SJens Axboe 	/* As we may drop ->uring_lock, other task may have started quiesce */
320*73572984SJens Axboe 	if (data->quiesce)
321*73572984SJens Axboe 		return -ENXIO;
322*73572984SJens Axboe 
323*73572984SJens Axboe 	data->quiesce = true;
324*73572984SJens Axboe 	do {
325*73572984SJens Axboe 		ret = io_rsrc_node_switch_start(ctx);
326*73572984SJens Axboe 		if (ret)
327*73572984SJens Axboe 			break;
328*73572984SJens Axboe 		io_rsrc_node_switch(ctx, data);
329*73572984SJens Axboe 
330*73572984SJens Axboe 		/* kill initial ref, already quiesced if zero */
331*73572984SJens Axboe 		if (atomic_dec_and_test(&data->refs))
332*73572984SJens Axboe 			break;
333*73572984SJens Axboe 		mutex_unlock(&ctx->uring_lock);
334*73572984SJens Axboe 		flush_delayed_work(&ctx->rsrc_put_work);
335*73572984SJens Axboe 		ret = wait_for_completion_interruptible(&data->done);
336*73572984SJens Axboe 		if (!ret) {
337*73572984SJens Axboe 			mutex_lock(&ctx->uring_lock);
338*73572984SJens Axboe 			if (atomic_read(&data->refs) > 0) {
339*73572984SJens Axboe 				/*
340*73572984SJens Axboe 				 * it has been revived by another thread while
341*73572984SJens Axboe 				 * we were unlocked
342*73572984SJens Axboe 				 */
343*73572984SJens Axboe 				mutex_unlock(&ctx->uring_lock);
344*73572984SJens Axboe 			} else {
345*73572984SJens Axboe 				break;
346*73572984SJens Axboe 			}
347*73572984SJens Axboe 		}
348*73572984SJens Axboe 
349*73572984SJens Axboe 		atomic_inc(&data->refs);
350*73572984SJens Axboe 		/* wait for all works potentially completing data->done */
351*73572984SJens Axboe 		flush_delayed_work(&ctx->rsrc_put_work);
352*73572984SJens Axboe 		reinit_completion(&data->done);
353*73572984SJens Axboe 
354*73572984SJens Axboe 		ret = io_run_task_work_sig();
355*73572984SJens Axboe 		mutex_lock(&ctx->uring_lock);
356*73572984SJens Axboe 	} while (ret >= 0);
357*73572984SJens Axboe 	data->quiesce = false;
358*73572984SJens Axboe 
359*73572984SJens Axboe 	return ret;
360*73572984SJens Axboe }
361*73572984SJens Axboe 
362*73572984SJens Axboe static void io_free_page_table(void **table, size_t size)
363*73572984SJens Axboe {
364*73572984SJens Axboe 	unsigned i, nr_tables = DIV_ROUND_UP(size, PAGE_SIZE);
365*73572984SJens Axboe 
366*73572984SJens Axboe 	for (i = 0; i < nr_tables; i++)
367*73572984SJens Axboe 		kfree(table[i]);
368*73572984SJens Axboe 	kfree(table);
369*73572984SJens Axboe }
370*73572984SJens Axboe 
371*73572984SJens Axboe static void io_rsrc_data_free(struct io_rsrc_data *data)
372*73572984SJens Axboe {
373*73572984SJens Axboe 	size_t size = data->nr * sizeof(data->tags[0][0]);
374*73572984SJens Axboe 
375*73572984SJens Axboe 	if (data->tags)
376*73572984SJens Axboe 		io_free_page_table((void **)data->tags, size);
377*73572984SJens Axboe 	kfree(data);
378*73572984SJens Axboe }
379*73572984SJens Axboe 
380*73572984SJens Axboe static __cold void **io_alloc_page_table(size_t size)
381*73572984SJens Axboe {
382*73572984SJens Axboe 	unsigned i, nr_tables = DIV_ROUND_UP(size, PAGE_SIZE);
383*73572984SJens Axboe 	size_t init_size = size;
384*73572984SJens Axboe 	void **table;
385*73572984SJens Axboe 
386*73572984SJens Axboe 	table = kcalloc(nr_tables, sizeof(*table), GFP_KERNEL_ACCOUNT);
387*73572984SJens Axboe 	if (!table)
388*73572984SJens Axboe 		return NULL;
389*73572984SJens Axboe 
390*73572984SJens Axboe 	for (i = 0; i < nr_tables; i++) {
391*73572984SJens Axboe 		unsigned int this_size = min_t(size_t, size, PAGE_SIZE);
392*73572984SJens Axboe 
393*73572984SJens Axboe 		table[i] = kzalloc(this_size, GFP_KERNEL_ACCOUNT);
394*73572984SJens Axboe 		if (!table[i]) {
395*73572984SJens Axboe 			io_free_page_table(table, init_size);
396*73572984SJens Axboe 			return NULL;
397*73572984SJens Axboe 		}
398*73572984SJens Axboe 		size -= this_size;
399*73572984SJens Axboe 	}
400*73572984SJens Axboe 	return table;
401*73572984SJens Axboe }
402*73572984SJens Axboe 
403*73572984SJens Axboe __cold static int io_rsrc_data_alloc(struct io_ring_ctx *ctx,
404*73572984SJens Axboe 				     rsrc_put_fn *do_put, u64 __user *utags,
405*73572984SJens Axboe 				     unsigned nr, struct io_rsrc_data **pdata)
406*73572984SJens Axboe {
407*73572984SJens Axboe 	struct io_rsrc_data *data;
408*73572984SJens Axboe 	int ret = -ENOMEM;
409*73572984SJens Axboe 	unsigned i;
410*73572984SJens Axboe 
411*73572984SJens Axboe 	data = kzalloc(sizeof(*data), GFP_KERNEL);
412*73572984SJens Axboe 	if (!data)
413*73572984SJens Axboe 		return -ENOMEM;
414*73572984SJens Axboe 	data->tags = (u64 **)io_alloc_page_table(nr * sizeof(data->tags[0][0]));
415*73572984SJens Axboe 	if (!data->tags) {
416*73572984SJens Axboe 		kfree(data);
417*73572984SJens Axboe 		return -ENOMEM;
418*73572984SJens Axboe 	}
419*73572984SJens Axboe 
420*73572984SJens Axboe 	data->nr = nr;
421*73572984SJens Axboe 	data->ctx = ctx;
422*73572984SJens Axboe 	data->do_put = do_put;
423*73572984SJens Axboe 	if (utags) {
424*73572984SJens Axboe 		ret = -EFAULT;
425*73572984SJens Axboe 		for (i = 0; i < nr; i++) {
426*73572984SJens Axboe 			u64 *tag_slot = io_get_tag_slot(data, i);
427*73572984SJens Axboe 
428*73572984SJens Axboe 			if (copy_from_user(tag_slot, &utags[i],
429*73572984SJens Axboe 					   sizeof(*tag_slot)))
430*73572984SJens Axboe 				goto fail;
431*73572984SJens Axboe 		}
432*73572984SJens Axboe 	}
433*73572984SJens Axboe 
434*73572984SJens Axboe 	atomic_set(&data->refs, 1);
435*73572984SJens Axboe 	init_completion(&data->done);
436*73572984SJens Axboe 	*pdata = data;
437*73572984SJens Axboe 	return 0;
438*73572984SJens Axboe fail:
439*73572984SJens Axboe 	io_rsrc_data_free(data);
440*73572984SJens Axboe 	return ret;
441*73572984SJens Axboe }
442*73572984SJens Axboe 
443*73572984SJens Axboe static int __io_sqe_files_update(struct io_ring_ctx *ctx,
444*73572984SJens Axboe 				 struct io_uring_rsrc_update2 *up,
445*73572984SJens Axboe 				 unsigned nr_args)
446*73572984SJens Axboe {
447*73572984SJens Axboe 	u64 __user *tags = u64_to_user_ptr(up->tags);
448*73572984SJens Axboe 	__s32 __user *fds = u64_to_user_ptr(up->data);
449*73572984SJens Axboe 	struct io_rsrc_data *data = ctx->file_data;
450*73572984SJens Axboe 	struct io_fixed_file *file_slot;
451*73572984SJens Axboe 	struct file *file;
452*73572984SJens Axboe 	int fd, i, err = 0;
453*73572984SJens Axboe 	unsigned int done;
454*73572984SJens Axboe 	bool needs_switch = false;
455*73572984SJens Axboe 
456*73572984SJens Axboe 	if (!ctx->file_data)
457*73572984SJens Axboe 		return -ENXIO;
458*73572984SJens Axboe 	if (up->offset + nr_args > ctx->nr_user_files)
459*73572984SJens Axboe 		return -EINVAL;
460*73572984SJens Axboe 
461*73572984SJens Axboe 	for (done = 0; done < nr_args; done++) {
462*73572984SJens Axboe 		u64 tag = 0;
463*73572984SJens Axboe 
464*73572984SJens Axboe 		if ((tags && copy_from_user(&tag, &tags[done], sizeof(tag))) ||
465*73572984SJens Axboe 		    copy_from_user(&fd, &fds[done], sizeof(fd))) {
466*73572984SJens Axboe 			err = -EFAULT;
467*73572984SJens Axboe 			break;
468*73572984SJens Axboe 		}
469*73572984SJens Axboe 		if ((fd == IORING_REGISTER_FILES_SKIP || fd == -1) && tag) {
470*73572984SJens Axboe 			err = -EINVAL;
471*73572984SJens Axboe 			break;
472*73572984SJens Axboe 		}
473*73572984SJens Axboe 		if (fd == IORING_REGISTER_FILES_SKIP)
474*73572984SJens Axboe 			continue;
475*73572984SJens Axboe 
476*73572984SJens Axboe 		i = array_index_nospec(up->offset + done, ctx->nr_user_files);
477*73572984SJens Axboe 		file_slot = io_fixed_file_slot(&ctx->file_table, i);
478*73572984SJens Axboe 
479*73572984SJens Axboe 		if (file_slot->file_ptr) {
480*73572984SJens Axboe 			file = (struct file *)(file_slot->file_ptr & FFS_MASK);
481*73572984SJens Axboe 			err = io_queue_rsrc_removal(data, i, ctx->rsrc_node, file);
482*73572984SJens Axboe 			if (err)
483*73572984SJens Axboe 				break;
484*73572984SJens Axboe 			file_slot->file_ptr = 0;
485*73572984SJens Axboe 			io_file_bitmap_clear(&ctx->file_table, i);
486*73572984SJens Axboe 			needs_switch = true;
487*73572984SJens Axboe 		}
488*73572984SJens Axboe 		if (fd != -1) {
489*73572984SJens Axboe 			file = fget(fd);
490*73572984SJens Axboe 			if (!file) {
491*73572984SJens Axboe 				err = -EBADF;
492*73572984SJens Axboe 				break;
493*73572984SJens Axboe 			}
494*73572984SJens Axboe 			/*
495*73572984SJens Axboe 			 * Don't allow io_uring instances to be registered. If
496*73572984SJens Axboe 			 * UNIX isn't enabled, then this causes a reference
497*73572984SJens Axboe 			 * cycle and this instance can never get freed. If UNIX
498*73572984SJens Axboe 			 * is enabled we'll handle it just fine, but there's
499*73572984SJens Axboe 			 * still no point in allowing a ring fd as it doesn't
500*73572984SJens Axboe 			 * support regular read/write anyway.
501*73572984SJens Axboe 			 */
502*73572984SJens Axboe 			if (io_is_uring_fops(file)) {
503*73572984SJens Axboe 				fput(file);
504*73572984SJens Axboe 				err = -EBADF;
505*73572984SJens Axboe 				break;
506*73572984SJens Axboe 			}
507*73572984SJens Axboe 			err = io_scm_file_account(ctx, file);
508*73572984SJens Axboe 			if (err) {
509*73572984SJens Axboe 				fput(file);
510*73572984SJens Axboe 				break;
511*73572984SJens Axboe 			}
512*73572984SJens Axboe 			*io_get_tag_slot(data, i) = tag;
513*73572984SJens Axboe 			io_fixed_file_set(file_slot, file);
514*73572984SJens Axboe 			io_file_bitmap_set(&ctx->file_table, i);
515*73572984SJens Axboe 		}
516*73572984SJens Axboe 	}
517*73572984SJens Axboe 
518*73572984SJens Axboe 	if (needs_switch)
519*73572984SJens Axboe 		io_rsrc_node_switch(ctx, data);
520*73572984SJens Axboe 	return done ? done : err;
521*73572984SJens Axboe }
522*73572984SJens Axboe 
523*73572984SJens Axboe static int __io_sqe_buffers_update(struct io_ring_ctx *ctx,
524*73572984SJens Axboe 				   struct io_uring_rsrc_update2 *up,
525*73572984SJens Axboe 				   unsigned int nr_args)
526*73572984SJens Axboe {
527*73572984SJens Axboe 	u64 __user *tags = u64_to_user_ptr(up->tags);
528*73572984SJens Axboe 	struct iovec iov, __user *iovs = u64_to_user_ptr(up->data);
529*73572984SJens Axboe 	struct page *last_hpage = NULL;
530*73572984SJens Axboe 	bool needs_switch = false;
531*73572984SJens Axboe 	__u32 done;
532*73572984SJens Axboe 	int i, err;
533*73572984SJens Axboe 
534*73572984SJens Axboe 	if (!ctx->buf_data)
535*73572984SJens Axboe 		return -ENXIO;
536*73572984SJens Axboe 	if (up->offset + nr_args > ctx->nr_user_bufs)
537*73572984SJens Axboe 		return -EINVAL;
538*73572984SJens Axboe 
539*73572984SJens Axboe 	for (done = 0; done < nr_args; done++) {
540*73572984SJens Axboe 		struct io_mapped_ubuf *imu;
541*73572984SJens Axboe 		int offset = up->offset + done;
542*73572984SJens Axboe 		u64 tag = 0;
543*73572984SJens Axboe 
544*73572984SJens Axboe 		err = io_copy_iov(ctx, &iov, iovs, done);
545*73572984SJens Axboe 		if (err)
546*73572984SJens Axboe 			break;
547*73572984SJens Axboe 		if (tags && copy_from_user(&tag, &tags[done], sizeof(tag))) {
548*73572984SJens Axboe 			err = -EFAULT;
549*73572984SJens Axboe 			break;
550*73572984SJens Axboe 		}
551*73572984SJens Axboe 		err = io_buffer_validate(&iov);
552*73572984SJens Axboe 		if (err)
553*73572984SJens Axboe 			break;
554*73572984SJens Axboe 		if (!iov.iov_base && tag) {
555*73572984SJens Axboe 			err = -EINVAL;
556*73572984SJens Axboe 			break;
557*73572984SJens Axboe 		}
558*73572984SJens Axboe 		err = io_sqe_buffer_register(ctx, &iov, &imu, &last_hpage);
559*73572984SJens Axboe 		if (err)
560*73572984SJens Axboe 			break;
561*73572984SJens Axboe 
562*73572984SJens Axboe 		i = array_index_nospec(offset, ctx->nr_user_bufs);
563*73572984SJens Axboe 		if (ctx->user_bufs[i] != ctx->dummy_ubuf) {
564*73572984SJens Axboe 			err = io_queue_rsrc_removal(ctx->buf_data, i,
565*73572984SJens Axboe 						    ctx->rsrc_node, ctx->user_bufs[i]);
566*73572984SJens Axboe 			if (unlikely(err)) {
567*73572984SJens Axboe 				io_buffer_unmap(ctx, &imu);
568*73572984SJens Axboe 				break;
569*73572984SJens Axboe 			}
570*73572984SJens Axboe 			ctx->user_bufs[i] = NULL;
571*73572984SJens Axboe 			needs_switch = true;
572*73572984SJens Axboe 		}
573*73572984SJens Axboe 
574*73572984SJens Axboe 		ctx->user_bufs[i] = imu;
575*73572984SJens Axboe 		*io_get_tag_slot(ctx->buf_data, offset) = tag;
576*73572984SJens Axboe 	}
577*73572984SJens Axboe 
578*73572984SJens Axboe 	if (needs_switch)
579*73572984SJens Axboe 		io_rsrc_node_switch(ctx, ctx->buf_data);
580*73572984SJens Axboe 	return done ? done : err;
581*73572984SJens Axboe }
582*73572984SJens Axboe 
583*73572984SJens Axboe static int __io_register_rsrc_update(struct io_ring_ctx *ctx, unsigned type,
584*73572984SJens Axboe 				     struct io_uring_rsrc_update2 *up,
585*73572984SJens Axboe 				     unsigned nr_args)
586*73572984SJens Axboe {
587*73572984SJens Axboe 	__u32 tmp;
588*73572984SJens Axboe 	int err;
589*73572984SJens Axboe 
590*73572984SJens Axboe 	if (check_add_overflow(up->offset, nr_args, &tmp))
591*73572984SJens Axboe 		return -EOVERFLOW;
592*73572984SJens Axboe 	err = io_rsrc_node_switch_start(ctx);
593*73572984SJens Axboe 	if (err)
594*73572984SJens Axboe 		return err;
595*73572984SJens Axboe 
596*73572984SJens Axboe 	switch (type) {
597*73572984SJens Axboe 	case IORING_RSRC_FILE:
598*73572984SJens Axboe 		return __io_sqe_files_update(ctx, up, nr_args);
599*73572984SJens Axboe 	case IORING_RSRC_BUFFER:
600*73572984SJens Axboe 		return __io_sqe_buffers_update(ctx, up, nr_args);
601*73572984SJens Axboe 	}
602*73572984SJens Axboe 	return -EINVAL;
603*73572984SJens Axboe }
604*73572984SJens Axboe 
605*73572984SJens Axboe int io_register_files_update(struct io_ring_ctx *ctx, void __user *arg,
606*73572984SJens Axboe 			     unsigned nr_args)
607*73572984SJens Axboe {
608*73572984SJens Axboe 	struct io_uring_rsrc_update2 up;
609*73572984SJens Axboe 
610*73572984SJens Axboe 	if (!nr_args)
611*73572984SJens Axboe 		return -EINVAL;
612*73572984SJens Axboe 	memset(&up, 0, sizeof(up));
613*73572984SJens Axboe 	if (copy_from_user(&up, arg, sizeof(struct io_uring_rsrc_update)))
614*73572984SJens Axboe 		return -EFAULT;
615*73572984SJens Axboe 	if (up.resv || up.resv2)
616*73572984SJens Axboe 		return -EINVAL;
617*73572984SJens Axboe 	return __io_register_rsrc_update(ctx, IORING_RSRC_FILE, &up, nr_args);
618*73572984SJens Axboe }
619*73572984SJens Axboe 
620*73572984SJens Axboe int io_register_rsrc_update(struct io_ring_ctx *ctx, void __user *arg,
621*73572984SJens Axboe 			    unsigned size, unsigned type)
622*73572984SJens Axboe {
623*73572984SJens Axboe 	struct io_uring_rsrc_update2 up;
624*73572984SJens Axboe 
625*73572984SJens Axboe 	if (size != sizeof(up))
626*73572984SJens Axboe 		return -EINVAL;
627*73572984SJens Axboe 	if (copy_from_user(&up, arg, sizeof(up)))
628*73572984SJens Axboe 		return -EFAULT;
629*73572984SJens Axboe 	if (!up.nr || up.resv || up.resv2)
630*73572984SJens Axboe 		return -EINVAL;
631*73572984SJens Axboe 	return __io_register_rsrc_update(ctx, type, &up, up.nr);
632*73572984SJens Axboe }
633*73572984SJens Axboe 
634*73572984SJens Axboe __cold int io_register_rsrc(struct io_ring_ctx *ctx, void __user *arg,
635*73572984SJens Axboe 			    unsigned int size, unsigned int type)
636*73572984SJens Axboe {
637*73572984SJens Axboe 	struct io_uring_rsrc_register rr;
638*73572984SJens Axboe 
639*73572984SJens Axboe 	/* keep it extendible */
640*73572984SJens Axboe 	if (size != sizeof(rr))
641*73572984SJens Axboe 		return -EINVAL;
642*73572984SJens Axboe 
643*73572984SJens Axboe 	memset(&rr, 0, sizeof(rr));
644*73572984SJens Axboe 	if (copy_from_user(&rr, arg, size))
645*73572984SJens Axboe 		return -EFAULT;
646*73572984SJens Axboe 	if (!rr.nr || rr.resv2)
647*73572984SJens Axboe 		return -EINVAL;
648*73572984SJens Axboe 	if (rr.flags & ~IORING_RSRC_REGISTER_SPARSE)
649*73572984SJens Axboe 		return -EINVAL;
650*73572984SJens Axboe 
651*73572984SJens Axboe 	switch (type) {
652*73572984SJens Axboe 	case IORING_RSRC_FILE:
653*73572984SJens Axboe 		if (rr.flags & IORING_RSRC_REGISTER_SPARSE && rr.data)
654*73572984SJens Axboe 			break;
655*73572984SJens Axboe 		return io_sqe_files_register(ctx, u64_to_user_ptr(rr.data),
656*73572984SJens Axboe 					     rr.nr, u64_to_user_ptr(rr.tags));
657*73572984SJens Axboe 	case IORING_RSRC_BUFFER:
658*73572984SJens Axboe 		if (rr.flags & IORING_RSRC_REGISTER_SPARSE && rr.data)
659*73572984SJens Axboe 			break;
660*73572984SJens Axboe 		return io_sqe_buffers_register(ctx, u64_to_user_ptr(rr.data),
661*73572984SJens Axboe 					       rr.nr, u64_to_user_ptr(rr.tags));
662*73572984SJens Axboe 	}
663*73572984SJens Axboe 	return -EINVAL;
664*73572984SJens Axboe }
665*73572984SJens Axboe 
666*73572984SJens Axboe int io_files_update_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
667*73572984SJens Axboe {
668*73572984SJens Axboe 	struct io_rsrc_update *up = io_kiocb_to_cmd(req);
669*73572984SJens Axboe 
670*73572984SJens Axboe 	if (unlikely(req->flags & (REQ_F_FIXED_FILE | REQ_F_BUFFER_SELECT)))
671*73572984SJens Axboe 		return -EINVAL;
672*73572984SJens Axboe 	if (sqe->rw_flags || sqe->splice_fd_in)
673*73572984SJens Axboe 		return -EINVAL;
674*73572984SJens Axboe 
675*73572984SJens Axboe 	up->offset = READ_ONCE(sqe->off);
676*73572984SJens Axboe 	up->nr_args = READ_ONCE(sqe->len);
677*73572984SJens Axboe 	if (!up->nr_args)
678*73572984SJens Axboe 		return -EINVAL;
679*73572984SJens Axboe 	up->arg = READ_ONCE(sqe->addr);
680*73572984SJens Axboe 	return 0;
681*73572984SJens Axboe }
682*73572984SJens Axboe 
683*73572984SJens Axboe static int io_files_update_with_index_alloc(struct io_kiocb *req,
684*73572984SJens Axboe 					    unsigned int issue_flags)
685*73572984SJens Axboe {
686*73572984SJens Axboe 	struct io_rsrc_update *up = io_kiocb_to_cmd(req);
687*73572984SJens Axboe 	__s32 __user *fds = u64_to_user_ptr(up->arg);
688*73572984SJens Axboe 	unsigned int done;
689*73572984SJens Axboe 	struct file *file;
690*73572984SJens Axboe 	int ret, fd;
691*73572984SJens Axboe 
692*73572984SJens Axboe 	if (!req->ctx->file_data)
693*73572984SJens Axboe 		return -ENXIO;
694*73572984SJens Axboe 
695*73572984SJens Axboe 	for (done = 0; done < up->nr_args; done++) {
696*73572984SJens Axboe 		if (copy_from_user(&fd, &fds[done], sizeof(fd))) {
697*73572984SJens Axboe 			ret = -EFAULT;
698*73572984SJens Axboe 			break;
699*73572984SJens Axboe 		}
700*73572984SJens Axboe 
701*73572984SJens Axboe 		file = fget(fd);
702*73572984SJens Axboe 		if (!file) {
703*73572984SJens Axboe 			ret = -EBADF;
704*73572984SJens Axboe 			break;
705*73572984SJens Axboe 		}
706*73572984SJens Axboe 		ret = io_fixed_fd_install(req, issue_flags, file,
707*73572984SJens Axboe 					  IORING_FILE_INDEX_ALLOC);
708*73572984SJens Axboe 		if (ret < 0)
709*73572984SJens Axboe 			break;
710*73572984SJens Axboe 		if (copy_to_user(&fds[done], &ret, sizeof(ret))) {
711*73572984SJens Axboe 			__io_close_fixed(req, issue_flags, ret);
712*73572984SJens Axboe 			ret = -EFAULT;
713*73572984SJens Axboe 			break;
714*73572984SJens Axboe 		}
715*73572984SJens Axboe 	}
716*73572984SJens Axboe 
717*73572984SJens Axboe 	if (done)
718*73572984SJens Axboe 		return done;
719*73572984SJens Axboe 	return ret;
720*73572984SJens Axboe }
721*73572984SJens Axboe 
722*73572984SJens Axboe int io_files_update(struct io_kiocb *req, unsigned int issue_flags)
723*73572984SJens Axboe {
724*73572984SJens Axboe 	struct io_rsrc_update *up = io_kiocb_to_cmd(req);
725*73572984SJens Axboe 	struct io_ring_ctx *ctx = req->ctx;
726*73572984SJens Axboe 	struct io_uring_rsrc_update2 up2;
727*73572984SJens Axboe 	int ret;
728*73572984SJens Axboe 
729*73572984SJens Axboe 	up2.offset = up->offset;
730*73572984SJens Axboe 	up2.data = up->arg;
731*73572984SJens Axboe 	up2.nr = 0;
732*73572984SJens Axboe 	up2.tags = 0;
733*73572984SJens Axboe 	up2.resv = 0;
734*73572984SJens Axboe 	up2.resv2 = 0;
735*73572984SJens Axboe 
736*73572984SJens Axboe 	if (up->offset == IORING_FILE_INDEX_ALLOC) {
737*73572984SJens Axboe 		ret = io_files_update_with_index_alloc(req, issue_flags);
738*73572984SJens Axboe 	} else {
739*73572984SJens Axboe 		io_ring_submit_lock(ctx, issue_flags);
740*73572984SJens Axboe 		ret = __io_register_rsrc_update(ctx, IORING_RSRC_FILE,
741*73572984SJens Axboe 						&up2, up->nr_args);
742*73572984SJens Axboe 		io_ring_submit_unlock(ctx, issue_flags);
743*73572984SJens Axboe 	}
744*73572984SJens Axboe 
745*73572984SJens Axboe 	if (ret < 0)
746*73572984SJens Axboe 		req_set_fail(req);
747*73572984SJens Axboe 	io_req_set_res(req, ret, 0);
748*73572984SJens Axboe 	return IOU_OK;
749*73572984SJens Axboe }
750*73572984SJens Axboe 
751*73572984SJens Axboe int io_queue_rsrc_removal(struct io_rsrc_data *data, unsigned idx,
752*73572984SJens Axboe 			  struct io_rsrc_node *node, void *rsrc)
753*73572984SJens Axboe {
754*73572984SJens Axboe 	u64 *tag_slot = io_get_tag_slot(data, idx);
755*73572984SJens Axboe 	struct io_rsrc_put *prsrc;
756*73572984SJens Axboe 
757*73572984SJens Axboe 	prsrc = kzalloc(sizeof(*prsrc), GFP_KERNEL);
758*73572984SJens Axboe 	if (!prsrc)
759*73572984SJens Axboe 		return -ENOMEM;
760*73572984SJens Axboe 
761*73572984SJens Axboe 	prsrc->tag = *tag_slot;
762*73572984SJens Axboe 	*tag_slot = 0;
763*73572984SJens Axboe 	prsrc->rsrc = rsrc;
764*73572984SJens Axboe 	list_add(&prsrc->list, &node->rsrc_list);
765*73572984SJens Axboe 	return 0;
766*73572984SJens Axboe }
767*73572984SJens Axboe 
768*73572984SJens Axboe void __io_sqe_files_unregister(struct io_ring_ctx *ctx)
769*73572984SJens Axboe {
770*73572984SJens Axboe #if !defined(IO_URING_SCM_ALL)
771*73572984SJens Axboe 	int i;
772*73572984SJens Axboe 
773*73572984SJens Axboe 	for (i = 0; i < ctx->nr_user_files; i++) {
774*73572984SJens Axboe 		struct file *file = io_file_from_index(&ctx->file_table, i);
775*73572984SJens Axboe 
776*73572984SJens Axboe 		if (!file)
777*73572984SJens Axboe 			continue;
778*73572984SJens Axboe 		if (io_fixed_file_slot(&ctx->file_table, i)->file_ptr & FFS_SCM)
779*73572984SJens Axboe 			continue;
780*73572984SJens Axboe 		io_file_bitmap_clear(&ctx->file_table, i);
781*73572984SJens Axboe 		fput(file);
782*73572984SJens Axboe 	}
783*73572984SJens Axboe #endif
784*73572984SJens Axboe 
785*73572984SJens Axboe #if defined(CONFIG_UNIX)
786*73572984SJens Axboe 	if (ctx->ring_sock) {
787*73572984SJens Axboe 		struct sock *sock = ctx->ring_sock->sk;
788*73572984SJens Axboe 		struct sk_buff *skb;
789*73572984SJens Axboe 
790*73572984SJens Axboe 		while ((skb = skb_dequeue(&sock->sk_receive_queue)) != NULL)
791*73572984SJens Axboe 			kfree_skb(skb);
792*73572984SJens Axboe 	}
793*73572984SJens Axboe #endif
794*73572984SJens Axboe 	io_free_file_tables(&ctx->file_table);
795*73572984SJens Axboe 	io_rsrc_data_free(ctx->file_data);
796*73572984SJens Axboe 	ctx->file_data = NULL;
797*73572984SJens Axboe 	ctx->nr_user_files = 0;
798*73572984SJens Axboe }
799*73572984SJens Axboe 
800*73572984SJens Axboe int io_sqe_files_unregister(struct io_ring_ctx *ctx)
801*73572984SJens Axboe {
802*73572984SJens Axboe 	unsigned nr = ctx->nr_user_files;
803*73572984SJens Axboe 	int ret;
804*73572984SJens Axboe 
805*73572984SJens Axboe 	if (!ctx->file_data)
806*73572984SJens Axboe 		return -ENXIO;
807*73572984SJens Axboe 
808*73572984SJens Axboe 	/*
809*73572984SJens Axboe 	 * Quiesce may unlock ->uring_lock, and while it's not held
810*73572984SJens Axboe 	 * prevent new requests using the table.
811*73572984SJens Axboe 	 */
812*73572984SJens Axboe 	ctx->nr_user_files = 0;
813*73572984SJens Axboe 	ret = io_rsrc_ref_quiesce(ctx->file_data, ctx);
814*73572984SJens Axboe 	ctx->nr_user_files = nr;
815*73572984SJens Axboe 	if (!ret)
816*73572984SJens Axboe 		__io_sqe_files_unregister(ctx);
817*73572984SJens Axboe 	return ret;
818*73572984SJens Axboe }
819*73572984SJens Axboe 
820*73572984SJens Axboe /*
821*73572984SJens Axboe  * Ensure the UNIX gc is aware of our file set, so we are certain that
822*73572984SJens Axboe  * the io_uring can be safely unregistered on process exit, even if we have
823*73572984SJens Axboe  * loops in the file referencing. We account only files that can hold other
824*73572984SJens Axboe  * files because otherwise they can't form a loop and so are not interesting
825*73572984SJens Axboe  * for GC.
826*73572984SJens Axboe  */
827*73572984SJens Axboe int __io_scm_file_account(struct io_ring_ctx *ctx, struct file *file)
828*73572984SJens Axboe {
829*73572984SJens Axboe #if defined(CONFIG_UNIX)
830*73572984SJens Axboe 	struct sock *sk = ctx->ring_sock->sk;
831*73572984SJens Axboe 	struct sk_buff_head *head = &sk->sk_receive_queue;
832*73572984SJens Axboe 	struct scm_fp_list *fpl;
833*73572984SJens Axboe 	struct sk_buff *skb;
834*73572984SJens Axboe 
835*73572984SJens Axboe 	if (likely(!io_file_need_scm(file)))
836*73572984SJens Axboe 		return 0;
837*73572984SJens Axboe 
838*73572984SJens Axboe 	/*
839*73572984SJens Axboe 	 * See if we can merge this file into an existing skb SCM_RIGHTS
840*73572984SJens Axboe 	 * file set. If there's no room, fall back to allocating a new skb
841*73572984SJens Axboe 	 * and filling it in.
842*73572984SJens Axboe 	 */
843*73572984SJens Axboe 	spin_lock_irq(&head->lock);
844*73572984SJens Axboe 	skb = skb_peek(head);
845*73572984SJens Axboe 	if (skb && UNIXCB(skb).fp->count < SCM_MAX_FD)
846*73572984SJens Axboe 		__skb_unlink(skb, head);
847*73572984SJens Axboe 	else
848*73572984SJens Axboe 		skb = NULL;
849*73572984SJens Axboe 	spin_unlock_irq(&head->lock);
850*73572984SJens Axboe 
851*73572984SJens Axboe 	if (!skb) {
852*73572984SJens Axboe 		fpl = kzalloc(sizeof(*fpl), GFP_KERNEL);
853*73572984SJens Axboe 		if (!fpl)
854*73572984SJens Axboe 			return -ENOMEM;
855*73572984SJens Axboe 
856*73572984SJens Axboe 		skb = alloc_skb(0, GFP_KERNEL);
857*73572984SJens Axboe 		if (!skb) {
858*73572984SJens Axboe 			kfree(fpl);
859*73572984SJens Axboe 			return -ENOMEM;
860*73572984SJens Axboe 		}
861*73572984SJens Axboe 
862*73572984SJens Axboe 		fpl->user = get_uid(current_user());
863*73572984SJens Axboe 		fpl->max = SCM_MAX_FD;
864*73572984SJens Axboe 		fpl->count = 0;
865*73572984SJens Axboe 
866*73572984SJens Axboe 		UNIXCB(skb).fp = fpl;
867*73572984SJens Axboe 		skb->sk = sk;
868*73572984SJens Axboe 		skb->destructor = unix_destruct_scm;
869*73572984SJens Axboe 		refcount_add(skb->truesize, &sk->sk_wmem_alloc);
870*73572984SJens Axboe 	}
871*73572984SJens Axboe 
872*73572984SJens Axboe 	fpl = UNIXCB(skb).fp;
873*73572984SJens Axboe 	fpl->fp[fpl->count++] = get_file(file);
874*73572984SJens Axboe 	unix_inflight(fpl->user, file);
875*73572984SJens Axboe 	skb_queue_head(head, skb);
876*73572984SJens Axboe 	fput(file);
877*73572984SJens Axboe #endif
878*73572984SJens Axboe 	return 0;
879*73572984SJens Axboe }
880*73572984SJens Axboe 
881*73572984SJens Axboe static void io_rsrc_file_put(struct io_ring_ctx *ctx, struct io_rsrc_put *prsrc)
882*73572984SJens Axboe {
883*73572984SJens Axboe 	struct file *file = prsrc->file;
884*73572984SJens Axboe #if defined(CONFIG_UNIX)
885*73572984SJens Axboe 	struct sock *sock = ctx->ring_sock->sk;
886*73572984SJens Axboe 	struct sk_buff_head list, *head = &sock->sk_receive_queue;
887*73572984SJens Axboe 	struct sk_buff *skb;
888*73572984SJens Axboe 	int i;
889*73572984SJens Axboe 
890*73572984SJens Axboe 	if (!io_file_need_scm(file)) {
891*73572984SJens Axboe 		fput(file);
892*73572984SJens Axboe 		return;
893*73572984SJens Axboe 	}
894*73572984SJens Axboe 
895*73572984SJens Axboe 	__skb_queue_head_init(&list);
896*73572984SJens Axboe 
897*73572984SJens Axboe 	/*
898*73572984SJens Axboe 	 * Find the skb that holds this file in its SCM_RIGHTS. When found,
899*73572984SJens Axboe 	 * remove this entry and rearrange the file array.
900*73572984SJens Axboe 	 */
901*73572984SJens Axboe 	skb = skb_dequeue(head);
902*73572984SJens Axboe 	while (skb) {
903*73572984SJens Axboe 		struct scm_fp_list *fp;
904*73572984SJens Axboe 
905*73572984SJens Axboe 		fp = UNIXCB(skb).fp;
906*73572984SJens Axboe 		for (i = 0; i < fp->count; i++) {
907*73572984SJens Axboe 			int left;
908*73572984SJens Axboe 
909*73572984SJens Axboe 			if (fp->fp[i] != file)
910*73572984SJens Axboe 				continue;
911*73572984SJens Axboe 
912*73572984SJens Axboe 			unix_notinflight(fp->user, fp->fp[i]);
913*73572984SJens Axboe 			left = fp->count - 1 - i;
914*73572984SJens Axboe 			if (left) {
915*73572984SJens Axboe 				memmove(&fp->fp[i], &fp->fp[i + 1],
916*73572984SJens Axboe 						left * sizeof(struct file *));
917*73572984SJens Axboe 			}
918*73572984SJens Axboe 			fp->count--;
919*73572984SJens Axboe 			if (!fp->count) {
920*73572984SJens Axboe 				kfree_skb(skb);
921*73572984SJens Axboe 				skb = NULL;
922*73572984SJens Axboe 			} else {
923*73572984SJens Axboe 				__skb_queue_tail(&list, skb);
924*73572984SJens Axboe 			}
925*73572984SJens Axboe 			fput(file);
926*73572984SJens Axboe 			file = NULL;
927*73572984SJens Axboe 			break;
928*73572984SJens Axboe 		}
929*73572984SJens Axboe 
930*73572984SJens Axboe 		if (!file)
931*73572984SJens Axboe 			break;
932*73572984SJens Axboe 
933*73572984SJens Axboe 		__skb_queue_tail(&list, skb);
934*73572984SJens Axboe 
935*73572984SJens Axboe 		skb = skb_dequeue(head);
936*73572984SJens Axboe 	}
937*73572984SJens Axboe 
938*73572984SJens Axboe 	if (skb_peek(&list)) {
939*73572984SJens Axboe 		spin_lock_irq(&head->lock);
940*73572984SJens Axboe 		while ((skb = __skb_dequeue(&list)) != NULL)
941*73572984SJens Axboe 			__skb_queue_tail(head, skb);
942*73572984SJens Axboe 		spin_unlock_irq(&head->lock);
943*73572984SJens Axboe 	}
944*73572984SJens Axboe #else
945*73572984SJens Axboe 	fput(file);
946*73572984SJens Axboe #endif
947*73572984SJens Axboe }
948*73572984SJens Axboe 
949*73572984SJens Axboe int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
950*73572984SJens Axboe 			  unsigned nr_args, u64 __user *tags)
951*73572984SJens Axboe {
952*73572984SJens Axboe 	__s32 __user *fds = (__s32 __user *) arg;
953*73572984SJens Axboe 	struct file *file;
954*73572984SJens Axboe 	int fd, ret;
955*73572984SJens Axboe 	unsigned i;
956*73572984SJens Axboe 
957*73572984SJens Axboe 	if (ctx->file_data)
958*73572984SJens Axboe 		return -EBUSY;
959*73572984SJens Axboe 	if (!nr_args)
960*73572984SJens Axboe 		return -EINVAL;
961*73572984SJens Axboe 	if (nr_args > IORING_MAX_FIXED_FILES)
962*73572984SJens Axboe 		return -EMFILE;
963*73572984SJens Axboe 	if (nr_args > rlimit(RLIMIT_NOFILE))
964*73572984SJens Axboe 		return -EMFILE;
965*73572984SJens Axboe 	ret = io_rsrc_node_switch_start(ctx);
966*73572984SJens Axboe 	if (ret)
967*73572984SJens Axboe 		return ret;
968*73572984SJens Axboe 	ret = io_rsrc_data_alloc(ctx, io_rsrc_file_put, tags, nr_args,
969*73572984SJens Axboe 				 &ctx->file_data);
970*73572984SJens Axboe 	if (ret)
971*73572984SJens Axboe 		return ret;
972*73572984SJens Axboe 
973*73572984SJens Axboe 	if (!io_alloc_file_tables(&ctx->file_table, nr_args)) {
974*73572984SJens Axboe 		io_rsrc_data_free(ctx->file_data);
975*73572984SJens Axboe 		ctx->file_data = NULL;
976*73572984SJens Axboe 		return -ENOMEM;
977*73572984SJens Axboe 	}
978*73572984SJens Axboe 
979*73572984SJens Axboe 	for (i = 0; i < nr_args; i++, ctx->nr_user_files++) {
980*73572984SJens Axboe 		struct io_fixed_file *file_slot;
981*73572984SJens Axboe 
982*73572984SJens Axboe 		if (fds && copy_from_user(&fd, &fds[i], sizeof(fd))) {
983*73572984SJens Axboe 			ret = -EFAULT;
984*73572984SJens Axboe 			goto fail;
985*73572984SJens Axboe 		}
986*73572984SJens Axboe 		/* allow sparse sets */
987*73572984SJens Axboe 		if (!fds || fd == -1) {
988*73572984SJens Axboe 			ret = -EINVAL;
989*73572984SJens Axboe 			if (unlikely(*io_get_tag_slot(ctx->file_data, i)))
990*73572984SJens Axboe 				goto fail;
991*73572984SJens Axboe 			continue;
992*73572984SJens Axboe 		}
993*73572984SJens Axboe 
994*73572984SJens Axboe 		file = fget(fd);
995*73572984SJens Axboe 		ret = -EBADF;
996*73572984SJens Axboe 		if (unlikely(!file))
997*73572984SJens Axboe 			goto fail;
998*73572984SJens Axboe 
999*73572984SJens Axboe 		/*
1000*73572984SJens Axboe 		 * Don't allow io_uring instances to be registered. If UNIX
1001*73572984SJens Axboe 		 * isn't enabled, then this causes a reference cycle and this
1002*73572984SJens Axboe 		 * instance can never get freed. If UNIX is enabled we'll
1003*73572984SJens Axboe 		 * handle it just fine, but there's still no point in allowing
1004*73572984SJens Axboe 		 * a ring fd as it doesn't support regular read/write anyway.
1005*73572984SJens Axboe 		 */
1006*73572984SJens Axboe 		if (io_is_uring_fops(file)) {
1007*73572984SJens Axboe 			fput(file);
1008*73572984SJens Axboe 			goto fail;
1009*73572984SJens Axboe 		}
1010*73572984SJens Axboe 		ret = io_scm_file_account(ctx, file);
1011*73572984SJens Axboe 		if (ret) {
1012*73572984SJens Axboe 			fput(file);
1013*73572984SJens Axboe 			goto fail;
1014*73572984SJens Axboe 		}
1015*73572984SJens Axboe 		file_slot = io_fixed_file_slot(&ctx->file_table, i);
1016*73572984SJens Axboe 		io_fixed_file_set(file_slot, file);
1017*73572984SJens Axboe 		io_file_bitmap_set(&ctx->file_table, i);
1018*73572984SJens Axboe 	}
1019*73572984SJens Axboe 
1020*73572984SJens Axboe 	io_rsrc_node_switch(ctx, NULL);
1021*73572984SJens Axboe 	return 0;
1022*73572984SJens Axboe fail:
1023*73572984SJens Axboe 	__io_sqe_files_unregister(ctx);
1024*73572984SJens Axboe 	return ret;
1025*73572984SJens Axboe }
1026*73572984SJens Axboe 
1027*73572984SJens Axboe static void io_rsrc_buf_put(struct io_ring_ctx *ctx, struct io_rsrc_put *prsrc)
1028*73572984SJens Axboe {
1029*73572984SJens Axboe 	io_buffer_unmap(ctx, &prsrc->buf);
1030*73572984SJens Axboe 	prsrc->buf = NULL;
1031*73572984SJens Axboe }
1032*73572984SJens Axboe 
1033*73572984SJens Axboe void __io_sqe_buffers_unregister(struct io_ring_ctx *ctx)
1034*73572984SJens Axboe {
1035*73572984SJens Axboe 	unsigned int i;
1036*73572984SJens Axboe 
1037*73572984SJens Axboe 	for (i = 0; i < ctx->nr_user_bufs; i++)
1038*73572984SJens Axboe 		io_buffer_unmap(ctx, &ctx->user_bufs[i]);
1039*73572984SJens Axboe 	kfree(ctx->user_bufs);
1040*73572984SJens Axboe 	io_rsrc_data_free(ctx->buf_data);
1041*73572984SJens Axboe 	ctx->user_bufs = NULL;
1042*73572984SJens Axboe 	ctx->buf_data = NULL;
1043*73572984SJens Axboe 	ctx->nr_user_bufs = 0;
1044*73572984SJens Axboe }
1045*73572984SJens Axboe 
1046*73572984SJens Axboe int io_sqe_buffers_unregister(struct io_ring_ctx *ctx)
1047*73572984SJens Axboe {
1048*73572984SJens Axboe 	unsigned nr = ctx->nr_user_bufs;
1049*73572984SJens Axboe 	int ret;
1050*73572984SJens Axboe 
1051*73572984SJens Axboe 	if (!ctx->buf_data)
1052*73572984SJens Axboe 		return -ENXIO;
1053*73572984SJens Axboe 
1054*73572984SJens Axboe 	/*
1055*73572984SJens Axboe 	 * Quiesce may unlock ->uring_lock, and while it's not held
1056*73572984SJens Axboe 	 * prevent new requests using the table.
1057*73572984SJens Axboe 	 */
1058*73572984SJens Axboe 	ctx->nr_user_bufs = 0;
1059*73572984SJens Axboe 	ret = io_rsrc_ref_quiesce(ctx->buf_data, ctx);
1060*73572984SJens Axboe 	ctx->nr_user_bufs = nr;
1061*73572984SJens Axboe 	if (!ret)
1062*73572984SJens Axboe 		__io_sqe_buffers_unregister(ctx);
1063*73572984SJens Axboe 	return ret;
1064*73572984SJens Axboe }
1065*73572984SJens Axboe 
1066*73572984SJens Axboe /*
1067*73572984SJens Axboe  * Not super efficient, but this is just a registration time. And we do cache
1068*73572984SJens Axboe  * the last compound head, so generally we'll only do a full search if we don't
1069*73572984SJens Axboe  * match that one.
1070*73572984SJens Axboe  *
1071*73572984SJens Axboe  * We check if the given compound head page has already been accounted, to
1072*73572984SJens Axboe  * avoid double accounting it. This allows us to account the full size of the
1073*73572984SJens Axboe  * page, not just the constituent pages of a huge page.
1074*73572984SJens Axboe  */
1075*73572984SJens Axboe static bool headpage_already_acct(struct io_ring_ctx *ctx, struct page **pages,
1076*73572984SJens Axboe 				  int nr_pages, struct page *hpage)
1077*73572984SJens Axboe {
1078*73572984SJens Axboe 	int i, j;
1079*73572984SJens Axboe 
1080*73572984SJens Axboe 	/* check current page array */
1081*73572984SJens Axboe 	for (i = 0; i < nr_pages; i++) {
1082*73572984SJens Axboe 		if (!PageCompound(pages[i]))
1083*73572984SJens Axboe 			continue;
1084*73572984SJens Axboe 		if (compound_head(pages[i]) == hpage)
1085*73572984SJens Axboe 			return true;
1086*73572984SJens Axboe 	}
1087*73572984SJens Axboe 
1088*73572984SJens Axboe 	/* check previously registered pages */
1089*73572984SJens Axboe 	for (i = 0; i < ctx->nr_user_bufs; i++) {
1090*73572984SJens Axboe 		struct io_mapped_ubuf *imu = ctx->user_bufs[i];
1091*73572984SJens Axboe 
1092*73572984SJens Axboe 		for (j = 0; j < imu->nr_bvecs; j++) {
1093*73572984SJens Axboe 			if (!PageCompound(imu->bvec[j].bv_page))
1094*73572984SJens Axboe 				continue;
1095*73572984SJens Axboe 			if (compound_head(imu->bvec[j].bv_page) == hpage)
1096*73572984SJens Axboe 				return true;
1097*73572984SJens Axboe 		}
1098*73572984SJens Axboe 	}
1099*73572984SJens Axboe 
1100*73572984SJens Axboe 	return false;
1101*73572984SJens Axboe }
1102*73572984SJens Axboe 
1103*73572984SJens Axboe static int io_buffer_account_pin(struct io_ring_ctx *ctx, struct page **pages,
1104*73572984SJens Axboe 				 int nr_pages, struct io_mapped_ubuf *imu,
1105*73572984SJens Axboe 				 struct page **last_hpage)
1106*73572984SJens Axboe {
1107*73572984SJens Axboe 	int i, ret;
1108*73572984SJens Axboe 
1109*73572984SJens Axboe 	imu->acct_pages = 0;
1110*73572984SJens Axboe 	for (i = 0; i < nr_pages; i++) {
1111*73572984SJens Axboe 		if (!PageCompound(pages[i])) {
1112*73572984SJens Axboe 			imu->acct_pages++;
1113*73572984SJens Axboe 		} else {
1114*73572984SJens Axboe 			struct page *hpage;
1115*73572984SJens Axboe 
1116*73572984SJens Axboe 			hpage = compound_head(pages[i]);
1117*73572984SJens Axboe 			if (hpage == *last_hpage)
1118*73572984SJens Axboe 				continue;
1119*73572984SJens Axboe 			*last_hpage = hpage;
1120*73572984SJens Axboe 			if (headpage_already_acct(ctx, pages, i, hpage))
1121*73572984SJens Axboe 				continue;
1122*73572984SJens Axboe 			imu->acct_pages += page_size(hpage) >> PAGE_SHIFT;
1123*73572984SJens Axboe 		}
1124*73572984SJens Axboe 	}
1125*73572984SJens Axboe 
1126*73572984SJens Axboe 	if (!imu->acct_pages)
1127*73572984SJens Axboe 		return 0;
1128*73572984SJens Axboe 
1129*73572984SJens Axboe 	ret = io_account_mem(ctx, imu->acct_pages);
1130*73572984SJens Axboe 	if (ret)
1131*73572984SJens Axboe 		imu->acct_pages = 0;
1132*73572984SJens Axboe 	return ret;
1133*73572984SJens Axboe }
1134*73572984SJens Axboe 
1135*73572984SJens Axboe struct page **io_pin_pages(unsigned long ubuf, unsigned long len, int *npages)
1136*73572984SJens Axboe {
1137*73572984SJens Axboe 	unsigned long start, end, nr_pages;
1138*73572984SJens Axboe 	struct vm_area_struct **vmas = NULL;
1139*73572984SJens Axboe 	struct page **pages = NULL;
1140*73572984SJens Axboe 	int i, pret, ret = -ENOMEM;
1141*73572984SJens Axboe 
1142*73572984SJens Axboe 	end = (ubuf + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
1143*73572984SJens Axboe 	start = ubuf >> PAGE_SHIFT;
1144*73572984SJens Axboe 	nr_pages = end - start;
1145*73572984SJens Axboe 
1146*73572984SJens Axboe 	pages = kvmalloc_array(nr_pages, sizeof(struct page *), GFP_KERNEL);
1147*73572984SJens Axboe 	if (!pages)
1148*73572984SJens Axboe 		goto done;
1149*73572984SJens Axboe 
1150*73572984SJens Axboe 	vmas = kvmalloc_array(nr_pages, sizeof(struct vm_area_struct *),
1151*73572984SJens Axboe 			      GFP_KERNEL);
1152*73572984SJens Axboe 	if (!vmas)
1153*73572984SJens Axboe 		goto done;
1154*73572984SJens Axboe 
1155*73572984SJens Axboe 	ret = 0;
1156*73572984SJens Axboe 	mmap_read_lock(current->mm);
1157*73572984SJens Axboe 	pret = pin_user_pages(ubuf, nr_pages, FOLL_WRITE | FOLL_LONGTERM,
1158*73572984SJens Axboe 			      pages, vmas);
1159*73572984SJens Axboe 	if (pret == nr_pages) {
1160*73572984SJens Axboe 		/* don't support file backed memory */
1161*73572984SJens Axboe 		for (i = 0; i < nr_pages; i++) {
1162*73572984SJens Axboe 			struct vm_area_struct *vma = vmas[i];
1163*73572984SJens Axboe 
1164*73572984SJens Axboe 			if (vma_is_shmem(vma))
1165*73572984SJens Axboe 				continue;
1166*73572984SJens Axboe 			if (vma->vm_file &&
1167*73572984SJens Axboe 			    !is_file_hugepages(vma->vm_file)) {
1168*73572984SJens Axboe 				ret = -EOPNOTSUPP;
1169*73572984SJens Axboe 				break;
1170*73572984SJens Axboe 			}
1171*73572984SJens Axboe 		}
1172*73572984SJens Axboe 		*npages = nr_pages;
1173*73572984SJens Axboe 	} else {
1174*73572984SJens Axboe 		ret = pret < 0 ? pret : -EFAULT;
1175*73572984SJens Axboe 	}
1176*73572984SJens Axboe 	mmap_read_unlock(current->mm);
1177*73572984SJens Axboe 	if (ret) {
1178*73572984SJens Axboe 		/*
1179*73572984SJens Axboe 		 * if we did partial map, or found file backed vmas,
1180*73572984SJens Axboe 		 * release any pages we did get
1181*73572984SJens Axboe 		 */
1182*73572984SJens Axboe 		if (pret > 0)
1183*73572984SJens Axboe 			unpin_user_pages(pages, pret);
1184*73572984SJens Axboe 		goto done;
1185*73572984SJens Axboe 	}
1186*73572984SJens Axboe 	ret = 0;
1187*73572984SJens Axboe done:
1188*73572984SJens Axboe 	kvfree(vmas);
1189*73572984SJens Axboe 	if (ret < 0) {
1190*73572984SJens Axboe 		kvfree(pages);
1191*73572984SJens Axboe 		pages = ERR_PTR(ret);
1192*73572984SJens Axboe 	}
1193*73572984SJens Axboe 	return pages;
1194*73572984SJens Axboe }
1195*73572984SJens Axboe 
1196*73572984SJens Axboe static int io_sqe_buffer_register(struct io_ring_ctx *ctx, struct iovec *iov,
1197*73572984SJens Axboe 				  struct io_mapped_ubuf **pimu,
1198*73572984SJens Axboe 				  struct page **last_hpage)
1199*73572984SJens Axboe {
1200*73572984SJens Axboe 	struct io_mapped_ubuf *imu = NULL;
1201*73572984SJens Axboe 	struct page **pages = NULL;
1202*73572984SJens Axboe 	unsigned long off;
1203*73572984SJens Axboe 	size_t size;
1204*73572984SJens Axboe 	int ret, nr_pages, i;
1205*73572984SJens Axboe 
1206*73572984SJens Axboe 	if (!iov->iov_base) {
1207*73572984SJens Axboe 		*pimu = ctx->dummy_ubuf;
1208*73572984SJens Axboe 		return 0;
1209*73572984SJens Axboe 	}
1210*73572984SJens Axboe 
1211*73572984SJens Axboe 	*pimu = NULL;
1212*73572984SJens Axboe 	ret = -ENOMEM;
1213*73572984SJens Axboe 
1214*73572984SJens Axboe 	pages = io_pin_pages((unsigned long) iov->iov_base, iov->iov_len,
1215*73572984SJens Axboe 				&nr_pages);
1216*73572984SJens Axboe 	if (IS_ERR(pages)) {
1217*73572984SJens Axboe 		ret = PTR_ERR(pages);
1218*73572984SJens Axboe 		pages = NULL;
1219*73572984SJens Axboe 		goto done;
1220*73572984SJens Axboe 	}
1221*73572984SJens Axboe 
1222*73572984SJens Axboe 	imu = kvmalloc(struct_size(imu, bvec, nr_pages), GFP_KERNEL);
1223*73572984SJens Axboe 	if (!imu)
1224*73572984SJens Axboe 		goto done;
1225*73572984SJens Axboe 
1226*73572984SJens Axboe 	ret = io_buffer_account_pin(ctx, pages, nr_pages, imu, last_hpage);
1227*73572984SJens Axboe 	if (ret) {
1228*73572984SJens Axboe 		unpin_user_pages(pages, nr_pages);
1229*73572984SJens Axboe 		goto done;
1230*73572984SJens Axboe 	}
1231*73572984SJens Axboe 
1232*73572984SJens Axboe 	off = (unsigned long) iov->iov_base & ~PAGE_MASK;
1233*73572984SJens Axboe 	size = iov->iov_len;
1234*73572984SJens Axboe 	for (i = 0; i < nr_pages; i++) {
1235*73572984SJens Axboe 		size_t vec_len;
1236*73572984SJens Axboe 
1237*73572984SJens Axboe 		vec_len = min_t(size_t, size, PAGE_SIZE - off);
1238*73572984SJens Axboe 		imu->bvec[i].bv_page = pages[i];
1239*73572984SJens Axboe 		imu->bvec[i].bv_len = vec_len;
1240*73572984SJens Axboe 		imu->bvec[i].bv_offset = off;
1241*73572984SJens Axboe 		off = 0;
1242*73572984SJens Axboe 		size -= vec_len;
1243*73572984SJens Axboe 	}
1244*73572984SJens Axboe 	/* store original address for later verification */
1245*73572984SJens Axboe 	imu->ubuf = (unsigned long) iov->iov_base;
1246*73572984SJens Axboe 	imu->ubuf_end = imu->ubuf + iov->iov_len;
1247*73572984SJens Axboe 	imu->nr_bvecs = nr_pages;
1248*73572984SJens Axboe 	*pimu = imu;
1249*73572984SJens Axboe 	ret = 0;
1250*73572984SJens Axboe done:
1251*73572984SJens Axboe 	if (ret)
1252*73572984SJens Axboe 		kvfree(imu);
1253*73572984SJens Axboe 	kvfree(pages);
1254*73572984SJens Axboe 	return ret;
1255*73572984SJens Axboe }
1256*73572984SJens Axboe 
1257*73572984SJens Axboe static int io_buffers_map_alloc(struct io_ring_ctx *ctx, unsigned int nr_args)
1258*73572984SJens Axboe {
1259*73572984SJens Axboe 	ctx->user_bufs = kcalloc(nr_args, sizeof(*ctx->user_bufs), GFP_KERNEL);
1260*73572984SJens Axboe 	return ctx->user_bufs ? 0 : -ENOMEM;
1261*73572984SJens Axboe }
1262*73572984SJens Axboe 
1263*73572984SJens Axboe int io_sqe_buffers_register(struct io_ring_ctx *ctx, void __user *arg,
1264*73572984SJens Axboe 			    unsigned int nr_args, u64 __user *tags)
1265*73572984SJens Axboe {
1266*73572984SJens Axboe 	struct page *last_hpage = NULL;
1267*73572984SJens Axboe 	struct io_rsrc_data *data;
1268*73572984SJens Axboe 	int i, ret;
1269*73572984SJens Axboe 	struct iovec iov;
1270*73572984SJens Axboe 
1271*73572984SJens Axboe 	BUILD_BUG_ON(IORING_MAX_REG_BUFFERS >= (1u << 16));
1272*73572984SJens Axboe 
1273*73572984SJens Axboe 	if (ctx->user_bufs)
1274*73572984SJens Axboe 		return -EBUSY;
1275*73572984SJens Axboe 	if (!nr_args || nr_args > IORING_MAX_REG_BUFFERS)
1276*73572984SJens Axboe 		return -EINVAL;
1277*73572984SJens Axboe 	ret = io_rsrc_node_switch_start(ctx);
1278*73572984SJens Axboe 	if (ret)
1279*73572984SJens Axboe 		return ret;
1280*73572984SJens Axboe 	ret = io_rsrc_data_alloc(ctx, io_rsrc_buf_put, tags, nr_args, &data);
1281*73572984SJens Axboe 	if (ret)
1282*73572984SJens Axboe 		return ret;
1283*73572984SJens Axboe 	ret = io_buffers_map_alloc(ctx, nr_args);
1284*73572984SJens Axboe 	if (ret) {
1285*73572984SJens Axboe 		io_rsrc_data_free(data);
1286*73572984SJens Axboe 		return ret;
1287*73572984SJens Axboe 	}
1288*73572984SJens Axboe 
1289*73572984SJens Axboe 	for (i = 0; i < nr_args; i++, ctx->nr_user_bufs++) {
1290*73572984SJens Axboe 		if (arg) {
1291*73572984SJens Axboe 			ret = io_copy_iov(ctx, &iov, arg, i);
1292*73572984SJens Axboe 			if (ret)
1293*73572984SJens Axboe 				break;
1294*73572984SJens Axboe 			ret = io_buffer_validate(&iov);
1295*73572984SJens Axboe 			if (ret)
1296*73572984SJens Axboe 				break;
1297*73572984SJens Axboe 		} else {
1298*73572984SJens Axboe 			memset(&iov, 0, sizeof(iov));
1299*73572984SJens Axboe 		}
1300*73572984SJens Axboe 
1301*73572984SJens Axboe 		if (!iov.iov_base && *io_get_tag_slot(data, i)) {
1302*73572984SJens Axboe 			ret = -EINVAL;
1303*73572984SJens Axboe 			break;
1304*73572984SJens Axboe 		}
1305*73572984SJens Axboe 
1306*73572984SJens Axboe 		ret = io_sqe_buffer_register(ctx, &iov, &ctx->user_bufs[i],
1307*73572984SJens Axboe 					     &last_hpage);
1308*73572984SJens Axboe 		if (ret)
1309*73572984SJens Axboe 			break;
1310*73572984SJens Axboe 	}
1311*73572984SJens Axboe 
1312*73572984SJens Axboe 	WARN_ON_ONCE(ctx->buf_data);
1313*73572984SJens Axboe 
1314*73572984SJens Axboe 	ctx->buf_data = data;
1315*73572984SJens Axboe 	if (ret)
1316*73572984SJens Axboe 		__io_sqe_buffers_unregister(ctx);
1317*73572984SJens Axboe 	else
1318*73572984SJens Axboe 		io_rsrc_node_switch(ctx, NULL);
1319*73572984SJens Axboe 	return ret;
1320*73572984SJens Axboe }
1321