X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=tests%2Fregression%2Fkernel%2Fselect_poll_epoll.c;h=d0d7e4aeafae124566b73157c2565a4aef4a1bcb;hb=abfc9c9b42c8cafee93f23ddb70a19f3cce21985;hp=33b8cb5d5d100d29ac18777ba68ae996e1ced057;hpb=9d16b343fb9e781fc8d8fa3c448a3f382306dd33;p=lttng-tools.git diff --git a/tests/regression/kernel/select_poll_epoll.c b/tests/regression/kernel/select_poll_epoll.c index 33b8cb5d5..d0d7e4aea 100644 --- a/tests/regression/kernel/select_poll_epoll.c +++ b/tests/regression/kernel/select_poll_epoll.c @@ -46,6 +46,7 @@ struct ppoll_thread_data { int value; }; +static void test_select_big(void) { fd_set rfds, wfds, exfds; @@ -95,6 +96,7 @@ end: return; } +static void test_pselect(void) { fd_set rfds; @@ -128,6 +130,7 @@ void test_pselect(void) } +static void test_select(void) { fd_set rfds; @@ -161,6 +164,7 @@ void test_select(void) } +static void test_poll(void) { struct pollfd ufds[NB_FD]; @@ -185,6 +189,7 @@ void test_poll(void) } } +static void test_ppoll(void) { struct pollfd ufds[NB_FD]; @@ -217,6 +222,7 @@ void test_ppoll(void) } } +static void test_ppoll_big(void) { struct pollfd ufds[MAX_FDS]; @@ -256,6 +262,7 @@ void test_ppoll_big(void) return; } +static void test_epoll(void) { int ret, epollfd; @@ -273,7 +280,7 @@ void test_epoll(void) ret = epoll_ctl(epollfd, EPOLL_CTL_ADD, wait_fd, &epoll_event); if (ret < 0) { perror("[epoll] add"); - goto end; + goto error; } if (timeout > 0) { @@ -294,10 +301,16 @@ void test_epoll(void) perror("epoll_wait"); } +error: + ret = close(epollfd); + if (ret) { + perror("close"); + } end: return; } +static void test_pepoll(void) { int ret, epollfd; @@ -315,7 +328,7 @@ void test_pepoll(void) ret = epoll_ctl(epollfd, EPOLL_CTL_ADD, wait_fd, &epoll_event); if (ret < 0) { perror("[eppoll] add"); - goto end; + goto error; } if (timeout > 0) { @@ -336,10 +349,16 @@ void test_pepoll(void) perror("epoll_pwait"); } +error: + ret = close(epollfd); + if (ret) { + perror("close"); + } end: return; } +static void run_working_cases(void) { int ret; @@ -386,6 +405,7 @@ end: * segfault (eventually with a "*** stack smashing detected ***" message). * The event should contain an array of 100 FDs filled with garbage. */ +static void ppoll_fds_buffer_overflow(void) { struct pollfd ufds[NB_FD]; @@ -417,6 +437,7 @@ void ppoll_fds_buffer_overflow(void) * cleanly fail with a "Invalid argument". * The event should contain an empty array of FDs and overflow = 1. */ +static void ppoll_fds_ulong_max(void) { struct pollfd ufds[NB_FD]; @@ -447,6 +468,7 @@ void ppoll_fds_ulong_max(void) * Pass an invalid file descriptor to pselect6(). The syscall should return * -EBADF. The recorded event should contain a "ret = -EBADF (-9)". */ +static void pselect_invalid_fd(void) { fd_set rfds; @@ -493,6 +515,7 @@ error: * Invalid pointer as writefds, should output a ppoll event * with 0 FDs. */ +static void pselect_invalid_pointer(void) { fd_set rfds; @@ -524,6 +547,7 @@ void pselect_invalid_pointer(void) * Pass an invalid pointer to epoll_pwait, should fail with * "Bad address", the event returns 0 FDs. */ +static void epoll_pwait_invalid_pointer(void) { int ret, epollfd; @@ -542,7 +566,7 @@ void epoll_pwait_invalid_pointer(void) ret = epoll_ctl(epollfd, EPOLL_CTL_ADD, wait_fd, &epoll_event); if (ret < 0) { perror("[eppoll] add"); - goto end; + goto error; } ret = syscall(SYS_epoll_pwait, epollfd, @@ -560,6 +584,11 @@ void epoll_pwait_invalid_pointer(void) perror("# epoll_pwait"); } +error: + ret = close(epollfd); + if (ret) { + perror("close"); + } end: return; } @@ -568,6 +597,7 @@ end: * Set maxevents to INT_MAX, should output "Invalid argument" * The event should return an empty array. */ +static void epoll_pwait_int_max(void) { int ret, epollfd; @@ -585,7 +615,7 @@ void epoll_pwait_int_max(void) ret = epoll_ctl(epollfd, EPOLL_CTL_ADD, wait_fd, &epoll_event); if (ret < 0) { perror("[eppoll] add"); - goto end; + goto error; } ret = syscall(SYS_epoll_pwait, epollfd, &epoll_event, INT_MAX, -1, @@ -603,10 +633,16 @@ void epoll_pwait_int_max(void) perror("# epoll_pwait"); } +error: + ret = close(epollfd); + if (ret) { + perror("close"); + } end: return; } +static void *ppoll_writer(void *arg) { struct ppoll_thread_data *data = (struct ppoll_thread_data *) arg; @@ -620,6 +656,7 @@ void *ppoll_writer(void *arg) return NULL; } +static void do_ppoll(int *fds, struct pollfd *ufds) { int i, ret; @@ -649,6 +686,7 @@ void do_ppoll(int *fds, struct pollfd *ufds) } } +static void stress_ppoll(int *fds, int value) { pthread_t writer; @@ -690,6 +728,7 @@ end: * * ppoll should work as expected and the trace should be readable at the end. */ +static void ppoll_concurrent_write(void) { int i, ret, fds[MAX_FDS]; @@ -715,6 +754,7 @@ void ppoll_concurrent_write(void) return; } +static void *epoll_pwait_writer(void *addr) { srand(time(NULL)); @@ -732,6 +772,7 @@ void *epoll_pwait_writer(void *addr) * buffer allocated for the returned data. This should randomly segfault. * The trace should be readable and no kernel OOPS should occur. */ +static void epoll_pwait_concurrent_munmap(void) { int ret, epollfd, i, fds[MAX_FDS]; @@ -753,7 +794,7 @@ void epoll_pwait_concurrent_munmap(void) -1, 0); if (epoll_event == MAP_FAILED) { perror("mmap"); - goto end; + goto error; } for (i = 0; i < MAX_FDS; i++) { @@ -766,7 +807,7 @@ void epoll_pwait_concurrent_munmap(void) ret = epoll_ctl(epollfd, EPOLL_CTL_ADD, fds[i], epoll_event); if (ret < 0) { perror("[eppoll] add"); - goto end_unmap; + goto error_unmap; } } stop_thread = 0; @@ -774,7 +815,7 @@ void epoll_pwait_concurrent_munmap(void) (void *) epoll_event); if (ret != 0) { fprintf(stderr, "[error] pthread_create\n"); - goto end_unmap; + goto error_unmap; } ret = epoll_pwait(epollfd, epoll_event, 1, 1, NULL); @@ -795,9 +836,9 @@ void epoll_pwait_concurrent_munmap(void) ret = pthread_join(writer, NULL); if (ret) { fprintf(stderr, "[error] pthread_join\n"); - goto end_unmap; + goto error_unmap; } -end_unmap: +error_unmap: for (i = 0; i < MAX_FDS; i++) { ret = close(fds[i]); if (ret != 0) { @@ -810,19 +851,16 @@ end_unmap: perror("munmap"); } +error: + ret = close(epollfd); + if (ret) { + perror("close"); + } end: return; } -void usage(poptContext optCon, int exitcode, char *error, char *addl) -{ - poptPrintUsage(optCon, stderr, 0); - if (error) { - fprintf(stderr, "%s: %s\n", error, addl); - } - exit(exitcode); -} - +static void print_list(void) { fprintf(stderr, "Test list (-t X):\n");