Home | History | Annotate | Download | only in mlock
      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 
     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 
     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 
     97 static void cleanup(void)
     98 {
     99 	close(fd);
    100 
    101 	tst_rmdir();
    102 }
    103