From: Xue jiufei <xuejiufei@huawei.com>
To: ocfs2-devel@oss.oracle.com
Subject: [Ocfs2-devel] [patch 4/8] ocfs2/dlm: do not purge lockres that is queued for assert master
Date: Mon, 16 Jun 2014 09:26:53 +0800 [thread overview]
Message-ID: <539E47DD.3070002@huawei.com> (raw)
In-Reply-To: <20140613213144.GM5484@wotan.suse.de>
On 2014/6/14 5:31, Mark Fasheh wrote:
> On Mon, Jun 09, 2014 at 01:04:03PM -0700, Andrew Morton wrote:
>> @@ -683,6 +684,43 @@ void dlm_lockres_drop_inflight_ref(struc
>> wake_up(&res->wq);
>> }
>>
>> +void __dlm_lockres_grab_inflight_worker(struct dlm_ctxt *dlm,
>> + struct dlm_lock_resource *res)
>> +{
>> + assert_spin_locked(&res->spinlock);
>> + res->inflight_assert_workers++;
>> + mlog(0, "%s:%.*s: inflight assert worker++: now %u\n",
>> + dlm->name, res->lockname.len, res->lockname.name,
>> + res->inflight_assert_workers);
>> +}
>> +
>> +void dlm_lockres_grab_inflight_worker(struct dlm_ctxt *dlm,
>> + struct dlm_lock_resource *res)
>> +{
>> + spin_lock(&res->spinlock);
>> + __dlm_lockres_grab_inflight_worker(dlm, res);
>> + spin_unlock(&res->spinlock);
>> +}
>> +
>> +void __dlm_lockres_drop_inflight_worker(struct dlm_ctxt *dlm,
>> + struct dlm_lock_resource *res)
>> +{
>> + assert_spin_locked(&res->spinlock);
>> + BUG_ON(res->inflight_assert_workers == 0);
>> + res->inflight_assert_workers--;
>> + mlog(0, "%s:%.*s: inflight assert worker--: now %u\n",
>> + dlm->name, res->lockname.len, res->lockname.name,
>> + res->inflight_assert_workers);
>> +}
>> +
>> +void dlm_lockres_drop_inflight_worker(struct dlm_ctxt *dlm,
>> + struct dlm_lock_resource *res)
>> +{
>> + spin_lock(&res->spinlock);
>> + __dlm_lockres_drop_inflight_worker(dlm, res);
>> + spin_unlock(&res->spinlock);
>> +}
>> +
>> /*
>> * lookup a lock resource by name.
>> * may already exist in the hashtable.
>> @@ -1603,7 +1641,8 @@ send_response:
>> mlog(ML_ERROR, "failed to dispatch assert master work\n");
>> response = DLM_MASTER_RESP_ERROR;
>> dlm_lockres_put(res);
>> - }
>> + } else
>> + dlm_lockres_grab_inflight_worker(dlm, res);
>> } else {
>> if (res)
>> dlm_lockres_put(res);
>> @@ -2118,6 +2157,8 @@ static void dlm_assert_master_worker(str
>> dlm_lockres_release_ast(dlm, res);
>>
>> put:
>> + dlm_lockres_drop_inflight_worker(dlm, res);
>> +
>> dlm_lockres_put(res);
>>
>> mlog(0, "finished with dlm_assert_master_worker\n");
>> diff -puN fs/ocfs2/dlm/dlmrecovery.c~ocfs2-dlm-do-not-purge-lockres-that-is-queued-for-assert-master fs/ocfs2/dlm/dlmrecovery.c
>> --- a/fs/ocfs2/dlm/dlmrecovery.c~ocfs2-dlm-do-not-purge-lockres-that-is-queued-for-assert-master
>> +++ a/fs/ocfs2/dlm/dlmrecovery.c
>> @@ -1708,7 +1708,8 @@ int dlm_master_requery_handler(struct o2
>> mlog_errno(-ENOMEM);
>> /* retry!? */
>> BUG();
>> - }
>> + } else
>> + __dlm_lockres_grab_inflight_worker(dlm, res);
>> } else /* put.. incase we are not the master */
>> dlm_lockres_put(res);
>> spin_unlock(&res->spinlock);
>> diff -puN fs/ocfs2/dlm/dlmthread.c~ocfs2-dlm-do-not-purge-lockres-that-is-queued-for-assert-master fs/ocfs2/dlm/dlmthread.c
>> --- a/fs/ocfs2/dlm/dlmthread.c~ocfs2-dlm-do-not-purge-lockres-that-is-queued-for-assert-master
>> +++ a/fs/ocfs2/dlm/dlmthread.c
>> @@ -259,11 +259,14 @@ static void dlm_run_purge_list(struct dl
>> * refs on it. */
>> unused = __dlm_lockres_unused(lockres);
>> if (!unused ||
>> - (lockres->state & DLM_LOCK_RES_MIGRATING)) {
>> + (lockres->state & DLM_LOCK_RES_MIGRATING) ||
>> + (lockres->inflight_assert_workers != 0)) {
>
> If there's any assert master message we will halt purging *all* lock
> resources. That seems extreme to me :/
>
Not halt purging *all* lock resource, when one lockres is queued for
master assert, it will be moved to the tail of the purge list, so
dlm_thread can keep purging other lock resources.
-- joyce.xue
> What about putting a flag on lockres->state to indicate that it's got some
> work queued? We would set it before queuing the work, then clear it in the
> worker, or if we ever cancel the work.
> --Mark
>
> --
> Mark Fasheh
> .
>
next prev parent reply other threads:[~2014-06-16 1:26 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-09 20:04 [Ocfs2-devel] [patch 4/8] ocfs2/dlm: do not purge lockres that is queued for assert master akpm at linux-foundation.org
2014-06-13 21:31 ` Mark Fasheh
2014-06-16 1:26 ` Xue jiufei [this message]
2014-06-20 22:33 ` Andrew Morton
2014-06-20 22:49 ` Mark Fasheh
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=539E47DD.3070002@huawei.com \
--to=xuejiufei@huawei.com \
--cc=ocfs2-devel@oss.oracle.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.