[lustre-devel] [PATCH 3/9] lustre: ptlrpc: use smp unsafe at_init only for initialization
NeilBrown
neilb at suse.com
Thu Nov 22 23:15:27 PST 2018
From: Vladimir Saveliev <vladimir.saveliev at seagate.com>
at_init() is not smp safe, so it is not supposed to be used anywhere
but in at initialization.
Add at_reinit() - safe version of at_init().
Signed-off-by: Vladimir Saveliev <vladimir.saveliev at seagate.com>
WC-bug-id: https://jira.whamcloud.com/browse/LU-6805
Reviewed-on: http://review.whamcloud.com/15522
Reviewed-by: Andreas Dilger <andreas.dilger at intel.com>
Reviewed-by: Chris Horn <hornc at cray.com>
Signed-off-by: NeilBrown <neilb at suse.com>
---
.../staging/lustre/lustre/include/lustre_import.h | 19 +++++++++++++++++--
drivers/staging/lustre/lustre/ptlrpc/import.c | 2 +-
2 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/drivers/staging/lustre/lustre/include/lustre_import.h b/drivers/staging/lustre/lustre/include/lustre_import.h
index a629f6bba814..8a8a125bd130 100644
--- a/drivers/staging/lustre/lustre/include/lustre_import.h
+++ b/drivers/staging/lustre/lustre/include/lustre_import.h
@@ -331,12 +331,17 @@ static inline unsigned int at_timeout2est(unsigned int val)
return (max((val << 2) / 5, 5U) - 4);
}
-static inline void at_reset(struct adaptive_timeout *at, int val)
+static inline void at_reset_nolock(struct adaptive_timeout *at, int val)
{
- spin_lock(&at->at_lock);
at->at_current = val;
at->at_worst_ever = val;
at->at_worst_time = ktime_get_real_seconds();
+}
+
+static inline void at_reset(struct adaptive_timeout *at, int val)
+{
+ spin_lock(&at->at_lock);
+ at_reset_nolock(at, val);
spin_unlock(&at->at_lock);
}
@@ -348,6 +353,16 @@ static inline void at_init(struct adaptive_timeout *at, int val, int flags)
at_reset(at, val);
}
+static inline void at_reinit(struct adaptive_timeout *at, int val, int flags)
+{
+ spin_lock(&at->at_lock);
+ at->at_binstart = 0;
+ memset(at->at_hist, 0, sizeof(at->at_hist));
+ at->at_flags = flags;
+ at_reset_nolock(at, val);
+ spin_unlock(&at->at_lock);
+}
+
extern unsigned int at_min;
static inline int at_get(struct adaptive_timeout *at)
{
diff --git a/drivers/staging/lustre/lustre/ptlrpc/import.c b/drivers/staging/lustre/lustre/ptlrpc/import.c
index 07dc87d9513e..480c860d066e 100644
--- a/drivers/staging/lustre/lustre/ptlrpc/import.c
+++ b/drivers/staging/lustre/lustre/ptlrpc/import.c
@@ -1036,7 +1036,7 @@ static int ptlrpc_connect_interpret(const struct lu_env *env,
* The net statistics after (re-)connect is not valid anymore,
* because may reflect other routing, etc.
*/
- at_init(&imp->imp_at.iat_net_latency, 0, 0);
+ at_reinit(&imp->imp_at.iat_net_latency, 0, 0);
ptlrpc_at_adj_net_latency(request,
lustre_msg_get_service_time(request->rq_repmsg));
More information about the lustre-devel
mailing list