mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	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
		
			
				
	
	
		
			47 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* 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 */
 |