All of lore.kernel.org
 help / color / mirror / Atom feed
From: Joseph Schuchart <joseph.schuchart@tu-dresden.de>
To: Namhyung Kim <namhyung@gmail.com>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Paul Mackerras <paulus@samba.org>, Ingo Molnar <mingo@redhat.com>,
	Thomas Ilsche <thomas.ilsche@tu-dresden.de>,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH] Provide additional sample information to Python scripts
Date: Wed, 04 Jun 2014 14:07:07 +0200	[thread overview]
Message-ID: <538F0BEB.8080407@tu-dresden.de> (raw)
In-Reply-To: <87wqd5f7j5.fsf@sejong.aot.lge.com>

[-- Attachment #1: Type: text/plain, Size: 8635 bytes --]

Hi Namhyung,

Thanks for your valuable feedback. Sorry for having sent the patches not inlined
again, I guess I was relying too much on Thunderbird to inline them. I tried to 
address your points below and will send the new patch set in separate mails.

Thanks,
Joseph

On 29.05.2014 08:01, Namhyung Kim wrote:
> Hi Joseph,
> 
> Sorry for late review, this looks very useful..  But please send a
> separate email for each patch and make it inlined (not attached) in the
> next version.
> 
> 
> On Thu, 03 Apr 2014 10:57:39 +0200, Joseph Schuchart wrote:
> 
> [SNIP]
>>  static void python_process_tracepoint(struct perf_sample *sample,
>>  				      struct perf_evsel *evsel,
>>  				      struct thread *thread,
>>  				      struct addr_location *al)
>>  {
>> -	PyObject *handler, *retval, *context, *t, *obj, *dict = NULL;
>> +	PyObject *handler, *retval, *context, *t, *obj, *callchain;
>> +	PyObject *dict = NULL;
>>  	static char handler_name[256];
>>  	struct format_field *field;
>>  	unsigned long long val;
>> @@ -327,6 +406,14 @@ static void python_process_tracepoint(struct perf_sample *sample,
>>  			pydict_set_item_string_decref(dict, field->name, obj);
>>  
>>  	}
>> +
>> +	/* ip unwinding */
>> +	callchain = python_process_callchain(sample, evsel, al);
>> +	if (handler)
>> +		PyTuple_SetItem(t, n++, callchain);
>> +	else
>> +		pydict_set_item_string_decref(dict, "callchain", callchain);
> 
> But this makes the script not runnable anymore due to argument number
> mismatch:
> 
>   $ perf script -s perf-script.py
>   ...
>   TypeError: sched__sched_wakeup() takes exactly 12 arguments (13 given)
>   Fatal Python error: problem in Python trace event handler
>   Aborted (core dumped)
> 
> 
> So you need to change to pass callchain when generating the handler.
> 
> 
> diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf
> index 255d45177613..94e395c9a875 100644
> --- a/tools/perf/util/scripting-engines/trace-event-python.c
> +++ b/tools/perf/util/scripting-engines/trace-event-python.c
> @@ -716,7 +716,7 @@ static int python_generate_script(struct pevent *pevent, con
>  
>                         fprintf(ofp, "%s", f->name);
>                 }
> -               fprintf(ofp, "):\n");
> +               fprintf(ofp, ", callchain):\n");
>  
>                 fprintf(ofp, "\t\tprint_header(event_name, common_cpu, "
>                         "common_secs, common_nsecs,\n\t\t\t"
> 
> 
> Also I think it's very useful to generate code to print callchain by
> default if exists - something like below?
> 
> 	for node in callchain:
> 		if 'sym' in node:
> 			print "\t[%x] %s" % (node['ip'], node['sym']['name'])
> 		else:
> 			print "\t[%x]" % (node['ip'])
> 
> 
>   $ perf script -s perf-script.py
>   in trace_begin
>   sched__sched_wakeup      8 5021904.056096444    19713 :19713                comm=perf, pid=19714, prio=120, success=1, target_cpu=9
> 	[ffffffff81091512] ttwu_do_wakeup
> 	[ffffffff810916d6] ttwu_do_activate.constprop.87
> 	[ffffffff81093b64] try_to_wake_up
> 	[ffffffff81093c22] default_wake_function
> 	[ffffffff8108348d] autoremove_wake_function
> 	[ffffffff8108b215] __wake_up_common
> 	[ffffffff8108e933] __wake_up_sync_key
> 	[ffffffff811a5b20] pipe_write
> 	[ffffffff8119cc07] do_sync_write
> 	[ffffffff8119d2cc] vfs_write
> 	[ffffffff8119d762] sys_write
> 	[ffffffff816640d9] system_call_fastpath
>   sched__sched_wakeup      8 5021904.056100334    19713 :19713                comm=perf, pid=19714, prio=120, success=1, target_cpu=9
> 	[ffffffff81091512] ttwu_do_wakeup
> 	[ffffffff810916d6] ttwu_do_activate.constprop.87
> 	[ffffffff81093b64] try_to_wake_up
> 	[ffffffff81093c22] default_wake_function
> 	[ffffffff8108348d] autoremove_wake_function
> 	[ffffffff8108b215] __wake_up_common
> 	[ffffffff8108e933] __wake_up_sync_key
> 	[ffffffff811a5b20] pipe_write
> 	[ffffffff8119cc07] do_sync_write
> 	[ffffffff8119d2cc] vfs_write
> 	[ffffffff8119d762] sys_write
> 	[ffffffff816640d9] system_call_fastpath
>   ...
> 
> 
>> +
>>  	if (!handler)
>>  		PyTuple_SetItem(t, n++, dict);
>>  
> 
> [SNIP]
>> @@ -385,15 +476,30 @@ static void python_process_general_event(struct perf_sample *sample,
>>  	pydict_set_item_string_decref(dict, "ev_name", PyString_FromString(perf_evsel__name(evsel)));
>>  	pydict_set_item_string_decref(dict, "attr", PyString_FromStringAndSize(
>>  			(const char *)&evsel->attr, sizeof(evsel->attr)));
>> -	pydict_set_item_string_decref(dict, "sample", PyString_FromStringAndSize(
>> -			(const char *)sample, sizeof(*sample)));
>> +
>> +	pydict_set_item_string_decref(dict_sample, "pid",
>> +			PyInt_FromLong(sample->pid));
>> +	pydict_set_item_string_decref(dict_sample, "tid",
>> +			PyInt_FromLong(sample->tid));
>> +	pydict_set_item_string_decref(dict_sample, "cpu",
>> +			PyInt_FromLong(sample->cpu));
>> +	pydict_set_item_string_decref(dict_sample, "time",
>> +			PyLong_FromUnsignedLongLong(sample->time));
>> +	pydict_set_item_string_decref(dict_sample, "period",
>> +			PyLong_FromUnsignedLongLong(sample->period));
>> +	pydict_set_item_string_decref(dict, "sample", dict_sample);
> 
> And I think this part should be a separate patch.
> 
>> +
>> +	/* ip unwinding */
>> +	callchain = python_process_callchain(sample, evsel, al);
>> +	pydict_set_item_string_decref(dict, "callchain", callchain);
>> +
>>  	pydict_set_item_string_decref(dict, "raw_buf", PyString_FromStringAndSize(
>>  			(const char *)sample->raw_data, sample->raw_size));
>>  	pydict_set_item_string_decref(dict, "comm",
>>  			PyString_FromString(thread__comm_str(thread)));
>>  	if (al->map) {
>>  		pydict_set_item_string_decref(dict, "dso",
>> -			PyString_FromString(al->map->dso->name));
>> +				PyString_FromString(al->map->dso->name));
> 
> It seems like an unnecessary change.
> 
> 
>>  	}
>>  	if (al->sym) {
>>  		pydict_set_item_string_decref(dict, "symbol",
> 
> 
> 
>>
>> Perf: Fix possible memory leaks in Python interface
>>
>> The function PyObject_CallObject() returns a new PyObject reference 
>> on which Py_DECREF has to be called to avoid memory leaks.
>> This patch adds these calls where necessary.
>>
>> Signed-off-by: Joseph Schuchart <joseph.schuchart@tu-dresden.de>
>>
>> diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
>> index cd9774d..ee17f64 100644
>> --- a/tools/perf/util/scripting-engines/trace-event-python.c
>> +++ b/tools/perf/util/scripting-engines/trace-event-python.c
>> @@ -97,6 +97,8 @@ static void define_value(enum print_arg_type field_type,
>>  		retval = PyObject_CallObject(handler, t);
>>  		if (retval == NULL)
>>  			handler_call_die(handler_name);
>> +		else
>> +			Py_DECREF(retval);
> 
> It looks like the handler_call_die() is never returned.  So we can get
> rid of the 'else' (like in the last hunk) for simplicity.
> 
> Thanks,
> Namhyung
> 
> 
>>  	}
>>  
>>  	Py_DECREF(t);
>> @@ -143,6 +145,8 @@ static void define_field(enum print_arg_type field_type,
>>  		retval = PyObject_CallObject(handler, t);
>>  		if (retval == NULL)
>>  			handler_call_die(handler_name);
>> +		else
>> +			Py_DECREF(retval);
>>  	}
>>  
>>  	Py_DECREF(t);
>> @@ -333,6 +337,8 @@ static void python_process_tracepoint(struct perf_sample *sample,
>>  		retval = PyObject_CallObject(handler, t);
>>  		if (retval == NULL)
>>  			handler_call_die(handler_name);
>> +		else
>> +			Py_DECREF(retval);
>>  	} else {
>>  		handler = PyDict_GetItemString(main_dict, "trace_unhandled");
>>  		if (handler && PyCallable_Check(handler)) {
>> @@ -340,6 +346,8 @@ static void python_process_tracepoint(struct perf_sample *sample,
>>  			retval = PyObject_CallObject(handler, t);
>>  			if (retval == NULL)
>>  				handler_call_die("trace_unhandled");
>> +			else
>> +				Py_DECREF(retval);
>>  		}
>>  		Py_DECREF(dict);
>>  	}
>> @@ -399,6 +407,8 @@ static void python_process_general_event(struct perf_sample *sample,
>>  	retval = PyObject_CallObject(handler, t);
>>  	if (retval == NULL)
>>  		handler_call_die(handler_name);
>> +	else
>> +		Py_DECREF(retval);
>>  exit:
>>  	Py_DECREF(dict);
>>  	Py_DECREF(t);
>> @@ -444,8 +454,8 @@ static int run_start_sub(void)
>>  	retval = PyObject_CallObject(handler, NULL);
>>  	if (retval == NULL)
>>  		handler_call_die("trace_begin");
>> -
>> -	Py_DECREF(retval);
>> +	else
>> +		Py_DECREF(retval);
>>  	return err;
>>  error:
>>  	Py_XDECREF(main_dict);


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4943 bytes --]

  reply	other threads:[~2014-06-04 12:31 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-18  8:43 [PATCH] Provide additional sample information to Python scripts Joseph Schuchart
2014-03-07 14:18 ` Arnaldo Carvalho de Melo
2014-03-12 15:29   ` Thomas Ilsche
2014-03-12 18:39     ` Arnaldo Carvalho de Melo
2014-04-03  8:57   ` Joseph Schuchart
2014-05-29  6:01     ` Namhyung Kim
2014-06-04 12:07       ` Joseph Schuchart [this message]
2014-06-04 12:07       ` [PATCH 1/3] Add missing calls to Py_DECREF Joseph Schuchart
2014-06-04 14:44         ` Namhyung Kim
2014-06-04 12:07       ` [PATCH 2/3] Add callchain to generic and tracepoint events Joseph Schuchart
2014-06-04 14:46         ` Namhyung Kim
2014-07-07 17:17         ` Jiri Olsa
2014-07-09  7:40           ` [PATCH 1/3] perf script: Add missing calls to Py_DECREF for return values Joseph Schuchart
2014-07-09  8:14             ` Namhyung Kim
2014-07-09  7:40           ` [PATCH 2/3] perf script: Add callchain to generic and tracepoint events Joseph Schuchart
2014-07-09  8:15             ` Namhyung Kim
2014-07-09 11:27             ` Jiri Olsa
2014-07-09 11:43               ` Joseph Schuchart
2014-07-09 11:49                 ` Jiri Olsa
2014-07-09 14:16                   ` Joseph Schuchart
2014-07-09 14:16                   ` [PATCH 1/3] perf script: Add missing calls to Py_DECREF Joseph Schuchart
2014-07-09 19:07                     ` Arnaldo Carvalho de Melo
2014-07-18  4:22                     ` [tip:perf/core] perf script: Add missing calls to Py_DECREF for return values tip-bot for Joseph Schuchart
2014-07-09 14:16                   ` [PATCH 2/3] perf script: Add callchain to generic and tracepoint events Joseph Schuchart
2014-07-09 19:09                     ` Arnaldo Carvalho de Melo
2014-07-09 19:12                       ` Arnaldo Carvalho de Melo
2014-07-09 19:29                         ` Arnaldo Carvalho de Melo
2014-07-10 11:50                           ` Joseph Schuchart
2014-07-10 11:50                           ` Joseph Schuchart
2014-07-18  4:22                             ` [tip:perf/core] " tip-bot for Joseph Schuchart
2014-07-10 11:50                           ` [PATCH 3/3] perf script: Provide additional sample information on generic events Joseph Schuchart
2014-07-18  4:23                             ` [tip:perf/core] " tip-bot for Joseph Schuchart
2014-07-09 14:16                   ` [PATCH 3/3] " Joseph Schuchart
2014-07-09  7:40           ` Joseph Schuchart
2014-07-09  8:16             ` Namhyung Kim
2014-06-04 12:07       ` [PATCH 3/3] " Joseph Schuchart
2014-06-04 14:55         ` Namhyung Kim

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=538F0BEB.8080407@tu-dresden.de \
    --to=joseph.schuchart@tu-dresden.de \
    --cc=a.p.zijlstra@chello.nl \
    --cc=acme@ghostprotocols.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=namhyung@gmail.com \
    --cc=paulus@samba.org \
    --cc=thomas.ilsche@tu-dresden.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.