All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
To: Joseph Schuchart <joseph.schuchart@tu-dresden.de>
Cc: 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: Fri, 7 Mar 2014 11:18:57 -0300	[thread overview]
Message-ID: <20140307141857.GA3153@ghostprotocols.net> (raw)
In-Reply-To: <53031D2C.2050009@tu-dresden.de>

Em Tue, Feb 18, 2014 at 09:43:24AM +0100, Joseph Schuchart escreveu:
> Good morning,
> 
> We have developed a patch for the perf Python scripting interface to
> provide additional information about the pid, tid, and cpu of generic
> events as well as information about the call-stack and resolved symbol
> names. This provides scripts with a greater level of detail. The
> mentioned information is already available to the scripting engine and
> just has to be handed down. This is done by the attached patch. The
> patch is based on Linux-3.13.3.
> 
> Please let me know if you have any questions on this.

Can you please resend, against the perf/core branch in
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git, and as an
attachement or making sure that the patch is not mangled?

- Arnaldo
 
> Thanks
> Joseph
> -- 
> Dipl. Inf. Joseph Schuchart
> Computer Scientist
> 
> Technische Universität Dresden
> Center for Information Services and High Performance Computing (ZIH)
> 01062 Dresden, Germany
> 
> Phone: +49 351 463-36494
> Fax: +49 351 463-3773
> E-Mail: joseph.schuchart@tu-dresden.de

> Perf: Provide sample information and call-chain to Python script
> 
> Provide additional sample information on generic events to Python 
> scripts, including pid, tid, and cpu for which the event was recorded.
> Additionally, provide the call-stack recorded at each event with 
> resolved symbols. At the moment, the pointer to the sample struct
> is passed to scripts, which seems to be of little use. The patch
> puts this information in dictionaries for easy access by Python
> scripts. 
> 
> Signed-off-by: Joseph Schuchart <joseph.schuchart@tu-dresden.de>
> Acked-by: Thomas Ilsche <thomas.ilsche@tu-dresden.de>
> 
> @@ -359,7 +359,7 @@ static void python_process_general_event
>  					 struct thread *thread,
>  					 struct addr_location *al)
>  {
> -	PyObject *handler, *retval, *t, *dict;
> +	PyObject *handler, *retval, *t, *dict, *dict_sample;
>  	static char handler_name[64];
>  	unsigned n = 0;
>  
> @@ -375,6 +375,10 @@ static void python_process_general_event
>  	if (!dict)
>  		Py_FatalError("couldn't create Python dictionary");
>  
> +	dict_sample = PyDict_New();
> +	if (!dict_sample)
> +		Py_FatalError("couldn't create Python dictionary");
> +
>  	snprintf(handler_name, sizeof(handler_name), "%s", "process_event");
>  
>  	handler = PyDict_GetItemString(main_dict, handler_name);
> @@ -384,8 +388,76 @@ static void python_process_general_event
>  	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)));
> +
> +	/* PID/TIDs are limited to 2^29, so we can safely use PyInt */
> +	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", dict_sample);
> +
> +	/* ip unwinding */
> +
> +	if (symbol_conf.use_callchain && sample->callchain) {
> +		PyObject *pylist;
> +
> +		if (machine__resolve_callchain(machine, evsel, al->thread,
> +						   sample, NULL, NULL, PERF_MAX_STACK_DEPTH) != 0) {
> +			pr_err("Failed to resolve callchain. Skipping\n");
> +			goto exit;
> +		}
> +		callchain_cursor_commit(&callchain_cursor);
> +
> +		pylist = PyList_New(0);
> +		if (!pylist)
> +			Py_FatalError("couldn't create Python list");
> +
> +		while (1) {
> +			PyObject *pyelem;
> +			struct callchain_cursor_node *node;
> +			node = callchain_cursor_current(&callchain_cursor);
> +			if (!node)
> +				break;
> +
> +			pyelem = PyDict_New();
> +			if (!pyelem)
> +				Py_FatalError("couldn't create Python dictionary");
> +
> +
> +			pydict_set_item_string_decref(pyelem, "ip", PyInt_FromLong(node->ip));
> +
> +			if (node->sym) {
> +				PyObject *pysym  = PyDict_New();
> +				if (!pysym)
> +					Py_FatalError("couldn't create Python dictionary");
> +				pydict_set_item_string_decref(pysym, "start",   PyInt_FromLong(node->sym->start));
> +				pydict_set_item_string_decref(pysym, "end",     PyInt_FromLong(node->sym->end));
> +				pydict_set_item_string_decref(pysym, "binding", PyInt_FromLong(node->sym->binding));
> +				pydict_set_item_string_decref(pysym, "name",    PyString_FromStringAndSize(node->sym->name, node->sym->namelen));
> +				pydict_set_item_string_decref(pyelem, "sym", pysym);
> +				Py_DECREF(pysym);
> +			}
> +
> +			if (node->map) {
> +				struct map *map = node->map;
> +				const char *dsoname = "[unknown]";
> +				if (map && map->dso && (map->dso->name || map->dso->long_name)) {
> +					if (symbol_conf.show_kernel_path && map->dso->long_name)
> +						dsoname = map->dso->long_name;
> +					else if (map->dso->name)
> +						dsoname = map->dso->name;
> +				}
> +				pydict_set_item_string_decref(pyelem, "dso", PyString_FromString(dsoname));
> +			}
> +
> +			callchain_cursor_advance(&callchain_cursor);
> +			PyList_Append(pylist, pyelem);
> +			Py_DECREF(pyelem);
> +		}
> +		PyDict_SetItemString(dict, "callstack", pylist);
> +		Py_DECREF(pylist);
> +	}
> +
>  	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",
> @@ -407,6 +479,7 @@ static void python_process_general_event
>  	if (retval == NULL)
>  		handler_call_die(handler_name);
>  exit:
> +	Py_DECREF(dict_sample);
>  	Py_DECREF(dict);
>  	Py_DECREF(t);
>  }




  reply	other threads:[~2014-03-07 14:19 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 [this message]
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
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=20140307141857.GA3153@ghostprotocols.net \
    --to=acme@ghostprotocols.net \
    --cc=a.p.zijlstra@chello.nl \
    --cc=joseph.schuchart@tu-dresden.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.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.