From: tangchen <tan...@cn...> - 2011-06-10 09:47:21
|
On 06/09/2011 11:19 PM, Garrett Cooper wrote: > I really wish there were less gratuitous style changes in here and > it was attached as a patch as well as inline in the email like the > style guide says.. > Thanks, > -Garrett > Hi, I am sorry about the style problem, and I resend this patch here. Please comment! Thanks.:) Signed-off-by: tangchen <tan...@cn...> --- runtest/hugetlb | 8 +- testcases/kernel/mem/hugetlb/hugemmap/Makefile | 27 +++++++- testcases/kernel/mem/hugetlb/hugemmap/hugemmap01.c | 59 +++++++--------- testcases/kernel/mem/hugetlb/hugemmap/hugemmap02.c | 49 +++++++------- testcases/kernel/mem/hugetlb/hugemmap/hugemmap03.c | 56 ++++++++-------- testcases/kernel/mem/hugetlb/hugemmap/hugemmap04.c | 41 +++++------- testcases/kernel/mem/hugetlb/hugemmap/lib/Makefile | 25 +++++++ testcases/kernel/mem/hugetlb/hugemmap/lib/libmnt.c | 70 ++++++++++++++++++++ testcases/kernel/mem/hugetlb/hugemmap/lib/libmnt.h | 27 ++++++++ 9 files changed, 245 insertions(+), 117 deletions(-) create mode 100644 testcases/kernel/mem/hugetlb/hugemmap/lib/Makefile create mode 100644 testcases/kernel/mem/hugetlb/hugemmap/lib/libmnt.c create mode 100644 testcases/kernel/mem/hugetlb/hugemmap/lib/libmnt.h diff --git a/runtest/hugetlb b/runtest/hugetlb index af45868..641c2a6 100644 --- a/runtest/hugetlb +++ b/runtest/hugetlb @@ -1,7 +1,7 @@ -hugemmap01 hugemmap01 -H/tmp -hugemmap02 hugemmap02 -H/tmp -c10 -hugemmap03 hugemmap03 -H/tmp -I2 -c10 -hugemmap04 hugemmap04 -H/tmp +hugemmap01 hugemmap01 +hugemmap02 hugemmap02 -c10 +hugemmap03 hugemmap03 -I2 -c10 +hugemmap04 hugemmap04 hugemmap05 hugemmap05 hugemmap05_1 hugemmap05 -m hugemmap05_2 hugemmap05 -s diff --git a/testcases/kernel/mem/hugetlb/hugemmap/Makefile b/testcases/kernel/mem/hugetlb/hugemmap/Makefile index a1ba46e..b89a040 100644 --- a/testcases/kernel/mem/hugetlb/hugemmap/Makefile +++ b/testcases/kernel/mem/hugetlb/hugemmap/Makefile @@ -20,8 +20,31 @@ # Garrett Cooper, July 2009 # -top_srcdir ?= ../../../../.. +top_srcdir ?= ../../../../.. include $(top_srcdir)/include/mk/testcases.mk -include $(abs_srcdir)/../Makefile.inc + +LIBDIR := lib +LIB := $(LIBDIR)/libmnt_hugetlb.a +FILTER_OUT_DIRS := $(LIBDIR) + +$(LIBDIR): + mkdir -p "$@" + +$(LIB): $(LIBDIR) + $(MAKE) -C $^ -f "$(abs_srcdir)/$^/Makefile" all + +CPPFLAGS += -I$(abs_srcdir)/$(LIBDIR) + +LDFLAGS += -L$(abs_builddir)/$(LIBDIR) + +LDLIBS += -lmnt_hugetlb + +MAKE_DEPS := $(LIB) + +trunk-clean:: | lib-clean + +lib-clean:: $(LIBDIR) + $(MAKE) -C $^ -f "$(abs_srcdir)/$^/Makefile" clean + include $(top_srcdir)/include/mk/generic_leaf_target.mk diff --git a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap01.c b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap01.c index 874f736..ddde10c 100644 --- a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap01.c +++ b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap01.c @@ -73,53 +73,42 @@ #include "test.h" #include "usctest.h" #include "system_specific_hugepages_info.h" +#include "lib/libmnt.h" #define BUFFER_SIZE 256 -char* TEMPFILE="mmapfile"; +char TEMPFILE[MAXPATHLEN]; char *TCID="hugemmap01"; /* Test program identifier. */ int TST_TOTAL=1; /* Total number of test cases. */ long *addr; /* addr of memory mapped region */ int fildes; /* file descriptor for tempfile */ -char *Hopt; /* location of hugetlbfs */ -int beforetest=0; /* Amount of free huge pages before testing */ -int aftertest=0; /* Amount of free huge pages after testing */ +int free_huge_before=0; +int free_huge_after=0; int hugepagesmapped=0; /* Amount of huge pages mapped after testing */ +char *mount_point = NULL; -void setup(); /* Main setup function of test */ -void cleanup(); /* cleanup function for the test */ - -void help() -{ - printf(" -H /.. Location of hugetlbfs, i.e. -H /var/hugetlbfs \n"); -} +void setup(void); +void cleanup(void); int main(int ac, char **av) { int lc; /* loop counter */ char *msg; /* message returned from parse_opts */ - int Hflag=0; /* binary flag: opt or not */ int page_sz=0; - option_t options[] = { - { "H:", &Hflag, &Hopt }, /* Required for location of hugetlbfs */ - { NULL, NULL, NULL } /* NULL required to end array */ - }; + option_t options[] = { + { NULL, NULL, NULL } /* NULL required to end array */ + }; /* Parse standard options given to run the test. */ - msg = parse_opts(ac, av, options, &help); + msg = parse_opts(ac, av, options, NULL); if (msg != (char *) NULL) { tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s, use -help", msg); tst_exit(); } - if (Hflag == 0) { - tst_brkm(TBROK, NULL, "-H option is REQUIRED for this test, use -h for options help"); - tst_exit(); - } - setup(); for (lc = 0; TEST_LOOPING(lc); lc++) { @@ -134,7 +123,7 @@ main(int ac, char **av) Tst_count=0; /* Note the number of free huge pages BEFORE testing */ - beforetest = get_no_of_free_hugepages(); + free_huge_before = get_no_of_free_hugepages(); /* Note the size of huge page size BEFORE testing */ page_sz = hugepages_size(); @@ -159,8 +148,8 @@ main(int ac, char **av) } /* Make sure the number of free huge pages AFTER testing decreased */ - aftertest = get_no_of_free_hugepages(); - hugepagesmapped = beforetest - aftertest; + free_huge_after = get_no_of_free_hugepages(); + hugepagesmapped = free_huge_before - free_huge_after; if (hugepagesmapped < 1) { tst_resm(TWARN,"Number of HUGEPAGES_FREE stayed the same. Okay if"); tst_resm(TWARN,"multiple copies running due to test collision."); @@ -189,18 +178,21 @@ main(int ac, char **av) * Write some known data into file and get the size of the file. */ void -setup() +setup(void) { - char mypid[40]; - - sprintf(mypid,"/%d",getpid()); - TEMPFILE=strcat(mypid,TEMPFILE); - TEMPFILE=strcat(Hopt,TEMPFILE); + tst_require_root(NULL); tst_sig(FORK, DEF_HANDLER, cleanup); TEST_PAUSE; + tst_tmpdir(); + mount_point = get_tst_tmpdir(); + + mount_hugetlbfs(mount_point); + hugepage_alloc(1024); + + snprintf(TEMPFILE, sizeof(TEMPFILE), "%s/mmapfile%d", mount_point, getpid()); } /* @@ -209,7 +201,7 @@ setup() * Remove the temporary directory created. */ void -cleanup() +cleanup(void) { /* * print timing stats if that option was specified. @@ -217,5 +209,6 @@ cleanup() TEST_CLEANUP; unlink(TEMPFILE); - + umount_hugetlbfs(mount_point); + tst_rmdir(); } diff --git a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap02.c b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap02.c index 45cddf7..bef5b78 100644 --- a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap02.c +++ b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap02.c @@ -63,6 +63,7 @@ #include "test.h" #include "usctest.h" #include "system_specific_hugepages_info.h" +#include "lib/libmnt.h" #define LOW_ADDR (void *)(0x80000000) #define LOW_ADDR2 (void *)(0x90000000) @@ -77,36 +78,27 @@ unsigned long *addrlist[5]; /* list of addresses of memory mapped region */ int i; int fildes; /* file descriptor for tempfile */ int nfildes; /* file descriptor for /dev/zero */ -char *Hopt; /* location of hugetlbfs */ +char *mount_point = NULL; -void setup(); /* Main setup function of test */ -void cleanup(); /* cleanup function for the test */ - -void help() -{ - printf(" -H /.. Location of hugetlbfs, i.e. -H /var/hugetlbfs \n"); -} +void setup(void); /* Main setup function of test */ +void cleanup(void); /* cleanup function for the test */ int main(int ac, char **av) { int lc; - char *msg; - int Hflag = 0; + char *msg; /* message returned from parse_opts */ int page_sz, map_sz; - option_t options[] = { - { "H:", &Hflag, &Hopt }, /* Required for location of hugetlbfs */ - { NULL, NULL, NULL } /* NULL required to end array */ - }; + option_t options[] = { + { NULL, NULL, NULL } /* NULL required to end array */ + }; /* Parse standard options given to run the test. */ - if ((msg = parse_opts(ac, av, options, &help)) != NULL) + msg = parse_opts(ac, av, options, NULL); + if (msg != (char *) NULL) { tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s, use -help", msg); - - if (Hflag == 0) { - tst_brkm(TBROK, NULL, - "-H option is REQUIRED for this test, use -h for options help"); + tst_exit(); } page_sz = getpagesize(); @@ -206,15 +198,20 @@ main(int ac, char **av) * Write some known data into file and get the size of the file. */ void -setup() +setup(void) { - tst_tmpdir(); - - snprintf(TEMPFILE, sizeof(TEMPFILE), "%s/mmapfile%d", Hopt, getpid()); + tst_require_root(NULL); tst_sig(FORK, DEF_HANDLER, cleanup); - TEST_PAUSE; + + tst_tmpdir(); + mount_point = get_tst_tmpdir(); + + mount_hugetlbfs(mount_point); + hugepage_alloc(1024); + + snprintf(TEMPFILE, sizeof(TEMPFILE), "%s/mmapfile%d", mount_point, getpid()); } /* @@ -223,7 +220,7 @@ setup() * Remove the temporary directory created. */ void -cleanup() +cleanup(void) { /* * print timing stats if that option was specified. @@ -231,6 +228,6 @@ cleanup() TEST_CLEANUP; unlink(TEMPFILE); - + umount_hugetlbfs(mount_point); tst_rmdir(); } diff --git a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap03.c b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap03.c index cac94b0..1ffb8a1 100644 --- a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap03.c +++ b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap03.c @@ -54,31 +54,26 @@ #include "test.h" #include "usctest.h" #include "system_specific_hugepages_info.h" +#include "lib/libmnt.h" #define HIGH_ADDR (void *)(0x1000000000000) -char* TEMPFILE="mmapfile"; +char TEMPFILE[MAXPATHLEN]; char *TCID="hugemmap03"; /* Test program identifier. */ int TST_TOTAL=1; /* Total number of test cases. */ unsigned long *addr; /* addr of memory mapped region */ int fildes; /* file descriptor for tempfile */ -char *Hopt; /* location of hugetlbfs */ +char *mount_point = NULL; -void setup(); /* Main setup function of test */ -void cleanup(); /* cleanup function for the test */ - -void help() -{ - printf(" -H /.. Location of hugetlbfs, i.e. -H /var/hugetlbfs \n"); -} +void setup(void); /* Main setup function of test */ +void cleanup(void); /* cleanup function for the test */ int main(int ac, char **av) { int lc; /* loop counter */ char *msg; /* message returned from parse_opts */ - int Hflag=0; /* binary flag: opt or not */ int page_sz; #if __WORDSIZE==32 /* 32-bit compiled */ @@ -86,22 +81,16 @@ main(int ac, char **av) #endif option_t options[] = { - { "H:", &Hflag, &Hopt }, /* Required for location of hugetlbfs */ { NULL, NULL, NULL } /* NULL required to end array */ }; /* Parse standard options given to run the test. */ - msg = parse_opts(ac, av, options, &help); + msg = parse_opts(ac, av, options, NULL); if (msg != (char *) NULL) { tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s, use -help", msg); tst_exit(); } - if (Hflag == 0) { - tst_brkm(TBROK, NULL, "-H option is REQUIRED for this test, use -h for options help"); - tst_exit(); - } - page_sz = getpagesize(); setup(); @@ -122,8 +111,15 @@ main(int ac, char **av) addr = mmap(HIGH_ADDR, page_sz, PROT_READ, MAP_SHARED | MAP_FIXED, fildes, 0); if (addr != MAP_FAILED) { - tst_resm(TFAIL, "Normal mmap() into high region unexpectedly succeeded on %s, errno=%d : %s", - TEMPFILE, errno, strerror(errno)); + tst_resm(TFAIL, "Normal mmap() into high region unexpectedly " + "succeeded on %s, errno=%d : %s", + TEMPFILE, errno, strerror(errno)); + + /* Unmap the mapped memory */ + if (munmap(addr, page_sz) != 0) { + tst_brkm(TFAIL, NULL, "munmap() fails to unmap the " + "memory, errno=%d", errno); + } continue; } else { tst_resm(TPASS, "Normal mmap() into high region failed correctly"); @@ -133,6 +129,7 @@ main(int ac, char **av) close(fildes); } + close(fildes); cleanup(); tst_exit(); @@ -149,18 +146,20 @@ main(int ac, char **av) * Write some known data into file and get the size of the file. */ void -setup() +setup(void) { - char mypid[40]; - - sprintf(mypid,"/%d",getpid()); - TEMPFILE=strcat(mypid,TEMPFILE); - TEMPFILE=strcat(Hopt,TEMPFILE); + tst_require_root(NULL); tst_sig(FORK, DEF_HANDLER, cleanup); - TEST_PAUSE; + tst_tmpdir(); + mount_point = get_tst_tmpdir(); + + mount_hugetlbfs(mount_point); + hugepage_alloc(1024); + + snprintf(TEMPFILE, sizeof(TEMPFILE), "%s/mmapfile%d", mount_point, getpid()); } /* @@ -169,7 +168,7 @@ setup() * Remove the temporary directory created. */ void -cleanup() +cleanup(void) { /* * print timing stats if that option was specified. @@ -177,5 +176,6 @@ cleanup() TEST_CLEANUP; unlink(TEMPFILE); - + umount_hugetlbfs(mount_point); + tst_rmdir(); } diff --git a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap04.c b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap04.c index 4cc6ed4..ba606d4 100644 --- a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap04.c +++ b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap04.c @@ -73,10 +73,11 @@ #include "test.h" #include "usctest.h" #include "system_specific_hugepages_info.h" +#include "lib/libmnt.h" #define BUFFER_SIZE 256 -char* TEMPFILE="mmapfile"; +char TEMPFILE[MAXPATHLEN]; char *TCID="hugemmap04"; /* Test program identifier. */ int TST_TOTAL=1; /* Total number of test cases. */ @@ -88,40 +89,29 @@ int beforetest=0; /* Amount of free huge pages before testing */ int aftertest=0; /* Amount of free huge pages after testing */ int hugepagesmapped=0; /* Amount of huge pages mapped after testing */ char *Hopt; /* location of hugetlbfs */ +char *mount_point = NULL; -void setup(); /* Main setup function of test */ -void cleanup(); /* cleanup function for the test */ - -void help() -{ - printf(" -H /.. Location of hugetlbfs, i.e. -H /var/hugetlbfs \n"); -} +void setup(void); /* Main setup function of test */ +void cleanup(void); /* cleanup function for the test */ int main(int ac, char **av) { int lc; /* loop counter */ char *msg; /* message returned from parse_opts */ - int Hflag=0; /* binary flag: opt or not */ int huge_pagesize=0; option_t options[] = { - { "H:", &Hflag, &Hopt }, /* Required for location of hugetlbfs */ { NULL, NULL, NULL } /* NULL required to end array */ }; /* Parse standard options given to run the test. */ - msg = parse_opts(ac, av, options, &help); + msg = parse_opts(ac, av, options, NULL); if (msg != (char *) NULL) { tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s, use -help", msg); tst_exit(); } - if (Hflag == 0) { - tst_brkm(TBROK, NULL, "-H option is REQUIRED for this test, use -h for options help"); - tst_exit(); - } - /* Check number of hugepages */ if (get_no_of_hugepages() <= 0 || hugepages_size() <= 0) tst_brkm(TCONF, cleanup, "Not enough available Hugepages"); @@ -151,7 +141,7 @@ main(int ac, char **av) tst_resm(TINFO,"Total amount of free huge pages is %d",freepages); tst_resm(TINFO,"Max number allowed for 1 mmap file in 32-bits is 128"); if (freepages > 128) - freepages=128; + freepages=128; #endif /* * Call mmap @@ -206,16 +196,18 @@ main(int ac, char **av) void setup() { - char mypid[40]; - - sprintf(mypid,"/%d",getpid()); - TEMPFILE=strcat(mypid,TEMPFILE); - TEMPFILE=strcat(Hopt,TEMPFILE); + tst_require_root(NULL); tst_sig(FORK, DEF_HANDLER, cleanup); - TEST_PAUSE; + tst_tmpdir(); + mount_point = get_tst_tmpdir(); + + mount_hugetlbfs(mount_point); + hugepage_alloc(1024); + + snprintf(TEMPFILE, sizeof(TEMPFILE), "%s/mmapfile%d", mount_point, getpid()); } /* @@ -232,5 +224,6 @@ cleanup() TEST_CLEANUP; unlink(TEMPFILE); - + umount_hugetlbfs(mount_point); + tst_rmdir(); } diff --git a/testcases/kernel/mem/hugetlb/hugemmap/lib/Makefile b/testcases/kernel/mem/hugetlb/hugemmap/lib/Makefile new file mode 100644 index 0000000..f37b87a --- /dev/null +++ b/testcases/kernel/mem/hugetlb/hugemmap/lib/Makefile @@ -0,0 +1,25 @@ +# +# Copyright (c) International Business Machines Corp., 2001 +# +# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +top_srcdir ?= ../../../../../.. + +include $(top_srcdir)/include/mk/env_pre.mk + +LIB := libmnt_hugetlb.a + +include $(top_srcdir)/include/mk/lib.mk diff --git a/testcases/kernel/mem/hugetlb/hugemmap/lib/libmnt.c b/testcases/kernel/mem/hugetlb/hugemmap/lib/libmnt.c new file mode 100644 index 0000000..ac7fadb --- /dev/null +++ b/testcases/kernel/mem/hugetlb/hugemmap/lib/libmnt.c @@ -0,0 +1,70 @@ +/* + * + * Copyright (c) International Business Machines Corp., 2001 + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + * NAME + * libmnt.c + * + * DESCRIPTION + * Helper functions for mounting hugetlbfs automatically. + * + * The library contains the following routines: + * + * hugepage_alloc() + * mount_hugetlbfs() + * umount_hugetlbfs() + */ +#include <stdio.h> +#include <stdlib.h> +#include <sys/mount.h> +#include <errno.h> +#include <sys/stat.h> + +#include "test.h" + +#include "libmnt.h" + +void +hugepage_alloc(int num) +{ + FILE *file = fopen("/proc/sys/vm/nr_hugepages", "w+"); + if (file == NULL) { + tst_brkm(TBROK|TERRNO, NULL, "fopen failed on /proc/sys/vm/nr_hugepages"); + } + + if (fprintf(file, "%d", num) < 0) { + tst_brkm(TBROK|TERRNO, NULL, "fprintf failed on /proc/sys/vm/nr_hugepages"); + } + + fclose(file); +} + +void +mount_hugetlbfs(char *mount_point) +{ + if (mount("none", mount_point, "hugetlbfs", 0, NULL) < 0) { + tst_brkm(TBROK|TERRNO, NULL, "mount failed on %s", mount_point); + } +} + +void +umount_hugetlbfs(char *mount_point) +{ + umount(mount_point); +} diff --git a/testcases/kernel/mem/hugetlb/hugemmap/lib/libmnt.h b/testcases/kernel/mem/hugetlb/hugemmap/lib/libmnt.h new file mode 100644 index 0000000..b9b26ed --- /dev/null +++ b/testcases/kernel/mem/hugetlb/hugemmap/lib/libmnt.h @@ -0,0 +1,27 @@ +/* + * + * Copyright (c) International Business Machines Corp., 2001 + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + * libmnt.h - functions to mount hugetlbfs automatically. + */ + +void hugepage_alloc(int num); +void mount_hugetlbfs(char *mount_point); +void umount_hugetlbfs(char *mount_point); + -- 1.7.1 -- Best Regards, Tang chen |