| import os, subprocess, re, commands, logging |
| from autotest_lib.client.bin import utils, test |
| from autotest_lib.client.common_lib import error |
| |
| class memory_api(test.test): |
| version = 1 |
| |
| def setup(self): |
| os.mkdir(self.tmpdir) |
| utils.system("%s %s -o %s" % |
| (utils.get_cc(), |
| os.path.join(self.bindir, "memory_api.c"), |
| os.path.join(self.tmpdir, "memory_api"))) |
| utils.system("%s %s -o %s" % |
| (utils.get_cc(), |
| os.path.join(self.bindir, "mremaps.c"), |
| os.path.join(self.tmpdir, "mremaps"))) |
| |
| |
| def initialize(self): |
| self.job.require_gcc() |
| |
| |
| def run_once(self, memsize = "1000000000", args=''): |
| |
| vma_re = re.compile("([0-9,a-f]+)-([0-9,a-f]+)") |
| memory_re = re.compile("(\d+) bytes @(0x[0-9,a-f]+)") |
| |
| vma_max_shift = 0 |
| if os.access("/proc/sys/vm/vma_max_shift", os.R_OK): |
| vma_max_shift = int( |
| open("/proc/sys/vm/vma_max_shift").read().rstrip()) |
| p1 = subprocess.Popen('%s/memory_api ' % self.tmpdir + memsize, |
| shell=True, stdin=subprocess.PIPE, |
| stdout=subprocess.PIPE) |
| while p1.poll() is None: |
| output = p1.stdout.readline().rstrip() |
| m = memory_re.search(output) |
| mem_start = 0 |
| mem_len = 0 |
| if m: |
| mem_start = int(m.group(2), 16) |
| mem_len = int(m.group(1)) |
| else: |
| continue |
| map_output = open("/proc/%s/maps_backing" % p1.pid).readlines() |
| vma_count = 0 |
| vma_start = 0 |
| vma_len = 0 |
| expected_vma_count = 1 |
| for line in map_output: |
| m = vma_re.search(line) |
| if m: |
| vma_start = int("0x%s" % m.group(1),16) |
| vma_end = int("0x%s" % m.group(2),16) |
| if ((vma_start >= mem_start) and |
| (vma_start < (mem_start + mem_len))): |
| vma_count+=1 |
| |
| if (('file' not in output) and (vma_max_shift != 0)): |
| expected_vma_count = mem_len >> vma_max_shift |
| if (mem_len % (1 << vma_max_shift)): |
| expected_vma_count += 1 |
| if expected_vma_count != vma_count: |
| raise error.TestFail("VmaCountMismatch") |
| logging.info("%s %s %d %d", hex(mem_start), hex(mem_len), vma_count, |
| expected_vma_count) |
| if p1.poll() is None: |
| p1.stdin.write("\n") |
| p1.stdin.flush() |
| |
| if p1.poll() != 0: |
| raise error.TestFail("Unexpected application abort") |
| |
| utils.system('%s/mremaps ' % self.tmpdir + '100000000') |