public inbox for ltp@lists.linux.it
 help / color / mirror / Atom feed
From: Poornima Nayak <mpnayak@linux.vnet.ibm.com>
To: ltp-list@lists.sourceforge.net, arun@linux.vnet.ibm.com,
	svaidy@linux.vnet.ibm.com, ego@in.ibm.com
Subject: [LTP] [Patch 4/8] Addional new reusable functions for ILB testing
Date: Fri, 28 Aug 2009 15:45:05 +0530	[thread overview]
Message-ID: <20090828101505.12177.78037.sendpatchset@localhost.localdomain> (raw)
In-Reply-To: <20090828101440.12177.32012.sendpatchset@localhost.localdomain>

Developed new functions to support ILB test execution and result verification.
Minimal changes has been done for exisitng function to support ILB
test execution.

Signed-off-by: poornima nayak <mpnayak@linux.vnet.ibm.com>

diff -uprN ltp_orig/testcases/kernel/power_management/lib/sched_mc.py ltp/testcases/kernel/power_management/lib/sched_mc.py
--- ltp_orig/testcases/kernel/power_management/lib/sched_mc.py	2009-08-28 10:54:59.000000000 +0530
+++ ltp/testcases/kernel/power_management/lib/sched_mc.py	2009-08-28 12:24:55.000000000 +0530
@@ -15,8 +15,12 @@ cpu_map = {}
 stats_start = {}
 stats_stop = {}
 stats_percentage = {}
+intr_start = []
+intr_stop = []
 cpu_count = 0
 socket_count = 0
+cpu1_max_intr = 0
+cpu2_max_intr = 0
 
 def clear_dmesg():
     '''
@@ -162,6 +166,23 @@ def get_proc_data(stats_list):
         print "Could not read statistics", e
         sys.exit(1)
 
+def get_proc_loc_count(loc_stats):
+    ''' Read /proc/stat info and store in dictionary
+    '''
+    try:
+        file_procstat = open("/proc/interrupts", 'r')
+        for line in file_procstat:
+            if line.startswith('LOC:'):
+                data = line.split()
+                for i in range(0, cpu_count):
+                    # To skip LOC
+                    loc_stats.append(data[i+1])
+        file_procstat.close()
+    except Exception, details:
+        print "Could not read interrupt statistics", details
+        sys.exit(1)
+
+
 def set_sched_mc_power(sched_mc_level):
     ''' Routine to set sched_mc_power_savings to required level
     '''
@@ -184,7 +205,23 @@ def set_sched_smt_power(sched_smt_level)
         print "Could not set sched_smt_power_savings to", sched_smt_level, e
 	sys.exit(1)
 
-def trigger_ebizzy (stress, duration, background):
+def set_timer_migration_interface(value):
+    ''' Set value of timer migration interface to a value
+        passed as argument
+    '''
+    try:
+        os.system('echo %s > \
+            /proc/sys/kernel/timer_migration 2>/dev/null' % value)
+    except OSError, e:
+        print "Could not set timer_migration to ", value, e
+        sys.exit(1)
+
+def start_cyclictest():
+    ''' Trigger cyclictest in background to increase
+        timer interrupts
+    '''
+    
+def trigger_ebizzy (stress, duration, background, pinned):
     ''' Triggers ebizzy workload for sched_mc=1
         testing
     '''
@@ -197,6 +234,9 @@ def trigger_ebizzy (stress, duration, ba
                 threads = threads / get_hyper_thread_count()
         if stress == "full":
 	    threads = cpu_count
+        if stress == "single_job":
+            threads = 1
+            duration = 180
 
         olddir = os.getcwd()
         path = '%s/utils/benchmark' % os.environ['LTPROOT']
@@ -220,7 +260,10 @@ def trigger_ebizzy (stress, duration, ba
                 if background == "yes":
                     succ = os.system('./ebizzy -t%s -s4096 -S %s >/dev/null &' % (threads, duration))
                 else:
-                    succ = os.system('./ebizzy -t%s -s4096 -S %s >/dev/null' % (threads, duration))
+                    if pinned == "yes":
+                        succ = os.system('taskset -c %s ./ebizzy -t%s -s4096 -S %s >/dev/null' % (cpu_count -1, threads, duration))
+                    else:
+                        succ = os.system('./ebizzy -t%s -s4096 -S %s >/dev/null' % (threads, duration))
          
                 if succ == 0: 
                     print "INFO: ebizzy workload triggerd"
@@ -238,7 +281,7 @@ def trigger_ebizzy (stress, duration, ba
         print "Ebizzy workload trigger failed ", details
         sys.exit(1)   
 
-def trigger_kernbench (stress, background):
+def trigger_kernbench (stress, background, pinned):
     ''' Trigger load on system like kernbench.
         Copys existing copy of LTP into as LTP2 and then builds it
         with make -j
@@ -253,6 +296,8 @@ def trigger_kernbench (stress, backgroun
                 threads = threads / get_hyper_thread_count()
         if stress == "full":
             threads = cpu_count
+        if stress == "single_job":
+            threads = 1
 
         dst_path = "/root"
         olddir = os.getcwd()      
@@ -283,27 +328,31 @@ def trigger_kernbench (stress, backgroun
         else:
             print "INFO: Linux kernel source not found. Kernbench cannot be executed"
 	    sys.exit(1)
-   
+  
         get_proc_data(stats_start)
-        os.system ( '%s/kernbench -o %s -M -H -n 1 >/dev/null 2>&1' % (benchmark_path, threads))
-        print threads
+        get_proc_loc_count(intr_start)
+        if pinned == "yes":
+            os.system ( 'taskset -c %s %s/kernbench -o %s -M -H -n 1 >/dev/null 2>&1' % (cpu_count-1, benchmark_path, threads))
+        else:
+            os.system ( '%s/kernbench -o %s -M -H -n 1 >/dev/null 2>&1' % (benchmark_path, threads))
         
         print "INFO: Workload kernbench triggerd"
         os.chdir(olddir)
         get_proc_data(stats_stop)
+        get_proc_loc_count(intr_stop)
     except Exception, details:
-        print "Workload trigger kernbench failed ", details
+        print "Workload kernbench trigger failed ", details
         sys.exit(1)
    
-def trigger_workld(workload, stress, duration, background):
+def trigger_workld(workload, stress, duration, background, pinned):
     ''' Triggers workload passed as argument. Number of threads 
         triggered is based on stress value.
     '''
     try:
         if workload == "ebizzy":
-            trigger_ebizzy (stress, duration, background)
+            trigger_ebizzy (stress, duration, background, pinned)
         if workload == "kernbench":
-            trigger_kernbench (stress, background)
+            trigger_kernbench (stress, background, pinned)
     except Exception, details:
         print "INFO: Trigger workload failed", details
         sys.exit(1)
@@ -386,6 +435,22 @@ def generate_report():
     print >> keyvalfile
     keyvalfile.close()
 
+def generate_loc_intr_report():
+    ''' Generate interrupt report of CPU's
+    '''
+    if (not os.path.exists('/procstat')):
+        os.mkdir('/procstat')
+
+    reportfile = open('/procstat/cpu-loc_interrupts', 'a')
+    print >> reportfile, "=============================================================="
+    print >> reportfile, "                Local timer interrupt stats                   "
+    print >> reportfile, "=============================================================="
+    for i in range(0, cpu_count):
+        intr_stop[i] =  int(intr_stop[i]) - int(intr_start[i])
+        print >> reportfile, "CPU%s: %s" %(i, intr_stop[i])
+    print >> reportfile
+    reportfile.close()
+
 def expand_range(range_val):
     '''
        Expand the range of value into actual numbers
@@ -462,6 +527,7 @@ def validate_cpugrp_map(cpu_group, sched
                 pkg_cpus = cpu_map[pkg]
                 if pkg_cpus == cpu_group:
                     return(0)
+                 
             return(1) 
     except Exception, details:
         print "Exception in validate_cpugrp_map: ", details
@@ -540,6 +606,53 @@ def validate_cpu_consolidation(work_ld, 
         print "Exception in validate_cpu_consolidation: ", details
         sys.exit(1)
 
+def get_cpuid_max_intr_count():
+    '''Return the cpu id's of two cpu's with highest number of intr'''
+    try:
+        highest = 0
+        second_highest = 0
+        global cpu1_max_intr, cpu2_max_intr
+        #Skipping CPU0 as it is generally high
+        for i in range(1, cpu_count):
+            if int(intr_stop[i]) > int(highest):
+                if highest != 0:
+                    second_highest = highest
+                    cpu2_max_intr = cpu1_max_intr
+                highest = int(intr_stop[i])
+                cpu1_max_intr = i
+            else:
+                if int(intr_stop[i]) > int(second_highest):
+                    second_highest = int(intr_stop[i])
+                    cpu2_max_intr = i
+        for i in range(1, cpu_count):
+            if i != cpu1_max_intr and i != cpu2_max_intr:
+                diff = second_highest - intr_stop[i]
+                ''' Threshold of difference has to be manipulated with multiple test'''
+                if diff < 10000:
+                    print "INFO: Difference in interrupt count is below threshold"
+                    return 1
+        print "INFO: Interrupt count in other CPU's low as expected"
+        return 0 
+    except Exception, details:
+        print "Exception in get_cpuid_max_intr_count: ", details
+        sys.exit(1)
+  
+def validate_ilb (sched_mc_level, sched_smt_level):
+    ''' Validate if ilb is running in same package where work load is running
+    '''
+    try:
+        status = get_cpuid_max_intr_count()
+        if status == 1:
+            return 1
+        for pkg in sorted(cpu_map.keys()):
+            if cpu1_max_intr in cpu_map[pkg] and cpu2_max_intr in cpu_map[pkg]:
+                return 0
+        print "INFO: CPUs with higher interrupt count is not in same package"
+        return 1
+    except Exception, details:
+        print "Exception in validate_ilb: ", details
+        sys.exit(1)
+    
 def reset_schedmc():
     ''' Routine to reset sched_mc_power_savings to Zero level
     '''

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

  parent reply	other threads:[~2009-08-28 10:15 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-08-28 10:14 [LTP] [Patch 1/8] New testcase to validate Ideal Load Balancer Functionality Poornima Nayak
2009-08-28 10:14 ` [LTP] [Patch 2/8] Power management master script modified to integrate ILB testcase Poornima Nayak
2009-08-30 17:36   ` Subrata Modak
2009-08-28 10:14 ` [LTP] [Patch 3/8] Patch to integrate ILB testcase to LTP Poornima Nayak
2009-08-30 17:36   ` Subrata Modak
2009-08-28 10:15 ` Poornima Nayak [this message]
2009-08-30 17:36   ` [LTP] [Patch 4/8] Addional new reusable functions for ILB testing Subrata Modak
2009-08-28 10:15 ` [LTP] [Patch 5/8] Modified library functions based on review comments Poornima Nayak
2009-08-30 17:36   ` Subrata Modak
2009-08-28 10:15 ` [LTP] [Patch 6/8] Included new function to check feature versus kernel version Poornima Nayak
2009-08-30 17:36   ` Subrata Modak
2009-08-28 10:15 ` [LTP] [Patch 7/8] Patch for cpu_consolidation to incorporate changes in reusable function Poornima Nayak
2009-08-30 17:36   ` Subrata Modak
2009-08-28 10:15 ` [LTP] [Patch 8/8]Patch to modify Readme file as new functionality testcase is integrated Poornima Nayak
2009-08-30 17:37   ` Subrata Modak
2009-08-30 17:36 ` [LTP] [Patch 1/8] New testcase to validate Ideal Load Balancer Functionality Subrata Modak

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20090828101505.12177.78037.sendpatchset@localhost.localdomain \
    --to=mpnayak@linux.vnet.ibm.com \
    --cc=arun@linux.vnet.ibm.com \
    --cc=ego@in.ibm.com \
    --cc=ltp-list@lists.sourceforge.net \
    --cc=svaidy@linux.vnet.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox