|
@@ -650,6 +650,22 @@ extern void *__kmalloc_track_caller(size_t, gfp_t, unsigned long);
|
|
|
#define kmalloc_track_caller(size, flags) \
|
|
|
__kmalloc_track_caller(size, flags, _RET_IP_)
|
|
|
|
|
|
+static inline void *kmalloc_array_node(size_t n, size_t size, gfp_t flags,
|
|
|
+ int node)
|
|
|
+{
|
|
|
+ if (size != 0 && n > SIZE_MAX / size)
|
|
|
+ return NULL;
|
|
|
+ if (__builtin_constant_p(n) && __builtin_constant_p(size))
|
|
|
+ return kmalloc_node(n * size, flags, node);
|
|
|
+ return __kmalloc_node(n * size, flags, node);
|
|
|
+}
|
|
|
+
|
|
|
+static inline void *kcalloc_node(size_t n, size_t size, gfp_t flags, int node)
|
|
|
+{
|
|
|
+ return kmalloc_array_node(n, size, flags | __GFP_ZERO, node);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
#ifdef CONFIG_NUMA
|
|
|
extern void *__kmalloc_node_track_caller(size_t, gfp_t, int, unsigned long);
|
|
|
#define kmalloc_node_track_caller(size, flags, node) \
|