From: Jeffle Xu <jefflexu@linux.alibaba.com>
To: dhowells@redhat.com, linux-cachefs@redhat.com, xiang@kernel.org,
chao@kernel.org, linux-erofs@lists.ozlabs.org
Cc: torvalds@linux-foundation.org, gregkh@linuxfoundation.org,
willy@infradead.org, linux-fsdevel@vger.kernel.org,
joseph.qi@linux.alibaba.com, bo.liu@linux.alibaba.com,
tao.peng@linux.alibaba.com, gerry@linux.alibaba.com,
eguan@linux.alibaba.com, linux-kernel@vger.kernel.org,
luodaowen.backend@bytedance.com, tianzichen@kuaishou.com,
fannaihao@baidu.com
Subject: [PATCH v6 07/22] cachefiles: document on-demand read mode
Date: Fri, 25 Mar 2022 20:22:08 +0800 [thread overview]
Message-ID: <20220325122223.102958-8-jefflexu@linux.alibaba.com> (raw)
In-Reply-To: <20220325122223.102958-1-jefflexu@linux.alibaba.com>
Document new user interface introduced by on-demand read mode.
Signed-off-by: Jeffle Xu <jefflexu@linux.alibaba.com>
---
.../filesystems/caching/cachefiles.rst | 178 ++++++++++++++++++
1 file changed, 178 insertions(+)
diff --git a/Documentation/filesystems/caching/cachefiles.rst b/Documentation/filesystems/caching/cachefiles.rst
index 8bf396b76359..46420fca6677 100644
--- a/Documentation/filesystems/caching/cachefiles.rst
+++ b/Documentation/filesystems/caching/cachefiles.rst
@@ -28,6 +28,8 @@ Cache on Already Mounted Filesystem
(*) Debugging.
+ (*) On-demand Read.
+
Overview
@@ -482,3 +484,179 @@ the control file. For example::
echo $((1|4|8)) >/sys/module/cachefiles/parameters/debug
will turn on all function entry debugging.
+
+
+On-demand Read
+==============
+
+When working in original mode, cachefiles mainly serves as a local cache for
+remote networking fs, while in on-demand read mode, cachefiles can boost the
+scenario where on-demand read semantics is needed, e.g. container image
+distribution.
+
+The essential difference between these two modes is that, in original mode,
+when cache miss, netfs itself will fetch data from remote, and then write the
+fetched data into cache file. While in on-demand read mode, a user daemon is
+responsible for fetching data and then writing to the cache file.
+
+``CONFIG_CACHEFILES_ONDEMAND`` shall be enabled to support on-demand read mode.
+
+
+Protocol Communication
+----------------------
+
+The on-demand read mode relies on a simple protocol used for communication
+between kernel and user daemon. The model is like::
+
+ kernel --[request]--> user daemon --[reply]--> kernel
+
+The cachefiles kernel module will send requests to user daemon when needed.
+User daemon needs to poll on the devnode ('/dev/cachefiles') to check if
+there's pending request to be processed. A POLLIN event will be returned
+when there's pending request.
+
+Then user daemon needs to read the devnode to fetch one request and process it
+accordingly. It is worth nothing that each read only gets one request. When
+finished processing the request, user dameon needs to write the reply to the
+devnode.
+
+Each request is started with a message header like::
+
+ struct cachefiles_msg {
+ __u32 id;
+ __u32 opcode;
+ __u32 len;
+ __u8 data[];
+ };
+
+ * ``id`` identifies the position of this request in an internal xarray
+ managing all pending requests.
+
+ * ``opcode`` identifies the type of this request.
+
+ * ``data`` identifies the payload of this request.
+
+ * ``len`` identifies the whole length of this request, including the
+ header and following type specific payload.
+
+
+Turn on On-demand Mode
+----------------------
+
+An optional parameter is added to "bind" command::
+
+ bind [ondemand]
+
+When "bind" command takes without argument, it defaults to the original mode.
+When "bind" command takes with "ondemand" argument, i.e. "bind ondemand",
+on-demand read mode will be enabled.
+
+
+OPEN Request
+------------
+
+When netfs opens a cache file for the first time, a request with
+CACHEFILES_OP_OPEN opcode, a.k.a OPEN request will be sent to user daemon. The
+payload format is like::
+
+ struct cachefiles_open {
+ __u32 volume_key_len;
+ __u32 cookie_key_len;
+ __u32 fd;
+ __u32 flags;
+ __u8 data[];
+ };
+
+ * ``data`` contains volume_key and cookie_key in sequence.
+
+ * ``volume_key_len`` identifies the length of the volume key of the
+ cache file, in bytes. volume_key is of string format, with a suffix
+ '\0'.
+
+ * ``cookie_key_len`` identifies the length of the cookie key of the
+ cache file, in bytes. The format of cookie_key is netfs specific. It
+ can be of binary format.
+
+ * ``fd`` identifies the anonymous fd of the cache file, with which user
+ daemon can perform write/llseek file operations on the cache file.
+
+
+OPEN request contains (volume_key, cookie_key, anon_fd) triple for corresponding
+cache file. With this triple, user daemon could fetch and write data into the
+cache file in the background, even when kernel has not triggered the cache miss
+yet. User daemon is able to distinguish the requested cache file with the given
+(volume_key, cookie_key), and write the fetched data into cache file with the
+given anon_fd.
+
+After recording the (volume_key, cookie_key, anon_fd) triple, user daemon shall
+reply with "cinit" (complete init) command::
+
+ cinit <id>
+
+ * ``id`` is exactly the id field of the previous OPEN request.
+
+
+Besides, CACHEFILES_OPEN_WANT_CACHE_SIZE flag may be set in flags field of
+OPEN request. This flag is used in the scenario where one cache file can contain
+multiple netfs files for the purpose of deduplication, e.g. In this case, netfs
+itself has no idea the cache file size, whilst user daemon needs to offer the
+hint on the cache file size.
+
+Thus when receiving an OPEN request with CACHEFILES_OPEN_WANT_CACHE_SIZE flag
+set, user daemon must reply with the cache file size::
+
+ cinit <id>,<cache_size>
+
+ * ``id`` is exactly the id field of the previous OPEN request.
+
+ * ``cache_size`` identifies the size of the cache file.
+
+
+CLOSE Request
+-------------
+When cookie withdrawed, a request with CACHEFILES_OP_CLOSE opcode, a.k.a CLOSE
+request, will be sent to user daemon. It will notify user daemon to close the
+attached anon_fd. The payload format is like::
+
+ struct cachefiles_close {
+ __u32 fd;
+ };
+
+ * ``fd`` identifies the anon_fd to be closed, which is exactly the same
+ with that in OPEN request.
+
+
+READ Request
+------------
+
+When on-demand read mode is turned on, and cache miss encountered, kernel will
+send a request with CACHEFILES_OP_READ opcode, a.k.a READ request, to user
+daemon. It will notify user daemon to fetch data in the requested file range.
+The payload format is like::
+
+ struct cachefiles_read {
+ __u64 off;
+ __u64 len;
+ __u32 fd;
+ };
+
+ * ``off`` identifies the starting offset of the requested file range.
+
+ * ``len`` identifies the length of the requested file range.
+
+ * ``fd`` identifies the anonymous fd of the requested cache file. It is
+ guaranteed that it shall be the same with the fd field in the previous
+ OPEN request.
+
+When receiving one READ request, user daemon needs to fetch data of the
+requested file range, and then write the fetched data into cache file with the
+given anonymous fd.
+
+When finished processing the READ request, user daemon needs to reply with
+CACHEFILES_IOC_CREAD ioctl on the corresponding anon_fd::
+
+ ioctl(fd, CACHEFILES_IOC_CREAD, id);
+
+ * ``fd`` is exactly the fd field of the previous READ request.
+
+ * ``id`` is exactly the id field of the previous READ request.
--
2.27.0
next prev parent reply other threads:[~2022-03-25 12:23 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-25 12:22 [PATCH v6 00/22] fscache,erofs: fscache-based on-demand read semantics Jeffle Xu
2022-03-25 12:22 ` [PATCH v6 01/22] fscache: export fscache_end_operation() Jeffle Xu
2022-03-25 12:22 ` [PATCH v6 02/22] cachefiles: extract write routine Jeffle Xu
2022-03-25 12:22 ` [PATCH v6 03/22] cachefiles: notify user daemon with anon_fd when looking up cookie Jeffle Xu
2022-03-25 20:52 ` kernel test robot
2022-03-25 23:25 ` kernel test robot
2022-03-29 6:14 ` [Linux-cachefs] " JeffleXu
2022-03-25 12:22 ` [PATCH v6 04/22] cachefiles: notify user daemon when withdrawing cookie Jeffle Xu
2022-03-25 12:22 ` [PATCH v6 05/22] cachefiles: implement on-demand read Jeffle Xu
2022-03-25 12:22 ` [PATCH v6 06/22] cachefiles: enable on-demand read mode Jeffle Xu
2022-03-25 12:22 ` Jeffle Xu [this message]
2022-03-25 12:22 ` [PATCH v6 08/22] erofs: use meta buffers for erofs_read_superblock() Jeffle Xu
2022-03-25 12:22 ` [PATCH v6 09/22] erofs: make erofs_map_blocks() generally available Jeffle Xu
2022-03-25 12:22 ` [PATCH v6 10/22] erofs: add mode checking helper Jeffle Xu
2022-03-28 2:42 ` Gao Xiang
2022-03-28 2:46 ` JeffleXu
2022-03-25 12:22 ` [PATCH v6 11/22] erofs: register global fscache volume Jeffle Xu
2022-03-25 12:22 ` [PATCH v6 12/22] erofs: add cookie context helper functions Jeffle Xu
2022-03-25 13:41 ` Gao Xiang
2022-03-28 3:11 ` JeffleXu
2022-03-25 12:22 ` [PATCH v6 13/22] erofs: add anonymous inode managing page cache of blob file Jeffle Xu
2022-03-25 13:46 ` [Linux-cachefs] " Gao Xiang
2022-03-25 12:22 ` [PATCH v6 14/22] erofs: add erofs_fscache_read_folios() helper Jeffle Xu
2022-03-28 2:49 ` [Linux-cachefs] " Gao Xiang
2022-03-25 12:22 ` [PATCH v6 15/22] erofs: register cookie context for bootstrap blob Jeffle Xu
2022-03-28 3:04 ` Gao Xiang
2022-03-28 3:15 ` JeffleXu
2022-03-25 12:22 ` [PATCH v6 16/22] erofs: implement fscache-based metadata read Jeffle Xu
2022-03-25 12:22 ` [PATCH v6 17/22] erofs: implement fscache-based data read for non-inline layout Jeffle Xu
2022-03-28 3:14 ` Gao Xiang
2022-03-25 12:22 ` [PATCH v6 18/22] erofs: implement fscache-based data read for inline layout Jeffle Xu
2022-03-25 12:22 ` [PATCH v6 19/22] erofs: register cookie context for data blobs Jeffle Xu
2022-03-28 9:48 ` Gao Xiang
2022-03-25 12:22 ` [PATCH v6 20/22] erofs: implement fscache-based data read " Jeffle Xu
2022-03-28 9:50 ` Gao Xiang
2022-03-25 12:22 ` [PATCH v6 21/22] erofs: implement fscache-based data readahead Jeffle Xu
2022-03-28 10:55 ` Gao Xiang
2022-03-25 12:22 ` [PATCH v6 22/22] erofs: add 'tag' mount option Jeffle Xu
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=20220325122223.102958-8-jefflexu@linux.alibaba.com \
--to=jefflexu@linux.alibaba.com \
--cc=bo.liu@linux.alibaba.com \
--cc=chao@kernel.org \
--cc=dhowells@redhat.com \
--cc=eguan@linux.alibaba.com \
--cc=fannaihao@baidu.com \
--cc=gerry@linux.alibaba.com \
--cc=gregkh@linuxfoundation.org \
--cc=joseph.qi@linux.alibaba.com \
--cc=linux-cachefs@redhat.com \
--cc=linux-erofs@lists.ozlabs.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luodaowen.backend@bytedance.com \
--cc=tao.peng@linux.alibaba.com \
--cc=tianzichen@kuaishou.com \
--cc=torvalds@linux-foundation.org \
--cc=willy@infradead.org \
--cc=xiang@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®