Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests: ntsync: Add a stress test for contended waits.

Test a more realistic usage pattern, and one with heavy contention, in order to
actually exercise ntsync's internal synchronization.

This test has several threads in a tight loop acquiring a mutex, modifying some
shared data, and then releasing the mutex. At the end we check if the data is
consistent.

Signed-off-by: Elizabeth Figura <zfigura@codeweavers.com>
Link: https://lore.kernel.org/r/20241213193511.457338-28-zfigura@codeweavers.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Elizabeth Figura and committed by
Greg Kroah-Hartman
a22860e5 c52b9cb1

+72
+72
tools/testing/selftests/drivers/ntsync/ntsync.c
··· 1268 1268 close(fd); 1269 1269 } 1270 1270 1271 + #define STRESS_LOOPS 10000 1272 + #define STRESS_THREADS 4 1273 + 1274 + static unsigned int stress_counter; 1275 + static int stress_device, stress_start_event, stress_mutex; 1276 + 1277 + static void *stress_thread(void *arg) 1278 + { 1279 + struct ntsync_wait_args wait_args = {0}; 1280 + __u32 index, count, i; 1281 + int ret; 1282 + 1283 + wait_args.timeout = UINT64_MAX; 1284 + wait_args.count = 1; 1285 + wait_args.objs = (uintptr_t)&stress_start_event; 1286 + wait_args.owner = gettid(); 1287 + wait_args.index = 0xdeadbeef; 1288 + 1289 + ioctl(stress_device, NTSYNC_IOC_WAIT_ANY, &wait_args); 1290 + 1291 + wait_args.objs = (uintptr_t)&stress_mutex; 1292 + 1293 + for (i = 0; i < STRESS_LOOPS; ++i) { 1294 + ioctl(stress_device, NTSYNC_IOC_WAIT_ANY, &wait_args); 1295 + 1296 + ++stress_counter; 1297 + 1298 + unlock_mutex(stress_mutex, wait_args.owner, &count); 1299 + } 1300 + 1301 + return NULL; 1302 + } 1303 + 1304 + TEST(stress_wait) 1305 + { 1306 + struct ntsync_event_args event_args; 1307 + struct ntsync_mutex_args mutex_args; 1308 + pthread_t threads[STRESS_THREADS]; 1309 + __u32 signaled, i; 1310 + int ret; 1311 + 1312 + stress_device = open("/dev/ntsync", O_CLOEXEC | O_RDONLY); 1313 + ASSERT_LE(0, stress_device); 1314 + 1315 + mutex_args.owner = 0; 1316 + mutex_args.count = 0; 1317 + stress_mutex = ioctl(stress_device, NTSYNC_IOC_CREATE_MUTEX, &mutex_args); 1318 + EXPECT_LE(0, stress_mutex); 1319 + 1320 + event_args.manual = 1; 1321 + event_args.signaled = 0; 1322 + stress_start_event = ioctl(stress_device, NTSYNC_IOC_CREATE_EVENT, &event_args); 1323 + EXPECT_LE(0, stress_start_event); 1324 + 1325 + for (i = 0; i < STRESS_THREADS; ++i) 1326 + pthread_create(&threads[i], NULL, stress_thread, NULL); 1327 + 1328 + ret = ioctl(stress_start_event, NTSYNC_IOC_EVENT_SET, &signaled); 1329 + EXPECT_EQ(0, ret); 1330 + 1331 + for (i = 0; i < STRESS_THREADS; ++i) { 1332 + ret = pthread_join(threads[i], NULL); 1333 + EXPECT_EQ(0, ret); 1334 + } 1335 + 1336 + EXPECT_EQ(STRESS_LOOPS * STRESS_THREADS, stress_counter); 1337 + 1338 + close(stress_start_event); 1339 + close(stress_mutex); 1340 + close(stress_device); 1341 + } 1342 + 1271 1343 TEST_HARNESS_MAIN