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 "safe_macros.h"
35 #include "config.h"
36 
37 char *TCID = "mlock04";
38 int TST_TOTAL = 1;
39 
40 #include <sys/mman.h>
41 #include <stdio.h>
42 #include <sys/types.h>
43 #include <sys/stat.h>
44 #include <errno.h>
45 #include <fcntl.h>
46 #include <unistd.h>
47 #include <sys/types.h>
48 
49 int fd, file_len = 40960;
50 char *testfile = "test_mlock";
51 
52 static void setup(void);
53 static void cleanup(void);
54 
main(void)55 int main(void)
56 {
57 	char *buf;
58 	int lc;
59 
60 	setup();
61 
62 	for (lc = 0; TEST_LOOPING(lc); lc++) {
63 		buf = mmap(NULL, file_len, PROT_WRITE, MAP_SHARED, fd, 0);
64 
65 		if (buf == MAP_FAILED)
66 			tst_brkm(TBROK | TERRNO, cleanup, "mmap");
67 
68 		if (mlock(buf, file_len) == -1)
69 			tst_brkm(TBROK | TERRNO, cleanup, "mlock");
70 
71 		tst_resm(TINFO, "locked %d bytes from %p", file_len, buf);
72 
73 		if (munlock(buf, file_len) == -1)
74 			tst_brkm(TBROK | TERRNO, cleanup, "munlock");
75 
76 		SAFE_MUNMAP(cleanup, buf, file_len);
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 = SAFE_OPEN(cleanup, testfile, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
91 
92 	SAFE_FTRUNCATE(cleanup, fd, file_len);
93 
94 	TEST_PAUSE;
95 }
96 
cleanup(void)97 static void cleanup(void)
98 {
99 	close(fd);
100 
101 	tst_rmdir();
102 }
103