gcl-devel
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]