diff options
author | David Teigland <teigland@redhat.com> | 2012-11-14 13:46:53 -0500 |
---|---|---|
committer | Steven Whitehouse <swhiteho@redhat.com> | 2012-11-15 05:16:59 -0500 |
commit | dba2d70c5dc520fdb569d1fd8dbd45c0e330253e (patch) | |
tree | 35cee899f98a6d863d48ecc2dc891b9dbb38b27e /fs/gfs2 | |
parent | fb6791d100d1bba20b5cdbc4912e1f7086ec60f8 (diff) |
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>
Diffstat (limited to 'fs/gfs2')
-rw-r--r-- | fs/gfs2/glock.c | 27 | ||||
-rw-r--r-- | fs/gfs2/glops.c | 3 | ||||
-rw-r--r-- | fs/gfs2/incore.h | 3 | ||||
-rw-r--r-- | fs/gfs2/lock_dlm.c | 12 |
4 files changed, 32 insertions, 13 deletions
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index 9d29a5167d34..2284de4d05ce 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c | |||
@@ -105,10 +105,12 @@ static void gfs2_glock_dealloc(struct rcu_head *rcu) | |||
105 | { | 105 | { |
106 | struct gfs2_glock *gl = container_of(rcu, struct gfs2_glock, gl_rcu); | 106 | struct gfs2_glock *gl = container_of(rcu, struct gfs2_glock, gl_rcu); |
107 | 107 | ||
108 | if (gl->gl_ops->go_flags & GLOF_ASPACE) | 108 | if (gl->gl_ops->go_flags & GLOF_ASPACE) { |
109 | kmem_cache_free(gfs2_glock_aspace_cachep, gl); | 109 | kmem_cache_free(gfs2_glock_aspace_cachep, gl); |
110 | else | 110 | } else { |
111 | kfree(gl->gl_lvb); | ||
111 | kmem_cache_free(gfs2_glock_cachep, gl); | 112 | kmem_cache_free(gfs2_glock_cachep, gl); |
113 | } | ||
112 | } | 114 | } |
113 | 115 | ||
114 | void gfs2_glock_free(struct gfs2_glock *gl) | 116 | void gfs2_glock_free(struct gfs2_glock *gl) |
@@ -545,7 +547,10 @@ __acquires(&gl->gl_spin) | |||
545 | if (sdp->sd_lockstruct.ls_ops->lm_lock) { | 547 | if (sdp->sd_lockstruct.ls_ops->lm_lock) { |
546 | /* lock_dlm */ | 548 | /* lock_dlm */ |
547 | ret = sdp->sd_lockstruct.ls_ops->lm_lock(gl, target, lck_flags); | 549 | ret = sdp->sd_lockstruct.ls_ops->lm_lock(gl, target, lck_flags); |
548 | GLOCK_BUG_ON(gl, ret); | 550 | if (ret) { |
551 | printk(KERN_ERR "GFS2: lm_lock ret %d\n", ret); | ||
552 | GLOCK_BUG_ON(gl, 1); | ||
553 | } | ||
549 | } else { /* lock_nolock */ | 554 | } else { /* lock_nolock */ |
550 | finish_xmote(gl, target); | 555 | finish_xmote(gl, target); |
551 | if (queue_delayed_work(glock_workqueue, &gl->gl_work, 0) == 0) | 556 | 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 | if (!gl) | 739 | if (!gl) |
735 | return -ENOMEM; | 740 | return -ENOMEM; |
736 | 741 | ||
742 | memset(&gl->gl_lksb, 0, sizeof(struct dlm_lksb)); | ||
743 | gl->gl_lvb = NULL; | ||
744 | |||
745 | if (glops->go_flags & GLOF_LVB) { | ||
746 | gl->gl_lvb = kzalloc(GFS2_MIN_LVB_SIZE, GFP_KERNEL); | ||
747 | if (!gl->gl_lvb) { | ||
748 | kmem_cache_free(cachep, gl); | ||
749 | return -ENOMEM; | ||
750 | } | ||
751 | gl->gl_lksb.sb_lvbptr = gl->gl_lvb; | ||
752 | } | ||
753 | |||
737 | atomic_inc(&sdp->sd_glock_disposal); | 754 | atomic_inc(&sdp->sd_glock_disposal); |
738 | gl->gl_sbd = sdp; | 755 | gl->gl_sbd = sdp; |
739 | gl->gl_flags = 0; | 756 | gl->gl_flags = 0; |
@@ -751,9 +768,6 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number, | |||
751 | preempt_enable(); | 768 | preempt_enable(); |
752 | gl->gl_stats.stats[GFS2_LKS_DCOUNT] = 0; | 769 | gl->gl_stats.stats[GFS2_LKS_DCOUNT] = 0; |
753 | gl->gl_stats.stats[GFS2_LKS_QCOUNT] = 0; | 770 | gl->gl_stats.stats[GFS2_LKS_QCOUNT] = 0; |
754 | memset(&gl->gl_lksb, 0, sizeof(struct dlm_lksb)); | ||
755 | memset(gl->gl_lvb, 0, 32 * sizeof(char)); | ||
756 | gl->gl_lksb.sb_lvbptr = gl->gl_lvb; | ||
757 | gl->gl_tchange = jiffies; | 771 | gl->gl_tchange = jiffies; |
758 | gl->gl_object = NULL; | 772 | gl->gl_object = NULL; |
759 | gl->gl_hold_time = GL_GLOCK_DFT_HOLD; | 773 | gl->gl_hold_time = GL_GLOCK_DFT_HOLD; |
@@ -775,6 +789,7 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number, | |||
775 | tmp = search_bucket(hash, sdp, &name); | 789 | tmp = search_bucket(hash, sdp, &name); |
776 | if (tmp) { | 790 | if (tmp) { |
777 | spin_unlock_bucket(hash); | 791 | spin_unlock_bucket(hash); |
792 | kfree(gl->gl_lvb); | ||
778 | kmem_cache_free(cachep, gl); | 793 | kmem_cache_free(cachep, gl); |
779 | atomic_dec(&sdp->sd_glock_disposal); | 794 | atomic_dec(&sdp->sd_glock_disposal); |
780 | gl = tmp; | 795 | gl = tmp; |
diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c index e86fe26c12d2..78d4184ffc7d 100644 --- a/fs/gfs2/glops.c +++ b/fs/gfs2/glops.c | |||
@@ -552,7 +552,7 @@ const struct gfs2_glock_operations gfs2_rgrp_glops = { | |||
552 | .go_unlock = gfs2_rgrp_go_unlock, | 552 | .go_unlock = gfs2_rgrp_go_unlock, |
553 | .go_dump = gfs2_rgrp_dump, | 553 | .go_dump = gfs2_rgrp_dump, |
554 | .go_type = LM_TYPE_RGRP, | 554 | .go_type = LM_TYPE_RGRP, |
555 | .go_flags = GLOF_ASPACE, | 555 | .go_flags = GLOF_ASPACE | GLOF_LVB, |
556 | }; | 556 | }; |
557 | 557 | ||
558 | const struct gfs2_glock_operations gfs2_trans_glops = { | 558 | const struct gfs2_glock_operations gfs2_trans_glops = { |
@@ -577,6 +577,7 @@ const struct gfs2_glock_operations gfs2_nondisk_glops = { | |||
577 | 577 | ||
578 | const struct gfs2_glock_operations gfs2_quota_glops = { | 578 | const struct gfs2_glock_operations gfs2_quota_glops = { |
579 | .go_type = LM_TYPE_QUOTA, | 579 | .go_type = LM_TYPE_QUOTA, |
580 | .go_flags = GLOF_LVB, | ||
580 | }; | 581 | }; |
581 | 582 | ||
582 | const struct gfs2_glock_operations gfs2_journal_glops = { | 583 | const struct gfs2_glock_operations gfs2_journal_glops = { |
diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h index a35ef5cd1480..bd577fc59e0b 100644 --- a/fs/gfs2/incore.h +++ b/fs/gfs2/incore.h | |||
@@ -216,6 +216,7 @@ struct gfs2_glock_operations { | |||
216 | const int go_type; | 216 | const int go_type; |
217 | const unsigned long go_flags; | 217 | const unsigned long go_flags; |
218 | #define GLOF_ASPACE 1 | 218 | #define GLOF_ASPACE 1 |
219 | #define GLOF_LVB 2 | ||
219 | }; | 220 | }; |
220 | 221 | ||
221 | enum { | 222 | enum { |
@@ -321,7 +322,7 @@ struct gfs2_glock { | |||
321 | ktime_t gl_dstamp; | 322 | ktime_t gl_dstamp; |
322 | struct gfs2_lkstats gl_stats; | 323 | struct gfs2_lkstats gl_stats; |
323 | struct dlm_lksb gl_lksb; | 324 | struct dlm_lksb gl_lksb; |
324 | char gl_lvb[32]; | 325 | char *gl_lvb; |
325 | unsigned long gl_tchange; | 326 | unsigned long gl_tchange; |
326 | void *gl_object; | 327 | void *gl_object; |
327 | 328 | ||
diff --git a/fs/gfs2/lock_dlm.c b/fs/gfs2/lock_dlm.c index f6504d3fadb3..d28ae37ceb3c 100644 --- a/fs/gfs2/lock_dlm.c +++ b/fs/gfs2/lock_dlm.c | |||
@@ -120,7 +120,7 @@ static void gdlm_ast(void *arg) | |||
120 | gfs2_update_reply_times(gl); | 120 | gfs2_update_reply_times(gl); |
121 | BUG_ON(gl->gl_lksb.sb_flags & DLM_SBF_DEMOTED); | 121 | BUG_ON(gl->gl_lksb.sb_flags & DLM_SBF_DEMOTED); |
122 | 122 | ||
123 | if (gl->gl_lksb.sb_flags & DLM_SBF_VALNOTVALID) | 123 | if (gl->gl_lksb.sb_flags & DLM_SBF_VALNOTVALID && gl->gl_lvb) |
124 | memset(gl->gl_lvb, 0, GDLM_LVB_SIZE); | 124 | memset(gl->gl_lvb, 0, GDLM_LVB_SIZE); |
125 | 125 | ||
126 | switch (gl->gl_lksb.sb_status) { | 126 | switch (gl->gl_lksb.sb_status) { |
@@ -203,8 +203,10 @@ static int make_mode(const unsigned int lmstate) | |||
203 | static u32 make_flags(struct gfs2_glock *gl, const unsigned int gfs_flags, | 203 | static u32 make_flags(struct gfs2_glock *gl, const unsigned int gfs_flags, |
204 | const int req) | 204 | const int req) |
205 | { | 205 | { |
206 | u32 lkf = DLM_LKF_VALBLK; | 206 | u32 lkf = 0; |
207 | u32 lkid = gl->gl_lksb.sb_lkid; | 207 | |
208 | if (gl->gl_lvb) | ||
209 | lkf |= DLM_LKF_VALBLK; | ||
208 | 210 | ||
209 | if (gfs_flags & LM_FLAG_TRY) | 211 | if (gfs_flags & LM_FLAG_TRY) |
210 | lkf |= DLM_LKF_NOQUEUE; | 212 | lkf |= DLM_LKF_NOQUEUE; |
@@ -228,7 +230,7 @@ static u32 make_flags(struct gfs2_glock *gl, const unsigned int gfs_flags, | |||
228 | BUG(); | 230 | BUG(); |
229 | } | 231 | } |
230 | 232 | ||
231 | if (lkid != 0) { | 233 | if (gl->gl_lksb.sb_lkid != 0) { |
232 | lkf |= DLM_LKF_CONVERT; | 234 | lkf |= DLM_LKF_CONVERT; |
233 | if (test_bit(GLF_BLOCKING, &gl->gl_flags)) | 235 | if (test_bit(GLF_BLOCKING, &gl->gl_flags)) |
234 | lkf |= DLM_LKF_QUECVT; | 236 | lkf |= DLM_LKF_QUECVT; |
@@ -292,7 +294,7 @@ static void gdlm_put_lock(struct gfs2_glock *gl) | |||
292 | 294 | ||
293 | /* don't want to skip dlm_unlock writing the lvb when lock is ex */ | 295 | /* don't want to skip dlm_unlock writing the lvb when lock is ex */ |
294 | if (test_bit(SDF_SKIP_DLM_UNLOCK, &sdp->sd_flags) && | 296 | if (test_bit(SDF_SKIP_DLM_UNLOCK, &sdp->sd_flags) && |
295 | gl->gl_state != LM_ST_EXCLUSIVE) { | 297 | gl->gl_lvb && gl->gl_state != LM_ST_EXCLUSIVE) { |
296 | gfs2_glock_free(gl); | 298 | gfs2_glock_free(gl); |
297 | return; | 299 | return; |
298 | } | 300 | } |