Skip to content

Commit d5694db

Browse files
committed
selftests/coredump: add debug logging to test helpers
so we can easily figure out why something failed. Link: https://patch.msgid.link/20251028-work-coredump-signal-v1-17-ca449b7b7aa0@kernel.org Reviewed-by: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@canonical.com> Signed-off-by: Christian Brauner <brauner@kernel.org>
1 parent 305e6b1 commit d5694db

1 file changed

Lines changed: 44 additions & 11 deletions

File tree

tools/testing/selftests/coredump/coredump_test_helpers.c

Lines changed: 44 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -131,17 +131,26 @@ int get_peer_pidfd(int fd)
131131
int ret = getsockopt(fd, SOL_SOCKET, SO_PEERPIDFD, &fd_peer_pidfd,
132132
&fd_peer_pidfd_len);
133133
if (ret < 0) {
134-
fprintf(stderr, "%m - Failed to retrieve peer pidfd for coredump socket connection\n");
134+
fprintf(stderr, "get_peer_pidfd: getsockopt(SO_PEERPIDFD) failed: %m\n");
135135
return -1;
136136
}
137+
fprintf(stderr, "get_peer_pidfd: successfully retrieved pidfd %d\n", fd_peer_pidfd);
137138
return fd_peer_pidfd;
138139
}
139140

140141
bool get_pidfd_info(int fd_peer_pidfd, struct pidfd_info *info)
141142
{
143+
int ret;
142144
memset(info, 0, sizeof(*info));
143145
info->mask = PIDFD_INFO_EXIT | PIDFD_INFO_COREDUMP | PIDFD_INFO_COREDUMP_SIGNAL;
144-
return ioctl(fd_peer_pidfd, PIDFD_GET_INFO, info) == 0;
146+
ret = ioctl(fd_peer_pidfd, PIDFD_GET_INFO, info);
147+
if (ret < 0) {
148+
fprintf(stderr, "get_pidfd_info: ioctl(PIDFD_GET_INFO) failed: %m\n");
149+
return false;
150+
}
151+
fprintf(stderr, "get_pidfd_info: mask=0x%llx, coredump_mask=0x%x, coredump_signal=%d\n",
152+
(unsigned long long)info->mask, info->coredump_mask, info->coredump_signal);
153+
return true;
145154
}
146155

147156
/* Protocol helper functions */
@@ -198,14 +207,23 @@ bool read_coredump_req(int fd, struct coredump_req *req)
198207

199208
/* Peek the size of the coredump request. */
200209
ret = recv(fd, req, field_size, MSG_PEEK | MSG_WAITALL);
201-
if (ret != field_size)
210+
if (ret != field_size) {
211+
fprintf(stderr, "read_coredump_req: peek failed (got %zd, expected %zu): %m\n",
212+
ret, field_size);
202213
return false;
214+
}
203215
kernel_size = req->size;
204216

205-
if (kernel_size < COREDUMP_ACK_SIZE_VER0)
217+
if (kernel_size < COREDUMP_ACK_SIZE_VER0) {
218+
fprintf(stderr, "read_coredump_req: kernel_size %zu < min %d\n",
219+
kernel_size, COREDUMP_ACK_SIZE_VER0);
206220
return false;
207-
if (kernel_size >= PAGE_SIZE)
221+
}
222+
if (kernel_size >= PAGE_SIZE) {
223+
fprintf(stderr, "read_coredump_req: kernel_size %zu >= PAGE_SIZE %d\n",
224+
kernel_size, PAGE_SIZE);
208225
return false;
226+
}
209227

210228
/* Use the minimum of user and kernel size to read the full request. */
211229
user_size = sizeof(struct coredump_req);
@@ -295,25 +313,35 @@ void process_coredump_worker(int fd_coredump, int fd_peer_pidfd, int fd_core_fil
295313

296314
/* Set socket to non-blocking mode for edge-triggered epoll */
297315
flags = fcntl(fd_coredump, F_GETFL, 0);
298-
if (flags < 0)
316+
if (flags < 0) {
317+
fprintf(stderr, "Worker: fcntl(F_GETFL) failed: %m\n");
299318
goto out;
300-
if (fcntl(fd_coredump, F_SETFL, flags | O_NONBLOCK) < 0)
319+
}
320+
if (fcntl(fd_coredump, F_SETFL, flags | O_NONBLOCK) < 0) {
321+
fprintf(stderr, "Worker: fcntl(F_SETFL, O_NONBLOCK) failed: %m\n");
301322
goto out;
323+
}
302324

303325
epfd = epoll_create1(0);
304-
if (epfd < 0)
326+
if (epfd < 0) {
327+
fprintf(stderr, "Worker: epoll_create1() failed: %m\n");
305328
goto out;
329+
}
306330

307331
ev.events = EPOLLIN | EPOLLRDHUP | EPOLLET;
308332
ev.data.fd = fd_coredump;
309-
if (epoll_ctl(epfd, EPOLL_CTL_ADD, fd_coredump, &ev) < 0)
333+
if (epoll_ctl(epfd, EPOLL_CTL_ADD, fd_coredump, &ev) < 0) {
334+
fprintf(stderr, "Worker: epoll_ctl(EPOLL_CTL_ADD) failed: %m\n");
310335
goto out;
336+
}
311337

312338
for (;;) {
313339
struct epoll_event events[1];
314340
int n = epoll_wait(epfd, events, 1, -1);
315-
if (n < 0)
341+
if (n < 0) {
342+
fprintf(stderr, "Worker: epoll_wait() failed: %m\n");
316343
break;
344+
}
317345

318346
if (events[0].events & (EPOLLIN | EPOLLRDHUP)) {
319347
for (;;) {
@@ -322,19 +350,24 @@ void process_coredump_worker(int fd_coredump, int fd_peer_pidfd, int fd_core_fil
322350
if (bytes_read < 0) {
323351
if (errno == EAGAIN || errno == EWOULDBLOCK)
324352
break;
353+
fprintf(stderr, "Worker: read() failed: %m\n");
325354
goto out;
326355
}
327356
if (bytes_read == 0)
328357
goto done;
329358
ssize_t bytes_write = write(fd_core_file, buffer, bytes_read);
330-
if (bytes_write != bytes_read)
359+
if (bytes_write != bytes_read) {
360+
fprintf(stderr, "Worker: write() failed (read=%zd, write=%zd): %m\n",
361+
bytes_read, bytes_write);
331362
goto out;
363+
}
332364
}
333365
}
334366
}
335367

336368
done:
337369
exit_code = EXIT_SUCCESS;
370+
fprintf(stderr, "Worker: completed successfully\n");
338371
out:
339372
if (epfd >= 0)
340373
close(epfd);

0 commit comments

Comments
 (0)