From: Bart Van Assche <bvanassche@acm.org>
To: Christian Brauner <brauner@kernel.org>,
Alexander Viro <viro@zeniv.linux.org.uk>
Cc: linux-fsdevel@vger.kernel.org, Jens Axboe <axboe@kernel.dk>,
Christoph Hellwig <hch@lst.de>,
"Martin K . Petersen" <martin.petersen@oracle.com>,
Bart Van Assche <bvanassche@acm.org>
Subject: [PATCH 0/6] Restore data lifetime support
Date: Wed, 31 Jan 2024 12:52:31 -0800 [thread overview]
Message-ID: <20240131205237.3540210-1-bvanassche@acm.org> (raw)
Hi Christian,
UFS devices are widely used in mobile applications, e.g. in smartphones.
UFS vendors need data lifetime information to achieve good performance.
Providing data lifetime information to UFS devices can result in up to 40%
lower write amplification. Hence this patch series that restores the
bi_write_hint member in struct bio. After this patch series has been merged,
patches that implement data lifetime support in the SCSI disk (sd) driver
will be sent to the Linux kernel SCSI maintainer.
The following changes are included in this patch series:
- Improvements for the F_GET_RW_HINT and F_SET_RW_HINT fcntls.
- Move enum rw_hint into a new header file.
- Support F_SET_RW_HINT for block devices to make it easy to test data
lifetime support.
- Restore the bio.bi_write_hint member and restore support in the VFS layer
and also in the block layer for data lifetime information.
The shell script that has been used to test the patch series combined with
the SCSI patches is available at the end of this cover letter.
Please consider this patch series for the next merge window.
Thanks,
Bart.
Bart Van Assche (6):
fs: Fix rw_hint validation
fs: Verify write lifetime constants at compile time
fs: Split fcntl_rw_hint()
fs: Move enum rw_hint into a new header file
fs: Propagate write hints to the struct block_device inode
block, fs: Restore the per-bio/request data lifetime fields
block/bio.c | 2 ++
block/blk-crypto-fallback.c | 1 +
block/blk-merge.c | 8 +++++
block/blk-mq.c | 2 ++
block/bounce.c | 1 +
block/fops.c | 3 ++
fs/buffer.c | 12 ++++---
fs/direct-io.c | 2 ++
fs/f2fs/f2fs.h | 1 +
fs/fcntl.c | 64 +++++++++++++++++++++++++------------
fs/inode.c | 1 +
fs/iomap/buffered-io.c | 2 ++
fs/iomap/direct-io.c | 1 +
fs/mpage.c | 1 +
include/linux/blk-mq.h | 2 ++
include/linux/blk_types.h | 2 ++
include/linux/fs.h | 16 ++--------
include/linux/rw_hint.h | 24 ++++++++++++++
18 files changed, 106 insertions(+), 39 deletions(-)
create mode 100644 include/linux/rw_hint.h
This patch series, combined with the SCSI patches, has been tested with the
following shell script:
#!/bin/bash
# SPDX-License-Identifier: GPL-3.0+
# Copyright (C) 2022 Google LLC
. tests/zbd/rc
. common/null_blk
. common/scsi_debug
DESCRIPTION="test block write hint support"
QUICK=1
requires() {
_have_fio
_have_scsi_debug_group_number_stats
}
submit_io() {
local stats_attr=/sys/bus/pseudo/drivers/scsi_debug/group_number_stats
echo "$1 ($3)"
echo "$*" >>"${FULL}"
local direct_io=$2
echo 0 > "${stats_attr}" &&
local fio_args wh &&
for wh in none short medium long extreme; do
if [ "${direct_io}" = 0 ]; then
sync
echo 1 > /proc/sys/vm/drop_caches
fi
fio_args=(
--bs=4K
--buffer_pattern='"'"$wh"'"'
--direct="${direct_io}"
--disable_clat=1
--disable_slat=1
--end_fsync=$((1 - direct_io))
--filename="${dev}"
--group_reporting=1
--gtod_reduce=1
--ioengine="$3"
--ioscheduler=none
--name=whint_"$wh"
--norandommap
--rw=randwrite
--size=4M
--thread=1
--write_hint="$wh"
)
echo "fio ${fio_args[*]}" >>"${FULL}" 2>&1
fio "${fio_args[@]}" >>"${FULL}" 2>&1 || return $?
done &&
grep -v ' 0$' "${stats_attr}" >> "${FULL}"
while read -r group count; do
if [ "$count" -gt 0 ]; then echo "$group"; fi
done < "${stats_attr}"
}
test() {
echo "Running ${TEST_NAME}"
local scsi_debug_params=(
delay=0
dev_size_mb=1024
sector_size=4096
)
_init_scsi_debug "${scsi_debug_params[@]}" &&
local dev="/dev/${SCSI_DEBUG_DEVICES[0]}" fail &&
ls -ldi "${dev}" >>"${FULL}" &&
submit_io "Direct I/O" 1 pvsync &&
submit_io "Direct I/O" 1 libaio &&
submit_io "Direct I/O" 1 io_uring &&
submit_io "Buffered I/O" 0 pvsync ||
fail=true
_exit_scsi_debug
if [ -z "$fail" ]; then
echo "Test complete"
else
echo "Test failed"
return 1
fi
}
Expected output:
Running scsi/097
Direct I/O (pvsync)
1
2
3
4
5
Direct I/O (libaio)
1
2
3
4
5
Direct I/O (io_uring)
1
2
3
4
5
Buffered I/O (pvsync)
1
2
3
4
5
Test complete
next reply other threads:[~2024-01-31 20:53 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-31 20:52 Bart Van Assche [this message]
2024-01-31 20:52 ` [PATCH 1/6] fs: Fix rw_hint validation Bart Van Assche
2024-01-31 20:52 ` [PATCH 2/6] fs: Verify write lifetime constants at compile time Bart Van Assche
2024-01-31 20:52 ` [PATCH 3/6] fs: Split fcntl_rw_hint() Bart Van Assche
2024-01-31 21:07 ` Dave Chinner
2024-02-01 17:38 ` Bart Van Assche
2024-01-31 20:52 ` [PATCH 4/6] fs: Move enum rw_hint into a new header file Bart Van Assche
2024-01-31 20:52 ` [PATCH 5/6] fs: Propagate write hints to the struct block_device inode Bart Van Assche
2024-01-31 20:52 ` [PATCH 6/6] block, fs: Restore the per-bio/request data lifetime fields Bart Van Assche
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=20240131205237.3540210-1-bvanassche@acm.org \
--to=bvanassche@acm.org \
--cc=axboe@kernel.dk \
--cc=brauner@kernel.org \
--cc=hch@lst.de \
--cc=linux-fsdevel@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=viro@zeniv.linux.org.uk \
/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;
as well as URLs for NNTP newsgroup(s).