kpatch: signal stalled processes

Add a "signal" command line option that iterates over all processes that
may be holding up the current livepatch transition.  Send such processes
a SIGSTOP / SIGCONT combination to try and expedite the transition.

Signed-off-by: Joe Lawrence <joe.lawrence@redhat.com>
This commit is contained in:
Joe Lawrence 2017-11-15 10:44:42 -05:00
parent fb0bc53eb7
commit 3582e10e42

View File

@ -49,6 +49,8 @@ usage () {
echo >&2
usage_cmd "list" "list installed patch modules"
echo >&2
usage_cmd "signal" "signal/poke any process stalling the current patch transition"
echo >&2
usage_cmd "version" "display the kpatch version"
exit 1
}
@ -212,6 +214,33 @@ show_stalled_processes() {
done
}
signal_stalled_processes() {
local module
local proc_task
local tid
module=$(get_transition_patch)
[[ -z "$module" ]] && return
if [[ -e "/sys/kernel/livepatch/$module/signal" ]] ; then
echo 1 > "/sys/kernel/livepatch/$module/signal"
else
for proc_task in /proc/[0-9]*/task/[0-9]*; do
tid=${proc_task#*/task/}
if is_stalled "$module" "$tid" ; then
if [[ "$tid" -eq "$$" ]] ; then
echo "skipping pid $tid $(cat "$proc_task"/comm 2>/dev/null)"
else
echo "signaling pid $tid $(cat "$proc_task"/comm 2>/dev/null)"
kill -SIGSTOP "$tid"
sleep .1
kill -SIGCONT "$tid"
fi
fi
done
fi
}
load_module () {
local module="$1"
@ -442,6 +471,11 @@ case "$1" in
modinfo "$MODULE" || die "failed to get info for module $PATCH"
;;
"signal")
[[ "$#" -ne 1 ]] && usage
signal_stalled_processes
;;
"help"|"-h"|"--help")
usage
;;