This is to try and mitigate the limitation found here:
https://bugs.lttng.org/issues/1261
Using an argument ensures that the path is not in the .rodata section of
the executable and reduces the chance that the kernel tracer incurs a
page fault when attempting to serialize the path argument.
The path is pre-faulted to mitigate the problem described in #1261.
Fixes #1261
Signed-off-by: Jonathan Rajotte <jonathan.rajotte-julien@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Change-Id: I6b6173ee5d8b33dcdf1cc391db9d1eafe00f90b9
Depends-on: lttng-ust: I5a800fc92e588c2a6a0e26282b0ad5f31c044479
function run_workload()
{
local TEST_APP=$1
function run_workload()
{
local TEST_APP=$1
+ # shift the first argument, passing along the other args if any to the
+ # test app.
+ shift
local start_file_sync
start_file_sync=$(mktemp -u)
lttng_untrack_all
local start_file_sync
start_file_sync=$(mktemp -u)
lttng_untrack_all
- ./"$TEST_APP" "$start_file_sync" &
+ ./"$TEST_APP" "$start_file_sync" "$@" &
PID=$!
lttng_track_pid $PID
PID=$!
lttng_track_pid $PID
lttng_enable_kernel_syscall_ok "$SESSION_NAME" "$EVENT_NAME" "$CHANNEL_NAME"
add_context_kernel_ok "$SESSION_NAME" "$CHANNEL_NAME" "callstack-kernel"
lttng_enable_kernel_syscall_ok "$SESSION_NAME" "$EVENT_NAME" "$CHANNEL_NAME"
add_context_kernel_ok "$SESSION_NAME" "$CHANNEL_NAME" "callstack-kernel"
- run_workload $TEST_APP_KERNELSPACE
+ run_workload "$TEST_APP_KERNELSPACE" "/proc/cpuinfo" "/proc/cmdline"
destroy_lttng_session_ok "$SESSION_NAME"
destroy_lttng_session_ok "$SESSION_NAME"
lttng_untrack_kernel_all_ok
# Launch the testapp and save its Process ID
lttng_untrack_kernel_all_ok
# Launch the testapp and save its Process ID
- ./"$TESTCMD" "$start_file_sync" &
+ ./"$TESTCMD" "$start_file_sync" "/proc/cpuinfo" "/proc/cmdline" &
PID=$!
# Set LTTng to track this PID and start the tracing
PID=$!
# Set LTTng to track this PID and start the tracing
int main(int argc, char **argv)
{
int ret;
int main(int argc, char **argv)
{
int ret;
+ const char *start_file, *path1, *path2;
fprintf(stderr, "Error: Missing argument\n");
fprintf(stderr, "Error: Missing argument\n");
+ fprintf(stderr, "USAGE: %s PATH_WAIT_FILE PATH1_TO_OPEN PATH2_TO_OPEN\n", argv[0]);
fprintf(stderr, "USAGE: %s PATH_WAIT_FILE\n", argv[0]);
ret = -1;
goto error;
}
start_file = argv[1];
fprintf(stderr, "USAGE: %s PATH_WAIT_FILE\n", argv[0]);
ret = -1;
goto error;
}
start_file = argv[1];
+ path1 = argv[2];
+ path2 = argv[3];
/*
* Wait for the start_file to be created by an external process
/*
* Wait for the start_file to be created by an external process
* Start generating syscalls. We use syscall(2) to prevent libc to change
* the underlying syscall. e.g. calling openat(2) instead of open(2).
*/
* Start generating syscalls. We use syscall(2) to prevent libc to change
* the underlying syscall. e.g. calling openat(2) instead of open(2).
*/
- ret = open_read_close("/proc/cpuinfo");
+ ret = open_read_close(path1);
if (ret == -1) {
ret = -1;
goto error;
}
if (ret == -1) {
ret = -1;
goto error;
}
- ret = open_read_close("/proc/cmdline");
+ ret = open_read_close(path2);
if (ret == -1) {
ret = -1;
goto error;
if (ret == -1) {
ret = -1;
goto error;