Browse Source

NFSv4.2/pnfs: Make the layoutstats timer configurable

Allow advanced users to set the layoutstats timer in order to lengthen
or shorten the period between layoutstat transmissions to the server.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Trond Myklebust 10 năm trước cách đây
mục cha
commit
bbf58bf348

+ 9 - 0
Documentation/kernel-parameters.txt

@@ -2279,6 +2279,15 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
 			The default parameter value of '0' causes the kernel
 			The default parameter value of '0' causes the kernel
 			not to attempt recovery of lost locks.
 			not to attempt recovery of lost locks.
 
 
+	nfs4.layoutstats_timer =
+			[NFSv4.2] Change the rate at which the kernel sends
+			layoutstats to the pNFS metadata server.
+
+			Setting this to value to 0 causes the kernel to use
+			whatever value is the default set by the layout
+			driver. A non-zero value sets the minimum interval
+			in seconds between layoutstats transmissions.
+
 	nfsd.nfs4_disable_idmapping=
 	nfsd.nfs4_disable_idmapping=
 			[NFSv4] When set to the default of '1', the NFSv4
 			[NFSv4] When set to the default of '1', the NFSv4
 			server will return only numeric uids and gids to
 			server will return only numeric uids and gids to

+ 4 - 1
fs/nfs/flexfilelayout/flexfilelayout.c

@@ -533,14 +533,17 @@ nfs4_ff_layoutstat_start_io(struct nfs4_ff_layout_mirror *mirror,
 			    ktime_t now)
 			    ktime_t now)
 {
 {
 	static const ktime_t notime = {0};
 	static const ktime_t notime = {0};
+	s64 report_interval = FF_LAYOUTSTATS_REPORT_INTERVAL;
 
 
 	nfs4_ff_start_busy_timer(&layoutstat->busy_timer, now);
 	nfs4_ff_start_busy_timer(&layoutstat->busy_timer, now);
 	if (ktime_equal(mirror->start_time, notime))
 	if (ktime_equal(mirror->start_time, notime))
 		mirror->start_time = now;
 		mirror->start_time = now;
 	if (ktime_equal(mirror->last_report_time, notime))
 	if (ktime_equal(mirror->last_report_time, notime))
 		mirror->last_report_time = now;
 		mirror->last_report_time = now;
+	if (layoutstats_timer != 0)
+		report_interval = (s64)layoutstats_timer * 1000LL;
 	if (ktime_to_ms(ktime_sub(now, mirror->last_report_time)) >=
 	if (ktime_to_ms(ktime_sub(now, mirror->last_report_time)) >=
-			FF_LAYOUTSTATS_REPORT_INTERVAL) {
+			report_interval) {
 		mirror->last_report_time = now;
 		mirror->last_report_time = now;
 		return true;
 		return true;
 	}
 	}

+ 4 - 0
fs/nfs/pnfs.c

@@ -2285,3 +2285,7 @@ out_put:
 }
 }
 EXPORT_SYMBOL_GPL(pnfs_report_layoutstat);
 EXPORT_SYMBOL_GPL(pnfs_report_layoutstat);
 #endif
 #endif
+
+unsigned int layoutstats_timer;
+module_param(layoutstats_timer, uint, 0644);
+EXPORT_SYMBOL_GPL(layoutstats_timer);

+ 3 - 0
fs/nfs/pnfs.h

@@ -528,12 +528,15 @@ pnfs_use_threshold(struct nfs4_threshold **dst, struct nfs4_threshold *src,
 					nfss->pnfs_curr_ld->id == src->l_type);
 					nfss->pnfs_curr_ld->id == src->l_type);
 }
 }
 
 
+extern unsigned int layoutstats_timer;
+
 #ifdef NFS_DEBUG
 #ifdef NFS_DEBUG
 void nfs4_print_deviceid(const struct nfs4_deviceid *dev_id);
 void nfs4_print_deviceid(const struct nfs4_deviceid *dev_id);
 #else
 #else
 static inline void nfs4_print_deviceid(const struct nfs4_deviceid *dev_id)
 static inline void nfs4_print_deviceid(const struct nfs4_deviceid *dev_id)
 {
 {
 }
 }
+
 #endif /* NFS_DEBUG */
 #endif /* NFS_DEBUG */
 #else  /* CONFIG_NFS_V4_1 */
 #else  /* CONFIG_NFS_V4_1 */