From: "Gang He" <ghe@suse.com> To: <jlbec@evilplan.org>, <ge.changwei@h3c.com>, <hch@lst.de>, "Goldwyn Rodrigues" <RGoldwyn@suse.com>, <mfasheh@versity.com> Cc: <ocfs2-devel@oss.oracle.com>, <linux-kernel@vger.kernel.org> Subject: Re: [Ocfs2-devel] [PATCH 1/3] ocfs2: add ocfs2_try_rw_lock and ocfs2_try_inode_lock Date: Mon, 27 Nov 2017 22:26:36 -0700 [thread overview] Message-ID: <5A1D640C020000F90009ACC8@prv-mh.provo.novell.com> (raw) In-Reply-To: <63ADC13FD55D6546B7DECE290D39E373F146F95E@H3CMLB12-EX.srv.huawei-3com.com> Hello Changwei, >>> > Hi Gang, > > On 2017/11/27 17:48, Gang He wrote: >> Add ocfs2_try_rw_lock and ocfs2_try_inode_lock functions, which >> will be used in non-block IO scenarios. >> >> Signed-off-by: Gang He <ghe@suse.com> >> --- >> fs/ocfs2/dlmglue.c | 22 ++++++++++++++++++++++ >> fs/ocfs2/dlmglue.h | 4 ++++ >> 2 files changed, 26 insertions(+) >> >> diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c >> index 4689940..5cfbd04 100644 >> --- a/fs/ocfs2/dlmglue.c >> +++ b/fs/ocfs2/dlmglue.c >> @@ -1742,6 +1742,28 @@ int ocfs2_rw_lock(struct inode *inode, int write) >> return status; >> } >> >> +int ocfs2_try_rw_lock(struct inode *inode, int write) >> +{ >> + int status, level; >> + struct ocfs2_lock_res *lockres; >> + struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); >> + >> + mlog(0, "inode %llu try to take %s RW lock\n", >> + (unsigned long long)OCFS2_I(inode)->ip_blkno, >> + write ? "EXMODE" : "PRMODE"); >> + >> + if (ocfs2_mount_local(osb)) >> + return 0; >> + >> + lockres = &OCFS2_I(inode)->ip_rw_lockres; >> + >> + level = write ? DLM_LOCK_EX : DLM_LOCK_PR; >> + >> + status = ocfs2_cluster_lock(OCFS2_SB(inode->i_sb), lockres, level, >> + DLM_LKF_NOQUEUE, 0); >> + return status; >> +} > > The newly added function ocfs2_try_rw_lock almost has the same logic > with ocfs2_rw_lock.Is it possible to combine them into an unique one? > That will be more elegant. I prefer to keep ocfs2_try_rw_lock() separately, since there has been the similar function/code here (e.g. ocfs2_try_open_lock). second, adding a new ocfs2_try_rw_lock() function can avoid impact the existing code. > > Moreover, can you elaborate further why we need a *NOQUEUE* lock for > supporting non-block aio? Non-block IO means that the invoking should return with -EAGAIN instead of being blocked to wait for certain resource (e.g. lock, block allocation, etc.). > > Why can't we wait for a while to grant a lock request? Is this necessary? Non-block IO is a way for the upper application to submit IO, if the invoking will be blocked, the invoking will failed with -EAGAIN, then, the upper application will submit this IO with the normal (block mode) way in a delayed thread, this IO mode will benefit some database application. > > Thanks, > Changwei > >> + >> void ocfs2_rw_unlock(struct inode *inode, int write) >> { >> int level = write ? DLM_LOCK_EX : DLM_LOCK_PR; >> diff --git a/fs/ocfs2/dlmglue.h b/fs/ocfs2/dlmglue.h >> index a7fc18b..05910fc 100644 >> --- a/fs/ocfs2/dlmglue.h >> +++ b/fs/ocfs2/dlmglue.h >> @@ -116,6 +116,7 @@ void ocfs2_refcount_lock_res_init(struct ocfs2_lock_res > *lockres, >> int ocfs2_create_new_inode_locks(struct inode *inode); >> int ocfs2_drop_inode_locks(struct inode *inode); >> int ocfs2_rw_lock(struct inode *inode, int write); >> +int ocfs2_try_rw_lock(struct inode *inode, int write); >> void ocfs2_rw_unlock(struct inode *inode, int write); >> int ocfs2_open_lock(struct inode *inode); >> int ocfs2_try_open_lock(struct inode *inode, int write); >> @@ -140,6 +141,9 @@ int ocfs2_inode_lock_with_page(struct inode *inode, >> /* 99% of the time we don't want to supply any additional flags -- >> * those are for very specific cases only. */ >> #define ocfs2_inode_lock(i, b, e) ocfs2_inode_lock_full_nested(i, b, e, 0, > OI_LS_NORMAL) >> +#define ocfs2_try_inode_lock(i, b, e)\ >> + ocfs2_inode_lock_full_nested(i, b, e, OCFS2_META_LOCK_NOQUEUE,\ >> + OI_LS_NORMAL) >> void ocfs2_inode_unlock(struct inode *inode, >> int ex); >> int ocfs2_super_lock(struct ocfs2_super *osb, >>
WARNING: multiple messages have this Message-ID (diff)
From: Gang He <ghe@suse.com> To: jlbec@evilplan.org, ge.changwei@h3c.com, hch@lst.de, Goldwyn Rodrigues <RGoldwyn@suse.com>, mfasheh@versity.com Cc: ocfs2-devel@oss.oracle.com, linux-kernel@vger.kernel.org Subject: [Ocfs2-devel] [PATCH 1/3] ocfs2: add ocfs2_try_rw_lock and ocfs2_try_inode_lock Date: Mon, 27 Nov 2017 22:26:36 -0700 [thread overview] Message-ID: <5A1D640C020000F90009ACC8@prv-mh.provo.novell.com> (raw) In-Reply-To: <63ADC13FD55D6546B7DECE290D39E373F146F95E@H3CMLB12-EX.srv.huawei-3com.com> Hello Changwei, >>> > Hi Gang, > > On 2017/11/27 17:48, Gang He wrote: >> Add ocfs2_try_rw_lock and ocfs2_try_inode_lock functions, which >> will be used in non-block IO scenarios. >> >> Signed-off-by: Gang He <ghe@suse.com> >> --- >> fs/ocfs2/dlmglue.c | 22 ++++++++++++++++++++++ >> fs/ocfs2/dlmglue.h | 4 ++++ >> 2 files changed, 26 insertions(+) >> >> diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c >> index 4689940..5cfbd04 100644 >> --- a/fs/ocfs2/dlmglue.c >> +++ b/fs/ocfs2/dlmglue.c >> @@ -1742,6 +1742,28 @@ int ocfs2_rw_lock(struct inode *inode, int write) >> return status; >> } >> >> +int ocfs2_try_rw_lock(struct inode *inode, int write) >> +{ >> + int status, level; >> + struct ocfs2_lock_res *lockres; >> + struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); >> + >> + mlog(0, "inode %llu try to take %s RW lock\n", >> + (unsigned long long)OCFS2_I(inode)->ip_blkno, >> + write ? "EXMODE" : "PRMODE"); >> + >> + if (ocfs2_mount_local(osb)) >> + return 0; >> + >> + lockres = &OCFS2_I(inode)->ip_rw_lockres; >> + >> + level = write ? DLM_LOCK_EX : DLM_LOCK_PR; >> + >> + status = ocfs2_cluster_lock(OCFS2_SB(inode->i_sb), lockres, level, >> + DLM_LKF_NOQUEUE, 0); >> + return status; >> +} > > The newly added function ocfs2_try_rw_lock almost has the same logic > with ocfs2_rw_lock.Is it possible to combine them into an unique one? > That will be more elegant. I prefer to keep ocfs2_try_rw_lock() separately, since there has been the similar function/code here (e.g. ocfs2_try_open_lock). second, adding a new ocfs2_try_rw_lock() function can avoid impact the existing code. > > Moreover, can you elaborate further why we need a *NOQUEUE* lock for > supporting non-block aio? Non-block IO means that the invoking should return with -EAGAIN instead of being blocked to wait for certain resource (e.g. lock, block allocation, etc.). > > Why can't we wait for a while to grant a lock request? Is this necessary? Non-block IO is a way for the upper application to submit IO, if the invoking will be blocked, the invoking will failed with -EAGAIN, then, the upper application will submit this IO with the normal (block mode) way in a delayed thread, this IO mode will benefit some database application. > > Thanks, > Changwei > >> + >> void ocfs2_rw_unlock(struct inode *inode, int write) >> { >> int level = write ? DLM_LOCK_EX : DLM_LOCK_PR; >> diff --git a/fs/ocfs2/dlmglue.h b/fs/ocfs2/dlmglue.h >> index a7fc18b..05910fc 100644 >> --- a/fs/ocfs2/dlmglue.h >> +++ b/fs/ocfs2/dlmglue.h >> @@ -116,6 +116,7 @@ void ocfs2_refcount_lock_res_init(struct ocfs2_lock_res > *lockres, >> int ocfs2_create_new_inode_locks(struct inode *inode); >> int ocfs2_drop_inode_locks(struct inode *inode); >> int ocfs2_rw_lock(struct inode *inode, int write); >> +int ocfs2_try_rw_lock(struct inode *inode, int write); >> void ocfs2_rw_unlock(struct inode *inode, int write); >> int ocfs2_open_lock(struct inode *inode); >> int ocfs2_try_open_lock(struct inode *inode, int write); >> @@ -140,6 +141,9 @@ int ocfs2_inode_lock_with_page(struct inode *inode, >> /* 99% of the time we don't want to supply any additional flags -- >> * those are for very specific cases only. */ >> #define ocfs2_inode_lock(i, b, e) ocfs2_inode_lock_full_nested(i, b, e, 0, > OI_LS_NORMAL) >> +#define ocfs2_try_inode_lock(i, b, e)\ >> + ocfs2_inode_lock_full_nested(i, b, e, OCFS2_META_LOCK_NOQUEUE,\ >> + OI_LS_NORMAL) >> void ocfs2_inode_unlock(struct inode *inode, >> int ex); >> int ocfs2_super_lock(struct ocfs2_super *osb, >>
next prev parent reply other threads:[~2017-11-28 5:26 UTC|newest] Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-11-27 9:46 [PATCH 0/3] ocfs2: add nowait aio support Gang He 2017-11-27 9:46 ` [Ocfs2-devel] " Gang He 2017-11-27 9:46 ` [PATCH 1/3] ocfs2: add ocfs2_try_rw_lock and ocfs2_try_inode_lock Gang He 2017-11-27 9:46 ` [Ocfs2-devel] " Gang He 2017-11-28 1:32 ` piaojun 2017-11-28 1:32 ` piaojun 2017-11-28 5:05 ` Gang He 2017-11-28 5:05 ` Gang He 2017-11-28 1:52 ` Changwei Ge 2017-11-28 1:52 ` Changwei Ge 2017-11-28 5:26 ` Gang He [this message] 2017-11-28 5:26 ` Gang He 2017-11-27 9:46 ` [PATCH 2/3] ocfs2: add ocfs2_overwrite_io function Gang He 2017-11-27 9:46 ` [Ocfs2-devel] " Gang He 2017-11-28 1:13 ` Joseph Qi 2017-11-28 1:13 ` Joseph Qi 2017-11-28 3:35 ` Gang He 2017-11-28 3:35 ` Gang He 2017-11-28 6:51 ` Joseph Qi 2017-11-28 6:51 ` Joseph Qi 2017-11-28 7:24 ` Gang He 2017-11-28 7:24 ` Gang He 2017-11-28 8:40 ` Joseph Qi 2017-11-28 8:40 ` Joseph Qi 2017-11-28 8:54 ` Gang He 2017-11-28 8:54 ` Gang He 2017-11-28 9:03 ` Joseph Qi 2017-11-28 9:03 ` Joseph Qi 2017-11-28 1:50 ` piaojun 2017-11-28 1:50 ` piaojun 2017-11-28 2:10 ` Changwei Ge 2017-11-28 2:10 ` Changwei Ge 2017-11-28 5:27 ` Gang He 2017-11-28 5:27 ` Gang He 2017-11-28 5:07 ` Gang He 2017-11-28 5:07 ` Gang He 2017-11-28 2:19 ` alex chen 2017-11-28 2:19 ` alex chen 2017-11-28 5:33 ` Gang He 2017-11-28 5:33 ` Gang He 2017-11-28 6:19 ` alex chen 2017-11-28 6:19 ` alex chen 2017-11-28 7:38 ` Gang He 2017-11-28 7:38 ` Gang He 2017-11-28 8:11 ` alex chen 2017-11-28 8:11 ` alex chen 2017-11-28 8:32 ` Gang He 2017-11-28 8:32 ` Gang He 2017-11-28 13:22 ` alex chen 2017-11-28 13:22 ` alex chen 2017-11-28 2:48 ` Changwei Ge 2017-11-28 2:48 ` Changwei Ge 2017-11-28 5:40 ` Gang He 2017-11-28 5:40 ` Gang He 2017-11-28 5:48 ` Changwei Ge 2017-11-28 5:48 ` Changwei Ge 2017-11-27 9:46 ` [PATCH 3/3] ocfs2: nowait aio support Gang He 2017-11-27 9:46 ` [Ocfs2-devel] " Gang He 2017-11-28 2:51 ` alex chen 2017-11-28 2:51 ` alex chen 2017-11-28 5:59 ` Gang He 2017-11-28 5:59 ` Gang He
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=5A1D640C020000F90009ACC8@prv-mh.provo.novell.com \ --to=ghe@suse.com \ --cc=RGoldwyn@suse.com \ --cc=ge.changwei@h3c.com \ --cc=hch@lst.de \ --cc=jlbec@evilplan.org \ --cc=linux-kernel@vger.kernel.org \ --cc=mfasheh@versity.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: linkBe 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.