GFS2: Don't add all glocks to the lru
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH 1/1 GFS2: Don't add all glocks to the lru
Hi,
Regarding my previously posted patch:
I decided it makes more sense not to single out rgrp glocks for exclusion from the lru list. It makes sense to also exclude the transaction glock, and "non-disk" glocks off the lru list as well. Therefore, I changed this to a generic "glops" flag so we could specify them on an individual basis.
Patch description:
The glocks used for resource groups often come and go hundreds of thousands of time per second. Adding them to the lru list just adds unnecessary contention for the lru_lock spin_lock, especially considering we're almost certainly going to re-use the glock and take it back off the lru microseconds later. We never want the glock shrinker to cull them anyway. This patch adds a new bit in the glops that determines which glock types get put onto the lru list and which ones don't.
Regards,
Bob Peterson
---
fs/gfs2/glock.c +2 -1
@@ -1076,7 +1076,8 @@ void gfs2_glock_dq(struct gfs2_holder *gh) !test_bit(GLF_DEMOTE, &gl->gl_flags)) fast_path =1 ; } -if (!test_bit (GLF_LFLUSH , &gl->gl_flags) &&demote_ok (gl)) +if (!test_bit (GLF_LFLUSH , &gl->gl_flags) &&demote_ok (gl) && + (glops->go_flags &GLOF_LRU ))gfs2_glock_add_to_lru (gl);trace_gfs2_glock_queue (gh,0 );
fs/gfs2/glops.c +4 -2
@@ -561,7 +561,7 @@ const struct gfs2_glock_operations gfs2_inode_glops = { .go_lock = inode_go_lock, .go_dump = inode_go_dump, .go_type = LM_TYPE_INODE, - .go_flags = GLOF_ASPACE, + .go_flags = GLOF_ASPACE | GLOF_LRU, };const struct gfs2_glock_operations gfs2_rgrp_glops = {
@@ -584,10 +584,12 @@ const struct gfs2_glock_operations gfs2_freeze_glops = {const struct gfs2_glock_operations gfs2_iopen_glops = { .go_type =LM_TYPE_IOPEN , .go_callback = iopen_go_callback, + .go_flags =GLOF_LRU , };const struct gfs2_glock_operations gfs2_flock_glops = { .go_type =LM_TYPE_FLOCK , + .go_flags =GLOF_LRU , };const struct gfs2_glock_operations gfs2_nondisk_glops = {
@@ -596,7 +598,7 @@ const struct gfs2_glock_operations gfs2_nondisk_glops = {const struct gfs2_glock_operations gfs2_quota_glops = { .go_type =LM_TYPE_QUOTA , - .go_flags =GLOF_LVB , + .go_flags =GLOF_LVB |GLOF_LRU , };const struct gfs2_glock_operations gfs2_journal_glops = {
fs/gfs2/incore.h +1 -0
@@ -225,6 +225,7 @@ struct gfs2_glock_operations {const unsigned long go_flags;#define GLOF_ASPACE 1#define GLOF_LVB 2 +#define GLOF_LRU 4 };enum {
PATCH 1/1 GFS2: Don't add all glocks to the lru
Steve.
Quoted 88 lines · Bob Peterson
Hi,
Regarding my previously posted patch:
I decided it makes more sense not to single out rgrp glocks for exclusion from the lru list. It makes sense to also exclude the transaction glock, and "non-disk" glocks off the lru list as well. Therefore, I changed this to a generic "glops" flag so we could specify them on an individual basis.Patch description:
The glocks used for resource groups often come and go hundreds of thousands of time per second. Adding them to the lru list just adds unnecessary contention for the
lru_lockspin_lock, especially considering we're almost certainly going to re-use the glock and take it back off the lru microseconds later. We never want the glock shrinker to cull them anyway. This patch adds a new bit in the glops that determines which glock types get put onto the lru list and which ones don't.Regards,
Bob Peterson
Signed-off-by Bob Peterson <[email protected]>---
fs/gfs2/glock.c +2
-1@@ -1076,7 +1076,8 @@ void gfs2_glock_dq(struct gfs2_holder *gh) !test_bit(GLF_DEMOTE, &gl->gl_flags)) fast_path =1 ; } -if (!test_bit (GLF_LFLUSH , &gl->gl_flags) &&demote_ok (gl)) +if (!test_bit (GLF_LFLUSH , &gl->gl_flags) &&demote_ok (gl) && + (glops->go_flags &GLOF_LRU ))gfs2_glock_add_to_lru (gl);trace_gfs2_glock_queue (gh,0 );fs/gfs2/glops.c +4
-2@@ -561,7 +561,7 @@ const struct gfs2_glock_operations gfs2_inode_glops = { .go_lock = inode_go_lock, .go_dump = inode_go_dump, .go_type = LM_TYPE_INODE, - .go_flags = GLOF_ASPACE, + .go_flags = GLOF_ASPACE | GLOF_LRU, };const struct gfs2_glock_operations gfs2_rgrp_glops = {@@ -584,10 +584,12 @@ const struct gfs2_glock_operations gfs2_freeze_glops = {const struct gfs2_glock_operations gfs2_iopen_glops = { .go_type =LM_TYPE_IOPEN , .go_callback = iopen_go_callback, + .go_flags =GLOF_LRU , };const struct gfs2_glock_operations gfs2_flock_glops = { .go_type =LM_TYPE_FLOCK , + .go_flags =GLOF_LRU , };const struct gfs2_glock_operations gfs2_nondisk_glops = {@@ -596,7 +598,7 @@ const struct gfs2_glock_operations gfs2_nondisk_glops = {const struct gfs2_glock_operations gfs2_quota_glops = { .go_type =LM_TYPE_QUOTA , - .go_flags =GLOF_LVB , + .go_flags =GLOF_LVB |GLOF_LRU , };const struct gfs2_glock_operations gfs2_journal_glops = {fs/gfs2/incore.h +1
-0@@ -225,6 +225,7 @@ struct gfs2_glock_operations {const unsigned long go_flags;#define GLOF_ASPACE 1#define GLOF_LVB 2 +#define GLOF_LRU 4 };enum {