static void nonlinear(void) { int fd; const int NPAGES = 10; int i; char *page; char *tmp; fd = tempfd(); tmp = xmalloc(PS); for (i = 0; i < NPAGES; i++) { memset(tmp, i, PS); write(fd, tmp, PS); } free(tmp); page = checked_mmap(NULL, PS*NPAGES, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); int k = NPAGES - 1; for (i = 0; i < NPAGES; i++, k--) { if (remap_file_pages(page + i*PS, PS, 0, k, 0)) perror("remap_file_pages"); } *page = 1; testmem("rfp file dirty", page, MREAD); expecterr("rfp fsync expect error", fsync(fd) < 0); optionalerr("rfp msync expect error", msync(page, PS, MS_SYNC) < 0); close(fd); }
static void file_clean(void) { char *page; char fn[30]; snprintf(fn, 30, TMPDIR "test%d", tmpcount++); int fd = open(fn, O_RDWR|O_TRUNC|O_CREAT); if (fd < 0) err("open temp file"); write(fd, fn, 4); fsync(fd); page = checked_mmap(NULL, PS, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); close(fd); testmem("file clean", page, MREAD_OK); printf("%x\n", *(unsigned char *)page); /* reread page from disk */ testmem("file clean", page, MWRITE_OK); }
static void dirty_anonymous_unmap(void) { char *page; page = checked_mmap(NULL, PS, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_POPULATE, 0, 0); testmem("dirty", page, MWRITE); munmap_reserve(page, PS); }
/* TBD */ static void file_hole(void) { int fd = tempfd(); char *page; ftruncate(fd, PS); page = checked_mmap(NULL, PS, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); *page = 1; testmem("hole file dirty", page, MREAD); expecterr("hole fsync expect error", fsync(fd) < 0); optionalerr("hole msync expect error", msync(page, PS, MS_SYNC) < 0); close(fd); }
static void testmem2(hwloc_const_bitmap_t set, int flags) { printf(" default\n"); testmem(set, HWLOC_MEMBIND_DEFAULT, flags, 1); printf(" firsttouch\n"); testmem(set, HWLOC_MEMBIND_FIRSTTOUCH, flags, support->membind->firsttouch_membind); printf(" bound\n"); testmem(set, HWLOC_MEMBIND_BIND, flags, support->membind->bind_membind); printf(" interleave\n"); testmem(set, HWLOC_MEMBIND_INTERLEAVE, flags, support->membind->interleave_membind); printf(" replicate\n"); testmem(set, HWLOC_MEMBIND_REPLICATE, flags, support->membind->replicate_membind); printf(" nexttouch\n"); testmem(set, HWLOC_MEMBIND_NEXTTOUCH, flags, support->membind->nexttouch_membind); }
int real_main(int argc, char **argv) { size_t size; #ifdef OSKIT static void drain_lmm(void); drain_lmm(); #endif parse_args(argc, argv); size = getmem(); printf("MEMTEST: CPU=%d MHz, testtype=%s, testmode=%s\n", mhz, testtype[dotype], testmode[domode]); printf("Testing memory [%p - %p] (%d MB) %s\n", saddr, saddr + size, (int)(size / (1024 * 1024)), forever ? "forever" : "once"); testmem(size); printf("Done: %d errors\n", faults); exit(0); }
static void file_dirty(void) { char *page; char fn[PATHBUFLEN]; fn[0] = 0; int fd = playfile(fn); page = checked_mmap(NULL, PS, PROT_READ, MAP_SHARED|MAP_POPULATE, fd, 0); testmem("dirty file initial", page, MREAD); expecterr("msync expect error", msync(page, PS, MS_SYNC) < 0); close(fd); munmap_reserve(page, PS); fd = open(fn, O_RDONLY); if (fd < 0) err("reopening temp file"); page = checked_mmap(NULL, PS, PROT_READ, MAP_SHARED|MAP_POPULATE, fd, 0); recover("dirty file populated", page, MREAD_OK); close(fd); munmap_reserve(page, PS); fd = open(fn, O_RDONLY); if (fd < 0) err("reopening temp file"); page = checked_mmap(NULL, PS, PROT_READ, MAP_SHARED, fd, 0); recover("dirty file fault", page, MREAD_OK); close(fd); munmap_reserve(page, PS); fd = open(fn, O_RDWR); char buf[128]; expecterr("explicit read after poison", read(fd, buf, sizeof buf) < 0); expecterr("explicit write after poison", write(fd, "foobar", 6) < 0); optionalerr("fsync expect error", fsync(fd) < 0); close(fd); /* should unlink return an error here? */ if (unlink(fn) < 0) perror("unlink"); }
static void mlocked_anonymous(void) { char *page; page = checked_mmap(NULL, PS, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_LOCKED, 0, 0); testmem("mlocked", page, MWRITE); }