LCOV - code coverage report
Current view: top level - io_uring - rsrc.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 591 0.0 %
Date: 2023-04-06 08:38:28 Functions: 0 44 0.0 %

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

Generated by: LCOV version 1.14