mbuf: fix performance with 128-byte cache line
[dpdk.git] / app / test / autotest_runner.py
index 50e689f..eadfb7f 100644 (file)
@@ -1,36 +1,35 @@
 #!/usr/bin/python
 
 #   BSD LICENSE
-# 
-#   Copyright(c) 2010-2013 Intel Corporation. All rights reserved.
+#
+#   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
 #   All rights reserved.
-# 
-#   Redistribution and use in source and binary forms, with or without 
-#   modification, are permitted provided that the following conditions 
+#
+#   Redistribution and use in source and binary forms, with or without
+#   modification, are permitted provided that the following conditions
 #   are met:
-# 
-#     * Redistributions of source code must retain the above copyright 
+#
+#     * Redistributions of source code must retain the above copyright
 #       notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above copyright 
-#       notice, this list of conditions and the following disclaimer in 
-#       the documentation and/or other materials provided with the 
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in
+#       the documentation and/or other materials provided with the
 #       distribution.
-#     * Neither the name of Intel Corporation nor the names of its 
-#       contributors may be used to endorse or promote products derived 
+#     * Neither the name of Intel Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
 #       from this software without specific prior written permission.
-# 
-#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
-#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
-#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
-#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
-#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
-#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
-#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
-#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
-#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
-#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+#
+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 #   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-# 
 
 # The main logic behind running autotests in parallel
 
@@ -155,7 +154,7 @@ def run_test_group(cmdline, test_group):
                        results.append(result)
 
        # regardless of whether test has crashed, try quitting it
-       try:    
+       try:
                child.sendline("quit")
                child.close()
        # if the test crashed, just do nothing instead
@@ -199,7 +198,7 @@ class AutotestRunner:
                self.logfile = open(logfile, "w")
                csvfile = open(csvfile, "w")
                self.csvwriter = csv.writer(csvfile)
-               
+
                # prepare results table
                self.csvwriter.writerow(["test_name","test_result","result_str"])
 
@@ -209,23 +208,19 @@ class AutotestRunner:
        def __get_cmdline(self, test):
                cmdline = self.cmdline
 
-               # perform additional linuxapp adjustments
-               if not "baremetal" in self.target:
-
-                       # append memory limitations for each test
-                       # otherwise tests won't run in parallel
-                       if not "i686" in self.target:
-                               cmdline += " --socket-mem=%s"% test["Memory"]
-                       else:
-                               # affinitize startup so that tests don't fail on i686
-                               cmdline = "taskset 1 " + cmdline
-                               cmdline += " -m " + str(sum(map(int,test["Memory"].split(","))))
+               # append memory limitations for each test
+               # otherwise tests won't run in parallel
+               if not "i686" in self.target:
+                       cmdline += " --socket-mem=%s"% test["Memory"]
+               else:
+                       # affinitize startup so that tests don't fail on i686
+                       cmdline = "taskset 1 " + cmdline
+                       cmdline += " -m " + str(sum(map(int,test["Memory"].split(","))))
 
-                       # set group prefix for autotest group
-                       # otherwise they won't run in parallel
-                       cmdline += " --file-prefix=%s"% test["Prefix"]
+               # set group prefix for autotest group
+               # otherwise they won't run in parallel
+               cmdline += " --file-prefix=%s"% test["Prefix"]
 
-                       return cmdline
                return cmdline
 
 
@@ -235,12 +230,12 @@ class AutotestRunner:
 
        def add_non_parallel_test_group(self,test_group):
                self.non_parallel_test_groups.append(test_group)
-               
-       
+
+
        def __process_results(self, results):
                # this iterates over individual test results
                for i, result in enumerate(results):
-               
+
                        # increase total number of tests that were run
                        # do not include "start" test
                        if i > 0:
@@ -268,10 +263,10 @@ class AutotestRunner:
                        # if test failed and it wasn't a "start" test
                        if test_result < 0 and not i == 0:
                                self.fails += 1
-               
+
                        # collect logs
                        self.log_buffers.append(log)
-               
+
                        # create report if it exists
                        if report:
                                try:
@@ -281,7 +276,7 @@ class AutotestRunner:
                                else:
                                        with f:
                                                f.write(report)
-                                               
+
                        # write test result to CSV file
                        if i != 0:
                                self.csvwriter.writerow([test_name, test_result, result_str])
@@ -304,7 +299,7 @@ class AutotestRunner:
                                # dump tests are specified in full e.g. "Dump_mempool"
                                if "_autotest" in test_id:
                                        test_id = test_id[:-len("_autotest")]
-                               
+
                                # filter out blacklisted/whitelisted tests
                                if self.blacklist and test_id in self.blacklist:
                                        test_group["Tests"].remove(test)
@@ -321,13 +316,13 @@ class AutotestRunner:
                                # put the numbers backwards so that we start
                                # deleting from the end, not from the beginning
                                groups_to_remove.insert(0, i)
-               
+
                # remove test groups that need to be removed
                for i in groups_to_remove:
                        del test_groups[i]
-               
+
                return test_groups
-               
+
 
 
        # iterate over test groups and run tests associated with them
@@ -337,17 +332,12 @@ class AutotestRunner:
                        self.__filter_groups(self.parallel_test_groups)
                self.non_parallel_test_groups = \
                        self.__filter_groups(self.non_parallel_test_groups)
-               
+
                # create a pool of worker threads
-               if not "baremetal" in self.target:
-                       pool = multiprocessing.Pool(processes=4)
-               else:
-                       # we can't be sure running baremetal tests in parallel
-                       # will work, so let's stay on the safe side
-                       pool = multiprocessing.Pool(processes=1)
-                       
+               pool = multiprocessing.Pool(processes=1)
+
                results = []
-       
+
                # whatever happens, try to save as much logs as possible
                try:
 
@@ -380,7 +370,7 @@ class AutotestRunner:
                                                continue
 
                                        res = group_result.get()
-                                       
+
                                        self.__process_results(res)
 
                                        # remove result from results list once we're done with it
@@ -389,11 +379,11 @@ class AutotestRunner:
                        # run non_parallel tests. they are run one by one, synchronously
                        for test_group in self.non_parallel_test_groups:
                                group_result = run_test_group(self.__get_cmdline(test_group), test_group)
-                                       
+
                                self.__process_results(group_result)
-               
+
                        # get total run time
-                       cur_time = time.time()          
+                       cur_time = time.time()
                        total_time = int(cur_time - self.start)
 
                        # print out summary
@@ -410,10 +400,12 @@ class AutotestRunner:
                except:
                        print "Exception occured"
                        print sys.exc_info()
+                       self.fails = 1
 
                # drop logs from all executions to a logfile
                for buf in self.log_buffers:
                        self.logfile.write(buf.replace("\r",""))
-               
+
                log_buffers = []
 
+               return self.fails