Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Page fault tracepoints can be disabled as with ubuntu-artful (see bel… #1034

Merged
merged 2 commits into from
Jan 12, 2018
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 13 additions & 4 deletions driver/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -196,9 +196,12 @@ static struct tracepoint *tp_sched_switch;
static struct tracepoint *tp_signal_deliver;
#endif
#ifdef CAPTURE_PAGE_FAULTS
// Even in kernels that can support page fault tracepoints, tracepoints may be
// disabled so check if g_fault_tracepoint_disabled is set.
static struct tracepoint *tp_page_fault_user;
static struct tracepoint *tp_page_fault_kernel;
static bool g_fault_tracepoint_registered;
static bool g_fault_tracepoint_disabled = false;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor: initializing a static to false is not good practice according to kernel coding conventions, if you run your patch against checkpatch.pl in the kernel tree it should complain.

#endif

#ifdef _DEBUG
Expand Down Expand Up @@ -1027,6 +1030,12 @@ static long ppm_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
#ifdef CAPTURE_PAGE_FAULTS
ASSERT(g_tracepoint_registered);

if (g_fault_tracepoint_disabled) {
ret = 0;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need to return an error here and propagate it to the user. If not, they could run sysdig --page-faults and silently fail.

pr_info("kernel page fault tracepoints are disabled\n");
goto cleanup_ioctl;
}

if (!g_fault_tracepoint_registered) {
ret = compat_register_trace(page_fault_probe, "page_fault_user", tp_page_fault_user);
if (ret) {
Expand Down Expand Up @@ -2199,12 +2208,12 @@ static int get_tracepoint_handles(void)
#endif
#ifdef CAPTURE_PAGE_FAULTS
if (!tp_page_fault_user) {
pr_err("failed to find page_fault_user tracepoint\n");
return -ENOENT;
pr_notice("failed to find page_fault_user tracepoint, disabling page-faults\n");
g_fault_tracepoint_disabled = true;
}
if (!tp_page_fault_kernel) {
pr_err("failed to find page_fault_kernel tracepoint\n");
return -ENOENT;
pr_notice("failed to find page_fault_kernel tracepoint, disabling page-faults\n");
g_fault_tracepoint_disabled = true;
}
#endif

Expand Down