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: David Teigland <teigland@redhat.com> Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
This commit is contained in:
parent
fb6791d100
commit
dba2d70c5d
|
@ -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)
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
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 = {
|
||||||
.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 = {
|
||||||
|
|
||||||
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 {
|
||||||
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 {
|
||||||
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)
|
||||||
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)
|
||||||
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,
|
||||||
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)
|
||||||
|
|
||||||
/* 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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue