Commit Graph

1518 Commits

Author SHA1 Message Date
Joe Lawrence
7e5f59e10f Bump version to 0.6.0
Increment version to 0.6.0 due to 926e4e0c7d ("kmod: add support for
in-kernel livepatch hooks"), which removed the kpatch (un)load hook API
support and converted to livepatch-style hooks.

Additional changes include:

* Lots of misc bugfixes and cleanups
* Manpage, README.md fixups
* More PPC64 work
* "Undefined reference" build failure rework
* Livepatch disable retries
* New unit testing framework

Signed-off-by: Joe Lawrence <joe.lawrence@redhat.com>
Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
2018-04-22 15:03:08 -05:00
Josh Poimboeuf
6db0a6f06c kpatch: increase patch transition stall timeout
I loaded a livepatch on an idle 112 CPU system, and it took over three
seconds for the patch transition to complete:

  [1561551.584871] livepatch: 'livepatch_foo': starting patching transition
  [1561554.867486] livepatch: 'livepatch_foo: patching complete

Presumably this is because more CPUS == more kthreads and idle tasks,
which are more likely to be running at any given time.

Currently the kpatch script will start signaling tasks if the transition
takes more than five seconds.  Increase that timeout a bit to 15
seconds, to give big/busy systems more time before we start signaling.

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
2018-04-20 16:31:42 -05:00
Josh Poimboeuf
3feb694c91 test/unit: further silence non-verbose mode
Just show a summary of each test command in non-verbose mode.

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
2018-04-20 08:16:26 -05:00
Josh Poimboeuf
4c1184dcf7 test/unit: add a library for common functions
I placed the library in the top-level test directory, as the same
assertions could also be used by the integration tests once we rework
them a bit.

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
2018-04-20 08:16:20 -05:00
Josh Poimboeuf
1fa1e7a05a
Merge pull request #840 from jpoimboe/config-stacktrace
kmod/core: add check for CONFIG_STACKTRACE
2018-04-20 06:39:13 -05:00
Josh Poimboeuf
81fb34ed57
Merge pull request #835 from jpoimboe/function-ptr-new
create-diff-object: skip dynrelas for function pointers to new functions
2018-04-20 06:38:55 -05:00
Josh Poimboeuf
4f6a96f94a kmod/core: add check for CONFIG_STACKTRACE
As discovered in #837.

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
2018-04-19 17:27:38 -05:00
Josh Poimboeuf
d6dfa4a992 test/unit: test the number of patched functions
As an extra sanity check, ensure the number of patched functions never
changes.

Also added a test for convert-global-local to ensure the global symbol
is converted to a local.

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
2018-04-19 17:19:09 -05:00
Josh Poimboeuf
e16b4187a1 test/integration: remove obsolete tests
Cleaning house a bit.  Now that we have unit tests, a lot of these tests
aren't very useful anymore.

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
2018-04-19 17:19:09 -05:00
Josh Poimboeuf
5629d91bfe test/unit: add WARN test
Add a WARN detection test, based on the integration test of the same
name.

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
2018-04-19 17:19:09 -05:00
Josh Poimboeuf
8e315b42e0 test/integration: update WARN detection patch
Update the WARN detection patch to be based on net/core/dev.c, which is
a much better stress test.

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
2018-04-19 17:19:09 -05:00
Josh Poimboeuf
635754fc46 test/unit: add meminfo-string test
Copy the meminfo-string test from the integration tests.  It's a good
stress test for dynrelas.

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
2018-04-19 17:19:08 -05:00
Josh Poimboeuf
0e1b95edea create-diff-object: update the __LINE__ macro checks
Update the `__LINE__` macro detection heuristics based on recent kernel
changes:

- __warn_printk(), used in the WARN macros, which put the line number in
  %edx

- __might_fault(), used in the usercopy macros

- lockdep_rcu_suspicious(), used in the RCU_LOCKDEP_WARN macro

- printk(), used in the ASSERT_RTNL macro

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
2018-04-19 17:19:08 -05:00
Josh Poimboeuf
ff5bcc2fdc test/unit: broaden the 'clean' target
Broaden the impact of the 'clean' target so that output objects will
still get cleaned when when old tests get removed or renamed.

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
2018-04-19 17:19:08 -05:00
Josh Poimboeuf
af9f9f491c test: remove obsolete tests
After doing some research, I've discovered that most of these tests no
longer test what they were originally intended to test.

An exception here is the 'macro-hooks' test, which is probably better
suited as an integration test, so I removed its unit test and kept its
integration test.

Really, most of these tests weren't all that useful to begin with, so
it's not a big loss.  The one exception is 'gcc-static-local-var-2',
which was originally meant to test multiple static local variables with
the same name in the name function.  That's a good thing, so I'll try to
come up with another test for that which works with Linux 4.16.

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
2018-04-19 17:19:08 -05:00
Josh Poimboeuf
805b1f5d3f test/unit: fix 'new-fuction' test name typo
Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
2018-04-19 17:19:08 -05:00
Josh Poimboeuf
4884fd17fc
Merge pull request #832 from sm00th/ccache-link
readme: fix outdated epel ccache link
2018-04-19 08:29:36 -05:00
Josh Poimboeuf
678701e56e
Merge pull request #833 from sm00th/ppc64le-plugin-install-fix
ppc64le: fix gcc-plugin installation
2018-04-19 08:29:15 -05:00
Artem Savkov
c16306f272 travis-ci: test installation
Install kpatch during testing so that any bugs in makefiles such as #833
can be caught early.

Signed-off-by: Artem Savkov <asavkov@redhat.com>
2018-04-19 15:14:17 +02:00
Josh Poimboeuf
87939db272 create-diff-object: skip dynrelas for function pointers to new functions
With #755, we started using dynrelas for function pointers.  However,
this behavior only makes sense for function pointers to existing
functions.  For function pointers to *new* functions, just use a normal
rela.

The 'function-ptr-new' unit test is from the following patch:

  https://github.com/dynup/kpatch/files/1927198/new-static-callback.patch.txt

Fixes #834.

Fixes: 495e619750 ("kpatch-build, x86: do not use the patched functions as callbacks directly")
Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
2018-04-19 07:56:12 -05:00
Artem Savkov
a4241797fb ppc64le: fix gcc-plugin installation
Because $PLUGIN variable is a part of $TARGETS we are trying to install
gcc-plugins twice which is treated as an error by install command:

/usr/bin/install create-diff-object create-klp-module create-kpatch-module gcc-plugins/ppc64le-plugin.so kpatch-gcc gcc-plugins/ppc64le-plugin.so /usr/local/libexec/kpatch
/usr/bin/install: will not overwrite just-created '/usr/local/libexec/kpatch/ppc64le-plugin.so' with 'gcc-plugins/ppc64le-plugin.so'

Signed-off-by: Artem Savkov <asavkov@redhat.com>
2018-04-19 10:16:37 +02:00
Artem Savkov
211c6243f2 readme: fix outdated epel ccache link
Update ccache link to point to current version/location.

Signed-off-by: Artem Savkov <asavkov@redhat.com>
2018-04-19 09:34:47 +02:00
Josh Poimboeuf
b3b9e858fe
Merge pull request #831 from jpoimboe/unit-stderr
unit: don't suppress stderr
2018-04-18 08:26:52 -05:00
Josh Poimboeuf
69ba464462 unit: don't suppress stderr in non-fail tests
Don't suppress stderr in the non-fail unit tests so that
create-diff-object error messages will be printed.

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
2018-04-18 08:03:25 -05:00
Joe Lawrence
4caf44ff66
Merge pull request #830 from sm00th/travisci
Enable TravisCI
2018-04-17 10:16:54 -04:00
Joe Lawrence
e7834dcdff
Merge pull request #828 from rppt/callbacks-fix
livepatch-patch-hook: make callbacks addition depend on the kernel ve…
2018-04-17 10:16:02 -04:00
Mike Rapoport
dd1bfbecd5 livepatch-patch-hook: make callbacks addition depend on the kernel version
Since commit 926e4e0c7d ("kmod: add support
for in-kernel livepatch hooks") livepatch-patch-hook.c unconditionally
creates callbacks. This causes build error for kernels older than 4.15:

make -C /home/rppt/git/linux M=/home/rppt/.kpatch/tmp/patch livepatch-proc-vmalloc-live.ko
make[1]: Entering directory '/home/rppt/git/linux'
  CC [M]  /home/rppt/.kpatch/tmp/patch/patch-hook.o
In file included from /home/rppt/.kpatch/tmp/patch/patch-hook.c:21:0:
/home/rppt/.kpatch/tmp/patch/livepatch-patch-hook.c:82:23: error: field ‘callbacks’ has incomplete type
  struct klp_callbacks callbacks;
                       ^
/home/rppt/.kpatch/tmp/patch/livepatch-patch-hook.c: In function ‘patch_init’:
/home/rppt/.kpatch/tmp/patch/livepatch-patch-hook.c:395:10: error: ‘struct klp_object’ has no member named ‘callbacks’
   lobject->callbacks = object->callbacks;
          ^
scripts/Makefile.build:302: recipe for target '/home/rppt/.kpatch/tmp/patch/patch-hook.o' failed
make[2]: *** [/home/rppt/.kpatch/tmp/patch/patch-hook.o] Error 1
Makefile:1687: recipe for target 'livepatch-proc-vmalloc-live.ko' failed
make[1]: *** [livepatch-proc-vmalloc-live.ko] Error 2
make[1]: Leaving directory '/home/rppt/git/linux'
Makefile:20: recipe for target 'livepatch-proc-vmalloc-live.ko' failed
make: *** [livepatch-proc-vmalloc-live.ko] Error 2

Introduce HAVE_CALLBACKS to allow conditional compilation of the callbacks
addition.

Signed-off-by: Mike Rapoport <rppt@linux.vnet.ibm.com>
2018-04-16 20:06:38 +03:00
Josh Poimboeuf
0d99e91c46
Merge pull request #824 from joe-lawrence/author-guide-callback-locks
patch-author-guide: more on locks in callbacks
2018-04-16 07:59:13 -05:00
Artem Savkov
ebe51660b9 Enable TravisCI
Add .travis.yml with build/unit/shellcheck tests.

Signed-off-by: Artem Savkov <asavkov@redhat.com>
2018-04-16 14:06:11 +02:00
Joe Lawrence
9b5ade5c12
Merge pull request #818 from sm00th/unittests
Unittests
2018-04-13 17:15:07 -04:00
Joe Lawrence
88241ef8e5
Merge pull request #829 from sm00th/sign-compare
Sign compare fixes
2018-04-13 15:21:07 -04:00
Joe Lawrence
fb06282505 patch-author-guide: more on locks in callbacks
Elaborate on the difficulties in using locks/mutexes from the kpatch
callback routines and suggest a few workarounds.

Signed-off-by: Joe Lawrence <joe.lawrence@redhat.com>
2018-04-13 15:13:18 -04:00
Artem Savkov
1ada45a352 unittests: top-level make target
Add new 'unit' make target to top-level makefile.
Add unittests dir to CLEAN_DIRS.

Signed-off-by: Artem Savkov <asavkov@redhat.com>
2018-04-13 18:11:51 +02:00
Artem Savkov
a0edfc1ded unittests: check that obj files are fetched
Check that tested .o is not an lfs meta-file before testing.

Signed-off-by: Artem Savkov <asavkov@redhat.com>
2018-04-13 18:11:50 +02:00
Artem Savkov
b9c56c475a uinttests: add strip check
Check that files are stripped of debuginfo as it is useless for
unittesting at this moment.

Signed-off-by: Artem Savkov <asavkov@redhat.com>
2018-04-13 18:11:17 +02:00
Artem Savkov
3ee81ec4ee x86_64: integration test objs
Populate x86_64 dir with objectfiles from integration test builds.

Signed-off-by: Artem Savkov <asavkov@redhat.com>
2018-04-13 18:10:34 +02:00
Artem Savkov
a05c644c7b Add create-diff-object unittest framework
Add a simple unittest framework for create-diff-object implemented in
GNU Make.
It will automatically scan the kpatch-unit-objs/$(uname -m) directory
for specifically named files running one of 3 tests:
  - creating diff object with expected success
  - creating diff object with expected failure
  - creating diff object and running a shell script on it with expected
  success

Signed-off-by: Artem Savkov <asavkov@redhat.com>
2018-04-13 18:09:37 +02:00
Artem Savkov
a39eace756 kpatch-build: add -Wsign-compare to CFLAGS
Add -Wsign-compare to kpatch-build CFLAGS to make sure something like #826
never happens again.

Signed-off-by: Artem Savkov <asavkov@redhat.com>
2018-04-13 16:27:23 +02:00
Artem Savkov
1638c64fe5 Fix multiple sign-compare warnings
- convert section/symbol indexes and rela->offset to unsigned int as I
    couldn't find any way for them to become negative.
  - cast a number of rela->addend comparisons to int (assuming an 64bit
    system this should be enough)
  - a number of simple for-loop counter conversions to the type it
    compares against

Signed-off-by: Artem Savkov <asavkov@redhat.com>
2018-04-13 16:26:06 +02:00
Joe Lawrence
c5e4b51982
Merge pull request #827 from vincentbernat/fix/ubuntu-kernel-retry
kpatch-build: fix Ubuntu kernel detection on successive retries
2018-04-12 14:11:38 -04:00
Joe Lawrence
2a53a96ade
Merge pull request #826 from sm00th/oorr-comparison-fix
Fix false-positives in kpatch_check_relocations
2018-04-12 13:44:23 -04:00
Vincent Bernat
e2e7d2cd21 kpatch-build: fix Ubuntu kernel detection on successive retries
If a patch failed a first time, kpatch-build is using the previous
cache directory on subsequent builds. The UBUNTU_KERNEL=1 variable is
not set in this case. Therefore, utsrelease.h is not updated correctly
and the appropriate structures are not used. Just check if distro is
Ubuntu and we didn't request our own specific directory.

Signed-off-by: Vincent Bernat <vincent@bernat.im>
2018-04-12 18:29:18 +02:00
Artem Savkov
4591c0701c Fix false-positives in kpatch_check_relocations
Because of signedness difference kpatch_check_relocations() would trigger
an error on any negative addend.
Fix by casting Elf_Data->d_size from size_t to int.

Signed-off-by: Artem Savkov <asavkov@redhat.com>
2018-04-12 17:46:12 +02:00
Joe Lawrence
88e9eb3ee0
Merge pull request #823 from sm00th/oorr
create-diff-object: check for out-of-range relocations
2018-04-11 14:54:24 -04:00
Joe Lawrence
86d18c7ce3
Merge pull request #816 from joe-lawrence/module-probe-failed
kmod/core: account for failing modules in notifier
2018-04-11 10:40:58 -04:00
Joe Lawrence
326b8f863b
Merge pull request #822 from sm00th/aguide
patch-author-guide: sleeping locks in callbacks
2018-04-11 10:12:28 -04:00
Joe Lawrence
ae79f2206d
Merge pull request #812 from kirawrath/upstart-support
Adding support to upstart systems.
2018-04-11 10:10:59 -04:00
Artem Savkov
1d9f75a155 create-diff-object: check for out-of-range relocations
Check that none of the relocations are out-of-range of their
corresponding sections before writing the output elf.

Fixes: #618

Signed-off-by: Artem Savkov <asavkov@redhat.com>
2018-04-11 10:40:34 +02:00
Joe Lawrence
fdf36400fb kmod/core: account for failing modules in notifier
The module notifier currently only handles newly loaded modules in the
MODULE_STATE_COMING state.  If target modules need to be unloaded, the
any kpatch module that patches it must first be disabled, releasing
module references held against the target module.  When the kpatch
modules are disabled, the target module is unpatched and the kpatch
core's data structures updated accordingly.

If a loading module happens to fail its init routine (missing hardware
for example), that module will not complete loading.  The kpatch core
doesn't properly account for this "phantom" target module, so when the
kpatch patch module is removed, it spews out an ugly warning when
attempting to remove a non-existing ftrace filter on the target module.

Register an additional module notifier (first in the list) to handle the
MODULE_STATE_GOING case.  This handler needs to do the inverse of the
MODULE_STATE_COMING handler.

Fixes #699.

Signed-off-by: Joe Lawrence <joe.lawrence@redhat.com>
2018-04-10 11:46:36 -04:00
Joe Lawrence
e73d98ec0f
Merge pull request #820 from kamalesh-babulal/ppc64le_rela_equal
create-diff-object: Refactor rela_equal() using toc_rela()
2018-04-06 17:24:24 -04:00