From: Mike Rapoport <rppt@kernel.org>
To: Christian Brauner <brauner@kernel.org>
Cc: Vlastimil Babka <vbabka@suse.cz>, Jens Axboe <axboe@kernel.dk>,
Jann Horn <jannh@google.com>,
Linus Torvalds <torvalds@linux-foundation.org>,
linux-mm@kvack.org, linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH v2 02/15] slab: add struct kmem_cache_args
Date: Wed, 4 Sep 2024 18:16:16 +0300 [thread overview]
Message-ID: <Zth5wHtDkX78gl1l@kernel.org> (raw)
In-Reply-To: <20240903-work-kmem_cache_args-v2-2-76f97e9a4560@kernel.org>
On Tue, Sep 03, 2024 at 04:20:43PM +0200, Christian Brauner wrote:
> Signed-off-by: Christian Brauner <brauner@kernel.org>
> ---
> include/linux/slab.h | 21 ++++++++++++++++
> mm/slab_common.c | 67 +++++++++++++++++++++++++++++++++++++++-------------
> 2 files changed, 72 insertions(+), 16 deletions(-)
>
> diff --git a/include/linux/slab.h b/include/linux/slab.h
> index 5b2da2cf31a8..79d8c8bca4a4 100644
> --- a/include/linux/slab.h
> +++ b/include/linux/slab.h
> @@ -240,6 +240,27 @@ struct mem_cgroup;
> */
> bool slab_is_available(void);
>
> +/**
> + * @align: The required alignment for the objects.
> + * @useroffset: Usercopy region offset
> + * @usersize: Usercopy region size
> + * @freeptr_offset: Custom offset for the free pointer in RCU caches
> + * @use_freeptr_offset: Whether a @freeptr_offset is used
> + * @ctor: A constructor for the objects.
> + */
> +struct kmem_cache_args {
> + unsigned int align;
> + unsigned int useroffset;
> + unsigned int usersize;
> + unsigned int freeptr_offset;
> + bool use_freeptr_offset;
> + void (*ctor)(void *);
> +};
> +
> +struct kmem_cache *__kmem_cache_create_args(const char *name,
> + unsigned int object_size,
> + struct kmem_cache_args *args,
> + slab_flags_t flags);
> struct kmem_cache *kmem_cache_create(const char *name, unsigned int size,
> unsigned int align, slab_flags_t flags,
> void (*ctor)(void *));
> diff --git a/mm/slab_common.c b/mm/slab_common.c
> index 91e0e36e4379..0f13c045b8d1 100644
> --- a/mm/slab_common.c
> +++ b/mm/slab_common.c
> @@ -248,14 +248,24 @@ static struct kmem_cache *create_cache(const char *name,
> return ERR_PTR(err);
> }
>
> -static struct kmem_cache *
> -do_kmem_cache_create_usercopy(const char *name,
> - unsigned int size, unsigned int freeptr_offset,
> - unsigned int align, slab_flags_t flags,
> - unsigned int useroffset, unsigned int usersize,
> - void (*ctor)(void *))
> +/**
> + * __kmem_cache_create_args - Create a kmem cache
> + * @name: A string which is used in /proc/slabinfo to identify this cache.
> + * @object_size: The size of objects to be created in this cache.
> + * @args: Arguments for the cache creation (see struct kmem_cache_args).
> + * @flags: See %SLAB_* flags for an explanation of individual @flags.
> + *
> + * Cannot be called within a interrupt, but can be interrupted.
> + *
> + * Return: a pointer to the cache on success, NULL on failure.
> + */
> +struct kmem_cache *__kmem_cache_create_args(const char *name,
> + unsigned int object_size,
> + struct kmem_cache_args *args,
> + slab_flags_t flags)
> {
> struct kmem_cache *s = NULL;
> + unsigned int freeptr_offset = UINT_MAX;
> const char *cache_name;
> int err;
>
> @@ -275,7 +285,7 @@ do_kmem_cache_create_usercopy(const char *name,
>
> mutex_lock(&slab_mutex);
>
> - err = kmem_cache_sanity_check(name, size);
> + err = kmem_cache_sanity_check(name, object_size);
> if (err) {
> goto out_unlock;
> }
> @@ -296,12 +306,14 @@ do_kmem_cache_create_usercopy(const char *name,
>
> /* Fail closed on bad usersize of useroffset values. */
> if (!IS_ENABLED(CONFIG_HARDENED_USERCOPY) ||
> - WARN_ON(!usersize && useroffset) ||
> - WARN_ON(size < usersize || size - usersize < useroffset))
> - usersize = useroffset = 0;
> -
> - if (!usersize)
> - s = __kmem_cache_alias(name, size, align, flags, ctor);
> + WARN_ON(!args->usersize && args->useroffset) ||
> + WARN_ON(object_size < args->usersize ||
> + object_size - args->usersize < args->useroffset))
> + args->usersize = args->useroffset = 0;
> +
> + if (!args->usersize)
> + s = __kmem_cache_alias(name, object_size, args->align, flags,
> + args->ctor);
Sorry I missed it in the previous review, but nothing guaranties that
nobody will call kmem_cache_create_args with args != NULL.
I think there should be a check for args != NULL and a substitution of args
with defaults if it actually was NULL.
> if (s)
> goto out_unlock;
>
> @@ -311,9 +323,11 @@ do_kmem_cache_create_usercopy(const char *name,
> goto out_unlock;
> }
>
> - s = create_cache(cache_name, size, freeptr_offset,
> - calculate_alignment(flags, align, size),
> - flags, useroffset, usersize, ctor);
> + if (args->use_freeptr_offset)
> + freeptr_offset = args->freeptr_offset;
> + s = create_cache(cache_name, object_size, freeptr_offset,
> + calculate_alignment(flags, args->align, object_size),
> + flags, args->useroffset, args->usersize, args->ctor);
> if (IS_ERR(s)) {
> err = PTR_ERR(s);
> kfree_const(cache_name);
> @@ -335,6 +349,27 @@ do_kmem_cache_create_usercopy(const char *name,
> }
> return s;
> }
> +EXPORT_SYMBOL(__kmem_cache_create_args);
> +
> +static struct kmem_cache *
> +do_kmem_cache_create_usercopy(const char *name,
> + unsigned int size, unsigned int freeptr_offset,
> + unsigned int align, slab_flags_t flags,
> + unsigned int useroffset, unsigned int usersize,
> + void (*ctor)(void *))
> +{
> + struct kmem_cache_args kmem_args = {
> + .align = align,
> + .use_freeptr_offset = freeptr_offset != UINT_MAX,
> + .freeptr_offset = freeptr_offset,
> + .useroffset = useroffset,
> + .usersize = usersize,
> + .ctor = ctor,
> + };
> +
> + return __kmem_cache_create_args(name, size, &kmem_args, flags);
> +}
> +
>
> /**
> * kmem_cache_create_usercopy - Create a cache with a region suitable
>
> --
> 2.45.2
>
--
Sincerely yours,
Mike.
next prev parent reply other threads:[~2024-09-04 15:19 UTC|newest]
Thread overview: 67+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-03 14:20 [PATCH v2 00/15] slab: add struct kmem_cache_args Christian Brauner
2024-09-03 14:20 ` [PATCH v2 01/15] sl*b: s/__kmem_cache_create/do_kmem_cache_create/g Christian Brauner
2024-09-04 4:52 ` Mike Rapoport
2024-09-03 14:20 ` [PATCH v2 02/15] slab: add struct kmem_cache_args Christian Brauner
2024-09-04 4:54 ` Mike Rapoport
2024-09-04 8:13 ` Vlastimil Babka
2024-09-04 9:06 ` Christian Brauner
2024-09-04 15:16 ` Mike Rapoport [this message]
2024-09-04 15:48 ` Christian Brauner
2024-09-04 16:16 ` Mike Rapoport
2024-09-04 16:53 ` Christian Brauner
2024-09-04 15:49 ` Vlastimil Babka
2024-09-04 16:16 ` Mike Rapoport
2024-09-04 16:22 ` Vlastimil Babka
2024-09-04 18:21 ` Christian Brauner
2024-09-04 18:53 ` Linus Torvalds
2024-09-04 20:10 ` Christian Brauner
2024-09-03 14:20 ` [PATCH v2 03/15] slab: port kmem_cache_create() to " Christian Brauner
2024-09-04 4:55 ` Mike Rapoport
2024-09-03 14:20 ` [PATCH v2 04/15] slab: port kmem_cache_create_rcu() " Christian Brauner
2024-09-04 4:55 ` Mike Rapoport
2024-09-03 14:20 ` [PATCH v2 05/15] slab: port kmem_cache_create_usercopy() " Christian Brauner
2024-09-04 4:56 ` Mike Rapoport
2024-09-04 8:14 ` Vlastimil Babka
2024-09-04 8:59 ` Christian Brauner
2024-09-03 14:20 ` [PATCH v2 06/15] slab: pass struct kmem_cache_args to create_cache() Christian Brauner
2024-09-04 4:59 ` Mike Rapoport
2024-09-03 14:20 ` [PATCH v2 07/15] slub: pull kmem_cache_open() into do_kmem_cache_create() Christian Brauner
2024-09-04 5:02 ` Mike Rapoport
2024-09-03 14:20 ` [PATCH v2 08/15] slab: pass struct kmem_cache_args to do_kmem_cache_create() Christian Brauner
2024-09-04 5:04 ` Mike Rapoport
2024-09-03 14:20 ` [PATCH v2 09/15] sl*b: remove rcu_freeptr_offset from struct kmem_cache Christian Brauner
2024-09-04 5:08 ` Mike Rapoport
2024-09-04 8:16 ` Vlastimil Babka
2024-09-04 8:58 ` Christian Brauner
2024-09-03 14:20 ` [PATCH v2 10/15] slab: port KMEM_CACHE() to struct kmem_cache_args Christian Brauner
2024-09-04 5:08 ` Mike Rapoport
2024-09-03 14:20 ` [PATCH v2 11/15] slab: port KMEM_CACHE_USERCOPY() " Christian Brauner
2024-09-04 5:09 ` Mike Rapoport
2024-09-03 14:20 ` [PATCH v2 12/15] slab: create kmem_cache_create() compatibility layer Christian Brauner
2024-09-04 5:14 ` Mike Rapoport
2024-09-04 9:44 ` [PATCH 17/16] slab: make kmem_cache_create_usercopy() static inline Christian Brauner
2024-09-04 9:44 ` [PATCH 18/16] slab: make __kmem_cache_create() " Christian Brauner
2024-09-04 9:45 ` [PATCH v2 12/15] slab: create kmem_cache_create() compatibility layer Christian Brauner
2024-09-04 10:50 ` Vlastimil Babka
2024-09-04 11:38 ` Christian Brauner
2024-09-04 13:33 ` Vlastimil Babka
2024-09-04 14:44 ` Christian Brauner
2024-09-04 15:11 ` Mike Rapoport
2024-09-04 15:38 ` Christian Brauner
2024-09-04 15:40 ` Vlastimil Babka
2024-09-03 14:20 ` [PATCH v2 13/15] file: port to struct kmem_cache_args Christian Brauner
2024-09-04 5:15 ` Mike Rapoport
2024-09-03 14:20 ` [PATCH v2 14/15] slab: remove kmem_cache_create_rcu() Christian Brauner
2024-09-04 5:15 ` Mike Rapoport
2024-09-04 8:18 ` Vlastimil Babka
2024-09-04 8:55 ` Christian Brauner
2024-09-03 14:20 ` [PATCH v2 15/15] io_uring: port to struct kmem_cache_args Christian Brauner
2024-09-04 5:16 ` Mike Rapoport
2024-09-04 8:20 ` Vlastimil Babka
2024-09-04 8:50 ` Christian Brauner
2024-09-03 19:22 ` [PATCH v2 00/15] slab: add " Kees Cook
2024-09-03 19:25 ` Jens Axboe
2024-09-06 6:49 ` Christian Brauner
2024-09-04 8:25 ` Vlastimil Babka
2024-09-04 8:42 ` Christian Brauner
2024-09-04 9:05 ` Vlastimil Babka
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Zth5wHtDkX78gl1l@kernel.org \
--to=rppt@kernel.org \
--cc=axboe@kernel.dk \
--cc=brauner@kernel.org \
--cc=jannh@google.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=torvalds@linux-foundation.org \
--cc=vbabka@suse.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.