OLD | NEW |
1 /* | 1 /* |
2 * Slab allocator functions that are independent of the allocator strategy | 2 * Slab allocator functions that are independent of the allocator strategy |
3 * | 3 * |
4 * (C) 2012 Christoph Lameter <cl@linux.com> | 4 * (C) 2012 Christoph Lameter <cl@linux.com> |
5 */ | 5 */ |
6 #include <linux/slab.h> | 6 #include <linux/slab.h> |
7 | 7 |
8 #include <linux/mm.h> | 8 #include <linux/mm.h> |
9 #include <linux/poison.h> | 9 #include <linux/poison.h> |
10 #include <linux/interrupt.h> | 10 #include <linux/interrupt.h> |
(...skipping 1094 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1105 * directly to the page allocator. We use __GFP_COMP, because we will need to | 1105 * directly to the page allocator. We use __GFP_COMP, because we will need to |
1106 * know the allocation order to free the pages properly in kfree. | 1106 * know the allocation order to free the pages properly in kfree. |
1107 */ | 1107 */ |
1108 void *kmalloc_order(size_t size, gfp_t flags, unsigned int order) | 1108 void *kmalloc_order(size_t size, gfp_t flags, unsigned int order) |
1109 { | 1109 { |
1110 void *ret; | 1110 void *ret; |
1111 struct page *page; | 1111 struct page *page; |
1112 | 1112 |
1113 flags |= __GFP_COMP; | 1113 flags |= __GFP_COMP; |
1114 page = alloc_pages(flags, order); | 1114 page = alloc_pages(flags, order); |
1115 » ret = page ? page_address(page) : NULL; | 1115 » if (!page) |
| 1116 » » return NULL; |
| 1117 |
| 1118 » ret = page_address(page); |
| 1119 » if (kasan_kmalloc_large(ret, size, flags)) { |
| 1120 » » __free_pages(page, order); |
| 1121 » » return NULL; |
| 1122 » } |
| 1123 |
1116 kmemleak_alloc(ret, size, 1, flags); | 1124 kmemleak_alloc(ret, size, 1, flags); |
1117 kasan_kmalloc_large(ret, size, flags); | |
1118 return ret; | 1125 return ret; |
1119 } | 1126 } |
1120 EXPORT_SYMBOL(kmalloc_order); | 1127 EXPORT_SYMBOL(kmalloc_order); |
1121 | 1128 |
1122 #ifdef CONFIG_TRACING | 1129 #ifdef CONFIG_TRACING |
1123 void *kmalloc_order_trace(size_t size, gfp_t flags, unsigned int order) | 1130 void *kmalloc_order_trace(size_t size, gfp_t flags, unsigned int order) |
1124 { | 1131 { |
1125 void *ret = kmalloc_order(size, flags, order); | 1132 void *ret = kmalloc_order(size, flags, order); |
1126 trace_kmalloc(_RET_IP_, ret, size, PAGE_SIZE << order, flags); | 1133 trace_kmalloc(_RET_IP_, ret, size, PAGE_SIZE << order, flags); |
1127 return ret; | 1134 return ret; |
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1442 } | 1449 } |
1443 EXPORT_SYMBOL(kzfree); | 1450 EXPORT_SYMBOL(kzfree); |
1444 | 1451 |
1445 /* Tracepoints definitions. */ | 1452 /* Tracepoints definitions. */ |
1446 EXPORT_TRACEPOINT_SYMBOL(kmalloc); | 1453 EXPORT_TRACEPOINT_SYMBOL(kmalloc); |
1447 EXPORT_TRACEPOINT_SYMBOL(kmem_cache_alloc); | 1454 EXPORT_TRACEPOINT_SYMBOL(kmem_cache_alloc); |
1448 EXPORT_TRACEPOINT_SYMBOL(kmalloc_node); | 1455 EXPORT_TRACEPOINT_SYMBOL(kmalloc_node); |
1449 EXPORT_TRACEPOINT_SYMBOL(kmem_cache_alloc_node); | 1456 EXPORT_TRACEPOINT_SYMBOL(kmem_cache_alloc_node); |
1450 EXPORT_TRACEPOINT_SYMBOL(kfree); | 1457 EXPORT_TRACEPOINT_SYMBOL(kfree); |
1451 EXPORT_TRACEPOINT_SYMBOL(kmem_cache_free); | 1458 EXPORT_TRACEPOINT_SYMBOL(kmem_cache_free); |
OLD | NEW |