On Tue, 2009-03-24 at 19:10 +0530, Poornima Nayak wrote:
> [Patch 1/4]: Modified existing reusable functions to test cpu
> consolidation on hyper threaded system
>
> Signed-off-by: poornima nayak <[email protected]>
This applies fine, hence applied.
Regards--
Subrata
>
> diff -uprN ltp_orig/testcases/kernel/power_management/lib/sched_mc.py
> ltp_patched//testcases/kernel/power_management/lib/sched_mc.py
> --- ltp_orig/testcases/kernel/power_management/lib/sched_mc.py
> 2009-03-24 09:25:27.000000000 -0500
> +++ ltp_patched//testcases/kernel/power_management/lib/sched_mc.py
> 2009-03-24 09:51:54.000000000 -0500
> @@ -38,6 +38,26 @@ def get_proc_data(stats_list):
> print "Could not read statistics", e
> sys.exit(1)
>
> +def is_hyper_threaded():
> + '''Return 1 is the system is hyper threaded else return 0
> + '''
> + try:
> + file_cpuinfo = open("/proc/cpuinfo", 'r')
> + for line in file_cpuinfo:
> + if line.startswith('siblings'):
> + siblings = line.split(":")
> + if line.startswith('cpu cores'):
> + cpu_cores = line.split(":")
> + break
> + if int( siblings[1] ) / int( cpu_cores[1] )> 1:
> + file_cpuinfo.close()
> + return 1
> + else:
> + return 0
> + except Exception:
> + print "Failed to check if system is hyper-threaded"
> + sys.exit(1)
> +
> def set_sched_mc_power(sched_mc_level):
> ''' Routine to set sched_mc_power_savings to required level
> '''
> @@ -49,6 +69,17 @@ def set_sched_mc_power(sched_mc_level):
> print "Could not set sched_mc_power_savings to", e
> sys.exit(1)
>
> +def set_sched_smt_power(sched_smt_level):
> + ''' Routine to set sched_smt_power_savings to required level
> + '''
> + try:
> + os.system('echo %s > \
> + /sys/devices/system/cpu/sched_smt_power_savings'
> + % sched_smt_level)
> + except OSError, e:
> + print "Could not set sched_smt_power_savings to", e
> + sys.exit(1)
> +
> def count_num_cpu():
> ''' Returns number of cpu's in system
> '''
> @@ -66,25 +97,50 @@ def count_num_cpu():
> def map_cpuid_pkgid():
> ''' Routine to map physical package id to cpu id
> '''
> - for i in range(0, cpu_count):
> + if is_hyper_threaded():
> + core_info = {}
> try:
> - phy_pkg_file = '/sys/devices/system/cpu/cpu%s' %i
> - phy_pkg_file += '/topology/physical_package_id'
> - cpu_phy_id = open(phy_pkg_file).read().rstrip()
> - try:
> - cpu_map[cpu_phy_id].append(i)
> - except KeyError:
> - cpu_map[cpu_phy_id] = [i]
> - except IOError, e:
> - print "Mapping of CPU to pkg id failed", e
> + for i in range(0, cpu_count):
> + phy_pkg_file = '/sys/devices/system/cpu/cpu%s' % i
> + phy_pkg_file += '/topology/physical_package_id'
> + core_file = '/sys/devices/system/cpu/cpu%s' % i
> + core_file += '/topology/core_id'
> + core_id = open(core_file).read().rstrip()
> + cpu_phy_id = open(phy_pkg_file).read().rstrip()
> + if not cpu_phy_id in cpu_map.keys():
> + core_info = {}
> + if not core_id in core_info.keys():
> + core_info[core_id] = [i]
> + else:
> + core_info[core_id].append(i)
> + if not cpu_phy_id in cpu_map.keys():
> + cpu_map[cpu_phy_id]= core_info
> + except Exception, details:
> + print "Package, core & cpu map table creation failed", e
> sys.exit(1)
> + else:
> + for i in range(0, cpu_count):
> + try:
> + phy_pkg_file = '/sys/devices/system/cpu/cpu%s' %i
> + phy_pkg_file += '/topology/physical_package_id'
> + cpu_phy_id = open(phy_pkg_file).read().rstrip()
> + if not cpu_phy_id in cpu_map.keys():
> + cpu_map[cpu_phy_id] = [i]
> + else:
> + cpu_map[cpu_phy_id].append(i)
> + except IOError, e:
> + print "Mapping of CPU to pkg id failed", e
> + sys.exit(1)
>
> -def trigger_workld(workload):
> +def trigger_workld(workload, test_thread_consld):
> ''' Based on value in argument passed triggers workloads.
> Triggers workload with number of threads same as number
> of cores in package.
> '''
> - threads = cpu_count / len(cpu_map)
> + if test_thread_consld != 0:
> + threads = 2
> + else:
> + threads = cpu_count / len(cpu_map)
> duration = 60 # let the test run for 1 minute
> path = '%s/utils/benchmark' % os.environ['LTPROOT']
> try:
> @@ -98,7 +154,6 @@ def trigger_workld(workload):
> wklds_avlbl.append(file_name)
> wklds_avlbl.sort()
> workload_dir = wklds_avlbl[len(wklds_avlbl)-1]
> -
> if workload_dir != "":
> new_path = os.path.join(path,"%s" % workload_dir)
> os.chdir(new_path)
> @@ -162,21 +217,34 @@ def generate_report():
> print >> reportfile
>
> #Now get the package ID information
> - print >> debugfile, "cpu_map: ", cpu_map
> - keyvalfile = open('/procstat/keyval', 'a')
> - print >> keyvalfile, "nr_packages=%d" % len(cpu_map)
> - print >> keyvalfile, "system-idle=%3.4f" % (stats_percentage['cpu'][4])
> - for pkg in sorted(cpu_map.keys()):
> - total_idle = 0
> - total = 0
> - for cpu in cpu_map[pkg]:
> - total_idle += stats_stop["cpu%d" % cpu][4]
> - for i in range(1, len(stats_stop["cpu%d" % cpu])):
> - total += stats_stop["cpu%d" % cpu][i]
> - print >> reportfile, "Package: ", pkg, "Idle %3.4f%%" \
> - % (float(total_idle)*100/total)
> - print >> keyvalfile, "package-%s=%3.4f" % \
> + try:
> + print >> debugfile, "cpu_map: ", cpu_map
> + keyvalfile = open('/procstat/keyval', 'a')
> + print >> keyvalfile, "nr_packages=%d" % len(cpu_map)
> + print >> keyvalfile, "system-idle=%3.4f" %
> (stats_percentage['cpu'][4])
> + for pkg in sorted(cpu_map.keys()):
> + if is_hyper_threaded():
> + for core in sorted(cpu_map[pkg].keys()):
> + total_idle = 0
> + total = 0
> + for cpu in cpu_map[pkg][core]:
> + total_idle += stats_stop["cpu%d" % cpu][4]
> + for i in range(1, len(stats_stop["cpu%d" % cpu])):
> + total += stats_stop["cpu%d" % cpu][i]
> + else:
> + total_idle = 0
> + total = 0
> + for cpu in cpu_map[pkg]:
> + total_idle += stats_stop["cpu%d" % cpu][4]
> + for i in range(1, len(stats_stop["cpu%d" % cpu])):
> + total += stats_stop["cpu%d" % cpu][i]
> + print >> reportfile, "Package: ", pkg, "Idle %3.4f%%" \
> + % (float(total_idle)*100/total)
> + print >> keyvalfile, "package-%s=%3.4f" % \
> (pkg, (float(total_idle)*100/total))
> + except Exception, details:
> + print "Generating reportfile failed: ", details
> + sys.exit(1)
>
> #Add record delimiter '\n' before closing these files
> print >> debugfile
> @@ -203,7 +271,7 @@ def expand_range(range_val):
>
> def is_quad_core():
> '''
> - Read /proc/cpuinfo and check is system is Quad core
> + Read /proc/cpuinfo and check if system is Quad core
> '''
> try:
> cpuinfo = open('/proc/cpuinfo', 'r')
> @@ -220,22 +288,53 @@ def is_quad_core():
> print "Failed to get cpu core information", e
> sys.exit(1)
>
> -def validate_cpugrp_map(cpu_group, sched_mc_level):
> +def validate_cpugrp_map(cpu_group, sched_mc_level, sched_smt_level):
> '''
> Verify if cpugrp belong to same package
> '''
> - for pkg in sorted(cpu_map.keys()):
> - pkg_cpus = cpu_map[pkg]
> - if pkg_cpus == cpu_group:
> - return(0)
> - else:
> - if is_quad_core() and sched_mc_level == 0:
> - return(0)
> -
> - print "INFO: cpu group does not belong to single package"
> - sys.exit(1)
> + modi_cpu_grp = cpu_group[:]
> + try:
> + if is_hyper_threaded():
> + for pkg in sorted(cpu_map.keys()):
> + # if CPU utilized is across package this condition will be
> true
> + if len(modi_cpu_grp) != len(cpu_group):
> + break
> + for core in sorted(cpu_map[pkg].keys()):
> + core_cpus = cpu_map[pkg][core]
> + if core_cpus == modi_cpu_grp:
> + return 0
> + else:
> + #if CPUs used across the cores
> + for i in range(0, len(core_cpus)):
> + if core_cpus[i] in modi_cpu_grp:
> + modi_cpu_grp.remove(core_cpus[i])
> + else:
> + # If sched_smt == 0 then its oky if threads
> run
> + # in different cores of same package
> + if sched_smt_level == 1:
> + sys.exit(1)
> + else:
> + if len(cpu_group) == 2 and \
> + len(modi_cpu_grp) < len(cpu_group):
> + print "INFO:CPUs utilized not in a
> core"
> + return 0
>
> + print "INFO: CPUs utilized is not in same package or core"
> + sys.exit(1)
> + else:
> + for pkg in sorted(cpu_map.keys()):
> + pkg_cpus = cpu_map[pkg]
> + if pkg_cpus == cpu_group:
> + return(0)
> + else:
> + if is_quad_core() and sched_mc_level == 0:
> + return(0)
> + print "INFO: CPUs utilized is not in same package"
> + sys.exit(1)
> + except Exception, details:
> + print "Exception in validate_cpugrp_map: ", details
> + sys.exit(1)
>
> -def verify_sched_domain_dmesg(sched_mc_level):
> +def verify_sched_domain_dmesg(sched_mc_level, sched_smt_level):
> '''
> Read sched domain information from dmesg.
> '''
> @@ -249,24 +348,29 @@ def verify_sched_domain_dmesg(sched_mc_l
> subgroup = groups[1].split()
> for j in range(0, len(subgroup)):
> cpu_group = expand_range(subgroup[j])
> - validate_cpugrp_map(cpu_group, sched_mc_level)
> - except OSError, e:
> - print "Reading dmesg failed", e
> + validate_cpugrp_map(cpu_group, sched_mc_level,\
> + sched_smt_level)
> + except Exception, details:
> + print "Reading dmesg failed", details
> sys.exit(1)
> return(0)
>
> -def validate_cpu_consolidation(sched_mc_level):
> - ''' Verify if cpu's on which threads execiuted belong to same
> +def validate_cpu_consolidation(sched_mc_level, sched_smt_level):
> + ''' Verify if cpu's on which threads executed belong to same
> package
> '''
> cpus_utilized = list()
> - for l in sorted(stats_percentage.keys()):
> - if stats_percentage[l][1] > 20:
> - cpu_id = stats_percentage[l][0].split("cpu")
> - if cpu_id[1] != '':
> - cpus_utilized.append(int(cpu_id[1]))
> - cpus_utilized.sort()
> - print "INFO: CPU's utilized %s" %cpus_utilized
> -
> - validate_cpugrp_map(cpus_utilized, sched_mc_level)
> + try:
> + for l in sorted(stats_percentage.keys()):
> + if stats_percentage[l][1] > 20:
> + cpu_id = stats_percentage[l][0].split("cpu")
> + if cpu_id[1] != '':
> + cpus_utilized.append(int(cpu_id[1]))
> + cpus_utilized.sort()
> + print "INFO: CPU's utilized ", cpus_utilized
> +
> + validate_cpugrp_map(cpus_utilized, sched_mc_level, sched_smt_level)
> + except Exception, details:
> + print "Exception in validate_cpu_consolidation: ", details
> + sys.exit(1)
> return(0)
>
> ------------------------------------------------------------------------------
> Apps built with the Adobe(R) Flex(R) framework and Flex Builder(TM) are
> powering Web 2.0 with engaging, cross-platform capabilities. Quickly and
> easily build your RIAs with Flex Builder, the Eclipse(TM)based development
> software that enables intelligent coding and step-through debugging.
> Download the free 60 day trial. http://p.sf.net/sfu/www-adobe-com
> _______________________________________________
> Ltp-list mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/ltp-list
------------------------------------------------------------------------------
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list