aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Certner <olce.freebsd@certner.fr>2023-10-13 14:09:51 +0000
committerMark Johnston <markj@FreeBSD.org>2023-11-02 13:30:03 +0000
commit87090f5e5a7b927a2ab30878435f6dcba0705a1d (patch)
tree986686b34bef27a323d0d873059dc023b49c0483
parent3d8f548b9e5772ff6890bdc01f7ba7b76203857d (diff)
downloadsrc-87090f5e5a7b927a2ab30878435f6dcba0705a1d.tar.gz
src-87090f5e5a7b927a2ab30878435f6dcba0705a1d.zip
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
-rw-r--r--sys/vm/uma_core.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/sys/vm/uma_core.c b/sys/vm/uma_core.c
index a27dba4b01f1..661c98b272da 100644
--- a/sys/vm/uma_core.c
+++ b/sys/vm/uma_core.c
@@ -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));