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