FAILED: patch "[PATCH] staging: lustre: ldlm: pl_recalc time handling is wrong" failed to apply to 4.4-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
b8cb86fd95bb461c3496e1f4b4083b198c963a9cMon Sep 17 00:00:00 2001
From: Arnd Bergmann <[email protected]>
Date: Thu, 10 Nov 2016 16:21:20 +0100
Subject: [PATCH] staging: lustre: ldlm: pl_recalc time handling is wrong
James Simmons reports:
Quoted 7 lines
The
ldlm_poolfieldpl_recalc_timeis set to the current monotonic clock value but the interval period is calculated with the wall clock. This means the interval period will always be far larger than thepl_recalc_period, which is just a small interval time period. The correct thing to do is to use monotomic clock current value instead of the wall clocks value when calculatingrecalc_interval_sec.
This broke when I converted the 32-bit get_seconds() into ktime_get_{real_,}seconds() inconsistently. Either one of those two would have worked, but mixing them does not.
Staying with the original intention of the patch, this changes the ktime_get_seconds() calls into ktime_get_real_seconds(), using real time instead of mononic time.
drivers/staging/lustre/lustre/ldlm/ldlm_pool.c +4 -4
@@ -356,10 +356,10 @@ static int ldlm_pool_recalc(struct ldlm_pool *pl)u32 recalc_interval_sec;int count; - recalc_interval_sec =ktime_get_seconds () - pl->pl_recalc_time; + recalc_interval_sec =ktime_get_real_seconds () - pl->pl_recalc_time;if (recalc_interval_sec >0 ) {spin_lock (&pl->pl_lock); - recalc_interval_sec =ktime_get_seconds () - pl->pl_recalc_time; + recalc_interval_sec =ktime_get_real_seconds () - pl->pl_recalc_time;if (recalc_interval_sec >0 ) {/*
@@ -382,7 +382,7 @@ static int ldlm_pool_recalc(struct ldlm_pool *pl) count); } - recalc_interval_sec = pl->pl_recalc_time -ktime_get_seconds () + + recalc_interval_sec = pl->pl_recalc_time -ktime_get_real_seconds () + pl->pl_recalc_period;if (recalc_interval_sec <=0 ) {/* DEBUG: should be re-removed after LU-4536 is fixed */
@@ -657,7 +657,7 @@ int ldlm_pool_init(struct ldlm_pool *pl, struct ldlm_namespace *ns,spin_lock_init (&pl->pl_lock);atomic_set (&pl->pl_granted,0 ); - pl->pl_recalc_time =ktime_get_seconds (); + pl->pl_recalc_time =ktime_get_real_seconds ();atomic_set (&pl->pl_lock_volume_factor,1 );atomic_set (&pl->pl_grant_rate,0 );