Commit 0ac0478b authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Greg Kroah-Hartman
Browse files

staging/lustre: use 64-bit time for adaptive timeout



The adaptive timeout handling stores absolute times in 32-bit time_t
quantities, which will overflow in 2038.

This changes it to use time64_t.

Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarOleg Drokin <green@linuxhacker.ru>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 74e489aa
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -61,12 +61,12 @@
#define AT_FLG_NOHIST 0x1	  /* use last reported value only */

struct adaptive_timeout {
	time_t		at_binstart;	 /* bin start time */
	time64_t	at_binstart;	 /* bin start time */
	unsigned int	at_hist[AT_BINS];    /* timeout history bins */
	unsigned int	at_flags;
	unsigned int	at_current;	  /* current timeout value */
	unsigned int	at_worst_ever;       /* worst-ever timeout value */
	time_t		at_worst_time;       /* worst-ever timeout timestamp */
	time64_t	at_worst_time;       /* worst-ever timeout timestamp */
	spinlock_t	at_lock;
};

@@ -351,7 +351,7 @@ static inline void at_reset(struct adaptive_timeout *at, int val)
	spin_lock(&at->at_lock);
	at->at_current = val;
	at->at_worst_ever = val;
	at->at_worst_time = get_seconds();
	at->at_worst_time = ktime_get_real_seconds();
	spin_unlock(&at->at_lock);
}
static inline void at_init(struct adaptive_timeout *at, int val, int flags)
+4 −4
Original line number Diff line number Diff line
@@ -1523,12 +1523,12 @@ extern unsigned int at_min, at_max, at_history;
int at_measured(struct adaptive_timeout *at, unsigned int val)
{
	unsigned int old = at->at_current;
	time_t now = get_seconds();
	time_t binlimit = max_t(time_t, at_history / AT_BINS, 1);
	time64_t now = ktime_get_real_seconds();
	long binlimit = max_t(long, at_history / AT_BINS, 1);

	LASSERT(at);
	CDEBUG(D_OTHER, "add %u to %p time=%lu v=%u (%u %u %u %u)\n",
	       val, at, now - at->at_binstart, at->at_current,
	       val, at, (long)(now - at->at_binstart), at->at_current,
	       at->at_hist[0], at->at_hist[1], at->at_hist[2], at->at_hist[3]);

	if (val == 0)
@@ -1553,7 +1553,7 @@ int at_measured(struct adaptive_timeout *at, unsigned int val)
		int i, shift;
		unsigned int maxv = val;
		/* move bins over */
		shift = (now - at->at_binstart) / binlimit;
		shift = (u32)(now - at->at_binstart) / binlimit;
		LASSERT(shift > 0);
		for (i = AT_BINS - 1; i >= 0; i--) {
			if (i >= shift) {
+4 −4
Original line number Diff line number Diff line
@@ -989,7 +989,7 @@ static int ptlrpc_lprocfs_timeouts_seq_show(struct seq_file *m, void *n)
	struct ptlrpc_service *svc = m->private;
	struct ptlrpc_service_part *svcpt;
	struct dhms ts;
	time_t worstt;
	time64_t worstt;
	unsigned int cur;
	unsigned int worst;
	int i;
@@ -1004,11 +1004,11 @@ static int ptlrpc_lprocfs_timeouts_seq_show(struct seq_file *m, void *n)
		cur	= at_get(&svcpt->scp_at_estimate);
		worst	= svcpt->scp_at_estimate.at_worst_ever;
		worstt	= svcpt->scp_at_estimate.at_worst_time;
		s2dhms(&ts, get_seconds() - worstt);
		s2dhms(&ts, ktime_get_real_seconds() - worstt);

		seq_printf(m, "%10s : cur %3u  worst %3u (at %ld, "
		seq_printf(m, "%10s : cur %3u  worst %3u (at %lld, "
			      DHMS_FMT" ago) ", "service",
			      cur, worst, worstt, DHMS_VARS(&ts));
			      cur, worst, (s64)worstt, DHMS_VARS(&ts));

		lprocfs_at_hist_helper(m, &svcpt->scp_at_estimate);
	}