[Ocfs2-devel] [PATCH] Wakeup down-convert thread just after clearing OCFS2_LOCK_UPCONVERT_FINISHING -v2

Wengang Wang wen.gang.wang at oracle.com
Wed Sep 14 20:10:18 PDT 2011


On 11-09-14 19:46, Sunil Mushran wrote:
> A better description would be:
> =====================================
> When the lockres state UPCONVERT_FINISHING is cleared,
> we should wake up the downconvert thread incase that lockres
> is in the blocked queue. Currently we are not doing so and thus
> are at the mercy of another event waking up the dc thread.
> ======================================
> 
> With that in mind, can you do the following with the lock...
> 
> kick = (lockres->l_flags & OCFS2_LOCK_BLOCKED);

If we have to check this, is checking on OCFS2_LOCK_QUEUED better than on OCFS2_LOCK_BLOCKED?
next drop will come with checking on OCFS2_LOCK_QUEUED.

thanks,
wengang.
> 
> ...
> 
> and this at the end of both functions.
> 
> if (kick)
>      ocfs2_wake_downconvert_thread(ocfs2_get_lockres_osb(lockres));
> 
> Be careful in cluster_lock.
> 
> On 09/14/2011 07:06 PM, Wengang Wang wrote:
> >In down convert thread, when the ocfs2_lock_res is in OCFS2_LOCK_UPCONVERT_FINISHING
> >state, it is requeued for next run of ocfs2_downconvert_thread_do_work(). If not
> >waked up, the DC thread just sleep there without even there are ocfs2_lock_res' left
> >in the list.
> >
> >So when clearing the OCFS2_LOCK_UPCONVERT_FINISHING flag, we need also to wake up dc
> >thread accordingly.
> >
> >Signed-off-by: Wengang Wang<wen.gang.wang at oracle.com>
> >---
> >  fs/ocfs2/dlmglue.c |    2 ++
> >  1 files changed, 2 insertions(+), 0 deletions(-)
> >
> >diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c
> >index 7642d7c..a2e8278 100644
> >--- a/fs/ocfs2/dlmglue.c
> >+++ b/fs/ocfs2/dlmglue.c
> >@@ -1206,6 +1206,7 @@ static inline void ocfs2_recover_from_dlm_error(struct ocfs2_lock_res *lockres,
> >  	spin_unlock_irqrestore(&lockres->l_lock, flags);
> >
> >  	wake_up(&lockres->l_event);
> >+	ocfs2_wake_downconvert_thread(ocfs2_get_lockres_osb(lockres));
> >  }
> >
> >  /* Note: If we detect another process working on the lock (i.e.,
> >@@ -1502,6 +1503,7 @@ unlock:
> >  	lockres_clear_flags(lockres, OCFS2_LOCK_UPCONVERT_FINISHING);
> >
> >  	spin_unlock_irqrestore(&lockres->l_lock, flags);
> >+	ocfs2_wake_downconvert_thread(osb);
> >  out:
> >  	/*
> >  	 * This is helping work around a lock inversion between the page lock
> 



More information about the Ocfs2-devel mailing list