Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

io_uring: move our reference counting into a header

Signed-off-by: Jens Axboe <axboe@kernel.dk>

+49 -42
+1 -42
io_uring/io_uring.c
··· 91 91 92 92 #include "io_uring_types.h" 93 93 #include "io_uring.h" 94 + #include "refs.h" 94 95 95 96 #include "xattr.h" 96 97 #include "nop.h" ··· 612 611 #define io_for_each_link(pos, head) \ 613 612 for (pos = (head); pos; pos = pos->link) 614 613 615 - /* 616 - * Shamelessly stolen from the mm implementation of page reference checking, 617 - * see commit f958d7b528b1 for details. 618 - */ 619 - #define req_ref_zero_or_close_to_overflow(req) \ 620 - ((unsigned int) atomic_read(&(req->refs)) + 127u <= 127u) 621 - 622 - static inline bool req_ref_inc_not_zero(struct io_kiocb *req) 623 - { 624 - WARN_ON_ONCE(!(req->flags & REQ_F_REFCOUNT)); 625 - return atomic_inc_not_zero(&req->refs); 626 - } 627 - 628 - static inline bool req_ref_put_and_test(struct io_kiocb *req) 629 - { 630 - if (likely(!(req->flags & REQ_F_REFCOUNT))) 631 - return true; 632 - 633 - WARN_ON_ONCE(req_ref_zero_or_close_to_overflow(req)); 634 - return atomic_dec_and_test(&req->refs); 635 - } 636 - 637 - static inline void req_ref_get(struct io_kiocb *req) 638 - { 639 - WARN_ON_ONCE(!(req->flags & REQ_F_REFCOUNT)); 640 - WARN_ON_ONCE(req_ref_zero_or_close_to_overflow(req)); 641 - atomic_inc(&req->refs); 642 - } 643 - 644 614 static inline void io_submit_flush_completions(struct io_ring_ctx *ctx) 645 615 { 646 616 if (!wq_list_empty(&ctx->submit_state.compl_reqs)) 647 617 __io_submit_flush_completions(ctx); 648 - } 649 - 650 - static inline void __io_req_set_refcount(struct io_kiocb *req, int nr) 651 - { 652 - if (!(req->flags & REQ_F_REFCOUNT)) { 653 - req->flags |= REQ_F_REFCOUNT; 654 - atomic_set(&req->refs, nr); 655 - } 656 - } 657 - 658 - static inline void io_req_set_refcount(struct io_kiocb *req) 659 - { 660 - __io_req_set_refcount(req, 1); 661 618 } 662 619 663 620 #define IO_RSRC_REF_BATCH 100
+48
io_uring/refs.h
··· 1 + #ifndef IOU_REQ_REF_H 2 + #define IOU_REQ_REF_H 3 + 4 + #include <linux/atomic.h> 5 + #include "io_uring_types.h" 6 + 7 + /* 8 + * Shamelessly stolen from the mm implementation of page reference checking, 9 + * see commit f958d7b528b1 for details. 10 + */ 11 + #define req_ref_zero_or_close_to_overflow(req) \ 12 + ((unsigned int) atomic_read(&(req->refs)) + 127u <= 127u) 13 + 14 + static inline bool req_ref_inc_not_zero(struct io_kiocb *req) 15 + { 16 + WARN_ON_ONCE(!(req->flags & REQ_F_REFCOUNT)); 17 + return atomic_inc_not_zero(&req->refs); 18 + } 19 + 20 + static inline bool req_ref_put_and_test(struct io_kiocb *req) 21 + { 22 + if (likely(!(req->flags & REQ_F_REFCOUNT))) 23 + return true; 24 + 25 + WARN_ON_ONCE(req_ref_zero_or_close_to_overflow(req)); 26 + return atomic_dec_and_test(&req->refs); 27 + } 28 + 29 + static inline void req_ref_get(struct io_kiocb *req) 30 + { 31 + WARN_ON_ONCE(!(req->flags & REQ_F_REFCOUNT)); 32 + WARN_ON_ONCE(req_ref_zero_or_close_to_overflow(req)); 33 + atomic_inc(&req->refs); 34 + } 35 + 36 + static inline void __io_req_set_refcount(struct io_kiocb *req, int nr) 37 + { 38 + if (!(req->flags & REQ_F_REFCOUNT)) { 39 + req->flags |= REQ_F_REFCOUNT; 40 + atomic_set(&req->refs, nr); 41 + } 42 + } 43 + 44 + static inline void io_req_set_refcount(struct io_kiocb *req) 45 + { 46 + __io_req_set_refcount(req, 1); 47 + } 48 + #endif