diff options
author | Alexey Dobriyan <adobriyan@gmail.com> | 2018-04-05 19:20:37 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-04-06 00:36:23 -0400 |
commit | f4957d5bd09165b165df851fbf8c658f7fcd9922 (patch) | |
tree | 021c72366564d4082e2885999640b79d174e5296 /mm/slab.h | |
parent | 361d575e5c7a39c73a8a9bdd504c1d1274f280aa (diff) |
slab: make kmem_cache_create() work with 32-bit sizes
struct kmem_cache::size and ::align were always 32-bit.
Out of curiosity I created 4GB kmem_cache, it oopsed with division by 0.
kmem_cache_create(1UL<<32+1) created 1-byte cache as expected.
size_t doesn't work and never did.
Link: http://lkml.kernel.org/r/20180305200730.15812-6-adobriyan@gmail.com
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Cc: Christoph Lameter <cl@linux.com>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: David Rientjes <rientjes@google.com>
Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/slab.h')
-rw-r--r-- | mm/slab.h | 6 |
1 files changed, 3 insertions, 3 deletions
@@ -101,11 +101,11 @@ extern void create_boot_cache(struct kmem_cache *, const char *name, | |||
101 | unsigned int useroffset, unsigned int usersize); | 101 | unsigned int useroffset, unsigned int usersize); |
102 | 102 | ||
103 | int slab_unmergeable(struct kmem_cache *s); | 103 | int slab_unmergeable(struct kmem_cache *s); |
104 | struct kmem_cache *find_mergeable(size_t size, size_t align, | 104 | struct kmem_cache *find_mergeable(unsigned size, unsigned align, |
105 | slab_flags_t flags, const char *name, void (*ctor)(void *)); | 105 | slab_flags_t flags, const char *name, void (*ctor)(void *)); |
106 | #ifndef CONFIG_SLOB | 106 | #ifndef CONFIG_SLOB |
107 | struct kmem_cache * | 107 | struct kmem_cache * |
108 | __kmem_cache_alias(const char *name, size_t size, size_t align, | 108 | __kmem_cache_alias(const char *name, unsigned int size, unsigned int align, |
109 | slab_flags_t flags, void (*ctor)(void *)); | 109 | slab_flags_t flags, void (*ctor)(void *)); |
110 | 110 | ||
111 | slab_flags_t kmem_cache_flags(unsigned long object_size, | 111 | slab_flags_t kmem_cache_flags(unsigned long object_size, |
@@ -113,7 +113,7 @@ slab_flags_t kmem_cache_flags(unsigned long object_size, | |||
113 | void (*ctor)(void *)); | 113 | void (*ctor)(void *)); |
114 | #else | 114 | #else |
115 | static inline struct kmem_cache * | 115 | static inline struct kmem_cache * |
116 | __kmem_cache_alias(const char *name, size_t size, size_t align, | 116 | __kmem_cache_alias(const char *name, unsigned int size, unsigned int align, |
117 | slab_flags_t flags, void (*ctor)(void *)) | 117 | slab_flags_t flags, void (*ctor)(void *)) |
118 | { return NULL; } | 118 | { return NULL; } |
119 | 119 | ||