Skip to content
Snippets Groups Projects
Select Git revision
  • 9cbfa2f64c04d98ad2bbce93066e2e021d12a24b
  • linus-master default
  • kunit_is_love
  • kunit_drm
  • tonyk/futex_waitv
  • hidraw_rwlock
  • futex_waitv
  • futex2-dev
  • idle_sleep
  • futex2-proton
  • futex-tests
  • futex2
  • futex2-numa
  • fwm-5.11
  • cf-fix
  • tmpfs-ic
  • futex2-stable-5.11
  • futex2-stable
  • futex2-lpc
  • gaming
  • futex-fixes
21 results

parse-events.c

Blame
    • Jin Yao's avatar
      9cbfa2f6
      perf parse-events: Create two hybrid hardware events · 9cbfa2f6
      Jin Yao authored
      
      Current hardware events has special perf types PERF_TYPE_HARDWARE.
      But it doesn't pass the PMU type in the user interface. For a hybrid
      system, the perf kernel doesn't know which PMU the events belong to.
      
      So now this type is extended to be PMU aware type. The PMU type ID
      is stored at attr.config[63:32].
      
      PMU type ID is retrieved from sysfs.
      
        root@lkp-adl-d01:/sys/devices/cpu_atom# cat type
        8
      
        root@lkp-adl-d01:/sys/devices/cpu_core# cat type
        4
      
      When enabling a hybrid hardware event without specified pmu, such as,
      'perf stat -e cycles -a', two events are created automatically. One
      is for atom, the other is for core.
      
        # perf stat -e cycles -a -vv -- sleep 1
        Control descriptor is not initialized
        ------------------------------------------------------------
        perf_event_attr:
          size                             120
          config                           0x400000000
          sample_type                      IDENTIFIER
          read_format                      TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING
          disabled                         1
          inherit                          1
          exclude_guest                    1
        ------------------------------------------------------------
        sys_perf_event_open: pid -1  cpu 0  group_fd -1  flags 0x8 = 3
        ------------------------------------------------------------
        ...
        ------------------------------------------------------------
        perf_event_attr:
          size                             120
          config                           0x400000000
          sample_type                      IDENTIFIER
          read_format                      TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING
          disabled                         1
          inherit                          1
          exclude_guest                    1
        ------------------------------------------------------------
        sys_perf_event_open: pid -1  cpu 15  group_fd -1  flags 0x8 = 19
        ------------------------------------------------------------
        perf_event_attr:
          size                             120
          config                           0x800000000
          sample_type                      IDENTIFIER
          read_format                      TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING
          disabled                         1
          inherit                          1
          exclude_guest                    1
        ------------------------------------------------------------
        sys_perf_event_open: pid -1  cpu 16  group_fd -1  flags 0x8 = 20
        ------------------------------------------------------------
        ...
        ------------------------------------------------------------
        perf_event_attr:
          size                             120
          config                           0x800000000
          sample_type                      IDENTIFIER
          read_format                      TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING
          disabled                         1
          inherit                          1
          exclude_guest                    1
        ------------------------------------------------------------
        sys_perf_event_open: pid -1  cpu 23  group_fd -1  flags 0x8 = 27
        cycles: 0: 836272 1001525722 1001525722
        cycles: 1: 628564 1001580453 1001580453
        cycles: 2: 872693 1001605997 1001605997
        cycles: 3: 70417 1001641369 1001641369
        cycles: 4: 88593 1001726722 1001726722
        cycles: 5: 470495 1001752993 1001752993
        cycles: 6: 484733 1001840440 1001840440
        cycles: 7: 1272477 1001593105 1001593105
        cycles: 8: 209185 1001608616 1001608616
        cycles: 9: 204391 1001633962 1001633962
        cycles: 10: 264121 1001661745 1001661745
        cycles: 11: 826104 1001689904 1001689904
        cycles: 12: 89935 1001728861 1001728861
        cycles: 13: 70639 1001756757 1001756757
        cycles: 14: 185266 1001784810 1001784810
        cycles: 15: 171094 1001825466 1001825466
        cycles: 0: 129624 1001854843 1001854843
        cycles: 1: 122533 1001840421 1001840421
        cycles: 2: 90055 1001882506 1001882506
        cycles: 3: 139607 1001896463 1001896463
        cycles: 4: 141791 1001907838 1001907838
        cycles: 5: 530927 1001883880 1001883880
        cycles: 6: 143246 1001852529 1001852529
        cycles: 7: 667769 1001872626 1001872626
        cycles: 6744979 16026956922 16026956922
        cycles: 1965552 8014991106 8014991106
      
         Performance counter stats for 'system wide':
      
                 6,744,979      cpu_core/cycles/
                 1,965,552      cpu_atom/cycles/
      
               1.001882711 seconds time elapsed
      
      0x4 in 0x400000000 indicates the cpu_core pmu.
      0x8 in 0x800000000 indicates the cpu_atom pmu.
      
      Signed-off-by: default avatarJin Yao <yao.jin@linux.intel.com>
      Reviewed-by: default avatarJiri Olsa <jolsa@kernel.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Kan Liang <kan.liang@intel.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: https://lore.kernel.org/r/20210427070139.25256-9-yao.jin@linux.intel.com
      
      
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      9cbfa2f6
      History
      perf parse-events: Create two hybrid hardware events
      Jin Yao authored
      
      Current hardware events has special perf types PERF_TYPE_HARDWARE.
      But it doesn't pass the PMU type in the user interface. For a hybrid
      system, the perf kernel doesn't know which PMU the events belong to.
      
      So now this type is extended to be PMU aware type. The PMU type ID
      is stored at attr.config[63:32].
      
      PMU type ID is retrieved from sysfs.
      
        root@lkp-adl-d01:/sys/devices/cpu_atom# cat type
        8
      
        root@lkp-adl-d01:/sys/devices/cpu_core# cat type
        4
      
      When enabling a hybrid hardware event without specified pmu, such as,
      'perf stat -e cycles -a', two events are created automatically. One
      is for atom, the other is for core.
      
        # perf stat -e cycles -a -vv -- sleep 1
        Control descriptor is not initialized
        ------------------------------------------------------------
        perf_event_attr:
          size                             120
          config                           0x400000000
          sample_type                      IDENTIFIER
          read_format                      TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING
          disabled                         1
          inherit                          1
          exclude_guest                    1
        ------------------------------------------------------------
        sys_perf_event_open: pid -1  cpu 0  group_fd -1  flags 0x8 = 3
        ------------------------------------------------------------
        ...
        ------------------------------------------------------------
        perf_event_attr:
          size                             120
          config                           0x400000000
          sample_type                      IDENTIFIER
          read_format                      TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING
          disabled                         1
          inherit                          1
          exclude_guest                    1
        ------------------------------------------------------------
        sys_perf_event_open: pid -1  cpu 15  group_fd -1  flags 0x8 = 19
        ------------------------------------------------------------
        perf_event_attr:
          size                             120
          config                           0x800000000
          sample_type                      IDENTIFIER
          read_format                      TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING
          disabled                         1
          inherit                          1
          exclude_guest                    1
        ------------------------------------------------------------
        sys_perf_event_open: pid -1  cpu 16  group_fd -1  flags 0x8 = 20
        ------------------------------------------------------------
        ...
        ------------------------------------------------------------
        perf_event_attr:
          size                             120
          config                           0x800000000
          sample_type                      IDENTIFIER
          read_format                      TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING
          disabled                         1
          inherit                          1
          exclude_guest                    1
        ------------------------------------------------------------
        sys_perf_event_open: pid -1  cpu 23  group_fd -1  flags 0x8 = 27
        cycles: 0: 836272 1001525722 1001525722
        cycles: 1: 628564 1001580453 1001580453
        cycles: 2: 872693 1001605997 1001605997
        cycles: 3: 70417 1001641369 1001641369
        cycles: 4: 88593 1001726722 1001726722
        cycles: 5: 470495 1001752993 1001752993
        cycles: 6: 484733 1001840440 1001840440
        cycles: 7: 1272477 1001593105 1001593105
        cycles: 8: 209185 1001608616 1001608616
        cycles: 9: 204391 1001633962 1001633962
        cycles: 10: 264121 1001661745 1001661745
        cycles: 11: 826104 1001689904 1001689904
        cycles: 12: 89935 1001728861 1001728861
        cycles: 13: 70639 1001756757 1001756757
        cycles: 14: 185266 1001784810 1001784810
        cycles: 15: 171094 1001825466 1001825466
        cycles: 0: 129624 1001854843 1001854843
        cycles: 1: 122533 1001840421 1001840421
        cycles: 2: 90055 1001882506 1001882506
        cycles: 3: 139607 1001896463 1001896463
        cycles: 4: 141791 1001907838 1001907838
        cycles: 5: 530927 1001883880 1001883880
        cycles: 6: 143246 1001852529 1001852529
        cycles: 7: 667769 1001872626 1001872626
        cycles: 6744979 16026956922 16026956922
        cycles: 1965552 8014991106 8014991106
      
         Performance counter stats for 'system wide':
      
                 6,744,979      cpu_core/cycles/
                 1,965,552      cpu_atom/cycles/
      
               1.001882711 seconds time elapsed
      
      0x4 in 0x400000000 indicates the cpu_core pmu.
      0x8 in 0x800000000 indicates the cpu_atom pmu.
      
      Signed-off-by: default avatarJin Yao <yao.jin@linux.intel.com>
      Reviewed-by: default avatarJiri Olsa <jolsa@kernel.org>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Kan Liang <kan.liang@intel.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: https://lore.kernel.org/r/20210427070139.25256-9-yao.jin@linux.intel.com
      
      
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    kunit_tool_test.py 6.57 KiB
    #!/usr/bin/python3
    # SPDX-License-Identifier: GPL-2.0
    #
    # A collection of tests for tools/testing/kunit/kunit.py
    #
    # Copyright (C) 2019, Google LLC.
    # Author: Brendan Higgins <brendanhiggins@google.com>
    
    import unittest
    from unittest import mock
    
    import tempfile, shutil # Handling test_tmpdir
    
    import os
    
    import kunit_config
    import kunit_parser
    import kunit_kernel
    import kunit
    
    test_tmpdir = ''
    
    def setUpModule():
    	global test_tmpdir
    	test_tmpdir = tempfile.mkdtemp()
    
    def tearDownModule():
    	shutil.rmtree(test_tmpdir)
    
    def get_absolute_path(path):
    	return os.path.join(os.path.dirname(__file__), path)
    
    class KconfigTest(unittest.TestCase):
    
    	def test_is_subset_of(self):
    		kconfig0 = kunit_config.Kconfig()
    		self.assertTrue(kconfig0.is_subset_of(kconfig0))
    
    		kconfig1 = kunit_config.Kconfig()
    		kconfig1.add_entry(kunit_config.KconfigEntry('CONFIG_TEST=y'))
    		self.assertTrue(kconfig1.is_subset_of(kconfig1))
    		self.assertTrue(kconfig0.is_subset_of(kconfig1))
    		self.assertFalse(kconfig1.is_subset_of(kconfig0))
    
    	def test_read_from_file(self):
    		kconfig = kunit_config.Kconfig()
    		kconfig_path = get_absolute_path(
    			'test_data/test_read_from_file.kconfig')
    
    		kconfig.read_from_file(kconfig_path)
    
    		expected_kconfig = kunit_config.Kconfig()
    		expected_kconfig.add_entry(
    			kunit_config.KconfigEntry('CONFIG_UML=y'))
    		expected_kconfig.add_entry(
    			kunit_config.KconfigEntry('CONFIG_MMU=y'))
    		expected_kconfig.add_entry(
    			kunit_config.KconfigEntry('CONFIG_TEST=y'))
    		expected_kconfig.add_entry(
    			kunit_config.KconfigEntry('CONFIG_EXAMPLE_TEST=y'))
    		expected_kconfig.add_entry(
    			kunit_config.KconfigEntry('# CONFIG_MK8 is not set'))
    
    		self.assertEqual(kconfig.entries(), expected_kconfig.entries())
    
    	def test_write_to_file(self):
    		kconfig_path = os.path.join(test_tmpdir, '.config')
    
    		expected_kconfig = kunit_config.Kconfig()
    		expected_kconfig.add_entry(
    			kunit_config.KconfigEntry('CONFIG_UML=y'))
    		expected_kconfig.add_entry(
    			kunit_config.KconfigEntry('CONFIG_MMU=y'))
    		expected_kconfig.add_entry(
    			kunit_config.KconfigEntry('CONFIG_TEST=y'))
    		expected_kconfig.add_entry(
    			kunit_config.KconfigEntry('CONFIG_EXAMPLE_TEST=y'))
    		expected_kconfig.add_entry(
    			kunit_config.KconfigEntry('# CONFIG_MK8 is not set'))
    
    		expected_kconfig.write_to_file(kconfig_path)
    
    		actual_kconfig = kunit_config.Kconfig()
    		actual_kconfig.read_from_file(kconfig_path)
    
    		self.assertEqual(actual_kconfig.entries(),
    				 expected_kconfig.entries())
    
    class KUnitParserTest(unittest.TestCase):
    
    	def assertContains(self, needle, haystack):
    		for line in haystack:
    			if needle in line:
    				return
    		raise AssertionError('"' +
    			str(needle) + '" not found in "' + str(haystack) + '"!')
    
    	def test_output_isolated_correctly(self):
    		log_path = get_absolute_path(
    			'test_data/test_output_isolated_correctly.log')
    		file = open(log_path)
    		result = kunit_parser.isolate_kunit_output(file.readlines())
    		self.assertContains('TAP version 14\n', result)
    		self.assertContains('	# Subtest: example', result)
    		self.assertContains('	1..2', result)
    		self.assertContains('	ok 1 - example_simple_test', result)
    		self.assertContains('	ok 2 - example_mock_test', result)
    		self.assertContains('ok 1 - example', result)
    		file.close()
    
    	def test_parse_successful_test_log(self):
    		all_passed_log = get_absolute_path(
    			'test_data/test_is_test_passed-all_passed.log')
    		file = open(all_passed_log)
    		result = kunit_parser.parse_run_tests(file.readlines())
    		self.assertEqual(
    			kunit_parser.TestStatus.SUCCESS,
    			result.status)
    		file.close()
    
    	def test_parse_failed_test_log(self):
    		failed_log = get_absolute_path(
    			'test_data/test_is_test_passed-failure.log')
    		file = open(failed_log)
    		result = kunit_parser.parse_run_tests(file.readlines())
    		self.assertEqual(
    			kunit_parser.TestStatus.FAILURE,
    			result.status)
    		file.close()
    
    	def test_no_tests(self):
    		empty_log = get_absolute_path(
    			'test_data/test_is_test_passed-no_tests_run.log')
    		file = open(empty_log)
    		result = kunit_parser.parse_run_tests(
    			kunit_parser.isolate_kunit_output(file.readlines()))
    		self.assertEqual(0, len(result.suites))
    		self.assertEqual(
    			kunit_parser.TestStatus.NO_TESTS,
    			result.status)
    		file.close()
    
    	def test_crashed_test(self):
    		crashed_log = get_absolute_path(
    			'test_data/test_is_test_passed-crash.log')
    		file = open(crashed_log)
    		result = kunit_parser.parse_run_tests(file.readlines())
    		self.assertEqual(
    			kunit_parser.TestStatus.TEST_CRASHED,
    			result.status)
    		file.close()
    
    class StrContains(str):
    	def __eq__(self, other):
    		return self in other
    
    class KUnitMainTest(unittest.TestCase):
    	def setUp(self):
    		path = get_absolute_path('test_data/test_is_test_passed-all_passed.log')
    		file = open(path)
    		all_passed_log = file.readlines()
    		self.print_patch = mock.patch('builtins.print')
    		self.print_mock = self.print_patch.start()
    		self.linux_source_mock = mock.Mock()
    		self.linux_source_mock.build_reconfig = mock.Mock(return_value=True)
    		self.linux_source_mock.build_um_kernel = mock.Mock(return_value=True)
    		self.linux_source_mock.run_kernel = mock.Mock(return_value=all_passed_log)
    
    	def tearDown(self):
    		self.print_patch.stop()
    		pass
    
    	def test_run_passes_args_pass(self):
    		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.print_mock.assert_any_call(StrContains('Testing complete.'))
    
    	def test_run_passes_args_fail(self):
    		self.linux_source_mock.run_kernel = mock.Mock(return_value=[])
    		with self.assertRaises(SystemExit) as e:
    			kunit.main(['run'], self.linux_source_mock)
    		assert type(e.exception) == SystemExit
    		assert e.exception.code == 1
    		assert self.linux_source_mock.build_reconfig.call_count == 1
    		assert self.linux_source_mock.run_kernel.call_count == 1
    		self.print_mock.assert_any_call(StrContains(' 0 tests run'))
    
    	def test_run_raw_output(self):
    		self.linux_source_mock.run_kernel = mock.Mock(return_value=[])
    		kunit.main(['run', '--raw_output'], self.linux_source_mock)
    		assert self.linux_source_mock.build_reconfig.call_count == 1
    		assert self.linux_source_mock.run_kernel.call_count == 1
    		for kall in self.print_mock.call_args_list:
    			assert kall != mock.call(StrContains('Testing complete.'))
    			assert kall != mock.call(StrContains(' 0 tests run'))
    
    	def test_run_timeout(self):
    		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(timeout=timeout)
    		self.print_mock.assert_any_call(StrContains('Testing complete.'))
    
    if __name__ == '__main__':
    	unittest.main()