• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * This is a reproducer copied from one of LKML patch submission,
3  * which subject is
4  *
5  * [PATCH] mlock: revert the optimization for dirtying pages and triggering writeback.
6  *
7  * "In 5ecfda0, we do some optimization in mlock, but it causes
8  * a very basic test case(attached below) of mlock to fail. So
9  * this patch revert it with some tiny modification so that it
10  * apply successfully with the lastest 38-rc2 kernel."
11  *
12  * Copyright (C) 2010  Red Hat, Inc.
13  * This program is free software; you can redistribute it and/or
14  * modify it under the terms of version 2 of the GNU General Public
15  * License as published by the Free Software Foundation.
16  *
17  * This program is distributed in the hope that it would be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
20  *
21  * Further, this software is distributed without any warranty that it
22  * is free of the rightful claim of any third person regarding
23  * infringement or the like.  Any license provided herein, whether
24  * implied or otherwise, applies only to this software file.  Patent
25  * licenses, if any, provided herein do not apply to combinations of
26  * this program with other software, or any other product whatsoever.
27  *
28  * You should have received a copy of the GNU General Public License
29  * along with this program; if not, write the Free Software
30  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
31  * 02110-1301, USA.
32  */
33 #include "test.h"
34 #include "config.h"
35 
36 char *TCID = "mlock04";
37 int TST_TOTAL = 1;
38 
39 #include <sys/mman.h>
40 #include <stdio.h>
41 #include <sys/types.h>
42 #include <sys/stat.h>
43 #include <errno.h>
44 #include <fcntl.h>
45 #include <unistd.h>
46 #include <sys/types.h>
47 
48 int fd, file_len = 40960;
49 char *testfile = "test_mlock";
50 
51 static void setup(void);
52 static void cleanup(void);
53 
main(void)54 int main(void)
55 {
56 	char *buf;
57 	int lc;
58 
59 	setup();
60 
61 	for (lc = 0; TEST_LOOPING(lc); lc++) {
62 		buf = mmap(NULL, file_len, PROT_WRITE, MAP_SHARED, fd, 0);
63 
64 		if (buf == MAP_FAILED)
65 			tst_brkm(TBROK | TERRNO, cleanup, "mmap");
66 
67 		if (mlock(buf, file_len) == -1)
68 			tst_brkm(TBROK | TERRNO, cleanup, "mlock");
69 
70 		tst_resm(TINFO, "locked %d bytes from %p", file_len, buf);
71 
72 		if (munlock(buf, file_len) == -1)
73 			tst_brkm(TBROK | TERRNO, cleanup, "munlock");
74 
75 		if (munmap(buf, file_len) == -1)
76 			tst_brkm(TBROK | TERRNO, cleanup, "munmap");
77 	}
78 
79 	tst_resm(TPASS, "test succeeded.");
80 
81 	cleanup();
82 
83 	tst_exit();
84 }
85 
setup(void)86 static void setup(void)
87 {
88 	tst_tmpdir();
89 
90 	fd = open(testfile, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
91 	if (fd == -1)
92 		tst_brkm(TBROK | TERRNO, cleanup, "open");
93 
94 	if (ftruncate(fd, file_len) == -1)
95 		tst_brkm(TBROK | TERRNO, cleanup, "ftruncate");
96 
97 	TEST_PAUSE;
98 }
99 
cleanup(void)100 static void cleanup(void)
101 {
102 	close(fd);
103 
104 	tst_rmdir();
105 }
106