From 7e66e053d469ed0be1d1cf98229d18d0939dc043 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 2 Mar 2024 14:45:44 +0900 Subject: [PATCH 1/3] udev/net: fix ReceivePacketSteeringCPUMask=disable assignment Follow-up for 0f30bf5886f839984df545df74e9658daf3533d2. If 'mask' is newly allocated, previously the value was ignored. --- src/udev/net/link-config.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c index 8eee527bbf..bb26f32974 100644 --- a/src/udev/net/link-config.c +++ b/src/udev/net/link-config.c @@ -1397,12 +1397,10 @@ int config_parse_rps_cpu_mask( mask = allocated; } - if (streq(rvalue, "disable")) { + if (streq(rvalue, "disable")) cpu_set_reset(mask); - return 0; - } - if (streq(rvalue, "all")) { + else if (streq(rvalue, "all")) { r = cpu_mask_add_all(mask); if (r < 0) { log_syntax(unit, LOG_WARNING, filename, line, r, From a39a2a812135f2dd1fa0a5ca463c5b7ba8a766f2 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 2 Mar 2024 14:34:49 +0900 Subject: [PATCH 2/3] test-network: introduce udevadm() and friends --- test/test-network/systemd-networkd-tests.py | 38 ++++++++++++--------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index babfc71e91..51a92cb965 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -283,9 +283,6 @@ def compare_kernel_version(min_kernel_version): return version.parse(kver) >= version.parse(min_kernel_version) -def udev_reload(): - check_output(*udevadm_cmd, 'control', '--reload') - def copy_network_unit(*units, copy_dropins=True): """ Copy networkd unit files into the testbed. @@ -316,7 +313,7 @@ def copy_network_unit(*units, copy_dropins=True): has_link = True if has_link: - udev_reload() + udevadm_reload() def copy_credential(src, target): mkdir_p(credstore_dir) @@ -338,7 +335,7 @@ def remove_network_unit(*units): has_link = True if has_link: - udev_reload() + udevadm_reload() def clear_network_units(): has_link = False @@ -351,7 +348,7 @@ def clear_network_units(): rm_rf(network_unit_dir) if has_link: - udev_reload() + udevadm_reload() def copy_networkd_conf_dropin(*dropins): """Copy networkd.conf dropin files into the testbed.""" @@ -798,6 +795,15 @@ def resolvectl(*args): def timedatectl(*args): return check_output(*(timedatectl_cmd + list(args)), env=env) +def udevadm(*args): + return check_output(*(udevadm_cmd + list(args))) + +def udevadm_reload(): + udevadm('control', '--reload') + +def udevadm_trigger(*args, action='add'): + udevadm('trigger', '--settle', f'--action={action}', *args) + def setup_common(): print() @@ -1315,7 +1321,7 @@ class NetworkctlTests(unittest.TestCase, Utilities): # This test may be run on the system that has older udevd than 70f32a260b5ebb68c19ecadf5d69b3844896ba55 (v249). # In that case, the udev DB for the loopback network interface may already have ID_NET_LINK_FILE property. # Let's reprocess the interface and drop the property. - check_output(*udevadm_cmd, 'trigger', '--settle', '--action=add', '/sys/class/net/lo') + udevadm_trigger('/sys/class/net/lo') output = networkctl_status('lo') print(output) self.assertIn('Link File: n/a', output) @@ -1378,7 +1384,7 @@ class NetworkdMatchTests(unittest.TestCase, Utilities): check_output('ip link set dev dummy98-1 down') check_output('ip link set dev dummy98-1 name dummy98-2') - check_output(*udevadm_cmd, 'trigger', '--action=add', '/sys/class/net/dummy98-2') + udevadm_trigger('/sys/class/net/dummy98-2') self.wait_address('dummy98-2', '10.0.2.2/16', ipv='-4', timeout_sec=10) self.wait_online('dummy98-2:routable') @@ -5248,8 +5254,8 @@ class NetworkdSRIOVTests(unittest.TestCase, Utilities): with open(os.path.join(network_unit_dir, '25-sriov.link'), mode='a', encoding='utf-8') as f: f.write('[Link]\nSR-IOVVirtualFunctions=4\n') - udev_reload() - check_output(*udevadm_cmd, 'trigger', '--action=add', '--settle', f'/sys/devices/netdevsim99/net/{ifname}') + udevadm_reload() + udevadm_trigger(f'/sys/devices/netdevsim99/net/{ifname}') output = check_output('ip link show dev eni99np1') print(output) @@ -5264,8 +5270,8 @@ class NetworkdSRIOVTests(unittest.TestCase, Utilities): with open(os.path.join(network_unit_dir, '25-sriov.link'), mode='a', encoding='utf-8') as f: f.write('[Link]\nSR-IOVVirtualFunctions=\n') - udev_reload() - check_output(*udevadm_cmd, 'trigger', '--action=add', '--settle', f'/sys/devices/netdevsim99/net/{ifname}') + udevadm_reload() + udevadm_trigger(f'/sys/devices/netdevsim99/net/{ifname}') output = check_output('ip link show dev eni99np1') print(output) @@ -5280,8 +5286,8 @@ class NetworkdSRIOVTests(unittest.TestCase, Utilities): with open(os.path.join(network_unit_dir, '25-sriov.link'), mode='a', encoding='utf-8') as f: f.write('[Link]\nSR-IOVVirtualFunctions=2\n') - udev_reload() - check_output(*udevadm_cmd, 'trigger', '--action=add', '--settle', f'/sys/devices/netdevsim99/net/{ifname}') + udevadm_reload() + udevadm_trigger(f'/sys/devices/netdevsim99/net/{ifname}') output = check_output('ip link show dev eni99np1') print(output) @@ -5296,8 +5302,8 @@ class NetworkdSRIOVTests(unittest.TestCase, Utilities): with open(os.path.join(network_unit_dir, '25-sriov.link'), mode='a', encoding='utf-8') as f: f.write('[Link]\nSR-IOVVirtualFunctions=\n') - udev_reload() - check_output(*udevadm_cmd, 'trigger', '--action=add', '--settle', f'/sys/devices/netdevsim99/net/{ifname}') + udevadm_reload() + udevadm_trigger(f'/sys/devices/netdevsim99/net/{ifname}') output = check_output('ip link show dev eni99np1') print(output) From 4b35dab86a22e20e3011958574500fdcac73ff1b Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 2 Mar 2024 14:48:33 +0900 Subject: [PATCH 3/3] test-network: wait for the interface being processed by udevd Otherwise, even if the interface is available, the requested config may not be applied to the interface yet. This also merges multiple tests for RPS setting. Hopefully the performance of the test is improved. --- test/test-network/systemd-networkd-tests.py | 148 +++++++++----------- 1 file changed, 64 insertions(+), 84 deletions(-) diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index 51a92cb965..3825490d5f 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -2466,22 +2466,12 @@ class NetworkdNetDevTests(unittest.TestCase, Utilities): self.wait_online('ifb99:degraded') - def test_rps_cpu_0(self): - copy_network_unit('12-dummy.netdev', '25-rps-cpu-0.link') - start_networkd() - - self.wait_links('dummy98') - - output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus') - print(output) - self.assertEqual(int(output.replace(',', ''), base=16), 1) - @unittest.skipUnless(os.cpu_count() >= 2, reason="CPU count should be >= 2 to pass this test") def test_rps_cpu_1(self): - copy_network_unit('12-dummy.netdev', '25-rps-cpu-1.link') + copy_network_unit('12-dummy.netdev', '12-dummy.network', '25-rps-cpu-1.link') start_networkd() - self.wait_links('dummy98') + self.wait_online('dummy98:carrier') output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus') print(output) @@ -2489,10 +2479,10 @@ class NetworkdNetDevTests(unittest.TestCase, Utilities): @unittest.skipUnless(os.cpu_count() >= 2, reason="CPU count should be >= 2 to pass this test") def test_rps_cpu_0_1(self): - copy_network_unit('12-dummy.netdev', '25-rps-cpu-0-1.link') + copy_network_unit('12-dummy.netdev', '12-dummy.network', '25-rps-cpu-0-1.link') start_networkd() - self.wait_links('dummy98') + self.wait_online('dummy98:carrier') output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus') print(output) @@ -2500,96 +2490,86 @@ class NetworkdNetDevTests(unittest.TestCase, Utilities): @unittest.skipUnless(os.cpu_count() >= 4, reason="CPU count should be >= 4 to pass this test") def test_rps_cpu_multi(self): - copy_network_unit('12-dummy.netdev', '25-rps-cpu-multi.link') + copy_network_unit('12-dummy.netdev', '12-dummy.network', '25-rps-cpu-multi.link') start_networkd() - self.wait_links('dummy98') + self.wait_online('dummy98:carrier') output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus') print(output) self.assertEqual(int(output.replace(',', ''), base=16), 15) - def test_rps_cpu_all(self): + def test_rps_cpu(self): cpu_count = os.cpu_count() - copy_network_unit('12-dummy.netdev', '25-rps-cpu-all.link') + copy_network_unit('12-dummy.netdev', '12-dummy.network') start_networkd() - self.wait_links('dummy98') - - output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus') - print(output) - self.assertEqual(f"{int(output.replace(',', ''), base=16):x}", f'{(1 << cpu_count) - 1:x}') - - def test_rps_cpu_disable(self): - copy_network_unit('12-dummy.netdev', '25-rps-cpu-all.link', '24-rps-cpu-disable.link') - start_networkd() - - self.wait_links('dummy98') - - output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus') - print(output) - self.assertEqual(int(output.replace(',', ''), base=16), 0) - - def test_rps_cpu_empty(self): - copy_network_unit('12-dummy.netdev', '24-rps-cpu-empty.link') - start_networkd() - - self.wait_links('dummy98') - - output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus') - print(output) - self.assertEqual(int(output.replace(',', ''), base=16), 0) - - def test_rps_cpu_0_empty(self): - copy_network_unit('12-dummy.netdev', '25-rps-cpu-0-empty.link') - start_networkd() - - self.wait_links('dummy98') - - output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus') - print(output) - self.assertEqual(int(output.replace(',', ''), base=16), 0) - - def test_rps_cpu_0_and_empty(self): - copy_network_unit('12-dummy.netdev', '25-rps-cpu-0.link', '24-rps-cpu-empty.link') - start_networkd() - - self.wait_links('dummy98') - - output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus') - print(output) - self.assertEqual(int(output.replace(',', ''), base=16), 0) - - def test_rps_cpu_invalid(self): - copy_network_unit('12-dummy.netdev', '24-rps-cpu-invalid.link') - start_networkd() - - self.wait_links('dummy98') - - output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus') - print(output) - self.assertEqual(int(output.replace(',', ''), base=16), 0) - - def test_rps_cpu_0_invalid(self): - copy_network_unit('12-dummy.netdev', '25-rps-cpu-0-invalid.link') - start_networkd() - - self.wait_links('dummy98') + self.wait_online('dummy98:carrier') + # 0 + copy_network_unit('25-rps-cpu-0.link') + udevadm_trigger('/sys/class/net/dummy98') output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus') print(output) self.assertEqual(int(output.replace(',', ''), base=16), 1) + remove_network_unit('25-rps-cpu-0.link') - def test_rps_cpu_0_and_invalid(self): - copy_network_unit('12-dummy.netdev', '25-rps-cpu-0.link', '24-rps-cpu-invalid.link') - start_networkd() - - self.wait_links('dummy98') + # all + copy_network_unit('25-rps-cpu-all.link') + udevadm_trigger('/sys/class/net/dummy98') + output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus') + print(output) + self.assertEqual(f"{int(output.replace(',', ''), base=16):x}", f'{(1 << cpu_count) - 1:x}') + remove_network_unit('25-rps-cpu-all.link') + # disable + copy_network_unit('24-rps-cpu-disable.link') + udevadm_trigger('/sys/class/net/dummy98') output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus') print(output) self.assertEqual(int(output.replace(',', ''), base=16), 0) + remove_network_unit('24-rps-cpu-disable.link') + + # set all again + copy_network_unit('25-rps-cpu-all.link') + udevadm_trigger('/sys/class/net/dummy98') + output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus') + print(output) + self.assertEqual(f"{int(output.replace(',', ''), base=16):x}", f'{(1 << cpu_count) - 1:x}') + remove_network_unit('25-rps-cpu-all.link') + + # empty -> unchanged + copy_network_unit('24-rps-cpu-empty.link') + udevadm_trigger('/sys/class/net/dummy98') + output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus') + print(output) + self.assertEqual(f"{int(output.replace(',', ''), base=16):x}", f'{(1 << cpu_count) - 1:x}') + remove_network_unit('24-rps-cpu-empty.link') + + # 0, then empty -> unchanged + copy_network_unit('25-rps-cpu-0-empty.link') + udevadm_trigger('/sys/class/net/dummy98') + output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus') + print(output) + self.assertEqual(f"{int(output.replace(',', ''), base=16):x}", f'{(1 << cpu_count) - 1:x}') + remove_network_unit('25-rps-cpu-0-empty.link') + + # 0, then invalid -> 0 + copy_network_unit('25-rps-cpu-0-invalid.link') + udevadm_trigger('/sys/class/net/dummy98') + output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus') + print(output) + self.assertEqual(int(output.replace(',', ''), base=16), 1) + remove_network_unit('25-rps-cpu-0-invalid.link') + + # invalid -> unchanged + copy_network_unit('24-rps-cpu-invalid.link') + udevadm_trigger('/sys/class/net/dummy98') + output = check_output('cat /sys/class/net/dummy98/queues/rx-0/rps_cpus') + print(output) + self.assertEqual(int(output.replace(',', ''), base=16), 1) + remove_network_unit('24-rps-cpu-invalid.link') class NetworkdL2TPTests(unittest.TestCase, Utilities):