From mboxrd@z Thu Jan 1 00:00:00 1970 From: Steven Whitehouse Date: Tue, 10 Apr 2012 20:02:43 +0100 Subject: [Cluster-devel] [GFS2 PATCH] [TRY 3] GFS2: Instruct DLM to avoid queue convert slowdown In-Reply-To: <5e670c14-e0f3-43d3-8728-a24159d586ed@zmail12.collab.prod.int.phx2.redhat.com> References: <5e670c14-e0f3-43d3-8728-a24159d586ed@zmail12.collab.prod.int.phx2.redhat.com> Message-ID: <1334084563.2701.29.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, Thanks - that looks good. I'll add it to the queue as soon as the DLM patch has made it to the required state too, Steve. On Tue, 2012-04-10 at 14:45 -0400, Bob Peterson wrote: > ----- Original Message ----- > | why not just test the flag bit here? > | > | Otherwise looks good, > | > | Steve. > > Hi, > > Silly me. Good catch. It's been a long day. Sigh. > > 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..5f5e70e 100644 > --- a/fs/gfs2/lock_dlm.c > +++ b/fs/gfs2/lock_dlm.c > @@ -200,10 +200,11 @@ 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; > > if (gfs_flags & LM_FLAG_TRY) > lkf |= DLM_LKF_NOQUEUE; > @@ -227,8 +228,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 (test_bit(GLF_BLOCKING, &gl->gl_flags)) > + lkf |= DLM_LKF_QUECVT; > + } > > return lkf; > } > @@ -250,7 +254,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) {