From patchwork Fri Nov 23 07:15:28 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: NeilBrown X-Patchwork-Id: 10695087 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C665716B1 for ; Fri, 23 Nov 2018 07:19:51 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id ACA1E2B079 for ; Fri, 23 Nov 2018 07:19:51 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A0BB62BAE4; Fri, 23 Nov 2018 07:19:51 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from pdx1-mailman02.dreamhost.com (pdx1-mailman02.dreamhost.com [64.90.62.194]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 4A0E22B079 for ; Fri, 23 Nov 2018 07:19:51 +0000 (UTC) Received: from pdx1-mailman02.dreamhost.com (localhost [IPv6:::1]) by pdx1-mailman02.dreamhost.com (Postfix) with ESMTP id 0CF8321F6C1; Thu, 22 Nov 2018 23:19:51 -0800 (PST) X-Original-To: lustre-devel@lists.lustre.org Delivered-To: lustre-devel-lustre.org@pdx1-mailman02.dreamhost.com Received: from mx1.suse.de (mx2.suse.de [195.135.220.15]) by pdx1-mailman02.dreamhost.com (Postfix) with ESMTP id E473321F686 for ; Thu, 22 Nov 2018 23:19:48 -0800 (PST) X-Virus-Scanned: by amavisd-new at test-mx.suse.de X-Amavis-Alert: BAD HEADER SECTION, Duplicate header field: "Cc" Received: from relay1.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 0F68EAC70; Fri, 23 Nov 2018 07:19:48 +0000 (UTC) From: NeilBrown To: Andreas Dilger , James Simmons , Oleg Drokin Date: Fri, 23 Nov 2018 18:15:28 +1100 Message-ID: <154295732811.2850.6059970126126914084.stgit@noble> In-Reply-To: <154295730810.2850.961218355189474016.stgit@noble> References: <154295730810.2850.961218355189474016.stgit@noble> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Subject: [lustre-devel] [PATCH 9/9] lustre: statahead: add smp_mb() to serialize ops X-BeenThere: lustre-devel@lists.lustre.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "For discussing Lustre software development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Lai Siyao , Lustre Development List Errors-To: lustre-devel-bounces@lists.lustre.org Sender: "lustre-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Lai Siyao In ll_deauthorize_statahead(), it set thread stop flag, and then wake up thread, however wakeup is called inside spinlock in case ll_statahead_info is released, then we need to call smp_mb() to serialize setting and wakeup. Signed-off-by: Lai Siyao WC-bug-id: https://jira.whamcloud.com/browse/LU-7994 Reviewed-on: https://review.whamcloud.com/23040 Reviewed-by: Fan Yong Reviewed-by: Bobi Jam Reviewed-by: Oleg Drokin Signed-off-by: NeilBrown Reviewed-by: James Simmons --- drivers/staging/lustre/lustre/llite/statahead.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/drivers/staging/lustre/lustre/llite/statahead.c b/drivers/staging/lustre/lustre/llite/statahead.c index 3d71322aa1c7..24c2335c70a7 100644 --- a/drivers/staging/lustre/lustre/llite/statahead.c +++ b/drivers/staging/lustre/lustre/llite/statahead.c @@ -1110,8 +1110,9 @@ static int ll_statahead_thread(void *arg) sa_handle_callback(sai); set_current_state(TASK_IDLE); + /* ensure we see the NULL stored by ll_deauthorize_statahead() */ if (!sa_has_callback(sai) && - sai->sai_task) + smp_load_acquire(&sai->sai_task)) schedule(); __set_current_state(TASK_RUNNING); } @@ -1191,9 +1192,17 @@ void ll_deauthorize_statahead(struct inode *dir, void *key) /* * statahead thread may not quit yet because it needs to cache * entries, now it's time to tell it to quit. + * + * In case sai is released, wake_up() is called inside spinlock, + * so we use smp_store_release() to serialize ops. */ - wake_up_process(sai->sai_task); - sai->sai_task = NULL; + struct task_struct *task = sai->sai_task; + + /* ensure ll_statahead_thread sees the NULL before + * calling schedule() again. + */ + smp_store_release(&sai->sai_task, NULL); + wake_up_process(task); } spin_unlock(&lli->lli_sa_lock); }