LCOV - code coverage report
Current view: top level - io_uring - io_uring.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 86 0.0 %
Date: 2023-07-19 18:55:55 Functions: 0 5 0.0 %

          Line data    Source code
       1             : #ifndef IOU_CORE_H
       2             : #define IOU_CORE_H
       3             : 
       4             : #include <linux/errno.h>
       5             : #include <linux/lockdep.h>
       6             : #include <linux/resume_user_mode.h>
       7             : #include <linux/kasan.h>
       8             : #include <linux/io_uring_types.h>
       9             : #include <uapi/linux/eventpoll.h>
      10             : #include "io-wq.h"
      11             : #include "slist.h"
      12             : #include "filetable.h"
      13             : 
      14             : #ifndef CREATE_TRACE_POINTS
      15             : #include <trace/events/io_uring.h>
      16             : #endif
      17             : 
      18             : enum {
      19             :         /* don't use deferred task_work */
      20             :         IOU_F_TWQ_FORCE_NORMAL                  = 1,
      21             : 
      22             :         /*
      23             :          * A hint to not wake right away but delay until there are enough of
      24             :          * tw's queued to match the number of CQEs the task is waiting for.
      25             :          *
      26             :          * Must not be used wirh requests generating more than one CQE.
      27             :          * It's also ignored unless IORING_SETUP_DEFER_TASKRUN is set.
      28             :          */
      29             :         IOU_F_TWQ_LAZY_WAKE                     = 2,
      30             : };
      31             : 
      32             : enum {
      33             :         IOU_OK                  = 0,
      34             :         IOU_ISSUE_SKIP_COMPLETE = -EIOCBQUEUED,
      35             : 
      36             :         /*
      37             :          * Intended only when both IO_URING_F_MULTISHOT is passed
      38             :          * to indicate to the poll runner that multishot should be
      39             :          * removed and the result is set on req->cqe.res.
      40             :          */
      41             :         IOU_STOP_MULTISHOT      = -ECANCELED,
      42             : };
      43             : 
      44             : struct io_uring_cqe *__io_get_cqe(struct io_ring_ctx *ctx, bool overflow);
      45             : bool io_req_cqe_overflow(struct io_kiocb *req);
      46             : int io_run_task_work_sig(struct io_ring_ctx *ctx);
      47             : void io_req_defer_failed(struct io_kiocb *req, s32 res);
      48             : void io_req_complete_post(struct io_kiocb *req, unsigned issue_flags);
      49             : bool io_post_aux_cqe(struct io_ring_ctx *ctx, u64 user_data, s32 res, u32 cflags);
      50             : bool io_aux_cqe(struct io_ring_ctx *ctx, bool defer, u64 user_data, s32 res, u32 cflags,
      51             :                 bool allow_overflow);
      52             : void __io_commit_cqring_flush(struct io_ring_ctx *ctx);
      53             : 
      54             : struct page **io_pin_pages(unsigned long ubuf, unsigned long len, int *npages);
      55             : 
      56             : struct file *io_file_get_normal(struct io_kiocb *req, int fd);
      57             : struct file *io_file_get_fixed(struct io_kiocb *req, int fd,
      58             :                                unsigned issue_flags);
      59             : 
      60             : static inline bool io_req_ffs_set(struct io_kiocb *req)
      61             : {
      62           0 :         return req->flags & REQ_F_FIXED_FILE;
      63             : }
      64             : 
      65             : void __io_req_task_work_add(struct io_kiocb *req, unsigned flags);
      66             : bool io_is_uring_fops(struct file *file);
      67             : bool io_alloc_async_data(struct io_kiocb *req);
      68             : void io_req_task_queue(struct io_kiocb *req);
      69             : void io_queue_iowq(struct io_kiocb *req, struct io_tw_state *ts_dont_use);
      70             : void io_req_task_complete(struct io_kiocb *req, struct io_tw_state *ts);
      71             : void io_req_task_queue_fail(struct io_kiocb *req, int ret);
      72             : void io_req_task_submit(struct io_kiocb *req, struct io_tw_state *ts);
      73             : void tctx_task_work(struct callback_head *cb);
      74             : __cold void io_uring_cancel_generic(bool cancel_all, struct io_sq_data *sqd);
      75             : int io_uring_alloc_task_context(struct task_struct *task,
      76             :                                 struct io_ring_ctx *ctx);
      77             : 
      78             : int io_poll_issue(struct io_kiocb *req, struct io_tw_state *ts);
      79             : int io_submit_sqes(struct io_ring_ctx *ctx, unsigned int nr);
      80             : int io_do_iopoll(struct io_ring_ctx *ctx, bool force_nonspin);
      81             : void io_free_batch_list(struct io_ring_ctx *ctx, struct io_wq_work_node *node);
      82             : int io_req_prep_async(struct io_kiocb *req);
      83             : 
      84             : struct io_wq_work *io_wq_free_work(struct io_wq_work *work);
      85             : void io_wq_submit_work(struct io_wq_work *work);
      86             : 
      87             : void io_free_req(struct io_kiocb *req);
      88             : void io_queue_next(struct io_kiocb *req);
      89             : void io_task_refs_refill(struct io_uring_task *tctx);
      90             : bool __io_alloc_req_refill(struct io_ring_ctx *ctx);
      91             : 
      92             : bool io_match_task_safe(struct io_kiocb *head, struct task_struct *task,
      93             :                         bool cancel_all);
      94             : 
      95             : #define io_lockdep_assert_cq_locked(ctx)                                \
      96             :         do {                                                            \
      97             :                 lockdep_assert(in_task());                              \
      98             :                                                                         \
      99             :                 if (ctx->flags & IORING_SETUP_IOPOLL) {                  \
     100             :                         lockdep_assert_held(&ctx->uring_lock);           \
     101             :                 } else if (!ctx->task_complete) {                    \
     102             :                         lockdep_assert_held(&ctx->completion_lock);      \
     103             :                 } else if (ctx->submitter_task->flags & PF_EXITING) { \
     104             :                         lockdep_assert(current_work());                 \
     105             :                 } else {                                                \
     106             :                         lockdep_assert(current == ctx->submitter_task);      \
     107             :                 }                                                       \
     108             :         } while (0)
     109             : 
     110             : static inline void io_req_task_work_add(struct io_kiocb *req)
     111             : {
     112           0 :         __io_req_task_work_add(req, 0);
     113             : }
     114             : 
     115             : #define io_for_each_link(pos, head) \
     116             :         for (pos = (head); pos; pos = pos->link)
     117             : 
     118             : void io_cq_unlock_post(struct io_ring_ctx *ctx);
     119             : 
     120           0 : static inline struct io_uring_cqe *io_get_cqe_overflow(struct io_ring_ctx *ctx,
     121             :                                                        bool overflow)
     122             : {
     123           0 :         io_lockdep_assert_cq_locked(ctx);
     124             : 
     125           0 :         if (likely(ctx->cqe_cached < ctx->cqe_sentinel)) {
     126           0 :                 struct io_uring_cqe *cqe = ctx->cqe_cached;
     127             : 
     128           0 :                 ctx->cached_cq_tail++;
     129           0 :                 ctx->cqe_cached++;
     130           0 :                 if (ctx->flags & IORING_SETUP_CQE32)
     131           0 :                         ctx->cqe_cached++;
     132             :                 return cqe;
     133             :         }
     134             : 
     135           0 :         return __io_get_cqe(ctx, overflow);
     136             : }
     137             : 
     138             : static inline struct io_uring_cqe *io_get_cqe(struct io_ring_ctx *ctx)
     139             : {
     140           0 :         return io_get_cqe_overflow(ctx, false);
     141             : }
     142             : 
     143           0 : static inline bool __io_fill_cqe_req(struct io_ring_ctx *ctx,
     144             :                                      struct io_kiocb *req)
     145             : {
     146             :         struct io_uring_cqe *cqe;
     147             : 
     148             :         /*
     149             :          * If we can't get a cq entry, userspace overflowed the
     150             :          * submission (by quite a lot). Increment the overflow count in
     151             :          * the ring.
     152             :          */
     153           0 :         cqe = io_get_cqe(ctx);
     154           0 :         if (unlikely(!cqe))
     155             :                 return false;
     156             : 
     157           0 :         trace_io_uring_complete(req->ctx, req, req->cqe.user_data,
     158             :                                 req->cqe.res, req->cqe.flags,
     159             :                                 (req->flags & REQ_F_CQE32_INIT) ? req->extra1 : 0,
     160             :                                 (req->flags & REQ_F_CQE32_INIT) ? req->extra2 : 0);
     161             : 
     162           0 :         memcpy(cqe, &req->cqe, sizeof(*cqe));
     163             : 
     164           0 :         if (ctx->flags & IORING_SETUP_CQE32) {
     165           0 :                 u64 extra1 = 0, extra2 = 0;
     166             : 
     167           0 :                 if (req->flags & REQ_F_CQE32_INIT) {
     168           0 :                         extra1 = req->extra1;
     169           0 :                         extra2 = req->extra2;
     170             :                 }
     171             : 
     172           0 :                 WRITE_ONCE(cqe->big_cqe[0], extra1);
     173           0 :                 WRITE_ONCE(cqe->big_cqe[1], extra2);
     174             :         }
     175             :         return true;
     176             : }
     177             : 
     178           0 : static inline bool io_fill_cqe_req(struct io_ring_ctx *ctx,
     179             :                                    struct io_kiocb *req)
     180             : {
     181           0 :         if (likely(__io_fill_cqe_req(ctx, req)))
     182             :                 return true;
     183           0 :         return io_req_cqe_overflow(req);
     184             : }
     185             : 
     186             : static inline void req_set_fail(struct io_kiocb *req)
     187             : {
     188           0 :         req->flags |= REQ_F_FAIL;
     189           0 :         if (req->flags & REQ_F_CQE_SKIP) {
     190             :                 req->flags &= ~REQ_F_CQE_SKIP;
     191           0 :                 req->flags |= REQ_F_SKIP_LINK_CQES;
     192             :         }
     193             : }
     194             : 
     195             : static inline void io_req_set_res(struct io_kiocb *req, s32 res, u32 cflags)
     196             : {
     197           0 :         req->cqe.res = res;
     198           0 :         req->cqe.flags = cflags;
     199             : }
     200             : 
     201             : static inline bool req_has_async_data(struct io_kiocb *req)
     202             : {
     203           0 :         return req->flags & REQ_F_ASYNC_DATA;
     204             : }
     205             : 
     206             : static inline void io_put_file(struct file *file)
     207             : {
     208           0 :         if (file)
     209           0 :                 fput(file);
     210             : }
     211             : 
     212             : static inline void io_ring_submit_unlock(struct io_ring_ctx *ctx,
     213             :                                          unsigned issue_flags)
     214             : {
     215             :         lockdep_assert_held(&ctx->uring_lock);
     216           0 :         if (issue_flags & IO_URING_F_UNLOCKED)
     217           0 :                 mutex_unlock(&ctx->uring_lock);
     218             : }
     219             : 
     220             : static inline void io_ring_submit_lock(struct io_ring_ctx *ctx,
     221             :                                        unsigned issue_flags)
     222             : {
     223             :         /*
     224             :          * "Normal" inline submissions always hold the uring_lock, since we
     225             :          * grab it from the system call. Same is true for the SQPOLL offload.
     226             :          * The only exception is when we've detached the request and issue it
     227             :          * from an async worker thread, grab the lock for that case.
     228             :          */
     229           0 :         if (issue_flags & IO_URING_F_UNLOCKED)
     230           0 :                 mutex_lock(&ctx->uring_lock);
     231             :         lockdep_assert_held(&ctx->uring_lock);
     232             : }
     233             : 
     234             : static inline void io_commit_cqring(struct io_ring_ctx *ctx)
     235             : {
     236             :         /* order cqe stores with ring update */
     237           0 :         smp_store_release(&ctx->rings->cq.tail, ctx->cached_cq_tail);
     238             : }
     239             : 
     240             : static inline void io_poll_wq_wake(struct io_ring_ctx *ctx)
     241             : {
     242           0 :         if (wq_has_sleeper(&ctx->poll_wq))
     243           0 :                 __wake_up(&ctx->poll_wq, TASK_NORMAL, 0,
     244             :                                 poll_to_key(EPOLL_URING_WAKE | EPOLLIN));
     245             : }
     246             : 
     247             : static inline void io_cqring_wake(struct io_ring_ctx *ctx)
     248             : {
     249             :         /*
     250             :          * Trigger waitqueue handler on all waiters on our waitqueue. This
     251             :          * won't necessarily wake up all the tasks, io_should_wake() will make
     252             :          * that decision.
     253             :          *
     254             :          * Pass in EPOLLIN|EPOLL_URING_WAKE as the poll wakeup key. The latter
     255             :          * set in the mask so that if we recurse back into our own poll
     256             :          * waitqueue handlers, we know we have a dependency between eventfd or
     257             :          * epoll and should terminate multishot poll at that point.
     258             :          */
     259           0 :         if (wq_has_sleeper(&ctx->cq_wait))
     260           0 :                 __wake_up(&ctx->cq_wait, TASK_NORMAL, 0,
     261             :                                 poll_to_key(EPOLL_URING_WAKE | EPOLLIN));
     262             : }
     263             : 
     264             : static inline bool io_sqring_full(struct io_ring_ctx *ctx)
     265             : {
     266           0 :         struct io_rings *r = ctx->rings;
     267             : 
     268           0 :         return READ_ONCE(r->sq.tail) - ctx->cached_sq_head == ctx->sq_entries;
     269             : }
     270             : 
     271             : static inline unsigned int io_sqring_entries(struct io_ring_ctx *ctx)
     272             : {
     273           0 :         struct io_rings *rings = ctx->rings;
     274             :         unsigned int entries;
     275             : 
     276             :         /* make sure SQ entry isn't read before tail */
     277           0 :         entries = smp_load_acquire(&rings->sq.tail) - ctx->cached_sq_head;
     278           0 :         return min(entries, ctx->sq_entries);
     279             : }
     280             : 
     281           0 : static inline int io_run_task_work(void)
     282             : {
     283             :         /*
     284             :          * Always check-and-clear the task_work notification signal. With how
     285             :          * signaling works for task_work, we can find it set with nothing to
     286             :          * run. We need to clear it for that case, like get_signal() does.
     287             :          */
     288           0 :         if (test_thread_flag(TIF_NOTIFY_SIGNAL))
     289             :                 clear_notify_signal();
     290             :         /*
     291             :          * PF_IO_WORKER never returns to userspace, so check here if we have
     292             :          * notify work that needs processing.
     293             :          */
     294           0 :         if (current->flags & PF_IO_WORKER &&
     295           0 :             test_thread_flag(TIF_NOTIFY_RESUME)) {
     296           0 :                 __set_current_state(TASK_RUNNING);
     297           0 :                 resume_user_mode_work(NULL);
     298             :         }
     299           0 :         if (task_work_pending(current)) {
     300           0 :                 __set_current_state(TASK_RUNNING);
     301           0 :                 task_work_run();
     302           0 :                 return 1;
     303             :         }
     304             : 
     305             :         return 0;
     306             : }
     307             : 
     308             : static inline bool io_task_work_pending(struct io_ring_ctx *ctx)
     309             : {
     310           0 :         return task_work_pending(current) || !wq_list_empty(&ctx->work_llist);
     311             : }
     312             : 
     313             : static inline void io_tw_lock(struct io_ring_ctx *ctx, struct io_tw_state *ts)
     314             : {
     315           0 :         if (!ts->locked) {
     316           0 :                 mutex_lock(&ctx->uring_lock);
     317           0 :                 ts->locked = true;
     318             :         }
     319             : }
     320             : 
     321             : /*
     322             :  * Don't complete immediately but use deferred completion infrastructure.
     323             :  * Protected by ->uring_lock and can only be used either with
     324             :  * IO_URING_F_COMPLETE_DEFER or inside a tw handler holding the mutex.
     325             :  */
     326             : static inline void io_req_complete_defer(struct io_kiocb *req)
     327             :         __must_hold(&req->ctx->uring_lock)
     328             : {
     329           0 :         struct io_submit_state *state = &req->ctx->submit_state;
     330             : 
     331             :         lockdep_assert_held(&req->ctx->uring_lock);
     332             : 
     333           0 :         wq_list_add_tail(&req->comp_list, &state->compl_reqs);
     334             : }
     335             : 
     336             : static inline void io_commit_cqring_flush(struct io_ring_ctx *ctx)
     337             : {
     338           0 :         if (unlikely(ctx->off_timeout_used || ctx->drain_active ||
     339             :                      ctx->has_evfd || ctx->poll_activated))
     340           0 :                 __io_commit_cqring_flush(ctx);
     341             : }
     342             : 
     343           0 : static inline void io_get_task_refs(int nr)
     344             : {
     345           0 :         struct io_uring_task *tctx = current->io_uring;
     346             : 
     347           0 :         tctx->cached_refs -= nr;
     348           0 :         if (unlikely(tctx->cached_refs < 0))
     349           0 :                 io_task_refs_refill(tctx);
     350           0 : }
     351             : 
     352             : static inline bool io_req_cache_empty(struct io_ring_ctx *ctx)
     353             : {
     354           0 :         return !ctx->submit_state.free_list.next;
     355             : }
     356             : 
     357             : extern struct kmem_cache *req_cachep;
     358             : 
     359             : static inline struct io_kiocb *io_extract_req(struct io_ring_ctx *ctx)
     360             : {
     361             :         struct io_kiocb *req;
     362             : 
     363           0 :         req = container_of(ctx->submit_state.free_list.next, struct io_kiocb, comp_list);
     364           0 :         kasan_unpoison_object_data(req_cachep, req);
     365           0 :         wq_stack_extract(&ctx->submit_state.free_list);
     366             :         return req;
     367             : }
     368             : 
     369             : static inline bool io_alloc_req(struct io_ring_ctx *ctx, struct io_kiocb **req)
     370             : {
     371           0 :         if (unlikely(io_req_cache_empty(ctx))) {
     372           0 :                 if (!__io_alloc_req_refill(ctx))
     373             :                         return false;
     374             :         }
     375           0 :         *req = io_extract_req(ctx);
     376             :         return true;
     377             : }
     378             : 
     379             : static inline bool io_allowed_defer_tw_run(struct io_ring_ctx *ctx)
     380             : {
     381           0 :         return likely(ctx->submitter_task == current);
     382             : }
     383             : 
     384             : static inline bool io_allowed_run_tw(struct io_ring_ctx *ctx)
     385             : {
     386           0 :         return likely(!(ctx->flags & IORING_SETUP_DEFER_TASKRUN) ||
     387             :                       ctx->submitter_task == current);
     388             : }
     389             : 
     390             : static inline void io_req_queue_tw_complete(struct io_kiocb *req, s32 res)
     391             : {
     392           0 :         io_req_set_res(req, res, 0);
     393           0 :         req->io_task_work.func = io_req_task_complete;
     394           0 :         io_req_task_work_add(req);
     395             : }
     396             : 
     397             : /*
     398             :  * IORING_SETUP_SQE128 contexts allocate twice the normal SQE size for each
     399             :  * slot.
     400             :  */
     401             : static inline size_t uring_sqe_size(struct io_ring_ctx *ctx)
     402             : {
     403           0 :         if (ctx->flags & IORING_SETUP_SQE128)
     404             :                 return 2 * sizeof(struct io_uring_sqe);
     405             :         return sizeof(struct io_uring_sqe);
     406             : }
     407             : #endif

Generated by: LCOV version 1.14