diff options
-rw-r--r-- | arch/x86/kvm/lapic.c | 4 | ||||
-rw-r--r-- | arch/x86/kvm/page_track.c | 4 | ||||
-rw-r--r-- | arch/x86/kvm/x86.c | 4 | ||||
-rw-r--r-- | drivers/md/dm-stats.c | 7 | ||||
-rw-r--r-- | fs/ext4/mballoc.c | 2 | ||||
-rw-r--r-- | fs/ext4/super.c | 4 | ||||
-rw-r--r-- | fs/f2fs/f2fs.h | 20 | ||||
-rw-r--r-- | fs/f2fs/file.c | 4 | ||||
-rw-r--r-- | fs/f2fs/node.c | 6 | ||||
-rw-r--r-- | fs/f2fs/segment.c | 14 | ||||
-rw-r--r-- | fs/seq_file.c | 16 | ||||
-rw-r--r-- | include/linux/kvm_host.h | 2 | ||||
-rw-r--r-- | include/linux/mm.h | 14 | ||||
-rw-r--r-- | include/linux/vmalloc.h | 1 | ||||
-rw-r--r-- | ipc/util.c | 7 | ||||
-rw-r--r-- | mm/nommu.c | 5 | ||||
-rw-r--r-- | mm/util.c | 45 | ||||
-rw-r--r-- | mm/vmalloc.c | 9 | ||||
-rw-r--r-- | security/apparmor/apparmorfs.c | 2 | ||||
-rw-r--r-- | security/apparmor/include/lib.h | 11 | ||||
-rw-r--r-- | security/apparmor/lib.c | 30 | ||||
-rw-r--r-- | security/apparmor/match.c | 2 | ||||
-rw-r--r-- | security/apparmor/policy_unpack.c | 2 | ||||
-rw-r--r-- | virt/kvm/kvm_main.c | 18 |
24 files changed, 103 insertions, 130 deletions
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index bad6a25067bc..d2a892fc92bf 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c | |||
@@ -177,8 +177,8 @@ static void recalculate_apic_map(struct kvm *kvm) | |||
177 | if (kvm_apic_present(vcpu)) | 177 | if (kvm_apic_present(vcpu)) |
178 | max_id = max(max_id, kvm_x2apic_id(vcpu->arch.apic)); | 178 | max_id = max(max_id, kvm_x2apic_id(vcpu->arch.apic)); |
179 | 179 | ||
180 | new = kvm_kvzalloc(sizeof(struct kvm_apic_map) + | 180 | new = kvzalloc(sizeof(struct kvm_apic_map) + |
181 | sizeof(struct kvm_lapic *) * ((u64)max_id + 1)); | 181 | sizeof(struct kvm_lapic *) * ((u64)max_id + 1), GFP_KERNEL); |
182 | 182 | ||
183 | if (!new) | 183 | if (!new) |
184 | goto out; | 184 | goto out; |
diff --git a/arch/x86/kvm/page_track.c b/arch/x86/kvm/page_track.c index 60168cdd0546..ea67dc876316 100644 --- a/arch/x86/kvm/page_track.c +++ b/arch/x86/kvm/page_track.c | |||
@@ -40,8 +40,8 @@ int kvm_page_track_create_memslot(struct kvm_memory_slot *slot, | |||
40 | int i; | 40 | int i; |
41 | 41 | ||
42 | for (i = 0; i < KVM_PAGE_TRACK_MAX; i++) { | 42 | for (i = 0; i < KVM_PAGE_TRACK_MAX; i++) { |
43 | slot->arch.gfn_track[i] = kvm_kvzalloc(npages * | 43 | slot->arch.gfn_track[i] = kvzalloc(npages * |
44 | sizeof(*slot->arch.gfn_track[i])); | 44 | sizeof(*slot->arch.gfn_track[i]), GFP_KERNEL); |
45 | if (!slot->arch.gfn_track[i]) | 45 | if (!slot->arch.gfn_track[i]) |
46 | goto track_free; | 46 | goto track_free; |
47 | } | 47 | } |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index ccbd45ecd41a..ee22226e3807 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -8199,13 +8199,13 @@ int kvm_arch_create_memslot(struct kvm *kvm, struct kvm_memory_slot *slot, | |||
8199 | slot->base_gfn, level) + 1; | 8199 | slot->base_gfn, level) + 1; |
8200 | 8200 | ||
8201 | slot->arch.rmap[i] = | 8201 | slot->arch.rmap[i] = |
8202 | kvm_kvzalloc(lpages * sizeof(*slot->arch.rmap[i])); | 8202 | kvzalloc(lpages * sizeof(*slot->arch.rmap[i]), GFP_KERNEL); |
8203 | if (!slot->arch.rmap[i]) | 8203 | if (!slot->arch.rmap[i]) |
8204 | goto out_free; | 8204 | goto out_free; |
8205 | if (i == 0) | 8205 | if (i == 0) |
8206 | continue; | 8206 | continue; |
8207 | 8207 | ||
8208 | linfo = kvm_kvzalloc(lpages * sizeof(*linfo)); | 8208 | linfo = kvzalloc(lpages * sizeof(*linfo), GFP_KERNEL); |
8209 | if (!linfo) | 8209 | if (!linfo) |
8210 | goto out_free; | 8210 | goto out_free; |
8211 | 8211 | ||
diff --git a/drivers/md/dm-stats.c b/drivers/md/dm-stats.c index 0250e7e521ab..6028d8247f58 100644 --- a/drivers/md/dm-stats.c +++ b/drivers/md/dm-stats.c | |||
@@ -146,12 +146,7 @@ static void *dm_kvzalloc(size_t alloc_size, int node) | |||
146 | if (!claim_shared_memory(alloc_size)) | 146 | if (!claim_shared_memory(alloc_size)) |
147 | return NULL; | 147 | return NULL; |
148 | 148 | ||
149 | if (alloc_size <= KMALLOC_MAX_SIZE) { | 149 | p = kvzalloc_node(alloc_size, GFP_KERNEL | __GFP_NOMEMALLOC, node); |
150 | p = kzalloc_node(alloc_size, GFP_KERNEL | __GFP_NORETRY | __GFP_NOMEMALLOC | __GFP_NOWARN, node); | ||
151 | if (p) | ||
152 | return p; | ||
153 | } | ||
154 | p = vzalloc_node(alloc_size, node); | ||
155 | if (p) | 150 | if (p) |
156 | return p; | 151 | return p; |
157 | 152 | ||
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 354dc1a894c2..b60698c104fd 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c | |||
@@ -2393,7 +2393,7 @@ int ext4_mb_alloc_groupinfo(struct super_block *sb, ext4_group_t ngroups) | |||
2393 | return 0; | 2393 | return 0; |
2394 | 2394 | ||
2395 | size = roundup_pow_of_two(sizeof(*sbi->s_group_info) * size); | 2395 | size = roundup_pow_of_two(sizeof(*sbi->s_group_info) * size); |
2396 | new_groupinfo = ext4_kvzalloc(size, GFP_KERNEL); | 2396 | new_groupinfo = kvzalloc(size, GFP_KERNEL); |
2397 | if (!new_groupinfo) { | 2397 | if (!new_groupinfo) { |
2398 | ext4_msg(sb, KERN_ERR, "can't allocate buddy meta group"); | 2398 | ext4_msg(sb, KERN_ERR, "can't allocate buddy meta group"); |
2399 | return -ENOMEM; | 2399 | return -ENOMEM; |
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index a9c72e39a4ee..b2c74644d5de 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
@@ -2153,7 +2153,7 @@ int ext4_alloc_flex_bg_array(struct super_block *sb, ext4_group_t ngroup) | |||
2153 | return 0; | 2153 | return 0; |
2154 | 2154 | ||
2155 | size = roundup_pow_of_two(size * sizeof(struct flex_groups)); | 2155 | size = roundup_pow_of_two(size * sizeof(struct flex_groups)); |
2156 | new_groups = ext4_kvzalloc(size, GFP_KERNEL); | 2156 | new_groups = kvzalloc(size, GFP_KERNEL); |
2157 | if (!new_groups) { | 2157 | if (!new_groups) { |
2158 | ext4_msg(sb, KERN_ERR, "not enough memory for %d flex groups", | 2158 | ext4_msg(sb, KERN_ERR, "not enough memory for %d flex groups", |
2159 | size / (int) sizeof(struct flex_groups)); | 2159 | size / (int) sizeof(struct flex_groups)); |
@@ -3887,7 +3887,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3887 | goto failed_mount; | 3887 | goto failed_mount; |
3888 | } | 3888 | } |
3889 | } | 3889 | } |
3890 | sbi->s_group_desc = ext4_kvmalloc(db_count * | 3890 | sbi->s_group_desc = kvmalloc(db_count * |
3891 | sizeof(struct buffer_head *), | 3891 | sizeof(struct buffer_head *), |
3892 | GFP_KERNEL); | 3892 | GFP_KERNEL); |
3893 | if (sbi->s_group_desc == NULL) { | 3893 | if (sbi->s_group_desc == NULL) { |
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 0a6e115562f6..1fc17a1fc5d0 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h | |||
@@ -2005,26 +2005,6 @@ static inline void *f2fs_kmalloc(struct f2fs_sb_info *sbi, | |||
2005 | return kmalloc(size, flags); | 2005 | return kmalloc(size, flags); |
2006 | } | 2006 | } |
2007 | 2007 | ||
2008 | static inline void *f2fs_kvmalloc(size_t size, gfp_t flags) | ||
2009 | { | ||
2010 | void *ret; | ||
2011 | |||
2012 | ret = kmalloc(size, flags | __GFP_NOWARN); | ||
2013 | if (!ret) | ||
2014 | ret = __vmalloc(size, flags, PAGE_KERNEL); | ||
2015 | return ret; | ||
2016 | } | ||
2017 | |||
2018 | static inline void *f2fs_kvzalloc(size_t size, gfp_t flags) | ||
2019 | { | ||
2020 | void *ret; | ||
2021 | |||
2022 | ret = kzalloc(size, flags | __GFP_NOWARN); | ||
2023 | if (!ret) | ||
2024 | ret = __vmalloc(size, flags | __GFP_ZERO, PAGE_KERNEL); | ||
2025 | return ret; | ||
2026 | } | ||
2027 | |||
2028 | #define get_inode_mode(i) \ | 2008 | #define get_inode_mode(i) \ |
2029 | ((is_inode_flag_set(i, FI_ACL_MODE)) ? \ | 2009 | ((is_inode_flag_set(i, FI_ACL_MODE)) ? \ |
2030 | (F2FS_I(i)->i_acl_mode) : ((i)->i_mode)) | 2010 | (F2FS_I(i)->i_acl_mode) : ((i)->i_mode)) |
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 5f7317875a67..0849af78381f 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c | |||
@@ -1012,11 +1012,11 @@ static int __exchange_data_block(struct inode *src_inode, | |||
1012 | while (len) { | 1012 | while (len) { |
1013 | olen = min((pgoff_t)4 * ADDRS_PER_BLOCK, len); | 1013 | olen = min((pgoff_t)4 * ADDRS_PER_BLOCK, len); |
1014 | 1014 | ||
1015 | src_blkaddr = f2fs_kvzalloc(sizeof(block_t) * olen, GFP_KERNEL); | 1015 | src_blkaddr = kvzalloc(sizeof(block_t) * olen, GFP_KERNEL); |
1016 | if (!src_blkaddr) | 1016 | if (!src_blkaddr) |
1017 | return -ENOMEM; | 1017 | return -ENOMEM; |
1018 | 1018 | ||
1019 | do_replace = f2fs_kvzalloc(sizeof(int) * olen, GFP_KERNEL); | 1019 | do_replace = kvzalloc(sizeof(int) * olen, GFP_KERNEL); |
1020 | if (!do_replace) { | 1020 | if (!do_replace) { |
1021 | kvfree(src_blkaddr); | 1021 | kvfree(src_blkaddr); |
1022 | return -ENOMEM; | 1022 | return -ENOMEM; |
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index 481aa8dc79f4..0ea1dca8a0e2 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c | |||
@@ -2621,17 +2621,17 @@ static int init_free_nid_cache(struct f2fs_sb_info *sbi) | |||
2621 | { | 2621 | { |
2622 | struct f2fs_nm_info *nm_i = NM_I(sbi); | 2622 | struct f2fs_nm_info *nm_i = NM_I(sbi); |
2623 | 2623 | ||
2624 | nm_i->free_nid_bitmap = f2fs_kvzalloc(nm_i->nat_blocks * | 2624 | nm_i->free_nid_bitmap = kvzalloc(nm_i->nat_blocks * |
2625 | NAT_ENTRY_BITMAP_SIZE, GFP_KERNEL); | 2625 | NAT_ENTRY_BITMAP_SIZE, GFP_KERNEL); |
2626 | if (!nm_i->free_nid_bitmap) | 2626 | if (!nm_i->free_nid_bitmap) |
2627 | return -ENOMEM; | 2627 | return -ENOMEM; |
2628 | 2628 | ||
2629 | nm_i->nat_block_bitmap = f2fs_kvzalloc(nm_i->nat_blocks / 8, | 2629 | nm_i->nat_block_bitmap = kvzalloc(nm_i->nat_blocks / 8, |
2630 | GFP_KERNEL); | 2630 | GFP_KERNEL); |
2631 | if (!nm_i->nat_block_bitmap) | 2631 | if (!nm_i->nat_block_bitmap) |
2632 | return -ENOMEM; | 2632 | return -ENOMEM; |
2633 | 2633 | ||
2634 | nm_i->free_nid_count = f2fs_kvzalloc(nm_i->nat_blocks * | 2634 | nm_i->free_nid_count = kvzalloc(nm_i->nat_blocks * |
2635 | sizeof(unsigned short), GFP_KERNEL); | 2635 | sizeof(unsigned short), GFP_KERNEL); |
2636 | if (!nm_i->free_nid_count) | 2636 | if (!nm_i->free_nid_count) |
2637 | return -ENOMEM; | 2637 | return -ENOMEM; |
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 29ef7088c558..13806f642ab5 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c | |||
@@ -2501,13 +2501,13 @@ static int build_sit_info(struct f2fs_sb_info *sbi) | |||
2501 | 2501 | ||
2502 | SM_I(sbi)->sit_info = sit_i; | 2502 | SM_I(sbi)->sit_info = sit_i; |
2503 | 2503 | ||
2504 | sit_i->sentries = f2fs_kvzalloc(MAIN_SEGS(sbi) * | 2504 | sit_i->sentries = kvzalloc(MAIN_SEGS(sbi) * |
2505 | sizeof(struct seg_entry), GFP_KERNEL); | 2505 | sizeof(struct seg_entry), GFP_KERNEL); |
2506 | if (!sit_i->sentries) | 2506 | if (!sit_i->sentries) |
2507 | return -ENOMEM; | 2507 | return -ENOMEM; |
2508 | 2508 | ||
2509 | bitmap_size = f2fs_bitmap_size(MAIN_SEGS(sbi)); | 2509 | bitmap_size = f2fs_bitmap_size(MAIN_SEGS(sbi)); |
2510 | sit_i->dirty_sentries_bitmap = f2fs_kvzalloc(bitmap_size, GFP_KERNEL); | 2510 | sit_i->dirty_sentries_bitmap = kvzalloc(bitmap_size, GFP_KERNEL); |
2511 | if (!sit_i->dirty_sentries_bitmap) | 2511 | if (!sit_i->dirty_sentries_bitmap) |
2512 | return -ENOMEM; | 2512 | return -ENOMEM; |
2513 | 2513 | ||
@@ -2540,7 +2540,7 @@ static int build_sit_info(struct f2fs_sb_info *sbi) | |||
2540 | return -ENOMEM; | 2540 | return -ENOMEM; |
2541 | 2541 | ||
2542 | if (sbi->segs_per_sec > 1) { | 2542 | if (sbi->segs_per_sec > 1) { |
2543 | sit_i->sec_entries = f2fs_kvzalloc(MAIN_SECS(sbi) * | 2543 | sit_i->sec_entries = kvzalloc(MAIN_SECS(sbi) * |
2544 | sizeof(struct sec_entry), GFP_KERNEL); | 2544 | sizeof(struct sec_entry), GFP_KERNEL); |
2545 | if (!sit_i->sec_entries) | 2545 | if (!sit_i->sec_entries) |
2546 | return -ENOMEM; | 2546 | return -ENOMEM; |
@@ -2591,12 +2591,12 @@ static int build_free_segmap(struct f2fs_sb_info *sbi) | |||
2591 | SM_I(sbi)->free_info = free_i; | 2591 | SM_I(sbi)->free_info = free_i; |
2592 | 2592 | ||
2593 | bitmap_size = f2fs_bitmap_size(MAIN_SEGS(sbi)); | 2593 | bitmap_size = f2fs_bitmap_size(MAIN_SEGS(sbi)); |
2594 | free_i->free_segmap = f2fs_kvmalloc(bitmap_size, GFP_KERNEL); | 2594 | free_i->free_segmap = kvmalloc(bitmap_size, GFP_KERNEL); |
2595 | if (!free_i->free_segmap) | 2595 | if (!free_i->free_segmap) |
2596 | return -ENOMEM; | 2596 | return -ENOMEM; |
2597 | 2597 | ||
2598 | sec_bitmap_size = f2fs_bitmap_size(MAIN_SECS(sbi)); | 2598 | sec_bitmap_size = f2fs_bitmap_size(MAIN_SECS(sbi)); |
2599 | free_i->free_secmap = f2fs_kvmalloc(sec_bitmap_size, GFP_KERNEL); | 2599 | free_i->free_secmap = kvmalloc(sec_bitmap_size, GFP_KERNEL); |
2600 | if (!free_i->free_secmap) | 2600 | if (!free_i->free_secmap) |
2601 | return -ENOMEM; | 2601 | return -ENOMEM; |
2602 | 2602 | ||
@@ -2764,7 +2764,7 @@ static int init_victim_secmap(struct f2fs_sb_info *sbi) | |||
2764 | struct dirty_seglist_info *dirty_i = DIRTY_I(sbi); | 2764 | struct dirty_seglist_info *dirty_i = DIRTY_I(sbi); |
2765 | unsigned int bitmap_size = f2fs_bitmap_size(MAIN_SECS(sbi)); | 2765 | unsigned int bitmap_size = f2fs_bitmap_size(MAIN_SECS(sbi)); |
2766 | 2766 | ||
2767 | dirty_i->victim_secmap = f2fs_kvzalloc(bitmap_size, GFP_KERNEL); | 2767 | dirty_i->victim_secmap = kvzalloc(bitmap_size, GFP_KERNEL); |
2768 | if (!dirty_i->victim_secmap) | 2768 | if (!dirty_i->victim_secmap) |
2769 | return -ENOMEM; | 2769 | return -ENOMEM; |
2770 | return 0; | 2770 | return 0; |
@@ -2786,7 +2786,7 @@ static int build_dirty_segmap(struct f2fs_sb_info *sbi) | |||
2786 | bitmap_size = f2fs_bitmap_size(MAIN_SEGS(sbi)); | 2786 | bitmap_size = f2fs_bitmap_size(MAIN_SEGS(sbi)); |
2787 | 2787 | ||
2788 | for (i = 0; i < NR_DIRTY_TYPE; i++) { | 2788 | for (i = 0; i < NR_DIRTY_TYPE; i++) { |
2789 | dirty_i->dirty_segmap[i] = f2fs_kvzalloc(bitmap_size, GFP_KERNEL); | 2789 | dirty_i->dirty_segmap[i] = kvzalloc(bitmap_size, GFP_KERNEL); |
2790 | if (!dirty_i->dirty_segmap[i]) | 2790 | if (!dirty_i->dirty_segmap[i]) |
2791 | return -ENOMEM; | 2791 | return -ENOMEM; |
2792 | } | 2792 | } |
diff --git a/fs/seq_file.c b/fs/seq_file.c index ca69fb99e41a..dc7c2be963ed 100644 --- a/fs/seq_file.c +++ b/fs/seq_file.c | |||
@@ -25,21 +25,7 @@ static void seq_set_overflow(struct seq_file *m) | |||
25 | 25 | ||
26 | static void *seq_buf_alloc(unsigned long size) | 26 | static void *seq_buf_alloc(unsigned long size) |
27 | { | 27 | { |
28 | void *buf; | 28 | return kvmalloc(size, GFP_KERNEL); |
29 | gfp_t gfp = GFP_KERNEL; | ||
30 | |||
31 | /* | ||
32 | * For high order allocations, use __GFP_NORETRY to avoid oom-killing - | ||
33 | * it's better to fall back to vmalloc() than to kill things. For small | ||
34 | * allocations, just use GFP_KERNEL which will oom kill, thus no need | ||
35 | * for vmalloc fallback. | ||
36 | */ | ||
37 | if (size > PAGE_SIZE) | ||
38 | gfp |= __GFP_NORETRY | __GFP_NOWARN; | ||
39 | buf = kmalloc(size, gfp); | ||
40 | if (!buf && size > PAGE_SIZE) | ||
41 | buf = vmalloc(size); | ||
42 | return buf; | ||
43 | } | 29 | } |
44 | 30 | ||
45 | /** | 31 | /** |
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index d0250744507a..5d9b2a08e553 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h | |||
@@ -767,8 +767,6 @@ void kvm_arch_check_processor_compat(void *rtn); | |||
767 | int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu); | 767 | int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu); |
768 | int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu); | 768 | int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu); |
769 | 769 | ||
770 | void *kvm_kvzalloc(unsigned long size); | ||
771 | |||
772 | #ifndef __KVM_HAVE_ARCH_VM_ALLOC | 770 | #ifndef __KVM_HAVE_ARCH_VM_ALLOC |
773 | static inline struct kvm *kvm_arch_alloc_vm(void) | 771 | static inline struct kvm *kvm_arch_alloc_vm(void) |
774 | { | 772 | { |
diff --git a/include/linux/mm.h b/include/linux/mm.h index 5d22e69f51ea..08e2849d27ca 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
@@ -518,6 +518,20 @@ static inline int is_vmalloc_or_module_addr(const void *x) | |||
518 | } | 518 | } |
519 | #endif | 519 | #endif |
520 | 520 | ||
521 | extern void *kvmalloc_node(size_t size, gfp_t flags, int node); | ||
522 | static inline void *kvmalloc(size_t size, gfp_t flags) | ||
523 | { | ||
524 | return kvmalloc_node(size, flags, NUMA_NO_NODE); | ||
525 | } | ||
526 | static inline void *kvzalloc_node(size_t size, gfp_t flags, int node) | ||
527 | { | ||
528 | return kvmalloc_node(size, flags | __GFP_ZERO, node); | ||
529 | } | ||
530 | static inline void *kvzalloc(size_t size, gfp_t flags) | ||
531 | { | ||
532 | return kvmalloc(size, flags | __GFP_ZERO); | ||
533 | } | ||
534 | |||
521 | extern void kvfree(const void *addr); | 535 | extern void kvfree(const void *addr); |
522 | 536 | ||
523 | static inline atomic_t *compound_mapcount_ptr(struct page *page) | 537 | static inline atomic_t *compound_mapcount_ptr(struct page *page) |
diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index d68edffbf142..46991ad3ddd5 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h | |||
@@ -80,6 +80,7 @@ extern void *__vmalloc_node_range(unsigned long size, unsigned long align, | |||
80 | unsigned long start, unsigned long end, gfp_t gfp_mask, | 80 | unsigned long start, unsigned long end, gfp_t gfp_mask, |
81 | pgprot_t prot, unsigned long vm_flags, int node, | 81 | pgprot_t prot, unsigned long vm_flags, int node, |
82 | const void *caller); | 82 | const void *caller); |
83 | extern void *__vmalloc_node_flags(unsigned long size, int node, gfp_t flags); | ||
83 | 84 | ||
84 | extern void vfree(const void *addr); | 85 | extern void vfree(const void *addr); |
85 | extern void vfree_atomic(const void *addr); | 86 | extern void vfree_atomic(const void *addr); |
diff --git a/ipc/util.c b/ipc/util.c index 3459a16a9df9..caec7b1bfaa3 100644 --- a/ipc/util.c +++ b/ipc/util.c | |||
@@ -403,12 +403,7 @@ void ipc_rmid(struct ipc_ids *ids, struct kern_ipc_perm *ipcp) | |||
403 | */ | 403 | */ |
404 | void *ipc_alloc(int size) | 404 | void *ipc_alloc(int size) |
405 | { | 405 | { |
406 | void *out; | 406 | return kvmalloc(size, GFP_KERNEL); |
407 | if (size > PAGE_SIZE) | ||
408 | out = vmalloc(size); | ||
409 | else | ||
410 | out = kmalloc(size, GFP_KERNEL); | ||
411 | return out; | ||
412 | } | 407 | } |
413 | 408 | ||
414 | /** | 409 | /** |
diff --git a/mm/nommu.c b/mm/nommu.c index 2d131b97a851..a80411d258fc 100644 --- a/mm/nommu.c +++ b/mm/nommu.c | |||
@@ -237,6 +237,11 @@ void *__vmalloc(unsigned long size, gfp_t gfp_mask, pgprot_t prot) | |||
237 | } | 237 | } |
238 | EXPORT_SYMBOL(__vmalloc); | 238 | EXPORT_SYMBOL(__vmalloc); |
239 | 239 | ||
240 | void *__vmalloc_node_flags(unsigned long size, int node, gfp_t flags) | ||
241 | { | ||
242 | return __vmalloc(size, flags, PAGE_KERNEL); | ||
243 | } | ||
244 | |||
240 | void *vmalloc_user(unsigned long size) | 245 | void *vmalloc_user(unsigned long size) |
241 | { | 246 | { |
242 | void *ret; | 247 | void *ret; |
@@ -329,6 +329,51 @@ unsigned long vm_mmap(struct file *file, unsigned long addr, | |||
329 | } | 329 | } |
330 | EXPORT_SYMBOL(vm_mmap); | 330 | EXPORT_SYMBOL(vm_mmap); |
331 | 331 | ||
332 | /** | ||
333 | * kvmalloc_node - attempt to allocate physically contiguous memory, but upon | ||
334 | * failure, fall back to non-contiguous (vmalloc) allocation. | ||
335 | * @size: size of the request. | ||
336 | * @flags: gfp mask for the allocation - must be compatible (superset) with GFP_KERNEL. | ||
337 | * @node: numa node to allocate from | ||
338 | * | ||
339 | * Uses kmalloc to get the memory but if the allocation fails then falls back | ||
340 | * to the vmalloc allocator. Use kvfree for freeing the memory. | ||
341 | * | ||
342 | * Reclaim modifiers - __GFP_NORETRY, __GFP_REPEAT and __GFP_NOFAIL are not supported | ||
343 | * | ||
344 | * Any use of gfp flags outside of GFP_KERNEL should be consulted with mm people. | ||
345 | */ | ||
346 | void *kvmalloc_node(size_t size, gfp_t flags, int node) | ||
347 | { | ||
348 | gfp_t kmalloc_flags = flags; | ||
349 | void *ret; | ||
350 | |||
351 | /* | ||
352 | * vmalloc uses GFP_KERNEL for some internal allocations (e.g page tables) | ||
353 | * so the given set of flags has to be compatible. | ||
354 | */ | ||
355 | WARN_ON_ONCE((flags & GFP_KERNEL) != GFP_KERNEL); | ||
356 | |||
357 | /* | ||
358 | * Make sure that larger requests are not too disruptive - no OOM | ||
359 | * killer and no allocation failure warnings as we have a fallback | ||
360 | */ | ||
361 | if (size > PAGE_SIZE) | ||
362 | kmalloc_flags |= __GFP_NORETRY | __GFP_NOWARN; | ||
363 | |||
364 | ret = kmalloc_node(size, kmalloc_flags, node); | ||
365 | |||
366 | /* | ||
367 | * It doesn't really make sense to fallback to vmalloc for sub page | ||
368 | * requests | ||
369 | */ | ||
370 | if (ret || size <= PAGE_SIZE) | ||
371 | return ret; | ||
372 | |||
373 | return __vmalloc_node_flags(size, node, flags | __GFP_HIGHMEM); | ||
374 | } | ||
375 | EXPORT_SYMBOL(kvmalloc_node); | ||
376 | |||
332 | void kvfree(const void *addr) | 377 | void kvfree(const void *addr) |
333 | { | 378 | { |
334 | if (is_vmalloc_addr(addr)) | 379 | if (is_vmalloc_addr(addr)) |
diff --git a/mm/vmalloc.c b/mm/vmalloc.c index b52aeed3f58e..33603239560e 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c | |||
@@ -1786,6 +1786,13 @@ fail: | |||
1786 | * Allocate enough pages to cover @size from the page level | 1786 | * Allocate enough pages to cover @size from the page level |
1787 | * allocator with @gfp_mask flags. Map them into contiguous | 1787 | * allocator with @gfp_mask flags. Map them into contiguous |
1788 | * kernel virtual space, using a pagetable protection of @prot. | 1788 | * kernel virtual space, using a pagetable protection of @prot. |
1789 | * | ||
1790 | * Reclaim modifiers in @gfp_mask - __GFP_NORETRY, __GFP_REPEAT | ||
1791 | * and __GFP_NOFAIL are not supported | ||
1792 | * | ||
1793 | * Any use of gfp flags outside of GFP_KERNEL should be consulted | ||
1794 | * with mm people. | ||
1795 | * | ||
1789 | */ | 1796 | */ |
1790 | static void *__vmalloc_node(unsigned long size, unsigned long align, | 1797 | static void *__vmalloc_node(unsigned long size, unsigned long align, |
1791 | gfp_t gfp_mask, pgprot_t prot, | 1798 | gfp_t gfp_mask, pgprot_t prot, |
@@ -1802,7 +1809,7 @@ void *__vmalloc(unsigned long size, gfp_t gfp_mask, pgprot_t prot) | |||
1802 | } | 1809 | } |
1803 | EXPORT_SYMBOL(__vmalloc); | 1810 | EXPORT_SYMBOL(__vmalloc); |
1804 | 1811 | ||
1805 | static inline void *__vmalloc_node_flags(unsigned long size, | 1812 | void *__vmalloc_node_flags(unsigned long size, |
1806 | int node, gfp_t flags) | 1813 | int node, gfp_t flags) |
1807 | { | 1814 | { |
1808 | return __vmalloc_node(size, 1, flags, PAGE_KERNEL, | 1815 | return __vmalloc_node(size, 1, flags, PAGE_KERNEL, |
diff --git a/security/apparmor/apparmorfs.c b/security/apparmor/apparmorfs.c index 41073f70eb41..be0b49897a67 100644 --- a/security/apparmor/apparmorfs.c +++ b/security/apparmor/apparmorfs.c | |||
@@ -98,7 +98,7 @@ static struct aa_loaddata *aa_simple_write_to_buffer(const char __user *userbuf, | |||
98 | return ERR_PTR(-ESPIPE); | 98 | return ERR_PTR(-ESPIPE); |
99 | 99 | ||
100 | /* freed by caller to simple_write_to_buffer */ | 100 | /* freed by caller to simple_write_to_buffer */ |
101 | data = kvmalloc(sizeof(*data) + alloc_size); | 101 | data = kvmalloc(sizeof(*data) + alloc_size, GFP_KERNEL); |
102 | if (data == NULL) | 102 | if (data == NULL) |
103 | return ERR_PTR(-ENOMEM); | 103 | return ERR_PTR(-ENOMEM); |
104 | kref_init(&data->count); | 104 | kref_init(&data->count); |
diff --git a/security/apparmor/include/lib.h b/security/apparmor/include/lib.h index 0291ff3902f9..550a700563b4 100644 --- a/security/apparmor/include/lib.h +++ b/security/apparmor/include/lib.h | |||
@@ -64,17 +64,6 @@ char *aa_split_fqname(char *args, char **ns_name); | |||
64 | const char *aa_splitn_fqname(const char *fqname, size_t n, const char **ns_name, | 64 | const char *aa_splitn_fqname(const char *fqname, size_t n, const char **ns_name, |
65 | size_t *ns_len); | 65 | size_t *ns_len); |
66 | void aa_info_message(const char *str); | 66 | void aa_info_message(const char *str); |
67 | void *__aa_kvmalloc(size_t size, gfp_t flags); | ||
68 | |||
69 | static inline void *kvmalloc(size_t size) | ||
70 | { | ||
71 | return __aa_kvmalloc(size, 0); | ||
72 | } | ||
73 | |||
74 | static inline void *kvzalloc(size_t size) | ||
75 | { | ||
76 | return __aa_kvmalloc(size, __GFP_ZERO); | ||
77 | } | ||
78 | 67 | ||
79 | /** | 68 | /** |
80 | * aa_strneq - compare null terminated @str to a non null terminated substring | 69 | * aa_strneq - compare null terminated @str to a non null terminated substring |
diff --git a/security/apparmor/lib.c b/security/apparmor/lib.c index 32cafc12593e..7cd788a9445b 100644 --- a/security/apparmor/lib.c +++ b/security/apparmor/lib.c | |||
@@ -129,36 +129,6 @@ void aa_info_message(const char *str) | |||
129 | } | 129 | } |
130 | 130 | ||
131 | /** | 131 | /** |
132 | * __aa_kvmalloc - do allocation preferring kmalloc but falling back to vmalloc | ||
133 | * @size: how many bytes of memory are required | ||
134 | * @flags: the type of memory to allocate (see kmalloc). | ||
135 | * | ||
136 | * Return: allocated buffer or NULL if failed | ||
137 | * | ||
138 | * It is possible that policy being loaded from the user is larger than | ||
139 | * what can be allocated by kmalloc, in those cases fall back to vmalloc. | ||
140 | */ | ||
141 | void *__aa_kvmalloc(size_t size, gfp_t flags) | ||
142 | { | ||
143 | void *buffer = NULL; | ||
144 | |||
145 | if (size == 0) | ||
146 | return NULL; | ||
147 | |||
148 | /* do not attempt kmalloc if we need more than 16 pages at once */ | ||
149 | if (size <= (16*PAGE_SIZE)) | ||
150 | buffer = kmalloc(size, flags | GFP_KERNEL | __GFP_NORETRY | | ||
151 | __GFP_NOWARN); | ||
152 | if (!buffer) { | ||
153 | if (flags & __GFP_ZERO) | ||
154 | buffer = vzalloc(size); | ||
155 | else | ||
156 | buffer = vmalloc(size); | ||
157 | } | ||
158 | return buffer; | ||
159 | } | ||
160 | |||
161 | /** | ||
162 | * aa_policy_init - initialize a policy structure | 132 | * aa_policy_init - initialize a policy structure |
163 | * @policy: policy to initialize (NOT NULL) | 133 | * @policy: policy to initialize (NOT NULL) |
164 | * @prefix: prefix name if any is required. (MAYBE NULL) | 134 | * @prefix: prefix name if any is required. (MAYBE NULL) |
diff --git a/security/apparmor/match.c b/security/apparmor/match.c index eb0efef746f5..960c913381e2 100644 --- a/security/apparmor/match.c +++ b/security/apparmor/match.c | |||
@@ -88,7 +88,7 @@ static struct table_header *unpack_table(char *blob, size_t bsize) | |||
88 | if (bsize < tsize) | 88 | if (bsize < tsize) |
89 | goto out; | 89 | goto out; |
90 | 90 | ||
91 | table = kvzalloc(tsize); | 91 | table = kvzalloc(tsize, GFP_KERNEL); |
92 | if (table) { | 92 | if (table) { |
93 | table->td_id = th.td_id; | 93 | table->td_id = th.td_id; |
94 | table->td_flags = th.td_flags; | 94 | table->td_flags = th.td_flags; |
diff --git a/security/apparmor/policy_unpack.c b/security/apparmor/policy_unpack.c index 2e37c9c26bbd..f3422a91353c 100644 --- a/security/apparmor/policy_unpack.c +++ b/security/apparmor/policy_unpack.c | |||
@@ -487,7 +487,7 @@ fail: | |||
487 | 487 | ||
488 | static void *kvmemdup(const void *src, size_t len) | 488 | static void *kvmemdup(const void *src, size_t len) |
489 | { | 489 | { |
490 | void *p = kvmalloc(len); | 490 | void *p = kvmalloc(len, GFP_KERNEL); |
491 | 491 | ||
492 | if (p) | 492 | if (p) |
493 | memcpy(p, src, len); | 493 | memcpy(p, src, len); |
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 88257b311cb5..aca22d36be9c 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
@@ -504,7 +504,7 @@ static struct kvm_memslots *kvm_alloc_memslots(void) | |||
504 | int i; | 504 | int i; |
505 | struct kvm_memslots *slots; | 505 | struct kvm_memslots *slots; |
506 | 506 | ||
507 | slots = kvm_kvzalloc(sizeof(struct kvm_memslots)); | 507 | slots = kvzalloc(sizeof(struct kvm_memslots), GFP_KERNEL); |
508 | if (!slots) | 508 | if (!slots) |
509 | return NULL; | 509 | return NULL; |
510 | 510 | ||
@@ -689,18 +689,6 @@ out_err_no_disable: | |||
689 | return ERR_PTR(r); | 689 | return ERR_PTR(r); |
690 | } | 690 | } |
691 | 691 | ||
692 | /* | ||
693 | * Avoid using vmalloc for a small buffer. | ||
694 | * Should not be used when the size is statically known. | ||
695 | */ | ||
696 | void *kvm_kvzalloc(unsigned long size) | ||
697 | { | ||
698 | if (size > PAGE_SIZE) | ||
699 | return vzalloc(size); | ||
700 | else | ||
701 | return kzalloc(size, GFP_KERNEL); | ||
702 | } | ||
703 | |||
704 | static void kvm_destroy_devices(struct kvm *kvm) | 692 | static void kvm_destroy_devices(struct kvm *kvm) |
705 | { | 693 | { |
706 | struct kvm_device *dev, *tmp; | 694 | struct kvm_device *dev, *tmp; |
@@ -782,7 +770,7 @@ static int kvm_create_dirty_bitmap(struct kvm_memory_slot *memslot) | |||
782 | { | 770 | { |
783 | unsigned long dirty_bytes = 2 * kvm_dirty_bitmap_bytes(memslot); | 771 | unsigned long dirty_bytes = 2 * kvm_dirty_bitmap_bytes(memslot); |
784 | 772 | ||
785 | memslot->dirty_bitmap = kvm_kvzalloc(dirty_bytes); | 773 | memslot->dirty_bitmap = kvzalloc(dirty_bytes, GFP_KERNEL); |
786 | if (!memslot->dirty_bitmap) | 774 | if (!memslot->dirty_bitmap) |
787 | return -ENOMEM; | 775 | return -ENOMEM; |
788 | 776 | ||
@@ -1008,7 +996,7 @@ int __kvm_set_memory_region(struct kvm *kvm, | |||
1008 | goto out_free; | 996 | goto out_free; |
1009 | } | 997 | } |
1010 | 998 | ||
1011 | slots = kvm_kvzalloc(sizeof(struct kvm_memslots)); | 999 | slots = kvzalloc(sizeof(struct kvm_memslots), GFP_KERNEL); |
1012 | if (!slots) | 1000 | if (!slots) |
1013 | goto out_free; | 1001 | goto out_free; |
1014 | memcpy(slots, __kvm_memslots(kvm, as_id), sizeof(struct kvm_memslots)); | 1002 | memcpy(slots, __kvm_memslots(kvm, as_id), sizeof(struct kvm_memslots)); |