From mboxrd@z Thu Jan 1 00:00:00 1970 From: NeilBrown Date: Fri, 23 Nov 2018 18:15:28 +1100 Subject: [lustre-devel] [PATCH 9/9] lustre: statahead: add smp_mb() to serialize ops In-Reply-To: <154295730810.2850.961218355189474016.stgit@noble> References: <154295730810.2850.961218355189474016.stgit@noble> Message-ID: <154295732811.2850.6059970126126914084.stgit@noble> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: lustre-devel@lists.lustre.org 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 --- 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); }