[pypy-commit] pypy release-5.x: (s390x) parsing of /proc/cpuinfo is now more robust,

plan_rich pypy.commits at gmail.com
Thu May 12 12:02:57 EDT 2016


Author: Richard Plangger <planrichi at gmail.com>
Branch: release-5.x
Changeset: r84407:951eeca3bc24
Date: 2016-05-12 17:13 +0200
http://bitbucket.org/pypy/pypy/changeset/951eeca3bc24/

Log:	(s390x) parsing of /proc/cpuinfo is now more robust, fixed issue
	that followed with the last commit for s390x in the allocator

diff --git a/rpython/jit/backend/zarch/regalloc.py b/rpython/jit/backend/zarch/regalloc.py
--- a/rpython/jit/backend/zarch/regalloc.py
+++ b/rpython/jit/backend/zarch/regalloc.py
@@ -326,6 +326,7 @@
                     # old even var is not forbidden, sync it and be done with it
                     self._sync_var(old_even_var)
                     del self.reg_bindings[old_even_var]
+                    del reverse_mapping[odd]
             if old_odd_var:
                 if old_odd_var in forbidden_vars:
                     self._relocate_forbidden_variable(odd, old_odd_var, reverse_mapping,
@@ -333,6 +334,7 @@
                 else:
                     self._sync_var(old_odd_var)
                     del self.reg_bindings[old_odd_var]
+                    del reverse_mapping[odd]
 
             self.reg_bindings[even_var] = even
             self.reg_bindings[odd_var] = odd
@@ -359,11 +361,11 @@
                 if candidate_var is not None:
                     self._sync_var(candidate_var)
                     del self.reg_bindings[candidate_var]
+                    del reverse_mapping[candidate]
                 self.assembler.regalloc_mov(reg, candidate)
                 assert var is not None
                 self.reg_bindings[var] = candidate
                 reverse_mapping[candidate] = var
-                self.free_regs.append(reg)
                 break
         else:
             raise NoVariableToSpill
diff --git a/rpython/memory/gc/env.py b/rpython/memory/gc/env.py
--- a/rpython/memory/gc/env.py
+++ b/rpython/memory/gc/env.py
@@ -210,7 +210,7 @@
             "Warning: cannot find your CPU L2 cache size in /proc/cpuinfo")
         return -1
 
-def get_L2cache_linux2_cpuinfo_s390x(filename="/proc/cpuinfo", label='cache3'):
+def get_L2cache_linux2_cpuinfo_s390x(filename="/proc/cpuinfo", label='cache2'):
     debug_start("gc-hardware")
     L2cache = sys.maxint
     try:
@@ -230,32 +230,21 @@
         data = ''.join(data)
         linepos = 0
         while True:
+            print linepos
             start = _findend(data, '\n' + label, linepos)
             if start < 0:
                 break    # done
-            linepos = _findend(data, '\n', start)
-            if linepos < 0:
-                break    # no end-of-line??
-            # *** data[start:linepos] == "   : level=2 type=Instruction scope=Private size=2048K ..."
-            start = _skipspace(data, start)
-            if data[start] != ':':
+            start = _findend(data, 'size=', start)
+            if start < 0:
+                break
+            end = _findend(data, ' ', start) - 1
+            if end < 0:
+                break
+            linepos = end
+            size = data[start:end]
+            if size[len(size)-1] not in ('K', 'k'):    # assume kilobytes for now
                 continue
-            # *** data[start:linepos] == ": level=2 type=Instruction scope=Private size=2048K ..."
-            start = _skipspace(data, start + 1)
-            # *** data[start:linepos] == "level=2 type=Instruction scope=Private size=2048K ..."
-            start += 44
-            end = start
-            while '0' <= data[end] <= '9':
-                end += 1
-            # *** data[start:end] == "2048"
-            if start == end:
-                continue
-            number = int(data[start:end])
-            # *** data[end:linepos] == " KB\n"
-            end = _skipspace(data, end)
-            if data[end] not in ('K', 'k'):    # assume kilobytes for now
-                continue
-            number = number * 1024
+            number = int(size[:len(size)-1])* 1024
             # for now we look for the smallest of the L2 caches of the CPUs
             if number < L2cache:
                 L2cache = number
diff --git a/rpython/memory/gc/test/test_env.py b/rpython/memory/gc/test/test_env.py
--- a/rpython/memory/gc/test/test_env.py
+++ b/rpython/memory/gc/test/test_env.py
@@ -162,21 +162,31 @@
     result = env.get_L2cache_linux2_cpuinfo(str(filepath))
     assert result == 3072 * 1024
 
-def test_estimate_best_nursery_size_linux2_s390x():
+def test_estimate_nursery_s390x():
     filepath = udir.join('estimate_best_nursery_size_linux2')
     filepath.write("""\
 vendor_id       : IBM/S390
 # processors    : 2
 bogomips per cpu: 20325.00
-features        : esan3 zarch stfle msa ldisp eimm dfp etf3eh highgprs 
-cache0          : level=1 type=Data scope=Private size=128K line_size=256 associativity=8
-cache1          : level=1 type=Instruction scope=Private size=96K line_size=256 associativity=6
+...
 cache2          : level=2 type=Data scope=Private size=2048K line_size=256 associativity=8
 cache3          : level=2 type=Instruction scope=Private size=2048K line_size=256 associativity=8
-cache4          : level=3 type=Unified scope=Shared size=65536K line_size=256 associativity=16
-cache5          : level=4 type=Unified scope=Shared size=491520K line_size=256 associativity=30
-processor 0: version = FF,  identification = 026A77,  machine = 2964
-processor 1: version = FF,  identification = 026A77,  machine = 2964
+...
 """)
     result = env.get_L2cache_linux2_cpuinfo_s390x(str(filepath))
     assert result == 2048 * 1024
+
+    filepath = udir.join('estimate_best_nursery_size_linux3')
+    filepath.write("""\
+vendor_id       : IBM/S390
+# processors    : 2
+bogomips per cpu: 9398.00
+...
+cache2          : level=2 type=Unified scope=Private size=1536K line_size=256 associativity=12
+cache3          : level=3 type=Unified scope=Shared size=24576K line_size=256 associativity=12
+...
+""")
+    result = env.get_L2cache_linux2_cpuinfo_s390x(str(filepath), label='cache3')
+    assert result == 24576 * 1024
+    result = env.get_L2cache_linux2_cpuinfo_s390x(str(filepath), label='cache2')
+    assert result == 1536 * 1024


More information about the pypy-commit mailing list