njs@scifi.UUCP (Nicholas J. Simicich) (09/27/89)
I'm posting this for someone with no net access.
Posted-Date: Mon, 25 Sep 89 11:17:24 -0600
To: bywater!scifi!njs (Nick Simicich)
Subject: overcommitting the page space on RT
Date: Mon, 25 Sep 89 11:17:24 -0600
From: "James Moody" <uunet!cs.utexas.edu!auschs!moody.austin.ibm.com!moody>
Nick,
Recently, Mark Spotswood posted a news article (I believe it
was comp.sys.ibm.pc.rt) asking for help with a problem on
overcommitting the page space on the RT. I am most familiar with this
problem since I was/am a development programmer on the VRM. One of
our vendors was the first we knew of to have the problem and I
developed a solution for them. Mark's article reminded me that this
is always going to be a problem for large, memory consuming
applications that were originally written for a BSD system. My
solution is an easy way for developers to port these kind of apps to a
system that uses delayed allocation of paging slots (like AIX version
2).
I don't have the capability to post articles to the outside
world but I believe this may be an article worth posting. I mailed
Mark a copy of this and he replied saying it was exactly what he
wanted. If you could post this for me I would appreciate it. Thanks
in advance.
/* ----------------------- cut here --------------------------------*/
#define PAGESIZE 2048
#define NULL 0
#include <sys/signal.h>
volatile int dangerflag;
void free();
int main()
{ int size, *ptr;
void handler();
char *MALLOC();
/* ensure this program catches sigdanger */
signal(SIGDANGER,handler);
/*************************************************************
your favorite memory hogging program which uses MALLOC to
allocate storage (not malloc)
*************************************************************/
size = ????;
ptr = MALLOC(size);
....
....
}
void handler()
{
/* sigdanger is sent when the number of paging slots drops
below the pswarn threshold (see /etc/master) */
dangerflag = 1;
}
#define MAXMEMSIZE 0x1000000
/* MALLOC is used to overcome the possibility of overcommitting the
page space */
char *MALLOC(size)
unsigned int size;
{
char *malloc();
char *p,*q;
int i;
volatile int *numps; /* number of paging slots from low memory */
/* Make sure dangerflag is initialized */
dangerflag = 0;
/* point to number of paging slots in AIX low memory */
numps = (int *)0xb8;
printf("slots,size is %d %d",*numps,size);
/* ensure there is enough backing storage to back all of
memory (note MAXMEMSIZE is as good as I can get here: that
is, a lessor value wouldn't work on machines with less
memory */
if ((*numps * PAGESIZE) < (size + MAXMEMSIZE)) return((char*)NULL);
/* call the real malloc to get the storage */
q = p = malloc(size);
if (p == (char *)NULL) return(p);
for(i = 0; i < size ; i += PAGESIZE)
{
/* touch and dirty the next page */
*q = 0;
/* Get out if we went below the pswarn threshold */
if (dangerflag) goto getout;
/* bump to the next page (note: must be careful to
touch on the next page boundary and not in the
middle of the page */
q = (char *)(((int)q & (~(PAGESIZE-1))) + PAGESIZE);
}
printf("slots,size is %d %d",*numps,size);
/* ensure there is still enough backing storage */
if ((*numps * PAGESIZE) < (size + MAXMEMSIZE)) goto getout;
return(p);
getout: /* There isn't enough space available */
printf("slots,size is %d %d",*numps,size);
free(p);
return((char *)NULL);
}
/* ------------------------- cut here -----------------------------*/
Zippy says:
.. the MYSTERIANS are in here with my CORDUROY SOAP DISH!!
James Moody Adv Workstation Div
IBM Austin, 2502
aesnet: moody@moody.austin.ibm.com
vnet: MOODY at AUSVM6
[512] 823-3743 t/l 793-3743
[external mail here--->] cs.utexas.edu!ibmaus!auschs!moody!moody
P.S. I'm not sure the return mail address is correct because I'm
something of a novice at this.
--
Nick Simicich --- uunet!bywater!scifi!njs --- njs@ibm.com (Internet)