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