mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/
synced 2026-04-17 22:23:45 -04:00
slab: Introduce kmalloc_obj() and family
Introduce type-aware kmalloc-family helpers to replace the common idioms for single object and arrays of objects allocation: ptr = kmalloc(sizeof(*ptr), gfp); ptr = kmalloc(sizeof(struct some_obj_name), gfp); ptr = kzalloc(sizeof(*ptr), gfp); ptr = kmalloc_array(count, sizeof(*ptr), gfp); ptr = kcalloc(count, sizeof(*ptr), gfp); These become, respectively: ptr = kmalloc_obj(*ptr, gfp); ptr = kmalloc_obj(*ptr, gfp); ptr = kzalloc_obj(*ptr, gfp); ptr = kmalloc_objs(*ptr, count, gfp); ptr = kzalloc_objs(*ptr, count, gfp); Beyond the other benefits outlined below, the primary ergonomic benefit is the elimination of needing "sizeof" nor the type name, and the enforcement of assignment types (they do not return "void *", but rather a pointer to the type of the first argument). The type name _can_ be used, though, in the case where an assignment is indirect (e.g. via "return"). This additionally allows[1] variables to be declared via __auto_type: __auto_type ptr = kmalloc_obj(struct foo, gfp); Internal introspection of the allocated type now becomes possible, allowing for future alignment-aware choices to be made by the allocator and future hardening work that can be type sensitive. For example, adding __alignof(*ptr) as an argument to the internal allocators so that appropriate/efficient alignment choices can be made, or being able to correctly choose per-allocation offset randomization within a bucket that does not break alignment requirements. Link: https://lore.kernel.org/all/CAHk-=wiCOTW5UftUrAnvJkr6769D29tF7Of79gUjdQHS_TkF5A@mail.gmail.com/ [1] Acked-by: Vlastimil Babka <vbabka@suse.cz> Link: https://patch.msgid.link/20251203233036.3212363-1-kees@kernel.org Signed-off-by: Kees Cook <kees@kernel.org>
This commit is contained in:
@@ -372,3 +372,27 @@ The helper must be used::
|
||||
DECLARE_FLEX_ARRAY(struct type2, two);
|
||||
};
|
||||
};
|
||||
|
||||
Open-coded kmalloc assignments for struct objects
|
||||
-------------------------------------------------
|
||||
Performing open-coded kmalloc()-family allocation assignments prevents
|
||||
the kernel (and compiler) from being able to examine the type of the
|
||||
variable being assigned, which limits any related introspection that
|
||||
may help with alignment, wrap-around, or additional hardening. The
|
||||
kmalloc_obj()-family of macros provide this introspection, which can be
|
||||
used for the common code patterns for single, array, and flexible object
|
||||
allocations. For example, these open coded assignments::
|
||||
|
||||
ptr = kmalloc(sizeof(*ptr), gfp);
|
||||
ptr = kzalloc(sizeof(*ptr), gfp);
|
||||
ptr = kmalloc_array(count, sizeof(*ptr), gfp);
|
||||
ptr = kcalloc(count, sizeof(*ptr), gfp);
|
||||
ptr = kmalloc(sizeof(struct foo, gfp);
|
||||
|
||||
become, respectively::
|
||||
|
||||
ptr = kmalloc_obj(*ptr, gfp);
|
||||
ptr = kzalloc_obj(*ptr, gfp);
|
||||
ptr = kmalloc_objs(*ptr, count, gfp);
|
||||
ptr = kzalloc_objs(*ptr, count, gfp);
|
||||
__auto_type ptr = kmalloc_obj(struct foo, gfp);
|
||||
|
||||
Reference in New Issue
Block a user