case LTTNG_KERNEL_CONTEXT_MIGRATABLE:
context_type_string = config_event_context_migratable;
break;
+ case LTTNG_KERNEL_CONTEXT_CALLSTACK_USER:
+ context_type_string = config_event_context_callstack_user;
+ break;
+ case LTTNG_KERNEL_CONTEXT_CALLSTACK_KERNEL:
+ context_type_string = config_event_context_callstack_kernel;
+ break;
default:
context_type_string = NULL;
}
}
static
+int save_kernel_function_event(struct config_writer *writer,
+ struct ltt_kernel_event *event)
+{
+ int ret;
+
+ ret = config_writer_open_element(writer, config_element_function_attributes);
+ if (ret) {
+ ret = LTTNG_ERR_SAVE_IO_FAIL;
+ goto end;
+ }
+
+ ret = config_writer_write_element_string(writer, config_element_name,
+ event->event->u.ftrace.symbol_name);
+ if (ret) {
+ ret = LTTNG_ERR_SAVE_IO_FAIL;
+ goto end;
+ }
+
+ /* /function attributes */
+ ret = config_writer_close_element(writer);
+ if (ret) {
+ ret = LTTNG_ERR_SAVE_IO_FAIL;
+ goto end;
+ }
+end:
+ return ret;
+}
+
+static
+int save_kernel_kprobe_event(struct config_writer *writer,
+ struct ltt_kernel_event *event)
+{
+ int ret;
+ const char *symbol_name;
+ uint64_t addr;
+ uint64_t offset;
+
+ switch (event->event->instrumentation) {
+ case LTTNG_KERNEL_KPROBE:
+ /*
+ * Comments in lttng-kernel.h mention that
+ * either addr or symbol_name are set, not both.
+ */
+ addr = event->event->u.kprobe.addr;
+ offset = event->event->u.kprobe.offset;
+ symbol_name = addr ? NULL : event->event->u.kprobe.symbol_name;
+ break;
+ case LTTNG_KERNEL_KRETPROBE:
+ addr = event->event->u.kretprobe.addr;
+ offset = event->event->u.kretprobe.offset;
+ symbol_name = event->event->u.kretprobe.symbol_name;
+ break;
+ default:
+ assert(1);
+ }
+
+ ret = config_writer_open_element(writer, config_element_probe_attributes);
+ if (ret) {
+ ret = LTTNG_ERR_SAVE_IO_FAIL;
+ goto end;
+ }
+
+ if (symbol_name) {
+ ret = config_writer_write_element_string(writer,
+ config_element_symbol_name, symbol_name);
+ if (ret) {
+ ret = LTTNG_ERR_SAVE_IO_FAIL;
+ goto end;
+ }
+ }
+
+ if (addr) {
+ ret = config_writer_write_element_unsigned_int( writer,
+ config_element_address, addr);
+ if (ret) {
+ ret = LTTNG_ERR_SAVE_IO_FAIL;
+ goto end;
+ }
+ }
+
+ if (offset) {
+ ret = config_writer_write_element_unsigned_int(writer,
+ config_element_offset, offset);
+ if (ret) {
+ ret = LTTNG_ERR_SAVE_IO_FAIL;
+ goto end;
+ }
+ }
+
+ ret = config_writer_close_element(writer);
+ if (ret) {
+ ret = LTTNG_ERR_SAVE_IO_FAIL;
+ goto end;
+ }
+end:
+ return ret;
+}
int save_kernel_event(struct config_writer *writer,
- struct ltt_kernel_event *event)
+ struct ltt_kernel_event *event)
{
int ret;
const char *instrumentation_type;
switch (event->event->instrumentation) {
case LTTNG_KERNEL_SYSCALL:
case LTTNG_KERNEL_FUNCTION:
- ret = config_writer_open_element(writer,
- config_element_function_attributes);
- if (ret) {
- ret = LTTNG_ERR_SAVE_IO_FAIL;
- goto end;
- }
-
- ret = config_writer_write_element_string(writer,
- config_element_name,
- event->event->u.ftrace.symbol_name);
+ ret = save_kernel_function_event(writer, event);
if (ret) {
- ret = LTTNG_ERR_SAVE_IO_FAIL;
- goto end;
- }
-
- /* /function attributes */
- ret = config_writer_close_element(writer);
- if (ret) {
- ret = LTTNG_ERR_SAVE_IO_FAIL;
goto end;
}
break;
case LTTNG_KERNEL_KPROBE:
case LTTNG_KERNEL_KRETPROBE:
- {
- const char *symbol_name;
- uint64_t addr;
- uint64_t offset;
-
- if (event->event->instrumentation ==
- LTTNG_KERNEL_KPROBE) {
- /*
- * Comments in lttng-kernel.h mention that
- * either addr or symbol_name are set, not both.
- */
- addr = event->event->u.kprobe.addr;
- offset = event->event->u.kprobe.offset;
- symbol_name = addr ? NULL :
- event->event->u.kprobe.symbol_name;
- } else {
- symbol_name =
- event->event->u.kretprobe.symbol_name;
- addr = event->event->u.kretprobe.addr;
- offset = event->event->u.kretprobe.offset;
- }
-
- ret = config_writer_open_element(writer,
- config_element_probe_attributes);
- if (ret) {
- ret = LTTNG_ERR_SAVE_IO_FAIL;
- goto end;
- }
-
- if (symbol_name) {
- ret = config_writer_write_element_string(writer,
- config_element_symbol_name,
- symbol_name);
- if (ret) {
- ret = LTTNG_ERR_SAVE_IO_FAIL;
- goto end;
- }
- }
-
- if (addr) {
- ret = config_writer_write_element_unsigned_int(
- writer, config_element_address, addr);
- if (ret) {
- ret = LTTNG_ERR_SAVE_IO_FAIL;
- goto end;
- }
- }
-
- if (offset) {
- ret = config_writer_write_element_unsigned_int(
- writer, config_element_offset, offset);
- if (ret) {
- ret = LTTNG_ERR_SAVE_IO_FAIL;
- goto end;
- }
- }
-
- ret = config_writer_close_element(writer);
+ ret = save_kernel_kprobe_event(writer, event);
if (ret) {
- ret = LTTNG_ERR_SAVE_IO_FAIL;
goto end;
}
break;
- }
default:
ERR("Unsupported kernel instrumentation type.");
ret = LTTNG_ERR_INVALID;
static
int save_agent_events(struct config_writer *writer,
- struct ltt_ust_channel *chan,
struct agent *agent)
{
int ret;
* the "agent" events associated with this channel and serialize
* them.
*/
- ret = save_agent_events(writer, ust_chan, agent);
+ ret = save_agent_events(writer, agent);
if (ret) {
goto end;
}
return ret;
}
+static
+int save_session_rotation_schedule(struct config_writer *writer,
+ enum lttng_rotation_schedule_type type, uint64_t value)
+{
+ int ret = 0;
+ const char *element_name;
+ const char *value_name;
+
+ switch (type) {
+ case LTTNG_ROTATION_SCHEDULE_TYPE_PERIODIC:
+ element_name = config_element_rotation_schedule_periodic;
+ value_name = config_element_rotation_schedule_periodic_time_us;
+ break;
+ case LTTNG_ROTATION_SCHEDULE_TYPE_SIZE_THRESHOLD:
+ element_name = config_element_rotation_schedule_size_threshold;
+ value_name = config_element_rotation_schedule_size_threshold_bytes;
+ break;
+ default:
+ ret = -1;
+ goto end;
+ }
+
+ ret = config_writer_open_element(writer, element_name);
+ if (ret) {
+ goto end;
+ }
+
+ ret = config_writer_write_element_unsigned_int(writer,
+ value_name, value);
+ if (ret) {
+ goto end;
+ }
+
+ /* Close schedule descriptor element. */
+ ret = config_writer_close_element(writer);
+ if (ret) {
+ goto end;
+ }
+end:
+ return ret;
+}
+
+static
+int save_session_rotation_schedules(struct config_writer *writer,
+ struct ltt_session *session)
+{
+ int ret;
+
+ ret = config_writer_open_element(writer,
+ config_element_rotation_schedules);
+ if (session->rotate_timer_period) {
+ ret = save_session_rotation_schedule(writer,
+ LTTNG_ROTATION_SCHEDULE_TYPE_PERIODIC,
+ session->rotate_timer_period);
+ if (ret) {
+ goto close_schedules;
+ }
+ }
+ if (session->rotate_size) {
+ ret = save_session_rotation_schedule(writer,
+ LTTNG_ROTATION_SCHEDULE_TYPE_SIZE_THRESHOLD,
+ session->rotate_size);
+ if (ret) {
+ goto close_schedules;
+ }
+ }
+
+close_schedules:
+ /* Close rotation schedules element. */
+ ret = config_writer_close_element(writer);
+ if (ret) {
+ goto end;
+ }
+end:
+ return ret;
+}
+
/*
* Save the given session.
*
goto end;
}
}
- if (session->rotate_timer_period) {
- ret = config_writer_write_element_unsigned_int(writer,
- config_element_rotation_timer_interval,
- session->rotate_timer_period);
- if (ret) {
- ret = LTTNG_ERR_SAVE_IO_FAIL;
- goto end;
- }
- }
-
- if (session->rotate_size) {
- ret = config_writer_write_element_unsigned_int(writer,
- config_element_rotation_size,
- session->rotate_size);
+ if (session->rotate_timer_period || session->rotate_size) {
+ ret = save_session_rotation_schedules(writer,
+ session);
if (ret) {
ret = LTTNG_ERR_SAVE_IO_FAIL;
goto end;