Commit 29687a2ac8dfcd5363e515ea715ec226aef8c26b
1 parent
5ac048bb7e
Exists in
master
and in
4 other branches
GFS2: Alter point of entry to glock lru list for glocks with an address_space
Rather than allowing the glocks to be scheduled for possible reclaim as soon as they have exited the journal, this patch delays their entry to the list until the glocks in question are no longer in use. This means that we will rely on the vm for writeback of all dirty data and metadata from now on. When glocks are added to the lru list they should be freeable much faster since all the I/O required to free them should have already been completed. This should lead to much better I/O patterns under low memory conditions. Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Showing 5 changed files with 23 additions and 27 deletions Side-by-side Diff
fs/gfs2/glock.c
... | ... | @@ -160,6 +160,19 @@ |
160 | 160 | } |
161 | 161 | |
162 | 162 | |
163 | +void gfs2_glock_add_to_lru(struct gfs2_glock *gl) | |
164 | +{ | |
165 | + spin_lock(&lru_lock); | |
166 | + | |
167 | + if (!list_empty(&gl->gl_lru)) | |
168 | + list_del_init(&gl->gl_lru); | |
169 | + else | |
170 | + atomic_inc(&lru_count); | |
171 | + | |
172 | + list_add_tail(&gl->gl_lru, &lru_list); | |
173 | + spin_unlock(&lru_lock); | |
174 | +} | |
175 | + | |
163 | 176 | /** |
164 | 177 | * __gfs2_glock_schedule_for_reclaim - Add a glock to the reclaim list |
165 | 178 | * @gl: the glock |
... | ... | @@ -170,24 +183,8 @@ |
170 | 183 | |
171 | 184 | static void __gfs2_glock_schedule_for_reclaim(struct gfs2_glock *gl) |
172 | 185 | { |
173 | - if (demote_ok(gl)) { | |
174 | - spin_lock(&lru_lock); | |
175 | - | |
176 | - if (!list_empty(&gl->gl_lru)) | |
177 | - list_del_init(&gl->gl_lru); | |
178 | - else | |
179 | - atomic_inc(&lru_count); | |
180 | - | |
181 | - list_add_tail(&gl->gl_lru, &lru_list); | |
182 | - spin_unlock(&lru_lock); | |
183 | - } | |
184 | -} | |
185 | - | |
186 | -void gfs2_glock_schedule_for_reclaim(struct gfs2_glock *gl) | |
187 | -{ | |
188 | - spin_lock(&gl->gl_spin); | |
189 | - __gfs2_glock_schedule_for_reclaim(gl); | |
190 | - spin_unlock(&gl->gl_spin); | |
186 | + if (demote_ok(gl)) | |
187 | + gfs2_glock_add_to_lru(gl); | |
191 | 188 | } |
192 | 189 | |
193 | 190 | /** |
fs/gfs2/glock.h
... | ... | @@ -225,11 +225,10 @@ |
225 | 225 | |
226 | 226 | extern void gfs2_glock_cb(struct gfs2_glock *gl, unsigned int state); |
227 | 227 | extern void gfs2_glock_complete(struct gfs2_glock *gl, int ret); |
228 | -extern void gfs2_reclaim_glock(struct gfs2_sbd *sdp); | |
229 | 228 | extern void gfs2_gl_hash_clear(struct gfs2_sbd *sdp); |
230 | 229 | extern void gfs2_glock_finish_truncate(struct gfs2_inode *ip); |
231 | 230 | extern void gfs2_glock_thaw(struct gfs2_sbd *sdp); |
232 | -extern void gfs2_glock_schedule_for_reclaim(struct gfs2_glock *gl); | |
231 | +extern void gfs2_glock_add_to_lru(struct gfs2_glock *gl); | |
233 | 232 | extern void gfs2_glock_free(struct gfs2_glock *gl); |
234 | 233 | |
235 | 234 | extern int __init gfs2_glock_init(void); |
fs/gfs2/lops.c
... | ... | @@ -40,7 +40,7 @@ |
40 | 40 | { |
41 | 41 | struct gfs2_bufdata *bd; |
42 | 42 | |
43 | - gfs2_assert_withdraw(sdp, test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags)); | |
43 | + BUG_ON(!current->journal_info); | |
44 | 44 | |
45 | 45 | clear_buffer_dirty(bh); |
46 | 46 | if (test_set_buffer_pinned(bh)) |
... | ... | @@ -65,6 +65,7 @@ |
65 | 65 | * @sdp: the filesystem the buffer belongs to |
66 | 66 | * @bh: The buffer to unpin |
67 | 67 | * @ai: |
68 | + * @flags: The inode dirty flags | |
68 | 69 | * |
69 | 70 | */ |
70 | 71 | |
71 | 72 | |
... | ... | @@ -73,11 +74,9 @@ |
73 | 74 | { |
74 | 75 | struct gfs2_bufdata *bd = bh->b_private; |
75 | 76 | |
76 | - gfs2_assert_withdraw(sdp, buffer_uptodate(bh)); | |
77 | + BUG_ON(!buffer_uptodate(bh)); | |
78 | + BUG_ON(!buffer_pinned(bh)); | |
77 | 79 | |
78 | - if (!buffer_pinned(bh)) | |
79 | - gfs2_assert_withdraw(sdp, 0); | |
80 | - | |
81 | 80 | lock_buffer(bh); |
82 | 81 | mark_buffer_dirty(bh); |
83 | 82 | clear_buffer_pinned(bh); |
... | ... | @@ -95,8 +94,7 @@ |
95 | 94 | list_add(&bd->bd_ail_st_list, &ai->ai_ail1_list); |
96 | 95 | spin_unlock(&sdp->sd_ail_lock); |
97 | 96 | |
98 | - if (test_and_clear_bit(GLF_LFLUSH, &bd->bd_gl->gl_flags)) | |
99 | - gfs2_glock_schedule_for_reclaim(bd->bd_gl); | |
97 | + clear_bit(GLF_LFLUSH, &bd->bd_gl->gl_flags); | |
100 | 98 | trace_gfs2_pin(bd, 0); |
101 | 99 | unlock_buffer(bh); |
102 | 100 | atomic_dec(&sdp->sd_log_pinned); |
fs/gfs2/rgrp.c
fs/gfs2/super.c