From: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
To: "Darrick J. Wong" <djwong@kernel.org>
Cc: linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org,
Jens Axboe <axboe@kernel.dk>
Subject: Re: [PATCH v1 1/3] configure: xfs_io: Add support for preadv2
Date: Wed, 05 Mar 2025 06:36:05 +0530 [thread overview]
Message-ID: <87ikoo70ci.fsf@gmail.com> (raw)
In-Reply-To: <20250304175232.GB2803749@frogsfrogsfrogs>
"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
>>
>>
next prev parent reply other threads:[~2025-03-05 1:30 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
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 [this message]
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
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=87ikoo70ci.fsf@gmail.com \
--to=ritesh.list@gmail.com \
--cc=axboe@kernel.dk \
--cc=djwong@kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-xfs@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.