struct lib_ring_buffer_ctx *ctx,
struct ltt_channel *chan)
{
+ struct task_struct *parent;
pid_t vppid;
+ /*
+ * nsproxy can be NULL when scheduled out of exit.
+ */
rcu_read_lock();
- vppid = task_tgid_vnr(current->real_parent);
+ parent = rcu_dereference(current->real_parent);
+ if (!parent->nsproxy)
+ vppid = 0;
+ else
+ vppid = task_tgid_vnr(parent);
rcu_read_unlock();
lib_ring_buffer_align_ctx(ctx, ltt_alignof(vppid));
chan->ops->event_write(ctx, &vppid, sizeof(vppid));
int lttng_add_vppid_to_ctx(struct lttng_ctx **ctx)
{
struct lttng_ctx_field *field;
- int ret;
field = lttng_append_context(ctx);
if (!field)
- return ret;
+ return -ENOMEM;
+ if (lttng_find_context(*ctx, "vppid")) {
+ lttng_remove_context_field(ctx, field);
+ return -EEXIST;
+ }
field->event_field.name = "vppid";
field->event_field.type.atype = atype_integer;
field->event_field.type.u.basic.integer.size = sizeof(pid_t) * CHAR_BIT;