Commit Graph

567 Commits

Author SHA1 Message Date
Josh Poimboeuf 6b45c5dbd0 remove unused kpatch_dynrela.objname field 2014-06-18 11:17:55 -05:00
Josh Poimboeuf 34cc258a31 fix undefined symbols for future loaded modules
When patching module A, if one of the new function's relas reference a
symbol in module B, we currently just leave it as a normal rela.  But if
module B hasn't been loaded yet, the patch module will fail to load due
to the rela's reference to an undefined symbol.

The fix is to convert these relas to dynrelas, which can be resolved
later in the module notifier when A is loaded.

Also added support for the R_X86_64_NONE relocation type, needed for
dynrelas which reference __fentry__.
2014-06-18 11:17:11 -05:00
Josh Poimboeuf f4bba70412 Merge pull request #248 from spartacus06/debuginfo-support
add debuginfo support
2014-06-17 22:34:20 -05:00
Seth Jennings 32b452aabe add debuginfo support
This commit adds basic debuginfo support.  It is "basic" in as much as
it does not try to parse the DWARF data to figure out which parts
pertain to the changed code.  It simply includes all .debug_ and
.rela.debug_ section and strips out any rela entries that reference
unchanged symbols.  This corrupts the debuginfo for unchanged symbols
but since they are not going to be included anyway, there should be no
way to reference that information.

Signed-off-by: Seth Jennings <sjenning@redhat.com>
2014-06-17 12:25:27 -05:00
Seth Jennings cdd3486b20 Merge pull request #247 from jpoimboe/per-object-patching
implement per-object patching/relocations
2014-06-17 12:25:08 -05:00
Josh Poimboeuf 827c91bae6 fix review comments
- get rid of unneeded vmlinux variable
- create patch_make_funcs_list() and patch_make_dynrelas_list()
2014-06-17 12:17:58 -05:00
Josh Poimboeuf 84c34ff584 implement per-object patching/relocations
The recent module patching code has exposed some problems with our data
structures. We currently patch the funcs and dynrelas individually,
which is kind of scary now that different objects can be patched at
different times.  Instead it's cleaner and safer to group them by
patched object.

This patch implements per-object patching and relocations by refactoring
the interfaces:

- Completely separate the create-diff-object <-> patch module interface
  from the patch module <-> core module interface. create-diff-object
  will include "kpatch-patch.h" but not "kpatch.h". Thus,
  create-diff-object has no knowledge about the core module's
  interfaces, and the core module has no knowledge about the patch
  module's special sections.

- Newly added kpatch-patch.h defines the format of the patch module
  special sections. It's used by create-diff-object to create the
  special sections and used by the patch module to read them.

- kpatch.h still defines the core module interfaces. Each kpatch_module
  has a list of kpatch_objects for each module object to be patched.
  Each kpatch_object has a list of kpatch_funcs and a list of
  kpatch_dynrelas. The patch module creates these lists when populating
  kpatch_module.

This way of structuring the data allows us to patch funcs and dynrelas
on a per patched object basis, which will allow us to catch more error
scenarios and make the code easier to manage going forward.  It also
allows the use of much more common code between kpatch_register() and
kpatch_module_notify().
2014-06-17 10:03:08 -05:00
Seth Jennings d22ddec366 Merge pull request #242 from jpoimboe/future-loaded-modules
support for patching future loaded modules
2014-06-16 09:04:58 -05:00
Seth Jennings 138eeb1c32 Merge pull request #244 from flaming-toast/readme
Update readme
2014-06-16 09:01:31 -05:00
Jessica Yu 4dc2555e99 README: fix formatting and typos 2014-06-15 22:03:39 -07:00
Jessica Yu 7a541bbd6a README: Update outdated readme
kpatch-build no longer uses add-patches-section and link-vmlinux-syms.
2014-06-15 21:32:08 -07:00
Seth Jennings f4f8577e44 Merge pull request #243 from jpoimboe/kpatch-build-modules
kpatch-build: new module building interface
2014-06-15 21:32:54 -05:00
Josh Poimboeuf bba8d1cc2b kmod/core: make dynrelas section writable
On RHEL 7, the core module's write to dynrela->src causes a panic
because the dynrela section is read-only.
2014-06-14 19:12:20 -05:00
Josh Poimboeuf 6770877a9d kpatch-build: skip *.mod.o files
As seen on RHEL7
2014-06-14 10:04:01 -05:00
Josh Poimboeuf 16eb6439b8 kpatch-build: add -t option for custom build targets 2014-06-13 18:00:20 -05:00
Josh Poimboeuf 6c8366d414 kpatch-build: kpatch-build module patching support
This adds support to kpatch-build for patching modules.  It builds the
entire kernel tree, vmlinux and modules, in a single pass and then
detects which modules need to be patched.  This is the easiest case
(since the user doesn't need to care about which binaries are affected)
and the safest (since the user could be wrong).

The first build with no ccache takes a long time, but after the cache is
populated, it only takes about two minutes on my laptop.  It does take
up a TON of space in the cache now though (~/.kpatch/obj is now 8GB).

Next we can add the '-t' cmdline option for advanced users to specify
build targets.
2014-06-13 17:46:51 -05:00
Josh Poimboeuf 5b2bd03a3b kpatch-build: revert previous module building interface
Revert the previous kpatch-build module building interface commits to
prepare for a completely different approach which builds vmlinux and all
the modules in a single pass.

This reverts commit fac9d70612.
This reverts commit d166fb4379.
2014-06-13 17:19:49 -05:00
Josh Poimboeuf 844af68115 kmod/core: support for patching of future loaded modules
This allows a patch module to contain patched functions for modules
which haven't been loaded yet.  If/when the module is loaded later, it
will be patched from the module notifier function.
2014-06-13 12:49:43 -05:00
Josh Poimboeuf 052806fe43 kmod/core: fix replace race condition
In the replace case, stop calling module_put on a patch module before
we're potentially done with it.

This will also be needed for future module patching if we want to
properly replace a patch module which only patches a future loaded
module (that's a mouthful).

Fixes #165.
2014-06-13 12:49:43 -05:00
Josh Poimboeuf 2ec9a0481d kmod/core: create global kpmod_list
Create a list of registered patch modules, which will be used in the
module notifier to patch future loaded modules.  It will also be used to
fix the kpatch replace race condition where it calls module_put too
early.
2014-06-13 11:57:15 -05:00
Josh Poimboeuf 063e9a62f5 kmod/core: get rid of kpatch_internal
The kpatch_internal struct is a good idea, in that it documents which
parts of kpatch_module shouldn't be used by the patch module.  But it
creates extra code and will require more extra code if we want to keep a
list of kpmods, which is needed to create a module notifier for module
patching of future loaded modules.

Embedding the private data directly in the public struct allows the code
to be simpler: no extra kmallocs/kfrees, no need to store pointers
between the public and private structs.  I think the simpler code is
worth the tradeoff (exposing implementation detail).  Kernel code
usually doesn't bother with hiding a internal struct data from other
kernel code anyway.  For example, see ftrace_ops or struct kprobe.

The private fields are documented with a "private" comment.
2014-06-13 11:57:15 -05:00
Josh Poimboeuf b58e77ae9c kmod/core: move kpatch_write_relocations call
Write the relocations _after_ calling kpatch_calculate_old_addr() so
that we'll have a reference to the affected modules.
2014-06-13 11:57:15 -05:00
Josh Poimboeuf c61fb88a23 kmod/core: add ftrace helper functions
Move all the ftrace filtering and registering logic into a couple of new
helper functions.  Change kpatch_num_registered to kpatch_num_patched,
which now tracks the number of patched functions rather than the number
of patch modules.

This simplifies the code a bit and will also prevent a future loaded
module scenario where ftrace_ops can be registered with an empty filter,
resulting in _all_ kernel functions getting registered with ftrace.
2014-06-13 11:57:14 -05:00
Josh Poimboeuf dfc2641de2 kmod/core: use single quotes
Use single quotes when printing the name of a patch module, rather than
double quotes.  This is more consistent with other printk messages, and
looks better too!
2014-06-13 11:56:17 -05:00
Josh Poimboeuf 3ad35bd4f4 kmod/core: protect find_module with module_mutex 2014-06-13 11:56:17 -05:00
Josh Poimboeuf 6d951dc996 kmod/core: fix error path for kpatch_verify_symbol_match failure
If kpatch_verify_symbol_match() fails, set the num_funcs variable so
that the ftrace rollback only removes the filter for the affected
functions.
2014-06-13 11:56:17 -05:00
Josh Poimboeuf 579ee5f499 kmod/core: fix kpatch_put_modules call in error path
If kpatch_ftrace_add_func fails, num_funcs will be one less than what it
needs to be for kpatch_put_modules to work properly.  Instead give it
the full array size, and it can figure out which modules to put based on
whether func->mod is nonzero.
2014-06-13 11:56:16 -05:00
Josh Poimboeuf 31bd3a1538 kmod/core: fix kpatch_put_modules call order
kpatch_put_modules() should be called _after_ removing the ftrace
filters.
2014-06-13 11:55:16 -05:00
Seth Jennings fc722bc438 Merge pull request #241 from jpoimboe/ubuntu-fixes
Ubuntu fixes
2014-06-12 21:53:03 -05:00
Josh Poimboeuf fc3bba8109 kpatch-build: add ccache symlinks to PATH
On Ubuntu, the ccache symlinks aren't automatically added to the PATH,
so update PATH accordingly.

On Fedora, the PATH is updated automatically when installing ccache.
_But_, it requires a new bash session to be created after installing
ccache before the new PATH takes effect.  So it's a good idea to fix it
for Fedora as well.
2014-06-12 17:13:54 -05:00
Josh Poimboeuf e0416a3b42 kpatch-build: ubuntu fix for vmlinux_3 error
kpatch load fails on Ubuntu with:

  kpatch: unable to find module 'vmlinux_3'

The root cause is that the vmlinux file on Ubuntu is named
vmlinux-3.13.0-24-generic instead of just vmlinux.

Let's just call it "vmlinux" in the objname field.
2014-06-12 17:13:50 -05:00
Seth Jennings 0e4cb4d262 Merge pull request #240 from flaming-toast/issue239
kpatch-build: download correct source for the current kernel (for ubuntu)
2014-06-12 17:10:49 -05:00
Jessica Yu 9de2b5b19d kpatch-build: redirect output of wget, dpkg, and tar to log file, add error message if tar fails 2014-06-12 10:46:58 -07:00
Jessica Yu a2342b42eb kpatch-build: add error message if dpkg -x fails to extract source 2014-06-11 23:03:25 -07:00
Jessica Yu c3dd8158f7 kpatch-build: download correct source for the current kernel (for ubuntu)
As per issue #239.
2014-06-11 22:33:03 -07:00
Josh Poimboeuf 3ca8106987 Merge pull request #238 from spartacus06/kpatch-build-module-support
kpatch-build module support
2014-06-05 16:36:07 -05:00
Seth Jennings fac9d70612 kpatch-build: adjust indentation
The previous commit did not adjust the indentation to ease with
reviewing.  This commit corrects the indentation.  Purely whitespace
change.

Signed-off-by: Seth Jennings <sjenning@redhat.com>
2014-06-05 15:01:11 -05:00
Seth Jennings d166fb4379 module patching support for kpatch-build
This commit adds support for module patching with kpatch-build.
It introduces a new option, -t/--targets, that allows the user to
specify kernel make targets that are impacted by the patch.  These
targets will be examined by kpatch-build for changes.

While this approach requires the user to provide more information to
kpatch-build about what exactly has changed, it is better that
rebuilding the entire source tree (make vmlinux && make modules) which
would dramatically increase the runtime and disk space requirements of
using kpatch-build.

Future improvements could include a script that will independently
generate the targets list file.

Signed-off-by: Seth Jennings <sjenning@redhat.com>
2014-06-05 14:55:37 -05:00
Seth Jennings d026f9d866 Merge pull request #235 from jpoimboe/verbose-fix
__verbose rela fix
2014-06-04 16:26:50 -05:00
Josh Poimboeuf 0f908fb805 kmod/core: support R_X86_64_64 for module patching 2014-06-04 13:44:27 -05:00
Seth Jennings ba7038052f Merge pull request #237 from jpoimboe/activeness-safety-print-func
kmod/core: print func name on activeness safety failure
2014-06-04 13:41:54 -05:00
Seth Jennings 322dac3507 Merge pull request #236 from jpoimboe/new-functions
create-diff-object: support adding new functions
2014-06-04 12:40:11 -05:00
Josh Poimboeuf cb78565295 kmod/core: print func name on activeness safety failure 2014-06-04 12:20:49 -05:00
Josh Poimboeuf aebb618755 create-diff-object: support adding new functions
New functions (sym->status == NEW) shouldn't be added to the
.kpatch.patches section.
2014-06-04 12:09:17 -05:00
Josh Poimboeuf a16bd618a5 create-diff-object: include relas for non-bundled sections
With test/integration/data-read-mostly.patch, create-diff-object
includes the __verbose section but not the .rela__verbose section, which
is a bug, resulting in the following printk during the integration
tests:

  [13740.801920] dynamic debug error adding module: (null)

If a non-bundled section is included, its rela section should also be
included.  Also add support for converting those relas to dynrelas.
2014-06-04 11:48:23 -05:00
Josh Poimboeuf 76157dce4a kmod/core: add support for R_X86_64_64 dynrelas
Needed for relocations to data sections.
2014-06-04 11:48:19 -05:00
Seth Jennings f6c8745a42 Merge pull request #234 from jpoimboe/isra-fix
create-diff-object: more special section fixes
2014-06-04 11:22:09 -05:00
Josh Poimboeuf 3ffe135512 create-diff-object: bundling for .text.unlikely symbols
With -ffunction-sections, some section names are given a prefix of
".text.unlikely." rather than just ".text.".
2014-06-04 10:39:22 -05:00
Josh Poimboeuf a91c7eb250 create-diff-object: add support for gcc-mangled .part 2014-06-04 09:38:13 -05:00
Josh Poimboeuf 566ee5ffa4 create-diff-object: .isra fix
When renaming a foo.isra.1 function, there might also be a foo_bar
function which would be falsely matched with the current strchr logic.
Instead of matching the "foo" prefix, match "foo.isra".
2014-06-04 09:37:36 -05:00