From: Petr Mladek <pmladek@suse.com>
To: Yafang Shao <laoar.shao@gmail.com>
Cc: jpoimboe@kernel.org, jikos@kernel.org, mbenes@suse.cz,
joe.lawrence@redhat.com, song@kernel.org,
live-patching@vger.kernel.org
Subject: Re: [PATCH] selftests: livepatch: filter kobject debug messages in check_result()
Date: Thu, 20 Aug 2026 09:42:48 +0200 [thread overview]
Message-ID: <aoav-Pol5nrEquMB@pathway.suse.cz> (raw)
In-Reply-To: <CALOAHbCFt2H6CZ0Y0FJJ9+yHFDNkrKKHk5Y_c6JnArXQhaEj1A@mail.gmail.com>
On Thu 2026-08-20 11:34:22, Yafang Shao wrote:
> On Wed, Aug 19, 2026 at 9:28 PM Petr Mladek <pmladek@suse.com> wrote:
> >
> > On Tue 2026-08-18 13:46:29, Yafang Shao wrote:
> > > CONFIG_DEBUG_KOBJECT makes kobject_add_internal(), kobject_uevent_env(),
> > > fill_kobj_path() and friends emit pr_debug() messages, and
> > > CONFIG_DEBUG_KOBJECT_RELEASE makes kobject_release() emit a pr_info()
> > > for every delayed kobject free. All of these carry the "kobject:"
> > > prefix via pr_fmt(), e.g.:
> > >
> > > kobject: 'test_klp_livepatch' (ffff...): kobject_release, parent ... (delayed N)
> >
> > Yeah, this is pr_info() printed only when CONFIG_DEBUG_KOBJECT_RELEASE enabled.
> >
> > > kobject: 'test_klp_livepatch' (ffff...): kobject_add_internal: parent: 'module', set: 'module'
> >
> > This one seems to be printed by pr_debug(). It is printed
> > with CONFIG_DEBUG_KOBJECT but only when CONFIG_DYNAMIC_DEBUG
> > is not enabled.
> >
> > > The livepatch test modules' kobjects are named "test_klp_*", so these
> > > lines match the check_result() grep for "test_klp" and leak into the
> > > result. The extra lines no longer match the expected output, so the
> > > selftests fail when either debug config is enabled.
> > >
> > > Filter out the "kobject:" lines from the result and note in the README
> > > that both configs are safe to keep enabled.
> >
> > Honestly, I do not feel comfortable with this ignore-all-kobject-messages
> > approach. We might miss real problems reported by the kobject API.
> >
> > It seems acceptable to ignore the quite specific "kobject: .*parent.*
> > (delayed" pattern.
>
> These messages are printed using pr_info:
>
> pr_info("'%s' (%p): %s, parent %p (delayed %ld)\n",
> kobject_name(kobj), kobj, __func__, kobj->parent, delay);
>
> In addition to the specific "kobject: .*parent.*(delayed" pattern,
> several other pr_debug messages are also produced.
> For example:
>
> # --- expected
> # +++ result
> # @@ -1,7 +1,13 @@
> # % insmod test_modules/test_klp_livepatch.ko
> # +kobject: 'test_klp_livepatch' (000000009dbf565e):
> kobject_add_internal: parent: 'module', set: 'module'
> # +kobject: 'holders' (00000000d9fe84ca): kobject_add_internal:
> parent: 'test_klp_livepatch', set: '<NULL>'
> # +kobject: 'test_klp_livepatch' (00000000dcae1113):
> kobject_add_internal: parent: 'livepatch', set: '<NULL>'
> # +kobject: 'vmlinux' (000000007b8837e6): kobject_add_internal:
> parent: 'test_klp_livepatch', set: '<NULL>'
> # livepatch: enabling patch 'test_klp_livepatch'
> # livepatch: 'test_klp_livepatch': initializing patching transition
> # livepatch: 'test_klp_livepatch': starting patching transition
> # +kobject: 'test_klp_livepatch' (000000009dbf565e): kobject_uevent_env
> # +kobject: 'test_klp_livepatch' (000000009dbf565e): fill_kobj_path:
> path = '/module/test_klp_livepatch'
> # livepatch: 'test_klp_livepatch': completing patching transition
> # livepatch: 'test_klp_livepatch': patching complete
> # % echo 0 > /sys/kernel/livepatch/test_klp_livepatch/enabled
> # @@ -9,4 +15,15 @@ livepatch: 'test_klp_livepatch': initial
> # livepatch: 'test_klp_livepatch': starting unpatching transition
> # livepatch: 'test_klp_livepatch': completing unpatching transition
> # livepatch: 'test_klp_livepatch': unpatching complete
> # +kobject: 'test_klp_livepatch' (00000000dcae1113): kobject_cleanup,
> parent 00000000f8785d63
> # +kobject: 'test_klp_livepatch' (00000000dcae1113): auto cleanup kobject_del
> # +kobject: 'test_klp_livepatch' (00000000dcae1113): calling ktype release
> # +kobject: 'test_klp_livepatch': free name
> # % rmmod test_klp_livepatch
> # +kobject: 'test_klp_livepatch' (000000009dbf565e): kobject_cleanup,
> parent 0000000052e5c022
> # +kobject: 'test_klp_livepatch' (000000009dbf565e): auto cleanup kobject_del
> # +kobject: 'test_klp_livepatch' (000000009dbf565e): auto cleanup 'remove' event
> # +kobject: 'test_klp_livepatch' (000000009dbf565e): kobject_uevent_env
> # +kobject: 'test_klp_livepatch' (000000009dbf565e): fill_kobj_path:
> path = '/module/test_klp_livepatch'
> # +kobject: 'test_klp_livepatch' (000000009dbf565e): calling ktype release
> # +kobject: 'test_klp_livepatch': free name
>
> >
> > But I would prefer to ignore the other debug messages by detecting
> > the KERN_DEBUG loglevel. It seems that dmesg even allows to filter
> > the output on its own. It is a bit ugly because we want all
> > other loglevels but:
> >
> > dmesg --level=info,notice,warn,err,crit,alert,emerg
> >
> > might do the job.
>
> The following issues will occur:
>
> # --- expected
> # +++ result
> # @@ -1,12 +1,8 @@
> # % insmod test_modules/test_klp_livepatch.ko
> # livepatch: enabling patch 'test_klp_livepatch'
> # -livepatch: 'test_klp_livepatch': initializing patching transition
> # livepatch: 'test_klp_livepatch': starting patching transition
> # -livepatch: 'test_klp_livepatch': completing patching transition
> # livepatch: 'test_klp_livepatch': patching complete
> # % echo 0 > /sys/kernel/livepatch/test_klp_livepatch/enabled
> # -livepatch: 'test_klp_livepatch': initializing unpatching transition
> # livepatch: 'test_klp_livepatch': starting unpatching transition
> # -livepatch: 'test_klp_livepatch': completing unpatching transition
> # livepatch: 'test_klp_livepatch': unpatching complete
> # % rmmod test_klp_livepatch
>
> This is because these messages are emitted using pr_debug:
>
> pr_debug("'%s': initializing %s transition\n", patch->mod->name,
> klp_target_state == KLP_TRANSITION_PATCHED ? "patching" : "unpatching");
>
> pr_debug("'%s': completing %s transition\n",
> klp_transition_patch->mod->name,
> klp_target_state == KLP_TRANSITION_PATCHED ? "patching" : "unpatching");
I see.
> In summary, we need to filter out the pr_info messages from kobject
> while retaining the pr_debug messages from livepatch.
> Therefore, the following change should address this:
>
> diff --git a/tools/testing/selftests/livepatch/functions.sh
> b/tools/testing/selftests/livepatch/functions.sh
> index 46991a029f7c..54789fae8055 100644
> --- a/tools/testing/selftests/livepatch/functions.sh
> +++ b/tools/testing/selftests/livepatch/functions.sh
> @@ -300,9 +300,9 @@ function start_test {
> # find new kernel messages since the test started.
> local last_dmesg_msg="livepatch kselftest timestamp: $(date
> --rfc-3339=ns)"
> log "$last_dmesg_msg"
> - loop_until 'dmesg | grep -q "$last_dmesg_msg"' ||
> + loop_until 'dmesg --raw | grep -q "$last_dmesg_msg"' ||
> die "buffer busy? can't find canary dmesg message:
> $last_dmesg_msg"
> - LAST_DMESG=$(dmesg | grep "$last_dmesg_msg")
> + LAST_DMESG=$(dmesg --raw | grep "$last_dmesg_msg")
>
> echo -n "TEST: $test ... "
> log "===== TEST: $test ====="
> @@ -318,9 +318,12 @@ function check_result {
Also we should update the comment, something like:
+ # - exclude debug messages except with "livepatch:" prefix
> # - include lines matching keywords
> # - exclude lines matching keywords
> # - filter out dmesg timestamp prefixes
> - result=$(dmesg | awk -v last_dmesg="$LAST_DMESG" 'p; $0 ==
> last_dmesg { p=1 }' | \
> + result=$(dmesg --raw | \
> + awk -v last_dmesg="$LAST_DMESG" 'p { if ($0 !~ /^<7>/
> || $0 ~ /livepatch:/) print; next } $0 == last_dmesg { p = 1 }' | \
> grep -e 'livepatch:' -e 'test_klp' | \
> grep -v '\(tainting\|taints\) kernel' | \
> + grep -v 'kobject: .*parent.*(delayed' | \
> + sed 's/^<[0-9]*>//' | \
> sed 's/^\[[ 0-9.]*\] //' | \
> sed 's/^\[[ ]*[CT][0-9]*\] //')
It is more tricky that I have expected. But I think that
it is worth it because it covers many other debug messages.
Best Regards,
Petr
prev parent reply other threads:[~2026-08-20 7:42 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-18 5:46 [PATCH] selftests: livepatch: filter kobject debug messages in check_result() Yafang Shao
2026-08-19 13:28 ` Petr Mladek
2026-08-20 3:34 ` Yafang Shao
2026-08-20 7:42 ` Petr Mladek [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aoav-Pol5nrEquMB@pathway.suse.cz \
--to=pmladek@suse.com \
--cc=jikos@kernel.org \
--cc=joe.lawrence@redhat.com \
--cc=jpoimboe@kernel.org \
--cc=laoar.shao@gmail.com \
--cc=live-patching@vger.kernel.org \
--cc=mbenes@suse.cz \
--cc=song@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.