1 // SPDX-License-Identifier: GPL-2.0 2 /* Copyright (c) 2020, Oracle and/or its affiliates. */ 3 4 #include <test_progs.h> 5 6 #include "trace_printk.skel.h" 7 8 #define TRACEBUF "/sys/kernel/debug/tracing/trace_pipe" 9 #define SEARCHMSG "testing,testing" 10 11 void test_trace_printk(void) 12 { 13 int err, iter = 0, duration = 0, found = 0; 14 struct trace_printk__bss *bss; 15 struct trace_printk *skel; 16 char *buf = NULL; 17 FILE *fp = NULL; 18 size_t buflen; 19 20 skel = trace_printk__open(); 21 if (CHECK(!skel, "skel_open", "failed to open skeleton\n")) 22 return; 23 24 err = trace_printk__load(skel); 25 if (CHECK(err, "skel_load", "failed to load skeleton: %d\n", err)) 26 goto cleanup; 27 28 bss = skel->bss; 29 30 err = trace_printk__attach(skel); 31 if (CHECK(err, "skel_attach", "skeleton attach failed: %d\n", err)) 32 goto cleanup; 33 34 fp = fopen(TRACEBUF, "r"); 35 if (CHECK(fp == NULL, "could not open trace buffer", 36 "error %d opening %s", errno, TRACEBUF)) 37 goto cleanup; 38 39 /* We do not want to wait forever if this test fails... */ 40 fcntl(fileno(fp), F_SETFL, O_NONBLOCK); 41 42 /* wait for tracepoint to trigger */ 43 usleep(1); 44 trace_printk__detach(skel); 45 46 if (CHECK(bss->trace_printk_ran == 0, 47 "bpf_trace_printk never ran", 48 "ran == %d", bss->trace_printk_ran)) 49 goto cleanup; 50 51 if (CHECK(bss->trace_printk_ret <= 0, 52 "bpf_trace_printk returned <= 0 value", 53 "got %d", bss->trace_printk_ret)) 54 goto cleanup; 55 56 /* verify our search string is in the trace buffer */ 57 while (getline(&buf, &buflen, fp) >= 0 || errno == EAGAIN) { 58 if (strstr(buf, SEARCHMSG) != NULL) 59 found++; 60 if (found == bss->trace_printk_ran) 61 break; 62 if (++iter > 1000) 63 break; 64 } 65 66 if (CHECK(!found, "message from bpf_trace_printk not found", 67 "no instance of %s in %s", SEARCHMSG, TRACEBUF)) 68 goto cleanup; 69 70 cleanup: 71 trace_printk__destroy(skel); 72 free(buf); 73 if (fp) 74 fclose(fp); 75 } 76