From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751254AbdK1F0r convert rfc822-to-8bit (ORCPT ); Tue, 28 Nov 2017 00:26:47 -0500 Received: from prv-mh.provo.novell.com ([137.65.248.74]:60153 "EHLO prv-mh.provo.novell.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750793AbdK1F0p (ORCPT ); Tue, 28 Nov 2017 00:26:45 -0500 Message-Id: <5A1D640C020000F90009ACC8@prv-mh.provo.novell.com> X-Mailer: Novell GroupWise Internet Agent 14.2.2 Date: Mon, 27 Nov 2017 22:26:36 -0700 From: "Gang He" To: , , , "Goldwyn Rodrigues" , Cc: , Subject: Re: [Ocfs2-devel] [PATCH 1/3] ocfs2: add ocfs2_try_rw_lock and ocfs2_try_inode_lock References: <1511775987-841-1-git-send-email-ghe@suse.com> <1511775987-841-2-git-send-email-ghe@suse.com> <63ADC13FD55D6546B7DECE290D39E373F146F95E@H3CMLB12-EX.srv.huawei-3com.com> In-Reply-To: <63ADC13FD55D6546B7DECE290D39E373F146F95E@H3CMLB12-EX.srv.huawei-3com.com> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 8BIT Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 >> --- >> 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, >> From mboxrd@z Thu Jan 1 00:00:00 1970 From: Gang He Date: Mon, 27 Nov 2017 22:26:36 -0700 Subject: [Ocfs2-devel] [PATCH 1/3] ocfs2: add ocfs2_try_rw_lock and ocfs2_try_inode_lock In-Reply-To: <63ADC13FD55D6546B7DECE290D39E373F146F95E@H3CMLB12-EX.srv.huawei-3com.com> References: <1511775987-841-1-git-send-email-ghe@suse.com> <1511775987-841-2-git-send-email-ghe@suse.com> <63ADC13FD55D6546B7DECE290D39E373F146F95E@H3CMLB12-EX.srv.huawei-3com.com> Message-ID: <5A1D640C020000F90009ACC8@prv-mh.provo.novell.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: jlbec@evilplan.org, ge.changwei@h3c.com, hch@lst.de, Goldwyn Rodrigues , mfasheh@versity.com Cc: ocfs2-devel@oss.oracle.com, linux-kernel@vger.kernel.org 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 >> --- >> 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, >>