Re: make TGID available also in binary ring buffer?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 14 Mar 2019 17:06:11 +0100
Claudio <claudio.fontana@xxxxxxxxx> wrote:

> Hi Steve,
> 
> I have experimented with mainline, and then with mainline plus a patch to add the info for fork as well like this:
> 
> diff --git a/kernel/trace/trace_sched_switch.c b/kernel/trace/trace_sched_switch.c
> index e288168..c5339ed 100644
> --- a/kernel/trace/trace_sched_switch.c
> +++ b/kernel/trace/trace_sched_switch.c
> @@ -47,6 +47,20 @@ probe_sched_wakeup(void *ignore, struct task_struct *wakee)
>  	tracing_record_taskinfo(current, flags);
>  }
>  
> +static void
> +probe_sched_fork(void *ignore,
> +		 struct task_struct *parent, struct task_struct *child)
> +{
> +	int flags;
> +
> +	flags = (RECORD_TGID * !!sched_tgid_ref) +
> +		(RECORD_CMDLINE * !!sched_cmdline_ref);
> +
> +	if (!flags)
> +		return;
> +	tracing_record_taskinfo(child, flags);
> +}
> +
>  static int tracing_sched_register(void)
>  {
>  	int ret;
> @@ -72,7 +86,16 @@ static int tracing_sched_register(void)
>  		goto fail_deprobe_wake_new;
>  	}
>  
> +	ret = register_trace_sched_process_fork(probe_sched_fork, NULL);
> +	if (ret) {
> +		pr_info("sched trace: Couldn't activate tracepoint"
> +			" probe to kernel_sched_process_fork\n");
> +		goto fail_deprobe_switch;
> +	}
> +
>  	return ret;
> +fail_deprobe_switch:
> +	unregister_trace_sched_switch(probe_sched_switch, NULL);
>  fail_deprobe_wake_new:
>  	unregister_trace_sched_wakeup_new(probe_sched_wakeup, NULL);
>  fail_deprobe:
> @@ -82,6 +105,7 @@ static int tracing_sched_register(void)
>  
>  static void tracing_sched_unregister(void)
>  {
> +	unregister_trace_sched_process_fork(probe_sched_fork, NULL);
>  	unregister_trace_sched_switch(probe_sched_switch, NULL);
>  	unregister_trace_sched_wakeup_new(probe_sched_wakeup, NULL);
>  	unregister_trace_sched_wakeup(probe_sched_wakeup, NULL);
> 
> 
> --
> 
> It seems to work, but the model seems not to apply very well to my use case.
> 
> saved_tgids cannot be reset, not even by disabling tracing completely
> 
> echo 0 > tracing_on
> 
> or 
> 
> echo 0 > options/record-tgids
> 
> and the list just keeps growing, no entries are ever removed when tasks are destroyed etc,
> so my lookups become more and more expensive as the list grows.
> I don't think this is suited to be looked up frequently for my tracing scenario.
> 

It shouldn't grow when you disable tracing though.

Hmm, we could add a reset if one writes to the saved_* files.

> Next I will experiment with:
> 
> 1) kprobes, trying to generate an event before every sched class event carrying the tid to tgid mapping.

Just plop a kprobe on top of __schedule()

-- Steve

> 
> 2) if everything fails, revert to use /proc/PID/stat, which however can be slow and racy if the process does not exist anymore when I read back the ftrace buffers.
> 
> Thanks & ciao,
> 
> Claudio




[Index of Archives]     [Linux USB Development]     [Linux USB Development]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux