From: Kees Cook <kees@kernel.org>
To: Vlastimil Babka <vbabka@suse.cz>
Cc: Christoph Lameter <cl@linux.com>,
Pekka Enberg <penberg@kernel.org>,
David Rientjes <rientjes@google.com>,
Joonsoo Kim <iamjoonsoo.kim@lge.com>,
Andrew Morton <akpm@linux-foundation.org>,
Roman Gushchin <roman.gushchin@linux.dev>,
Hyeonggon Yoo <42.hyeyoo@gmail.com>,
"Gustavo A . R . Silva" <gustavoars@kernel.org>,
Bill Wendling <morbo@google.com>,
Justin Stitt <justinstitt@google.com>,
Jann Horn <jannh@google.com>,
Przemek Kitszel <przemyslaw.kitszel@intel.com>,
Marco Elver <elver@google.com>,
linux-mm@kvack.org, Nathan Chancellor <nathan@kernel.org>,
Nick Desaulniers <ndesaulniers@google.com>,
linux-kernel@vger.kernel.org, llvm@lists.linux.dev,
linux-hardening@vger.kernel.org
Subject: Re: [PATCH] slab: Introduce kmalloc_obj() and family
Date: Mon, 12 Aug 2024 11:22:00 -0700 [thread overview]
Message-ID: <202408121113.D638922E4@keescook> (raw)
In-Reply-To: <ddf093db-b0a8-4e44-9d81-1e4840967557@suse.cz>
On Fri, Aug 09, 2024 at 10:59:52AM +0200, Vlastimil Babka wrote:
> On 8/8/24 01:54, Kees Cook wrote:
> > Introduce type-aware kmalloc-family helpers to replace the common
> > idioms for single, array, and flexible object allocations:
> >
> > ptr = kmalloc(sizeof(*ptr), gfp);
> > ptr = kcalloc(count, sizeof(*ptr), gfp);
> > ptr = kmalloc_array(count, sizeof(*ptr), gfp);
> > ptr = kcalloc(count, sizeof(*ptr), gfp);
> > ptr = kmalloc(struct_size(ptr, flex_member, count), gfp);
> >
> > These become, respectively:
> >
> > kmalloc_obj(p, gfp);
> > kzalloc_obj(p, count, gfp);
> > kmalloc_obj(p, count, gfp);
> > kzalloc_obj(p, count, gfp);
> > kmalloc_obj(p, flex_member, count, gfp);
>
> So I'm not a huge fan in hiding the assignment, but I understand there's
> value in having guaranteed the target of the assignment is really the same
> thing as the one used for sizeof() etc.
>
> But returning size seems awkward, it would be IMHO less confusing if it
> still returned the object pointer, that could be then also assigned
> elsewhere if needed, tested for NULL and ZERO_SIZE_PTR (now it's both 0?).
Ah, I made this changed based on requests in earlier threads. But yes,
the ambiguity with ZERO_SIZE_PTR does make me uncomfortable too. I think
I can make the size an optional argument when splitting the functions as
you request below...
> I'm also not sure that having it all called kmalloc_obj() with 3 variants of
> how many parameters it takes is such a win? e.g. kmalloc_obj(),
> kcalloc_obj() and kcalloc_obj_flex() would be more obvious?
I liked it because it's always doing the same thing: allocating a
structure. But yes, I do see that it's a bit weird. Since "kcalloc" means
"zero it also", how about the naming just uses pluralization instead?
kmalloc_obj(p, gfp);
kmalloc_objs(p, count, gfp);
kmalloc_flex(p, flex_member, count, gfp);
Does that looks okay?
> > These each return the size of the allocation, so that other common
> > idioms can be converted easily as well. For example:
> >
> > info->size = struct_size(ptr, flex_member, count);
> > ptr = kmalloc(info->size, gfp);
> >
> > becomes:
> >
> > info->size = kmalloc_obj(ptr, flex_member, count, gfp);
>
> How about instead taking an &info->size parameter that assigns size to it,
> so the ptr can be still returned but we also can record the size?
If we wanted size output, we could add an optional final argument:
kmalloc_obj(p, gfp, &size);
kmalloc_objs(p, count, gfp, &size);
kmalloc_flex(p, flex_member, count, gfp, &size);
And as far as solving the concern of "hiding the assignment", what about
trying to "show" that "p" is being assigned by requiring that it also
use "&"? For example:
kmalloc_obj(&p, gfp);
kmalloc_objs(&p, count, gfp);
kmalloc_flex(&p, flex_member, count, gfp);
> Also the last time David asked for documentation, you say you would try, but
> there's nothing new here? Dunno if the kerneldocs are feasible but there's
> at least Documentation/core-api/memory-allocation.rst ...
Whoops, yes. I totally missed adding those. I will add that once I have
some direction on the above design ideas.
Thanks for looking at this!
-Kees
--
Kees Cook
next prev parent reply other threads:[~2024-08-12 18:22 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-07 23:54 [PATCH] slab: Introduce kmalloc_obj() and family Kees Cook
2024-08-09 8:59 ` Vlastimil Babka
2024-08-12 18:22 ` Kees Cook [this message]
-- strict thread matches above, loose matches on Subject: below --
2024-07-19 19:27 Kees Cook
2024-07-20 3:50 ` David Rientjes
2024-07-20 16:44 ` Kees Cook
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=202408121113.D638922E4@keescook \
--to=kees@kernel.org \
--cc=42.hyeyoo@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=cl@linux.com \
--cc=elver@google.com \
--cc=gustavoars@kernel.org \
--cc=iamjoonsoo.kim@lge.com \
--cc=jannh@google.com \
--cc=justinstitt@google.com \
--cc=linux-hardening@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=llvm@lists.linux.dev \
--cc=morbo@google.com \
--cc=nathan@kernel.org \
--cc=ndesaulniers@google.com \
--cc=penberg@kernel.org \
--cc=przemyslaw.kitszel@intel.com \
--cc=rientjes@google.com \
--cc=roman.gushchin@linux.dev \
--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.