Commit Graph

1725 Commits

Author SHA1 Message Date
Josh Poimboeuf
8834d25564 readme: small clarification about contributing 2014-03-19 10:29:07 -05:00
Josh Poimboeuf
29227a0fbd kmod/core: improve performance for cumulative patching
When multiple patch modules patch the same function, there's no need to
patch all the intermediate functions.  Just hook them all into the
original function and use the ftrace handler to find the newest one.

Also use a mutex in the register/unregister functions to protect changes
to kpatch_num_registered, kpatch_func_hash and calls to the ftrace
functions by other register/unregister invocations.
2014-03-19 10:05:07 -05:00
Josh Poimboeuf
37a756af58 kmod/core: protect kpatch_[un]register with mutex
Use a mutex in the register/unregister functions to protect changes to
kpatch_num_registered, kpatch_func_hash and calls to the ftrace
functions by other register/unregister invocations.
2014-03-19 10:05:07 -05:00
Seth Jennings
ae6fce2cd9 Merge pull request #68 from jpoimboe/core-no-kzalloc
core/kmod: use kmalloc instead of kzalloc
2014-03-18 17:06:03 -05:00
Josh Poimboeuf
ff44a0af26 core/kmod: use kmalloc instead of kzalloc
There's no need to zero out the kpatch funcs array.  The addr fields are
initialized by the patch module, the mod field is intialized by the core
module, and the node struct doesn't need to be initialized because its
fields are overwritten by hash_add.
2014-03-18 16:57:51 -05:00
Seth Jennings
fd2c137acf Merge pull request #63 from jpoimboe/core-api-hash
kmod/core: new API and kpatch_funcs_hash
2014-03-18 16:50:56 -05:00
Josh Poimboeuf
bfad3b1880 kmod/core: update API and use hash table
My apologies for the size of this commit.  I combined these two features
(updating API and using a hash table) into a single commit because their
implementations are tightly coupled and I didn't want to have to add
support for the old kpatch_funcs array with the new API just for the
sake of splitting up the commit :-)

- Update the core module API to get a more clear separation between core
  module and patch module.  This is cleaner and will help our case for
  getting the core module merged upstream into the kernel.
- Convert the old kpatch_funcs array into a hash table.  This is so much
  nicer performance-wise and everything-else-wise than that ugly old
  array.
- Do the incremental patching in stop machine.  This ensures that the
  funcs hash is up to date and we don't miss anything.
- Disable preemption in the ftrace handler when accessing the func hash.
  That way we don't get conflicts with the stop_machine handler updating
  the hash.
2014-03-18 13:34:15 -05:00
Josh Poimboeuf
b9f55460ed Merge pull request #55 from spartacus06/fixes
Fixes for symbol collisions in add-patches-section and cleanup
2014-03-18 13:14:58 -05:00
Seth Jennings
ca55dcc5ad add TODO to de-dup code
Signed-off-by: Seth Jennings <sjenning@redhat.com>
2014-03-18 11:44:17 -05:00
Seth Jennings
e3d2a68db3 remove obsolete comments
Signed-off-by: Seth Jennings <sjenning@redhat.com>
2014-03-18 11:44:08 -05:00
Seth Jennings
3ac06ee128 remove dead code
Signed-off-by: Seth Jennings <sjenning@redhat.com>
2014-03-18 11:38:55 -05:00
Seth Jennings
75ceca4f33 add file hint to add-patches-section
Currently, add-patches-section just blindly looks in vmlinux
for a function symbol matching the name of the patched function
in the input object file.  However, for local symbols, they may
appear multiple times in the vmlinux symbol table since the symbol
name may be reused locally in different files.

This commit add support for "file hinting".  It tracks what
file the symbol is in and searches for local symbols within
that file in vmlinux first.  If it doesn't find one, it then
searches globally like it always has.

Fixes issue #53

Signed-off-by: Seth Jennings <sjenning@redhat.com>
2014-03-18 11:38:55 -05:00
Seth Jennings
c09ed67945 Merge pull request #62 from jpoimboe/core-cleanup
kmod/core: long overdue cleanup
2014-03-14 20:39:09 -05:00
Josh Poimboeuf
c164649d4e kmod/core: rename some variables
For the sake of consistency and readability, rename some variables.
Also change func->old_addr_end to func->old_size.
2014-03-14 20:23:12 -05:00
Josh Poimboeuf
3fb9fd48ff kmod/core: move kpatch_remove_patch
Just move kpatch_remove_patch to a more logical location next to
kpatch_apply_patch.  No functional changes.
2014-03-14 20:23:12 -05:00
Josh Poimboeuf
5f243c9db1 kmod/core: remove obsolete kpatch_rela struct 2014-03-14 20:23:12 -05:00
Josh Poimboeuf
b81e2d607b kmod/core: print module load/unload messages
Print the loading/unloading messages after they have successfully
completed.  Using the KERN_NOTICE log level which corresponds to a
"normal but significant condition."
2014-03-14 20:23:12 -05:00
Josh Poimboeuf
e7dde72ed9 kmod/core: remove unused old_func_name field
Not needed, we can always add it again later if needed (for sanity
checks, maybe)
2014-03-14 20:23:12 -05:00
Josh Poimboeuf
15e1b83cfe kmod/core: handle kmalloc errors and fix leak 2014-03-14 20:23:12 -05:00
Josh Poimboeuf
aea0932655 kmod/core: remove sync_core comment
No need to call sync_core() since we aren't directly modifying any code.
2014-03-14 20:23:12 -05:00
Josh Poimboeuf
aa5346d13b kmod/core: remove comments about preemption
Preemption shouldn't cause a problem with determining activeness safety.
Even if a thread is preempted, it'll be on the backtrace.

We may need to disable preemption when reading the kpatch_funcs array,
but I'm removing that comment for now because the kpatch_funcs array
will soon be replaced by a much better data structure, and we'll deal
with proper synchronization then.
2014-03-14 20:23:12 -05:00
Josh Poimboeuf
57f45c89e6 kmod/core: remove ftrace hacks
These hacks were from a previous implementation and are no longer
needed.
2014-03-14 20:23:12 -05:00
Josh Poimboeuf
99dd4b53fb kmod/core: update module comments 2014-03-14 20:23:12 -05:00
Josh Poimboeuf
344050d8d3 kmod/core: remove assembler code
Long ago, the kpatch_trampoline required being written in assembler, but
that's no longer needed now that it integrates nicely with ftrace.

Move it to a C function and rename it kpatch_ftrace_handler.
2014-03-14 20:23:12 -05:00
Seth Jennings
5e5f3a76f9 Merge pull request #61 from jpoimboe/patch-compile-fail-log
kpatch-build: add patch compile failure output to log
2014-03-14 17:14:33 -05:00
Seth Jennings
37ba81f4ef Merge pull request #60 from jpoimboe/fix-bash-x
kpatch-build: fix SCRIPTDIR for bash -x
2014-03-14 17:01:05 -05:00
Josh Poimboeuf
2aef7d7c41 kpatch-build: add patch compile failure output to log
If the patch doesn't compile, make sure the LOGFILE has the error
output.
2014-03-14 11:12:40 -05:00
Josh Poimboeuf
d4363e0c9b kpatch-build: fix SCRIPTDIR for bash -x
More adventures in bash-land.  Running "bash -x kpatch-build foo.patch"
causes SCRIPTDIR to not get set properly.  This fixes that.
2014-03-14 11:09:29 -05:00
Seth Jennings
c83141be90 Merge pull request #56 from jpoimboe/patch-error-handling
Improve source patch error handling
2014-03-13 17:13:35 -05:00
Seth Jennings
26397afeaf Merge pull request #57 from jpoimboe/no-changed-objects
properly detect no changed objects
2014-03-13 17:06:33 -05:00
Seth Jennings
eb87ccf5fb Merge pull request #58 from jpoimboe/changed-function-output
make the changed function output more readable
2014-03-13 17:04:34 -05:00
Seth Jennings
f3e55ee721 Merge pull request #59 from jpoimboe/compile-debug-symbols
compile tools with -g for debug symbols
2014-03-13 17:02:36 -05:00
Josh Poimboeuf
840a1b3e44 compile tools with -g for debug symbols 2014-03-13 12:28:35 -05:00
Josh Poimboeuf
72af45502f make the changed function output more readable
This makes it much easier to spot which functions have changed,
especially when there are more than one of them.
2014-03-13 12:22:01 -05:00
Josh Poimboeuf
c4ea0ea4ef properly detect no changed objects
The current solution doesn't work because "$?" will always be 0, even if
there were no "CC" lines in the build log.  Instead, just make sure the
changed_objs file isn't empty.
2014-03-13 12:20:13 -05:00
Josh Poimboeuf
72b5f3b4fb try source patch before compiling kernel
Add a patch testing step before compiling the kernel, so that users
don't have to wait for the kernel to compile before seeing if the patch
applies cleanly.

Also allow the printing of the patch command's stdout/stderr to make it
clear what files are being patched and whether there's any fuzz.
2014-03-13 12:08:25 -05:00
Josh Poimboeuf
a611185dce better patch file cleanup
If the patch file fails to apply, it "corrupts" the cache by leaving the
old applied-patch file around.  Fix that by always cleaning up after
ourselves.
2014-03-13 11:53:44 -05:00
Seth Jennings
3acf30c0c8 Merge pull request #50 from jpoimboe/sourcedir-option
kpatch-build: remove "kpatch build" wrapper and add --sourcedir option
2014-03-11 15:03:35 -05:00
Josh Poimboeuf
5ab497a2b3 kpatch-build --sourcedir option
Allow the user to supply a custom kernel source directory.  This copies
the directory to ~/.kpatch/src instead of using it in place.  Otherwise
the "make mrproper" (which is needed for compiling objects in a separate
tree) would modify the original source tree and remove its .config file.

There's currently no caching support for this option.  If needed, we
could implement that pretty easily by calculating an md5sum of the
original source directory.
2014-03-11 10:43:48 -05:00
Josh Poimboeuf
2d728c4f0d make kpatch-build a first class script
kpatch-build is outgrowing the kpatch script and probably is a better
fit as its own utility instead of being wrapped by kpatch.  Install
kpatch-build into /usr/local/bin, remove the kpatch wrapper around it,
and update the README accordingly.
2014-03-11 10:43:48 -05:00
Josh Poimboeuf
9e69a53206 Merge pull request #52 from spartacus06/fixes
add a few comments and st_value !=0 error
2014-03-10 15:13:58 -05:00
Seth Jennings
e8fb5b1c9f fixup comment
Signed-off-by: Seth Jennings <sjenning@redhat.com>
2014-03-10 15:11:23 -05:00
Seth Jennings
8b9de30581 add error for sym value != 0
For a local object or function symbol, we expect that
the section offset, sym.st_value, be 0 because we used
-ffunction-sections and -fdata-section during compile.

If value != 0, it undermines assumptions we make and
should return an error.  Exceptions should be handled
on a case by case basis, like __ksymtab_strings.

Signed-off-by: Seth Jennings <sjenning@redhat.com>
2014-03-10 15:11:23 -05:00
Seth Jennings
582f2b27e0 add comment for __ksymtab_strings case
Signed-off-by: Seth Jennings <sjenning@redhat.com>
2014-03-10 14:49:56 -05:00
Josh Poimboeuf
43e1f18141 Merge pull request #51 from spartacus06/testingwork
add automated testing system
2014-03-10 14:38:31 -05:00
Seth Jennings
0cbb7cf5ee add automated testing system
This commit introduces a simple automated testing system
with 3 simple testcase.

For each test case there is a .c, a .patch, and a .inventory
file.  The .c is compiled, using the flags from the kflags file,
to create the original object.  The .c file is then patched
with the .patch file and rebuilt to create the patched object.
The files are then analyzed by the differencing tool and an
output object is generated with a .inventory file that lists
the sections and symbol included in the output object.  That
inventory file is then compared to the .inventory file for
that testcase.  If they are the same, the test passes. If
not, the differences in the inventory files are displayed,
and the test fails.

Signed-off-by: Seth Jennings <sjenning@redhat.com>
2014-03-10 14:36:11 -05:00
Seth Jennings
abbb12d065 Merge pull request #49 from jpoimboe/show-changed-functions
kpatch-build: show changed functions
2014-03-10 11:24:53 -05:00
Josh Poimboeuf
942fbdf37a kpatch-build: show changed functions
Pipe create-diff-object output to both stdout and the log file, so the
user can see which functions have changed.
2014-03-10 11:18:18 -05:00
Josh Poimboeuf
b95afff9ed Merge pull request #48 from spartacus06/testframework
Testframework
2014-03-10 10:40:19 -05:00
Seth Jennings
8eafea114a add inventory file creation to create-object-diff
In preparation for adding an automated test framework,
add an ability to create-object-diff that will create
a human readable list of included sections and symbols
with type and bind information so that the test framework
can compare against a known-good reference list with the
expected set of sections and symbols.

The file is created when the -i/--inventory option is
used.  The inventory filename is the user supplied output
file name suffixed by .inventory

Signed-off-by: Seth Jennings <sjenning@redhat.com>
2014-03-07 17:02:45 -06:00