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 tests for alertable waits.

Test the "alert" functionality of NTSYNC_IOC_WAIT_ALL and NTSYNC_IOC_WAIT_ANY,
when a wait is woken with an alert and when it is woken by an object.

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

authored by

Elizabeth Figura and committed by
Greg Kroah-Hartman
dd914e0d a2e5a8ce

+164 -3
+164 -3
tools/testing/selftests/drivers/ntsync/ntsync.c
··· 95 95 }) 96 96 97 97 static int wait_objs(int fd, unsigned long request, __u32 count, 98 - const int *objs, __u32 owner, __u32 *index) 98 + const int *objs, __u32 owner, int alert, __u32 *index) 99 99 { 100 100 struct ntsync_wait_args args = {0}; 101 101 struct timespec timeout; ··· 108 108 args.objs = (uintptr_t)objs; 109 109 args.owner = owner; 110 110 args.index = 0xdeadbeef; 111 + args.alert = alert; 111 112 ret = ioctl(fd, request, &args); 112 113 *index = args.index; 113 114 return ret; ··· 116 115 117 116 static int wait_any(int fd, __u32 count, const int *objs, __u32 owner, __u32 *index) 118 117 { 119 - return wait_objs(fd, NTSYNC_IOC_WAIT_ANY, count, objs, owner, index); 118 + return wait_objs(fd, NTSYNC_IOC_WAIT_ANY, count, objs, owner, 0, index); 120 119 } 121 120 122 121 static int wait_all(int fd, __u32 count, const int *objs, __u32 owner, __u32 *index) 123 122 { 124 - return wait_objs(fd, NTSYNC_IOC_WAIT_ALL, count, objs, owner, index); 123 + return wait_objs(fd, NTSYNC_IOC_WAIT_ALL, count, objs, owner, 0, index); 124 + } 125 + 126 + static int wait_any_alert(int fd, __u32 count, const int *objs, 127 + __u32 owner, int alert, __u32 *index) 128 + { 129 + return wait_objs(fd, NTSYNC_IOC_WAIT_ANY, 130 + count, objs, owner, alert, index); 131 + } 132 + 133 + static int wait_all_alert(int fd, __u32 count, const int *objs, 134 + __u32 owner, int alert, __u32 *index) 135 + { 136 + return wait_objs(fd, NTSYNC_IOC_WAIT_ALL, 137 + count, objs, owner, alert, index); 125 138 } 126 139 127 140 TEST(semaphore_state) ··· 1056 1041 EXPECT_EQ(0, ret); 1057 1042 EXPECT_EQ(-1, thread_args.ret); 1058 1043 EXPECT_EQ(ETIMEDOUT, thread_args.err); 1044 + 1045 + close(fd); 1046 + } 1047 + 1048 + TEST(alert_any) 1049 + { 1050 + struct ntsync_event_args event_args = {0}; 1051 + struct ntsync_sem_args sem_args = {0}; 1052 + __u32 index, count, signaled; 1053 + int objs[2], event, fd, ret; 1054 + 1055 + fd = open("/dev/ntsync", O_CLOEXEC | O_RDONLY); 1056 + ASSERT_LE(0, fd); 1057 + 1058 + sem_args.count = 0; 1059 + sem_args.max = 2; 1060 + objs[0] = ioctl(fd, NTSYNC_IOC_CREATE_SEM, &sem_args); 1061 + EXPECT_LE(0, objs[0]); 1062 + 1063 + sem_args.count = 1; 1064 + sem_args.max = 2; 1065 + objs[1] = ioctl(fd, NTSYNC_IOC_CREATE_SEM, &sem_args); 1066 + EXPECT_LE(0, objs[1]); 1067 + 1068 + event_args.manual = true; 1069 + event_args.signaled = true; 1070 + event = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &event_args); 1071 + EXPECT_LE(0, event); 1072 + 1073 + ret = wait_any_alert(fd, 0, NULL, 123, event, &index); 1074 + EXPECT_EQ(0, ret); 1075 + EXPECT_EQ(0, index); 1076 + 1077 + ret = ioctl(event, NTSYNC_IOC_EVENT_RESET, &signaled); 1078 + EXPECT_EQ(0, ret); 1079 + 1080 + ret = wait_any_alert(fd, 0, NULL, 123, event, &index); 1081 + EXPECT_EQ(-1, ret); 1082 + EXPECT_EQ(ETIMEDOUT, errno); 1083 + 1084 + ret = ioctl(event, NTSYNC_IOC_EVENT_SET, &signaled); 1085 + EXPECT_EQ(0, ret); 1086 + 1087 + ret = wait_any_alert(fd, 2, objs, 123, event, &index); 1088 + EXPECT_EQ(0, ret); 1089 + EXPECT_EQ(1, index); 1090 + 1091 + ret = wait_any_alert(fd, 2, objs, 123, event, &index); 1092 + EXPECT_EQ(0, ret); 1093 + EXPECT_EQ(2, index); 1094 + 1095 + close(event); 1096 + 1097 + /* test with an auto-reset event */ 1098 + 1099 + event_args.manual = false; 1100 + event_args.signaled = true; 1101 + event = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &event_args); 1102 + EXPECT_LE(0, event); 1103 + 1104 + count = 1; 1105 + ret = release_sem(objs[0], &count); 1106 + EXPECT_EQ(0, ret); 1107 + 1108 + ret = wait_any_alert(fd, 2, objs, 123, event, &index); 1109 + EXPECT_EQ(0, ret); 1110 + EXPECT_EQ(0, index); 1111 + 1112 + ret = wait_any_alert(fd, 2, objs, 123, event, &index); 1113 + EXPECT_EQ(0, ret); 1114 + EXPECT_EQ(2, index); 1115 + 1116 + ret = wait_any_alert(fd, 2, objs, 123, event, &index); 1117 + EXPECT_EQ(-1, ret); 1118 + EXPECT_EQ(ETIMEDOUT, errno); 1119 + 1120 + close(event); 1121 + 1122 + close(objs[0]); 1123 + close(objs[1]); 1124 + 1125 + close(fd); 1126 + } 1127 + 1128 + TEST(alert_all) 1129 + { 1130 + struct ntsync_event_args event_args = {0}; 1131 + struct ntsync_sem_args sem_args = {0}; 1132 + __u32 index, count, signaled; 1133 + int objs[2], event, fd, ret; 1134 + 1135 + fd = open("/dev/ntsync", O_CLOEXEC | O_RDONLY); 1136 + ASSERT_LE(0, fd); 1137 + 1138 + sem_args.count = 2; 1139 + sem_args.max = 2; 1140 + objs[0] = ioctl(fd, NTSYNC_IOC_CREATE_SEM, &sem_args); 1141 + EXPECT_LE(0, objs[0]); 1142 + 1143 + sem_args.count = 1; 1144 + sem_args.max = 2; 1145 + objs[1] = ioctl(fd, NTSYNC_IOC_CREATE_SEM, &sem_args); 1146 + EXPECT_LE(0, objs[1]); 1147 + 1148 + event_args.manual = true; 1149 + event_args.signaled = true; 1150 + event = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &event_args); 1151 + EXPECT_LE(0, event); 1152 + 1153 + ret = wait_all_alert(fd, 2, objs, 123, event, &index); 1154 + EXPECT_EQ(0, ret); 1155 + EXPECT_EQ(0, index); 1156 + 1157 + ret = wait_all_alert(fd, 2, objs, 123, event, &index); 1158 + EXPECT_EQ(0, ret); 1159 + EXPECT_EQ(2, index); 1160 + 1161 + close(event); 1162 + 1163 + /* test with an auto-reset event */ 1164 + 1165 + event_args.manual = false; 1166 + event_args.signaled = true; 1167 + event = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &event_args); 1168 + EXPECT_LE(0, event); 1169 + 1170 + count = 2; 1171 + ret = release_sem(objs[1], &count); 1172 + EXPECT_EQ(0, ret); 1173 + 1174 + ret = wait_all_alert(fd, 2, objs, 123, event, &index); 1175 + EXPECT_EQ(0, ret); 1176 + EXPECT_EQ(0, index); 1177 + 1178 + ret = wait_all_alert(fd, 2, objs, 123, event, &index); 1179 + EXPECT_EQ(0, ret); 1180 + EXPECT_EQ(2, index); 1181 + 1182 + ret = wait_all_alert(fd, 2, objs, 123, event, &index); 1183 + EXPECT_EQ(-1, ret); 1184 + EXPECT_EQ(ETIMEDOUT, errno); 1185 + 1186 + close(event); 1187 + 1188 + close(objs[0]); 1189 + close(objs[1]); 1059 1190 1060 1191 close(fd); 1061 1192 }