1 /*
 2  * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
 3  * Copyright (c) 2023, Red Hat Inc.
 4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 5  *
 6  * This code is free software; you can redistribute it and/or modify it
 7  * under the terms of the GNU General Public License version 2 only, as
 8  * published by the Free Software Foundation.
 9  *
10  * This code is distributed in the hope that it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13  * version 2 for more details (a copy is included in the LICENSE file that
14  * accompanied this code).
15  *
16  * You should have received a copy of the GNU General Public License version
17  * 2 along with this work; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19  *
20  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21  * or visit www.oracle.com if you need additional information or have any
22  * questions.
23  */
24 
25 /*
26  * @test
27  * @summary Test that the JVM detects the OS hugepage/THP settings correctly.
28  * @library /test/lib
29  * @requires os.family == "linux"
30  * @modules java.base/jdk.internal.misc
31  *          java.management
32  * @run driver TestHugePageDetection
33  */
34 
35 import java.util.*;
36 import jdk.test.lib.process.OutputAnalyzer;
37 import jdk.test.lib.process.ProcessTools;
38 
39 public class TestHugePageDetection {
40 
41     public static void main(String[] args) throws Exception {
42 
43         ArrayList<String> finalargs = new ArrayList<String>();
44         String[] defaultArgs = {
45             "-Xlog:pagesize", "-Xmx64M", "-XX:-CreateCoredumpOnCrash"
46         };
47         finalargs.addAll(Arrays.asList(defaultArgs));
48         finalargs.add("-version");
49 
50         ProcessBuilder pb = ProcessTools.createLimitedTestJavaProcessBuilder(
51                 new String[] {"-Xlog:pagesize", "-Xmx64M", "-version"});
52 
53         OutputAnalyzer output = new OutputAnalyzer(pb.start());
54         output.reportDiagnosticSummary();
55         output.shouldHaveExitValue(0);
56 
57         // The configuration detected by the JVM should match the OS settings
58 
59         HugePageConfiguration configurationFromOS = HugePageConfiguration.readFromOS();
60         System.out.println("Configuration read from OS: " + configurationFromOS);
61 
62         HugePageConfiguration configurationFromLog = HugePageConfiguration.readFromJVMLog(output);
63         System.out.println("Configuration read from JVM log: " + configurationFromLog);
64 
65         if (configurationFromOS.equals(configurationFromLog)) {
66             System.out.println("Okay");
67         } else {
68             throw new RuntimeException("Configurations differ");
69         }
70 
71         // If we want to run
72 
73     }
74 
75 }