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

Reply via email to