Hi! > Create test case for MAP_POPULATE of mmap. > > Verify the following statement > "For a file mapping,this causes read-ahead on the file. > Later accesses to the mapping will not be blocked by page faults." > by mmap-ing a file with specified size and checking change of memory size. > > > Signed-off-by: DAN LI <[email protected]> > --- > testcases/kernel/syscalls/mmap/mmap12.c | 163 > ++++++++++++++++++++++++++++++++ > 1 file changed, 163 insertions(+) > create mode 100644 testcases/kernel/syscalls/mmap/mmap12.c
You should add runtest entry, the rest of the mmap tests are in runtests/syscalls. > diff --git a/testcases/kernel/syscalls/mmap/mmap12.c > b/testcases/kernel/syscalls/mmap/mmap12.c > new file mode 100644 > index 0000000..4092806 > --- /dev/null > +++ b/testcases/kernel/syscalls/mmap/mmap12.c > @@ -0,0 +1,163 @@ > +/* > + * 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_POPULATE works fine. > + * "For a file mapping, this causes read-ahead on the file. > + * Later accesses to the mapping will not be blocked by page faults" > + * > + * Expected Result: > + * mmap() with MAP_POPULATE should succeed returning the address of the > + * mapped region and this file has been read into RAM, so RAM should > + * is reduced by at least size of file. > + */ > +#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 <sys/sysinfo.h> > + > +#include "test.h" > +#include "usctest.h" > + > +#define TEMPFILE "mmapfile" > +#define MMAPSIZE (400UL<<20) > +#define FLUCTUATION (50UL<<20) > + > +char *TCID = "mmap12"; > +int TST_TOTAL = 1; > + > +static char *addr; > +static int fildes; > +static struct sysinfo info; > +static unsigned long long freeram_before; > +static unsigned long long freeram_after; > + > +static void loop_setup(void); > +static void loop_cleanup(void); > +static void setup(void); > +static void cleanup(void); > + > +int main(int argc, char *argv[]) > +{ > + int lc; > + int ret = 0; > + char *msg; > + > + 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; > + > + loop_setup(); > + > + errno = 0; There is no need to zero the errno as you use it only when mmap() failed, right? > + addr = mmap(NULL, MMAPSIZE, PROT_READ | PROT_WRITE, > + MAP_FILE | MAP_PRIVATE | MAP_POPULATE, fildes, 0); > + > + if (addr == MAP_FAILED) { > + tst_resm(TFAIL | TERRNO, "mmap of %s failed", TEMPFILE); > + continue; > + } > + > + if (STD_FUNCTIONAL_TEST) { > + ret = sysinfo(&info); > + if (ret != 0) > + tst_brkm(TFAIL, cleanup, "sysinfo failed"); > + freeram_after = > + (unsigned long long)info.freeram * > + (unsigned long long)info.mem_unit; > + > + if ((freeram_before - freeram_after) >= > + (MMAPSIZE - FLUCTUATION)) > + tst_resm(TPASS, > + "Functionality of mmap() successful"); > + else > + tst_resm(TFAIL, > + "Seems read-ahead do not work"); > + } > + loop_cleanup(); > + } > + > + cleanup(); > + tst_exit(); > + > +} > + > +static void loop_setup(void) > +{ > + int ret; > + > + fildes = open(TEMPFILE, O_RDWR | O_CREAT, 0666); > + if (fildes < 0) > + tst_brkm(TFAIL, cleanup, "opening %s failed", TEMPFILE); > + > + > + if (ftruncate(fildes, MMAPSIZE) < 0) > + tst_brkm(TFAIL | TERRNO, cleanup, "ftruncate file failed"); This part could be done once in the setup. > + ret = sysinfo(&info); > + if (ret != 0) > + tst_brkm(TFAIL, cleanup, "sysinfo failed"); > + > + freeram_before = > + (unsigned long long)info.freeram * > + (unsigned long long)info.mem_unit; > +} > + > +static void loop_cleanup(void) > +{ > + if (munmap(addr, MMAPSIZE) != 0) > + tst_brkm(TFAIL | TERRNO, NULL, "munmap failed"); > + > + close(fildes); > +} > + > +static void setup(void) > +{ > + tst_sig(FORK, DEF_HANDLER, cleanup); > + > + if ((tst_kvercmp(2, 6, 23)) < 0) > + tst_brkm(TCONF, NULL, > + "This test can only run on kernels that are 2.6.23 and " > + "higher"); > + > + TEST_PAUSE; > + > + tst_tmpdir(); > +} > + > +static void cleanup(void) > +{ > + TEST_CLEANUP; > + tst_rmdir(); > +} -- Cyril Hrubis [email protected] ------------------------------------------------------------------------------ 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
