xref: /linux/fs/nfsd/debugfs.c (revision b0319c4642638bad4b36974055b1c0894b2c7aa9)
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