[lustre-devel] [PATCH 9/9] lustre: statahead: add smp_mb() to serialize ops
James Simmons
jsimmons at infradead.org
Sun Nov 25 18:10:26 PST 2018
> From: Lai Siyao <lai.siyao at intel.com>
>
> 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.
Reviewed-by: James Simmons <jsimmons at infradead.org>
> Signed-off-by: Lai Siyao <lai.siyao at intel.com>
> WC-bug-id: https://jira.whamcloud.com/browse/LU-7994
> Reviewed-on: https://review.whamcloud.com/23040
> Reviewed-by: Fan Yong <fan.yong at intel.com>
> Reviewed-by: Bobi Jam <bobijam at hotmail.com>
> Reviewed-by: Oleg Drokin <oleg.drokin at intel.com>
> Signed-off-by: NeilBrown <neilb at suse.com>
> ---
> 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);
> }
>
>
>
More information about the lustre-devel
mailing list