mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 06:01:57 +00:00
slab: pass struct kmem_cache_args to do_kmem_cache_create()
and initialize most things in do_kmem_cache_create(). In a follow-up patch we'll remove rcu_freeptr_offset from struct kmem_cache. Reviewed-by: Kees Cook <kees@kernel.org> Reviewed-by: Jens Axboe <axboe@kernel.dk> Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org> Reviewed-by: Vlastimil Babka <vbabka@suse.cz> Signed-off-by: Christian Brauner <brauner@kernel.org> Reviewed-by: Roman Gushchin <roman.gushchin@linux.dev> Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
This commit is contained in:
parent
fc0eac57d0
commit
3dbe2bad57
@ -424,7 +424,9 @@ kmalloc_slab(size_t size, kmem_buckets *b, gfp_t flags, unsigned long caller)
|
||||
gfp_t kmalloc_fix_flags(gfp_t flags);
|
||||
|
||||
/* Functions provided by the slab allocators */
|
||||
int do_kmem_cache_create(struct kmem_cache *, slab_flags_t flags);
|
||||
int do_kmem_cache_create(struct kmem_cache *s, const char *name,
|
||||
unsigned int size, struct kmem_cache_args *args,
|
||||
slab_flags_t flags);
|
||||
|
||||
void __init kmem_cache_init(void);
|
||||
extern void create_boot_cache(struct kmem_cache *, const char *name,
|
||||
|
@ -224,20 +224,7 @@ static struct kmem_cache *create_cache(const char *name,
|
||||
s = kmem_cache_zalloc(kmem_cache, GFP_KERNEL);
|
||||
if (!s)
|
||||
goto out;
|
||||
|
||||
s->name = name;
|
||||
s->size = s->object_size = object_size;
|
||||
if (args->use_freeptr_offset)
|
||||
s->rcu_freeptr_offset = args->freeptr_offset;
|
||||
else
|
||||
s->rcu_freeptr_offset = UINT_MAX;
|
||||
s->align = args->align;
|
||||
s->ctor = args->ctor;
|
||||
#ifdef CONFIG_HARDENED_USERCOPY
|
||||
s->useroffset = args->useroffset;
|
||||
s->usersize = args->usersize;
|
||||
#endif
|
||||
err = do_kmem_cache_create(s, flags);
|
||||
err = do_kmem_cache_create(s, name, object_size, args, flags);
|
||||
if (err)
|
||||
goto out_free_cache;
|
||||
|
||||
@ -788,9 +775,7 @@ void __init create_boot_cache(struct kmem_cache *s, const char *name,
|
||||
{
|
||||
int err;
|
||||
unsigned int align = ARCH_KMALLOC_MINALIGN;
|
||||
|
||||
s->name = name;
|
||||
s->size = s->object_size = size;
|
||||
struct kmem_cache_args kmem_args = {};
|
||||
|
||||
/*
|
||||
* kmalloc caches guarantee alignment of at least the largest
|
||||
@ -799,14 +784,14 @@ void __init create_boot_cache(struct kmem_cache *s, const char *name,
|
||||
*/
|
||||
if (flags & SLAB_KMALLOC)
|
||||
align = max(align, 1U << (ffs(size) - 1));
|
||||
s->align = calculate_alignment(flags, align, size);
|
||||
kmem_args.align = calculate_alignment(flags, align, size);
|
||||
|
||||
#ifdef CONFIG_HARDENED_USERCOPY
|
||||
s->useroffset = useroffset;
|
||||
s->usersize = usersize;
|
||||
kmem_args.useroffset = useroffset;
|
||||
kmem_args.usersize = usersize;
|
||||
#endif
|
||||
|
||||
err = do_kmem_cache_create(s, flags);
|
||||
err = do_kmem_cache_create(s, name, size, &kmem_args, flags);
|
||||
|
||||
if (err)
|
||||
panic("Creation of kmalloc slab %s size=%u failed. Reason %d\n",
|
||||
|
17
mm/slub.c
17
mm/slub.c
@ -5843,14 +5843,29 @@ __kmem_cache_alias(const char *name, unsigned int size, unsigned int align,
|
||||
return s;
|
||||
}
|
||||
|
||||
int do_kmem_cache_create(struct kmem_cache *s, slab_flags_t flags)
|
||||
int do_kmem_cache_create(struct kmem_cache *s, const char *name,
|
||||
unsigned int size, struct kmem_cache_args *args,
|
||||
slab_flags_t flags)
|
||||
{
|
||||
int err = -EINVAL;
|
||||
|
||||
s->name = name;
|
||||
s->size = s->object_size = size;
|
||||
|
||||
s->flags = kmem_cache_flags(flags, s->name);
|
||||
#ifdef CONFIG_SLAB_FREELIST_HARDENED
|
||||
s->random = get_random_long();
|
||||
#endif
|
||||
if (args->use_freeptr_offset)
|
||||
s->rcu_freeptr_offset = args->freeptr_offset;
|
||||
else
|
||||
s->rcu_freeptr_offset = UINT_MAX;
|
||||
s->align = args->align;
|
||||
s->ctor = args->ctor;
|
||||
#ifdef CONFIG_HARDENED_USERCOPY
|
||||
s->useroffset = args->useroffset;
|
||||
s->usersize = args->usersize;
|
||||
#endif
|
||||
|
||||
if (!calculate_sizes(s))
|
||||
goto out;
|
||||
|
Loading…
Reference in New Issue
Block a user