Wakeup down-convert thread just after clearing OCFS2_LOCK_UPCONVERT_FINISHING -v2
PATCH 1/1 Wakeup down-convert thread just after clearing OCFS2_LOCK_UPCONVERT_FINISHING -v2
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.
--- fs/ocfs2/dlmglue.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)
fs/ocfs2/dlmglue.c +2 -0
@@ -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
Signature · 1 line
1.7.5.2
PATCH 1/1 Wakeup down-convert thread just after clearing OCFS2_LOCK_UPCONVERT_FINISHING -v2
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);
...
and this at the end of both functions.
if (kick)
ocfs2_wake_downconvert_thread(ocfs2_get_lockres_osb(lockres));
Be careful in cluster_lock.
Quoted 33 lines · Wengang Wang
In down convert thread, when the
ocfs2_lock_resis inOCFS2_LOCK_UPCONVERT_FINISHINGstate, it is requeued for next run ofocfs2_downconvert_thread_do_work(). If not waked up, the DC thread just sleep there without even there areocfs2_lock_res' left in the list.So when clearing the
OCFS2_LOCK_UPCONVERT_FINISHINGflag, we need also to wake up dc thread accordingly.Signed-off-by Wengang Wang<[email protected]>--- fs/ocfs2/dlmglue.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)fs/ocfs2/dlmglue.c +2
-0@@ -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
PATCH 1/1 Wakeup down-convert thread just after clearing OCFS2_LOCK_UPCONVERT_FINISHING -v2
Quoted 11 lines · Sunil Mushran
A better description would be:
=====================================
When the lockres stateUPCONVERT_FINISHINGis 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.
Quoted 45 lines
...
and this at the end of both functions.
if (kick)
ocfs2_wake_downconvert_thread(ocfs2_get_lockres_osb(lockres));Be careful in
cluster_lock.Quoted 33 lines · Wengang Wang
In down convert thread, when the
ocfs2_lock_resis inOCFS2_LOCK_UPCONVERT_FINISHINGstate, it is requeued for next run ofocfs2_downconvert_thread_do_work(). If not waked up, the DC thread just sleep there without even there areocfs2_lock_res' left in the list.So when clearing the
OCFS2_LOCK_UPCONVERT_FINISHINGflag, we need also to wake up dc thread accordingly.Signed-off-by Wengang Wang<[email protected]>--- fs/ocfs2/dlmglue.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)fs/ocfs2/dlmglue.c +2
-0@@ -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