Merge branch 'for-linus' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/jikos...
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 15 Nov 2017 18:21:58 +0000 (10:21 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 15 Nov 2017 18:21:58 +0000 (10:21 -0800)
Pull livepatching updates from Jiri Kosina:

 - shadow variables support, allowing livepatches to associate new
   "shadow" fields to existing data structures, from Joe Lawrence

 - pre/post patch callbacks API, allowing livepatch writers to register
   callbacks to be called before and after patch application, from Joe
   Lawrence

* 'for-linus' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/jikos/livepatching:
  livepatch: __klp_disable_patch() should never be called for disabled patches
  livepatch: Correctly call klp_post_unpatch_callback() in error paths
  livepatch: add transition notices
  livepatch: move transition "complete" notice into klp_complete_transition()
  livepatch: add (un)patch callbacks
  livepatch: Small shadow variable documentation fixes
  livepatch: __klp_shadow_get_or_alloc() is local to shadow.c
  livepatch: introduce shadow variable API

1  2 
kernel/livepatch/core.h

diff --combined kernel/livepatch/core.h
index a351601d7f761e11e169682a4b4b866e5d90c861,cc3aa708e0b4403deab81eb6a0dcfdc5964e0f54..48a83d4364cff3c6995025ac6459d04e868f169f
@@@ -1,7 -1,46 +1,47 @@@
 +/* SPDX-License-Identifier: GPL-2.0 */
  #ifndef _LIVEPATCH_CORE_H
  #define _LIVEPATCH_CORE_H
  
+ #include <linux/livepatch.h>
  extern struct mutex klp_mutex;
  
+ static inline bool klp_is_object_loaded(struct klp_object *obj)
+ {
+       return !obj->name || obj->mod;
+ }
+ static inline int klp_pre_patch_callback(struct klp_object *obj)
+ {
+       int ret = 0;
+       if (obj->callbacks.pre_patch)
+               ret = (*obj->callbacks.pre_patch)(obj);
+       obj->callbacks.post_unpatch_enabled = !ret;
+       return ret;
+ }
+ static inline void klp_post_patch_callback(struct klp_object *obj)
+ {
+       if (obj->callbacks.post_patch)
+               (*obj->callbacks.post_patch)(obj);
+ }
+ static inline void klp_pre_unpatch_callback(struct klp_object *obj)
+ {
+       if (obj->callbacks.pre_unpatch)
+               (*obj->callbacks.pre_unpatch)(obj);
+ }
+ static inline void klp_post_unpatch_callback(struct klp_object *obj)
+ {
+       if (obj->callbacks.post_unpatch_enabled &&
+           obj->callbacks.post_unpatch)
+               (*obj->callbacks.post_unpatch)(obj);
+       obj->callbacks.post_unpatch_enabled = false;
+ }
  #endif /* _LIVEPATCH_CORE_H */