From: Jonathan Lemon <jonathan.lemon@gmail.com>
To: <io-uring@vger.kernel.org>
Subject: [RFC v1 6/9] io_uring: introduce reference tracking for user pages.
Date: Fri, 7 Oct 2022 14:17:10 -0700 [thread overview]
Message-ID: <20221007211713.170714-7-jonathan.lemon@gmail.com> (raw)
In-Reply-To: <20221007211713.170714-1-jonathan.lemon@gmail.com>
This is currently a WIP.
If only part of a page is used by a skb fragment, and then provided
to the user, the page should not be reused by the kernel until all
sub-page fragments are not in use.
If only full pages are used (and not sub-page fragments), then this
code shouldn't be needed.
Signed-off-by: Jonathan Lemon <jonathan.lemon@gmail.com>
---
io_uring/zctap.c | 34 ++++++++++++++++++++++++++++++++++
1 file changed, 34 insertions(+)
diff --git a/io_uring/zctap.c b/io_uring/zctap.c
index 58b4c5417650..9db3421fb9fa 100644
--- a/io_uring/zctap.c
+++ b/io_uring/zctap.c
@@ -183,9 +183,36 @@ struct ifq_region {
int count;
int imu_idx;
int nr_pages;
+ u8 *page_uref;
struct page *page[];
};
+static void io_add_page_uref(struct ifq_region *ifr, u16 pgid)
+{
+ if (WARN_ON(!ifr))
+ return;
+
+ if (WARN_ON(pgid < ifr->imu_idx))
+ return;
+
+ ifr->page_uref[pgid - ifr->imu_idx]++;
+}
+
+static bool io_put_page_last_uref(struct ifq_region *ifr, u64 addr)
+{
+ int idx;
+
+ if (WARN_ON(addr < ifr->start || addr > ifr->end))
+ return false;
+
+ idx = (addr - ifr->start) >> PAGE_SHIFT;
+
+ if (WARN_ON(!ifr->page_uref[idx]))
+ return false;
+
+ return --ifr->page_uref[idx] == 0;
+}
+
int io_provide_ifq_region_prep(struct io_kiocb *req,
const struct io_uring_sqe *sqe)
{
@@ -244,6 +271,11 @@ int io_provide_ifq_region(struct io_kiocb *req, unsigned int issue_flags)
if (!ifr)
return -ENOMEM;
+ ifr->page_uref = kvmalloc_array(nr_pages, sizeof(u8), GFP_KERNEL);
+ if (!ifr->page_uref) {
+ kvfree(ifr);
+ return -ENOMEM;
+ }
ifr->nr_pages = nr_pages;
ifr->imu_idx = idx;
@@ -261,6 +293,7 @@ int io_provide_ifq_region(struct io_kiocb *req, unsigned int issue_flags)
info = zctap_page_info(r->bgid, idx + i, id);
set_page_private(page, info);
ifr->page[i] = page;
+ ifr->page_uref[i] = 0;
}
WRITE_ONCE(r->ifq->region, ifr);
@@ -273,6 +306,7 @@ int io_provide_ifq_region(struct io_kiocb *req, unsigned int issue_flags)
set_page_private(page, 0);
}
+ kvfree(ifr->page_uref);
kvfree(ifr);
return -EEXIST;
--
2.30.2
next prev parent reply other threads:[~2022-10-07 21:17 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-07 21:17 [RFC v1 0/9] zero-copy RX for io_uring Jonathan Lemon
2022-10-07 21:17 ` [RFC v1 1/9] io_uring: add zctap ifq definition Jonathan Lemon
2022-10-07 21:17 ` [RFC v1 2/9] netdevice: add SETUP_ZCTAP to the netdev_bpf structure Jonathan Lemon
2022-10-07 21:17 ` [RFC v1 3/9] io_uring: add register ifq opcode Jonathan Lemon
2022-10-07 21:17 ` [RFC v1 4/9] io_uring: add provide_ifq_region opcode Jonathan Lemon
2022-10-07 21:17 ` [RFC v1 5/9] io_uring: Add io_uring zctap iov structure and helpers Jonathan Lemon
2022-10-07 21:17 ` Jonathan Lemon [this message]
2022-10-07 21:17 ` [RFC v1 7/9] page_pool: add page allocation and free hooks Jonathan Lemon
2022-10-07 21:17 ` [RFC v1 8/9] io_uring: provide functions for the page_pool Jonathan Lemon
2022-10-07 21:17 ` [RFC v1 9/9] io_uring: add OP_RECV_ZC command Jonathan Lemon
2022-10-10 7:37 ` [RFC v1 0/9] zero-copy RX for io_uring dust.li
2022-10-10 19:34 ` Jonathan Lemon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221007211713.170714-7-jonathan.lemon@gmail.com \
--to=jonathan.lemon@gmail.com \
--cc=io-uring@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.