Commit 80c3e285 authored by Masami Hiramatsu (Google)'s avatar Masami Hiramatsu (Google) Committed by Steven Rostedt (Google)
Browse files

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: default avatarMasami Hiramatsu (Google) <mhiramat@kernel.org>
Reviewed-by: default avatarShuah Khan <skhan@linuxfoundation.org>
Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
parent 66fc6f52
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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 −0
Original line number Diff line number Diff line
// 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;
}
+74 −0
Original line number Diff line number Diff line
#!/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