diff --git a/sys/vm/uma_core.c b/sys/vm/uma_core.c index 3fc5b8a..3b8384b 100644 --- a/sys/vm/uma_core.c +++ b/sys/vm/uma_core.c @@ -179,9 +179,12 @@ struct uma_bucket_zone { int ubz_entries; }; -#define BUCKET_MAX 128 +#define BUCKET_SIZE_THRESHOLD 131072 +#define BUCKET_MAX 128 struct uma_bucket_zone bucket_zones[] = { + { NULL, "4 Bucket", 4 }, + { NULL, "8 Bucket", 8 }, { NULL, "16 Bucket", 16 }, { NULL, "32 Bucket", 32 }, { NULL, "64 Bucket", 64 }, @@ -189,7 +192,7 @@ struct uma_bucket_zone bucket_zones[] = { { NULL, NULL, 0} }; -#define BUCKET_SHIFT 4 +#define BUCKET_SHIFT 2 #define BUCKET_ZONES ((BUCKET_MAX >> BUCKET_SHIFT) + 1) /* @@ -1463,6 +1466,13 @@ zone_ctor(void *mem, int size, void *udata, int flags) zone->uz_count = keg->uk_ipers; else zone->uz_count = BUCKET_MAX; + + zone->uz_count_max = BUCKET_SIZE_THRESHOLD / zone->uz_size; + if (zone->uz_count_max > BUCKET_MAX) + zone->uz_count_max = BUCKET_MAX; + else if (zone->uz_count_max < (1 << BUCKET_SHIFT)) + zone->uz_count_max = 1 << BUCKET_SHIFT; + return (0); } @@ -2076,7 +2086,7 @@ zalloc_start: critical_exit(); /* Bump up our uz_count so we get here less */ - if (zone->uz_count < BUCKET_MAX) + if (zone->uz_count < zone->uz_count_max) zone->uz_count++; /* diff --git a/sys/vm/uma_int.h b/sys/vm/uma_int.h index 7713593..6d81e3d 100644 --- a/sys/vm/uma_int.h +++ b/sys/vm/uma_int.h @@ -330,6 +330,7 @@ struct uma_zone { u_int64_t uz_sleeps; /* Total number of alloc sleeps */ uint16_t uz_fills; /* Outstanding bucket fills */ uint16_t uz_count; /* Highest value ub_ptr can have */ + uint16_t uz_count_max; /* Highest value uz_count can have */ /* * This HAS to be the last item because we adjust the zone size