From a8ad3613f2e0e272487b8ec0f0ec8e3c6da689f9 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Wed, 1 Jun 2011 13:55:27 -0400 Subject: [PATCH] Add process priority (as shown in /proc) to context Signed-off-by: Mathieu Desnoyers --- ltt-debugfs-abi.c | 2 ++ ltt-debugfs-abi.h | 1 + ltt-events.h | 1 + lttng-context-prio.c | 65 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 69 insertions(+) create mode 100644 lttng-context-prio.c diff --git a/ltt-debugfs-abi.c b/ltt-debugfs-abi.c index afdc09a6..aee5bf5d 100644 --- a/ltt-debugfs-abi.c +++ b/ltt-debugfs-abi.c @@ -152,6 +152,8 @@ long lttng_abi_add_context(struct file *file, switch (context_param.ctx) { case LTTNG_KERNEL_CONTEXT_PID: return lttng_add_pid_to_ctx(ctx); + case LTTNG_KERNEL_CONTEXT_PRIO: + return lttng_add_prio_to_ctx(ctx); case LTTNG_KERNEL_CONTEXT_PERF_COUNTER: return -ENOSYS; case LTTNG_KERNEL_CONTEXT_COMM: diff --git a/ltt-debugfs-abi.h b/ltt-debugfs-abi.h index 2768055f..586d3a5b 100644 --- a/ltt-debugfs-abi.h +++ b/ltt-debugfs-abi.h @@ -65,6 +65,7 @@ enum lttng_kernel_context_type { LTTNG_KERNEL_CONTEXT_PID, LTTNG_KERNEL_CONTEXT_PERF_COUNTER, LTTNG_KERNEL_CONTEXT_COMM, + LTTNG_KERNEL_CONTEXT_PRIO, }; struct lttng_kernel_perf_counter_ctx { diff --git a/ltt-events.h b/ltt-events.h index 2b6ef40a..cb6ee211 100644 --- a/ltt-events.h +++ b/ltt-events.h @@ -274,6 +274,7 @@ struct lttng_ctx_field *lttng_append_context(struct lttng_ctx **ctx); void lttng_destroy_context(struct lttng_ctx *ctx); int lttng_add_pid_to_ctx(struct lttng_ctx **ctx); int lttng_add_comm_to_ctx(struct lttng_ctx **ctx); +int lttng_add_prio_to_ctx(struct lttng_ctx **ctx); #ifdef CONFIG_KPROBES int lttng_kprobes_register(const char *name, diff --git a/lttng-context-prio.c b/lttng-context-prio.c new file mode 100644 index 00000000..a748929a --- /dev/null +++ b/lttng-context-prio.c @@ -0,0 +1,65 @@ +/* + * (C) Copyright 2009-2011 - + * Mathieu Desnoyers + * + * LTTng priority context. + * + * Dual LGPL v2.1/GPL v2 license. + */ + +#include +#include +#include +#include "ltt-events.h" +#include "wrapper/ringbuffer/frontend_types.h" +#include "wrapper/vmalloc.h" +#include "ltt-tracer.h" + +static +size_t prio_get_size(size_t offset) +{ + size_t size = 0; + + size += lib_ring_buffer_align(offset, ltt_alignof(int)); + size += sizeof(int); + return size; +} + +static +void prio_record(struct lttng_ctx_field *field, + struct lib_ring_buffer_ctx *ctx, + struct ltt_channel *chan) +{ + int prio; + + pid = p->prio - MAX_RT_PRIO; + lib_ring_buffer_align_ctx(ctx, ltt_alignof(pid)); + chan->ops->event_write(ctx, &pid, sizeof(pid)); +} + +int lttng_add_prio_to_ctx(struct lttng_ctx **ctx) +{ + struct lttng_ctx_field *field; + int ret; + + field = lttng_append_context(ctx); + if (!field) + return ret; + field->event_field.name = "prio"; + field->event_field.type.atype = atype_integer; + field->event_field.type.u.basic.integer.size = sizeof(int) * CHAR_BIT; + field->event_field.type.u.basic.integer.alignment = ltt_alignof(int) * CHAR_BIT; + field->event_field.type.u.basic.integer.signedness = is_signed_type(int); + field->event_field.type.u.basic.integer.reverse_byte_order = 0; + field->event_field.type.u.basic.integer.base = 10; + field->event_field.type.u.basic.integer.encoding = lttng_encode_none; + field->get_size = prio_get_size; + field->record = prio_record; + wrapper_vmalloc_sync_all(); + return 0; +} +EXPORT_SYMBOL_GPL(lttng_add_prio_to_ctx); + +MODULE_LICENSE("GPL and additional rights"); +MODULE_AUTHOR("Mathieu Desnoyers"); +MODULE_DESCRIPTION("Linux Trace Toolkit Perf Support"); -- 2.34.1