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

Configure Feed

Select the types of activity you want to include in your feed.

selftests: ntsync: Add some tests for wakeup signaling via alerts.

Expand the alert tests to cover alerting a thread mid-wait, to test that the
relevant scheduling logic works correctly.

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

authored by

Elizabeth Figura and committed by
Greg Kroah-Hartman
c52b9cb1 dd914e0d

+62
+62
tools/testing/selftests/drivers/ntsync/ntsync.c
··· 1063 1063 TEST(alert_any) 1064 1064 { 1065 1065 struct ntsync_event_args event_args = {0}; 1066 + struct ntsync_wait_args wait_args = {0}; 1066 1067 struct ntsync_sem_args sem_args = {0}; 1067 1068 __u32 index, count, signaled; 1069 + struct wait_args thread_args; 1068 1070 int objs[2], event, fd, ret; 1071 + pthread_t thread; 1069 1072 1070 1073 fd = open("/dev/ntsync", O_CLOEXEC | O_RDONLY); 1071 1074 ASSERT_LE(0, fd); ··· 1110 1107 EXPECT_EQ(0, ret); 1111 1108 EXPECT_EQ(2, index); 1112 1109 1110 + /* test wakeup via alert */ 1111 + 1112 + ret = ioctl(event, NTSYNC_IOC_EVENT_RESET, &signaled); 1113 + EXPECT_EQ(0, ret); 1114 + 1115 + wait_args.timeout = get_abs_timeout(1000); 1116 + wait_args.objs = (uintptr_t)objs; 1117 + wait_args.count = 2; 1118 + wait_args.owner = 123; 1119 + wait_args.index = 0xdeadbeef; 1120 + wait_args.alert = event; 1121 + thread_args.fd = fd; 1122 + thread_args.args = &wait_args; 1123 + thread_args.request = NTSYNC_IOC_WAIT_ANY; 1124 + ret = pthread_create(&thread, NULL, wait_thread, &thread_args); 1125 + EXPECT_EQ(0, ret); 1126 + 1127 + ret = wait_for_thread(thread, 100); 1128 + EXPECT_EQ(ETIMEDOUT, ret); 1129 + 1130 + ret = ioctl(event, NTSYNC_IOC_EVENT_SET, &signaled); 1131 + EXPECT_EQ(0, ret); 1132 + 1133 + ret = wait_for_thread(thread, 100); 1134 + EXPECT_EQ(0, ret); 1135 + EXPECT_EQ(0, thread_args.ret); 1136 + EXPECT_EQ(2, wait_args.index); 1137 + 1113 1138 close(event); 1114 1139 1115 1140 /* test with an auto-reset event */ ··· 1174 1143 TEST(alert_all) 1175 1144 { 1176 1145 struct ntsync_event_args event_args = {0}; 1146 + struct ntsync_wait_args wait_args = {0}; 1177 1147 struct ntsync_sem_args sem_args = {0}; 1148 + struct wait_args thread_args; 1178 1149 __u32 index, count, signaled; 1179 1150 int objs[2], event, fd, ret; 1151 + pthread_t thread; 1180 1152 1181 1153 fd = open("/dev/ntsync", O_CLOEXEC | O_RDONLY); 1182 1154 ASSERT_LE(0, fd); ··· 1206 1172 ret = wait_all_alert(fd, 2, objs, 123, event, &index); 1207 1173 EXPECT_EQ(0, ret); 1208 1174 EXPECT_EQ(2, index); 1175 + 1176 + /* test wakeup via alert */ 1177 + 1178 + ret = ioctl(event, NTSYNC_IOC_EVENT_RESET, &signaled); 1179 + EXPECT_EQ(0, ret); 1180 + 1181 + wait_args.timeout = get_abs_timeout(1000); 1182 + wait_args.objs = (uintptr_t)objs; 1183 + wait_args.count = 2; 1184 + wait_args.owner = 123; 1185 + wait_args.index = 0xdeadbeef; 1186 + wait_args.alert = event; 1187 + thread_args.fd = fd; 1188 + thread_args.args = &wait_args; 1189 + thread_args.request = NTSYNC_IOC_WAIT_ALL; 1190 + ret = pthread_create(&thread, NULL, wait_thread, &thread_args); 1191 + EXPECT_EQ(0, ret); 1192 + 1193 + ret = wait_for_thread(thread, 100); 1194 + EXPECT_EQ(ETIMEDOUT, ret); 1195 + 1196 + ret = ioctl(event, NTSYNC_IOC_EVENT_SET, &signaled); 1197 + EXPECT_EQ(0, ret); 1198 + 1199 + ret = wait_for_thread(thread, 100); 1200 + EXPECT_EQ(0, ret); 1201 + EXPECT_EQ(0, thread_args.ret); 1202 + EXPECT_EQ(2, wait_args.index); 1209 1203 1210 1204 close(event); 1211 1205