Commit dba2d70c authored by David Teigland's avatar David Teigland Committed by Steven Whitehouse

GFS2: only use lvb on glocks that need it

Save the effort of allocating, reading and writing
the lvb for most glocks that do not use it.
Signed-off-by: default avatarDavid Teigland <teigland@redhat.com>
Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
parent fb6791d1
...@@ -105,10 +105,12 @@ static void gfs2_glock_dealloc(struct rcu_head *rcu) ...@@ -105,10 +105,12 @@ static void gfs2_glock_dealloc(struct rcu_head *rcu)
{ {
struct gfs2_glock *gl = container_of(rcu, struct gfs2_glock, gl_rcu); struct gfs2_glock *gl = container_of(rcu, struct gfs2_glock, gl_rcu);
if (gl->gl_ops->go_flags & GLOF_ASPACE) if (gl->gl_ops->go_flags & GLOF_ASPACE) {
kmem_cache_free(gfs2_glock_aspace_cachep, gl); kmem_cache_free(gfs2_glock_aspace_cachep, gl);
else } else {
kfree(gl->gl_lvb);
kmem_cache_free(gfs2_glock_cachep, gl); kmem_cache_free(gfs2_glock_cachep, gl);
}
} }
void gfs2_glock_free(struct gfs2_glock *gl) void gfs2_glock_free(struct gfs2_glock *gl)
...@@ -545,7 +547,10 @@ __acquires(&gl->gl_spin) ...@@ -545,7 +547,10 @@ __acquires(&gl->gl_spin)
if (sdp->sd_lockstruct.ls_ops->lm_lock) { if (sdp->sd_lockstruct.ls_ops->lm_lock) {
/* lock_dlm */ /* lock_dlm */
ret = sdp->sd_lockstruct.ls_ops->lm_lock(gl, target, lck_flags); ret = sdp->sd_lockstruct.ls_ops->lm_lock(gl, target, lck_flags);
GLOCK_BUG_ON(gl, ret); if (ret) {
printk(KERN_ERR "GFS2: lm_lock ret %d\n", ret);
GLOCK_BUG_ON(gl, 1);
}
} else { /* lock_nolock */ } else { /* lock_nolock */
finish_xmote(gl, target); finish_xmote(gl, target);
if (queue_delayed_work(glock_workqueue, &gl->gl_work, 0) == 0) if (queue_delayed_work(glock_workqueue, &gl->gl_work, 0) == 0)
...@@ -734,6 +739,18 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number, ...@@ -734,6 +739,18 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
if (!gl) if (!gl)
return -ENOMEM; return -ENOMEM;
memset(&gl->gl_lksb, 0, sizeof(struct dlm_lksb));
gl->gl_lvb = NULL;
if (glops->go_flags & GLOF_LVB) {
gl->gl_lvb = kzalloc(GFS2_MIN_LVB_SIZE, GFP_KERNEL);
if (!gl->gl_lvb) {
kmem_cache_free(cachep, gl);
return -ENOMEM;
}
gl->gl_lksb.sb_lvbptr = gl->gl_lvb;
}
atomic_inc(&sdp->sd_glock_disposal); atomic_inc(&sdp->sd_glock_disposal);
gl->gl_sbd = sdp; gl->gl_sbd = sdp;
gl->gl_flags = 0; gl->gl_flags = 0;
...@@ -751,9 +768,6 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number, ...@@ -751,9 +768,6 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
preempt_enable(); preempt_enable();
gl->gl_stats.stats[GFS2_LKS_DCOUNT] = 0; gl->gl_stats.stats[GFS2_LKS_DCOUNT] = 0;
gl->gl_stats.stats[GFS2_LKS_QCOUNT] = 0; gl->gl_stats.stats[GFS2_LKS_QCOUNT] = 0;
memset(&gl->gl_lksb, 0, sizeof(struct dlm_lksb));
memset(gl->gl_lvb, 0, 32 * sizeof(char));
gl->gl_lksb.sb_lvbptr = gl->gl_lvb;
gl->gl_tchange = jiffies; gl->gl_tchange = jiffies;
gl->gl_object = NULL; gl->gl_object = NULL;
gl->gl_hold_time = GL_GLOCK_DFT_HOLD; gl->gl_hold_time = GL_GLOCK_DFT_HOLD;
...@@ -775,6 +789,7 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number, ...@@ -775,6 +789,7 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
tmp = search_bucket(hash, sdp, &name); tmp = search_bucket(hash, sdp, &name);
if (tmp) { if (tmp) {
spin_unlock_bucket(hash); spin_unlock_bucket(hash);
kfree(gl->gl_lvb);
kmem_cache_free(cachep, gl); kmem_cache_free(cachep, gl);
atomic_dec(&sdp->sd_glock_disposal); atomic_dec(&sdp->sd_glock_disposal);
gl = tmp; gl = tmp;
......
...@@ -552,7 +552,7 @@ const struct gfs2_glock_operations gfs2_rgrp_glops = { ...@@ -552,7 +552,7 @@ const struct gfs2_glock_operations gfs2_rgrp_glops = {
.go_unlock = gfs2_rgrp_go_unlock, .go_unlock = gfs2_rgrp_go_unlock,
.go_dump = gfs2_rgrp_dump, .go_dump = gfs2_rgrp_dump,
.go_type = LM_TYPE_RGRP, .go_type = LM_TYPE_RGRP,
.go_flags = GLOF_ASPACE, .go_flags = GLOF_ASPACE | GLOF_LVB,
}; };
const struct gfs2_glock_operations gfs2_trans_glops = { const struct gfs2_glock_operations gfs2_trans_glops = {
...@@ -577,6 +577,7 @@ const struct gfs2_glock_operations gfs2_nondisk_glops = { ...@@ -577,6 +577,7 @@ const struct gfs2_glock_operations gfs2_nondisk_glops = {
const struct gfs2_glock_operations gfs2_quota_glops = { const struct gfs2_glock_operations gfs2_quota_glops = {
.go_type = LM_TYPE_QUOTA, .go_type = LM_TYPE_QUOTA,
.go_flags = GLOF_LVB,
}; };
const struct gfs2_glock_operations gfs2_journal_glops = { const struct gfs2_glock_operations gfs2_journal_glops = {
......
...@@ -216,6 +216,7 @@ struct gfs2_glock_operations { ...@@ -216,6 +216,7 @@ struct gfs2_glock_operations {
const int go_type; const int go_type;
const unsigned long go_flags; const unsigned long go_flags;
#define GLOF_ASPACE 1 #define GLOF_ASPACE 1
#define GLOF_LVB 2
}; };
enum { enum {
...@@ -321,7 +322,7 @@ struct gfs2_glock { ...@@ -321,7 +322,7 @@ struct gfs2_glock {
ktime_t gl_dstamp; ktime_t gl_dstamp;
struct gfs2_lkstats gl_stats; struct gfs2_lkstats gl_stats;
struct dlm_lksb gl_lksb; struct dlm_lksb gl_lksb;
char gl_lvb[32]; char *gl_lvb;
unsigned long gl_tchange; unsigned long gl_tchange;
void *gl_object; void *gl_object;
......
...@@ -120,7 +120,7 @@ static void gdlm_ast(void *arg) ...@@ -120,7 +120,7 @@ static void gdlm_ast(void *arg)
gfs2_update_reply_times(gl); gfs2_update_reply_times(gl);
BUG_ON(gl->gl_lksb.sb_flags & DLM_SBF_DEMOTED); BUG_ON(gl->gl_lksb.sb_flags & DLM_SBF_DEMOTED);
if (gl->gl_lksb.sb_flags & DLM_SBF_VALNOTVALID) if (gl->gl_lksb.sb_flags & DLM_SBF_VALNOTVALID && gl->gl_lvb)
memset(gl->gl_lvb, 0, GDLM_LVB_SIZE); memset(gl->gl_lvb, 0, GDLM_LVB_SIZE);
switch (gl->gl_lksb.sb_status) { switch (gl->gl_lksb.sb_status) {
...@@ -203,8 +203,10 @@ static int make_mode(const unsigned int lmstate) ...@@ -203,8 +203,10 @@ static int make_mode(const unsigned int lmstate)
static u32 make_flags(struct gfs2_glock *gl, const unsigned int gfs_flags, static u32 make_flags(struct gfs2_glock *gl, const unsigned int gfs_flags,
const int req) const int req)
{ {
u32 lkf = DLM_LKF_VALBLK; u32 lkf = 0;
u32 lkid = gl->gl_lksb.sb_lkid;
if (gl->gl_lvb)
lkf |= DLM_LKF_VALBLK;
if (gfs_flags & LM_FLAG_TRY) if (gfs_flags & LM_FLAG_TRY)
lkf |= DLM_LKF_NOQUEUE; lkf |= DLM_LKF_NOQUEUE;
...@@ -228,7 +230,7 @@ static u32 make_flags(struct gfs2_glock *gl, const unsigned int gfs_flags, ...@@ -228,7 +230,7 @@ static u32 make_flags(struct gfs2_glock *gl, const unsigned int gfs_flags,
BUG(); BUG();
} }
if (lkid != 0) { if (gl->gl_lksb.sb_lkid != 0) {
lkf |= DLM_LKF_CONVERT; lkf |= DLM_LKF_CONVERT;
if (test_bit(GLF_BLOCKING, &gl->gl_flags)) if (test_bit(GLF_BLOCKING, &gl->gl_flags))
lkf |= DLM_LKF_QUECVT; lkf |= DLM_LKF_QUECVT;
...@@ -292,7 +294,7 @@ static void gdlm_put_lock(struct gfs2_glock *gl) ...@@ -292,7 +294,7 @@ static void gdlm_put_lock(struct gfs2_glock *gl)
/* don't want to skip dlm_unlock writing the lvb when lock is ex */ /* don't want to skip dlm_unlock writing the lvb when lock is ex */
if (test_bit(SDF_SKIP_DLM_UNLOCK, &sdp->sd_flags) && if (test_bit(SDF_SKIP_DLM_UNLOCK, &sdp->sd_flags) &&
gl->gl_state != LM_ST_EXCLUSIVE) { gl->gl_lvb && gl->gl_state != LM_ST_EXCLUSIVE) {
gfs2_glock_free(gl); gfs2_glock_free(gl);
return; return;
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment