xref: /aosp_15_r20/external/ltp/lib/tst_hugepage.c (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
1*49cdfc7eSAndroid Build Coastguard Worker // SPDX-License-Identifier: GPL-2.0-or-later
2*49cdfc7eSAndroid Build Coastguard Worker /*
3*49cdfc7eSAndroid Build Coastguard Worker  * Copyright (c) 2019 Red Hat, Inc.
4*49cdfc7eSAndroid Build Coastguard Worker  */
5*49cdfc7eSAndroid Build Coastguard Worker 
6*49cdfc7eSAndroid Build Coastguard Worker #define TST_NO_DEFAULT_MAIN
7*49cdfc7eSAndroid Build Coastguard Worker 
8*49cdfc7eSAndroid Build Coastguard Worker #include "tst_test.h"
9*49cdfc7eSAndroid Build Coastguard Worker #include "tst_hugepage.h"
10*49cdfc7eSAndroid Build Coastguard Worker 
11*49cdfc7eSAndroid Build Coastguard Worker unsigned long tst_hugepages;
12*49cdfc7eSAndroid Build Coastguard Worker char *nr_opt;
13*49cdfc7eSAndroid Build Coastguard Worker char *Hopt;
14*49cdfc7eSAndroid Build Coastguard Worker 
tst_get_hugepage_size(void)15*49cdfc7eSAndroid Build Coastguard Worker size_t tst_get_hugepage_size(void)
16*49cdfc7eSAndroid Build Coastguard Worker {
17*49cdfc7eSAndroid Build Coastguard Worker 	if (access(PATH_HUGEPAGES, F_OK))
18*49cdfc7eSAndroid Build Coastguard Worker 		return 0;
19*49cdfc7eSAndroid Build Coastguard Worker 
20*49cdfc7eSAndroid Build Coastguard Worker 	return SAFE_READ_MEMINFO("Hugepagesize:") * 1024;
21*49cdfc7eSAndroid Build Coastguard Worker }
22*49cdfc7eSAndroid Build Coastguard Worker 
tst_reserve_hugepages(struct tst_hugepage * hp)23*49cdfc7eSAndroid Build Coastguard Worker unsigned long tst_reserve_hugepages(struct tst_hugepage *hp)
24*49cdfc7eSAndroid Build Coastguard Worker {
25*49cdfc7eSAndroid Build Coastguard Worker 	unsigned long val, max_hpages;
26*49cdfc7eSAndroid Build Coastguard Worker 	struct tst_path_val pvl = {
27*49cdfc7eSAndroid Build Coastguard Worker 		.path = PATH_NR_HPAGES,
28*49cdfc7eSAndroid Build Coastguard Worker 		.val = NULL,
29*49cdfc7eSAndroid Build Coastguard Worker 		.flags = TST_SR_SKIP_MISSING | TST_SR_TCONF_RO
30*49cdfc7eSAndroid Build Coastguard Worker 	};
31*49cdfc7eSAndroid Build Coastguard Worker 
32*49cdfc7eSAndroid Build Coastguard Worker 	if (access(PATH_HUGEPAGES, F_OK)) {
33*49cdfc7eSAndroid Build Coastguard Worker 		if (hp->policy == TST_NEEDS)
34*49cdfc7eSAndroid Build Coastguard Worker 			tst_brk(TCONF, "hugetlbfs is not supported");
35*49cdfc7eSAndroid Build Coastguard Worker 		tst_hugepages = 0;
36*49cdfc7eSAndroid Build Coastguard Worker 		goto out;
37*49cdfc7eSAndroid Build Coastguard Worker 	}
38*49cdfc7eSAndroid Build Coastguard Worker 
39*49cdfc7eSAndroid Build Coastguard Worker 	if (nr_opt)
40*49cdfc7eSAndroid Build Coastguard Worker 		tst_hugepages = SAFE_STRTOL(nr_opt, 1, LONG_MAX);
41*49cdfc7eSAndroid Build Coastguard Worker 	else
42*49cdfc7eSAndroid Build Coastguard Worker 		tst_hugepages = hp->number;
43*49cdfc7eSAndroid Build Coastguard Worker 
44*49cdfc7eSAndroid Build Coastguard Worker 	if (hp->number == TST_NO_HUGEPAGES) {
45*49cdfc7eSAndroid Build Coastguard Worker 		tst_hugepages = 0;
46*49cdfc7eSAndroid Build Coastguard Worker 		goto set_hugepages;
47*49cdfc7eSAndroid Build Coastguard Worker 	}
48*49cdfc7eSAndroid Build Coastguard Worker 
49*49cdfc7eSAndroid Build Coastguard Worker 	SAFE_FILE_PRINTF("/proc/sys/vm/drop_caches", "3");
50*49cdfc7eSAndroid Build Coastguard Worker 	SAFE_FILE_PRINTF("/proc/sys/vm/compact_memory", "1");
51*49cdfc7eSAndroid Build Coastguard Worker 	if (hp->policy == TST_NEEDS) {
52*49cdfc7eSAndroid Build Coastguard Worker 		tst_hugepages += SAFE_READ_MEMINFO("HugePages_Total:");
53*49cdfc7eSAndroid Build Coastguard Worker 		goto set_hugepages;
54*49cdfc7eSAndroid Build Coastguard Worker 	}
55*49cdfc7eSAndroid Build Coastguard Worker 
56*49cdfc7eSAndroid Build Coastguard Worker 	max_hpages = SAFE_READ_MEMINFO("MemFree:") / SAFE_READ_MEMINFO("Hugepagesize:");
57*49cdfc7eSAndroid Build Coastguard Worker 	if (tst_hugepages > max_hpages) {
58*49cdfc7eSAndroid Build Coastguard Worker 		tst_res(TINFO, "Requested number(%lu) of hugepages is too large, "
59*49cdfc7eSAndroid Build Coastguard Worker 				"limiting to 80%% of the max hugepage count %lu",
60*49cdfc7eSAndroid Build Coastguard Worker 				tst_hugepages, max_hpages);
61*49cdfc7eSAndroid Build Coastguard Worker 		tst_hugepages = max_hpages * 0.8;
62*49cdfc7eSAndroid Build Coastguard Worker 
63*49cdfc7eSAndroid Build Coastguard Worker 		if (tst_hugepages < 1)
64*49cdfc7eSAndroid Build Coastguard Worker 			goto out;
65*49cdfc7eSAndroid Build Coastguard Worker 	}
66*49cdfc7eSAndroid Build Coastguard Worker 
67*49cdfc7eSAndroid Build Coastguard Worker set_hugepages:
68*49cdfc7eSAndroid Build Coastguard Worker 	tst_sys_conf_save(&pvl);
69*49cdfc7eSAndroid Build Coastguard Worker 	SAFE_FILE_PRINTF(PATH_NR_HPAGES, "%lu", tst_hugepages);
70*49cdfc7eSAndroid Build Coastguard Worker 	SAFE_FILE_SCANF(PATH_NR_HPAGES, "%lu", &val);
71*49cdfc7eSAndroid Build Coastguard Worker 	if (val != tst_hugepages)
72*49cdfc7eSAndroid Build Coastguard Worker 		tst_brk(TCONF, "nr_hugepages = %lu, but expect %lu. "
73*49cdfc7eSAndroid Build Coastguard Worker 				"Not enough hugepages for testing.",
74*49cdfc7eSAndroid Build Coastguard Worker 				val, tst_hugepages);
75*49cdfc7eSAndroid Build Coastguard Worker 
76*49cdfc7eSAndroid Build Coastguard Worker 	if (hp->policy == TST_NEEDS) {
77*49cdfc7eSAndroid Build Coastguard Worker 		unsigned long free_hpages = SAFE_READ_MEMINFO("HugePages_Free:");
78*49cdfc7eSAndroid Build Coastguard Worker 		if (hp->number > free_hpages)
79*49cdfc7eSAndroid Build Coastguard Worker 			tst_brk(TCONF, "free_hpages = %lu, but expect %lu. "
80*49cdfc7eSAndroid Build Coastguard Worker 				"Not enough hugepages for testing.",
81*49cdfc7eSAndroid Build Coastguard Worker 				free_hpages, hp->number);
82*49cdfc7eSAndroid Build Coastguard Worker 	}
83*49cdfc7eSAndroid Build Coastguard Worker 
84*49cdfc7eSAndroid Build Coastguard Worker 	tst_res(TINFO, "%lu hugepage(s) reserved", tst_hugepages);
85*49cdfc7eSAndroid Build Coastguard Worker out:
86*49cdfc7eSAndroid Build Coastguard Worker 	return tst_hugepages;
87*49cdfc7eSAndroid Build Coastguard Worker }
88