On 01/29/2018 08:35 PM, Khem Raj wrote:
On Mon, Jan 29, 2018 at 7:06 AM, Ruslan Bilovol <rbilo...@cisco.com> wrote:
kpatch is a Linux dynamic kernel patching infrastructure
which allows you to patch a running kernel without
rebooting or restarting any processes

Currently it is enabled and tested on x86-64 systems,
although can be extended to PPC64 as well.


perhaps not ready for oe-core yet doesnt seem to support all core
arches, may be meta-oe is a better place for it for now

Do you mean this should be done because Kpatch tool itself doesn't support
all core arches, or because this recipe doesn't contain support of all arches
which Kpatch support?

So to clarify support matrix, LivePatch feature in mainstream Linux
Kernel is available only for x86-64, PPC64 and S390 architectures;
patches for ARM64 support are on their way to kernel.

Kpatch tool supports only x86-64 and PPC64 architectures.

This recipe supports only x86-64 architecture because there is
no HW in openembedded-core for which I can build and test it.

E.g. there is QEMU machine for x86-64 but there is no for PPC64.
Any other way to test it?

Thanks,
Ruslan



Signed-off-by: Ruslan Bilovol <rbilo...@cisco.com>
---
  meta/recipes-kernel/kpatch/kpatch.inc              |  49 ++++++++++
  ...patch-build-add-cross-compilation-support.patch | 103 +++++++++++++++++++++
  ...tch-build-allow-overriding-of-distro-name.patch |  62 +++++++++++++
  meta/recipes-kernel/kpatch/kpatch_git.bb           |  11 +++
  4 files changed, 225 insertions(+)
  create mode 100644 meta/recipes-kernel/kpatch/kpatch.inc
  create mode 100644 
meta/recipes-kernel/kpatch/kpatch/0001-kpatch-build-add-cross-compilation-support.patch
  create mode 100644 
meta/recipes-kernel/kpatch/kpatch/0002-kpatch-build-allow-overriding-of-distro-name.patch
  create mode 100644 meta/recipes-kernel/kpatch/kpatch_git.bb

diff --git a/meta/recipes-kernel/kpatch/kpatch.inc 
b/meta/recipes-kernel/kpatch/kpatch.inc
new file mode 100644
index 0000000..b1e73e9
--- /dev/null
+++ b/meta/recipes-kernel/kpatch/kpatch.inc
@@ -0,0 +1,49 @@
+SUMMARY = "Linux dynamic kernel patching infrastructure"
+DESCRIPTION = "kpatch is a Linux dynamic kernel patching infrastructure which 
allows you to patch a running kernel without rebooting or restarting any processes."
+LICENSE = "GPLv2 & LGPLv2"
+DEPENDS = "elfutils bash"
+
+SRC_URI = "git://github.com/dynup/kpatch.git;protocol=https \
+       file://0001-kpatch-build-add-cross-compilation-support.patch \
+       file://0002-kpatch-build-allow-overriding-of-distro-name.patch \
+       "
+
+EXTRA_OEMAKE = " \
+       PREFIX=${prefix} \
+       BINDIR=${D}${bindir} \
+       SBINDIR=${D}${sbindir} \
+       LIBDIR=${D}${libdir} \
+       MANDIR=${D}${mandir}/man1 \
+       SYSTEMDDIR=${D}${systemd_system_unitdir} \
+       DESTDIR=${D} \
+       BUILDMOD=no \
+       CC='${CC}' \
+       "
+
+S = "${WORKDIR}/git"
+
+do_install () {
+       oe_runmake install
+}
+
+PACKAGES =+ "kpatch-build"
+PROVIDES += "kpatch-build"
+
+COMPATIBLE_HOST = "(x86_64).*-linux"
+
+RDEPENDS_${PN} = "bash binutils"
+RDEPENDS_kpatch-build = "bash glibc-utils"
+
+FILES_${PN} = " \
+       ${sbindir}/kpatch \
+       ${systemd_system_unitdir}/kpatch.service \
+       ${mandir}/man1/kpatch.1.gz \
+       "
+FILES_kpatch-build = " \
+       ${bindir}/kpatch-build \
+       ${libexecdir}/* \
+       ${datadir}/kpatch \
+       ${mandir}/man1/kpatch-build.1.gz \
+       "
+
+SYSTEMD_SERVICE_${PN} = "kpatch.service"
diff --git 
a/meta/recipes-kernel/kpatch/kpatch/0001-kpatch-build-add-cross-compilation-support.patch
 
b/meta/recipes-kernel/kpatch/kpatch/0001-kpatch-build-add-cross-compilation-support.patch
new file mode 100644
index 0000000..459fb21
--- /dev/null
+++ 
b/meta/recipes-kernel/kpatch/kpatch/0001-kpatch-build-add-cross-compilation-support.patch
@@ -0,0 +1,103 @@
+From a9a80a1f4df65892a0269295ce8a64b06f2ff61d Mon Sep 17 00:00:00 2001
+From: Ruslan Bilovol <rbilo...@cisco.com>
+Date: Tue, 19 Dec 2017 15:59:04 +0200
+Subject: [PATCH] kpatch-build: add cross-compilation support
+
+This patch introduces new option for kpatch-build
+script "--cross-compile" which can be used for
+specifying cross-complier prefix.
+It allows to build live patches not only on
+target system, but also on hosts for a target other
+than the one on which the compiler is running
+
+Also removed quotes in exec lines, so it is
+possible to pass multy-component strings like
+"ccache x86_64-xelinux-linux-" as cross-compiler
+
+Upstream-Status: Pending
+
+Signed-off-by: Ruslan Bilovol <rbilo...@cisco.com>
+---
+ kpatch-build/kpatch-build | 13 +++++++++++--
+ kpatch-build/kpatch-gcc   |  4 ++--
+ 2 files changed, 13 insertions(+), 4 deletions(-)
+
+diff --git a/kpatch-build/kpatch-build b/kpatch-build/kpatch-build
+index 166ecbd..af24cc4 100755
+--- a/kpatch-build/kpatch-build
++++ b/kpatch-build/kpatch-build
+@@ -195,7 +195,7 @@ gcc_version_check() {
+       # gcc --version varies between distributions therefore extract version
+       # by compiling a test file and compare it to vmlinux's version.
+       echo 'void main(void) {}' > "$c"
+-      out="$(gcc -c -pg -ffunction-sections -o "$o" "$c" 2>&1)"
++      out="$(${KPATCH_CROSS_COMPILE}gcc -c -pg -ffunction-sections -o "$o" "$c" 
2>&1)"
+       gccver="$(gcc_version_from_file "$o")"
+       kgccver="$(gcc_version_from_file "$VMLINUX")"
+       rm -f "$c" "$o"
+@@ -381,12 +381,14 @@ usage() {
+       echo "          -d, --debug        Enable 'xtrace' and keep scratch files" 
>&2
+       echo "                             in <CACHEDIR>/tmp" >&2
+       echo "                             (can be specified multiple times)" 
>&2
++      echo "          --cross-compile    Specify the prefix used for all 
executables" >&2
++      echo "                             used during compilation" >&2
+       echo "          --skip-cleanup     Skip post-build cleanup" >&2
+       echo "          --skip-gcc-check   Skip gcc version matching check" >&2
+       echo "                             (not recommended)" >&2
+ }
+
+-options="$(getopt -o ha:r:s:c:v:j:t:n:o:d -l 
"help,archversion:,sourcerpm:,sourcedir:,config:,vmlinux:,jobs:,target:,name:,output:,debug,skip-gcc-check,skip-cleanup"
 -- "$@")" || die "getopt failed"
++options="$(getopt -o ha:r:s:c:v:j:t:n:o:d -l 
"help,archversion:,sourcerpm:,sourcedir:,config:,vmlinux:,jobs:,target:,name:,output:,debug,cross-compile:,skip-gcc-check,skip-cleanup"
 -- "$@")" || die "getopt failed"
+
+ eval set -- "$options"
+
+@@ -444,6 +446,10 @@ while [[ $# -gt 0 ]]; do
+                       echo "DEBUG mode enabled"
+               fi
+               ;;
++      --cross-compile)
++              KPATCH_CROSS_COMPILE="$2"
++              shift
++              ;;
+       --skip-cleanup)
+               echo "Skipping cleanup"
+               SKIPCLEANUP=1
+@@ -691,6 +697,8 @@ if [[ $DEBUG -ge 4 ]]; then
+       export KPATCH_GCC_DEBUG=1
+ fi
+
++export KPATCH_CROSS_COMPILE
++
+ echo "Building original kernel"
+ ./scripts/setlocalversion --save-scmversion || die
+ make mrproper 2>&1 | logger || die
+@@ -840,6 +848,7 @@ cd "$TEMPDIR/patch" || die
+ KPATCH_BUILD="$SRCDIR" KPATCH_NAME="$MODNAME" \
+ KBUILD_EXTRA_SYMBOLS="$KBUILD_EXTRA_SYMBOLS" \
+ KPATCH_LDFLAGS="$KPATCH_LDFLAGS" \
++CROSS_COMPILE="$KPATCH_CROSS_COMPILE" \
+       make 2>&1 | logger || die
+
+ if ! "$KPATCH_MODULE"; then
+diff --git a/kpatch-build/kpatch-gcc b/kpatch-build/kpatch-gcc
+index 6ba133c..3937948 100755
+--- a/kpatch-build/kpatch-gcc
++++ b/kpatch-build/kpatch-gcc
+@@ -8,7 +8,7 @@ TOOLCHAINCMD="$1"
+ shift
+
+ if [[ -z "$KPATCH_GCC_TEMPDIR" ]]; then
+-      exec "$TOOLCHAINCMD" "$@"
++      exec ${KPATCH_CROSS_COMPILE}${TOOLCHAINCMD} "$@"
+ fi
+
+ declare -a args=("$@")
+@@ -80,4 +80,4 @@ elif [[ "$TOOLCHAINCMD" = "ld" ]] ; then
+       done
+ fi
+
+-exec "$TOOLCHAINCMD" "${args[@]}"
++exec ${KPATCH_CROSS_COMPILE}${TOOLCHAINCMD} "${args[@]}"
+--
+1.9.1
+
diff --git 
a/meta/recipes-kernel/kpatch/kpatch/0002-kpatch-build-allow-overriding-of-distro-name.patch
 
b/meta/recipes-kernel/kpatch/kpatch/0002-kpatch-build-allow-overriding-of-distro-name.patch
new file mode 100644
index 0000000..a9d8a7f
--- /dev/null
+++ 
b/meta/recipes-kernel/kpatch/kpatch/0002-kpatch-build-allow-overriding-of-distro-name.patch
@@ -0,0 +1,62 @@
+From d418d716dae1e2a05131dfb42a19a4da2fc8a85d Mon Sep 17 00:00:00 2001
+From: Ruslan Bilovol <rbilo...@cisco.com>
+Date: Tue, 2 Jan 2018 14:50:03 +0200
+Subject: [PATCH] kpatch-build: allow overriding of distro name
+
+It is sometimes useful to have ability to override
+distro name, for example during cross-compilation
+build when livepatch modules will be ran on the
+target which differs from host.
+
+This patch adds a new --distro option which
+implements all needed functionality
+
+Upstream-Status: Pending
+
+Signed-off-by: Ruslan Bilovol <rbilo...@cisco.com>
+---
+ kpatch-build/kpatch-build | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/kpatch-build/kpatch-build b/kpatch-build/kpatch-build
+index af24cc4..4f9f78d 100755
+--- a/kpatch-build/kpatch-build
++++ b/kpatch-build/kpatch-build
+@@ -383,12 +383,13 @@ usage() {
+       echo "                             (can be specified multiple times)" 
>&2
+       echo "          --cross-compile    Specify the prefix used for all 
executables" >&2
+       echo "                             used during compilation" >&2
++      echo "          --distro           Override distro name" >&2
+       echo "          --skip-cleanup     Skip post-build cleanup" >&2
+       echo "          --skip-gcc-check   Skip gcc version matching check" >&2
+       echo "                             (not recommended)" >&2
+ }
+
+-options="$(getopt -o ha:r:s:c:v:j:t:n:o:d -l 
"help,archversion:,sourcerpm:,sourcedir:,config:,vmlinux:,jobs:,target:,name:,output:,debug,cross-compile:,skip-gcc-check,skip-cleanup"
 -- "$@")" || die "getopt failed"
++options="$(getopt -o ha:r:s:c:v:j:t:n:o:d -l 
"help,archversion:,sourcerpm:,sourcedir:,config:,vmlinux:,jobs:,target:,name:,output:,debug,cross-compile:,distro:,skip-gcc-check,skip-cleanup"
 -- "$@")" || die "getopt failed"
+
+ eval set -- "$options"
+
+@@ -450,6 +451,10 @@ while [[ $# -gt 0 ]]; do
+               KPATCH_CROSS_COMPILE="$2"
+               shift
+               ;;
++      --distro)
++              DISTRO="$2"
++              shift
++              ;;
+       --skip-cleanup)
+               echo "Skipping cleanup"
+               SKIPCLEANUP=1
+@@ -526,7 +531,7 @@ fi
+ # Don't check external file.
+ # shellcheck disable=SC1091
+ source /etc/os-release
+-DISTRO="$ID"
++DISTRO="${DISTRO:-${ID}}"
+ if [[ "$DISTRO" = fedora ]] || [[ "$DISTRO" = rhel ]] || [[ "$DISTRO" = ol ]] || [[ 
"$DISTRO" = centos ]]; then
+       [[ -z "$VMLINUX" ]] && 
VMLINUX="/usr/lib/debug/lib/modules/$ARCHVERSION/vmlinux"
+       [[ -e "$VMLINUX" ]] || die "kernel-debuginfo-$ARCHVERSION not installed"
+--
+1.9.1
+
diff --git a/meta/recipes-kernel/kpatch/kpatch_git.bb 
b/meta/recipes-kernel/kpatch/kpatch_git.bb
new file mode 100644
index 0000000..e495e28
--- /dev/null
+++ b/meta/recipes-kernel/kpatch/kpatch_git.bb
@@ -0,0 +1,11 @@
+require kpatch.inc
+
+LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263"
+
+SRCREV = "db6efbb8c7e90d2b761272cf563047119072768f"
+
+PV = "0.5.0+git${SRCPV}"
+
+S = "${WORKDIR}/git"
+
+BBCLASSEXTEND = "native nativesdk"
--
1.9.1

--
_______________________________________________
Openembedded-core mailing list
Openembedded-core@lists.openembedded.org
http://lists.openembedded.org/mailman/listinfo/openembedded-core

--
_______________________________________________
Openembedded-core mailing list
Openembedded-core@lists.openembedded.org
http://lists.openembedded.org/mailman/listinfo/openembedded-core

Reply via email to