From mboxrd@z Thu Jan 1 00:00:00 1970 From: Steven Whitehouse Date: Tue, 10 Apr 2012 19:21:17 +0100 Subject: [Cluster-devel] [GFS2 PATCH] [TRY 2] GFS2: Instruct DLM to avoid queue convert slowdown In-Reply-To: References: Message-ID: <1334082077.2701.28.camel@menhir> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hi, On Tue, 2012-04-10 at 14:13 -0400, Bob Peterson wrote: > Hi, > > Here is my revised patch based on Steve's suggestion to base the > flag on the recent GLF_BLOCKING flag. > > We still need to keep this on hold until the prerequisite dlm patch > is properly upstream. > > Regards, > > Bob Peterson > Red Hat File Systems > > Signed-off-by: Bob Peterson > --- > Author: Bob Peterson > Date: Tue Apr 10 14:08:11 2012 -0500 > > GFS2: Instruct DLM to avoid queue convert slowdowns > > This patch instructs DLM to prevent an "in place" conversion, where the > lock just stays on the granted queue, and instead forces the conversion to > the back of the convert queue. This is done on upward conversions only. > > This is useful in cases where, for example, a lock is frequently needed in > PR on one node, but another node needs it temporarily in EX to update it. > This may happen, for example, when the rindex is being updated by gfs2_grow. > The gfs2_grow needs to have the lock in EX, but the other nodes need to > re-read it to retrieve the updates. The glock is already granted in PR on > the non-growing nodes, so this prevents them from continually re-granting > the lock in PR, and forces the EX from gfs2_grow to go through. > > diff --git a/fs/gfs2/lock_dlm.c b/fs/gfs2/lock_dlm.c > index f8411bd..ed9c5ca 100644 > --- a/fs/gfs2/lock_dlm.c > +++ b/fs/gfs2/lock_dlm.c > @@ -200,11 +200,15 @@ static int make_mode(const unsigned int lmstate) > return -1; > } > > -static u32 make_flags(const u32 lkid, const unsigned int gfs_flags, > +static u32 make_flags(struct gfs2_glock *gl, const unsigned int gfs_flags, > const int req) > { > u32 lkf = DLM_LKF_VALBLK; > + u32 lkid = gl->gl_lksb.sb_lkid; > + int is_upconvert = 0; > > + if (test_bit(GLF_BLOCKING, &gl->gl_flags)) > + is_upconvert = 1; Rather than create this is_upconvert variable here... > if (gfs_flags & LM_FLAG_TRY) > lkf |= DLM_LKF_NOQUEUE; > > @@ -227,8 +231,11 @@ static u32 make_flags(const u32 lkid, const unsigned int gfs_flags, > BUG(); > } > > - if (lkid != 0) > + if (lkid != 0) { > lkf |= DLM_LKF_CONVERT; > + if (is_upconvert) why not just test the flag bit here? Otherwise looks good, Steve. > + lkf |= DLM_LKF_QUECVT; > + } > > return lkf; > } > @@ -250,7 +257,7 @@ static int gdlm_lock(struct gfs2_glock *gl, unsigned int req_state, > char strname[GDLM_STRNAME_BYTES] = ""; > > req = make_mode(req_state); > - lkf = make_flags(gl->gl_lksb.sb_lkid, flags, req); > + lkf = make_flags(gl, flags, req); > gfs2_glstats_inc(gl, GFS2_LKS_DCOUNT); > gfs2_sbstats_inc(gl, GFS2_LKS_DCOUNT); > if (gl->gl_lksb.sb_lkid) { >