19fe5ea76SChuck Lever // SPDX-License-Identifier: GPL-2.0
29fe5ea76SChuck Lever
39fe5ea76SChuck Lever #include <linux/debugfs.h>
49fe5ea76SChuck Lever
59fe5ea76SChuck Lever #include "nfsd.h"
69fe5ea76SChuck Lever
79fe5ea76SChuck Lever static struct dentry *nfsd_top_dir __read_mostly;
89fe5ea76SChuck Lever
912181490SChuck Lever /*
1012181490SChuck Lever * /sys/kernel/debug/nfsd/disable-splice-read
1112181490SChuck Lever *
1212181490SChuck Lever * Contents:
1312181490SChuck Lever * %0: NFS READ is allowed to use page splicing
1412181490SChuck Lever * %1: NFS READ uses only iov iter read
1512181490SChuck Lever *
1612181490SChuck Lever * The default value of this setting is zero (page splicing is
1712181490SChuck Lever * allowed). This setting takes immediate effect for all NFS
1812181490SChuck Lever * versions, all exports, and in all NFSD net namespaces.
1912181490SChuck Lever */
2012181490SChuck Lever
nfsd_dsr_get(void * data,u64 * val)2112181490SChuck Lever static int nfsd_dsr_get(void *data, u64 *val)
2212181490SChuck Lever {
2312181490SChuck Lever *val = nfsd_disable_splice_read ? 1 : 0;
2412181490SChuck Lever return 0;
2512181490SChuck Lever }
2612181490SChuck Lever
nfsd_dsr_set(void * data,u64 val)2712181490SChuck Lever static int nfsd_dsr_set(void *data, u64 val)
2812181490SChuck Lever {
29f64397e0SXichao Zhao nfsd_disable_splice_read = (val > 0);
306304affeSMike Snitzer if (!nfsd_disable_splice_read) {
316304affeSMike Snitzer /*
326304affeSMike Snitzer * Must use buffered I/O if splice_read is enabled.
336304affeSMike Snitzer */
346304affeSMike Snitzer nfsd_io_cache_read = NFSD_IO_BUFFERED;
356304affeSMike Snitzer }
3612181490SChuck Lever return 0;
3712181490SChuck Lever }
3812181490SChuck Lever
3912181490SChuck Lever DEFINE_DEBUGFS_ATTRIBUTE(nfsd_dsr_fops, nfsd_dsr_get, nfsd_dsr_set, "%llu\n");
4012181490SChuck Lever
416304affeSMike Snitzer /*
426304affeSMike Snitzer * /sys/kernel/debug/nfsd/io_cache_read
436304affeSMike Snitzer *
446304affeSMike Snitzer * Contents:
456304affeSMike Snitzer * %0: NFS READ will use buffered IO
466304affeSMike Snitzer * %1: NFS READ will use dontcache (buffered IO w/ dropbehind)
47d686e64eSChuck Lever * %2: NFS READ will use direct IO
486304affeSMike Snitzer *
496304affeSMike Snitzer * This setting takes immediate effect for all NFS versions,
506304affeSMike Snitzer * all exports, and in all NFSD net namespaces.
516304affeSMike Snitzer */
526304affeSMike Snitzer
nfsd_io_cache_read_get(void * data,u64 * val)536304affeSMike Snitzer static int nfsd_io_cache_read_get(void *data, u64 *val)
546304affeSMike Snitzer {
556304affeSMike Snitzer *val = nfsd_io_cache_read;
566304affeSMike Snitzer return 0;
576304affeSMike Snitzer }
586304affeSMike Snitzer
nfsd_io_cache_read_set(void * data,u64 val)596304affeSMike Snitzer static int nfsd_io_cache_read_set(void *data, u64 val)
606304affeSMike Snitzer {
616304affeSMike Snitzer int ret = 0;
626304affeSMike Snitzer
636304affeSMike Snitzer switch (val) {
646304affeSMike Snitzer case NFSD_IO_BUFFERED:
656304affeSMike Snitzer nfsd_io_cache_read = NFSD_IO_BUFFERED;
666304affeSMike Snitzer break;
676304affeSMike Snitzer case NFSD_IO_DONTCACHE:
68d686e64eSChuck Lever case NFSD_IO_DIRECT:
696304affeSMike Snitzer /*
706304affeSMike Snitzer * Must disable splice_read when enabling
716304affeSMike Snitzer * NFSD_IO_DONTCACHE.
726304affeSMike Snitzer */
736304affeSMike Snitzer nfsd_disable_splice_read = true;
746304affeSMike Snitzer nfsd_io_cache_read = val;
756304affeSMike Snitzer break;
766304affeSMike Snitzer default:
776304affeSMike Snitzer ret = -EINVAL;
786304affeSMike Snitzer break;
796304affeSMike Snitzer }
806304affeSMike Snitzer
816304affeSMike Snitzer return ret;
826304affeSMike Snitzer }
836304affeSMike Snitzer
846304affeSMike Snitzer DEFINE_DEBUGFS_ATTRIBUTE(nfsd_io_cache_read_fops, nfsd_io_cache_read_get,
856304affeSMike Snitzer nfsd_io_cache_read_set, "%llu\n");
866304affeSMike Snitzer
876304affeSMike Snitzer /*
886304affeSMike Snitzer * /sys/kernel/debug/nfsd/io_cache_write
896304affeSMike Snitzer *
906304affeSMike Snitzer * Contents:
916304affeSMike Snitzer * %0: NFS WRITE will use buffered IO
926304affeSMike Snitzer * %1: NFS WRITE will use dontcache (buffered IO w/ dropbehind)
936304affeSMike Snitzer *
946304affeSMike Snitzer * This setting takes immediate effect for all NFS versions,
956304affeSMike Snitzer * all exports, and in all NFSD net namespaces.
966304affeSMike Snitzer */
976304affeSMike Snitzer
nfsd_io_cache_write_get(void * data,u64 * val)986304affeSMike Snitzer static int nfsd_io_cache_write_get(void *data, u64 *val)
996304affeSMike Snitzer {
1006304affeSMike Snitzer *val = nfsd_io_cache_write;
1016304affeSMike Snitzer return 0;
1026304affeSMike Snitzer }
1036304affeSMike Snitzer
nfsd_io_cache_write_set(void * data,u64 val)1046304affeSMike Snitzer static int nfsd_io_cache_write_set(void *data, u64 val)
1056304affeSMike Snitzer {
1066304affeSMike Snitzer int ret = 0;
1076304affeSMike Snitzer
1086304affeSMike Snitzer switch (val) {
1096304affeSMike Snitzer case NFSD_IO_BUFFERED:
1106304affeSMike Snitzer case NFSD_IO_DONTCACHE:
111*06c5c972SMike Snitzer case NFSD_IO_DIRECT:
1126304affeSMike Snitzer nfsd_io_cache_write = val;
1136304affeSMike Snitzer break;
1146304affeSMike Snitzer default:
1156304affeSMike Snitzer ret = -EINVAL;
1166304affeSMike Snitzer break;
1176304affeSMike Snitzer }
1186304affeSMike Snitzer
1196304affeSMike Snitzer return ret;
1206304affeSMike Snitzer }
1216304affeSMike Snitzer
1226304affeSMike Snitzer DEFINE_DEBUGFS_ATTRIBUTE(nfsd_io_cache_write_fops, nfsd_io_cache_write_get,
1236304affeSMike Snitzer nfsd_io_cache_write_set, "%llu\n");
1246304affeSMike Snitzer
nfsd_debugfs_exit(void)1259fe5ea76SChuck Lever void nfsd_debugfs_exit(void)
1269fe5ea76SChuck Lever {
1279fe5ea76SChuck Lever debugfs_remove_recursive(nfsd_top_dir);
1289fe5ea76SChuck Lever nfsd_top_dir = NULL;
1299fe5ea76SChuck Lever }
1309fe5ea76SChuck Lever
nfsd_debugfs_init(void)1319fe5ea76SChuck Lever void nfsd_debugfs_init(void)
1329fe5ea76SChuck Lever {
1339fe5ea76SChuck Lever nfsd_top_dir = debugfs_create_dir("nfsd", NULL);
13412181490SChuck Lever
13512181490SChuck Lever debugfs_create_file("disable-splice-read", S_IWUSR | S_IRUGO,
13612181490SChuck Lever nfsd_top_dir, NULL, &nfsd_dsr_fops);
1376304affeSMike Snitzer
1386304affeSMike Snitzer debugfs_create_file("io_cache_read", 0644, nfsd_top_dir, NULL,
1396304affeSMike Snitzer &nfsd_io_cache_read_fops);
1406304affeSMike Snitzer
1416304affeSMike Snitzer debugfs_create_file("io_cache_write", 0644, nfsd_top_dir, NULL,
1426304affeSMike Snitzer &nfsd_io_cache_write_fops);
1439fe5ea76SChuck Lever }
144