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