Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
59b2a38c
Commit
59b2a38c
authored
Oct 05, 2022
by
Petr Mladek
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'for-6.1/sysfs-patched-object' into for-linus
parents
857300b7
ff1b80ec
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
148 additions
and
1 deletion
+148
-1
Documentation/ABI/testing/sysfs-kernel-livepatch
Documentation/ABI/testing/sysfs-kernel-livepatch
+8
-0
kernel/livepatch/core.c
kernel/livepatch/core.c
+18
-0
tools/testing/selftests/livepatch/Makefile
tools/testing/selftests/livepatch/Makefile
+2
-1
tools/testing/selftests/livepatch/functions.sh
tools/testing/selftests/livepatch/functions.sh
+34
-0
tools/testing/selftests/livepatch/test-sysfs.sh
tools/testing/selftests/livepatch/test-sysfs.sh
+86
-0
No files found.
Documentation/ABI/testing/sysfs-kernel-livepatch
View file @
59b2a38c
...
...
@@ -55,6 +55,14 @@ Description:
The object directory contains subdirectories for each function
that is patched within the object.
What: /sys/kernel/livepatch/<patch>/<object>/patched
Date: August 2022
KernelVersion: 6.1.0
Contact: live-patching@vger.kernel.org
Description:
An attribute which indicates whether the object is currently
patched.
What: /sys/kernel/livepatch/<patch>/<object>/<function,sympos>
Date: Nov 2014
KernelVersion: 3.19.0
...
...
kernel/livepatch/core.c
View file @
59b2a38c
...
...
@@ -325,6 +325,7 @@ int klp_apply_section_relocs(struct module *pmod, Elf_Shdr *sechdrs,
* /sys/kernel/livepatch/<patch>/transition
* /sys/kernel/livepatch/<patch>/force
* /sys/kernel/livepatch/<patch>/<object>
* /sys/kernel/livepatch/<patch>/<object>/patched
* /sys/kernel/livepatch/<patch>/<object>/<function,sympos>
*/
static
int
__klp_disable_patch
(
struct
klp_patch
*
patch
);
...
...
@@ -431,6 +432,22 @@ static struct attribute *klp_patch_attrs[] = {
};
ATTRIBUTE_GROUPS
(
klp_patch
);
static
ssize_t
patched_show
(
struct
kobject
*
kobj
,
struct
kobj_attribute
*
attr
,
char
*
buf
)
{
struct
klp_object
*
obj
;
obj
=
container_of
(
kobj
,
struct
klp_object
,
kobj
);
return
sysfs_emit
(
buf
,
"%d
\n
"
,
obj
->
patched
);
}
static
struct
kobj_attribute
patched_kobj_attr
=
__ATTR_RO
(
patched
);
static
struct
attribute
*
klp_object_attrs
[]
=
{
&
patched_kobj_attr
.
attr
,
NULL
,
};
ATTRIBUTE_GROUPS
(
klp_object
);
static
void
klp_free_object_dynamic
(
struct
klp_object
*
obj
)
{
kfree
(
obj
->
name
);
...
...
@@ -576,6 +593,7 @@ static void klp_kobj_release_object(struct kobject *kobj)
static
struct
kobj_type
klp_ktype_object
=
{
.
release
=
klp_kobj_release_object
,
.
sysfs_ops
=
&
kobj_sysfs_ops
,
.
default_groups
=
klp_object_groups
,
};
static
void
klp_kobj_release_func
(
struct
kobject
*
kobj
)
...
...
tools/testing/selftests/livepatch/Makefile
View file @
59b2a38c
...
...
@@ -6,7 +6,8 @@ TEST_PROGS := \
test-callbacks.sh
\
test-shadow-vars.sh
\
test-state.sh
\
test-ftrace.sh
test-ftrace.sh
\
test-sysfs.sh
TEST_FILES
:=
settings
...
...
tools/testing/selftests/livepatch/functions.sh
View file @
59b2a38c
...
...
@@ -6,6 +6,7 @@
MAX_RETRIES
=
600
RETRY_INTERVAL
=
".1"
# seconds
KLP_SYSFS_DIR
=
"/sys/kernel/livepatch"
# Kselftest framework requirement - SKIP code is 4
ksft_skip
=
4
...
...
@@ -308,3 +309,36 @@ function check_result {
cleanup_dmesg_file
}
# check_sysfs_rights(modname, rel_path, expected_rights) - check sysfs
# path permissions
# modname - livepatch module creating the sysfs interface
# rel_path - relative path of the sysfs interface
# expected_rights - expected access rights
function
check_sysfs_rights
()
{
local
mod
=
"
$1
"
;
shift
local
rel_path
=
"
$1
"
;
shift
local
expected_rights
=
"
$1
"
;
shift
local
path
=
"
$KLP_SYSFS_DIR
/
$mod
/
$rel_path
"
local
rights
=
$(
/bin/stat
--format
'%A'
"
$path
"
)
if
test
"
$rights
"
!=
"
$expected_rights
"
;
then
die
"Unexpected access rights of
$path
:
$expected_rights
vs.
$rights
"
fi
}
# check_sysfs_value(modname, rel_path, expected_value) - check sysfs value
# modname - livepatch module creating the sysfs interface
# rel_path - relative path of the sysfs interface
# expected_value - expected value read from the file
function
check_sysfs_value
()
{
local
mod
=
"
$1
"
;
shift
local
rel_path
=
"
$1
"
;
shift
local
expected_value
=
"
$1
"
;
shift
local
path
=
"
$KLP_SYSFS_DIR
/
$mod
/
$rel_path
"
local
value
=
`
cat
$path
`
if
test
"
$value
"
!=
"
$expected_value
"
;
then
die
"Unexpected value in
$path
:
$expected_value
vs.
$value
"
fi
}
tools/testing/selftests/livepatch/test-sysfs.sh
0 → 100755
View file @
59b2a38c
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (C) 2022 Song Liu <song@kernel.org>
.
$(
dirname
$0
)
/functions.sh
MOD_LIVEPATCH
=
test_klp_livepatch
setup_config
# - load a livepatch and verifies the sysfs entries work as expected
start_test
"sysfs test"
load_lp
$MOD_LIVEPATCH
check_sysfs_rights
"
$MOD_LIVEPATCH
"
""
"drwxr-xr-x"
check_sysfs_rights
"
$MOD_LIVEPATCH
"
"enabled"
"-rw-r--r--"
check_sysfs_value
"
$MOD_LIVEPATCH
"
"enabled"
"1"
check_sysfs_rights
"
$MOD_LIVEPATCH
"
"force"
"--w-------"
check_sysfs_rights
"
$MOD_LIVEPATCH
"
"transition"
"-r--r--r--"
check_sysfs_value
"
$MOD_LIVEPATCH
"
"transition"
"0"
check_sysfs_rights
"
$MOD_LIVEPATCH
"
"vmlinux/patched"
"-r--r--r--"
check_sysfs_value
"
$MOD_LIVEPATCH
"
"vmlinux/patched"
"1"
disable_lp
$MOD_LIVEPATCH
unload_lp
$MOD_LIVEPATCH
check_result
"% modprobe
$MOD_LIVEPATCH
livepatch: enabling patch '
$MOD_LIVEPATCH
'
livepatch: '
$MOD_LIVEPATCH
': initializing patching transition
livepatch: '
$MOD_LIVEPATCH
': starting patching transition
livepatch: '
$MOD_LIVEPATCH
': completing patching transition
livepatch: '
$MOD_LIVEPATCH
': patching complete
% echo 0 > /sys/kernel/livepatch/
$MOD_LIVEPATCH
/enabled
livepatch: '
$MOD_LIVEPATCH
': initializing unpatching transition
livepatch: '
$MOD_LIVEPATCH
': starting unpatching transition
livepatch: '
$MOD_LIVEPATCH
': completing unpatching transition
livepatch: '
$MOD_LIVEPATCH
': unpatching complete
% rmmod
$MOD_LIVEPATCH
"
start_test
"sysfs test object/patched"
MOD_LIVEPATCH
=
test_klp_callbacks_demo
MOD_TARGET
=
test_klp_callbacks_mod
load_lp
$MOD_LIVEPATCH
# check the "patch" file changes as target module loads/unloads
check_sysfs_value
"
$MOD_LIVEPATCH
"
"
$MOD_TARGET
/patched"
"0"
load_mod
$MOD_TARGET
check_sysfs_value
"
$MOD_LIVEPATCH
"
"
$MOD_TARGET
/patched"
"1"
unload_mod
$MOD_TARGET
check_sysfs_value
"
$MOD_LIVEPATCH
"
"
$MOD_TARGET
/patched"
"0"
disable_lp
$MOD_LIVEPATCH
unload_lp
$MOD_LIVEPATCH
check_result
"% modprobe test_klp_callbacks_demo
livepatch: enabling patch 'test_klp_callbacks_demo'
livepatch: 'test_klp_callbacks_demo': initializing patching transition
test_klp_callbacks_demo: pre_patch_callback: vmlinux
livepatch: 'test_klp_callbacks_demo': starting patching transition
livepatch: 'test_klp_callbacks_demo': completing patching transition
test_klp_callbacks_demo: post_patch_callback: vmlinux
livepatch: 'test_klp_callbacks_demo': patching complete
% modprobe test_klp_callbacks_mod
livepatch: applying patch 'test_klp_callbacks_demo' to loading module 'test_klp_callbacks_mod'
test_klp_callbacks_demo: pre_patch_callback: test_klp_callbacks_mod -> [MODULE_STATE_COMING] Full formed, running module_init
test_klp_callbacks_demo: post_patch_callback: test_klp_callbacks_mod -> [MODULE_STATE_COMING] Full formed, running module_init
test_klp_callbacks_mod: test_klp_callbacks_mod_init
% rmmod test_klp_callbacks_mod
test_klp_callbacks_mod: test_klp_callbacks_mod_exit
test_klp_callbacks_demo: pre_unpatch_callback: test_klp_callbacks_mod -> [MODULE_STATE_GOING] Going away
livepatch: reverting patch 'test_klp_callbacks_demo' on unloading module 'test_klp_callbacks_mod'
test_klp_callbacks_demo: post_unpatch_callback: test_klp_callbacks_mod -> [MODULE_STATE_GOING] Going away
% echo 0 > /sys/kernel/livepatch/test_klp_callbacks_demo/enabled
livepatch: 'test_klp_callbacks_demo': initializing unpatching transition
test_klp_callbacks_demo: pre_unpatch_callback: vmlinux
livepatch: 'test_klp_callbacks_demo': starting unpatching transition
livepatch: 'test_klp_callbacks_demo': completing unpatching transition
test_klp_callbacks_demo: post_unpatch_callback: vmlinux
livepatch: 'test_klp_callbacks_demo': unpatching complete
% rmmod test_klp_callbacks_demo"
exit
0
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment