--- a/src/hotspot/cpu/ppc/vm_version_ppc.cpp Wed May 15 12:30:02 2019 +0200
+++ b/src/hotspot/cpu/ppc/vm_version_ppc.cpp Thu May 16 09:21:49 2019 +0200
@@ -1,6 +1,6 @@
/*
- * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2012, 2018, SAP SE. All rights reserved.
+ * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2019 SAP SE. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -382,6 +382,50 @@
if (FLAG_IS_DEFAULT(UseUnalignedAccesses)) {
FLAG_SET_DEFAULT(UseUnalignedAccesses, true);
}
+
+ check_virtualizations();
+}
+
+void VM_Version::check_virtualizations() {
+#if defined(_AIX)
+ int rc = 0;
+ perfstat_partition_total_t pinfo;
+ rc = perfstat_partition_total(NULL, &pinfo, sizeof(perfstat_partition_total_t), 1);
+ if (rc == 1) {
+ Abstract_VM_Version::_detected_virtualization = PowerVM;
+ }
+#else
+ const char* info_file = "/proc/ppc64/lparcfg";
+ // system_type=...qemu indicates PowerKVM
+ // e.g. system_type=IBM pSeries (emulated by qemu)
+ char line[500];
+ FILE* fp = fopen(info_file, "r");
+ if (fp == NULL) {
+ return;
+ }
+ const char* system_type="system_type="; // in case this line contains qemu, it is KVM
+ const char* num_lpars="NumLpars="; // in case of non-KVM : if this line is found it is PowerVM
+ bool num_lpars_found = false;
+
+ while (fgets(line, sizeof(line), fp) != NULL) {
+ if (strncmp(line, system_type, strlen(system_type)) == 0) {
+ if (strstr(line, "qemu") != 0) {
+ Abstract_VM_Version::_detected_virtualization = PowerKVM;
+ fclose(fp);
+ return;
+ }
+ }
+ if (strncmp(line, num_lpars, strlen(num_lpars)) == 0) {
+ num_lpars_found = true;
+ }
+ }
+ if (num_lpars_found) {
+ Abstract_VM_Version::_detected_virtualization = PowerVM;
+ } else {
+ Abstract_VM_Version::_detected_virtualization = PowerFullPartitionMode;
+ }
+ fclose(fp);
+#endif
}
void VM_Version::print_platform_virtualization_info(outputStream* st) {
--- a/src/hotspot/cpu/ppc/vm_version_ppc.hpp Wed May 15 12:30:02 2019 +0200
+++ b/src/hotspot/cpu/ppc/vm_version_ppc.hpp Thu May 16 09:21:49 2019 +0200
@@ -1,6 +1,6 @@
/*
* Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2012, 2018 SAP SE. All rights reserved.
+ * Copyright (c) 2012, 2019 SAP SE. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -87,6 +87,7 @@
public:
// Initialization
static void initialize();
+ static void check_virtualizations();
// Override Abstract_VM_Version implementation
static void print_platform_virtualization_info(outputStream*);
--- a/src/hotspot/share/jfr/metadata/metadata.xml Wed May 15 12:30:02 2019 +0200
+++ b/src/hotspot/share/jfr/metadata/metadata.xml Thu May 16 09:21:49 2019 +0200
@@ -615,6 +615,10 @@
<Field type="string" name="osVersion" label="OS Version" />
</Event>
+ <Event name="VirtualizationInformation" category="Operating System" label="Virtualization Information" period="endChunk">
+ <Field type="string" name="name" label="Name" />
+ </Event>
+
<Event name="InitialSystemProperty" category="Java Virtual Machine" label="Initial System Property" description="System Property at JVM start" period="endChunk">
<Field type="string" name="key" label="Key" />
<Field type="string" name="value" label="Value" />
--- a/src/hotspot/share/jfr/periodic/jfrOSInterface.cpp Wed May 15 12:30:02 2019 +0200
+++ b/src/hotspot/share/jfr/periodic/jfrOSInterface.cpp Thu May 16 09:21:49 2019 +0200
@@ -215,6 +215,27 @@
return instance()._impl->os_version(os_version);
}
+const char* JfrOSInterface::virtualization_name() {
+ VirtualizationType vrt = VM_Version::get_detected_virtualization();
+ if (vrt == XenHVM) {
+ return "Xen hardware-assisted virtualization";
+ } else if (vrt == KVM) {
+ return "KVM virtualization";
+ } else if (vrt == VMWare) {
+ return "VMWare virtualization";
+ } else if (vrt == HyperV) {
+ return "HyperV virtualization";
+ } else if (vrt == PowerVM) {
+ return "PowerVM virtualization";
+ } else if (vrt == PowerKVM) {
+ return "Power KVM virtualization";
+ } else if (vrt == PowerFullPartitionMode) {
+ return "Power full partition";
+ }
+
+ return "No virtualization detected";
+}
+
int JfrOSInterface::generate_initial_environment_variable_events() {
if (environ == NULL) {
return OS_ERR;
--- a/src/hotspot/share/jfr/periodic/jfrOSInterface.hpp Wed May 15 12:30:02 2019 +0200
+++ b/src/hotspot/share/jfr/periodic/jfrOSInterface.hpp Thu May 16 09:21:49 2019 +0200
@@ -52,6 +52,7 @@
static int cpu_load_total_process(double* cpu_load);
static int cpu_loads_process(double* pjvmUserLoad, double* pjvmKernelLoad, double* psystemTotalLoad);
static int os_version(char** os_version);
+ static const char* virtualization_name();
static int generate_initial_environment_variable_events();
static int system_processes(SystemProcess** system_processes, int* no_of_sys_processes);
static int network_utilization(NetworkInterface** network_interfaces);
--- a/src/hotspot/share/jfr/periodic/jfrPeriodic.cpp Wed May 15 12:30:02 2019 +0200
+++ b/src/hotspot/share/jfr/periodic/jfrPeriodic.cpp Thu May 16 09:21:49 2019 +0200
@@ -95,6 +95,12 @@
event.commit();
}
+TRACE_REQUEST_FUNC(VirtualizationInformation) {
+ EventVirtualizationInformation event;
+ event.set_name(JfrOSInterface::virtualization_name());
+ event.commit();
+}
+
TRACE_REQUEST_FUNC(ModuleRequire) {
JfrModuleEvent::generate_module_dependency_events();
}
--- a/src/hotspot/share/runtime/vm_version.hpp Wed May 15 12:30:02 2019 +0200
+++ b/src/hotspot/share/runtime/vm_version.hpp Thu May 16 09:21:49 2019 +0200
@@ -34,7 +34,10 @@
XenHVM,
KVM,
VMWare,
- HyperV
+ HyperV,
+ PowerVM, // on AIX or Linux ppc64(le)
+ PowerFullPartitionMode, // on Linux ppc64(le)
+ PowerKVM
} VirtualizationType;
// VM_Version provides information about the VM.
--- a/src/jdk.jfr/share/conf/jfr/default.jfc Wed May 15 12:30:02 2019 +0200
+++ b/src/jdk.jfr/share/conf/jfr/default.jfc Thu May 16 09:21:49 2019 +0200
@@ -513,6 +513,11 @@
<setting name="period">beginChunk</setting>
</event>
+ <event name="jdk.VirtualizationInformation">
+ <setting name="enabled">true</setting>
+ <setting name="period">beginChunk</setting>
+ </event>
+
<event name="jdk.CPUInformation">
<setting name="enabled">true</setting>
<setting name="period">beginChunk</setting>
--- a/src/jdk.jfr/share/conf/jfr/profile.jfc Wed May 15 12:30:02 2019 +0200
+++ b/src/jdk.jfr/share/conf/jfr/profile.jfc Thu May 16 09:21:49 2019 +0200
@@ -513,6 +513,11 @@
<setting name="period">beginChunk</setting>
</event>
+ <event name="jdk.VirtualizationInformation">
+ <setting name="enabled">true</setting>
+ <setting name="period">beginChunk</setting>
+ </event>
+
<event name="jdk.CPUInformation">
<setting name="enabled">true</setting>
<setting name="period">beginChunk</setting>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/jdk/jfr/event/os/TestVirtualizationInfo.java Thu May 16 09:21:49 2019 +0200
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2013, 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jdk.jfr.event.os;
+
+import java.util.List;
+
+import jdk.jfr.Recording;
+import jdk.jfr.consumer.RecordedEvent;
+import jdk.test.lib.jfr.EventNames;
+import jdk.test.lib.jfr.Events;
+
+/**
+ * @test
+ * @key jfr
+ * @requires vm.hasJFR
+ * @library /test/lib
+ * @run main/othervm jdk.jfr.event.os.TestVirtualizationInfo
+ */
+public class TestVirtualizationInfo {
+ private final static String EVENT_NAME = EventNames.VirtualizationInformation;
+
+ public static void main(String[] args) throws Throwable {
+ Recording recording = new Recording();
+ recording.enable(EVENT_NAME);
+ recording.start();
+ recording.stop();
+ List<RecordedEvent> events = Events.fromRecording(recording);
+ Events.hasEvents(events);
+ for (RecordedEvent event : events) {
+ System.out.println("Event: " + event);
+ Events.assertField(event, "name").notEmpty();
+ }
+ }
+}
--- a/test/lib/jdk/test/lib/jfr/EventNames.java Wed May 15 12:30:02 2019 +0200
+++ b/test/lib/jdk/test/lib/jfr/EventNames.java Thu May 16 09:21:49 2019 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -154,6 +154,7 @@
// OS
public final static String OSInformation = PREFIX + "OSInformation";
+ public final static String VirtualizationInformation = PREFIX + "VirtualizationInformation";
public final static String CPUInformation = PREFIX + "CPUInformation";
public final static String CPULoad = PREFIX + "CPULoad";
public final static String ThreadCPULoad = PREFIX + "ThreadCPULoad";