From: Bob Peterson <rpeterso@redhat.com>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] [PATCH 16/16] GFS2: Don't brelse rgrp buffer_heads every allocation
Date: Thu, 25 Jun 2015 12:42:39 -0500 [thread overview]
Message-ID: <1435254159-20788-17-git-send-email-rpeterso@redhat.com> (raw)
In-Reply-To: <1435254159-20788-1-git-send-email-rpeterso@redhat.com>
This patch allows the block allocation code to retain the buffers
for the resource groups so they don't need to be re-read from buffer
cache with every request. This is a performance improvement that's
especially noticeable when resource groups are very large. For
example, with 2GB resource groups and 4K blocks, there can be 33
blocks for every resource group. This patch allows those 33 buffers
to be kept around and not read in and thrown away with every
operation. The buffers are released when the resource group is
either synced or invalidated.
Signed-off-by: Bob Peterson <rpeterso@redhat.com>
Reviewed-by: Steven Whitehouse <swhiteho@redhat.com>
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
---
fs/gfs2/glops.c | 14 +++++++++++---
fs/gfs2/rgrp.c | 23 +++++++++++++++++++----
fs/gfs2/rgrp.h | 1 +
3 files changed, 31 insertions(+), 7 deletions(-)
diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c
index 1249b2b..fa3fa5e 100644
--- a/fs/gfs2/glops.c
+++ b/fs/gfs2/glops.c
@@ -144,6 +144,12 @@ static void rgrp_go_sync(struct gfs2_glock *gl)
struct gfs2_rgrpd *rgd;
int error;
+ spin_lock(&gl->gl_spin);
+ rgd = gl->gl_object;
+ if (rgd)
+ gfs2_rgrp_brelse(rgd);
+ spin_unlock(&gl->gl_spin);
+
if (!test_and_clear_bit(GLF_DIRTY, &gl->gl_flags))
return;
GLOCK_BUG_ON(gl, gl->gl_state != LM_ST_EXCLUSIVE);
@@ -175,15 +181,17 @@ static void rgrp_go_inval(struct gfs2_glock *gl, int flags)
{
struct gfs2_sbd *sdp = gl->gl_sbd;
struct address_space *mapping = &sdp->sd_aspace;
+ struct gfs2_rgrpd *rgd = gl->gl_object;
+
+ if (rgd)
+ gfs2_rgrp_brelse(rgd);
WARN_ON_ONCE(!(flags & DIO_METADATA));
gfs2_assert_withdraw(sdp, !atomic_read(&gl->gl_ail_count));
truncate_inode_pages_range(mapping, gl->gl_vm.start, gl->gl_vm.end);
- if (gl->gl_object) {
- struct gfs2_rgrpd *rgd = (struct gfs2_rgrpd *)gl->gl_object;
+ if (rgd)
rgd->rd_flags &= ~GFS2_RDF_UPTODATE;
- }
}
/**
diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c
index cd53d6e..c6c6232 100644
--- a/fs/gfs2/rgrp.c
+++ b/fs/gfs2/rgrp.c
@@ -1244,14 +1244,13 @@ int gfs2_rgrp_go_lock(struct gfs2_holder *gh)
}
/**
- * gfs2_rgrp_go_unlock - Release RG bitmaps read in with gfs2_rgrp_bh_get()
- * @gh: The glock holder for the resource group
+ * gfs2_rgrp_brelse - Release RG bitmaps read in with gfs2_rgrp_bh_get()
+ * @rgd: The resource group
*
*/
-void gfs2_rgrp_go_unlock(struct gfs2_holder *gh)
+void gfs2_rgrp_brelse(struct gfs2_rgrpd *rgd)
{
- struct gfs2_rgrpd *rgd = gh->gh_gl->gl_object;
int x, length = rgd->rd_length;
for (x = 0; x < length; x++) {
@@ -1264,6 +1263,22 @@ void gfs2_rgrp_go_unlock(struct gfs2_holder *gh)
}
+/**
+ * gfs2_rgrp_go_unlock - Unlock a rgrp glock
+ * @gh: The glock holder for the resource group
+ *
+ */
+
+void gfs2_rgrp_go_unlock(struct gfs2_holder *gh)
+{
+ struct gfs2_rgrpd *rgd = gh->gh_gl->gl_object;
+ int demote_requested = test_bit(GLF_DEMOTE, &gh->gh_gl->gl_flags) |
+ test_bit(GLF_PENDING_DEMOTE, &gh->gh_gl->gl_flags);
+
+ if (rgd && demote_requested)
+ gfs2_rgrp_brelse(rgd);
+}
+
int gfs2_rgrp_send_discards(struct gfs2_sbd *sdp, u64 offset,
struct buffer_head *bh,
const struct gfs2_bitmap *bi, unsigned minlen, u64 *ptrimmed)
diff --git a/fs/gfs2/rgrp.h b/fs/gfs2/rgrp.h
index 68972ec..c0ab33f 100644
--- a/fs/gfs2/rgrp.h
+++ b/fs/gfs2/rgrp.h
@@ -36,6 +36,7 @@ extern void gfs2_clear_rgrpd(struct gfs2_sbd *sdp);
extern int gfs2_rindex_update(struct gfs2_sbd *sdp);
extern void gfs2_free_clones(struct gfs2_rgrpd *rgd);
extern int gfs2_rgrp_go_lock(struct gfs2_holder *gh);
+extern void gfs2_rgrp_brelse(struct gfs2_rgrpd *rgd);
extern void gfs2_rgrp_go_unlock(struct gfs2_holder *gh);
extern struct gfs2_alloc *gfs2_alloc_get(struct gfs2_inode *ip);
--
2.1.0
prev parent reply other threads:[~2015-06-25 17:42 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-25 17:42 [Cluster-devel] [PATCH 00/16] GFS2: Pre-pull patch posting (merge window) Bob Peterson
2015-06-25 17:42 ` [Cluster-devel] [PATCH 01/16] GFS2: Use average srttb value in congestion calculations Bob Peterson
2015-06-25 17:42 ` [Cluster-devel] [PATCH 02/16] GFS2: Average in only non-zero round-trip times for congestion stats Bob Peterson
2015-06-25 17:42 ` [Cluster-devel] [PATCH 03/16] GFS2: mark the journal idle to fix ro mounts Bob Peterson
2015-06-25 17:42 ` [Cluster-devel] [PATCH 04/16] GFS2: inode.c: indent with TABs, not spaces Bob Peterson
2015-06-25 17:42 ` [Cluster-devel] [PATCH 05/16] gfs2: handle NULL rgd in set_rgrp_preferences Bob Peterson
2015-06-25 17:42 ` [Cluster-devel] [PATCH 06/16] GFS2: add support for rename2 and RENAME_EXCHANGE Bob Peterson
2015-06-25 17:42 ` [Cluster-devel] [PATCH 07/16] GFS2: make sure S_NOSEC flag isn't overwritten Bob Peterson
2015-06-25 17:42 ` [Cluster-devel] [PATCH 08/16] gfs2: convert simple_str to kstr Bob Peterson
2015-06-25 17:42 ` [Cluster-devel] [PATCH 09/16] gfs2: kerneldoc warning fixes Bob Peterson
2015-06-25 17:42 ` [Cluster-devel] [PATCH 10/16] gfs2: fix shadow warning in gfs2_rbm_find() Bob Peterson
2015-06-25 17:42 ` [Cluster-devel] [PATCH 11/16] gfs2: fix quota updates on block boundaries Bob Peterson
2015-06-25 17:42 ` [Cluster-devel] [PATCH 12/16] gfs2: limit quota log messages Bob Peterson
2015-06-25 17:42 ` [Cluster-devel] [PATCH 13/16] gfs2: s64 cast for negative quota value Bob Peterson
2015-06-25 17:42 ` [Cluster-devel] [PATCH 14/16] gfs2: Don't support fallocate on jdata files Bob Peterson
2015-06-25 17:42 ` [Cluster-devel] [PATCH 15/16] GFS2: Don't add all glocks to the lru Bob Peterson
2015-06-25 17:42 ` Bob Peterson [this message]
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=1435254159-20788-17-git-send-email-rpeterso@redhat.com \
--to=rpeterso@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).