18f9db557fcb8803859cd65803f58703179cafdbcDAN LI/*
28f9db557fcb8803859cd65803f58703179cafdbcDAN LI * Copyright (c) 2013 FNST, DAN LI <li.dan@cn.fujitsu.com>
38f9db557fcb8803859cd65803f58703179cafdbcDAN LI *
48f9db557fcb8803859cd65803f58703179cafdbcDAN LI * This program is free software;  you can redistribute it and/or modify
58f9db557fcb8803859cd65803f58703179cafdbcDAN LI * it under the terms of the GNU General Public License as published by
68f9db557fcb8803859cd65803f58703179cafdbcDAN LI * the Free Software Foundation; either version 2 of the License, or
78f9db557fcb8803859cd65803f58703179cafdbcDAN LI * (at your option) any later version.
88f9db557fcb8803859cd65803f58703179cafdbcDAN LI *
98f9db557fcb8803859cd65803f58703179cafdbcDAN LI * This program is distributed in the hope that it will be useful,
108f9db557fcb8803859cd65803f58703179cafdbcDAN LI * but WITHOUT ANY WARRANTY;  without even the implied warranty of
118f9db557fcb8803859cd65803f58703179cafdbcDAN LI * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
128f9db557fcb8803859cd65803f58703179cafdbcDAN LI * the GNU General Public License for more details.
138f9db557fcb8803859cd65803f58703179cafdbcDAN LI *
148f9db557fcb8803859cd65803f58703179cafdbcDAN LI * You should have received a copy of the GNU General Public License
158f9db557fcb8803859cd65803f58703179cafdbcDAN LI * along with this program;  if not, write to the Free Software
168f9db557fcb8803859cd65803f58703179cafdbcDAN LI * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
178f9db557fcb8803859cd65803f58703179cafdbcDAN LI */
188f9db557fcb8803859cd65803f58703179cafdbcDAN LI
198f9db557fcb8803859cd65803f58703179cafdbcDAN LI/*
208f9db557fcb8803859cd65803f58703179cafdbcDAN LI * Test Description:
218f9db557fcb8803859cd65803f58703179cafdbcDAN LI *  Verify MAP_LOCKED works fine.
228f9db557fcb8803859cd65803f58703179cafdbcDAN LI *  "Lock the pages of the mapped region into memory in the manner of mlock(2)."
238f9db557fcb8803859cd65803f58703179cafdbcDAN LI *
248f9db557fcb8803859cd65803f58703179cafdbcDAN LI * Expected Result:
258f9db557fcb8803859cd65803f58703179cafdbcDAN LI *  mmap() should succeed returning the address of the mapped region,
268f9db557fcb8803859cd65803f58703179cafdbcDAN LI *  and this region should be locked into memory.
278f9db557fcb8803859cd65803f58703179cafdbcDAN LI */
288f9db557fcb8803859cd65803f58703179cafdbcDAN LI#include <stdio.h>
298f9db557fcb8803859cd65803f58703179cafdbcDAN LI#include <sys/mman.h>
308f9db557fcb8803859cd65803f58703179cafdbcDAN LI
318f9db557fcb8803859cd65803f58703179cafdbcDAN LI#include "test.h"
328f9db557fcb8803859cd65803f58703179cafdbcDAN LI
338f9db557fcb8803859cd65803f58703179cafdbcDAN LI#define TEMPFILE        "mmapfile"
348f9db557fcb8803859cd65803f58703179cafdbcDAN LI#define MMAPSIZE        (1UL<<20)
358f9db557fcb8803859cd65803f58703179cafdbcDAN LI#define LINELEN         256
368f9db557fcb8803859cd65803f58703179cafdbcDAN LI
378f9db557fcb8803859cd65803f58703179cafdbcDAN LIchar *TCID = "mmap14";
388f9db557fcb8803859cd65803f58703179cafdbcDAN LIint TST_TOTAL = 1;
398f9db557fcb8803859cd65803f58703179cafdbcDAN LI
408f9db557fcb8803859cd65803f58703179cafdbcDAN LIstatic char *addr;
418f9db557fcb8803859cd65803f58703179cafdbcDAN LI
428f9db557fcb8803859cd65803f58703179cafdbcDAN LIstatic void getvmlck(unsigned int *lock_sz);
438f9db557fcb8803859cd65803f58703179cafdbcDAN LIstatic void setup(void);
448f9db557fcb8803859cd65803f58703179cafdbcDAN LIstatic void cleanup(void);
458f9db557fcb8803859cd65803f58703179cafdbcDAN LI
468f9db557fcb8803859cd65803f58703179cafdbcDAN LIint main(int argc, char *argv[])
478f9db557fcb8803859cd65803f58703179cafdbcDAN LI{
488f9db557fcb8803859cd65803f58703179cafdbcDAN LI	int lc;
498f9db557fcb8803859cd65803f58703179cafdbcDAN LI	unsigned int sz_before;
508f9db557fcb8803859cd65803f58703179cafdbcDAN LI	unsigned int sz_after;
518f9db557fcb8803859cd65803f58703179cafdbcDAN LI	unsigned int sz_ch;
528f9db557fcb8803859cd65803f58703179cafdbcDAN LI
53d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis	tst_parse_opts(argc, argv, NULL, NULL);
548f9db557fcb8803859cd65803f58703179cafdbcDAN LI
558f9db557fcb8803859cd65803f58703179cafdbcDAN LI	setup();
568f9db557fcb8803859cd65803f58703179cafdbcDAN LI
578f9db557fcb8803859cd65803f58703179cafdbcDAN LI	for (lc = 0; TEST_LOOPING(lc); lc++) {
588f9db557fcb8803859cd65803f58703179cafdbcDAN LI
598f9db557fcb8803859cd65803f58703179cafdbcDAN LI		tst_count = 0;
608f9db557fcb8803859cd65803f58703179cafdbcDAN LI
618f9db557fcb8803859cd65803f58703179cafdbcDAN LI		getvmlck(&sz_before);
628f9db557fcb8803859cd65803f58703179cafdbcDAN LI
638f9db557fcb8803859cd65803f58703179cafdbcDAN LI		addr = mmap(NULL, MMAPSIZE, PROT_READ | PROT_WRITE,
648f9db557fcb8803859cd65803f58703179cafdbcDAN LI			    MAP_PRIVATE | MAP_LOCKED | MAP_ANONYMOUS,
658f9db557fcb8803859cd65803f58703179cafdbcDAN LI			    -1, 0);
668f9db557fcb8803859cd65803f58703179cafdbcDAN LI
678f9db557fcb8803859cd65803f58703179cafdbcDAN LI		if (addr == MAP_FAILED) {
688f9db557fcb8803859cd65803f58703179cafdbcDAN LI			tst_resm(TFAIL | TERRNO, "mmap of %s failed", TEMPFILE);
698f9db557fcb8803859cd65803f58703179cafdbcDAN LI			continue;
708f9db557fcb8803859cd65803f58703179cafdbcDAN LI		}
718f9db557fcb8803859cd65803f58703179cafdbcDAN LI
72e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		getvmlck(&sz_after);
738f9db557fcb8803859cd65803f58703179cafdbcDAN LI
74e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		sz_ch = sz_after - sz_before;
75e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		if (sz_ch == MMAPSIZE / 1024) {
76e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis			tst_resm(TPASS, "Functionality of mmap() "
77e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis					"successful");
788f9db557fcb8803859cd65803f58703179cafdbcDAN LI		} else {
79e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis			tst_resm(TFAIL, "Expected %luK locked, "
80e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis					"get %uK locked",
81e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis					MMAPSIZE / 1024, sz_ch);
828f9db557fcb8803859cd65803f58703179cafdbcDAN LI		}
838f9db557fcb8803859cd65803f58703179cafdbcDAN LI
848f9db557fcb8803859cd65803f58703179cafdbcDAN LI		if (munmap(addr, MMAPSIZE) != 0)
858f9db557fcb8803859cd65803f58703179cafdbcDAN LI			tst_brkm(TFAIL | TERRNO, NULL, "munmap failed");
868f9db557fcb8803859cd65803f58703179cafdbcDAN LI	}
878f9db557fcb8803859cd65803f58703179cafdbcDAN LI
888f9db557fcb8803859cd65803f58703179cafdbcDAN LI	cleanup();
898f9db557fcb8803859cd65803f58703179cafdbcDAN LI	tst_exit();
908f9db557fcb8803859cd65803f58703179cafdbcDAN LI}
918f9db557fcb8803859cd65803f58703179cafdbcDAN LI
928f9db557fcb8803859cd65803f58703179cafdbcDAN LIvoid getvmlck(unsigned int *lock_sz)
938f9db557fcb8803859cd65803f58703179cafdbcDAN LI{
948f9db557fcb8803859cd65803f58703179cafdbcDAN LI	int ret;
958f9db557fcb8803859cd65803f58703179cafdbcDAN LI	char line[LINELEN];
968f9db557fcb8803859cd65803f58703179cafdbcDAN LI	FILE *fstatus = NULL;
978f9db557fcb8803859cd65803f58703179cafdbcDAN LI
988f9db557fcb8803859cd65803f58703179cafdbcDAN LI	fstatus = fopen("/proc/self/status", "r");
998f9db557fcb8803859cd65803f58703179cafdbcDAN LI	if (fstatus == NULL)
1008f9db557fcb8803859cd65803f58703179cafdbcDAN LI		tst_brkm(TFAIL | TERRNO, NULL, "Open dev status failed");
1018f9db557fcb8803859cd65803f58703179cafdbcDAN LI
1028f9db557fcb8803859cd65803f58703179cafdbcDAN LI	while (fgets(line, LINELEN, fstatus) != NULL)
1038f9db557fcb8803859cd65803f58703179cafdbcDAN LI		if (strstr(line, "VmLck") != NULL)
1048f9db557fcb8803859cd65803f58703179cafdbcDAN LI			break;
1058f9db557fcb8803859cd65803f58703179cafdbcDAN LI
1068f9db557fcb8803859cd65803f58703179cafdbcDAN LI	ret = sscanf(line, "%*[^0-9]%d%*[^0-9]", lock_sz);
1078f9db557fcb8803859cd65803f58703179cafdbcDAN LI	if (ret != 1)
1088f9db557fcb8803859cd65803f58703179cafdbcDAN LI		tst_brkm(TFAIL | TERRNO, NULL, "Get lock size failed");
1098f9db557fcb8803859cd65803f58703179cafdbcDAN LI
1108f9db557fcb8803859cd65803f58703179cafdbcDAN LI	fclose(fstatus);
1118f9db557fcb8803859cd65803f58703179cafdbcDAN LI}
1128f9db557fcb8803859cd65803f58703179cafdbcDAN LI
1138f9db557fcb8803859cd65803f58703179cafdbcDAN LIstatic void setup(void)
1148f9db557fcb8803859cd65803f58703179cafdbcDAN LI{
115d1e794d62b1bf619df8390535e4c2a58899b1145Cyril Hrubis	tst_require_root();
1168f9db557fcb8803859cd65803f58703179cafdbcDAN LI
1178f9db557fcb8803859cd65803f58703179cafdbcDAN LI	tst_sig(FORK, DEF_HANDLER, cleanup);
1188f9db557fcb8803859cd65803f58703179cafdbcDAN LI
1198f9db557fcb8803859cd65803f58703179cafdbcDAN LI	TEST_PAUSE;
1208f9db557fcb8803859cd65803f58703179cafdbcDAN LI}
1218f9db557fcb8803859cd65803f58703179cafdbcDAN LI
1228f9db557fcb8803859cd65803f58703179cafdbcDAN LIstatic void cleanup(void)
1238f9db557fcb8803859cd65803f58703179cafdbcDAN LI{
1248f9db557fcb8803859cd65803f58703179cafdbcDAN LI}
125