summaryrefslogtreecommitdiff
path: root/SConstruct
diff options
context:
space:
mode:
authorAndreas Sandberg <andreas@sandberg.pp.se>2013-10-15 10:09:23 +0200
committerAndreas Sandberg <andreas@sandberg.pp.se>2013-10-15 10:09:23 +0200
commit4b8be6a90b39ef195313af2029cde2c0ca564a53 (patch)
treefaaeb4b7127734ecff67d716c0d655efc4b6a873 /SConstruct
parentd4f205ea2ff2800b253d4681afaa6af330bfa33b (diff)
downloadgem5-4b8be6a90b39ef195313af2029cde2c0ca564a53.tar.xz
kvm: Set the perf exclude_host attribute if available
The performance counting framework in Linux 3.2 and onwards supports an attribute to exclude events generated by the host when running KVM. Setting this attribute allows us to get more reliable measurements of the guest machine. For example, on a highly loaded system, the instruction counts from the guest can be severely distorted by the host kernel (e.g., by page fault handlers). This changeset introduces a check for the attribute and enables it in the KVM CPU if present.
Diffstat (limited to 'SConstruct')
-rwxr-xr-xSConstruct41
1 files changed, 39 insertions, 2 deletions
diff --git a/SConstruct b/SConstruct
index 5b57c1ce6..cdd44a871 100755
--- a/SConstruct
+++ b/SConstruct
@@ -794,12 +794,35 @@ def CheckLeading(context):
context.Result(ret)
return ret
+# Add a custom Check function to test for structure members.
+def CheckMember(context, include, decl, member, include_quotes="<>"):
+ context.Message("Checking for member %s in %s..." %
+ (member, decl))
+ text = """
+#include %(header)s
+int main(){
+ %(decl)s test;
+ (void)test.%(member)s;
+ return 0;
+};
+""" % { "header" : include_quotes[0] + include + include_quotes[1],
+ "decl" : decl,
+ "member" : member,
+ }
+
+ ret = context.TryCompile(text, extension=".cc")
+ context.Result(ret)
+ return ret
+
# Platform-specific configuration. Note again that we assume that all
# builds under a given build root run on the same host platform.
conf = Configure(main,
conf_dir = joinpath(build_root, '.scons_config'),
log_file = joinpath(build_root, 'scons_config.log'),
- custom_tests = { 'CheckLeading' : CheckLeading })
+ custom_tests = {
+ 'CheckLeading' : CheckLeading,
+ 'CheckMember' : CheckMember,
+ })
# Check for leading underscores. Don't really need to worry either
# way so don't need to check the return code.
@@ -964,6 +987,12 @@ def is_isa_kvm_compatible(isa):
return host_isa in isa_comp_table.get(isa, [])
+# Check if the exclude_host attribute is available. We want this to
+# get accurate instruction counts in KVM.
+main['HAVE_PERF_ATTR_EXCLUDE_HOST'] = conf.CheckMember(
+ 'linux/perf_event.h', 'struct perf_event_attr', 'exclude_host')
+
+
######################################################################
#
# Finish the configuration
@@ -1065,7 +1094,8 @@ sticky_vars.AddVariables(
# These variables get exported to #defines in config/*.hh (see src/SConscript).
export_vars += ['USE_FENV', 'SS_COMPATIBLE_FP', 'TARGET_ISA', 'CP_ANNOTATE',
- 'USE_POSIX_CLOCK', 'PROTOCOL', 'HAVE_PROTOBUF']
+ 'USE_POSIX_CLOCK', 'PROTOCOL', 'HAVE_PROTOBUF',
+ 'HAVE_PERF_ATTR_EXCLUDE_HOST']
###################################################
#
@@ -1243,6 +1273,13 @@ for variant_path in variant_paths:
"target ISA combination"
env['USE_KVM'] = False
+ # Warn about missing optional functionality
+ if env['USE_KVM']:
+ if not main['HAVE_PERF_ATTR_EXCLUDE_HOST']:
+ print "Warning: perf_event headers lack support for the " \
+ "exclude_host attribute. KVM instruction counts will " \
+ "be inaccurate."
+
# Save sticky variable settings back to current variables file
sticky_vars.Save(current_vars_file, env)