mirror of
https://git.FreeBSD.org/src.git
synced 2024-11-21 07:15:49 +00:00
uma: Make the cache alignment mask unsigned
In uma_set_align_mask(), ensure that the passed value doesn't have its highest bit set, which would lead to problems since keg/zone alignment is internally stored as signed integers. Such big values do not make sense anyway and indicate some programming error. A future commit will introduce checks for this case and other ones. Reviewed by: kib, markj MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D42262
This commit is contained in:
parent
1bce6f951a
commit
3d8f548b9e
@ -61,8 +61,8 @@
|
||||
|
||||
/* PRIMARY CACHE VARIABLES */
|
||||
|
||||
int arm_dcache_align;
|
||||
int arm_dcache_align_mask;
|
||||
unsigned int arm_dcache_align;
|
||||
unsigned int arm_dcache_align_mask;
|
||||
|
||||
#ifdef CPU_MV_PJ4B
|
||||
static void pj4bv7_setup(void);
|
||||
@ -170,7 +170,7 @@ get_cachetype_cp15(void)
|
||||
: : "r" (sel));
|
||||
__asm __volatile("mrc p15, 1, %0, c0, c0, 0"
|
||||
: "=r" (csize));
|
||||
arm_dcache_align = 1 <<
|
||||
arm_dcache_align = 1U <<
|
||||
(CPUV7_CT_xSIZE_LEN(csize) + 4);
|
||||
}
|
||||
if (type == CACHE_ICACHE || type == CACHE_SEP_CACHE) {
|
||||
|
@ -475,7 +475,7 @@ void uma_zone_reclaim_domain(uma_zone_t, int req, int domain);
|
||||
* Returns:
|
||||
* Nothing
|
||||
*/
|
||||
void uma_set_cache_align_mask(int mask);
|
||||
void uma_set_cache_align_mask(unsigned int mask);
|
||||
|
||||
#include <vm/uma_align_mask.h>
|
||||
|
||||
|
@ -31,6 +31,6 @@
|
||||
#ifndef _VM_UMA_ALIGN_MASK_H_
|
||||
#define _VM_UMA_ALIGN_MASK_H_
|
||||
|
||||
int uma_get_cache_align_mask(void) __pure;
|
||||
unsigned int uma_get_cache_align_mask(void) __pure;
|
||||
|
||||
#endif /* !_VM_UMA_ALIGN_MASK_H_ */
|
||||
|
@ -150,7 +150,7 @@ static uma_zone_t slabzones[2];
|
||||
static uma_zone_t hashzone;
|
||||
|
||||
/* The boot-time adjusted value for cache line alignment. */
|
||||
static int uma_cache_align_mask = 64 - 1;
|
||||
static unsigned int uma_cache_align_mask = 64 - 1;
|
||||
|
||||
static MALLOC_DEFINE(M_UMAHASH, "UMAHash", "UMA Hash Buckets");
|
||||
static MALLOC_DEFINE(M_UMA, "UMA", "UMA Misc");
|
||||
@ -3252,15 +3252,20 @@ uma_kcreate(uma_zone_t zone, size_t size, uma_init uminit, uma_fini fini,
|
||||
/* Public functions */
|
||||
/* See uma.h */
|
||||
void
|
||||
uma_set_cache_align_mask(int mask)
|
||||
uma_set_cache_align_mask(unsigned int mask)
|
||||
{
|
||||
|
||||
if (mask >= 0)
|
||||
uma_cache_align_mask = 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);
|
||||
}
|
||||
|
||||
/* Returns the alignment mask to use to request cache alignment. */
|
||||
int
|
||||
unsigned int
|
||||
uma_get_cache_align_mask(void)
|
||||
{
|
||||
return (uma_cache_align_mask);
|
||||
|
Loading…
Reference in New Issue
Block a user