/* *Teststheuserinterface.Thistesttriggersmostofthedocumented *errorconditionsinmincore().
*/
TEST(basic_interface)
{ int retval; int page_size; unsignedchar vec[1]; char *addr;
page_size = sysconf(_SC_PAGESIZE);
/* Query a 0 byte sized range */
retval = mincore(0, 0, vec);
EXPECT_EQ(0, retval);
/* Addresses in the specified range are invalid or unmapped */
errno = 0;
retval = mincore(NULL, page_size, vec);
EXPECT_EQ(-1, retval);
EXPECT_EQ(ENOMEM, errno);
/* *Testmincore()behavioronaprivateanonymouspagemapping. *Checkthatthepageisnotloadedintomemoryrightafterthemapping *butafteraccessingit(on-demandallocation). *Thenfreethepageandcheckthatit'snotmemory-resident.
*/
TEST(check_anonymous_locked_pages)
{ unsignedchar vec[1]; char *addr; int retval; int page_size;
page_size = sysconf(_SC_PAGESIZE);
/* Map one page and check it's not memory-resident */
errno = 0;
addr = mmap(NULL, page_size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
ASSERT_NE(MAP_FAILED, addr) {
TH_LOG("mmap error: %s", strerror(errno));
}
retval = mincore(addr, page_size, vec);
ASSERT_EQ(0, retval);
ASSERT_EQ(0, vec[0]) {
TH_LOG("Page found in memory before use");
}
/* Touch the page and check again. It should now be in memory */
addr[0] = 1;
mlock(addr, page_size);
retval = mincore(addr, page_size, vec);
ASSERT_EQ(0, retval);
ASSERT_EQ(1, vec[0]) {
TH_LOG("Page not found in memory after use");
}
/* *Itshouldn'tbememory-residentafterunlockingitand *markingitasunneeded.
*/
munlock(addr, page_size);
madvise(addr, page_size, MADV_DONTNEED);
retval = mincore(addr, page_size, vec);
ASSERT_EQ(0, retval);
ASSERT_EQ(0, vec[0]) {
TH_LOG("Page in memory after being zapped");
}
munmap(addr, page_size);
}
/* *Checkmincore()behavioronhugepages. *Thistestwillbeskippedifthemappingfails(ie.ifthereareno *hugepagesavailable). * *Makesurethesystemhasatleastonefreehugepage,check *"HugePages_Free"in/proc/meminfo. *Increment/sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepagesif *needed.
*/
TEST(check_huge_pages)
{ unsignedchar vec[1]; char *addr; int retval; int page_size;
page_size = sysconf(_SC_PAGESIZE);
errno = 0;
addr = mmap(NULL, page_size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB,
-1, 0); if (addr == MAP_FAILED) { if (errno == ENOMEM || errno == EINVAL)
SKIP(return, "No huge pages available or CONFIG_HUGETLB_PAGE disabled."); else
TH_LOG("mmap error: %s", strerror(errno));
}
retval = mincore(addr, page_size, vec);
ASSERT_EQ(0, retval);
ASSERT_EQ(0, vec[0]) {
TH_LOG("Page found in memory before use");
}
addr[0] = 1;
mlock(addr, page_size);
retval = mincore(addr, page_size, vec);
ASSERT_EQ(0, retval);
ASSERT_EQ(1, vec[0]) {
TH_LOG("Page not found in memory after use");
}
/* *Testmincore()behavioronafile-backedpage. *Nopagesshouldbeloadedintomemoryrightafterthemapping.Then, *accessinganyaddressinthemappingrangeshouldloadthepage *containingtheaddressandanumberofsubsequentpages(readahead). * *Theactualreadaheadsettingsdependonthetestenvironment,sowe *can'tmakealotofassumptionsaboutthat.Thistestcoversthemost *generalcases.
*/
TEST(check_file_mmap)
{ unsignedchar *vec; int vec_size; char *addr; int retval; int page_size; int fd; int i; int ra_pages = 0;
/* *Testmincore()behavioronapagebackedbyatmpfsfile.Thistest *performsthesamestepsasthepreviousone.
*/
TEST(check_tmpfs_mmap)
{ unsignedchar *vec; int vec_size; char *addr; int retval; int page_size; int fd; int i;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.