mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-09-01 06:39:05 +00:00
selftests/tracing: Add hist poll() support test
Add a testcase for poll() on hist file. This introduces a helper binary to the ftracetest, because there is no good way to reliably execute poll() on hist file. Cc: Shuah Khan <shuah@kernel.org> Cc: Tom Zanussi <zanussi@kernel.org> Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Link: https://lore.kernel.org/173547867935.569911.10127126796879854182.stgit@devnote2 Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> Reviewed-by: Shuah Khan <skhan@linuxfoundation.org> Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
This commit is contained in:
parent
66fc6f521a
commit
80c3e28528
@ -6,4 +6,6 @@ TEST_PROGS := ftracetest-ktap
|
||||
TEST_FILES := test.d settings
|
||||
EXTRA_CLEAN := $(OUTPUT)/logs/*
|
||||
|
||||
TEST_GEN_PROGS = poll
|
||||
|
||||
include ../lib.mk
|
||||
|
74
tools/testing/selftests/ftrace/poll.c
Normal file
74
tools/testing/selftests/ftrace/poll.c
Normal file
@ -0,0 +1,74 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Simple poll on a file.
|
||||
*
|
||||
* Copyright (c) 2024 Google LLC.
|
||||
*/
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <poll.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define BUFSIZE 4096
|
||||
|
||||
/*
|
||||
* Usage:
|
||||
* poll [-I|-P] [-t timeout] FILE
|
||||
*/
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct pollfd pfd = {.events = POLLIN};
|
||||
char buf[BUFSIZE];
|
||||
int timeout = -1;
|
||||
int ret, opt;
|
||||
|
||||
while ((opt = getopt(argc, argv, "IPt:")) != -1) {
|
||||
switch (opt) {
|
||||
case 'I':
|
||||
pfd.events = POLLIN;
|
||||
break;
|
||||
case 'P':
|
||||
pfd.events = POLLPRI;
|
||||
break;
|
||||
case 't':
|
||||
timeout = atoi(optarg);
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "Usage: %s [-I|-P] [-t timeout] FILE\n",
|
||||
argv[0]);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
if (optind >= argc) {
|
||||
fprintf(stderr, "Error: Polling file is not specified\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
pfd.fd = open(argv[optind], O_RDONLY);
|
||||
if (pfd.fd < 0) {
|
||||
fprintf(stderr, "failed to open %s", argv[optind]);
|
||||
perror("open");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Reset poll by read if POLLIN is specified. */
|
||||
if (pfd.events & POLLIN)
|
||||
do {} while (read(pfd.fd, buf, BUFSIZE) == BUFSIZE);
|
||||
|
||||
ret = poll(&pfd, 1, timeout);
|
||||
if (ret < 0 && errno != EINTR) {
|
||||
perror("poll");
|
||||
return -1;
|
||||
}
|
||||
close(pfd.fd);
|
||||
|
||||
/* If timeout happned (ret == 0), exit code is 1 */
|
||||
if (ret == 0)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,74 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# description: event trigger - test poll wait on histogram
|
||||
# requires: set_event events/sched/sched_process_free/trigger events/sched/sched_process_free/hist
|
||||
# flags: instance
|
||||
|
||||
POLL=${FTRACETEST_ROOT}/poll
|
||||
|
||||
if [ ! -x ${POLL} ]; then
|
||||
echo "poll program is not compiled!"
|
||||
exit_unresolved
|
||||
fi
|
||||
|
||||
EVENT=events/sched/sched_process_free/
|
||||
|
||||
# Check poll ops is supported. Before implementing poll on hist file, it
|
||||
# returns soon with POLLIN | POLLOUT, but not POLLPRI.
|
||||
|
||||
# This must wait >1 sec and return 1 (timeout).
|
||||
set +e
|
||||
${POLL} -I -t 1000 ${EVENT}/hist
|
||||
ret=$?
|
||||
set -e
|
||||
if [ ${ret} != 1 ]; then
|
||||
echo "poll on hist file is not supported"
|
||||
exit_unsupported
|
||||
fi
|
||||
|
||||
# Test POLLIN
|
||||
echo > trace
|
||||
echo 'hist:key=comm if comm =="sleep"' > ${EVENT}/trigger
|
||||
echo 1 > ${EVENT}/enable
|
||||
|
||||
# This sleep command will exit after 2 seconds.
|
||||
sleep 2 &
|
||||
BGPID=$!
|
||||
# if timeout happens, poll returns 1.
|
||||
${POLL} -I -t 4000 ${EVENT}/hist
|
||||
echo 0 > tracing_on
|
||||
|
||||
if [ -d /proc/${BGPID} ]; then
|
||||
echo "poll exits too soon"
|
||||
kill -KILL ${BGPID} ||:
|
||||
exit_fail
|
||||
fi
|
||||
|
||||
if ! grep -qw "sleep" trace; then
|
||||
echo "poll exits before event happens"
|
||||
exit_fail
|
||||
fi
|
||||
|
||||
# Test POLLPRI
|
||||
echo > trace
|
||||
echo 1 > tracing_on
|
||||
|
||||
# This sleep command will exit after 2 seconds.
|
||||
sleep 2 &
|
||||
BGPID=$!
|
||||
# if timeout happens, poll returns 1.
|
||||
${POLL} -P -t 4000 ${EVENT}/hist
|
||||
echo 0 > tracing_on
|
||||
|
||||
if [ -d /proc/${BGPID} ]; then
|
||||
echo "poll exits too soon"
|
||||
kill -KILL ${BGPID} ||:
|
||||
exit_fail
|
||||
fi
|
||||
|
||||
if ! grep -qw "sleep" trace; then
|
||||
echo "poll exits before event happens"
|
||||
exit_fail
|
||||
fi
|
||||
|
||||
exit_pass
|
Loading…
Reference in New Issue
Block a user