Using a long is the wrong type to represent the realmem and maxmbufmem

variable as they may overflow on i386/PAE and i386 with > 2GB RAM.

Use 64bit quad_t instead.  It has broader kernel infrastructure support
with TUNABLE_QUAD_FETCH() and qmin/qmax() than other available types.

Pointed out by:	alc, bde
This commit is contained in:
Andre Oppermann 2012-11-29 07:30:42 +00:00
parent 20782cbcf3
commit df905a2bd3
2 changed files with 5 additions and 5 deletions

View File

@ -93,7 +93,7 @@ int ncallout; /* maximum # of timer events */
int nbuf;
int ngroups_max; /* max # groups per process */
int nswbuf;
long maxmbufmem; /* max mbuf memory */
quad_t maxmbufmem; /* max mbuf memory */
pid_t pid_max = PID_MAX;
long maxswzone; /* max swmeta KVA storage */
long maxbcache; /* max buffer cache KVA storage */
@ -271,7 +271,7 @@ init_param1(void)
void
init_param2(long physpages)
{
long realmem;
quad_t realmem;
/* Base parameters */
maxusers = MAXUSERS;
@ -332,10 +332,10 @@ init_param2(long physpages)
* available kernel memory (physical or kmem).
* At most it can be 3/4 of available kernel memory.
*/
realmem = lmin(physpages * PAGE_SIZE,
realmem = qmin(physpages * PAGE_SIZE,
VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS);
maxmbufmem = realmem / 2;
TUNABLE_LONG_FETCH("kern.maxmbufmem", &maxmbufmem);
TUNABLE_QUAD_FETCH("kern.maxmbufmem", &maxmbufmem);
if (maxmbufmem > (realmem / 4) * 3)
maxmbufmem = (realmem / 4) * 3;

View File

@ -395,7 +395,7 @@ struct mbstat {
*
* The rest of it is defined in kern/kern_mbuf.c
*/
extern long maxmbufmem;
extern quad_t maxmbufmem;
extern uma_zone_t zone_mbuf;
extern uma_zone_t zone_clust;
extern uma_zone_t zone_pack;