From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1BB08C8303C for ; Tue, 8 Jul 2025 16:07:01 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 8C16A6B009F; Tue, 8 Jul 2025 12:06:50 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 899AB6B00A0; Tue, 8 Jul 2025 12:06:50 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 7D6516B00A1; Tue, 8 Jul 2025 12:06:50 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 6C84E6B009F for ; Tue, 8 Jul 2025 12:06:50 -0400 (EDT) Received: from smtpin27.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 26B911A06B9 for ; Tue, 8 Jul 2025 16:06:50 +0000 (UTC) X-FDA: 83641575780.27.97C90FF Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by imf16.hostedemail.com (Postfix) with ESMTP id 632BF180003 for ; Tue, 8 Jul 2025 16:06:48 +0000 (UTC) Authentication-Results: imf16.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=XaSq41ER; dmarc=pass (policy=quarantine) header.from=kernel.org; spf=pass (imf16.hostedemail.com: domain of snitzer@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=snitzer@kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1751990808; a=rsa-sha256; cv=none; b=PBvq8ML1J7pe63S8IS85nMWi9Ws4V5cvw+Ba4sbq8iMpatVeLUYu4Ow7w0X/OWIzcwyWnq o8/PQ1YyA3OD/FU+lLFId2jn2RHhGCkWrO5mvd15Ah2pwZhBl/vWZdqHBFoOX2MRv5q8tF VNeggKBvNjyFI4S6qDFoAfvgXnbuHj4= ARC-Authentication-Results: i=1; imf16.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=XaSq41ER; dmarc=pass (policy=quarantine) header.from=kernel.org; spf=pass (imf16.hostedemail.com: domain of snitzer@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=snitzer@kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1751990808; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=jytM0qMAwMIMFVv0rstqrSxKTIL4WulDtm5zy1pjths=; b=vGW+jo1AzOZl42FfLdMkWWoyI+mvDeh2BuepFPjv/uN0G5aAkhb/3f1sMvpJ9320s4yLep A8ej6zOYR6xVWYH1AB10Z2KsIPcGv6wWg1c399T1G4SLCXgcWwm1+I9YCJea5/eFVUvI4m HHkbnx8VG4tTBjLqsELgkR5YNCSNCxA= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id 9F0E65C5EE2; Tue, 8 Jul 2025 16:06:47 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 206FEC4CEF0; Tue, 8 Jul 2025 16:06:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1751990807; bh=m5cGrmZw2plZkZu6pmVWkJKfBuySuyZ/0uG5Zgtwu6k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XaSq41ERf3CYJ8+gpp4mtOMCD2mgEmAynWl6fWEdLYL5JqiPxyraYYEt2hobjM1tl rXmkXBurmHrDrCxULqq/ocZ4IizpJwkaCdl4MmRCibnKtl8Gf5riUFqr8cmMjwM832 WfGw9M7UfjWdtGXCaROKLX/fp9J5n4bP9g5IcPkD57IK9wTk2PFT33aNu/RPG9ifSN JHPA9k0DL35Lx2qgjwqUlpvxyKIJEIceWjRm8mgWO/ukRcl/YPKr9lyqSc4PAiS6dk Wnx1/4Yi0FVrjVX83WXIEBzkolcFrz3Nbon+YMVhrVvr74I3zL00WY+xNsKT8H3HDn OqSJdcdgCiulg== From: Mike Snitzer To: Chuck Lever , Jeff Layton , NeilBrown , Olga Kornievskaia , Dai Ngo , Tom Talpey , Trond Myklebust , Anna Schumaker Cc: linux-nfs@vger.kernel.org, linus-fsdevel@vger.kernel.org, linux-mm@kvack.org, snitzer@kernel.org Subject: [RFC PATCH v2 7/8] NFSD: add io_cache_write controls to debugfs interface Date: Tue, 8 Jul 2025 12:06:18 -0400 Message-ID: <20250708160619.64800-8-snitzer@kernel.org> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20250708160619.64800-1-snitzer@kernel.org> References: <20250708160619.64800-1-snitzer@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: 632BF180003 X-Stat-Signature: kwpbtmxtdub3acb39ebetss63hons1ot X-Rspam-User: X-Rspamd-Server: rspam10 X-HE-Tag: 1751990808-444554 X-HE-Meta: U2FsdGVkX18VBAJ9851iSS0TV8j8ij6m/s+osEJzElReEPh30hLMRiRKonuJ0IPBvAUcVO6ts1y+Lsg79KitdBpXhpl7TgqqrNRH2IuzU8xQPkNwTWKXeXQDd9P5gRJqYokICkEa93kUWt24zB8uGOTYIp1GNF3DpX122szJCSKeV1gDkvIMJ6HFZEXElAQI7GfoAxUkjdf6THDgrcS8H20xHJ+C2G0bSqtqb6WxX0TRGn8ALA4aheT1zmo1eE3psj1xG8Rb1rDb00Ra6Z9ISgIA4mt1rYDptdVA9Fe+OCv4gfoSyYUzaXtyAtCvq4SD4JMs04XjY4FfVw/L0l+N2Cq4cimlrgGOibopyGmd/OhwUHdI4kMcRhfqvmWEk7RQSYNvin/ePCIQpUFbMTHaSA0Nv67TxY5uvaQozLIiiUr10xmqxdcvsdqf8MJIc0HRjGCWaSkKJCaH4LLxtSRxI1/yzYbATdwFkH0sunKhiB/DtQL6dp3SfVbgzw/pRhzvD14WGGLoq7ZHmnR17iwKAgEmsu5u/n/iWKVhzlcDLioFxV3IuP5neQYj/lNZEzrpdh8dPc94QJmyxs94Fivus4K2gww9BNRw7saHLaPzQPNMiwq274RWYyfwa7OtFJCuuFz+IDnAYPRBOh9HsLvhHC8U/xSYxL222AoPhwVq3BRdbF9wQQI1W842p6WWQ+/Baa+baCwiaeaaUgGrVZSNhPCHP586bZ3Yvgq2Drz5P5o9wzjtJ+3BwlTIxX+xSNHAo9lUxEgDL3L8/azD1DaXucEevMD/6zxOCMBWswwoWqBDoHxJwi3Aem0+dvEvlOL1jrMMZbYns5P+1CR2Um+7jQpldR8fPD0ieF4U8UbO2u8pLIPu4j9BYubQieL8GGhSsVWNzqSOtkSlHlv/Zo9LO9832lYWE+8wuykTDQXltsodsbJXL6+LL5JyyKvhiRAbPL8QjgKMYE3JkN45d5u 1bwwIP5i v1/HUTiVaQIUOxeU/R10zUFAvNvufZsFCaGpmbArmT6MRAmv8JbYNv+0Ch2rw4c385guLaNzFv2K0vCs/RaqnQxbNm7G/gZUMFrJgQCFRCMcAdmxK/HE+PcjRDnETSqMXQ3jpNIF90I8jcm8vpO9gC21CN+mLiVmHfEtJtgaS7SstjZJGoO+rEOS/9P3eCnGt6h017xfixIWYR0itDXFy+1JBPGPKC7vGb5BiYDnE3mPu4EuSwaBnZGW+Bi4NB09mgkqEMwyZYT/C0w8KO5UrPEvIzA== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Add 'io_cache_write' to NFSD's debugfs interface so that: Any data written by NFSD will either be: - cached using page cache (NFSD_IO_BUFFERED=0) - cached but removed from the page cache upon completion (NFSD_IO_DONTCACHE=1). - not cached (NFSD_IO_DIRECT=2) io_cache_write is 0 by default. It may be set by writing to: /sys/kernel/debug/nfsd/io_cache_write If NFSD_IO_DONTCACHE is specified using 1, FOP_DONTCACHE must be advertised as supported by the underlying filesystem (e.g. XFS), otherwise all IO flagged with RWF_DONTCACHE will fail with -EOPNOTSUPP. If NFSD_IO_DIRECT is specified using 2, the IO must be aligned relative to the underlying block device's logical_block_size. Also the memory buffer used to store the WRITE payload must be aligned relative to the underlying block device's dma_alignment. Signed-off-by: Mike Snitzer --- fs/nfsd/debugfs.c | 41 +++++++++++++++++++++++++++++++++++++++++ fs/nfsd/nfsd.h | 1 + fs/nfsd/vfs.c | 15 +++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/fs/nfsd/debugfs.c b/fs/nfsd/debugfs.c index 709646af797a..fadf1d88f640 100644 --- a/fs/nfsd/debugfs.c +++ b/fs/nfsd/debugfs.c @@ -82,6 +82,44 @@ static int nfsd_io_cache_read_set(void *data, u64 val) DEFINE_DEBUGFS_ATTRIBUTE(nfsd_io_cache_read_fops, nfsd_io_cache_read_get, nfsd_io_cache_read_set, "%llu\n"); +/* + * /sys/kernel/debug/nfsd/io_cache_write + * + * Contents: + * %0: NFS WRITE will use buffered IO (default) + * %1: NFS WRITE will use dontcache (buffered IO w/ dropbehind) + * %2: NFS WRITE will use direct IO + * + * The default value of this setting is zero (buffered IO is + * used). This setting takes immediate effect for all NFS + * versions, all exports, and in all NFSD net namespaces. + */ + +static int nfsd_io_cache_write_get(void *data, u64 *val) +{ + *val = nfsd_io_cache_write; + return 0; +} + +static int nfsd_io_cache_write_set(void *data, u64 val) +{ + switch (val) { + case NFSD_IO_BUFFERED: + case NFSD_IO_DONTCACHE: + case NFSD_IO_DIRECT: + nfsd_io_cache_write = val; + break; + default: + nfsd_io_cache_write = NFSD_IO_BUFFERED; + break; + } + + return 0; +} + +DEFINE_DEBUGFS_ATTRIBUTE(nfsd_io_cache_write_fops, nfsd_io_cache_write_get, + nfsd_io_cache_write_set, "%llu\n"); + void nfsd_debugfs_exit(void) { debugfs_remove_recursive(nfsd_top_dir); @@ -97,4 +135,7 @@ void nfsd_debugfs_init(void) debugfs_create_file("io_cache_read", S_IWUSR | S_IRUGO, nfsd_top_dir, NULL, &nfsd_io_cache_read_fops); + + debugfs_create_file("io_cache_write", S_IWUSR | S_IRUGO, + nfsd_top_dir, NULL, &nfsd_io_cache_write_fops); } diff --git a/fs/nfsd/nfsd.h b/fs/nfsd/nfsd.h index 4740567f4e7e..1ae38c5557c4 100644 --- a/fs/nfsd/nfsd.h +++ b/fs/nfsd/nfsd.h @@ -160,6 +160,7 @@ enum { }; extern u64 nfsd_io_cache_read __read_mostly; +extern u64 nfsd_io_cache_write __read_mostly; extern int nfsd_max_blksize; diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 632ce417f4ef..05a7ba383334 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -50,6 +50,7 @@ bool nfsd_disable_splice_read __read_mostly; u64 nfsd_io_cache_read __read_mostly; +u64 nfsd_io_cache_write __read_mostly; /** * nfserrno - Map Linux errnos to NFS errnos @@ -1228,6 +1229,20 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, nvecs = xdr_buf_to_bvec(rqstp->rq_bvec, rqstp->rq_maxpages, payload); iov_iter_bvec(&iter, ITER_SOURCE, rqstp->rq_bvec, nvecs, *cnt); + + switch (nfsd_io_cache_write) { + case NFSD_IO_DIRECT: + if (iov_iter_is_aligned(&iter, nf->nf_dio_mem_align - 1, + nf->nf_dio_offset_align - 1)) + kiocb.ki_flags = IOCB_DIRECT; + break; + case NFSD_IO_DONTCACHE: + kiocb.ki_flags = IOCB_DONTCACHE; + break; + case NFSD_IO_BUFFERED: + break; + } + since = READ_ONCE(file->f_wb_err); if (verf) nfsd_copy_write_verifier(verf, nn); -- 2.44.0