[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gcl-devel] brk fragmentation in hurd
From: |
Camm Maguire |
Subject: |
[Gcl-devel] brk fragmentation in hurd |
Date: |
Fri, 12 Jul 2013 14:53:42 -0400 |
Greetings! Making calls to brk toward the end of accessible memory,
then releasing same to a much lower value, fragments the memory causing
failures for subsequent operations as detailed below. This output is
stored also at http://paste.debian.net/15783/ for easier reference.
Take care,
=============================================================================
(sid)address@hidden:~/acl2-6.1$ cat t.c #include <sys/types.h> #include
<sys/stat.h> #include <fcntl.h> #include <sys/mman.h> #include <stdio.h>
#include <stdlib.h> #include <errno.h> #include <unistd.h> #include
<assert.h> #include <string.h>
long log_maxpage_bound=sizeof(long)*8-1,real_maxpage,phys_pages,available_pages;
unsigned long mb;
#define PAGESIZE (1L<<12)
#define page(x) (((unsigned long)x)>>12)
#define massert(a_) ({errno=0;if (!(a_)) {fprintf(stderr,"%s at %d of %s in %s
failed, errno %d\n",#a_,__LINE__,__FILE__,__FUNCTION__,errno);exit(-1);};})
inline int
mbrk(void *v) {
unsigned long uv=(unsigned long)v,uc=(unsigned long)sbrk(0),ux,um;
long m=((1UL<<(sizeof(long)*8-1))-1);
if ((unsigned long)v>=mb)
return -1;
if (uv<uc) {
um=uv;
ux=uc;
} else {
um=uc;
ux=uv;
}
if (((long)(ux-um))<0)
return mbrk((void *)uc+(uv<uc ? -m : m)) || mbrk(v);
return uc==(unsigned long)sbrk(uv-uc) ? 0 : -1;
}
int
update_real_maxpage(void) {
unsigned long i,j;
void *end,*cur;
#ifdef __MINGW32__
static long n;
if (!n) {
init_shared_memory();
n=1;
}
#endif
massert(cur=sbrk(0));
for (i=0,j=(1L<<log_maxpage_bound);j>PAGESIZE;j>>=1)
if ((end=cur+i+j-PAGESIZE)>cur)
if (!mbrk(end)) {
real_maxpage=page(end);
i+=j;
}
massert(!mbrk(cur));
#ifdef HAVE_SYSCONF_PHYS_PAGES
phys_pages=sysconf(_SC_PHYS_PAGES);
#ifdef BRK_DOES_NOT_GUARANTEE_ALLOCATION
if (real_maxpage>phys_pages) real_maxpage=phys_pages;
#endif
#endif
/* available_pages=real_maxpage-first_data_page-resv_pages; */
/* for (i=t_start;i<t_other;i++) */
/* available_pages-=tm_table[i].tm_type==t_relocatable ?
2*tm_table[i].tm_npage : tm_table[i].tm_maxpage; */
return 0;
}
int
main(int argc,char * argv[]) {
int l,m;
void *b,*b1;
struct stat ss;
unsigned long x;
long i,c;
sscanf(argv[4],"%ld",&c);
sscanf(argv[3],"%lx",&mb);
update_real_maxpage();
sscanf(argv[2],"%lx",&x);
massert(!brk((void *)x));
massert(!close(0));
massert(!close(1));
/* massert(!close(2)); */
massert((l=open(argv[1],O_RDONLY))>=0);
massert(!fstat(l,&ss));
if (c>=0) {
c=c ? c : ss.st_size;
massert((b=mmap(NULL,ss.st_size,PROT_READ|PROT_WRITE,MAP_ANON|MAP_PRIVATE,-1,0))!=(void
*)-1);
errno=0;
for (i=0;i*c<ss.st_size;i++)
massert(read(l,b+i*c,c)==(c>(ss.st_size-i*c) ? ss.st_size-i*c : c));
} else {
massert((b=mmap(NULL,ss.st_size,PROT_READ,MAP_SHARED,l,0))!=(void *)-1);
massert((m = open ("tst", O_RDWR | O_CREAT, 0666))>=0);
massert(!ftruncate (m, ss.st_size));
massert((b1 = mmap (NULL, ss.st_size, PROT_READ | PROT_WRITE,MAP_SHARED, m,
0))!=(void *)-1);
memcpy(b1,b,ss.st_size);
}
return 0;
}
(sid)address@hidden:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x9000000 0 ||
echo failed
(sid)address@hidden:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x90000000 0 ||
echo failed
read(l,b+i*c,c)==(c>(ss.st_size-i*c) ? ss.st_size-i*c : c) at 103 of t.c in
main failed, errno 268455948
failed
(sid)address@hidden:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x80000000 0 ||
echo failed
read(l,b+i*c,c)==(c>(ss.st_size-i*c) ? ss.st_size-i*c : c) at 103 of t.c in
main failed, errno 268455948
failed
(sid)address@hidden:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x70000000 0 ||
echo failed
(sid)address@hidden:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x7a000000 0 ||
echo failed
(sid)address@hidden:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x7b000000 0 ||
echo failed
read(l,b+i*c,c)==(c>(ss.st_size-i*c) ? ss.st_size-i*c : c) at 103 of t.c in
main failed, errno 268455948
failed
(sid)address@hidden:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x7a000000
11000000 || echo failed
(sid)address@hidden:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x7b000000
11000000 || echo failed
(sid)address@hidden:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x80000000
11000000 || echo failed
(sid)address@hidden:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x90000000
11000000 || echo failed
(sid)address@hidden:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x90000000 -1 ||
echo failed
(b1 = mmap (NULL, ss.st_size, PROT_READ | PROT_WRITE,MAP_SHARED, m, 0))!=(void
*)-1 at 108 of t.c in main failed, errno 1073741836
failed
(sid)address@hidden:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x80000000 -1 ||
echo failed
(b1 = mmap (NULL, ss.st_size, PROT_READ | PROT_WRITE,MAP_SHARED, m, 0))!=(void
*)-1 at 108 of t.c in main failed, errno 1073741836
failed
(sid)address@hidden:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x7b0000000 -1 ||
echo failed
(b1 = mmap (NULL, ss.st_size, PROT_READ | PROT_WRITE,MAP_SHARED, m, 0))!=(void
*)-1 at 108 of t.c in main failed, errno 1073741836
failed
(sid)address@hidden:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x7a0000000 -1 ||
echo failed
(b1 = mmap (NULL, ss.st_size, PROT_READ | PROT_WRITE,MAP_SHARED, m, 0))!=(void
*)-1 at 108 of t.c in main failed, errno 1073741836
failed
(sid)address@hidden:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x780000000 -1 ||
echo failed
(b1 = mmap (NULL, ss.st_size, PROT_READ | PROT_WRITE,MAP_SHARED, m, 0))!=(void
*)-1 at 108 of t.c in main failed, errno 1073741836
failed
(sid)address@hidden:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x78000000 -1 ||
echo failed
(sid)address@hidden:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x7a000000 -1 ||
echo failed
(sid)address@hidden:~/acl2-6.1$ ./t saved_acl2.gcl 0xd200000 0x7b000000 -1 ||
echo failed
(b1 = mmap (NULL, ss.st_size, PROT_READ | PROT_WRITE,MAP_SHARED, m, 0))!=(void
*)-1 at 108 of t.c in main failed, errno 1073741836
failed
(sid)address@hidden:~/acl2-6.1$
=============================================================================
--
Camm Maguire address@hidden
==========================================================================
"The earth is but one country, and mankind its citizens." -- Baha'u'llah
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Gcl-devel] brk fragmentation in hurd,
Camm Maguire <=