use percpu data for lg_prealloc_list
PATCH 1/1 use percpu data for lg_prealloc_list
lg_prealloc_list seems to cry out for a per-cpu data structure; on a large smp system I think this should be better. I've lightly tested this change on a 4-cpu system. Comments welcome...
---
ndex: linux-2.6/fs/ext4/mballoc.c
===================================================================
fs/ext4/mballoc.c +3 -5
@@ -2540,17 +2540,16 @@ int ext4_mb_init(struct super_block *sb, sbi->s_mb_history_filter =EXT4_MB_HISTORY_DEFAULT ; sbi->s_mb_group_prealloc =MB_DEFAULT_GROUP_PREALLOC ; - i =sizeof (struct ext4_locality_group ) * nr_cpu_ids; - sbi->s_locality_groups =kmalloc (i,GFP_KERNEL ); + sbi->s_locality_groups = alloc_percpu(struct ext4_locality_group);if (sbi->s_locality_groups ==NULL ) {clear_opt (sbi->s_mount_opt,MBALLOC );kfree (sbi->s_mb_offsets);kfree (sbi->s_mb_maxs);return -ENOMEM ; } -for (i =0 ; i < nr_cpu_ids; i++) { +for_each_possible_cpu (i) {struct ext4_locality_group *lg; - lg = &sbi->s_locality_groups[i]; + lg =per_cpu_ptr (sbi->s_locality_groups, i);mutex_init (&lg->lg_mutex);for (j =0 ; j <PREALLOC_TB_SIZE ; j++)INIT_LIST_HEAD (&lg->lg_prealloc_list[j]);
@@ -2647,8 +2646,7 @@ int ext4_mb_release(struct super_block * atomic_read(&sbi->s_mb_discarded)); } -kfree (sbi->s_locality_groups);
Quoted 3 lines · Eric Sandeen
lg_prealloc_listseems to cry out for a per-cpu data structure; on a large smp system I think this should be better. I've lightly tested this change on a 4-cpu system. Comments welcome...
Any thoughts on this? Does this seem to be the right way to go?
Thanks,
-Eric
Quoted 53 lines
Signed-off-by Eric Sandeen <[email protected]>---
ndex:
linux-2.6/fs/ext4/mballoc.c
===================================================================fs/ext4/mballoc.c +5
-9@@ -2540,17 +2540,16 @@ int ext4_mb_init(struct super_block *sb, sbi->s_mb_history_filter =EXT4_MB_HISTORY_DEFAULT ; sbi->s_mb_group_prealloc =MB_DEFAULT_GROUP_PREALLOC ; - i =sizeof (struct ext4_locality_group ) * nr_cpu_ids; - sbi->s_locality_groups =kmalloc (i,GFP_KERNEL ); + sbi->s_locality_groups = alloc_percpu(struct ext4_locality_group);if (sbi->s_locality_groups ==NULL ) {clear_opt (sbi->s_mount_opt,MBALLOC );kfree (sbi->s_mb_offsets);kfree (sbi->s_mb_maxs);return -ENOMEM ; } -for (i =0 ; i < nr_cpu_ids; i++) { +for_each_possible_cpu (i) {struct ext4_locality_group *lg; - lg = &sbi->s_locality_groups[i]; + lg =per_cpu_ptr (sbi->s_locality_groups, i);mutex_init (&lg->lg_mutex);for (j =0 ; j <PREALLOC_TB_SIZE ; j++)INIT_LIST_HEAD (&lg->lg_prealloc_list[j]);@@ -2647,8 +2646,7 @@ int ext4_mb_release(struct super_block * atomic_read(&sbi->s_mb_discarded)); } -kfree (sbi->s_locality_groups); - +free_percpu (sbi->s_locality_groups);ext4_mb_history_release (sb);ext4_mb_destroy_per_dev_proc (sb);@@ -4055,8 +4053,7 @@ static void ext4_mb_group_or_file(struct* per cpu locality group is to reduce the contention between block * request from multiple CPUs. */ - ac->ac_lg = &sbi->s_locality_groups[get_cpu ()]; -put_cpu (); + ac->ac_lg =per_cpu_ptr (sbi->s_locality_groups,smp_processor_id ());/* we're going to use group allocation */ ac->ac_flags |=EXT4_MB_HINT_GROUP_ALLOC ; --To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Aneesh Kumar K.V
Acked-byQuoted 7 lines · Eric Sandeen
Quoted 3 lines · Eric Sandeen
lg_prealloc_listseems to cry out for a per-cpu data structure; on a large smp system I think this should be better. I've lightly tested this change on a 4-cpu system. Comments welcome...Any thoughts on this? Does this seem to be the right way to go?
Quoted 9 lines · Aneesh Kumar K.V
Quoted 6 lines · Eric Sandeen
Quoted 3 lines · Eric Sandeen
lg_prealloc_listseems to cry out for a per-cpu data structure; on a large smp system I think this should be better. I've lightly tested this change on a 4-cpu system. Comments welcome...Any thoughts on this? Does this seem to be the right way to go?
Acked-by Aneesh Kumar K.V <[email protected]>
Thanks :) I'll toss it in the patch queue.
-Eric