Received: by 10.192.165.148 with SMTP id m20csp949641imm; Wed, 2 May 2018 11:23:47 -0700 (PDT) X-Google-Smtp-Source: AB8JxZrFmFybhwtJbfRttb6yfbhJZzwCxB8Wx+e9/BdhMWz44szqJPex5dHQs88SYc/38OkhWMMp X-Received: by 2002:a17:902:5a0d:: with SMTP id q13-v6mr20922037pli.199.1525285427648; Wed, 02 May 2018 11:23:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525285427; cv=none; d=google.com; s=arc-20160816; b=Uq1GaXYixrIWyzG69hU+pp0UARB8TLDDGlH4kT5rxdb598o6+5Z+yoAY272xR7aZJu TzSdcwfA9xg1C6ZmKDle3MZ3p8ofYNE1Vd3OrwRXDmn+A/y+nD9tNaS/68CVRjRP/GfQ Opog9qi43iw1TGQmrjm5X9gM2RQLkg/LwYW+0XuJKF5OC0g5WGwKdHAWMtOukXxQ0/9a +8t9z+CS5f9eDLXfBIcabl1TwG54Wvcvn94+T432yBmyWBF/n+vmN1d59C1m+rOoFcv/ JeICNHyvV0kk3uD0Wu49nctrv7+XKsy+e6hGg7qftK7cjo02MgFdD9dbN5AGej+Jm3k4 RAUw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=imBhTPeE55KRGr89K7NYgZOnu3GLxSpnI3jmd9wsFqk=; b=c9mK+OLEw9YWQ0EAZjbC8VrtpDzt1quqFx2TgPbbJrf7fKfu9zYzIVk9fjrGs0gJPf JdKJ0NAXxO754X8L0XktpRKi0nAlmodPqDZERPoVe7Qsg05yTM4Ju66aiweE/OonQ9BJ SgcugCHkrwE/FyAjvHpA5+RhoxFetbFdYOdb7yGEaS27lf1bUnwbflGzz+fwdEFvJiPE 2IluZ6crdtmhsFgBZkPl5qb/PwwT70f0XcIN0hxPJEkhpDOeSAif4775fG7+T1VUITJD vIg9YAVVucxm5xcrHUEB8j5ZXKmPgzQONHxg+607QqjoZ8k2ZFqQvnpzEaCBfGXhIf6g OU0A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 39-v6si12119769plc.515.2018.05.02.11.23.33; Wed, 02 May 2018 11:23:47 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751528AbeEBSWg (ORCPT + 99 others); Wed, 2 May 2018 14:22:36 -0400 Received: from smtp3.ccs.ornl.gov ([160.91.203.39]:55674 "EHLO smtp3.ccs.ornl.gov" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751279AbeEBSV4 (ORCPT ); Wed, 2 May 2018 14:21:56 -0400 Received: from star.ccs.ornl.gov (star.ccs.ornl.gov [160.91.202.134]) by smtp3.ccs.ornl.gov (Postfix) with ESMTP id ADE6AE20; Wed, 2 May 2018 14:21:51 -0400 (EDT) Received: by star.ccs.ornl.gov (Postfix, from userid 2004) id A9CF2D95; Wed, 2 May 2018 14:21:51 -0400 (EDT) From: James Simmons To: Greg Kroah-Hartman , devel@driverdev.osuosl.org, Andreas Dilger , Oleg Drokin , Lai Siyao , Jinshan Xiong , NeilBrown Cc: Linux Kernel Mailing List , Lustre Development List , Hongchao Zhang , James Simmons Subject: [PATCH 3/4] staging: lustre: obdclass: guarantee all keys filled Date: Wed, 2 May 2018 14:21:47 -0400 Message-Id: <1525285308-15347-4-git-send-email-jsimmons@infradead.org> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1525285308-15347-1-git-send-email-jsimmons@infradead.org> References: <1525285308-15347-1-git-send-email-jsimmons@infradead.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Hongchao Zhang In keys_fill, the key_set_version could be changed after the keys are filled, then the keys in this context won't be refilled by the following lu_context_refill for its version is equal to the current key_set_version. In lu_context_refill, the key_set_version should be protected before comparing it to version stored in the lu_context. Signed-off-by: Hongchao Zhang Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-8346 Reviewed-on: https://review.whamcloud.com/26099 Reviewed-on: https://review.whamcloud.com/27448 Reviewed-on: https://review.whamcloud.com/27994 Reviewed-by: Patrick Farrell Reviewed-by: Jinshan Xiong Reviewed-by: Mike Pershin Reviewed-by: Fan Yong Reviewed-by: Oleg Drokin Signed-off-by: James Simmons --- drivers/staging/lustre/lustre/obdclass/lu_object.c | 29 +++++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/drivers/staging/lustre/lustre/obdclass/lu_object.c b/drivers/staging/lustre/lustre/obdclass/lu_object.c index 4e4dd58..8b507f1 100644 --- a/drivers/staging/lustre/lustre/obdclass/lu_object.c +++ b/drivers/staging/lustre/lustre/obdclass/lu_object.c @@ -1386,8 +1386,8 @@ void lu_context_key_degister(struct lu_context_key *key) lu_context_key_quiesce(key); - ++key_set_version; write_lock(&lu_keys_guard); + ++key_set_version; key_fini(&lu_shrink_env.le_ctx, key->lct_index); /** @@ -1546,15 +1546,18 @@ void lu_context_key_quiesce(struct lu_context_key *key) list_for_each_entry(ctx, &lu_context_remembered, lc_remember) key_fini(ctx, key->lct_index); - write_unlock(&lu_keys_guard); + ++key_set_version; + write_unlock(&lu_keys_guard); } } void lu_context_key_revive(struct lu_context_key *key) { + write_lock(&lu_keys_guard); key->lct_tags &= ~LCT_QUIESCENT; ++key_set_version; + write_unlock(&lu_keys_guard); } static void keys_fini(struct lu_context *ctx) @@ -1573,6 +1576,7 @@ static void keys_fini(struct lu_context *ctx) static int keys_fill(struct lu_context *ctx) { + unsigned int pre_version; unsigned int i; /* @@ -1586,8 +1590,10 @@ static int keys_fill(struct lu_context *ctx) */ read_lock(&lu_keys_guard); atomic_inc(&lu_key_initing_cnt); + pre_version = key_set_version; read_unlock(&lu_keys_guard); +refill: LINVRNT(ctx->lc_value); for (i = 0; i < ARRAY_SIZE(lu_keys); ++i) { struct lu_context_key *key; @@ -1628,9 +1634,17 @@ static int keys_fill(struct lu_context *ctx) if (key->lct_exit) ctx->lc_tags |= LCT_HAS_EXIT; } - ctx->lc_version = key_set_version; } + + read_lock(&lu_keys_guard); + if (pre_version != key_set_version) { + pre_version = key_set_version; + read_unlock(&lu_keys_guard); + goto refill; + } + ctx->lc_version = key_set_version; atomic_dec(&lu_key_initing_cnt); + read_unlock(&lu_keys_guard); return 0; } @@ -1739,7 +1753,14 @@ void lu_context_exit(struct lu_context *ctx) */ int lu_context_refill(struct lu_context *ctx) { - return likely(ctx->lc_version == key_set_version) ? 0 : keys_fill(ctx); + read_lock(&lu_keys_guard); + if (likely(ctx->lc_version == key_set_version)) { + read_unlock(&lu_keys_guard); + return 0; + } + + read_unlock(&lu_keys_guard); + return keys_fill(ctx); } /** -- 1.8.3.1