All of lore.kernel.org
 help / color / mirror / Atom feed
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
Subject: [PATCH v5 07/22] cachefiles: document on-demand read mode
Date: Wed, 16 Mar 2022 21:17:08 +0800	[thread overview]
Message-ID: <20220316131723.111553-8-jefflexu@linux.alibaba.com> (raw)
In-Reply-To: <20220316131723.111553-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        | 176 ++++++++++++++++++
 1 file changed, 176 insertions(+)

diff --git a/Documentation/filesystems/caching/cachefiles.rst b/Documentation/filesystems/caching/cachefiles.rst
index 8bf396b76359..c8286c901eae 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,177 @@ 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
+"cread" (complete read) command::
+
+	cread <id>
+
+	* ``id`` is exactly the id field of the previous READ request.
-- 
2.27.0


WARNING: multiple messages have this Message-ID (diff)
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: gregkh@linuxfoundation.org, willy@infradead.org,
	linux-kernel@vger.kernel.org, joseph.qi@linux.alibaba.com,
	linux-fsdevel@vger.kernel.org, luodaowen.backend@bytedance.com,
	gerry@linux.alibaba.com, torvalds@linux-foundation.org
Subject: [PATCH v5 07/22] cachefiles: document on-demand read mode
Date: Wed, 16 Mar 2022 21:17:08 +0800	[thread overview]
Message-ID: <20220316131723.111553-8-jefflexu@linux.alibaba.com> (raw)
In-Reply-To: <20220316131723.111553-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        | 176 ++++++++++++++++++
 1 file changed, 176 insertions(+)

diff --git a/Documentation/filesystems/caching/cachefiles.rst b/Documentation/filesystems/caching/cachefiles.rst
index 8bf396b76359..c8286c901eae 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,177 @@ 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
+"cread" (complete read) command::
+
+	cread <id>
+
+	* ``id`` is exactly the id field of the previous READ request.
-- 
2.27.0


  parent reply	other threads:[~2022-03-16 13:18 UTC|newest]

Thread overview: 99+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-16 13:17 [PATCH v5 00/22] fscache,erofs: fscache-based on-demand read semantics Jeffle Xu
2022-03-16 13:17 ` [PATCH v5 00/22] fscache, erofs: " Jeffle Xu
2022-03-16 13:17 ` [PATCH v5 01/22] fscache: export fscache_end_operation() Jeffle Xu
2022-03-16 13:17   ` Jeffle Xu
2022-03-16 13:17 ` [PATCH v5 02/22] cachefiles: extract write routine Jeffle Xu
2022-03-16 13:17   ` Jeffle Xu
2022-03-16 13:17 ` [PATCH v5 03/22] cachefiles: introduce on-demand read mode Jeffle Xu
2022-03-16 13:17   ` Jeffle Xu
2022-03-21 13:40   ` Matthew Wilcox
2022-03-21 13:40     ` Matthew Wilcox
2022-03-21 14:08     ` JeffleXu
2022-03-21 14:08       ` JeffleXu
2022-03-21 14:26       ` Matthew Wilcox
2022-03-21 14:26         ` Matthew Wilcox
2022-03-21 15:18         ` JeffleXu
2022-03-21 15:18           ` JeffleXu
2022-03-21 15:21           ` Matthew Wilcox
2022-03-21 15:21             ` Matthew Wilcox
2022-03-21 15:30           ` David Howells
2022-03-21 15:30             ` David Howells
2022-03-22 17:04             ` Matthew Wilcox
2022-03-22 17:04               ` Matthew Wilcox
2022-03-23  5:32               ` JeffleXu
2022-03-23  5:32                 ` JeffleXu
2022-03-21 14:14   ` David Howells
2022-03-21 14:14     ` David Howells
2022-03-21 14:20     ` [Linux-cachefs] " Gao Xiang
2022-03-21 14:20       ` Gao Xiang
2022-03-16 13:17 ` [PATCH v5 04/22] cachefiles: notify user daemon with anon_fd when looking up cookie Jeffle Xu
2022-03-16 13:17   ` Jeffle Xu
2022-03-16 19:37   ` kernel test robot
2022-03-16 19:37     ` kernel test robot
2022-03-16 13:17 ` [PATCH v5 05/22] cachefiles: notify user daemon when withdrawing cookie Jeffle Xu
2022-03-16 13:17   ` Jeffle Xu
2022-03-16 13:17 ` [PATCH v5 06/22] cachefiles: implement on-demand read Jeffle Xu
2022-03-16 13:17   ` Jeffle Xu
2022-03-16 13:17 ` Jeffle Xu [this message]
2022-03-16 13:17   ` [PATCH v5 07/22] cachefiles: document on-demand read mode Jeffle Xu
2022-03-16 13:17 ` [PATCH v5 08/22] erofs: use meta buffers for erofs_read_superblock() Jeffle Xu
2022-03-16 13:17   ` Jeffle Xu
2022-03-16 13:17 ` [PATCH v5 09/22] erofs: make erofs_map_blocks() generally available Jeffle Xu
2022-03-16 13:17   ` Jeffle Xu
2022-03-17  5:35   ` [Linux-cachefs] " Gao Xiang
2022-03-17  5:35     ` Gao Xiang
2022-03-16 13:17 ` [PATCH v5 10/22] erofs: add mode checking helper Jeffle Xu
2022-03-16 13:17   ` Jeffle Xu
2022-03-17  5:36   ` [Linux-cachefs] " Gao Xiang
2022-03-17  5:36     ` Gao Xiang
2022-03-18  5:26     ` JeffleXu
2022-03-16 13:17 ` [PATCH v5 11/22] erofs: register global fscache volume Jeffle Xu
2022-03-16 13:17   ` Jeffle Xu
2022-03-16 21:52   ` kernel test robot
2022-03-16 21:52     ` kernel test robot
2022-03-17  1:49   ` kernel test robot
2022-03-17  1:49     ` kernel test robot
2022-03-16 13:17 ` [PATCH v5 12/22] erofs: add cookie context helper functions Jeffle Xu
2022-03-16 13:17   ` Jeffle Xu
2022-03-16 13:17 ` [PATCH v5 13/22] erofs: add anonymous inode managing page cache of blob file Jeffle Xu
2022-03-16 13:17   ` Jeffle Xu
2022-03-16 13:17 ` [PATCH v5 14/22] erofs: add erofs_fscache_read_pages() helper Jeffle Xu
2022-03-16 13:17   ` Jeffle Xu
2022-03-16 13:17 ` [PATCH v5 15/22] erofs: register cookie context for bootstrap blob Jeffle Xu
2022-03-16 13:17   ` Jeffle Xu
2022-03-16 13:17 ` [PATCH v5 16/22] erofs: implement fscache-based metadata read Jeffle Xu
2022-03-16 13:17   ` Jeffle Xu
2022-03-16 13:17 ` [PATCH v5 17/22] erofs: implement fscache-based data read for non-inline layout Jeffle Xu
2022-03-16 13:17   ` Jeffle Xu
2022-03-17  6:18   ` [Linux-cachefs] " Gao Xiang
2022-03-17  6:18     ` Gao Xiang
2022-03-18  5:29     ` JeffleXu
2022-03-16 13:17 ` [PATCH v5 18/22] erofs: implement fscache-based data read for inline layout Jeffle Xu
2022-03-16 13:17   ` Jeffle Xu
2022-03-16 13:17 ` [PATCH v5 19/22] erofs: register cookie context for data blobs Jeffle Xu
2022-03-16 13:17   ` Jeffle Xu
2022-03-16 13:17 ` [PATCH v5 20/22] erofs: implement fscache-based data read " Jeffle Xu
2022-03-16 13:17   ` Jeffle Xu
2022-03-16 13:17 ` [PATCH v5 21/22] erofs: implement fscache-based data readahead Jeffle Xu
2022-03-16 13:17   ` Jeffle Xu
2022-03-17  5:22   ` Gao Xiang
2022-03-17  5:22     ` Gao Xiang
2022-03-18  5:41     ` JeffleXu
2022-03-16 13:17 ` [PATCH v5 22/22] erofs: add 'uuid' mount option Jeffle Xu
2022-03-16 13:17   ` Jeffle Xu
2022-03-21 13:34 ` [PATCH v5 03/22] cachefiles: introduce on-demand read mode David Howells
2022-03-21 13:34   ` David Howells
2022-03-21 14:16   ` JeffleXu
2022-03-21 14:16     ` JeffleXu
2022-03-21 14:01 ` [PATCH v5 04/22] cachefiles: notify user daemon with anon_fd when looking up cookie David Howells
2022-03-21 14:01   ` David Howells
2022-03-21 14:43   ` JeffleXu
2022-03-21 14:43     ` JeffleXu
2022-03-21 14:05 ` [PATCH v5 06/22] cachefiles: implement on-demand read David Howells
2022-03-21 14:05   ` David Howells
2022-03-21 14:51   ` JeffleXu
2022-03-21 14:51     ` JeffleXu
2022-03-21 14:20 ` [PATCH v5 05/22] cachefiles: notify user daemon when withdrawing cookie David Howells
2022-03-21 14:20   ` David Howells
2022-03-21 14:31   ` JeffleXu
2022-03-21 14:31     ` JeffleXu

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=20220316131723.111553-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=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=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 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.