mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
uma: New check_align_mask(): Validate alignments (INVARIANTS)
New function check_align_mask() asserts (under INVARIANTS) that the mask fits in a (signed) integer (see the comment) and that the corresponding alignment is a power of two. Use check_align_mask() in uma_set_align_mask() and also in uma_zcreate() to replace the KASSERT() there (that was checking only for a power of 2). Reviewed by: kib, markj MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D42263 (cherry picked from commit 87090f5e5a7b927a2ab30878435f6dcba0705a1d)
This commit is contained in:
parent
690ca45aeb
commit
7deedba4e5
1 changed files with 18 additions and 7 deletions
|
|
@ -3249,19 +3249,31 @@ uma_kcreate(uma_zone_t zone, size_t size, uma_init uminit, uma_fini fini,
|
|||
return (zone_alloc_item(kegs, &args, UMA_ANYDOMAIN, M_WAITOK));
|
||||
}
|
||||
|
||||
/* Public functions */
|
||||
/* See uma.h */
|
||||
void
|
||||
uma_set_cache_align_mask(unsigned int mask)
|
||||
|
||||
static void
|
||||
check_align_mask(unsigned int mask)
|
||||
{
|
||||
|
||||
KASSERT(powerof2(mask + 1),
|
||||
("UMA: %s: Not the mask of a power of 2 (%#x)", __func__, mask));
|
||||
/*
|
||||
* Make sure the stored align mask doesn't have its highest bit set,
|
||||
* which would cause implementation-defined behavior when passing it as
|
||||
* the 'align' argument of uma_zcreate(). Such very large alignments do
|
||||
* not make sense anyway.
|
||||
*/
|
||||
uma_cache_align_mask = mask & ~(1U << 31);
|
||||
KASSERT(mask <= INT_MAX,
|
||||
("UMA: %s: Mask too big (%#x)", __func__, mask));
|
||||
}
|
||||
|
||||
/* Public functions */
|
||||
/* See uma.h */
|
||||
void
|
||||
uma_set_cache_align_mask(unsigned int mask)
|
||||
{
|
||||
|
||||
check_align_mask(mask);
|
||||
uma_cache_align_mask = mask;
|
||||
}
|
||||
|
||||
/* Returns the alignment mask to use to request cache alignment. */
|
||||
|
|
@ -3280,8 +3292,7 @@ uma_zcreate(const char *name, size_t size, uma_ctor ctor, uma_dtor dtor,
|
|||
struct uma_zctor_args args;
|
||||
uma_zone_t res;
|
||||
|
||||
KASSERT(powerof2(align + 1), ("invalid zone alignment %d for \"%s\"",
|
||||
align, name));
|
||||
check_align_mask(align);
|
||||
|
||||
/* This stuff is essential for the zone ctor */
|
||||
memset(&args, 0, sizeof(args));
|
||||
|
|
|
|||
Loading…
Reference in a new issue