linux-perf-users.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Ian Rogers <irogers@google.com>
Cc: Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@redhat.com>,
	Namhyung Kim <namhyung@kernel.org>,
	Mark Rutland <mark.rutland@arm.com>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Jiri Olsa <jolsa@kernel.org>,
	Adrian Hunter <adrian.hunter@intel.com>,
	Kan Liang <kan.liang@linux.intel.com>,
	James Clark <james.clark@linaro.org>,
	Howard Chu <howardchu95@gmail.com>,
	Athira Jajeev <atrajeev@linux.vnet.ibm.com>,
	Michael Petlan <mpetlan@redhat.com>,
	Veronika Molnarova <vmolnaro@redhat.com>,
	Dapeng Mi <dapeng1.mi@linux.intel.com>,
	Thomas Richter <tmricht@linux.ibm.com>,
	Ilya Leoshkevich <iii@linux.ibm.com>,
	Colin Ian King <colin.i.king@gmail.com>,
	Weilin Wang <weilin.wang@intel.com>,
	Andi Kleen <ak@linux.intel.com>,
	Josh Poimboeuf <jpoimboe@redhat.com>,
	linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org
Subject: Re: [PATCH v5 01/21] perf python: Remove python 2 scripting support
Date: Thu, 31 Oct 2024 16:19:40 -0300	[thread overview]
Message-ID: <ZyPYTA8htkhxlZFX@x1> (raw)
In-Reply-To: <20241031014252.753588-2-irogers@google.com>

On Wed, Oct 30, 2024 at 06:42:32PM -0700, Ian Rogers wrote:
> Python2 was deprecated 4 years ago, remove support and workarounds.

Acked-by: Arnaldo Carvalho de Melo <acme@redhat.com>
 
> Signed-off-by: Ian Rogers <irogers@google.com>
> ---
>  .../scripts/python/Perf-Trace-Util/Context.c  | 18 -----
>  tools/perf/util/python.c                      | 73 +++----------------
>  .../scripting-engines/trace-event-python.c    | 63 +---------------
>  3 files changed, 15 insertions(+), 139 deletions(-)
> 
> diff --git a/tools/perf/scripts/python/Perf-Trace-Util/Context.c b/tools/perf/scripts/python/Perf-Trace-Util/Context.c
> index 01f54d6724a5..d742daaa5d5a 100644
> --- a/tools/perf/scripts/python/Perf-Trace-Util/Context.c
> +++ b/tools/perf/scripts/python/Perf-Trace-Util/Context.c
> @@ -24,16 +24,6 @@
>  #include "../../../util/srcline.h"
>  #include "../../../util/srccode.h"
>  
> -#if PY_MAJOR_VERSION < 3
> -#define _PyCapsule_GetPointer(arg1, arg2) \
> -  PyCObject_AsVoidPtr(arg1)
> -#define _PyBytes_FromStringAndSize(arg1, arg2) \
> -  PyString_FromStringAndSize((arg1), (arg2))
> -#define _PyUnicode_AsUTF8(arg) \
> -  PyString_AsString(arg)
> -
> -PyMODINIT_FUNC initperf_trace_context(void);
> -#else
>  #define _PyCapsule_GetPointer(arg1, arg2) \
>    PyCapsule_GetPointer((arg1), (arg2))
>  #define _PyBytes_FromStringAndSize(arg1, arg2) \
> @@ -42,7 +32,6 @@ PyMODINIT_FUNC initperf_trace_context(void);
>    PyUnicode_AsUTF8(arg)
>  
>  PyMODINIT_FUNC PyInit_perf_trace_context(void);
> -#endif
>  
>  static struct scripting_context *get_args(PyObject *args, const char *name, PyObject **arg2)
>  {
> @@ -213,12 +202,6 @@ static PyMethodDef ContextMethods[] = {
>  	{ NULL, NULL, 0, NULL}
>  };
>  
> -#if PY_MAJOR_VERSION < 3
> -PyMODINIT_FUNC initperf_trace_context(void)
> -{
> -	(void) Py_InitModule("perf_trace_context", ContextMethods);
> -}
> -#else
>  PyMODINIT_FUNC PyInit_perf_trace_context(void)
>  {
>  	static struct PyModuleDef moduledef = {
> @@ -240,4 +223,3 @@ PyMODINIT_FUNC PyInit_perf_trace_context(void)
>  
>  	return mod;
>  }
> -#endif
> diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
> index 31a223eaf8e6..02279ab4967c 100644
> --- a/tools/perf/util/python.c
> +++ b/tools/perf/util/python.c
> @@ -25,40 +25,14 @@
>  #include <internal/lib.h>
>  #include "../builtin.h"
>  
> -#if PY_MAJOR_VERSION < 3
> -#define _PyUnicode_FromString(arg) \
> -  PyString_FromString(arg)
> -#define _PyUnicode_AsString(arg) \
> -  PyString_AsString(arg)
> -#define _PyUnicode_FromFormat(...) \
> -  PyString_FromFormat(__VA_ARGS__)
> -#define _PyLong_FromLong(arg) \
> -  PyInt_FromLong(arg)
> -
> -#else
> -
>  #define _PyUnicode_FromString(arg) \
>    PyUnicode_FromString(arg)
>  #define _PyUnicode_FromFormat(...) \
>    PyUnicode_FromFormat(__VA_ARGS__)
>  #define _PyLong_FromLong(arg) \
>    PyLong_FromLong(arg)
> -#endif
>  
> -#ifndef Py_TYPE
> -#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type)
> -#endif
> -
> -/* Define PyVarObject_HEAD_INIT for python 2.5 */
> -#ifndef PyVarObject_HEAD_INIT
> -# define PyVarObject_HEAD_INIT(type, size) PyObject_HEAD_INIT(type) size,
> -#endif
> -
> -#if PY_MAJOR_VERSION < 3
> -PyMODINIT_FUNC initperf(void);
> -#else
>  PyMODINIT_FUNC PyInit_perf(void);
> -#endif
>  
>  #define member_def(type, member, ptype, help) \
>  	{ #member, ptype, \
> @@ -116,7 +90,7 @@ static PyObject *pyrf_mmap_event__repr(struct pyrf_event *pevent)
>  		     pevent->event.mmap.pgoff, pevent->event.mmap.filename) < 0) {
>  		ret = PyErr_NoMemory();
>  	} else {
> -		ret = _PyUnicode_FromString(s);
> +		ret = PyUnicode_FromString(s);
>  		free(s);
>  	}
>  	return ret;
> @@ -147,7 +121,7 @@ static PyMemberDef pyrf_task_event__members[] = {
>  
>  static PyObject *pyrf_task_event__repr(struct pyrf_event *pevent)
>  {
> -	return _PyUnicode_FromFormat("{ type: %s, pid: %u, ppid: %u, tid: %u, "
> +	return PyUnicode_FromFormat("{ type: %s, pid: %u, ppid: %u, tid: %u, "
>  				   "ptid: %u, time: %" PRI_lu64 "}",
>  				   pevent->event.header.type == PERF_RECORD_FORK ? "fork" : "exit",
>  				   pevent->event.fork.pid,
> @@ -180,7 +154,7 @@ static PyMemberDef pyrf_comm_event__members[] = {
>  
>  static PyObject *pyrf_comm_event__repr(struct pyrf_event *pevent)
>  {
> -	return _PyUnicode_FromFormat("{ type: comm, pid: %u, tid: %u, comm: %s }",
> +	return PyUnicode_FromFormat("{ type: comm, pid: %u, tid: %u, comm: %s }",
>  				   pevent->event.comm.pid,
>  				   pevent->event.comm.tid,
>  				   pevent->event.comm.comm);
> @@ -211,7 +185,7 @@ static PyObject *pyrf_throttle_event__repr(struct pyrf_event *pevent)
>  {
>  	struct perf_record_throttle *te = (struct perf_record_throttle *)(&pevent->event.header + 1);
>  
> -	return _PyUnicode_FromFormat("{ type: %sthrottle, time: %" PRI_lu64 ", id: %" PRI_lu64
> +	return PyUnicode_FromFormat("{ type: %sthrottle, time: %" PRI_lu64 ", id: %" PRI_lu64
>  				   ", stream_id: %" PRI_lu64 " }",
>  				   pevent->event.header.type == PERF_RECORD_THROTTLE ? "" : "un",
>  				   te->time, te->id, te->stream_id);
> @@ -246,7 +220,7 @@ static PyObject *pyrf_lost_event__repr(struct pyrf_event *pevent)
>  		     pevent->event.lost.id, pevent->event.lost.lost) < 0) {
>  		ret = PyErr_NoMemory();
>  	} else {
> -		ret = _PyUnicode_FromString(s);
> +		ret = PyUnicode_FromString(s);
>  		free(s);
>  	}
>  	return ret;
> @@ -273,7 +247,7 @@ static PyMemberDef pyrf_read_event__members[] = {
>  
>  static PyObject *pyrf_read_event__repr(struct pyrf_event *pevent)
>  {
> -	return _PyUnicode_FromFormat("{ type: read, pid: %u, tid: %u }",
> +	return PyUnicode_FromFormat("{ type: read, pid: %u, tid: %u }",
>  				   pevent->event.read.pid,
>  				   pevent->event.read.tid);
>  	/*
> @@ -308,7 +282,7 @@ static PyObject *pyrf_sample_event__repr(struct pyrf_event *pevent)
>  	if (asprintf(&s, "{ type: sample }") < 0) {
>  		ret = PyErr_NoMemory();
>  	} else {
> -		ret = _PyUnicode_FromString(s);
> +		ret = PyUnicode_FromString(s);
>  		free(s);
>  	}
>  	return ret;
> @@ -342,7 +316,7 @@ tracepoint_field(struct pyrf_event *pe, struct tep_format_field *field)
>  		}
>  		if (field->flags & TEP_FIELD_IS_STRING &&
>  		    is_printable_array(data + offset, len)) {
> -			ret = _PyUnicode_FromString((char *)data + offset);
> +			ret = PyUnicode_FromString((char *)data + offset);
>  		} else {
>  			ret = PyByteArray_FromStringAndSize((const char *) data + offset, len);
>  			field->flags &= ~TEP_FIELD_IS_STRING;
> @@ -431,7 +405,7 @@ static PyObject *pyrf_context_switch_event__repr(struct pyrf_event *pevent)
>  		     !!(pevent->event.header.misc & PERF_RECORD_MISC_SWITCH_OUT)) < 0) {
>  		ret = PyErr_NoMemory();
>  	} else {
> -		ret = _PyUnicode_FromString(s);
> +		ret = PyUnicode_FromString(s);
>  		free(s);
>  	}
>  	return ret;
> @@ -917,17 +891,8 @@ static PyObject *pyrf_evlist__get_pollfd(struct pyrf_evlist *pevlist,
>  
>  	for (i = 0; i < evlist->core.pollfd.nr; ++i) {
>  		PyObject *file;
> -#if PY_MAJOR_VERSION < 3
> -		FILE *fp = fdopen(evlist->core.pollfd.entries[i].fd, "r");
> -
> -		if (fp == NULL)
> -			goto free_list;
> -
> -		file = PyFile_FromFile(fp, "perf", "r", NULL);
> -#else
>  		file = PyFile_FromFd(evlist->core.pollfd.entries[i].fd, "perf", "r", -1,
>  				     NULL, NULL, NULL, 0);
> -#endif
>  		if (file == NULL)
>  			goto free_list;
>  
> @@ -1233,9 +1198,9 @@ static PyObject *pyrf__tracepoint(struct pyrf_evsel *pevsel,
>  
>  	tp_format = trace_event__tp_format(sys, name);
>  	if (IS_ERR(tp_format))
> -		return _PyLong_FromLong(-1);
> +		return PyLong_FromLong(-1);
>  
> -	return _PyLong_FromLong(tp_format->id);
> +	return PyLong_FromLong(tp_format->id);
>  #endif // HAVE_LIBTRACEEVENT
>  }
>  
> @@ -1249,18 +1214,11 @@ static PyMethodDef perf__methods[] = {
>  	{ .ml_name = NULL, }
>  };
>  
> -#if PY_MAJOR_VERSION < 3
> -PyMODINIT_FUNC initperf(void)
> -#else
>  PyMODINIT_FUNC PyInit_perf(void)
> -#endif
>  {
>  	PyObject *obj;
>  	int i;
>  	PyObject *dict;
> -#if PY_MAJOR_VERSION < 3
> -	PyObject *module = Py_InitModule("perf", perf__methods);
> -#else
>  	static struct PyModuleDef moduledef = {
>  		PyModuleDef_HEAD_INIT,
>  		"perf",			/* m_name */
> @@ -1273,7 +1231,6 @@ PyMODINIT_FUNC PyInit_perf(void)
>  		NULL,			/* m_free */
>  	};
>  	PyObject *module = PyModule_Create(&moduledef);
> -#endif
>  
>  	if (module == NULL ||
>  	    pyrf_event__setup_types() < 0 ||
> @@ -1281,11 +1238,7 @@ PyMODINIT_FUNC PyInit_perf(void)
>  	    pyrf_evsel__setup_types() < 0 ||
>  	    pyrf_thread_map__setup_types() < 0 ||
>  	    pyrf_cpu_map__setup_types() < 0)
> -#if PY_MAJOR_VERSION < 3
> -		return;
> -#else
>  		return module;
> -#endif
>  
>  	/* The page_size is placed in util object. */
>  	page_size = sysconf(_SC_PAGE_SIZE);
> @@ -1334,7 +1287,7 @@ PyMODINIT_FUNC PyInit_perf(void)
>  		goto error;
>  
>  	for (i = 0; perf__constants[i].name != NULL; i++) {
> -		obj = _PyLong_FromLong(perf__constants[i].value);
> +		obj = PyLong_FromLong(perf__constants[i].value);
>  		if (obj == NULL)
>  			goto error;
>  		PyDict_SetItemString(dict, perf__constants[i].name, obj);
> @@ -1344,9 +1297,7 @@ PyMODINIT_FUNC PyInit_perf(void)
>  error:
>  	if (PyErr_Occurred())
>  		PyErr_SetString(PyExc_ImportError, "perf: Init failed!");
> -#if PY_MAJOR_VERSION >= 3
>  	return module;
> -#endif
>  }
>  
>  
> diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
> index d7183134b669..f1d461d47d73 100644
> --- a/tools/perf/util/scripting-engines/trace-event-python.c
> +++ b/tools/perf/util/scripting-engines/trace-event-python.c
> @@ -58,22 +58,6 @@
>  #include "mem-events.h"
>  #include "util/perf_regs.h"
>  
> -#if PY_MAJOR_VERSION < 3
> -#define _PyUnicode_FromString(arg) \
> -  PyString_FromString(arg)
> -#define _PyUnicode_FromStringAndSize(arg1, arg2) \
> -  PyString_FromStringAndSize((arg1), (arg2))
> -#define _PyBytes_FromStringAndSize(arg1, arg2) \
> -  PyString_FromStringAndSize((arg1), (arg2))
> -#define _PyLong_FromLong(arg) \
> -  PyInt_FromLong(arg)
> -#define _PyLong_AsLong(arg) \
> -  PyInt_AsLong(arg)
> -#define _PyCapsule_New(arg1, arg2, arg3) \
> -  PyCObject_FromVoidPtr((arg1), (arg2))
> -
> -PyMODINIT_FUNC initperf_trace_context(void);
> -#else
>  #define _PyUnicode_FromString(arg) \
>    PyUnicode_FromString(arg)
>  #define _PyUnicode_FromStringAndSize(arg1, arg2) \
> @@ -88,7 +72,6 @@ PyMODINIT_FUNC initperf_trace_context(void);
>    PyCapsule_New((arg1), (arg2), (arg3))
>  
>  PyMODINIT_FUNC PyInit_perf_trace_context(void);
> -#endif
>  
>  #ifdef HAVE_LIBTRACEEVENT
>  #define TRACE_EVENT_TYPE_MAX				\
> @@ -181,17 +164,7 @@ static int get_argument_count(PyObject *handler)
>  {
>  	int arg_count = 0;
>  
> -	/*
> -	 * The attribute for the code object is func_code in Python 2,
> -	 * whereas it is __code__ in Python 3.0+.
> -	 */
> -	PyObject *code_obj = PyObject_GetAttrString(handler,
> -		"func_code");
> -	if (PyErr_Occurred()) {
> -		PyErr_Clear();
> -		code_obj = PyObject_GetAttrString(handler,
> -			"__code__");
> -	}
> +	PyObject *code_obj = code_obj = PyObject_GetAttrString(handler, "__code__");
>  	PyErr_Clear();
>  	if (code_obj) {
>  		PyObject *arg_count_obj = PyObject_GetAttrString(code_obj,
> @@ -1899,12 +1872,6 @@ static void set_table_handlers(struct tables *tables)
>  	tables->synth_handler = get_handler("synth_data");
>  }
>  
> -#if PY_MAJOR_VERSION < 3
> -static void _free_command_line(const char **command_line, int num)
> -{
> -	free(command_line);
> -}
> -#else
>  static void _free_command_line(wchar_t **command_line, int num)
>  {
>  	int i;
> @@ -1912,7 +1879,6 @@ static void _free_command_line(wchar_t **command_line, int num)
>  		PyMem_RawFree(command_line[i]);
>  	free(command_line);
>  }
> -#endif
>  
>  
>  /*
> @@ -1922,30 +1888,12 @@ static int python_start_script(const char *script, int argc, const char **argv,
>  			       struct perf_session *session)
>  {
>  	struct tables *tables = &tables_global;
> -#if PY_MAJOR_VERSION < 3
> -	const char **command_line;
> -#else
>  	wchar_t **command_line;
> -#endif
> -	/*
> -	 * Use a non-const name variable to cope with python 2.6's
> -	 * PyImport_AppendInittab prototype
> -	 */
> -	char buf[PATH_MAX], name[19] = "perf_trace_context";
> +	char buf[PATH_MAX];
>  	int i, err = 0;
>  	FILE *fp;
>  
>  	scripting_context->session = session;
> -#if PY_MAJOR_VERSION < 3
> -	command_line = malloc((argc + 1) * sizeof(const char *));
> -	if (!command_line)
> -		return -1;
> -
> -	command_line[0] = script;
> -	for (i = 1; i < argc + 1; i++)
> -		command_line[i] = argv[i - 1];
> -	PyImport_AppendInittab(name, initperf_trace_context);
> -#else
>  	command_line = malloc((argc + 1) * sizeof(wchar_t *));
>  	if (!command_line)
>  		return -1;
> @@ -1953,15 +1901,10 @@ static int python_start_script(const char *script, int argc, const char **argv,
>  	command_line[0] = Py_DecodeLocale(script, NULL);
>  	for (i = 1; i < argc + 1; i++)
>  		command_line[i] = Py_DecodeLocale(argv[i - 1], NULL);
> -	PyImport_AppendInittab(name, PyInit_perf_trace_context);
> -#endif
> +	PyImport_AppendInittab("perf_trace_context", PyInit_perf_trace_context);
>  	Py_Initialize();
>  
> -#if PY_MAJOR_VERSION < 3
> -	PySys_SetArgv(argc + 1, (char **)command_line);
> -#else
>  	PySys_SetArgv(argc + 1, command_line);
> -#endif
>  
>  	fp = fopen(script, "r");
>  	if (!fp) {
> -- 
> 2.47.0.163.g1226f6d8fa-goog
> 

  reply	other threads:[~2024-10-31 19:19 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-31  1:42 [PATCH v5 00/21] Python module cleanup Ian Rogers
2024-10-31  1:42 ` [PATCH v5 01/21] perf python: Remove python 2 scripting support Ian Rogers
2024-10-31 19:19   ` Arnaldo Carvalho de Melo [this message]
2024-10-31  1:42 ` [PATCH v5 02/21] perf python: Constify variables and parameters Ian Rogers
2024-10-31 19:21   ` Arnaldo Carvalho de Melo
2024-10-31  1:42 ` [PATCH v5 03/21] perf python: Remove unused #include Ian Rogers
2024-10-31 19:19   ` Arnaldo Carvalho de Melo
2024-10-31  1:42 ` [PATCH v5 04/21] perf script: Move scripting_max_stack out of builtin Ian Rogers
2024-10-31 19:20   ` Arnaldo Carvalho de Melo
2024-10-31  1:42 ` [PATCH v5 05/21] perf kvm: Move functions used in util " Ian Rogers
2024-10-31 19:24   ` Arnaldo Carvalho de Melo
2024-10-31  1:42 ` [PATCH v5 06/21] perf script: Move find_scripts to browser/scripts.c Ian Rogers
2024-10-31 19:18   ` Arnaldo Carvalho de Melo
2024-10-31 20:51     ` Ian Rogers
2024-11-04 19:47       ` Namhyung Kim
2024-11-04 20:34         ` Ian Rogers
2024-11-04 20:39           ` Arnaldo Carvalho de Melo
2024-11-04 20:48             ` Ian Rogers
2024-11-04 21:00               ` Namhyung Kim
2024-11-04 21:06                 ` Ian Rogers
2024-11-04 22:09                   ` Namhyung Kim
2024-11-04 22:20                     ` Ian Rogers
2024-11-04 23:22                       ` Namhyung Kim
2024-11-04 23:28                         ` Ian Rogers
2024-11-05  6:14                           ` Namhyung Kim
2024-10-31  1:42 ` [PATCH v5 07/21] perf stat: Move stat_config into config.c Ian Rogers
2024-10-31 19:19   ` Arnaldo Carvalho de Melo
2024-10-31  1:42 ` [PATCH v5 08/21] perf script: Move script_spec code to trace-event-scripting.c Ian Rogers
2024-10-31 19:21   ` Arnaldo Carvalho de Melo
2024-10-31  1:42 ` [PATCH v5 09/21] perf script: Move script_fetch_insn " Ian Rogers
2024-10-31 19:33   ` Arnaldo Carvalho de Melo
2024-10-31  1:42 ` [PATCH v5 10/21] perf script: Move perf_sample__sprintf_flags " Ian Rogers
2024-10-31  1:42 ` [PATCH v5 11/21] perf x86: Define arch_fetch_insn in NO_AUXTRACE builds Ian Rogers
2024-10-31  9:14   ` Adrian Hunter
2024-10-31  1:42 ` [PATCH v5 12/21] perf intel-pt: Remove stale build comment Ian Rogers
2024-10-31  9:13   ` Adrian Hunter
2024-10-31  1:42 ` [PATCH v5 13/21] perf env: Move arch errno function to only use in env Ian Rogers
2024-10-31 19:34   ` Arnaldo Carvalho de Melo
2024-10-31  1:42 ` [PATCH v5 14/21] perf lock: Move common lock contention code to new file Ian Rogers
2024-10-31 19:36   ` Arnaldo Carvalho de Melo
2024-10-31  1:42 ` [PATCH v5 15/21] perf bench: Remove reference to cmd_inject Ian Rogers
2024-10-31  1:42 ` [PATCH v5 16/21] perf kwork: Make perf_kwork_add_work a callback Ian Rogers
2024-10-31  1:42 ` [PATCH v5 17/21] perf build: Remove test library from python shared object Ian Rogers
2024-10-31 19:21   ` Arnaldo Carvalho de Melo
2024-10-31  1:42 ` [PATCH v5 18/21] perf python: Add parse_events function Ian Rogers
2024-10-31  1:42 ` [PATCH v5 19/21] perf python: Add __str__ and __repr__ functions to evlist Ian Rogers
2024-10-31 19:22   ` Arnaldo Carvalho de Melo
2024-10-31  1:42 ` [PATCH v5 20/21] perf python: Add __str__ and __repr__ functions to evsel Ian Rogers
2024-10-31 19:38   ` Arnaldo Carvalho de Melo
2024-10-31  1:42 ` [PATCH v5 21/21] perf python: Correctly throw IndexError Ian Rogers
2024-10-31 19:23   ` Arnaldo Carvalho de Melo
2024-10-31 19:39 ` [PATCH v5 00/21] Python module cleanup Arnaldo Carvalho de Melo
2024-10-31 20:55   ` Ian Rogers

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=ZyPYTA8htkhxlZFX@x1 \
    --to=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=ak@linux.intel.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=atrajeev@linux.vnet.ibm.com \
    --cc=colin.i.king@gmail.com \
    --cc=dapeng1.mi@linux.intel.com \
    --cc=howardchu95@gmail.com \
    --cc=iii@linux.ibm.com \
    --cc=irogers@google.com \
    --cc=james.clark@linaro.org \
    --cc=jolsa@kernel.org \
    --cc=jpoimboe@redhat.com \
    --cc=kan.liang@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=mingo@redhat.com \
    --cc=mpetlan@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    --cc=tmricht@linux.ibm.com \
    --cc=vmolnaro@redhat.com \
    --cc=weilin.wang@intel.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).