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