Create test case for MAP_LOCKED of mmap. Verify pages are locked by checking section "VmLck" of /proc/<pid>/status.
Signed-off-by: DAN LI <[email protected]> --- runtest/syscalls | 1 + testcases/kernel/syscalls/mmap/mmap14.c | 143 ++++++++++++++++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 testcases/kernel/syscalls/mmap/mmap14.c diff --git a/runtest/syscalls b/runtest/syscalls index eba0200..4865375 100644 --- a/runtest/syscalls +++ b/runtest/syscalls @@ -562,6 +562,7 @@ mmap07 mmap07 mmap08 mmap08 mmap09 mmap09 mmap13 mmap13 +mmap14 mmap14 # test is broken, mask it for now. #mmap11 mmap11 -i 30000 diff --git a/testcases/kernel/syscalls/mmap/mmap14.c b/testcases/kernel/syscalls/mmap/mmap14.c new file mode 100644 index 0000000..f2f48f4 --- /dev/null +++ b/testcases/kernel/syscalls/mmap/mmap14.c @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2013 FNST, DAN LI <[email protected]> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See + * the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/* + * Test Description: + * Verify MAP_LOCKED works fine. + * "Lock the pages of the mapped region into memory in the manner of mlock(2)." + * + * Expected Result: + * mmap() should succeed returning the address of the mapped region, + * and this region should be locked into memory. + */ +#include <stdio.h> +#include <stdlib.h> +#include <sys/types.h> +#include <errno.h> +#include <unistd.h> +#include <fcntl.h> +#include <string.h> +#include <signal.h> +#include <stdint.h> +#include <sys/stat.h> +#include <sys/mman.h> +#include <sys/shm.h> + +#include "test.h" +#include "usctest.h" + +#define TEMPFILE "mmapfile" +#define MMAPSIZE (1UL<<20) +#define LINELEN 256 + +char *TCID = "mmap14"; +int TST_TOTAL = 1; + +static char *addr; + +static void getvmlck(unsigned int *lock_sz); +static void setup(void); +static void cleanup(void); + +int main(int argc, char *argv[]) +{ + int lc; + char *msg; + unsigned int sz_before; + unsigned int sz_after; + unsigned int sz_ch; + + msg = parse_opts(argc, argv, NULL, NULL); + if (msg != NULL) + tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); + + setup(); + + for (lc = 0; TEST_LOOPING(lc); lc++) { + + tst_count = 0; + + getvmlck(&sz_before); + + addr = mmap(NULL, MMAPSIZE, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_LOCKED | MAP_ANONYMOUS, + -1, 0); + + if (addr == MAP_FAILED) { + tst_resm(TFAIL | TERRNO, "mmap of %s failed", TEMPFILE); + continue; + } + + if (STD_FUNCTIONAL_TEST) { + + getvmlck(&sz_after); + + sz_ch = sz_after - sz_before; + if (sz_ch == MMAPSIZE / 1024) + tst_resm(TPASS, "Functionality of mmap() " + "successful"); + else + tst_resm(TFAIL, "Expected %luK locked, " + "get %uK locked", + MMAPSIZE / 1024, sz_ch); + + } else { + tst_resm(TPASS, "call succeeded"); + } + + if (munmap(addr, MMAPSIZE) != 0) + tst_brkm(TFAIL | TERRNO, NULL, "munmap failed"); + } + + cleanup(); + tst_exit(); + +} + +void getvmlck(unsigned int *lock_sz) +{ + int ret; + char line[LINELEN]; + FILE *fstatus = NULL; + + fstatus = fopen("/proc/self/status", "r"); + if (fstatus == NULL) + tst_brkm(TFAIL | TERRNO, NULL, "Open dev status failed"); + + while (fgets(line, LINELEN, fstatus) != NULL) + if (strstr(line, "VmLck") != NULL) + break; + + ret = sscanf(line, "%*[^0-9]%d%*[^0-9]", lock_sz); + if (ret != 1) + tst_brkm(TFAIL | TERRNO, NULL, "Get lock size failed"); + + fclose(fstatus); +} + +static void setup(void) +{ + tst_sig(FORK, DEF_HANDLER, cleanup); + + TEST_PAUSE; +} + +static void cleanup(void) +{ + TEST_CLEANUP; +} -- 1.8.1 ------------------------------------------------------------------------------ This SF.net email is sponsored by Windows: Build for Windows Store. http://p.sf.net/sfu/windows-dev2dev _______________________________________________ Ltp-list mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ltp-list
