[1/1] RFC: Package perf from linux kernel tools

Message ID 20210119124157.12662-2-felix.moessbauer@siemens.com
State Superseded, archived
Headers show
Series RFC: Package perf from linux kernel tools | expand

Commit Message

MOESSBAUER, Felix Jan. 19, 2021, 2:41 a.m. UTC
This patch adds the linux-perf-4.19 package for a kernel
that is build with ISAR.
As the perf binaries have to be version specific, we patch
the corresponding files from the kernel tools source to incorporate
the major and minor version number.
These patches are copied over from the official debianization of perf
that is done in the src:linux package.
Additionally, we package the perf python bindings as well and provide
them as module "perf_4_19" (in the tools-perf-python.patch).

As this debianization is not part of the kernel receipt, the perf
package can be based on a different patch version of the kernel.
While this might be intended, it is now the responibility of the
user to ensure that both the kernel and the linux-perf-<version>
packages are compatible.
---
 .../recipes-kernel/linux-perf/files/rules     |  53 ++++++++
 .../linux-perf/files/tools-perf-install.patch |  58 +++++++++
 .../linux-perf/files/tools-perf-python.patch  |  55 ++++++++
 .../linux-perf/files/tools-perf-version.patch | 119 ++++++++++++++++++
 .../linux-perf/linux-perf-4.19_4.19.160.bb    |  11 ++
 .../recipes-kernel/linux-perf/linux-perf.inc  |  46 +++++++
 6 files changed, 342 insertions(+)
 create mode 100644 meta-isar/recipes-kernel/linux-perf/files/rules
 create mode 100644 meta-isar/recipes-kernel/linux-perf/files/tools-perf-install.patch
 create mode 100644 meta-isar/recipes-kernel/linux-perf/files/tools-perf-python.patch
 create mode 100644 meta-isar/recipes-kernel/linux-perf/files/tools-perf-version.patch
 create mode 100644 meta-isar/recipes-kernel/linux-perf/linux-perf-4.19_4.19.160.bb
 create mode 100644 meta-isar/recipes-kernel/linux-perf/linux-perf.inc

Comments

Baurzhan Ismagulov Jan. 19, 2021, 6:31 a.m. UTC | #1
Hello Felix,

On Tue, Jan 19, 2021 at 01:41:58PM +0100, Felix Moessbauer wrote:
> This patch adds the linux-perf-4.19 package for a kernel
> that is build with ISAR.
> As the perf binaries have to be version specific, we patch
> the corresponding files from the kernel tools source to incorporate
> the major and minor version number.
> These patches are copied over from the official debianization of perf
> that is done in the src:linux package.
> Additionally, we package the perf python bindings as well and provide
> them as module "perf_4_19" (in the tools-perf-python.patch).
> 
> As this debianization is not part of the kernel receipt, the perf

Suggest "receipt" -> "recipe".


> package can be based on a different patch version of the kernel.
> While this might be intended, it is now the responibility of the
> user to ensure that both the kernel and the linux-perf-<version>
> packages are compatible.
...
>  .../linux-perf/files/tools-perf-install.patch |  58 +++++++++
>  .../linux-perf/files/tools-perf-python.patch  |  55 ++++++++
>  .../linux-perf/files/tools-perf-version.patch | 119 ++++++++++++++++++

The patches look common sense to me; ideally, it would be better to handle that
in the kernel and have a single kernel source package. I wonder why Debian
hasn't upstreamed that yet -- whether there were any technical problems, or
just no one happened to look at that. That said, I personally could live with
this till we have a better solution.

If nothing works, maybe we could relax the goal of being able to build any
given kernel version and experiment with conditional execution paths.


With kind regards,
Baurzhan.
MOESSBAUER, Felix Jan. 20, 2021, 5:23 a.m. UTC | #2
Hi,

today I implemented the packaging in the kernel recipe and fixed some
nasty aspects like exact version numbers in the patches.
I'll send this patch to the mailing list as well.

One issue is still that we need per-kernel patches.
If anything in the original makefile of perf changed, our patches do not apply.
That lead me to the initial approach with having a dedicated package with multiple recipes,
to have different patch-sets per kernel version (and put it into the responsibility of the user).

Another issue with the kernel-recipe approach is that it's no longer possible to use the Debian kernel but customize / fix the linux-perf-<version> package.
Maybe we need both.

@Schild, Henning (T RDA IOT SES-DE):
Having the Python stuff in a dedicated commit is definitely a good idea.
It's already in its own patchset. I'll send a v2 to the list as well.

Best regards,
Felix

> -----Original Message-----
> From: Baurzhan Ismagulov <ibr@radix50.net>
> Sent: Tuesday, January 19, 2021 5:31 PM
> To: Moessbauer, Felix (T RDA IOT SES-DE) <felix.moessbauer@siemens.com>
> Cc: isar-users@googlegroups.com; Schmidt, Adriaan (T RDA IOT SES-DE)
> <adriaan.schmidt@siemens.com>; Schild, Henning (T RDA IOT SES-DE)
> <henning.schild@siemens.com>; Kiszka, Jan (T RDA IOT)
> <jan.kiszka@siemens.com>
> Subject: Re: [PATCH 1/1] RFC: Package perf from linux kernel tools
> 
> Hello Felix,
> 
> On Tue, Jan 19, 2021 at 01:41:58PM +0100, Felix Moessbauer wrote:
> > This patch adds the linux-perf-4.19 package for a kernel that is build
> > with ISAR.
> > As the perf binaries have to be version specific, we patch the
> > corresponding files from the kernel tools source to incorporate the
> > major and minor version number.
> > These patches are copied over from the official debianization of perf
> > that is done in the src:linux package.
> > Additionally, we package the perf python bindings as well and provide
> > them as module "perf_4_19" (in the tools-perf-python.patch).
> >
> > As this debianization is not part of the kernel receipt, the perf
> 
> Suggest "receipt" -> "recipe".
> 
> 
> > package can be based on a different patch version of the kernel.
> > While this might be intended, it is now the responibility of the user
> > to ensure that both the kernel and the linux-perf-<version> packages
> > are compatible.
> ...
> >  .../linux-perf/files/tools-perf-install.patch |  58 +++++++++
> > .../linux-perf/files/tools-perf-python.patch  |  55 ++++++++
> > .../linux-perf/files/tools-perf-version.patch | 119 ++++++++++++++++++
> 
> The patches look common sense to me; ideally, it would be better to handle that
> in the kernel and have a single kernel source package. I wonder why Debian
> hasn't upstreamed that yet -- whether there were any technical problems, or just
> no one happened to look at that. That said, I personally could live with this till
> we have a better solution.
> 
> If nothing works, maybe we could relax the goal of being able to build any given
> kernel version and experiment with conditional execution paths.
> 
> 
> With kind regards,
> Baurzhan.
Henning Schild Jan. 20, 2021, 5:26 a.m. UTC | #3
Am Wed, 20 Jan 2021 16:23:18 +0100
schrieb "Moessbauer, Felix (T RDA IOT SES-DE)"
<felix.moessbauer@siemens.com>:

> Hi,
> 
> today I implemented the packaging in the kernel recipe and fixed some
> nasty aspects like exact version numbers in the patches.
> I'll send this patch to the mailing list as well.
> 
> One issue is still that we need per-kernel patches.
> If anything in the original makefile of perf changed, our patches do
> not apply. That lead me to the initial approach with having a
> dedicated package with multiple recipes, to have different patch-sets
> per kernel version (and put it into the responsibility of the user).
> 
> Another issue with the kernel-recipe approach is that it's no longer
> possible to use the Debian kernel but customize / fix the
> linux-perf-<version> package. Maybe we need both.

But i guess debian has perf packages for kernels taken from them. So
this would only be a problem if one had a need to add python binding
support to such a kernel. In which case one could always rebuild the
same sources+config under another name ...

Henning

> @Schild, Henning (T RDA IOT SES-DE):
> Having the Python stuff in a dedicated commit is definitely a good
> idea. It's already in its own patchset. I'll send a v2 to the list as
> well.
> 
> Best regards,
> Felix
> 
> > -----Original Message-----
> > From: Baurzhan Ismagulov <ibr@radix50.net>
> > Sent: Tuesday, January 19, 2021 5:31 PM
> > To: Moessbauer, Felix (T RDA IOT SES-DE)
> > <felix.moessbauer@siemens.com> Cc: isar-users@googlegroups.com;
> > Schmidt, Adriaan (T RDA IOT SES-DE) <adriaan.schmidt@siemens.com>;
> > Schild, Henning (T RDA IOT SES-DE) <henning.schild@siemens.com>;
> > Kiszka, Jan (T RDA IOT) <jan.kiszka@siemens.com>
> > Subject: Re: [PATCH 1/1] RFC: Package perf from linux kernel tools
> >
> > Hello Felix,
> >
> > On Tue, Jan 19, 2021 at 01:41:58PM +0100, Felix Moessbauer wrote:  
> > > This patch adds the linux-perf-4.19 package for a kernel that is
> > > build with ISAR.
> > > As the perf binaries have to be version specific, we patch the
> > > corresponding files from the kernel tools source to incorporate
> > > the major and minor version number.
> > > These patches are copied over from the official debianization of
> > > perf that is done in the src:linux package.
> > > Additionally, we package the perf python bindings as well and
> > > provide them as module "perf_4_19" (in the
> > > tools-perf-python.patch).
> > >
> > > As this debianization is not part of the kernel receipt, the perf
> > >  
> >
> > Suggest "receipt" -> "recipe".
> >
> >  
> > > package can be based on a different patch version of the kernel.
> > > While this might be intended, it is now the responibility of the
> > > user to ensure that both the kernel and the linux-perf-<version>
> > > packages are compatible.  
> > ...  
> > >  .../linux-perf/files/tools-perf-install.patch |  58 +++++++++
> > > .../linux-perf/files/tools-perf-python.patch  |  55 ++++++++
> > > .../linux-perf/files/tools-perf-version.patch | 119
> > > ++++++++++++++++++  
> >
> > The patches look common sense to me; ideally, it would be better to
> > handle that in the kernel and have a single kernel source package.
> > I wonder why Debian hasn't upstreamed that yet -- whether there
> > were any technical problems, or just no one happened to look at
> > that. That said, I personally could live with this till we have a
> > better solution.
> >
> > If nothing works, maybe we could relax the goal of being able to
> > build any given kernel version and experiment with conditional
> > execution paths.
> >
> >
> > With kind regards,
> > Baurzhan.
MOESSBAUER, Felix Jan. 21, 2021, 12:52 a.m. UTC | #4
Hi,

thanks for your input that is reflected in the following patchsets.

Changes since v1:

- package as part of kernel recipe
- put python patch in dedicated commit
- add support for 5.4 kernels
- enable users to provide custom patches

One pain point is still that we have to copy the patches
from upstream debian. IMO it would be better to just fetch
them, but then we would have to somehow map to a branch on
salsa. Any recommendations?

Best regards,
Felix

Felix Moessbauer (2):
  feat: package linux-perf-<version> in kernel recipe
  feat: package perf for 5.4 kernels

 .../linux/files/debian/control.tmpl           |  31 +++++
 .../files/debian/rules.d/tools/perf/Makefile  |  60 +++++++++
 .../linux/files/debian/rules.tmpl             |  18 ++-
 .../perf/4.19/tools-perf-install.patch        |  58 +++++++++
 .../perf/4.19/tools-perf-version.patch        | 119 ++++++++++++++++++
 .../patches/perf/5.4/tools-perf-install.patch |  51 ++++++++
 .../patches/perf/5.4/tools-perf-python.patch  |  16 +++
 .../patches/perf/5.4/tools-perf-version.patch | 111 ++++++++++++++++
 meta/recipes-kernel/linux/linux-custom.inc    |  11 +-
 meta/recipes-kernel/linux/linux-tools.inc     |  67 ++++++++++
 10 files changed, 538 insertions(+), 4 deletions(-)
 create mode 100644 meta/recipes-kernel/linux/files/debian/rules.d/tools/perf/Makefile
 create mode 100644 meta/recipes-kernel/linux/files/patches/perf/4.19/tools-perf-install.patch
 create mode 100644 meta/recipes-kernel/linux/files/patches/perf/4.19/tools-perf-version.patch
 create mode 100644 meta/recipes-kernel/linux/files/patches/perf/4.19/tools-perf-version.patch
 create mode 100644 meta/recipes-kernel/linux/files/patches/perf/5.4/tools-perf-install.patch
 create mode 100644 meta/recipes-kernel/linux/files/patches/perf/5.4/tools-perf-python.patch
 create mode 100644 meta/recipes-kernel/linux/linux-tools.inc

Patch

diff --git a/meta-isar/recipes-kernel/linux-perf/files/rules b/meta-isar/recipes-kernel/linux-perf/files/rules
new file mode 100644
index 0000000..e23586c
--- /dev/null
+++ b/meta-isar/recipes-kernel/linux-perf/files/rules
@@ -0,0 +1,53 @@ 
+#!/usr/bin/make -f
+# Note: this ruleset is based on the Makefile
+# that is used for building the linux-perf-<KR>
+# package in debian
+
+VERSION := 4.19
+deb_top_dir := $(CURDIR)/debian
+DESTDIR := $(deb_top_dir)/binarypackage
+PARALLEL_BUILD=-j $(shell echo $$(($$(nproc) * 2)))
+
+CFLAGS := $(shell dpkg-buildflags --get CFLAGS) -Wall
+CXXFLAGS := $(shell dpkg-buildflags --get CXXFLAGS) -Wall
+LDFLAGS := $(shell dpkg-buildflags --get LDFLAGS)
+
+MAKE_PERF := $(MAKE) O=$(CURDIR) prefix=/usr V=1 VF=1 WERROR=0 EXTRA_CFLAGS='$(CFLAGS) $(CPPFLAGS)' LDFLAGS='$(LDFLAGS)'
+MAKE_PERF += NO_GTK2=1
+MAKE_PERF += feature-jvmti=0
+MAKE_PERF += perfexecdir=lib/perf_$(VERSION)-core plugindir=/usr/lib/traceevent_$(VERSION)/plugins STRACE_GROUPS_DIR=share/perf_$(VERSION)-core/strace/groups tipdir=share/doc/linux-perf-$(VERSION) perf_include_dir=include/perf_$(VERSION) perf_examples_dir=share/doc/linux-perf-$(VERSION)/examples
+MAKE_PERF += feature-libbfd=0 feature-libbfd-liberty=0 feature-libbfd-liberty-z=0 HAVE_CPLUS_DEMANGLE_SUPPORT=1
+MAKE_PERF += NO_LIBCRYPTO=1
+MAKE_PERF += LIBBABELTRACE=1
+MAKE_PERF += USE_ASCIIDOCTOR=1
+MAKE_PERF += PYTHON=/usr/bin/python3
+VERS_PATTERN := $(subst .,[._],$(VERSION))
+
+
+override_dh_auto_build:
+	+${MAKE_PERF} ${PARALLEL_MAKE} -C tools/perf -f Makefile.perf all VERSION=$(VERSION) DESTDIR=dummy
+	# Check that perf didn't get linked against libbfd or libcrypto
+	! ldd $(CURDIR)/perf | grep -E '\blib(bfd|crypto)'
+	# Check that it includes cplus_demangle from libiberty
+	grep cplus_demangle $(CURDIR)/perf
+
+override_dh_auto_install:
+	+${MAKE_PERF} ${PARALLEL_MAKE} -C tools/perf -f Makefile.perf install VERSION=$(VERSION) DESTDIR=$(DESTDIR)
+	rm -f $(DESTDIR)/usr/bin/trace_$(VERSION)
+	mkdir -p $(DESTDIR)/usr/share/bash-completion/
+	mv $(DESTDIR)/etc/bash_completion.d \
+		$(DESTDIR)/usr/share/bash-completion/completions
+	rmdir --ignore-fail-on-non-empty $(DESTDIR)/etc
+
+	# Check for unversioned files that are likely to result in file conflicts
+	cd $(DESTDIR) && ! find \! -type d \! -path '*[_-]$(VERS_PATTERN)*' | grep .
+
+override_dh_auto_clean:
+	rm -rf ${deb_top_dir}/binarypackage
+
+override_dh_auto_test:
+	echo "Skip tests"
+
+%:
+	CFLAGS= LDFLAGS= dh $@ --parallel
+
diff --git a/meta-isar/recipes-kernel/linux-perf/files/tools-perf-install.patch b/meta-isar/recipes-kernel/linux-perf/files/tools-perf-install.patch
new file mode 100644
index 0000000..8cfd02a
--- /dev/null
+++ b/meta-isar/recipes-kernel/linux-perf/files/tools-perf-install.patch
@@ -0,0 +1,58 @@ 
+From: Bastian Blank <waldi@debian.org>
+Date: Fri, 07 Oct 2011 21:37:52 +0100
+Subject: Install perf scripts non-executable
+Forwarded: no
+
+[bwh: Forward-ported to 4.13]
+
+Index: linux/tools/perf/Makefile.perf
+===================================================================
+--- linux.orig/tools/perf/Makefile.perf
++++ linux/tools/perf/Makefile.perf
+@@ -796,8 +796,8 @@ endif
+ ifndef NO_LIBPERL
+ 	$(call QUIET_INSTALL, perl-scripts) \
+ 		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/Perf-Trace-Util/lib/Perf/Trace'; \
+-		$(INSTALL) scripts/perl/Perf-Trace-Util/lib/Perf/Trace/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/Perf-Trace-Util/lib/Perf/Trace'; \
+-		$(INSTALL) scripts/perl/*.pl -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl'; \
++		$(INSTALL) -m 644 scripts/perl/Perf-Trace-Util/lib/Perf/Trace/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/Perf-Trace-Util/lib/Perf/Trace'; \
++		$(INSTALL) -m 644 scripts/perl/*.pl -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl'; \
+ 		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/bin'; \
+ 		$(INSTALL) scripts/perl/bin/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/bin'
+ endif
+@@ -805,27 +805,27 @@ ifndef NO_LIBPYTHON
+ 	$(call QUIET_INSTALL, python-scripts) \
+ 		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/Perf-Trace-Util/lib/Perf/Trace'; \
+ 		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/bin'; \
+-		$(INSTALL) scripts/python/Perf-Trace-Util/lib/Perf/Trace/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/Perf-Trace-Util/lib/Perf/Trace'; \
+-		$(INSTALL) scripts/python/*.py -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python'; \
++		$(INSTALL) -m 644 scripts/python/Perf-Trace-Util/lib/Perf/Trace/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/Perf-Trace-Util/lib/Perf/Trace'; \
++		$(INSTALL) -m 644 scripts/python/*.py -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python'; \
+ 		$(INSTALL) scripts/python/bin/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/bin'
+ endif
+ 	$(call QUIET_INSTALL, perf_completion-script) \
+ 		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(sysconfdir_SQ)/bash_completion.d'; \
+-		$(INSTALL) perf-completion.sh '$(DESTDIR_SQ)$(sysconfdir_SQ)/bash_completion.d/perf_$(VERSION)'
++		$(INSTALL) -m 644 perf-completion.sh '$(DESTDIR_SQ)$(sysconfdir_SQ)/bash_completion.d/perf_$(VERSION)'
+ 	$(call QUIET_INSTALL, perf-tip) \
+ 		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(tip_instdir_SQ)'; \
+-		$(INSTALL) Documentation/tips.txt -t '$(DESTDIR_SQ)$(tip_instdir_SQ)'
++		$(INSTALL) -m 644 Documentation/tips.txt -t '$(DESTDIR_SQ)$(tip_instdir_SQ)'
+ 
+ install-tests: all install-gtk
+ 	$(call QUIET_INSTALL, tests) \
+ 		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests'; \
+-		$(INSTALL) tests/attr.py '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests'; \
++		$(INSTALL) -m 644 tests/attr.py '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests'; \
+ 		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/attr'; \
+-		$(INSTALL) tests/attr/* '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/attr'; \
++		$(INSTALL) -m 644 tests/attr/* '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/attr'; \
+ 		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/shell'; \
+-		$(INSTALL) tests/shell/*.sh '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/shell'; \
++		$(INSTALL) -m 644 tests/shell/*.sh '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/shell'; \
+ 		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/shell/lib'; \
+-		$(INSTALL) tests/shell/lib/*.sh '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/shell/lib'
++		$(INSTALL) -m 644 tests/shell/lib/*.sh '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/shell/lib'
+ 
+ install-bin: install-tools install-tests install-traceevent-plugins
+ 
diff --git a/meta-isar/recipes-kernel/linux-perf/files/tools-perf-python.patch b/meta-isar/recipes-kernel/linux-perf/files/tools-perf-python.patch
new file mode 100644
index 0000000..5770d9f
--- /dev/null
+++ b/meta-isar/recipes-kernel/linux-perf/files/tools-perf-python.patch
@@ -0,0 +1,55 @@ 
+--- a/tools/perf/Makefile.perf
++++ b/tools/perf/Makefile.perf
+@@ -829,10 +829,10 @@
+ 
+ install-bin: install-tools install-tests install-traceevent-plugins
+ 
+-install: install-bin try-install-man
+-
+ install-python_ext:
+-	$(PYTHON_WORD) util/setup.py --quiet install --root='/$(DESTDIR_SQ)'
++	$(PYTHON_WORD) util/setup.py --quiet install --root='/$(DESTDIR_SQ)' --install-layout=deb;
++
++install: install-bin try-install-man install-python_ext
+ 
+ # 'make install-doc' should call 'make -C Documentation install'
+ $(INSTALL_DOC_TARGETS):
+--- a/tools/perf/util/setup.py
++++ b/tools/perf/util/setup.py
+@@ -51,14 +51,14 @@
+ # use full paths with source files
+ ext_sources = list(map(lambda x: '%s/%s' % (src_perf, x) , ext_sources))
+ 
+-perf = Extension('perf',
++perf = Extension('perf_4_19',
+ 		  sources = ext_sources,
+ 		  include_dirs = ['util/include'],
+ 		  extra_compile_args = cflags,
+ 		  extra_objects = [libtraceevent, libapikfs],
+                  )
+ 
+-setup(name='perf',
++setup(name='perf_4_19',
+       version='0.1',
+       description='Interface with the Linux profiling infrastructure',
+       author='Arnaldo Carvalho de Melo',
+--- a/tools/perf/util/python.c
++++ b/tools/perf/util/python.c
+@@ -77,7 +77,7 @@
+ #if PY_MAJOR_VERSION < 3
+ PyMODINIT_FUNC initperf(void);
+ #else
+-PyMODINIT_FUNC PyInit_perf(void);
++PyMODINIT_FUNC PyInit_perf_4_19(void);
+ #endif
+ 
+ #define member_def(type, member, ptype, help) \
+@@ -1270,7 +1270,7 @@
+ #if PY_MAJOR_VERSION < 3
+ PyMODINIT_FUNC initperf(void)
+ #else
+-PyMODINIT_FUNC PyInit_perf(void)
++PyMODINIT_FUNC PyInit_perf_4_19(void)
+ #endif
+ {
+ 	PyObject *obj;
diff --git a/meta-isar/recipes-kernel/linux-perf/files/tools-perf-version.patch b/meta-isar/recipes-kernel/linux-perf/files/tools-perf-version.patch
new file mode 100644
index 0000000..6833bb7
--- /dev/null
+++ b/meta-isar/recipes-kernel/linux-perf/files/tools-perf-version.patch
@@ -0,0 +1,119 @@ 
+From: Bastian Blank <waldi@debian.org>
+Date: Mon, 26 Sep 2011 13:53:12 +0100
+Subject: Create manpages and binaries including the version
+Forwarded: no
+
+[bwh: Fix version insertion in perf man page cross-references and perf
+man page title.  Install bash_completion script for perf with a
+version-dependent name.  And do the same for trace.]
+
+Index: linux/tools/perf/Makefile.perf
+===================================================================
+--- linux.orig/tools/perf/Makefile.perf
++++ linux/tools/perf/Makefile.perf
+@@ -759,23 +759,23 @@ endif
+ install-tools: all install-gtk
+ 	$(call QUIET_INSTALL, binaries) \
+ 		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'; \
+-		$(INSTALL) $(OUTPUT)perf '$(DESTDIR_SQ)$(bindir_SQ)'; \
+-		$(LN) '$(DESTDIR_SQ)$(bindir_SQ)/perf' '$(DESTDIR_SQ)$(bindir_SQ)/trace'
++		$(INSTALL) $(OUTPUT)perf '$(DESTDIR_SQ)$(bindir_SQ)/perf_$(VERSION)'; \
++		$(LN) '$(DESTDIR_SQ)$(bindir_SQ)/perf_$(VERSION)' '$(DESTDIR_SQ)$(bindir_SQ)/trace_$(VERSION)'
++	$(call QUIET_INSTALL, libexec) \
++		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)'
+ ifndef NO_PERF_READ_VDSO32
+ 	$(call QUIET_INSTALL, perf-read-vdso32) \
+-		$(INSTALL) $(OUTPUT)perf-read-vdso32 '$(DESTDIR_SQ)$(bindir_SQ)';
++		$(INSTALL) $(OUTPUT)perf-read-vdso32 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)';
+ endif
+ ifndef NO_PERF_READ_VDSOX32
+ 	$(call QUIET_INSTALL, perf-read-vdsox32) \
+-		$(INSTALL) $(OUTPUT)perf-read-vdsox32 '$(DESTDIR_SQ)$(bindir_SQ)';
++		$(INSTALL) $(OUTPUT)perf-read-vdsox32 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)';
+ endif
+ ifndef NO_JVMTI
+ 	$(call QUIET_INSTALL, $(LIBJVMTI)) \
+ 		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(libdir_SQ)'; \
+ 		$(INSTALL) $(OUTPUT)$(LIBJVMTI) '$(DESTDIR_SQ)$(libdir_SQ)';
+ endif
+-	$(call QUIET_INSTALL, libexec) \
+-		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)'
+ ifndef NO_LIBBPF
+ 	$(call QUIET_INSTALL, bpf-headers) \
+ 		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perf_include_instdir_SQ)/bpf'; \
+@@ -811,7 +811,7 @@ ifndef NO_LIBPYTHON
+ endif
+ 	$(call QUIET_INSTALL, perf_completion-script) \
+ 		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(sysconfdir_SQ)/bash_completion.d'; \
+-		$(INSTALL) perf-completion.sh '$(DESTDIR_SQ)$(sysconfdir_SQ)/bash_completion.d/perf'
++		$(INSTALL) perf-completion.sh '$(DESTDIR_SQ)$(sysconfdir_SQ)/bash_completion.d/perf_$(VERSION)'
+ 	$(call QUIET_INSTALL, perf-tip) \
+ 		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(tip_instdir_SQ)'; \
+ 		$(INSTALL) Documentation/tips.txt -t '$(DESTDIR_SQ)$(tip_instdir_SQ)'
+@@ -836,7 +836,7 @@ install-python_ext:
+ 
+ # 'make install-doc' should call 'make -C Documentation install'
+ $(INSTALL_DOC_TARGETS):
+-	$(QUIET_SUBDIR0)Documentation $(QUIET_SUBDIR1) $(@:-doc=)
++	$(QUIET_SUBDIR0)Documentation $(QUIET_SUBDIR1) $(@:-doc=) VERSION=$(VERSION)
+ 
+ ### Cleaning rules
+ 
+Index: linux/tools/perf/Documentation/Makefile
+===================================================================
+--- linux.orig/tools/perf/Documentation/Makefile
++++ linux/tools/perf/Documentation/Makefile
+@@ -194,14 +194,16 @@ ifdef missing_tools
+ 	$(error "You need to install $(missing_tools) for man pages")
+ endif
+ 
+-do-install-man: man
++do-install-man: $(addprefix install-man-,$(_DOC_MAN1))
++
++install-man-perf.1: $(OUTPUT)perf.1
++	$(INSTALL) -d -m 755 $(DESTDIR)$(man1dir)
++	sed -e 's/"PERF"/"PERF_$(VERSION)"/' -e 's/fBperf-/fBperf_$(VERSION)-/g' $^ > $(DESTDIR)$(man1dir)/perf_$(VERSION).1
++
++install-man-perf%.1: $(OUTPUT)perf%.1
+ 	$(call QUIET_INSTALL, Documentation-man) \
+ 		$(INSTALL) -d -m 755 $(DESTDIR)$(man1dir); \
+-#		$(INSTALL) -d -m 755 $(DESTDIR)$(man5dir); \
+-#		$(INSTALL) -d -m 755 $(DESTDIR)$(man7dir); \
+-		$(INSTALL) -m 644 $(DOC_MAN1) $(DESTDIR)$(man1dir); \
+-#		$(INSTALL) -m 644 $(DOC_MAN5) $(DESTDIR)$(man5dir); \
+-#		$(INSTALL) -m 644 $(DOC_MAN7) $(DESTDIR)$(man7dir)
++		sed -e 's/"PERF\\-/"PERF_$(VERSION)\\-/' -e 's/fBperf-/fBperf_$(VERSION)-/g' $^ > $(DESTDIR)$(man1dir)/perf_$(VERSION)$*.1
+ 
+ install-man: check-man-tools man do-install-man
+ 
+Index: linux/tools/perf/util/Build
+===================================================================
+--- linux.orig/tools/perf/util/Build
++++ linux/tools/perf/util/Build
+@@ -193,6 +193,7 @@ CFLAGS_libstring.o     += -Wno-unused-pa
+ CFLAGS_hweight.o       += -Wno-unused-parameter -DETC_PERFCONFIG="BUILD_STR($(ETC_PERFCONFIG_SQ))"
+ CFLAGS_parse-events.o  += -Wno-redundant-decls
+ CFLAGS_header.o        += -include $(OUTPUT)PERF-VERSION-FILE
++CFLAGS_vdso.o		+= -DPERFEXECDIR='"$(perfexec_instdir_SQ)"'
+ 
+ $(OUTPUT)util/kallsyms.o: ../lib/symbol/kallsyms.c FORCE
+ 	$(call rule_mkdir)
+Index: linux/tools/perf/util/vdso.c
+===================================================================
+--- linux.orig/tools/perf/util/vdso.c
++++ linux/tools/perf/util/vdso.c
+@@ -52,12 +52,12 @@ static struct vdso_info *vdso_info__new(
+ 		.vdso32  = {
+ 			.temp_file_name = VDSO__TEMP_FILE_NAME,
+ 			.dso_name = DSO__NAME_VDSO32,
+-			.read_prog = "perf-read-vdso32",
++			.read_prog = PERFEXECDIR "/perf-read-vdso32",
+ 		},
+ 		.vdsox32  = {
+ 			.temp_file_name = VDSO__TEMP_FILE_NAME,
+ 			.dso_name = DSO__NAME_VDSOX32,
+-			.read_prog = "perf-read-vdsox32",
++			.read_prog = PERFEXECDIR "/perf-read-vdsox32",
+ 		},
+ #endif
+ 	};
diff --git a/meta-isar/recipes-kernel/linux-perf/linux-perf-4.19_4.19.160.bb b/meta-isar/recipes-kernel/linux-perf/linux-perf-4.19_4.19.160.bb
new file mode 100644
index 0000000..33ff6d2
--- /dev/null
+++ b/meta-isar/recipes-kernel/linux-perf/linux-perf-4.19_4.19.160.bb
@@ -0,0 +1,11 @@ 
+KERNEL_COMPAT_VERSION = "4.19"
+
+SRC_URI += " \
+	https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-${PV}.tar.xz \
+	file://tools-perf-version.patch;apply=yes \
+	file://tools-perf-install.patch;apply=yes \
+	file://tools-perf-python.patch;apply=yes \
+"
+SRC_URI[sha256sum] = "18345206f9c61e8adafa5204d0ca0b8619f1d9aafd70cbd5cb0fbf1faf521585"
+
+require recipes-kernel/linux-perf/linux-perf.inc
diff --git a/meta-isar/recipes-kernel/linux-perf/linux-perf.inc b/meta-isar/recipes-kernel/linux-perf/linux-perf.inc
new file mode 100644
index 0000000..a4bc253
--- /dev/null
+++ b/meta-isar/recipes-kernel/linux-perf/linux-perf.inc
@@ -0,0 +1,46 @@ 
+# Kernel specific linux-perf-<KR> package
+# Note, that only major and minor versions of the
+# kernel have to match, the patch level should be
+# irrelevant.
+
+inherit dpkg
+
+MAINTAINER ?= "Felix Moessbauer <felix.moessbauer@siemens.com>"
+DESCRIPTION ?= "Performance analysis tools for Linux ${KERNEL_COMPAT_VERSION}"
+CHANGELOG_V ?= "${PV}+isar"
+
+SRC_URI += "file://rules"
+S = "${WORKDIR}/linux-${PV}"
+
+DEBIAN_BUILD_DEPENDS ?= " \
+  asciidoctor, \
+  gcc-multilib [amd64 mips64 mips64el mips64r6 mips64r6el ppc64 s390x sparc64], \
+  libaudit-dev, \
+  libbabeltrace-dev (>= 1.5.0), \
+  libbabeltrace-dev (>= 1.5.3-2~) | libbabeltrace-ctf-dev (>= 1.5.0), \
+  libdw-dev, \
+  libiberty-dev, \
+  libnewt-dev, \
+  libnuma-dev, \
+  libperl-dev, \
+  libunwind-dev [amd64 arm64 armel armhf hppa i386 mips mips64 mips64el mipsel powerpc ppc64 ppc64el sh4], \
+  libopencsd-dev, \
+  python3-dev, \
+  flex, \
+  bison, \
+"
+
+DEBIAN_DEPENDS ?= "\${shlibs:Depends}, \${misc:Depends}, \${perl:Depends}, \${python3:Depends}"
+
+do_prepare_build[cleandirs] += "${S}/debian"
+
+do_prepare_build() {
+	deb_debianize
+	echo "3.0 (quilt)" > ${S}/debian/source
+	echo "debian/binarypackage/usr /" > ${S}/debian/install
+	deb_add_changelog
+}
+
+dpkg_runbuild_prepend() {
+    export DEB_BUILD_OPTIONS="nocheck"
+}