diff --git a/sys/vm/uma_core.c b/sys/vm/uma_core.c --- a/sys/vm/uma_core.c +++ b/sys/vm/uma_core.c @@ -331,6 +331,8 @@ static bool cache_alloc(uma_zone_t, uma_cache_t, void *, int); static bool cache_free(uma_zone_t, uma_cache_t, void *, int); +static void check_align_mask(unsigned mask); + static int sysctl_vm_zone_count(SYSCTL_HANDLER_ARGS); static int sysctl_vm_zone_stats(SYSCTL_HANDLER_ARGS); static int sysctl_handle_uma_zone_allocs(SYSCTL_HANDLER_ARGS); @@ -3249,13 +3251,26 @@ return (zone_alloc_item(kegs, &args, UMA_ANYDOMAIN, M_WAITOK)); } + +static void +check_align_mask(unsigned mask) +{ + + if (__predict_false(!powerof2(mask + 1))) + panic("UMA: %s: Not the mask of a power of 2 (%#x)", + __func__, mask); + if (__predict_false(mask & (1U << 31))) + panic("UMA: %s: Mask too big (%#x)", __func__, mask); +} + /* Public functions */ /* See uma.h */ void uma_set_cache_align_mask(unsigned mask) { - uma_cache_align_mask = mask & ~(1U << 31); + check_align_mask(mask); + uma_cache_align_mask = mask; } unsigned @@ -3273,8 +3288,7 @@ 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));