17811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang/* 215756239e687146c5052c724352a1d16201d0927Li Wang * Copyright (c) Linux Test Project, 2014-2017 37811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang * 415756239e687146c5052c724352a1d16201d0927Li Wang * This program is free software; you can redistribute it and/or modify 515756239e687146c5052c724352a1d16201d0927Li Wang * it under the terms of the GNU General Public License as published by 615756239e687146c5052c724352a1d16201d0927Li Wang * the Free Software Foundation; either version 2 of the License, or 715756239e687146c5052c724352a1d16201d0927Li Wang * (at your option) any later version. 87811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang * 915756239e687146c5052c724352a1d16201d0927Li Wang * This program is distributed in the hope that it will be useful, 1015756239e687146c5052c724352a1d16201d0927Li Wang * but WITHOUT ANY WARRANTY; without even the implied warranty of 1115756239e687146c5052c724352a1d16201d0927Li Wang * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 1215756239e687146c5052c724352a1d16201d0927Li Wang * the GNU General Public License for more details. 137811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang */ 147811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang 157811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang/* 167811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang * DESCRIPTION 177811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang * hugeshmat04 - test for hugepage leak inspection. 187811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang * 197811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang * It is a regression test for shared hugepage leak, when over 1GB 207811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang * shered memory was alocated in hugepage, the hugepage is not released 217811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang * though process finished. 227811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang * 237811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang * You need more than 2GB memory in test job 247811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang * 257811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang * HISTORY 267811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang * 05/2014 - Written by Fujistu Corp. 277811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang * 12/2014 - Port to LTP by Li Wang. 287811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang * 297811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang * RESTRICTIONS 307811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang * test must be run at root 317811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang */ 327811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang 33926c65df4888a748f44aac23fef3ac0e0eaeb827Li Wang#include "hugetlb.h" 347811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang 357811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang#define SIZE (1024 * 1024 * 1024) 367811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang#define BOUNDARY (1024 * 1024 * 1024) 377811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang 387811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wangstatic long huge_free; 397811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wangstatic long huge_free2; 407811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wangstatic long hugepages; 419c1c25d153a9a853a76889749187b3fc39989376Li Wangstatic long orig_shmmax, new_shmmax; 427811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang 437811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wangstatic void shared_hugepage(void); 447811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang 4515756239e687146c5052c724352a1d16201d0927Li Wangstatic void test_hugeshmat(unsigned int i LTP_ATTRIBUTE_UNUSED) 467811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang{ 4715756239e687146c5052c724352a1d16201d0927Li Wang huge_free = SAFE_READ_MEMINFO("HugePages_Free:"); 4815756239e687146c5052c724352a1d16201d0927Li Wang shared_hugepage(); 4915756239e687146c5052c724352a1d16201d0927Li Wang huge_free2 = SAFE_READ_MEMINFO("HugePages_Free:"); 5015756239e687146c5052c724352a1d16201d0927Li Wang 5115756239e687146c5052c724352a1d16201d0927Li Wang if (huge_free2 != huge_free) 5215756239e687146c5052c724352a1d16201d0927Li Wang tst_brk(TFAIL, "Test failed. Hugepage leak inspection."); 5315756239e687146c5052c724352a1d16201d0927Li Wang else 5415756239e687146c5052c724352a1d16201d0927Li Wang tst_res(TPASS, "No regression found."); 557811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang} 567811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang 5715756239e687146c5052c724352a1d16201d0927Li Wangstatic void shared_hugepage(void) 587811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang{ 597811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang pid_t pid; 607811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang int status, shmid; 617811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang size_t size = (size_t)SIZE; 627811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang void *buf; 637811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang 647811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang shmid = shmget(IPC_PRIVATE, size, SHM_HUGETLB | IPC_CREAT | 0777); 657811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang if (shmid < 0) 6615756239e687146c5052c724352a1d16201d0927Li Wang tst_brk(TBROK | TERRNO, "shmget"); 677811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang 687811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang buf = shmat(shmid, (void *)BOUNDARY, SHM_RND | 0777); 697811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang if (buf == (void *)-1) { 707811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang shmctl(shmid, IPC_RMID, NULL); 7115756239e687146c5052c724352a1d16201d0927Li Wang tst_brk(TBROK | TERRNO, "shmat"); 727811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang } 737811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang 747811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang memset(buf, 2, size); 7515756239e687146c5052c724352a1d16201d0927Li Wang pid = SAFE_FORK(); 767811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang if (pid == 0) 777811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang exit(1); 787811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang 797811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang wait(&status); 807811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang shmdt(buf); 817811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang shmctl(shmid, IPC_RMID, NULL); 827811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang} 837811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang 8415756239e687146c5052c724352a1d16201d0927Li Wangstatic void setup(void) 857811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang{ 86a5489f1bc843b7bda74fca10fad2f8714b5fb090Li Wang long mem_total, hpage_size, orig_hugepages; 877811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang 88a5489f1bc843b7bda74fca10fad2f8714b5fb090Li Wang orig_hugepages = save_nr_hugepages(); 8915756239e687146c5052c724352a1d16201d0927Li Wang mem_total = SAFE_READ_MEMINFO("MemTotal:"); 9015756239e687146c5052c724352a1d16201d0927Li Wang SAFE_FILE_SCANF(PATH_SHMMAX, "%ld", &orig_shmmax); 9115756239e687146c5052c724352a1d16201d0927Li Wang SAFE_FILE_PRINTF(PATH_SHMMAX, "%ld", (long)SIZE); 9215756239e687146c5052c724352a1d16201d0927Li Wang SAFE_FILE_SCANF(PATH_SHMMAX, "%ld", &new_shmmax); 939c1c25d153a9a853a76889749187b3fc39989376Li Wang 949c1c25d153a9a853a76889749187b3fc39989376Li Wang if (mem_total < 2L*1024*1024) 9515756239e687146c5052c724352a1d16201d0927Li Wang tst_brk(TCONF, "Needed > 2GB RAM, have: %ld", mem_total); 969c1c25d153a9a853a76889749187b3fc39989376Li Wang 979c1c25d153a9a853a76889749187b3fc39989376Li Wang if (new_shmmax < SIZE) 9815756239e687146c5052c724352a1d16201d0927Li Wang tst_brk(TCONF, "shmmax too low, have: %ld", new_shmmax); 997811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang 10015756239e687146c5052c724352a1d16201d0927Li Wang hpage_size = SAFE_READ_MEMINFO("Hugepagesize:") * 1024; 1017811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang 1027811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang hugepages = (orig_hugepages * hpage_size + SIZE) / hpage_size; 1037811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang set_sys_tune("nr_hugepages", hugepages, 1); 1047811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang} 1057811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang 10615756239e687146c5052c724352a1d16201d0927Li Wangstatic void cleanup(void) 1077811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang{ 108a5489f1bc843b7bda74fca10fad2f8714b5fb090Li Wang restore_nr_hugepages(); 10915756239e687146c5052c724352a1d16201d0927Li Wang SAFE_FILE_PRINTF(PATH_SHMMAX, "%ld", orig_shmmax); 1107811536846bb2a8105689e4e1ee9ebccf0e47b58Li Wang} 11115756239e687146c5052c724352a1d16201d0927Li Wang 11215756239e687146c5052c724352a1d16201d0927Li Wangstatic struct tst_test test = { 11315756239e687146c5052c724352a1d16201d0927Li Wang .needs_root = 1, 11415756239e687146c5052c724352a1d16201d0927Li Wang .forks_child = 1, 11515756239e687146c5052c724352a1d16201d0927Li Wang .needs_tmpdir = 1, 11615756239e687146c5052c724352a1d16201d0927Li Wang .tcnt = 3, 11715756239e687146c5052c724352a1d16201d0927Li Wang .test = test_hugeshmat, 11815756239e687146c5052c724352a1d16201d0927Li Wang .setup = setup, 11915756239e687146c5052c724352a1d16201d0927Li Wang .cleanup = cleanup, 12015756239e687146c5052c724352a1d16201d0927Li Wang}; 121