public inbox for linux-xfs@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v1 0/3] xfsprogs: Add support for preadv2() and RWF_DONTCACHE
@ 2025-03-04 11:55 Ritesh Harjani (IBM)
  2025-03-04 11:55 ` [PATCH v1 1/3] configure: xfs_io: Add support for preadv2 Ritesh Harjani (IBM)
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Ritesh Harjani (IBM) @ 2025-03-04 11:55 UTC (permalink / raw)
  To: linux-xfs
  Cc: linux-fsdevel, Jens Axboe, Darrick J . Wong, Ritesh Harjani (IBM)

- adds support for preadv2().
- adds support for RWF_DONTCACHE to preadv2() and pwritev2() calls in xfs_io.

Ritesh Harjani (IBM) (3):
  configure: xfs_io: Add support for preadv2
  xfs_io: Add RWF_DONTCACHE support to pwritev2
  xfs_io: Add RWF_DONTCACHE support to preadv2

 configure.ac          |  1 +
 include/builddefs.in  |  1 +
 include/linux.h       |  5 ++++
 io/Makefile           |  4 +++
 io/pread.c            | 57 ++++++++++++++++++++++++++++++-------------
 io/pwrite.c           |  8 ++++--
 m4/package_libcdev.m4 | 18 ++++++++++++++
 man/man8/xfs_io.8     | 16 ++++++++++--
 8 files changed, 89 insertions(+), 21 deletions(-)

--
2.48.1


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v1 1/3] configure: xfs_io: Add support for preadv2
  2025-03-04 11:55 [PATCH v1 0/3] xfsprogs: Add support for preadv2() and RWF_DONTCACHE Ritesh Harjani (IBM)
@ 2025-03-04 11:55 ` Ritesh Harjani (IBM)
  2025-03-04 17:52   ` Darrick J. Wong
  2025-03-04 11:55 ` [PATCH v1 2/3] xfs_io: Add RWF_DONTCACHE support to pwritev2 Ritesh Harjani (IBM)
  2025-03-04 11:55 ` [PATCH v1 3/3] xfs_io: Add RWF_DONTCACHE support to preadv2 Ritesh Harjani (IBM)
  2 siblings, 1 reply; 8+ messages in thread
From: Ritesh Harjani (IBM) @ 2025-03-04 11:55 UTC (permalink / raw)
  To: linux-xfs
  Cc: linux-fsdevel, Jens Axboe, Darrick J . Wong, Ritesh Harjani (IBM)

preadv2() was introduced in Linux 4.6. This patch adds support for
preadv2() to xfs_io.

Signed-off-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
---
 configure.ac          |  1 +
 include/builddefs.in  |  1 +
 io/Makefile           |  4 ++++
 io/pread.c            | 45 ++++++++++++++++++++++++++++---------------
 m4/package_libcdev.m4 | 18 +++++++++++++++++
 5 files changed, 54 insertions(+), 15 deletions(-)

diff --git a/configure.ac b/configure.ac
index 8c76f398..658117ad 100644
--- a/configure.ac
+++ b/configure.ac
@@ -153,6 +153,7 @@ AC_PACKAGE_NEED_URCU_H
 AC_PACKAGE_NEED_RCU_INIT
 
 AC_HAVE_PWRITEV2
+AC_HAVE_PREADV2
 AC_HAVE_COPY_FILE_RANGE
 AC_NEED_INTERNAL_FSXATTR
 AC_NEED_INTERNAL_FSCRYPT_ADD_KEY_ARG
diff --git a/include/builddefs.in b/include/builddefs.in
index 82840ec7..a11d201c 100644
--- a/include/builddefs.in
+++ b/include/builddefs.in
@@ -94,6 +94,7 @@ ENABLE_SCRUB	= @enable_scrub@
 HAVE_ZIPPED_MANPAGES = @have_zipped_manpages@
 
 HAVE_PWRITEV2 = @have_pwritev2@
+HAVE_PREADV2 = @have_preadv2@
 HAVE_COPY_FILE_RANGE = @have_copy_file_range@
 NEED_INTERNAL_FSXATTR = @need_internal_fsxattr@
 NEED_INTERNAL_FSCRYPT_ADD_KEY_ARG = @need_internal_fscrypt_add_key_arg@
diff --git a/io/Makefile b/io/Makefile
index 8f835ec7..f8b19ac5 100644
--- a/io/Makefile
+++ b/io/Makefile
@@ -69,6 +69,10 @@ ifeq ($(HAVE_PWRITEV2),yes)
 LCFLAGS += -DHAVE_PWRITEV2
 endif
 
+ifeq ($(HAVE_PREADV2),yes)
+LCFLAGS += -DHAVE_PREADV2
+endif
+
 ifeq ($(HAVE_MAP_SYNC),yes)
 LCFLAGS += -DHAVE_MAP_SYNC
 endif
diff --git a/io/pread.c b/io/pread.c
index 62c771fb..782f2a36 100644
--- a/io/pread.c
+++ b/io/pread.c
@@ -162,7 +162,8 @@ static ssize_t
 do_preadv(
 	int		fd,
 	off_t		offset,
-	long long	count)
+	long long	count,
+	int 		preadv2_flags)
 {
 	int		vecs = 0;
 	ssize_t		oldlen = 0;
@@ -181,8 +182,14 @@ do_preadv(
 	} else {
 		vecs = vectors;
 	}
+#ifdef HAVE_PREADV2
+	if (preadv2_flags)
+		bytes = preadv2(fd, iov, vectors, offset, preadv2_flags);
+	else
+		bytes = preadv(fd, iov, vectors, offset);
+#else
 	bytes = preadv(fd, iov, vectors, offset);
-
+#endif
 	/* restore trimmed iov */
 	if (oldlen)
 		iov[vecs - 1].iov_len = oldlen;
@@ -195,12 +202,13 @@ do_pread(
 	int		fd,
 	off_t		offset,
 	long long	count,
-	size_t		buffer_size)
+	size_t		buffer_size,
+	int 		preadv2_flags)
 {
 	if (!vectors)
 		return pread(fd, io_buffer, min(count, buffer_size), offset);
 
-	return do_preadv(fd, offset, count);
+	return do_preadv(fd, offset, count, preadv2_flags);
 }
 
 static int
@@ -210,7 +218,8 @@ read_random(
 	long long	count,
 	long long	*total,
 	unsigned int	seed,
-	int		eof)
+	int		eof,
+	int 	preadv2_flags)
 {
 	off_t		end, off, range;
 	ssize_t		bytes;
@@ -234,7 +243,7 @@ read_random(
 				io_buffersize;
 		else
 			off = offset;
-		bytes = do_pread(fd, off, io_buffersize, io_buffersize);
+		bytes = do_pread(fd, off, io_buffersize, io_buffersize, preadv2_flags);
 		if (bytes == 0)
 			break;
 		if (bytes < 0) {
@@ -256,7 +265,8 @@ read_backward(
 	off_t		*offset,
 	long long	*count,
 	long long	*total,
-	int		eof)
+	int		eof,
+	int 	preadv2_flags)
 {
 	off_t		end, off = *offset;
 	ssize_t		bytes = 0, bytes_requested;
@@ -276,7 +286,7 @@ read_backward(
 	/* Do initial unaligned read if needed */
 	if ((bytes_requested = (off % io_buffersize))) {
 		off -= bytes_requested;
-		bytes = do_pread(fd, off, bytes_requested, io_buffersize);
+		bytes = do_pread(fd, off, bytes_requested, io_buffersize, preadv2_flags);
 		if (bytes == 0)
 			return ops;
 		if (bytes < 0) {
@@ -294,7 +304,7 @@ read_backward(
 	while (cnt > end) {
 		bytes_requested = min(cnt, io_buffersize);
 		off -= bytes_requested;
-		bytes = do_pread(fd, off, cnt, io_buffersize);
+		bytes = do_pread(fd, off, cnt, io_buffersize, preadv2_flags);
 		if (bytes == 0)
 			break;
 		if (bytes < 0) {
@@ -318,14 +328,15 @@ read_forward(
 	long long	*total,
 	int		verbose,
 	int		onlyone,
-	int		eof)
+	int		eof,
+	int 	preadv2_flags)
 {
 	ssize_t		bytes;
 	int		ops = 0;
 
 	*total = 0;
 	while (count > 0 || eof) {
-		bytes = do_pread(fd, offset, count, io_buffersize);
+		bytes = do_pread(fd, offset, count, io_buffersize, preadv2_flags);
 		if (bytes == 0)
 			break;
 		if (bytes < 0) {
@@ -353,7 +364,7 @@ read_buffer(
 	int		verbose,
 	int		onlyone)
 {
-	return read_forward(fd, offset, count, total, verbose, onlyone, 0);
+	return read_forward(fd, offset, count, total, verbose, onlyone, 0, 0);
 }
 
 static int
@@ -371,6 +382,7 @@ pread_f(
 	int		Cflag, qflag, uflag, vflag;
 	int		eof = 0, direction = IO_FORWARD;
 	int		c;
+	int 	preadv2_flags = 0;
 
 	Cflag = qflag = uflag = vflag = 0;
 	init_cvtnum(&fsblocksize, &fssectsize);
@@ -463,15 +475,18 @@ pread_f(
 	case IO_RANDOM:
 		if (!zeed)	/* srandom seed */
 			zeed = time(NULL);
-		c = read_random(file->fd, offset, count, &total, zeed, eof);
+		c = read_random(file->fd, offset, count, &total, zeed, eof,
+						preadv2_flags);
 		break;
 	case IO_FORWARD:
-		c = read_forward(file->fd, offset, count, &total, vflag, 0, eof);
+		c = read_forward(file->fd, offset, count, &total, vflag, 0, eof,
+						 preadv2_flags);
 		if (eof)
 			count = total;
 		break;
 	case IO_BACKWARD:
-		c = read_backward(file->fd, &offset, &count, &total, eof);
+		c = read_backward(file->fd, &offset, &count, &total, eof,
+						  preadv2_flags);
 		break;
 	default:
 		ASSERT(0);
diff --git a/m4/package_libcdev.m4 b/m4/package_libcdev.m4
index 4ef7e8f6..5a1f748a 100644
--- a/m4/package_libcdev.m4
+++ b/m4/package_libcdev.m4
@@ -16,6 +16,24 @@ pwritev2(0, 0, 0, 0, 0);
     AC_SUBST(have_pwritev2)
   ])
 
+#
+# Check if we have a preadv2 libc call (Linux)
+#
+AC_DEFUN([AC_HAVE_PREADV2],
+  [ AC_MSG_CHECKING([for preadv2])
+    AC_LINK_IFELSE(
+    [	AC_LANG_PROGRAM([[
+#define _GNU_SOURCE
+#include <sys/uio.h>
+	]], [[
+preadv2(0, 0, 0, 0, 0);
+	]])
+    ], have_preadv2=yes
+       AC_MSG_RESULT(yes),
+       AC_MSG_RESULT(no))
+    AC_SUBST(have_preadv2)
+  ])
+
 #
 # Check if we have a copy_file_range system call (Linux)
 #
-- 
2.48.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v1 2/3] xfs_io: Add RWF_DONTCACHE support to pwritev2
  2025-03-04 11:55 [PATCH v1 0/3] xfsprogs: Add support for preadv2() and RWF_DONTCACHE Ritesh Harjani (IBM)
  2025-03-04 11:55 ` [PATCH v1 1/3] configure: xfs_io: Add support for preadv2 Ritesh Harjani (IBM)
@ 2025-03-04 11:55 ` Ritesh Harjani (IBM)
  2025-03-04 11:55 ` [PATCH v1 3/3] xfs_io: Add RWF_DONTCACHE support to preadv2 Ritesh Harjani (IBM)
  2 siblings, 0 replies; 8+ messages in thread
From: Ritesh Harjani (IBM) @ 2025-03-04 11:55 UTC (permalink / raw)
  To: linux-xfs
  Cc: linux-fsdevel, Jens Axboe, Darrick J . Wong, Ritesh Harjani (IBM)

Add per-io RWF_DONTCACHE support flag to pwritev2().
This enables xfs_io to perform buffered-io which can drop the page
cache folios after writing.

e.g. xfs_io -fc "pwrite -U -V 1 0 16K" /mnt/f1

Signed-off-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
---
 include/linux.h   | 5 +++++
 io/pwrite.c       | 8 ++++++--
 man/man8/xfs_io.8 | 8 +++++++-
 3 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/include/linux.h b/include/linux.h
index b3516d54..6e83e073 100644
--- a/include/linux.h
+++ b/include/linux.h
@@ -237,6 +237,11 @@ struct fsxattr {
 #define RWF_ATOMIC	((__kernel_rwf_t)0x00000040)
 #endif
 
+/* buffered IO that drops the cache after reading or writing data */
+#ifndef RWF_DONTCACHE
+#define RWF_DONTCACHE	((__kernel_rwf_t)0x00000080)
+#endif
+
 /*
  * Reminder: anything added to this file will be compiled into downstream
  * userspace projects!
diff --git a/io/pwrite.c b/io/pwrite.c
index fab59be4..db335e91 100644
--- a/io/pwrite.c
+++ b/io/pwrite.c
@@ -45,6 +45,7 @@ pwrite_help(void)
 " -N   -- Perform the pwritev2() with RWF_NOWAIT\n"
 " -D   -- Perform the pwritev2() with RWF_DSYNC\n"
 " -A   -- Perform the pwritev2() with RWF_ATOMIC\n"
+" -U   -- Perform the pwritev2() with Uncached/RWF_DONTCACHE\n"
 #endif
 "\n"));
 }
@@ -285,7 +286,7 @@ pwrite_f(
 	init_cvtnum(&fsblocksize, &fssectsize);
 	bsize = fsblocksize;
 
-	while ((c = getopt(argc, argv, "Ab:BCdDf:Fi:NqRs:OS:uV:wWZ:")) != EOF) {
+	while ((c = getopt(argc, argv, "Ab:BCdDf:Fi:NqRs:OS:uUV:wWZ:")) != EOF) {
 		switch (c) {
 		case 'b':
 			tmp = cvtnum(fsblocksize, fssectsize, optarg);
@@ -328,6 +329,9 @@ pwrite_f(
 		case 'A':
 			pwritev2_flags |= RWF_ATOMIC;
 			break;
+		case 'U':
+			pwritev2_flags |= RWF_DONTCACHE;
+			break;
 #endif
 		case 's':
 			skip = cvtnum(fsblocksize, fssectsize, optarg);
@@ -480,7 +484,7 @@ pwrite_init(void)
 	pwrite_cmd.argmax = -1;
 	pwrite_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK;
 	pwrite_cmd.args =
-_("[-i infile [-qAdDwNOW] [-s skip]] [-b bs] [-S seed] [-FBR [-Z N]] [-V N] off len");
+_("[-i infile [-qAdDwNOUW] [-s skip]] [-b bs] [-S seed] [-FBR [-Z N]] [-V N] off len");
 	pwrite_cmd.oneline =
 		_("writes a number of bytes at a specified offset");
 	pwrite_cmd.help = pwrite_help;
diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8
index 59d5ddc5..47af5232 100644
--- a/man/man8/xfs_io.8
+++ b/man/man8/xfs_io.8
@@ -244,7 +244,7 @@ See the
 .B pread
 command.
 .TP
-.BI "pwrite [ \-i " file " ] [ \-qAdDwNOW ] [ \-s " skip " ] [ \-b " size " ] [ \-S " seed " ] [ \-FBR [ \-Z " zeed " ] ] [ \-V " vectors " ] " "offset length"
+.BI "pwrite [ \-i " file " ] [ \-qAdDwNOUW ] [ \-s " skip " ] [ \-b " size " ] [ \-S " seed " ] [ \-FBR [ \-Z " zeed " ] ] [ \-V " vectors " ] " "offset length"
 Writes a range of bytes in a specified blocksize from the given
 .IR offset .
 The bytes written can be either a set pattern or read in from another
@@ -287,6 +287,12 @@ Perform the
 call with
 .IR RWF_ATOMIC .
 .TP
+.B \-U
+Perform the
+.BR pwritev2 (2)
+call with
+.IR RWF_DONTCACHE .
+.TP
 .B \-O
 perform pwrite once and return the (maybe partial) bytes written.
 .TP
-- 
2.48.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v1 3/3] xfs_io: Add RWF_DONTCACHE support to preadv2
  2025-03-04 11:55 [PATCH v1 0/3] xfsprogs: Add support for preadv2() and RWF_DONTCACHE Ritesh Harjani (IBM)
  2025-03-04 11:55 ` [PATCH v1 1/3] configure: xfs_io: Add support for preadv2 Ritesh Harjani (IBM)
  2025-03-04 11:55 ` [PATCH v1 2/3] xfs_io: Add RWF_DONTCACHE support to pwritev2 Ritesh Harjani (IBM)
@ 2025-03-04 11:55 ` Ritesh Harjani (IBM)
  2025-03-04 17:53   ` Darrick J. Wong
  2 siblings, 1 reply; 8+ messages in thread
From: Ritesh Harjani (IBM) @ 2025-03-04 11:55 UTC (permalink / raw)
  To: linux-xfs
  Cc: linux-fsdevel, Jens Axboe, Darrick J . Wong, Ritesh Harjani (IBM)

Add per-io RWF_DONTCACHE support flag to preadv2()
This enables xfs_io to perform buffered-io read which can drop the page
cache folios after reading.

	e.g. xfs_io -c "pread -U -V 1 0 16K" /mnt/f1

Signed-off-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
---
 io/pread.c        | 12 ++++++++++--
 man/man8/xfs_io.8 |  8 +++++++-
 2 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/io/pread.c b/io/pread.c
index 782f2a36..64c28784 100644
--- a/io/pread.c
+++ b/io/pread.c
@@ -38,6 +38,9 @@ pread_help(void)
 " -Z N -- zeed the random number generator (used when reading randomly)\n"
 "         (heh, zorry, the -s/-S arguments were already in use in pwrite)\n"
 " -V N -- use vectored IO with N iovecs of blocksize each (preadv)\n"
+#ifdef HAVE_PWRITEV2
+" -U   -- Perform the preadv2() with Uncached/RWF_DONTCACHE\n"
+#endif
 "\n"
 " When in \"random\" mode, the number of read operations will equal the\n"
 " number required to do a complete forward/backward scan of the range.\n"
@@ -388,7 +391,7 @@ pread_f(
 	init_cvtnum(&fsblocksize, &fssectsize);
 	bsize = fsblocksize;
 
-	while ((c = getopt(argc, argv, "b:BCFRquvV:Z:")) != EOF) {
+	while ((c = getopt(argc, argv, "b:BCFRquUvV:Z:")) != EOF) {
 		switch (c) {
 		case 'b':
 			tmp = cvtnum(fsblocksize, fssectsize, optarg);
@@ -417,6 +420,11 @@ pread_f(
 		case 'u':
 			uflag = 1;
 			break;
+#ifdef HAVE_PREADV2
+		case 'U':
+			preadv2_flags |= RWF_DONTCACHE;
+			break;
+#endif
 		case 'v':
 			vflag = 1;
 			break;
@@ -514,7 +522,7 @@ pread_init(void)
 	pread_cmd.argmin = 2;
 	pread_cmd.argmax = -1;
 	pread_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK;
-	pread_cmd.args = _("[-b bs] [-qv] [-i N] [-FBR [-Z N]] off len");
+	pread_cmd.args = _("[-b bs] [-qUv] [-i N] [-FBR [-Z N]] off len");
 	pread_cmd.oneline = _("reads a number of bytes at a specified offset");
 	pread_cmd.help = pread_help;
 
diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8
index 47af5232..df508054 100644
--- a/man/man8/xfs_io.8
+++ b/man/man8/xfs_io.8
@@ -200,7 +200,7 @@ option will set the file permissions to read-write (0644). This allows xfs_io to
 set up mismatches between the file permissions and the open file descriptor
 read/write mode to exercise permission checks inside various syscalls.
 .TP
-.BI "pread [ \-b " bsize " ] [ \-qv ] [ \-FBR [ \-Z " seed " ] ] [ \-V " vectors " ] " "offset length"
+.BI "pread [ \-b " bsize " ] [ \-qUv ] [ \-FBR [ \-Z " seed " ] ] [ \-V " vectors " ] " "offset length"
 Reads a range of bytes in a specified blocksize from the given
 .IR offset .
 .RS 1.0i
@@ -214,6 +214,12 @@ requests will be split. The default blocksize is 4096 bytes.
 .B \-q
 quiet mode, do not write anything to standard output.
 .TP
+.B \-U
+Perform the
+.BR preadv2 (2)
+call with
+.IR RWF_DONTCACHE .
+.TP
 .B \-v
 dump the contents of the buffer after reading,
 by default only the count of bytes actually read is dumped.
-- 
2.48.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v1 1/3] configure: xfs_io: Add support for preadv2
  2025-03-04 11:55 ` [PATCH v1 1/3] configure: xfs_io: Add support for preadv2 Ritesh Harjani (IBM)
@ 2025-03-04 17:52   ` Darrick J. Wong
  2025-03-05  1:06     ` Ritesh Harjani
  0 siblings, 1 reply; 8+ messages in thread
From: Darrick J. Wong @ 2025-03-04 17:52 UTC (permalink / raw)
  To: Ritesh Harjani (IBM); +Cc: linux-xfs, linux-fsdevel, Jens Axboe

On Tue, Mar 04, 2025 at 05:25:35PM +0530, Ritesh Harjani (IBM) wrote:
> preadv2() was introduced in Linux 4.6. This patch adds support for
> preadv2() to xfs_io.
> 
> Signed-off-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
> ---
>  configure.ac          |  1 +
>  include/builddefs.in  |  1 +
>  io/Makefile           |  4 ++++
>  io/pread.c            | 45 ++++++++++++++++++++++++++++---------------
>  m4/package_libcdev.m4 | 18 +++++++++++++++++
>  5 files changed, 54 insertions(+), 15 deletions(-)
> 
> diff --git a/configure.ac b/configure.ac
> index 8c76f398..658117ad 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -153,6 +153,7 @@ AC_PACKAGE_NEED_URCU_H
>  AC_PACKAGE_NEED_RCU_INIT
>  
>  AC_HAVE_PWRITEV2
> +AC_HAVE_PREADV2

I wonder, will we ever encounter a C library that has pwritev2 and /not/
preadv2?

>  AC_HAVE_COPY_FILE_RANGE
>  AC_NEED_INTERNAL_FSXATTR
>  AC_NEED_INTERNAL_FSCRYPT_ADD_KEY_ARG
> diff --git a/include/builddefs.in b/include/builddefs.in
> index 82840ec7..a11d201c 100644
> --- a/include/builddefs.in
> +++ b/include/builddefs.in
> @@ -94,6 +94,7 @@ ENABLE_SCRUB	= @enable_scrub@
>  HAVE_ZIPPED_MANPAGES = @have_zipped_manpages@
>  
>  HAVE_PWRITEV2 = @have_pwritev2@
> +HAVE_PREADV2 = @have_preadv2@
>  HAVE_COPY_FILE_RANGE = @have_copy_file_range@
>  NEED_INTERNAL_FSXATTR = @need_internal_fsxattr@
>  NEED_INTERNAL_FSCRYPT_ADD_KEY_ARG = @need_internal_fscrypt_add_key_arg@
> diff --git a/io/Makefile b/io/Makefile
> index 8f835ec7..f8b19ac5 100644
> --- a/io/Makefile
> +++ b/io/Makefile
> @@ -69,6 +69,10 @@ ifeq ($(HAVE_PWRITEV2),yes)
>  LCFLAGS += -DHAVE_PWRITEV2
>  endif
>  
> +ifeq ($(HAVE_PREADV2),yes)
> +LCFLAGS += -DHAVE_PREADV2
> +endif
> +
>  ifeq ($(HAVE_MAP_SYNC),yes)
>  LCFLAGS += -DHAVE_MAP_SYNC
>  endif
> diff --git a/io/pread.c b/io/pread.c
> index 62c771fb..782f2a36 100644
> --- a/io/pread.c
> +++ b/io/pread.c
> @@ -162,7 +162,8 @@ static ssize_t
>  do_preadv(
>  	int		fd,
>  	off_t		offset,
> -	long long	count)
> +	long long	count,
> +	int 		preadv2_flags)

Nit:       ^ space before tab.  There's a bunch more of thense, every
time a "preadv2_flags" variable or parameter are declared.

>  {
>  	int		vecs = 0;
>  	ssize_t		oldlen = 0;
> @@ -181,8 +182,14 @@ do_preadv(
>  	} else {
>  		vecs = vectors;
>  	}
> +#ifdef HAVE_PREADV2
> +	if (preadv2_flags)
> +		bytes = preadv2(fd, iov, vectors, offset, preadv2_flags);
> +	else
> +		bytes = preadv(fd, iov, vectors, offset);
> +#else
>  	bytes = preadv(fd, iov, vectors, offset);
> -
> +#endif

Can we have the case that preadv2_flags!=0 and HAVE_PREADV2 isn't
defined?  If so, then there ought to be a warning about that.

--D

>  	/* restore trimmed iov */
>  	if (oldlen)
>  		iov[vecs - 1].iov_len = oldlen;
> @@ -195,12 +202,13 @@ do_pread(
>  	int		fd,
>  	off_t		offset,
>  	long long	count,
> -	size_t		buffer_size)
> +	size_t		buffer_size,
> +	int 		preadv2_flags)
>  {
>  	if (!vectors)
>  		return pread(fd, io_buffer, min(count, buffer_size), offset);
>  
> -	return do_preadv(fd, offset, count);
> +	return do_preadv(fd, offset, count, preadv2_flags);
>  }
>  
>  static int
> @@ -210,7 +218,8 @@ read_random(
>  	long long	count,
>  	long long	*total,
>  	unsigned int	seed,
> -	int		eof)
> +	int		eof,
> +	int 	preadv2_flags)
>  {
>  	off_t		end, off, range;
>  	ssize_t		bytes;
> @@ -234,7 +243,7 @@ read_random(
>  				io_buffersize;
>  		else
>  			off = offset;
> -		bytes = do_pread(fd, off, io_buffersize, io_buffersize);
> +		bytes = do_pread(fd, off, io_buffersize, io_buffersize, preadv2_flags);
>  		if (bytes == 0)
>  			break;
>  		if (bytes < 0) {
> @@ -256,7 +265,8 @@ read_backward(
>  	off_t		*offset,
>  	long long	*count,
>  	long long	*total,
> -	int		eof)
> +	int		eof,
> +	int 	preadv2_flags)
>  {
>  	off_t		end, off = *offset;
>  	ssize_t		bytes = 0, bytes_requested;
> @@ -276,7 +286,7 @@ read_backward(
>  	/* Do initial unaligned read if needed */
>  	if ((bytes_requested = (off % io_buffersize))) {
>  		off -= bytes_requested;
> -		bytes = do_pread(fd, off, bytes_requested, io_buffersize);
> +		bytes = do_pread(fd, off, bytes_requested, io_buffersize, preadv2_flags);
>  		if (bytes == 0)
>  			return ops;
>  		if (bytes < 0) {
> @@ -294,7 +304,7 @@ read_backward(
>  	while (cnt > end) {
>  		bytes_requested = min(cnt, io_buffersize);
>  		off -= bytes_requested;
> -		bytes = do_pread(fd, off, cnt, io_buffersize);
> +		bytes = do_pread(fd, off, cnt, io_buffersize, preadv2_flags);
>  		if (bytes == 0)
>  			break;
>  		if (bytes < 0) {
> @@ -318,14 +328,15 @@ read_forward(
>  	long long	*total,
>  	int		verbose,
>  	int		onlyone,
> -	int		eof)
> +	int		eof,
> +	int 	preadv2_flags)
>  {
>  	ssize_t		bytes;
>  	int		ops = 0;
>  
>  	*total = 0;
>  	while (count > 0 || eof) {
> -		bytes = do_pread(fd, offset, count, io_buffersize);
> +		bytes = do_pread(fd, offset, count, io_buffersize, preadv2_flags);
>  		if (bytes == 0)
>  			break;
>  		if (bytes < 0) {
> @@ -353,7 +364,7 @@ read_buffer(
>  	int		verbose,
>  	int		onlyone)
>  {
> -	return read_forward(fd, offset, count, total, verbose, onlyone, 0);
> +	return read_forward(fd, offset, count, total, verbose, onlyone, 0, 0);
>  }
>  
>  static int
> @@ -371,6 +382,7 @@ pread_f(
>  	int		Cflag, qflag, uflag, vflag;
>  	int		eof = 0, direction = IO_FORWARD;
>  	int		c;
> +	int 	preadv2_flags = 0;
>  
>  	Cflag = qflag = uflag = vflag = 0;
>  	init_cvtnum(&fsblocksize, &fssectsize);
> @@ -463,15 +475,18 @@ pread_f(
>  	case IO_RANDOM:
>  		if (!zeed)	/* srandom seed */
>  			zeed = time(NULL);
> -		c = read_random(file->fd, offset, count, &total, zeed, eof);
> +		c = read_random(file->fd, offset, count, &total, zeed, eof,
> +						preadv2_flags);
>  		break;
>  	case IO_FORWARD:
> -		c = read_forward(file->fd, offset, count, &total, vflag, 0, eof);
> +		c = read_forward(file->fd, offset, count, &total, vflag, 0, eof,
> +						 preadv2_flags);
>  		if (eof)
>  			count = total;
>  		break;
>  	case IO_BACKWARD:
> -		c = read_backward(file->fd, &offset, &count, &total, eof);
> +		c = read_backward(file->fd, &offset, &count, &total, eof,
> +						  preadv2_flags);
>  		break;
>  	default:
>  		ASSERT(0);
> diff --git a/m4/package_libcdev.m4 b/m4/package_libcdev.m4
> index 4ef7e8f6..5a1f748a 100644
> --- a/m4/package_libcdev.m4
> +++ b/m4/package_libcdev.m4
> @@ -16,6 +16,24 @@ pwritev2(0, 0, 0, 0, 0);
>      AC_SUBST(have_pwritev2)
>    ])
>  
> +#
> +# Check if we have a preadv2 libc call (Linux)
> +#
> +AC_DEFUN([AC_HAVE_PREADV2],
> +  [ AC_MSG_CHECKING([for preadv2])
> +    AC_LINK_IFELSE(
> +    [	AC_LANG_PROGRAM([[
> +#define _GNU_SOURCE
> +#include <sys/uio.h>
> +	]], [[
> +preadv2(0, 0, 0, 0, 0);
> +	]])
> +    ], have_preadv2=yes
> +       AC_MSG_RESULT(yes),
> +       AC_MSG_RESULT(no))
> +    AC_SUBST(have_preadv2)
> +  ])
> +
>  #
>  # Check if we have a copy_file_range system call (Linux)
>  #
> -- 
> 2.48.1
> 
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v1 3/3] xfs_io: Add RWF_DONTCACHE support to preadv2
  2025-03-04 11:55 ` [PATCH v1 3/3] xfs_io: Add RWF_DONTCACHE support to preadv2 Ritesh Harjani (IBM)
@ 2025-03-04 17:53   ` Darrick J. Wong
  2025-03-05  1:30     ` Ritesh Harjani
  0 siblings, 1 reply; 8+ messages in thread
From: Darrick J. Wong @ 2025-03-04 17:53 UTC (permalink / raw)
  To: Ritesh Harjani (IBM); +Cc: linux-xfs, linux-fsdevel, Jens Axboe

On Tue, Mar 04, 2025 at 05:25:37PM +0530, Ritesh Harjani (IBM) wrote:
> Add per-io RWF_DONTCACHE support flag to preadv2()
> This enables xfs_io to perform buffered-io read which can drop the page
> cache folios after reading.
> 
> 	e.g. xfs_io -c "pread -U -V 1 0 16K" /mnt/f1
> 
> Signed-off-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
> ---
>  io/pread.c        | 12 ++++++++++--
>  man/man8/xfs_io.8 |  8 +++++++-
>  2 files changed, 17 insertions(+), 3 deletions(-)
> 
> diff --git a/io/pread.c b/io/pread.c
> index 782f2a36..64c28784 100644
> --- a/io/pread.c
> +++ b/io/pread.c
> @@ -38,6 +38,9 @@ pread_help(void)
>  " -Z N -- zeed the random number generator (used when reading randomly)\n"
>  "         (heh, zorry, the -s/-S arguments were already in use in pwrite)\n"
>  " -V N -- use vectored IO with N iovecs of blocksize each (preadv)\n"
> +#ifdef HAVE_PWRITEV2

HAVE_PREADV2?

--D

> +" -U   -- Perform the preadv2() with Uncached/RWF_DONTCACHE\n"
> +#endif
>  "\n"
>  " When in \"random\" mode, the number of read operations will equal the\n"
>  " number required to do a complete forward/backward scan of the range.\n"
> @@ -388,7 +391,7 @@ pread_f(
>  	init_cvtnum(&fsblocksize, &fssectsize);
>  	bsize = fsblocksize;
>  
> -	while ((c = getopt(argc, argv, "b:BCFRquvV:Z:")) != EOF) {
> +	while ((c = getopt(argc, argv, "b:BCFRquUvV:Z:")) != EOF) {
>  		switch (c) {
>  		case 'b':
>  			tmp = cvtnum(fsblocksize, fssectsize, optarg);
> @@ -417,6 +420,11 @@ pread_f(
>  		case 'u':
>  			uflag = 1;
>  			break;
> +#ifdef HAVE_PREADV2
> +		case 'U':
> +			preadv2_flags |= RWF_DONTCACHE;
> +			break;
> +#endif
>  		case 'v':
>  			vflag = 1;
>  			break;
> @@ -514,7 +522,7 @@ pread_init(void)
>  	pread_cmd.argmin = 2;
>  	pread_cmd.argmax = -1;
>  	pread_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK;
> -	pread_cmd.args = _("[-b bs] [-qv] [-i N] [-FBR [-Z N]] off len");
> +	pread_cmd.args = _("[-b bs] [-qUv] [-i N] [-FBR [-Z N]] off len");
>  	pread_cmd.oneline = _("reads a number of bytes at a specified offset");
>  	pread_cmd.help = pread_help;
>  
> diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8
> index 47af5232..df508054 100644
> --- a/man/man8/xfs_io.8
> +++ b/man/man8/xfs_io.8
> @@ -200,7 +200,7 @@ option will set the file permissions to read-write (0644). This allows xfs_io to
>  set up mismatches between the file permissions and the open file descriptor
>  read/write mode to exercise permission checks inside various syscalls.
>  .TP
> -.BI "pread [ \-b " bsize " ] [ \-qv ] [ \-FBR [ \-Z " seed " ] ] [ \-V " vectors " ] " "offset length"
> +.BI "pread [ \-b " bsize " ] [ \-qUv ] [ \-FBR [ \-Z " seed " ] ] [ \-V " vectors " ] " "offset length"
>  Reads a range of bytes in a specified blocksize from the given
>  .IR offset .
>  .RS 1.0i
> @@ -214,6 +214,12 @@ requests will be split. The default blocksize is 4096 bytes.
>  .B \-q
>  quiet mode, do not write anything to standard output.
>  .TP
> +.B \-U
> +Perform the
> +.BR preadv2 (2)
> +call with
> +.IR RWF_DONTCACHE .
> +.TP
>  .B \-v
>  dump the contents of the buffer after reading,
>  by default only the count of bytes actually read is dumped.
> -- 
> 2.48.1
> 
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v1 1/3] configure: xfs_io: Add support for preadv2
  2025-03-04 17:52   ` Darrick J. Wong
@ 2025-03-05  1:06     ` Ritesh Harjani
  0 siblings, 0 replies; 8+ messages in thread
From: Ritesh Harjani @ 2025-03-05  1:06 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: linux-xfs, linux-fsdevel, Jens Axboe

"Darrick J. Wong" <djwong@kernel.org> writes:

> On Tue, Mar 04, 2025 at 05:25:35PM +0530, Ritesh Harjani (IBM) wrote:
>> preadv2() was introduced in Linux 4.6. This patch adds support for
>> preadv2() to xfs_io.
>> 
>> Signed-off-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
>> ---
>>  configure.ac          |  1 +
>>  include/builddefs.in  |  1 +
>>  io/Makefile           |  4 ++++
>>  io/pread.c            | 45 ++++++++++++++++++++++++++++---------------
>>  m4/package_libcdev.m4 | 18 +++++++++++++++++
>>  5 files changed, 54 insertions(+), 15 deletions(-)
>> 
>> diff --git a/configure.ac b/configure.ac
>> index 8c76f398..658117ad 100644
>> --- a/configure.ac
>> +++ b/configure.ac
>> @@ -153,6 +153,7 @@ AC_PACKAGE_NEED_URCU_H
>>  AC_PACKAGE_NEED_RCU_INIT
>>  
>>  AC_HAVE_PWRITEV2
>> +AC_HAVE_PREADV2
>
> I wonder, will we ever encounter a C library that has pwritev2 and /not/
> preadv2?
>

Sure make sense. I will use Makefile to detect if we have support of
HAVE_PWRITEV2 to also define HAVE_PREADV2 (instead of using autoconf).


>>  AC_HAVE_COPY_FILE_RANGE
>>  AC_NEED_INTERNAL_FSXATTR
>>  AC_NEED_INTERNAL_FSCRYPT_ADD_KEY_ARG
>> diff --git a/include/builddefs.in b/include/builddefs.in
>> index 82840ec7..a11d201c 100644
>> --- a/include/builddefs.in
>> +++ b/include/builddefs.in
>> @@ -94,6 +94,7 @@ ENABLE_SCRUB	= @enable_scrub@
>>  HAVE_ZIPPED_MANPAGES = @have_zipped_manpages@
>>  
>>  HAVE_PWRITEV2 = @have_pwritev2@
>> +HAVE_PREADV2 = @have_preadv2@
>>  HAVE_COPY_FILE_RANGE = @have_copy_file_range@
>>  NEED_INTERNAL_FSXATTR = @need_internal_fsxattr@
>>  NEED_INTERNAL_FSCRYPT_ADD_KEY_ARG = @need_internal_fscrypt_add_key_arg@
>> diff --git a/io/Makefile b/io/Makefile
>> index 8f835ec7..f8b19ac5 100644
>> --- a/io/Makefile
>> +++ b/io/Makefile
>> @@ -69,6 +69,10 @@ ifeq ($(HAVE_PWRITEV2),yes)
>>  LCFLAGS += -DHAVE_PWRITEV2
>>  endif
>>  
>> +ifeq ($(HAVE_PREADV2),yes)
>> +LCFLAGS += -DHAVE_PREADV2
>> +endif
>> +
>>  ifeq ($(HAVE_MAP_SYNC),yes)
>>  LCFLAGS += -DHAVE_MAP_SYNC
>>  endif
>> diff --git a/io/pread.c b/io/pread.c
>> index 62c771fb..782f2a36 100644
>> --- a/io/pread.c
>> +++ b/io/pread.c
>> @@ -162,7 +162,8 @@ static ssize_t
>>  do_preadv(
>>  	int		fd,
>>  	off_t		offset,
>> -	long long	count)
>> +	long long	count,
>> +	int 		preadv2_flags)
>
> Nit:       ^ space before tab.  There's a bunch more of thense, every
> time a "preadv2_flags" variable or parameter are declared.
>

Ohk, sorry about that. Let me fix these in v2.

>>  {
>>  	int		vecs = 0;
>>  	ssize_t		oldlen = 0;
>> @@ -181,8 +182,14 @@ do_preadv(
>>  	} else {
>>  		vecs = vectors;
>>  	}
>> +#ifdef HAVE_PREADV2
>> +	if (preadv2_flags)
>> +		bytes = preadv2(fd, iov, vectors, offset, preadv2_flags);
>> +	else
>> +		bytes = preadv(fd, iov, vectors, offset);
>> +#else
>>  	bytes = preadv(fd, iov, vectors, offset);
>> -
>> +#endif
>
> Can we have the case that preadv2_flags!=0 and HAVE_PREADV2 isn't
> defined?  If so, then there ought to be a warning about that.
>

That won't happen. Since case 'U' to take input flags is defined under
#ifdef HAVE_PREADV2. So if someone tries to set preadv2_flags using -U
when HAVE_PREADV2 is not true, it will go into default case where we
will use exitcode 1 and print command_usage()


> --D
>

Thanks for the quick review. 

-ritesh


>>  	/* restore trimmed iov */
>>  	if (oldlen)
>>  		iov[vecs - 1].iov_len = oldlen;
>> @@ -195,12 +202,13 @@ do_pread(
>>  	int		fd,
>>  	off_t		offset,
>>  	long long	count,
>> -	size_t		buffer_size)
>> +	size_t		buffer_size,
>> +	int 		preadv2_flags)
>>  {
>>  	if (!vectors)
>>  		return pread(fd, io_buffer, min(count, buffer_size), offset);
>>  
>> -	return do_preadv(fd, offset, count);
>> +	return do_preadv(fd, offset, count, preadv2_flags);
>>  }
>>  
>>  static int
>> @@ -210,7 +218,8 @@ read_random(
>>  	long long	count,
>>  	long long	*total,
>>  	unsigned int	seed,
>> -	int		eof)
>> +	int		eof,
>> +	int 	preadv2_flags)
>>  {
>>  	off_t		end, off, range;
>>  	ssize_t		bytes;
>> @@ -234,7 +243,7 @@ read_random(
>>  				io_buffersize;
>>  		else
>>  			off = offset;
>> -		bytes = do_pread(fd, off, io_buffersize, io_buffersize);
>> +		bytes = do_pread(fd, off, io_buffersize, io_buffersize, preadv2_flags);
>>  		if (bytes == 0)
>>  			break;
>>  		if (bytes < 0) {
>> @@ -256,7 +265,8 @@ read_backward(
>>  	off_t		*offset,
>>  	long long	*count,
>>  	long long	*total,
>> -	int		eof)
>> +	int		eof,
>> +	int 	preadv2_flags)
>>  {
>>  	off_t		end, off = *offset;
>>  	ssize_t		bytes = 0, bytes_requested;
>> @@ -276,7 +286,7 @@ read_backward(
>>  	/* Do initial unaligned read if needed */
>>  	if ((bytes_requested = (off % io_buffersize))) {
>>  		off -= bytes_requested;
>> -		bytes = do_pread(fd, off, bytes_requested, io_buffersize);
>> +		bytes = do_pread(fd, off, bytes_requested, io_buffersize, preadv2_flags);
>>  		if (bytes == 0)
>>  			return ops;
>>  		if (bytes < 0) {
>> @@ -294,7 +304,7 @@ read_backward(
>>  	while (cnt > end) {
>>  		bytes_requested = min(cnt, io_buffersize);
>>  		off -= bytes_requested;
>> -		bytes = do_pread(fd, off, cnt, io_buffersize);
>> +		bytes = do_pread(fd, off, cnt, io_buffersize, preadv2_flags);
>>  		if (bytes == 0)
>>  			break;
>>  		if (bytes < 0) {
>> @@ -318,14 +328,15 @@ read_forward(
>>  	long long	*total,
>>  	int		verbose,
>>  	int		onlyone,
>> -	int		eof)
>> +	int		eof,
>> +	int 	preadv2_flags)
>>  {
>>  	ssize_t		bytes;
>>  	int		ops = 0;
>>  
>>  	*total = 0;
>>  	while (count > 0 || eof) {
>> -		bytes = do_pread(fd, offset, count, io_buffersize);
>> +		bytes = do_pread(fd, offset, count, io_buffersize, preadv2_flags);
>>  		if (bytes == 0)
>>  			break;
>>  		if (bytes < 0) {
>> @@ -353,7 +364,7 @@ read_buffer(
>>  	int		verbose,
>>  	int		onlyone)
>>  {
>> -	return read_forward(fd, offset, count, total, verbose, onlyone, 0);
>> +	return read_forward(fd, offset, count, total, verbose, onlyone, 0, 0);
>>  }
>>  
>>  static int
>> @@ -371,6 +382,7 @@ pread_f(
>>  	int		Cflag, qflag, uflag, vflag;
>>  	int		eof = 0, direction = IO_FORWARD;
>>  	int		c;
>> +	int 	preadv2_flags = 0;
>>  
>>  	Cflag = qflag = uflag = vflag = 0;
>>  	init_cvtnum(&fsblocksize, &fssectsize);
>> @@ -463,15 +475,18 @@ pread_f(
>>  	case IO_RANDOM:
>>  		if (!zeed)	/* srandom seed */
>>  			zeed = time(NULL);
>> -		c = read_random(file->fd, offset, count, &total, zeed, eof);
>> +		c = read_random(file->fd, offset, count, &total, zeed, eof,
>> +						preadv2_flags);
>>  		break;
>>  	case IO_FORWARD:
>> -		c = read_forward(file->fd, offset, count, &total, vflag, 0, eof);
>> +		c = read_forward(file->fd, offset, count, &total, vflag, 0, eof,
>> +						 preadv2_flags);
>>  		if (eof)
>>  			count = total;
>>  		break;
>>  	case IO_BACKWARD:
>> -		c = read_backward(file->fd, &offset, &count, &total, eof);
>> +		c = read_backward(file->fd, &offset, &count, &total, eof,
>> +						  preadv2_flags);
>>  		break;
>>  	default:
>>  		ASSERT(0);
>> diff --git a/m4/package_libcdev.m4 b/m4/package_libcdev.m4
>> index 4ef7e8f6..5a1f748a 100644
>> --- a/m4/package_libcdev.m4
>> +++ b/m4/package_libcdev.m4
>> @@ -16,6 +16,24 @@ pwritev2(0, 0, 0, 0, 0);
>>      AC_SUBST(have_pwritev2)
>>    ])
>>  
>> +#
>> +# Check if we have a preadv2 libc call (Linux)
>> +#
>> +AC_DEFUN([AC_HAVE_PREADV2],
>> +  [ AC_MSG_CHECKING([for preadv2])
>> +    AC_LINK_IFELSE(
>> +    [	AC_LANG_PROGRAM([[
>> +#define _GNU_SOURCE
>> +#include <sys/uio.h>
>> +	]], [[
>> +preadv2(0, 0, 0, 0, 0);
>> +	]])
>> +    ], have_preadv2=yes
>> +       AC_MSG_RESULT(yes),
>> +       AC_MSG_RESULT(no))
>> +    AC_SUBST(have_preadv2)
>> +  ])
>> +
>>  #
>>  # Check if we have a copy_file_range system call (Linux)
>>  #
>> -- 
>> 2.48.1
>> 
>> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v1 3/3] xfs_io: Add RWF_DONTCACHE support to preadv2
  2025-03-04 17:53   ` Darrick J. Wong
@ 2025-03-05  1:30     ` Ritesh Harjani
  0 siblings, 0 replies; 8+ messages in thread
From: Ritesh Harjani @ 2025-03-05  1:30 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: linux-xfs, linux-fsdevel, Jens Axboe

"Darrick J. Wong" <djwong@kernel.org> writes:

> On Tue, Mar 04, 2025 at 05:25:37PM +0530, Ritesh Harjani (IBM) wrote:
>> Add per-io RWF_DONTCACHE support flag to preadv2()
>> This enables xfs_io to perform buffered-io read which can drop the page
>> cache folios after reading.
>> 
>> 	e.g. xfs_io -c "pread -U -V 1 0 16K" /mnt/f1
>> 
>> Signed-off-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
>> ---
>>  io/pread.c        | 12 ++++++++++--
>>  man/man8/xfs_io.8 |  8 +++++++-
>>  2 files changed, 17 insertions(+), 3 deletions(-)
>> 
>> diff --git a/io/pread.c b/io/pread.c
>> index 782f2a36..64c28784 100644
>> --- a/io/pread.c
>> +++ b/io/pread.c
>> @@ -38,6 +38,9 @@ pread_help(void)
>>  " -Z N -- zeed the random number generator (used when reading randomly)\n"
>>  "         (heh, zorry, the -s/-S arguments were already in use in pwrite)\n"
>>  " -V N -- use vectored IO with N iovecs of blocksize each (preadv)\n"
>> +#ifdef HAVE_PWRITEV2
>
> HAVE_PREADV2?
>

Thanks for catching that. Will fix this in v2.

-ritesh

> --D
>
>> +" -U   -- Perform the preadv2() with Uncached/RWF_DONTCACHE\n"
>> +#endif
>>  "\n"
>>  " When in \"random\" mode, the number of read operations will equal the\n"
>>  " number required to do a complete forward/backward scan of the range.\n"
>> @@ -388,7 +391,7 @@ pread_f(
>>  	init_cvtnum(&fsblocksize, &fssectsize);
>>  	bsize = fsblocksize;
>>  
>> -	while ((c = getopt(argc, argv, "b:BCFRquvV:Z:")) != EOF) {
>> +	while ((c = getopt(argc, argv, "b:BCFRquUvV:Z:")) != EOF) {
>>  		switch (c) {
>>  		case 'b':
>>  			tmp = cvtnum(fsblocksize, fssectsize, optarg);
>> @@ -417,6 +420,11 @@ pread_f(
>>  		case 'u':
>>  			uflag = 1;
>>  			break;
>> +#ifdef HAVE_PREADV2
>> +		case 'U':
>> +			preadv2_flags |= RWF_DONTCACHE;
>> +			break;
>> +#endif
>>  		case 'v':
>>  			vflag = 1;
>>  			break;
>> @@ -514,7 +522,7 @@ pread_init(void)
>>  	pread_cmd.argmin = 2;
>>  	pread_cmd.argmax = -1;
>>  	pread_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK;
>> -	pread_cmd.args = _("[-b bs] [-qv] [-i N] [-FBR [-Z N]] off len");
>> +	pread_cmd.args = _("[-b bs] [-qUv] [-i N] [-FBR [-Z N]] off len");
>>  	pread_cmd.oneline = _("reads a number of bytes at a specified offset");
>>  	pread_cmd.help = pread_help;
>>  
>> diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8
>> index 47af5232..df508054 100644
>> --- a/man/man8/xfs_io.8
>> +++ b/man/man8/xfs_io.8
>> @@ -200,7 +200,7 @@ option will set the file permissions to read-write (0644). This allows xfs_io to
>>  set up mismatches between the file permissions and the open file descriptor
>>  read/write mode to exercise permission checks inside various syscalls.
>>  .TP
>> -.BI "pread [ \-b " bsize " ] [ \-qv ] [ \-FBR [ \-Z " seed " ] ] [ \-V " vectors " ] " "offset length"
>> +.BI "pread [ \-b " bsize " ] [ \-qUv ] [ \-FBR [ \-Z " seed " ] ] [ \-V " vectors " ] " "offset length"
>>  Reads a range of bytes in a specified blocksize from the given
>>  .IR offset .
>>  .RS 1.0i
>> @@ -214,6 +214,12 @@ requests will be split. The default blocksize is 4096 bytes.
>>  .B \-q
>>  quiet mode, do not write anything to standard output.
>>  .TP
>> +.B \-U
>> +Perform the
>> +.BR preadv2 (2)
>> +call with
>> +.IR RWF_DONTCACHE .
>> +.TP
>>  .B \-v
>>  dump the contents of the buffer after reading,
>>  by default only the count of bytes actually read is dumped.
>> -- 
>> 2.48.1
>> 
>> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2025-03-05  1:31 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-04 11:55 [PATCH v1 0/3] xfsprogs: Add support for preadv2() and RWF_DONTCACHE Ritesh Harjani (IBM)
2025-03-04 11:55 ` [PATCH v1 1/3] configure: xfs_io: Add support for preadv2 Ritesh Harjani (IBM)
2025-03-04 17:52   ` Darrick J. Wong
2025-03-05  1:06     ` Ritesh Harjani
2025-03-04 11:55 ` [PATCH v1 2/3] xfs_io: Add RWF_DONTCACHE support to pwritev2 Ritesh Harjani (IBM)
2025-03-04 11:55 ` [PATCH v1 3/3] xfs_io: Add RWF_DONTCACHE support to preadv2 Ritesh Harjani (IBM)
2025-03-04 17:53   ` Darrick J. Wong
2025-03-05  1:30     ` Ritesh Harjani

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox