mirror of
https://github.com/dynup/kpatch
synced 2025-02-07 12:41:34 +00:00
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:
parent
fb0bc53eb7
commit
3582e10e42
@ -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
|
||||
;;
|
||||
|
Loading…
Reference in New Issue
Block a user