Commit f4b39746 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'linux-kselftest-5.5-rc4' of...

Merge tag 'linux-kselftest-5.5-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest

Pull Kselftest fixes from Shuah Khan:

 - rseq build failures fixes related to glibc 2.30 compatibility from
   Mathieu Desnoyers

 - Kunit fixes and cleanups from SeongJae Park

 - Fixes to filesystems/epoll, firmware, and livepatch build failures
   and skip handling.

* tag 'linux-kselftest-5.5-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest:
  rseq/selftests: Clarify rseq_prepare_unload() helper requirements
  rseq/selftests: Fix: Namespace gettid() for compatibility with glibc 2.30
  rseq/selftests: Turn off timeout setting
  kunit/kunit_tool_test: Test '--build_dir' option run
  kunit: Rename 'kunitconfig' to '.kunitconfig'
  kunit: Place 'test.log' under the 'build_dir'
  kunit: Create default config in '--build_dir'
  kunit: Remove duplicated defconfig creation
  docs/kunit/start: Use in-tree 'kunit_defconfig'
  selftests: livepatch: Fix it to do root uid check and skip
  selftests: firmware: Fix it to do root uid check and skip
  selftests: filesystems/epoll: fix build error
parents 1413c361 2a1f40ad
Loading
Loading
Loading
Loading
+5 −8
Original line number Diff line number Diff line
@@ -24,19 +24,16 @@ The wrapper can be run with:
For more information on this wrapper (also called kunit_tool) checkout the
:doc:`kunit-tool` page.

Creating a kunitconfig
======================
Creating a .kunitconfig
=======================
The Python script is a thin wrapper around Kbuild. As such, it needs to be
configured with a ``kunitconfig`` file. This file essentially contains the
configured with a ``.kunitconfig`` file. This file essentially contains the
regular Kernel config, with the specific test targets as well.

.. code-block:: bash

	git clone -b master https://kunit.googlesource.com/kunitconfig $PATH_TO_KUNITCONFIG_REPO
	cd $PATH_TO_LINUX_REPO
	ln -s $PATH_TO_KUNIT_CONFIG_REPO/kunitconfig kunitconfig

You may want to add kunitconfig to your local gitignore.
	cp arch/um/configs/kunit_defconfig .kunitconfig

Verifying KUnit Works
---------------------
@@ -151,7 +148,7 @@ and the following to ``drivers/misc/Makefile``:

	obj-$(CONFIG_MISC_EXAMPLE_TEST) += example-test.o

Now add it to your ``kunitconfig``:
Now add it to your ``.kunitconfig``:

.. code-block:: none

+11 −7
Original line number Diff line number Diff line
@@ -31,15 +31,12 @@ class KunitStatus(Enum):
	TEST_FAILURE = auto()

def create_default_kunitconfig():
	if not os.path.exists(kunit_kernel.KUNITCONFIG_PATH):
	if not os.path.exists(kunit_kernel.kunitconfig_path):
		shutil.copyfile('arch/um/configs/kunit_defconfig',
				kunit_kernel.KUNITCONFIG_PATH)
				kunit_kernel.kunitconfig_path)

def run_tests(linux: kunit_kernel.LinuxSourceTree,
	      request: KunitRequest) -> KunitResult:
	if request.defconfig:
		create_default_kunitconfig()

	config_start = time.time()
	success = linux.build_reconfig(request.build_dir)
	config_end = time.time()
@@ -108,15 +105,22 @@ def main(argv, linux=None):
	run_parser.add_argument('--build_dir',
				help='As in the make command, it specifies the build '
				'directory.',
				type=str, default=None, metavar='build_dir')
				type=str, default='', metavar='build_dir')

	run_parser.add_argument('--defconfig',
				help='Uses a default kunitconfig.',
				help='Uses a default .kunitconfig.',
				action='store_true')

	cli_args = parser.parse_args(argv)

	if cli_args.subcommand == 'run':
		if cli_args.build_dir:
			if not os.path.exists(cli_args.build_dir):
				os.mkdir(cli_args.build_dir)
			kunit_kernel.kunitconfig_path = os.path.join(
				cli_args.build_dir,
				kunit_kernel.kunitconfig_path)

		if cli_args.defconfig:
			create_default_kunitconfig()

+5 −5
Original line number Diff line number Diff line
@@ -14,7 +14,7 @@ import os
import kunit_config

KCONFIG_PATH = '.config'
KUNITCONFIG_PATH = 'kunitconfig'
kunitconfig_path = '.kunitconfig'

class ConfigError(Exception):
	"""Represents an error trying to configure the Linux kernel."""
@@ -82,7 +82,7 @@ class LinuxSourceTree(object):

	def __init__(self):
		self._kconfig = kunit_config.Kconfig()
		self._kconfig.read_from_file(KUNITCONFIG_PATH)
		self._kconfig.read_from_file(kunitconfig_path)
		self._ops = LinuxSourceTreeOperations()

	def clean(self):
@@ -111,7 +111,7 @@ class LinuxSourceTree(object):
		return True

	def build_reconfig(self, build_dir):
		"""Creates a new .config if it is not a subset of the kunitconfig."""
		"""Creates a new .config if it is not a subset of the .kunitconfig."""
		kconfig_path = get_kconfig_path(build_dir)
		if os.path.exists(kconfig_path):
			existing_kconfig = kunit_config.Kconfig()
@@ -140,10 +140,10 @@ class LinuxSourceTree(object):
			return False
		return True

	def run_kernel(self, args=[], timeout=None, build_dir=None):
	def run_kernel(self, args=[], timeout=None, build_dir=''):
		args.extend(['mem=256M'])
		process = self._ops.linux_bin(args, timeout, build_dir)
		with open('test.log', 'w') as f:
		with open(os.path.join(build_dir, 'test.log'), 'w') as f:
			for line in process.stdout:
				f.write(line.rstrip().decode('ascii') + '\n')
				yield line.rstrip().decode('ascii')
+9 −1
Original line number Diff line number Diff line
@@ -174,6 +174,7 @@ class KUnitMainTest(unittest.TestCase):
		kunit.main(['run'], self.linux_source_mock)
		assert self.linux_source_mock.build_reconfig.call_count == 1
		assert self.linux_source_mock.run_kernel.call_count == 1
		self.linux_source_mock.run_kernel.assert_called_once_with(build_dir='', timeout=300)
		self.print_mock.assert_any_call(StrContains('Testing complete.'))

	def test_run_passes_args_fail(self):
@@ -199,7 +200,14 @@ class KUnitMainTest(unittest.TestCase):
		timeout = 3453
		kunit.main(['run', '--timeout', str(timeout)], self.linux_source_mock)
		assert self.linux_source_mock.build_reconfig.call_count == 1
		self.linux_source_mock.run_kernel.assert_called_once_with(build_dir=None, timeout=timeout)
		self.linux_source_mock.run_kernel.assert_called_once_with(build_dir='', timeout=timeout)
		self.print_mock.assert_any_call(StrContains('Testing complete.'))

	def test_run_builddir(self):
		build_dir = '.kunit'
		kunit.main(['run', '--build_dir', build_dir], self.linux_source_mock)
		assert self.linux_source_mock.build_reconfig.call_count == 1
		self.linux_source_mock.run_kernel.assert_called_once_with(build_dir=build_dir, timeout=300)
		self.print_mock.assert_any_call(StrContains('Testing complete.'))

if __name__ == '__main__':
+1 −1
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0

CFLAGS += -I../../../../../usr/include/
LDFLAGS += -lpthread
LDLIBS += -lpthread
TEST_GEN_PROGS := epoll_wakeup_test

include ../../lib.mk
Loading