Example #1
0
 def test_write_infoblock_supported_align(self):
     """
     Test write_infoblock with align size
     """
     if not self.plib.check_ndctl_subcmd("write-infoblock"):
         self.cancel("Binary does not support write-infoblock")
     region = self.get_default_region()
     self.plib.disable_namespace(region=region)
     self.plib.destroy_namespace(region=region)
     self.plib.create_namespace(region=region, mode='devdax')
     ns_name = self.plib.run_ndctl_list_val(
         self.plib.run_ndctl_list("-N -r %s" % region)[0], 'dev')
     self.plib.disable_namespace(namespace=ns_name)
     map_align = memory.get_supported_huge_pages_size()[0] * 1024
     self.write_read_infoblock(ns_name, align=map_align)
     self.plib.enable_namespace(namespace=ns_name)
Example #2
0
    def test_write_infoblock_unalign(self):
        """
        Test write_infoblock with unsupported align size
        """
        if not self.plib.check_ndctl_subcmd("write-infoblock"):
            self.cancel("Binary does not support write-infoblock")
        region = self.get_default_region()
        self.plib.disable_namespace(region=region)
        self.plib.destroy_namespace(region=region)
        self.plib.create_namespace(region=region, mode='devdax')
        ns_name = self.plib.run_ndctl_list_val(
            self.plib.run_ndctl_list("-N -r %s" % region)[0], 'dev')
        self.plib.disable_namespace(namespace=ns_name)
        map_align = memory.get_supported_huge_pages_size()[0] * 1024
        self.write_read_infoblock(
            ns_name, align=self.get_unsupported_alignval(map_align))
        try:
            self.plib.enable_namespace(namespace=ns_name)
        except pmem.PMemException:
            self.log.info("Failed as expected")
        else:
            self.log.info(self.plib.run_ndctl_list())
            self.fail("Enabling namespace must have failed")

        idle_ns = self.plib.run_ndctl_list('-Ni -r %s' % region)
        if len(idle_ns) > 1:
            found = False
            for namespace in idle_ns:
                if int(self.plib.run_ndctl_list_val(namespace, 'size')) != 0:
                    found = True
                    break
        else:
            self.fail("Created namespace is not found")
        if not found:
            self.fail("Namespace with infoblock written not found")

        self.plib.destroy_namespace(namespace=ns_name, force=True)
    def setUp(self):

        # Check for basic utilities
        smm = SoftwareManager()
        detected_distro = distro.detect()
        deps = ['gcc', 'make', 'patch']
        if detected_distro.name in ["Ubuntu", 'debian']:
            deps += ['libpthread-stubs0-dev', 'git']
        elif detected_distro.name == "SuSE":
            deps += ['glibc-devel-static', 'git-core']
        else:
            deps += ['glibc-static', 'git']

        for package in deps:
            if not smm.check_installed(package) and not smm.install(package):
                self.cancel(' %s is needed for the test to be run' % package)

        kernel.check_version("2.6.16")

        if detected_distro.name in ["Ubuntu", 'debian']:
            out = glob.glob("/usr/lib/*/libpthread.a")
        else:
            out = glob.glob("/usr/lib*/libpthread.a")

        if not out:
            self.cancel("libpthread.a is required!!!"
                        "\nTry installing glibc-static")

        page_sizes = memory.get_supported_huge_pages_size()
        self.page_sizes = [str(each // 1024) for each in page_sizes]

        # Get arguments:
        pages_requested = self.params.get('pages_requested', default=20)

        # Check hugepages:
        pages_available = 0
        if os.path.exists('/proc/sys/vm/nr_hugepages'):

            hugepages_support = genio.read_file("/proc/meminfo").rstrip("\n")

            if 'HugePages_' not in hugepages_support:
                self.cancel("No Hugepages Configured")
        else:
            self.cancel("Kernel does not support hugepages")

        self.configured_page_sizes = []
        self.hugetlbfs_dir = {}

        for hp_size in self.page_sizes:
            try:
                genio.write_file(
                    '/sys/kernel/mm/hugepages/hugepages-%skB/nr_hugepages' %
                    str(int(hp_size) * 1024), str(pages_requested))
            except OSError:
                if (int(hp_size) * 1024) == 16777216:
                    self.log.warn('Running 16GB hugepages')
                else:
                    self.cancel('Writing to hugepage file failed')
            pages_available = int(
                genio.read_file('/sys/kernel/mm/hugepages/huge'
                                'pages-%skB/nr_hugepages' %
                                str(int(hp_size) * 1024).strip()))
            if pages_available < pages_requested:
                self.log.warn('%d pages available, < %d pages '
                              'requested', pages_available, pages_requested)

            if pages_available:
                self.hugetlbfs_dir.update({
                    hp_size:
                    tempfile.mkdtemp(dir=self.teststmpdir,
                                     prefix='avocado_' + __name__)
                })
                if process.system(
                        'mount -t hugetlbfs -o pagesize=%sM none %s' %
                    (hp_size, self.hugetlbfs_dir[hp_size]),
                        sudo=True,
                        ignore_status=True):
                    self.cancel("hugetlbfs mount failed")
                self.configured_page_sizes.append(hp_size)

        if not self.configured_page_sizes:
            self.cancel("No hugepage size configured")

        git.get_repo('https://github.com/libhugetlbfs/libhugetlbfs.git',
                     destination_dir=self.workdir)
        os.chdir(self.workdir)
        patch = self.params.get('patch', default='elflink.patch')
        process.run('patch -p1 < %s' % self.get_data(patch), shell=True)

        build.make(self.workdir, extra_args='BUILDTYPE=NATIVEONLY')