From 3582e10e42fed7a08b5cf1ce0b470723428b1386 Mon Sep 17 00:00:00 2001 From: Joe Lawrence Date: Wed, 15 Nov 2017 10:44:42 -0500 Subject: [PATCH] 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 --- kpatch/kpatch | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/kpatch/kpatch b/kpatch/kpatch index 50783b8..303c67a 100755 --- a/kpatch/kpatch +++ b/kpatch/kpatch @@ -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 ;;