add @gfp to init functions of percpu data structures
Subsystems (20)
Tejun Heo
maintainerPATCH 1/1 add @gfp to init functions of percpu data structures
There's now a pending patchset[1] which implements atomic percpu allocation. This patchset propagates @gfp to percpu data structures so that they can be allocated and initialized from !GFP_KERNEL contexts too. This will be used for opportunistic allocations of data structures embedding percpu constructs in IO path.
This patchset adds @gfp to alloc/init functions of percpu_counter, [flex_]proportions and percpu-refcount. We could add separate alloc/init functions which take @gfp but there aren't too many users yet, so let's just add it to the existing ones.
This patchset contains the following patches
0001-percpu_counter-add-gfp-to-percpu_counter_init.patch 0002-proportions-add-gfp-to-init-functions.patch 0003-percpu-refcount-add-gfp-to-percpu_ref_init.patch
and is on top of
[1] [PATCHSET REPOST percpu/for-3.18] percpu: implement atomic allocation support
and avaliable in the following git branch.
git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu.git/review-add-gfps
diffstat follows. Thanks.
arch/x86/kvm/mmu.c | 2 +- drivers/target/target_core_tpg.c | 3 ++- fs/aio.c | 4 ++-- fs/btrfs/disk-io.c | 8 ++++---- fs/btrfs/extent-tree.c | 2 +- fs/ext2/super.c | 6 +++--- fs/ext3/super.c | 6 +++--- fs/ext4/super.c | 14 +++++++++----- fs/file_table.c | 2 +- fs/quota/dquot.c | 2 +- fs/super.c | 3 ++- include/linux/flex_proportions.h | 5 +++-- include/linux/percpu-refcount.h | 3 ++- include/linux/percpu_counter.h | 10 ++++++---- include/linux/proportions.h | 5 +++-- include/net/dst_ops.h | 2 +- include/net/inet_frag.h | 2 +- kernel/cgroup.c | 6 +++--- lib/flex_proportions.c | 8 ++++---- lib/percpu-refcount.c | 6 ++++-- lib/percpu_counter.c | 4 ++-- lib/proportions.c | 10 +++++----- mm/backing-dev.c | 4 ++-- mm/mmap.c | 2 +- mm/nommu.c | 2 +- mm/page-writeback.c | 2 +- mm/shmem.c | 2 +- net/dccp/proto.c | 2 +- net/ipv4/tcp.c | 4 ++-- net/ipv4/tcp_memcontrol.c | 2 +- net/sctp/protocol.c | 2 +- 31 files changed, 74 insertions(+), 61 deletions(-)
--
tejun
Tejun Heo
maintainerPATCH 1/3 percpu_counter: add @gfp to percpu_counter_init()
Percpu allocator now supports allocation mask. Add @gfp to percpu_counter_init() so that !GFP_KERNEL allocation masks can be used with percpu_counters too.
We could have left percpu_counter_init() alone and added percpu_counter_init_gfp(); however, the number of users isn't that high and introducing _gfp variants to all percpu data structures would be quite ugly, so let's just do the conversion. This is the one with the most users. Other percpu data structures are a lot easier to convert.
This patch doesn't make any functional difference.
--- arch/x86/kvm/mmu.c | 2 +- fs/btrfs/disk-io.c | 8 ++++---- fs/btrfs/extent-tree.c | 2 +- fs/ext2/super.c | 6 +++--- fs/ext3/super.c | 6 +++--- fs/ext4/super.c | 14 +++++++++----- fs/file_table.c | 2 +- fs/quota/dquot.c | 2 +- fs/super.c | 3 ++- include/linux/percpu_counter.h | 10 ++++++---- include/net/dst_ops.h | 2 +- include/net/inet_frag.h | 2 +- lib/flex_proportions.c | 4 ++-- lib/percpu_counter.c | 4 ++-- lib/proportions.c | 6 +++--- mm/backing-dev.c | 2 +- mm/mmap.c | 2 +- mm/nommu.c | 2 +- mm/shmem.c | 2 +- net/dccp/proto.c | 2 +- net/ipv4/tcp.c | 4 ++-- net/ipv4/tcp_memcontrol.c | 2 +- net/sctp/protocol.c | 2 +- 23 files changed, 49 insertions(+), 42 deletions(-)
arch/x86/kvm/mmu.c +1 -1
@@ -4534,7 +4534,7 @@ int kvm_mmu_module_init(void)if (!mmu_page_header_cache) goto nomem; -if (percpu_counter_init (&kvm_total_used_mmu_pages,0 )) +if (percpu_counter_init (&kvm_total_used_mmu_pages,0 ,GFP_KERNEL )) goto nomem;register_shrinker (&mmu_shrinker);
fs/btrfs/disk-io.c +4 -4
@@ -1180,7 +1180,7 @@ static struct btrfs_subvolume_writers *btrfs_alloc_subvolume_writers(void)if (!writers)return ERR_PTR (-ENOMEM ); - ret =percpu_counter_init (&writers->counter,0 ); + ret =percpu_counter_init (&writers->counter,0 ,GFP_KERNEL );if (ret <0 ) {kfree (writers);return ERR_PTR (ret);
@@ -2185,7 +2185,7 @@ int open_ctree(struct super_block *sb, goto fail_srcu; } - ret =percpu_counter_init (&fs_info->dirty_metadata_bytes,0 ); + ret =percpu_counter_init (&fs_info->dirty_metadata_bytes,0 ,GFP_KERNEL );if (ret) { err = ret; goto fail_bdi;
@@ -2193,13 +2193,13 @@ int open_ctree(struct super_block *sb, fs_info->dirty_metadata_batch =PAGE_CACHE_SIZE * (1 +ilog2 (nr_cpu_ids)); - ret =percpu_counter_init (&fs_info->delalloc_bytes,0 ); + ret =percpu_counter_init (&fs_info->delalloc_bytes,0 ,GFP_KERNEL );if (ret) { err = ret; goto fail_dirty_metadata_bytes; } - ret =percpu_counter_init (&fs_info->bio_counter,0 ); + ret =percpu_counter_init (&fs_info->bio_counter,0 ,GFP_KERNEL );if (ret) { err = ret; goto fail_delalloc_bytes;
fs/btrfs/extent-tree.c +1 -1
@@ -3493,7 +3493,7 @@ static int update_space_info(struct btrfs_fs_info *info, u64 flags,if (!found)return -ENOMEM ; - ret =percpu_counter_init (&found->total_bytes_pinned,0 ); + ret =percpu_counter_init (&found->total_bytes_pinned,0 ,GFP_KERNEL );if (ret) {kfree (found);return ret;
fs/ext2/super.c +3 -3
@@ -1067,14 +1067,14 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent)ext2_rsv_window_add (sb, &sbi->s_rsv_window_head); err =percpu_counter_init (&sbi->s_freeblocks_counter, -ext2_count_free_blocks (sb)); +ext2_count_free_blocks (sb),GFP_KERNEL );if (!err) { err =percpu_counter_init (&sbi->s_freeinodes_counter, -ext2_count_free_inodes (sb)); +ext2_count_free_inodes (sb),GFP_KERNEL ); }if (!err) { err =percpu_counter_init (&sbi->s_dirs_counter, -ext2_count_dirs (sb)); +ext2_count_dirs (sb),GFP_KERNEL ); }if (err) {ext2_msg (sb,KERN_ERR ,"error: insufficient memory" );
fs/ext3/super.c +3 -3
@@ -2039,14 +2039,14 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent) goto failed_mount2; } err =percpu_counter_init (&sbi->s_freeblocks_counter, -ext3_count_free_blocks (sb)); +ext3_count_free_blocks (sb),GFP_KERNEL );if (!err) { err =percpu_counter_init (&sbi->s_freeinodes_counter, -ext3_count_free_inodes (sb)); +ext3_count_free_inodes (sb),GFP_KERNEL ); }if (!err) { err =percpu_counter_init (&sbi->s_dirs_counter, -ext3_count_dirs (sb)); +ext3_count_dirs (sb),GFP_KERNEL ); }if (err) {ext3_msg (sb,KERN_ERR ,"error: insufficient memory" );
fs/ext4/super.c +9 -5
@@ -3891,7 +3891,8 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)/* Register extent status tree shrinker */ ext4_es_register_shrinker (sbi); -if ((err =percpu_counter_init (&sbi->s_extent_cache_cnt,0 )) !=0 ) { + err =percpu_counter_init (&sbi->s_extent_cache_cnt,0 ,GFP_KERNEL ); +if (err) {ext4_msg (sb,KERN_ERR ,"insufficient memory" ); goto failed_mount3; }
@@ -4105,17 +4106,20 @@ no_journal: block =ext4_count_free_clusters (sb);ext4_free_blocks_count_set (sbi->s_es,EXT4_C2B (sbi, block)); - err =percpu_counter_init (&sbi->s_freeclusters_counter, block); + err =percpu_counter_init (&sbi->s_freeclusters_counter, block, +GFP_KERNEL );if (!err) {unsigned long freei =ext4_count_free_inodes (sb); sbi->s_es->s_free_inodes_count =cpu_to_le32 (freei); - err =percpu_counter_init (&sbi->s_freeinodes_counter, freei); + err =percpu_counter_init (&sbi->s_freeinodes_counter, freei, +GFP_KERNEL ); }if (!err) err =percpu_counter_init (&sbi->s_dirs_counter, -ext4_count_dirs (sb)); +ext4_count_dirs (sb),GFP_KERNEL );if (!err) - err =percpu_counter_init (&sbi->s_dirtyclusters_counter,0 ); + err =percpu_counter_init (&sbi->s_dirtyclusters_counter,0 , +GFP_KERNEL );if (err) {ext4_msg (sb,KERN_ERR ,"insufficient memory" ); goto failed_mount6;
fs/file_table.c +1 -1
@@ -331,5 +331,5 @@ void __init files_init(unsigned long mempages) n = (mempages * (PAGE_SIZE /1024 )) /10 ; files_stat.max_files = max_t(unsigned long, n, NR_FILE); -percpu_counter_init (&nr_files,0 ); +percpu_counter_init (&nr_files,0 ,GFP_KERNEL ); }
fs/quota/dquot.c +1 -1
@@ -2725,7 +2725,7 @@ static int __init dquot_init(void)panic ("Cannot create dquot hash table" );for (i =0 ; i < _DQST_DQSTAT_LAST; i++) { - ret =percpu_counter_init (&dqstats.counter[i],0 ); + ret =percpu_counter_init (&dqstats.counter[i],0 ,GFP_KERNEL );if (ret)panic ("Cannot create dquot stat counters" ); }
fs/super.c +2 -1
@@ -175,7 +175,8 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags) goto fail;for (i =0 ; i <SB_FREEZE_LEVELS ; i++) { -if (percpu_counter_init (&s->s_writers.counter[i],0 ) <0 ) +if (percpu_counter_init (&s->s_writers.counter[i],0 , +GFP_KERNEL ) <0 ) goto fail;lockdep_init_map (&s->s_writers.lock_map[i], sb_writers_name[i], &type->s_writers_key[i],0 );
include/linux/percpu_counter.h +6 -4
@@ -12,6 +12,7 @@#include <linux/threads.h> #include <linux/percpu.h> #include <linux/types.h> +#include <linux/gfp.h> #ifdef CONFIG_SMP
@@ -26,14 +27,14 @@ struct percpu_counter {extern int percpu_counter_batch; -int __percpu_counter_init (struct percpu_counter *fbc,s64 amount, +int __percpu_counter_init (struct percpu_counter *fbc,s64 amount,gfp_t gfp,struct lock_class_key *key); -#define percpu_counter_init (fbc, value) \ +#define percpu_counter_init (fbc, value, gfp) \ ({ \ static struct lock_class_key __key; \ \ - __percpu_counter_init(fbc, value, &__key); \ + __percpu_counter_init(fbc, value, gfp, &__key); \ })void percpu_counter_destroy (struct percpu_counter *fbc);
@@ -89,7 +90,8 @@ struct percpu_counter {s64 count; }; -static inline int percpu_counter_init (struct percpu_counter *fbc,s64 amount) +static inline int percpu_counter_init (struct percpu_counter *fbc,s64 amount, +gfp_t gfp) { fbc->count = amount;return 0 ;
include/net/dst_ops.h +1 -1
@@ -63,7 +63,7 @@ static inline void dst_entries_add(struct dst_ops *dst, int val)static inline int dst_entries_init (struct dst_ops *dst) { -return percpu_counter_init (&dst->pcpuc_entries,0 ); +return percpu_counter_init (&dst->pcpuc_entries,0 ,GFP_KERNEL ); }static inline void dst_entries_destroy (struct dst_ops *dst)
include/net/inet_frag.h +1 -1
@@ -151,7 +151,7 @@ static inline void add_frag_mem_limit(struct inet_frag_queue *q, int i)static inline void init_frag_mem_limit (struct netns_frags *nf) { -percpu_counter_init (&nf->mem,0 ); +percpu_counter_init (&nf->mem,0 ,GFP_KERNEL ); }static inline unsigned int sum_frag_mem_limit (struct netns_frags *nf)
lib/flex_proportions.c +2 -2
@@ -40,7 +40,7 @@ int fprop_global_init(struct fprop_global *p) p->period =0 ;/* Use 1 to avoid dealing with periods with 0 events... */ - err =percpu_counter_init (&p->events,1 ); + err =percpu_counter_init (&p->events,1 ,GFP_KERNEL );if (err)return err;seqcount_init (&p->sequence);
@@ -172,7 +172,7 @@ int fprop_local_init_percpu(struct fprop_local_percpu *pl) {int err; - err =percpu_counter_init (&pl->events,0 ); + err =percpu_counter_init (&pl->events,0 ,GFP_KERNEL );if (err)return err; pl->period =0 ;
lib/percpu_counter.c +2 -2
@@ -112,13 +112,13 @@ s64 __percpu_counter_sum(struct percpu_counter *fbc) }EXPORT_SYMBOL (__percpu_counter_sum); -int __percpu_counter_init (struct percpu_counter *fbc,s64 amount, +int __percpu_counter_init (struct percpu_counter *fbc,s64 amount,gfp_t gfp,struct lock_class_key *key) {raw_spin_lock_init (&fbc->lock);lockdep_set_class (&fbc->lock, key); fbc->count = amount; - fbc->counters =alloc_percpu (s32); + fbc->counters =alloc_percpu_gfp (s32, gfp);if (!fbc->counters)return -ENOMEM ;
lib/proportions.c +3 -3
@@ -83,11 +83,11 @@ int prop_descriptor_init(struct prop_descriptor *pd, int shift) pd->index =0 ; pd->pg[0 ].shift = shift;mutex_init (&pd->mutex); - err =percpu_counter_init (&pd->pg[0 ].events,0 ); + err =percpu_counter_init (&pd->pg[0 ].events,0 ,GFP_KERNEL );if (err) goto out; - err =percpu_counter_init (&pd->pg[1 ].events,0 ); + err =percpu_counter_init (&pd->pg[1 ].events,0 ,GFP_KERNEL );if (err)percpu_counter_destroy (&pd->pg[0 ].events);
@@ -193,7 +193,7 @@ int prop_local_init_percpu(struct prop_local_percpu *pl)raw_spin_lock_init (&pl->lock); pl->shift =0 ; pl->period =0 ; -return percpu_counter_init (&pl->events,0 ); +return percpu_counter_init (&pl->events,0 ,GFP_KERNEL ); }void prop_local_destroy_percpu (struct prop_local_percpu *pl)
mm/backing-dev.c +1 -1
@@ -455,7 +455,7 @@ int bdi_init(struct backing_dev_info *bdi)bdi_wb_init (&bdi->wb, bdi);for (i =0 ; i <NR_BDI_STAT_ITEMS ; i++) { - err =percpu_counter_init (&bdi->bdi_stat[i],0 ); + err =percpu_counter_init (&bdi->bdi_stat[i],0 ,GFP_KERNEL );if (err) goto err; }
mm/mmap.c +1 -1
@@ -3196,7 +3196,7 @@ void __init mmap_init(void) {int ret; - ret =percpu_counter_init (&vm_committed_as,0 ); + ret =percpu_counter_init (&vm_committed_as,0 ,GFP_KERNEL );VM_BUG_ON (ret); }
mm/nommu.c +1 -1
@@ -539,7 +539,7 @@ void __init mmap_init(void) {int ret; - ret =percpu_counter_init (&vm_committed_as,0 ); + ret =percpu_counter_init (&vm_committed_as,0 ,GFP_KERNEL );VM_BUG_ON (ret); vm_region_jar =KMEM_CACHE (vm_region,SLAB_PANIC ); }
mm/shmem.c +1 -1
@@ -2993,7 +2993,7 @@ int shmem_fill_super(struct super_block *sb, void *data, int silent)#endif spin_lock_init (&sbinfo->stat_lock); -if (percpu_counter_init (&sbinfo->used_blocks,0 )) +if (percpu_counter_init (&sbinfo->used_blocks,0 ,GFP_KERNEL )) goto failed; sbinfo->free_inodes = sbinfo->max_inodes;
net/dccp/proto.c +1 -1
@@ -1115,7 +1115,7 @@ static int __init dccp_init(void)BUILD_BUG_ON (sizeof (struct dccp_skb_cb ) > FIELD_SIZEOF(struct sk_buff, cb)); - rc =percpu_counter_init (&dccp_orphan_count,0 ); + rc =percpu_counter_init (&dccp_orphan_count,0 ,GFP_KERNEL );if (rc) goto out_fail; rc = -ENOBUFS ;
net/ipv4/tcp.c +2 -2
@@ -3188,8 +3188,8 @@ void __init tcp_init(void)BUILD_BUG_ON (sizeof (struct tcp_skb_cb ) >sizeof (skb->cb)); -percpu_counter_init (&tcp_sockets_allocated,0 ); -percpu_counter_init (&tcp_orphan_count,0 ); +percpu_counter_init (&tcp_sockets_allocated,0 ,GFP_KERNEL ); +percpu_counter_init (&tcp_orphan_count,0 ,GFP_KERNEL ); tcp_hashinfo.bind_bucket_cachep = kmem_cache_create("tcp_bind_bucket", sizeof(struct inet_bind_bucket), 0,
net/ipv4/tcp_memcontrol.c +1 -1
@@ -32,7 +32,7 @@ int tcp_init_cgroup(struct mem_cgroup *memcg, struct cgroup_subsys *ss) res_parent = &parent_cg->memory_allocated;res_counter_init (&cg_proto->memory_allocated, res_parent); -percpu_counter_init (&cg_proto->sockets_allocated,0 ); +percpu_counter_init (&cg_proto->sockets_allocated,0 ,GFP_KERNEL );return 0 ; }
net/sctp/protocol.c +1 -1
@@ -1341,7 +1341,7 @@ static __init int sctp_init(void)if (!sctp_chunk_cachep) goto err_chunk_cachep; - status =percpu_counter_init (&sctp_sockets_allocated,0 ); + status =percpu_counter_init (&sctp_sockets_allocated,0 ,GFP_KERNEL );if (status) goto err_percpu_counter_init;
Signature · 1 line
1.9.3
Re: [PATCH 1/3] percpu_counter: add @gfp to percpu_counter_init()
From: Tejun Heo <[email protected]>
Date: Mon, 25 Aug 2014 20:43:30 -0400
Quoted 11 lines
Percpu allocator now supports allocation mask. Add @gfp to
percpu_counter_init()so that !GFP_KERNEL allocation masks can be used withpercpu_counterstoo.We could have left
percpu_counter_init()alone and addedpercpu_counter_init_gfp(); however, the number of users isn't that high and introducing_gfpvariants to all percpu data structures would be quite ugly, so let's just do the conversion. This is the one with the most users. Other percpu data structures are a lot easier to convert.
Quoted 3 lines
This patch doesn't make any functional difference.
Signed-off-by Tejun Heo <[email protected]>
For networking bits:
Re: [PATCH 1/3] percpu_counter: add @gfp to percpu_counter_init()
In reply to Tejun HeoQuoted 13 lines · Tejun Heo
Percpu allocator now supports allocation mask. Add @gfp to
percpu_counter_init()so that !GFP_KERNEL allocation masks can be used withpercpu_counterstoo.We could have left
percpu_counter_init()alone and addedpercpu_counter_init_gfp(); however, the number of users isn't that high and introducing_gfpvariants to all percpu data structures would be quite ugly, so let's just do the conversion. This is the one with the most users. Other percpu data structures are a lot easier to convert.This patch doesn't make any functional difference.
Quoted 8 lines
Signed-off-by Tejun Heo <[email protected]>Cc Jens Axboe <[email protected]>Cc Jan Kara <[email protected]>Cc "Theodore Ts'o" <[email protected]>Cc Alexander Viro <[email protected]>Cc "David S. Miller" <[email protected]>Cc Andrew Morton <[email protected]>
For the ext?, quota, lib, bdi parts:
Quoted 455 lines
--- arch/x86/kvm/mmu.c | 2 +- fs/btrfs/disk-io.c | 8 ++++---- fs/btrfs/extent-tree.c | 2 +- fs/ext2/super.c | 6 +++--- fs/ext3/super.c | 6 +++--- fs/ext4/super.c | 14 +++++++++----- fs/file_table.c | 2 +- fs/quota/dquot.c | 2 +- fs/super.c | 3 ++- include/linux/percpu_counter.h | 10 ++++++---- include/net/dst_ops.h | 2 +- include/net/inet_frag.h | 2 +- lib/flex_proportions.c | 4 ++-- lib/percpu_counter.c | 4 ++-- lib/proportions.c | 6 +++--- mm/backing-dev.c | 2 +- mm/mmap.c | 2 +- mm/nommu.c | 2 +- mm/shmem.c | 2 +- net/dccp/proto.c | 2 +- net/ipv4/tcp.c | 4 ++-- net/ipv4/tcp_memcontrol.c | 2 +- net/sctp/protocol.c | 2 +- 23 files changed, 49 insertions(+), 42 deletions(-)arch/x86/kvm/mmu.c +1
-1@@ -4534,7 +4534,7 @@ int kvm_mmu_module_init(void)if (!mmu_page_header_cache) goto nomem; -if (percpu_counter_init (&kvm_total_used_mmu_pages,0 )) +if (percpu_counter_init (&kvm_total_used_mmu_pages,0 ,GFP_KERNEL )) goto nomem;register_shrinker (&mmu_shrinker);fs/btrfs/disk-io.c +4
-4@@ -1180,7 +1180,7 @@ static struct btrfs_subvolume_writers *btrfs_alloc_subvolume_writers(void)if (!writers)return ERR_PTR (-ENOMEM ); - ret =percpu_counter_init (&writers->counter,0 ); + ret =percpu_counter_init (&writers->counter,0 ,GFP_KERNEL );if (ret <0 ) {kfree (writers);return ERR_PTR (ret);@@ -2185,7 +2185,7 @@ int open_ctree(struct super_block *sb, goto fail_srcu; } - ret =percpu_counter_init (&fs_info->dirty_metadata_bytes,0 ); + ret =percpu_counter_init (&fs_info->dirty_metadata_bytes,0 ,GFP_KERNEL );if (ret) { err = ret; goto fail_bdi;@@ -2193,13 +2193,13 @@ int open_ctree(struct super_block *sb, fs_info->dirty_metadata_batch =PAGE_CACHE_SIZE * (1 +ilog2 (nr_cpu_ids)); - ret =percpu_counter_init (&fs_info->delalloc_bytes,0 ); + ret =percpu_counter_init (&fs_info->delalloc_bytes,0 ,GFP_KERNEL );if (ret) { err = ret; goto fail_dirty_metadata_bytes; } - ret =percpu_counter_init (&fs_info->bio_counter,0 ); + ret =percpu_counter_init (&fs_info->bio_counter,0 ,GFP_KERNEL );if (ret) { err = ret; goto fail_delalloc_bytes;fs/btrfs/extent-tree.c +1
-1@@ -3493,7 +3493,7 @@ static int update_space_info(struct btrfs_fs_info *info, u64 flags,if (!found)return -ENOMEM ; - ret =percpu_counter_init (&found->total_bytes_pinned,0 ); + ret =percpu_counter_init (&found->total_bytes_pinned,0 ,GFP_KERNEL );if (ret) {kfree (found);return ret;fs/ext2/super.c +3
-3@@ -1067,14 +1067,14 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent)ext2_rsv_window_add (sb, &sbi->s_rsv_window_head); err =percpu_counter_init (&sbi->s_freeblocks_counter, -ext2_count_free_blocks (sb)); +ext2_count_free_blocks (sb),GFP_KERNEL );if (!err) { err =percpu_counter_init (&sbi->s_freeinodes_counter, -ext2_count_free_inodes (sb)); +ext2_count_free_inodes (sb),GFP_KERNEL ); }if (!err) { err =percpu_counter_init (&sbi->s_dirs_counter, -ext2_count_dirs (sb)); +ext2_count_dirs (sb),GFP_KERNEL ); }if (err) {ext2_msg (sb,KERN_ERR ,"error: insufficient memory" );fs/ext3/super.c +3
-3@@ -2039,14 +2039,14 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent) goto failed_mount2; } err =percpu_counter_init (&sbi->s_freeblocks_counter, -ext3_count_free_blocks (sb)); +ext3_count_free_blocks (sb),GFP_KERNEL );if (!err) { err =percpu_counter_init (&sbi->s_freeinodes_counter, -ext3_count_free_inodes (sb)); +ext3_count_free_inodes (sb),GFP_KERNEL ); }if (!err) { err =percpu_counter_init (&sbi->s_dirs_counter, -ext3_count_dirs (sb)); +ext3_count_dirs (sb),GFP_KERNEL ); }if (err) {ext3_msg (sb,KERN_ERR ,"error: insufficient memory" );fs/ext4/super.c +9
-5@@ -3891,7 +3891,8 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)/* Register extent status tree shrinker */ ext4_es_register_shrinker (sbi); -if ((err =percpu_counter_init (&sbi->s_extent_cache_cnt,0 )) !=0 ) { + err =percpu_counter_init (&sbi->s_extent_cache_cnt,0 ,GFP_KERNEL ); +if (err) {ext4_msg (sb,KERN_ERR ,"insufficient memory" ); goto failed_mount3; }@@ -4105,17 +4106,20 @@ no_journal: block =ext4_count_free_clusters (sb);ext4_free_blocks_count_set (sbi->s_es,EXT4_C2B (sbi, block)); - err =percpu_counter_init (&sbi->s_freeclusters_counter, block); + err =percpu_counter_init (&sbi->s_freeclusters_counter, block, +GFP_KERNEL );if (!err) {unsigned long freei =ext4_count_free_inodes (sb); sbi->s_es->s_free_inodes_count =cpu_to_le32 (freei); - err =percpu_counter_init (&sbi->s_freeinodes_counter, freei); + err =percpu_counter_init (&sbi->s_freeinodes_counter, freei, +GFP_KERNEL ); }if (!err) err =percpu_counter_init (&sbi->s_dirs_counter, -ext4_count_dirs (sb)); +ext4_count_dirs (sb),GFP_KERNEL );if (!err) - err =percpu_counter_init (&sbi->s_dirtyclusters_counter,0 ); + err =percpu_counter_init (&sbi->s_dirtyclusters_counter,0 , +GFP_KERNEL );if (err) {ext4_msg (sb,KERN_ERR ,"insufficient memory" ); goto failed_mount6;fs/file_table.c +1
-1@@ -331,5 +331,5 @@ void __init files_init(unsigned long mempages) n = (mempages * (PAGE_SIZE /1024 )) /10 ; files_stat.max_files = max_t(unsigned long, n, NR_FILE); -percpu_counter_init (&nr_files,0 ); +percpu_counter_init (&nr_files,0 ,GFP_KERNEL ); }fs/quota/dquot.c +1
-1@@ -2725,7 +2725,7 @@ static int __init dquot_init(void)panic ("Cannot create dquot hash table" );for (i =0 ; i < _DQST_DQSTAT_LAST; i++) { - ret =percpu_counter_init (&dqstats.counter[i],0 ); + ret =percpu_counter_init (&dqstats.counter[i],0 ,GFP_KERNEL );if (ret)panic ("Cannot create dquot stat counters" ); }fs/super.c +2
-1@@ -175,7 +175,8 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags) goto fail;for (i =0 ; i <SB_FREEZE_LEVELS ; i++) { -if (percpu_counter_init (&s->s_writers.counter[i],0 ) <0 ) +if (percpu_counter_init (&s->s_writers.counter[i],0 , +GFP_KERNEL ) <0 ) goto fail;lockdep_init_map (&s->s_writers.lock_map[i], sb_writers_name[i], &type->s_writers_key[i],0 );include/linux/percpu_counter.h +6
-4@@ -12,6 +12,7 @@#include <linux/threads.h> #include <linux/percpu.h> #include <linux/types.h> +#include <linux/gfp.h> #ifdef CONFIG_SMP @@ -26,14 +27,14 @@ struct percpu_counter {extern int percpu_counter_batch; -int __percpu_counter_init (struct percpu_counter *fbc,s64 amount, +int __percpu_counter_init (struct percpu_counter *fbc,s64 amount,gfp_t gfp,struct lock_class_key *key); -#define percpu_counter_init (fbc, value) \ +#define percpu_counter_init (fbc, value, gfp) \ ({ \ static struct lock_class_key __key; \ \ - __percpu_counter_init(fbc, value, &__key); \ + __percpu_counter_init(fbc, value, gfp, &__key); \ })void percpu_counter_destroy (struct percpu_counter *fbc);@@ -89,7 +90,8 @@ struct percpu_counter {s64 count; }; -static inline int percpu_counter_init (struct percpu_counter *fbc,s64 amount) +static inline int percpu_counter_init (struct percpu_counter *fbc,s64 amount, +gfp_t gfp) { fbc->count = amount;return 0 ;include/net/dst_ops.h +1
-1@@ -63,7 +63,7 @@ static inline void dst_entries_add(struct dst_ops *dst, int val)static inline int dst_entries_init (struct dst_ops *dst) { -return percpu_counter_init (&dst->pcpuc_entries,0 ); +return percpu_counter_init (&dst->pcpuc_entries,0 ,GFP_KERNEL ); }static inline void dst_entries_destroy (struct dst_ops *dst)include/net/inet_frag.h +1
-1@@ -151,7 +151,7 @@ static inline void add_frag_mem_limit(struct inet_frag_queue *q, int i)static inline void init_frag_mem_limit (struct netns_frags *nf) { -percpu_counter_init (&nf->mem,0 ); +percpu_counter_init (&nf->mem,0 ,GFP_KERNEL ); }static inline unsigned int sum_frag_mem_limit (struct netns_frags *nf)lib/flex_proportions.c +2
-2@@ -40,7 +40,7 @@ int fprop_global_init(struct fprop_global *p) p->period =0 ;/* Use 1 to avoid dealing with periods with 0 events... */ - err =percpu_counter_init (&p->events,1 ); + err =percpu_counter_init (&p->events,1 ,GFP_KERNEL );if (err)return err;seqcount_init (&p->sequence);@@ -172,7 +172,7 @@ int fprop_local_init_percpu(struct fprop_local_percpu *pl) {int err; - err =percpu_counter_init (&pl->events,0 ); + err =percpu_counter_init (&pl->events,0 ,GFP_KERNEL );if (err)return err; pl->period =0 ;lib/percpu_counter.c +2
-2@@ -112,13 +112,13 @@ s64 __percpu_counter_sum(struct percpu_counter *fbc) }EXPORT_SYMBOL (__percpu_counter_sum); -int __percpu_counter_init (struct percpu_counter *fbc,s64 amount, +int __percpu_counter_init (struct percpu_counter *fbc,s64 amount,gfp_t gfp,struct lock_class_key *key) {raw_spin_lock_init (&fbc->lock);lockdep_set_class (&fbc->lock, key); fbc->count = amount; - fbc->counters =alloc_percpu (s32); + fbc->counters =alloc_percpu_gfp (s32, gfp);if (!fbc->counters)return -ENOMEM ;lib/proportions.c +3
-3@@ -83,11 +83,11 @@ int prop_descriptor_init(struct prop_descriptor *pd, int shift) pd->index =0 ; pd->pg[0 ].shift = shift;mutex_init (&pd->mutex); - err =percpu_counter_init (&pd->pg[0 ].events,0 ); + err =percpu_counter_init (&pd->pg[0 ].events,0 ,GFP_KERNEL );if (err) goto out; - err =percpu_counter_init (&pd->pg[1 ].events,0 ); + err =percpu_counter_init (&pd->pg[1 ].events,0 ,GFP_KERNEL );if (err)percpu_counter_destroy (&pd->pg[0 ].events);@@ -193,7 +193,7 @@ int prop_local_init_percpu(struct prop_local_percpu *pl)raw_spin_lock_init (&pl->lock); pl->shift =0 ; pl->period =0 ; -return percpu_counter_init (&pl->events,0 ); +return percpu_counter_init (&pl->events,0 ,GFP_KERNEL ); }void prop_local_destroy_percpu (struct prop_local_percpu *pl)mm/backing-dev.c +1
-1@@ -455,7 +455,7 @@ int bdi_init(struct backing_dev_info *bdi)bdi_wb_init (&bdi->wb, bdi);for (i =0 ; i <NR_BDI_STAT_ITEMS ; i++) { - err =percpu_counter_init (&bdi->bdi_stat[i],0 ); + err =percpu_counter_init (&bdi->bdi_stat[i],0 ,GFP_KERNEL );if (err) goto err; }mm/mmap.c +1
-1@@ -3196,7 +3196,7 @@ void __init mmap_init(void) {int ret; - ret =percpu_counter_init (&vm_committed_as,0 ); + ret =percpu_counter_init (&vm_committed_as,0 ,GFP_KERNEL );VM_BUG_ON (ret); }mm/nommu.c +1
-1@@ -539,7 +539,7 @@ void __init mmap_init(void) {int ret; - ret =percpu_counter_init (&vm_committed_as,0 ); + ret =percpu_counter_init (&vm_committed_as,0 ,GFP_KERNEL );VM_BUG_ON (ret); vm_region_jar =KMEM_CACHE (vm_region,SLAB_PANIC ); }mm/shmem.c +1
-1@@ -2993,7 +2993,7 @@ int shmem_fill_super(struct super_block *sb, void *data, int silent)#endif spin_lock_init (&sbinfo->stat_lock); -if (percpu_counter_init (&sbinfo->used_blocks,0 )) +if (percpu_counter_init (&sbinfo->used_blocks,0 ,GFP_KERNEL )) goto failed; sbinfo->free_inodes = sbinfo->max_inodes;net/dccp/proto.c +1
-1@@ -1115,7 +1115,7 @@ static int __init dccp_init(void)BUILD_BUG_ON (sizeof (struct dccp_skb_cb ) > FIELD_SIZEOF(struct sk_buff, cb)); - rc =percpu_counter_init (&dccp_orphan_count,0 ); + rc =percpu_counter_init (&dccp_orphan_count,0 ,GFP_KERNEL );if (rc) goto out_fail; rc = -ENOBUFS ;net/ipv4/tcp.c +2
-2@@ -3188,8 +3188,8 @@ void __init tcp_init(void)BUILD_BUG_ON (sizeof (struct tcp_skb_cb ) >sizeof (skb->cb)); -percpu_counter_init (&tcp_sockets_allocated,0 ); -percpu_counter_init (&tcp_orphan_count,0 ); +percpu_counter_init (&tcp_sockets_allocated,0 ,GFP_KERNEL ); +percpu_counter_init (&tcp_orphan_count,0 ,GFP_KERNEL ); tcp_hashinfo.bind_bucket_cachep = kmem_cache_create("tcp_bind_bucket", sizeof(struct inet_bind_bucket), 0,net/ipv4/tcp_memcontrol.c +1
-1@@ -32,7 +32,7 @@ int tcp_init_cgroup(struct mem_cgroup *memcg, struct cgroup_subsys *ss) res_parent = &parent_cg->memory_allocated;res_counter_init (&cg_proto->memory_allocated, res_parent); -percpu_counter_init (&cg_proto->sockets_allocated,0 ); +percpu_counter_init (&cg_proto->sockets_allocated,0 ,GFP_KERNEL );return 0 ; }net/sctp/protocol.c +1
-1@@ -1341,7 +1341,7 @@ static __init int sctp_init(void)if (!sctp_chunk_cachep) goto err_chunk_cachep; - status =percpu_counter_init (&sctp_sockets_allocated,0 ); + status =percpu_counter_init (&sctp_sockets_allocated,0 ,GFP_KERNEL );if (status) goto err_percpu_counter_init;Signature · 1 line
1.9.3
Signature · 2 lines
Jan Kara <[email protected]> SUSE Labs, CR
Tejun Heo
maintainerPATCH 2/3 proportions: add @gfp to init functions
In reply to Tejun HeoPercpu allocator now supports allocation mask. Add @gfp to [flex_]proportions init functions so that !GFP_KERNEL allocation masks can be used with them too.
This patch doesn't make any functional difference.
--- include/linux/flex_proportions.h | 5 +++-- include/linux/proportions.h | 5 +++-- lib/flex_proportions.c | 8 ++++---- lib/proportions.c | 10 +++++----- mm/backing-dev.c | 2 +- mm/page-writeback.c | 2 +- 6 files changed, 17 insertions(+), 15 deletions(-)
include/linux/flex_proportions.h +3 -2
@@ -10,6 +10,7 @@#include <linux/percpu_counter.h> #include <linux/spinlock.h> #include <linux/seqlock.h> +#include <linux/gfp.h> /* * When maximum proportion of some event type is specified, this is the
@@ -32,7 +33,7 @@ struct fprop_global {seqcount_t sequence; }; -int fprop_global_init (struct fprop_global *p); +int fprop_global_init (struct fprop_global *p,gfp_t gfp);void fprop_global_destroy (struct fprop_global *p);bool fprop_new_period (struct fprop_global *p,int periods);
@@ -79,7 +80,7 @@ struct fprop_local_percpu {raw_spinlock_t lock;/* Protect period and numerator */ }; -int fprop_local_init_percpu (struct fprop_local_percpu *pl); +int fprop_local_init_percpu (struct fprop_local_percpu *pl,gfp_t gfp);void fprop_local_destroy_percpu (struct fprop_local_percpu *pl);void __fprop_inc_percpu (struct fprop_global *p,struct fprop_local_percpu *pl); void __fprop_inc_percpu_max(struct fprop_global *p, struct fprop_local_percpu *pl,
include/linux/proportions.h +3 -2
@@ -12,6 +12,7 @@#include <linux/percpu_counter.h> #include <linux/spinlock.h> #include <linux/mutex.h> +#include <linux/gfp.h> struct prop_global {/*
@@ -40,7 +41,7 @@ struct prop_descriptor {struct mutex mutex;/* serialize the prop_global switch */ }; -int prop_descriptor_init (struct prop_descriptor *pd,int shift); +int prop_descriptor_init (struct prop_descriptor *pd,int shift,gfp_t gfp);void prop_change_shift (struct prop_descriptor *pd,int new_shift);/*
@@ -61,7 +62,7 @@ struct prop_local_percpu {raw_spinlock_t lock;/* protect the snapshot state */ }; -int prop_local_init_percpu (struct prop_local_percpu *pl); +int prop_local_init_percpu (struct prop_local_percpu *pl,gfp_t gfp);void prop_local_destroy_percpu (struct prop_local_percpu *pl);void __prop_inc_percpu (struct prop_descriptor *pd,struct prop_local_percpu *pl); void prop_fraction_percpu(struct prop_descriptor *pd, struct prop_local_percpu *pl,
lib/flex_proportions.c +4 -4
@@ -34,13 +34,13 @@*/ #include <linux/flex_proportions.h> -int fprop_global_init (struct fprop_global *p) +int fprop_global_init (struct fprop_global *p,gfp_t gfp) {int err; p->period =0 ;/* Use 1 to avoid dealing with periods with 0 events... */ - err =percpu_counter_init (&p->events,1 ,GFP_KERNEL ); + err =percpu_counter_init (&p->events,1 , gfp);if (err)return err;seqcount_init (&p->sequence);
@@ -168,11 +168,11 @@ void fprop_fraction_single(struct fprop_global *p,*/ #define PROP_BATCH (8*(1+ilog2(nr_cpu_ids))) -int fprop_local_init_percpu (struct fprop_local_percpu *pl) +int fprop_local_init_percpu (struct fprop_local_percpu *pl,gfp_t gfp) {int err; - err =percpu_counter_init (&pl->events,0 ,GFP_KERNEL ); + err =percpu_counter_init (&pl->events,0 , gfp);if (err)return err; pl->period =0 ;
lib/proportions.c +5 -5
@@ -73,7 +73,7 @@#include <linux/proportions.h> #include <linux/rcupdate.h> -int prop_descriptor_init (struct prop_descriptor *pd,int shift) +int prop_descriptor_init (struct prop_descriptor *pd,int shift,gfp_t gfp) {int err;
@@ -83,11 +83,11 @@ int prop_descriptor_init(struct prop_descriptor *pd, int shift) pd->index =0 ; pd->pg[0 ].shift = shift;mutex_init (&pd->mutex); - err =percpu_counter_init (&pd->pg[0 ].events,0 ,GFP_KERNEL ); + err =percpu_counter_init (&pd->pg[0 ].events,0 , gfp);if (err) goto out; - err =percpu_counter_init (&pd->pg[1 ].events,0 ,GFP_KERNEL ); + err =percpu_counter_init (&pd->pg[1 ].events,0 , gfp);if (err)percpu_counter_destroy (&pd->pg[0 ].events);
@@ -188,12 +188,12 @@ prop_adjust_shift(int *pl_shift, unsigned long *pl_period, int new_shift)#define PROP_BATCH (8*(1+ilog2(nr_cpu_ids))) -int prop_local_init_percpu (struct prop_local_percpu *pl) +int prop_local_init_percpu (struct prop_local_percpu *pl,gfp_t gfp) {raw_spin_lock_init (&pl->lock); pl->shift =0 ; pl->period =0 ; -return percpu_counter_init (&pl->events,0 ,GFP_KERNEL ); +return percpu_counter_init (&pl->events,0 , gfp); }void prop_local_destroy_percpu (struct prop_local_percpu *pl)
mm/backing-dev.c +1 -1
@@ -470,7 +470,7 @@ int bdi_init(struct backing_dev_info *bdi) bdi->write_bandwidth =INIT_BW ; bdi->avg_write_bandwidth =INIT_BW ; - err =fprop_local_init_percpu (&bdi->completions); + err =fprop_local_init_percpu (&bdi->completions,GFP_KERNEL );if (err) { err:
mm/page-writeback.c +1 -1
@@ -1777,7 +1777,7 @@ void __init page_writeback_init(void)writeback_set_ratelimit ();register_cpu_notifier (&ratelimit_nb); -fprop_global_init (&writeout_completions); +fprop_global_init (&writeout_completions,GFP_KERNEL ); }/**
Signature · 1 line
1.9.3
Re: [PATCH 2/3] proportions: add @gfp to init functions
Quoted 5 lines · Tejun Heo
Percpu allocator now supports allocation mask. Add @gfp to [flex_]proportions init functions so that !GFP_KERNEL allocation masks can be used with them too.
This patch doesn't make any functional difference.
Looks good to me. You can add:
Honza
Quoted 178 lines
Signed-off-by Tejun Heo <[email protected]>Cc Jan Kara <[email protected]>Cc Peter Zijlstra <[email protected]>--- include/linux/flex_proportions.h | 5 +++-- include/linux/proportions.h | 5 +++-- lib/flex_proportions.c | 8 ++++---- lib/proportions.c | 10 +++++----- mm/backing-dev.c | 2 +- mm/page-writeback.c | 2 +- 6 files changed, 17 insertions(+), 15 deletions(-)include/linux/flex_proportions.h +3
-2@@ -10,6 +10,7 @@#include <linux/percpu_counter.h> #include <linux/spinlock.h> #include <linux/seqlock.h> +#include <linux/gfp.h> /* * When maximum proportion of some event type is specified, this is the @@ -32,7 +33,7 @@ struct fprop_global {seqcount_t sequence; }; -int fprop_global_init (struct fprop_global *p); +int fprop_global_init (struct fprop_global *p,gfp_t gfp);void fprop_global_destroy (struct fprop_global *p);bool fprop_new_period (struct fprop_global *p,int periods);@@ -79,7 +80,7 @@ struct fprop_local_percpu {raw_spinlock_t lock;/* Protect period and numerator */ }; -int fprop_local_init_percpu (struct fprop_local_percpu *pl); +int fprop_local_init_percpu (struct fprop_local_percpu *pl,gfp_t gfp);void fprop_local_destroy_percpu (struct fprop_local_percpu *pl);void __fprop_inc_percpu (struct fprop_global *p,struct fprop_local_percpu *pl); void __fprop_inc_percpu_max(struct fprop_global *p, struct fprop_local_percpu *pl,include/linux/proportions.h +3
-2@@ -12,6 +12,7 @@#include <linux/percpu_counter.h> #include <linux/spinlock.h> #include <linux/mutex.h> +#include <linux/gfp.h> struct prop_global {/* @@ -40,7 +41,7 @@ struct prop_descriptor {struct mutex mutex;/* serialize the prop_global switch */ }; -int prop_descriptor_init (struct prop_descriptor *pd,int shift); +int prop_descriptor_init (struct prop_descriptor *pd,int shift,gfp_t gfp);void prop_change_shift (struct prop_descriptor *pd,int new_shift);/* @@ -61,7 +62,7 @@ struct prop_local_percpu {raw_spinlock_t lock;/* protect the snapshot state */ }; -int prop_local_init_percpu (struct prop_local_percpu *pl); +int prop_local_init_percpu (struct prop_local_percpu *pl,gfp_t gfp);void prop_local_destroy_percpu (struct prop_local_percpu *pl);void __prop_inc_percpu (struct prop_descriptor *pd,struct prop_local_percpu *pl); void prop_fraction_percpu(struct prop_descriptor *pd, struct prop_local_percpu *pl,lib/flex_proportions.c +4
-4@@ -34,13 +34,13 @@*/ #include <linux/flex_proportions.h> -int fprop_global_init (struct fprop_global *p) +int fprop_global_init (struct fprop_global *p,gfp_t gfp) {int err; p->period =0 ;/* Use 1 to avoid dealing with periods with 0 events... */ - err =percpu_counter_init (&p->events,1 ,GFP_KERNEL ); + err =percpu_counter_init (&p->events,1 , gfp);if (err)return err;seqcount_init (&p->sequence);@@ -168,11 +168,11 @@ void fprop_fraction_single(struct fprop_global *p,*/ #define PROP_BATCH (8*(1+ilog2(nr_cpu_ids))) -int fprop_local_init_percpu (struct fprop_local_percpu *pl) +int fprop_local_init_percpu (struct fprop_local_percpu *pl,gfp_t gfp) {int err; - err =percpu_counter_init (&pl->events,0 ,GFP_KERNEL ); + err =percpu_counter_init (&pl->events,0 , gfp);if (err)return err; pl->period =0 ;lib/proportions.c +5
-5@@ -73,7 +73,7 @@#include <linux/proportions.h> #include <linux/rcupdate.h> -int prop_descriptor_init (struct prop_descriptor *pd,int shift) +int prop_descriptor_init (struct prop_descriptor *pd,int shift,gfp_t gfp) {int err;@@ -83,11 +83,11 @@ int prop_descriptor_init(struct prop_descriptor *pd, int shift) pd->index =0 ; pd->pg[0 ].shift = shift;mutex_init (&pd->mutex); - err =percpu_counter_init (&pd->pg[0 ].events,0 ,GFP_KERNEL ); + err =percpu_counter_init (&pd->pg[0 ].events,0 , gfp);if (err) goto out; - err =percpu_counter_init (&pd->pg[1 ].events,0 ,GFP_KERNEL ); + err =percpu_counter_init (&pd->pg[1 ].events,0 , gfp);if (err)percpu_counter_destroy (&pd->pg[0 ].events);@@ -188,12 +188,12 @@ prop_adjust_shift(int *pl_shift, unsigned long *pl_period, int new_shift)#define PROP_BATCH (8*(1+ilog2(nr_cpu_ids))) -int prop_local_init_percpu (struct prop_local_percpu *pl) +int prop_local_init_percpu (struct prop_local_percpu *pl,gfp_t gfp) {raw_spin_lock_init (&pl->lock); pl->shift =0 ; pl->period =0 ; -return percpu_counter_init (&pl->events,0 ,GFP_KERNEL ); +return percpu_counter_init (&pl->events,0 , gfp); }void prop_local_destroy_percpu (struct prop_local_percpu *pl)mm/backing-dev.c +1
-1@@ -470,7 +470,7 @@ int bdi_init(struct backing_dev_info *bdi) bdi->write_bandwidth =INIT_BW ; bdi->avg_write_bandwidth =INIT_BW ; - err =fprop_local_init_percpu (&bdi->completions); + err =fprop_local_init_percpu (&bdi->completions,GFP_KERNEL );if (err) { err:mm/page-writeback.c +1
-1@@ -1777,7 +1777,7 @@ void __init page_writeback_init(void)writeback_set_ratelimit ();register_cpu_notifier (&ratelimit_nb); -fprop_global_init (&writeout_completions); +fprop_global_init (&writeout_completions,GFP_KERNEL ); }/** Signature · 1 line
1.9.3
Signature · 2 lines
Jan Kara <[email protected]> SUSE Labs, CR
Tejun Heo
maintainerPATCH 3/3 percpu-refcount: add @gfp to percpu_ref_init()
In reply to Tejun HeoPercpu allocator now supports allocation mask. Add @gfp to percpu_ref_init() so that !GFP_KERNEL allocation masks can be used with percpu_refs too.
This patch doesn't make any functional difference.
--- drivers/target/target_core_tpg.c | 3 ++- fs/aio.c | 4 ++-- include/linux/percpu-refcount.h | 3 ++- kernel/cgroup.c | 6 +++--- lib/percpu-refcount.c | 6 ++++-- 5 files changed, 13 insertions(+), 9 deletions(-)
drivers/target/target_core_tpg.c +2 -1
@@ -819,7 +819,8 @@ int core_tpg_add_lun( {int ret; - ret =percpu_ref_init (&lun->lun_ref, core_tpg_lun_ref_release); + ret =percpu_ref_init (&lun->lun_ref, core_tpg_lun_ref_release, +GFP_KERNEL );if (ret <0 )return ret;
fs/aio.c +2 -2
@@ -666,10 +666,10 @@ static struct kioctx *ioctx_alloc(unsigned nr_events)INIT_LIST_HEAD (&ctx->active_reqs); -if (percpu_ref_init (&ctx->users, free_ioctx_users)) +if (percpu_ref_init (&ctx->users, free_ioctx_users,GFP_KERNEL )) goto err; -if (percpu_ref_init (&ctx->reqs, free_ioctx_reqs)) +if (percpu_ref_init (&ctx->reqs, free_ioctx_reqs,GFP_KERNEL )) goto err; ctx->cpu = alloc_percpu(struct kioctx_cpu);
include/linux/percpu-refcount.h +2 -1
@@ -49,6 +49,7 @@#include <linux/kernel.h> #include <linux/percpu.h> #include <linux/rcupdate.h> +#include <linux/gfp.h> struct percpu_ref ;typedef void (percpu_ref_func_t )(struct percpu_ref *);
@@ -66,7 +67,7 @@ struct percpu_ref { };int __must_check percpu_ref_init (struct percpu_ref *ref, -percpu_ref_func_t *release); +percpu_ref_func_t *release,gfp_t gfp);void percpu_ref_reinit (struct percpu_ref *ref);void percpu_ref_exit (struct percpu_ref *ref); void percpu_ref_kill_and_confirm(struct percpu_ref *ref,
kernel/cgroup.c +3 -3
@@ -1628,7 +1628,7 @@ static int cgroup_setup_root(struct cgroup_root *root, unsigned int ss_mask) goto out; root_cgrp->id = ret; - ret =percpu_ref_init (&root_cgrp->self.refcnt, css_release); + ret =percpu_ref_init (&root_cgrp->self.refcnt, css_release,GFP_KERNEL );if (ret) goto out;
@@ -4487,7 +4487,7 @@ static int create_css(struct cgroup *cgrp, struct cgroup_subsys *ss,init_and_link_css (css, ss, cgrp); - err =percpu_ref_init (&css->refcnt, css_release); + err =percpu_ref_init (&css->refcnt, css_release,GFP_KERNEL );if (err) goto err_free_css;
@@ -4555,7 +4555,7 @@ static int cgroup_mkdir(struct kernfs_node *parent_kn, const char *name, goto out_unlock; } - ret =percpu_ref_init (&cgrp->self.refcnt, css_release); + ret =percpu_ref_init (&cgrp->self.refcnt, css_release,GFP_KERNEL );if (ret) goto out_free_cgrp;
lib/percpu-refcount.c +4 -2
@@ -40,6 +40,7 @@ static unsigned __percpu *pcpu_count_ptr(struct percpu_ref *ref)* percpu_ref_init - initialize a percpu refcount * @ref: percpu_ref to initialize * @release: function which will be called when refcount hits 0 +* @gfp: allocation mask to use * * Initializes the refcount in single atomic counter mode with a refcount of 1; * analagous to atomic_set(ref, 1).
@@ -47,11 +48,12 @@ static unsigned __percpu *pcpu_count_ptr(struct percpu_ref *ref)* Note that @release must not sleep - it may potentially be called from RCU * callback context by percpu_ref_kill(). */ -int percpu_ref_init (struct percpu_ref *ref,percpu_ref_func_t *release) +int percpu_ref_init (struct percpu_ref *ref,percpu_ref_func_t *release, +gfp_t gfp) {atomic_set (&ref->count,1 +PCPU_COUNT_BIAS ); - ref->pcpu_count_ptr = (unsigned long )alloc_percpu (unsigned); + ref->pcpu_count_ptr = (unsigned long )alloc_percpu_gfp (unsigned, gfp);if (!ref->pcpu_count_ptr)return -ENOMEM ;
Signature · 1 line
1.9.3
Tejun Heo
maintainerPATCH v2 3/3 percpu-refcount: add @gfp to percpu_ref_init()
Quoted 1 line
From
ad5328cfb8c0d828e07ac428fdf3fbcb4f8698adMon Sep 17 00:00:00 2001
From: Tejun Heo <[email protected]>
Date: Tue, 26 Aug 2014 11:33:17 -0400
Percpu allocator now supports allocation mask. Add @gfp to percpu_ref_init() so that !GFP_KERNEL allocation masks can be used with percpu_refs too.
This patch doesn't make any functional difference.
v2: blk-mq conversion was missing. Updated.
---
Missed blk-mq conversion while forward porting to v3.17-rc1. Updated.
Thanks.
block/blk-mq.c | 3 ++- drivers/target/target_core_tpg.c | 3 ++- fs/aio.c | 4 ++-- include/linux/percpu-refcount.h | 3 ++- kernel/cgroup.c | 6 +++--- lib/percpu-refcount.c | 6 ++++-- 6 files changed, 15 insertions(+), 10 deletions(-)
block/blk-mq.c +2 -1
@@ -1776,7 +1776,8 @@ struct request_queue *blk_mq_init_queue(struct blk_mq_tag_set *set)if (!q) goto err_hctxs; -if (percpu_ref_init (&q->mq_usage_counter, blk_mq_usage_counter_release)) +if (percpu_ref_init (&q->mq_usage_counter, blk_mq_usage_counter_release, +GFP_KERNEL )) goto err_map;setup_timer (&q->timeout, blk_mq_rq_timer, (unsigned long ) q);
drivers/target/target_core_tpg.c +2 -1
@@ -819,7 +819,8 @@ int core_tpg_add_lun( {int ret; - ret =percpu_ref_init (&lun->lun_ref, core_tpg_lun_ref_release); + ret =percpu_ref_init (&lun->lun_ref, core_tpg_lun_ref_release, +GFP_KERNEL );if (ret <0 )return ret;
fs/aio.c +2 -2
@@ -666,10 +666,10 @@ static struct kioctx *ioctx_alloc(unsigned nr_events)INIT_LIST_HEAD (&ctx->active_reqs); -if (percpu_ref_init (&ctx->users, free_ioctx_users)) +if (percpu_ref_init (&ctx->users, free_ioctx_users,GFP_KERNEL )) goto err; -if (percpu_ref_init (&ctx->reqs, free_ioctx_reqs)) +if (percpu_ref_init (&ctx->reqs, free_ioctx_reqs,GFP_KERNEL )) goto err; ctx->cpu = alloc_percpu(struct kioctx_cpu);
include/linux/percpu-refcount.h +2 -1
@@ -49,6 +49,7 @@#include <linux/kernel.h> #include <linux/percpu.h> #include <linux/rcupdate.h> +#include <linux/gfp.h> struct percpu_ref ;typedef void (percpu_ref_func_t )(struct percpu_ref *);
@@ -66,7 +67,7 @@ struct percpu_ref { };int __must_check percpu_ref_init (struct percpu_ref *ref, -percpu_ref_func_t *release); +percpu_ref_func_t *release,gfp_t gfp);void percpu_ref_reinit (struct percpu_ref *ref);void percpu_ref_exit (struct percpu_ref *ref); void percpu_ref_kill_and_confirm(struct percpu_ref *ref,
kernel/cgroup.c +3 -3
@@ -1628,7 +1628,7 @@ static int cgroup_setup_root(struct cgroup_root *root, unsigned int ss_mask) goto out; root_cgrp->id = ret; - ret =percpu_ref_init (&root_cgrp->self.refcnt, css_release); + ret =percpu_ref_init (&root_cgrp->self.refcnt, css_release,GFP_KERNEL );if (ret) goto out;
@@ -4487,7 +4487,7 @@ static int create_css(struct cgroup *cgrp, struct cgroup_subsys *ss,init_and_link_css (css, ss, cgrp); - err =percpu_ref_init (&css->refcnt, css_release); + err =percpu_ref_init (&css->refcnt, css_release,GFP_KERNEL );if (err) goto err_free_css;
@@ -4555,7 +4555,7 @@ static int cgroup_mkdir(struct kernfs_node *parent_kn, const char *name, goto out_unlock; } - ret =percpu_ref_init (&cgrp->self.refcnt, css_release); + ret =percpu_ref_init (&cgrp->self.refcnt, css_release,GFP_KERNEL );if (ret) goto out_free_cgrp;
lib/percpu-refcount.c +4 -2
@@ -40,6 +40,7 @@ static unsigned __percpu *pcpu_count_ptr(struct percpu_ref *ref)* percpu_ref_init - initialize a percpu refcount * @ref: percpu_ref to initialize * @release: function which will be called when refcount hits 0 +* @gfp: allocation mask to use * * Initializes the refcount in single atomic counter mode with a refcount of 1; * analagous to atomic_set(ref, 1).
@@ -47,11 +48,12 @@ static unsigned __percpu *pcpu_count_ptr(struct percpu_ref *ref)* Note that @release must not sleep - it may potentially be called from RCU * callback context by percpu_ref_kill(). */ -int percpu_ref_init (struct percpu_ref *ref,percpu_ref_func_t *release) +int percpu_ref_init (struct percpu_ref *ref,percpu_ref_func_t *release, +gfp_t gfp) {atomic_set (&ref->count,1 +PCPU_COUNT_BIAS ); - ref->pcpu_count_ptr = (unsigned long )alloc_percpu (unsigned); + ref->pcpu_count_ptr = (unsigned long )alloc_percpu_gfp (unsigned, gfp);if (!ref->pcpu_count_ptr)return -ENOMEM ;
Signature · 1 line
1.9.3
Tejun Heo
maintainerPATCH 1/1 percpu_counter: make percpu_counters_lock irq-safe
In reply to Tejun Heopercpu_counter is scheduled to grow @gfp support to allow atomic initialization. This patch makes percpu_counters_lock irq-safe so that it can be safely used from atomic contexts.
--- lib/percpu_counter.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-)
lib/percpu_counter.c +10 -6
@@ -115,6 +115,8 @@ EXPORT_SYMBOL(__percpu_counter_sum);int __percpu_counter_init (struct percpu_counter *fbc,s64 amount,gfp_t gfp,struct lock_class_key *key) { +unsigned long flags__maybe_unused ; +raw_spin_lock_init (&fbc->lock);lockdep_set_class (&fbc->lock, key); fbc->count = amount;
@@ -126,9 +128,9 @@ int __percpu_counter_init(struct percpu_#ifdef CONFIG_HOTPLUG_CPU INIT_LIST_HEAD (&fbc->list); -spin_lock (&percpu_counters_lock); +spin_lock_irqsave (&percpu_counters_lock, flags);list_add (&fbc->list, &percpu_counters); -spin_unlock (&percpu_counters_lock); +spin_unlock_irqrestore (&percpu_counters_lock, flags);#endif return 0 ; }
@@ -136,15 +138,17 @@ EXPORT_SYMBOL(__percpu_counter_init);void percpu_counter_destroy (struct percpu_counter *fbc) { +unsigned long flags__maybe_unused ; +if (!fbc->counters)return ;debug_percpu_counter_deactivate (fbc);#ifdef CONFIG_HOTPLUG_CPU -spin_lock (&percpu_counters_lock); +spin_lock_irqsave (&percpu_counters_lock, flags);list_del (&fbc->list); -spin_unlock (&percpu_counters_lock); +spin_unlock_irqrestore (&percpu_counters_lock, flags);#endif free_percpu (fbc->counters); fbc->counters =NULL ;
@@ -173,7 +177,7 @@ static int percpu_counter_hotcpu_callbacreturn NOTIFY_OK ; cpu = (unsigned long )hcpu; -spin_lock (&percpu_counters_lock); +spin_lock_irq (&percpu_counters_lock);list_for_each_entry (fbc, &percpu_counters, list) {s32 *pcount;unsigned long flags;
@@ -184,7 +188,7 @@ static int percpu_counter_hotcpu_callbac *pcount =0 ; raw_spin_unlock_irqrestore(&fbc->lock, flags); } -spin_unlock (&percpu_counters_lock); +spin_unlock_irq (&percpu_counters_lock);#endif return NOTIFY_OK ; }
Applied to percpu/for-3.18.
Thanks.
Signature · 1 line
tejun