16a717704SMarcos Paulo de Souza#!/bin/bash
26a717704SMarcos Paulo de Souza# SPDX-License-Identifier: GPL-2.0
36a717704SMarcos Paulo de Souza# Copyright (C) 2023 SUSE
46a717704SMarcos Paulo de Souza# Author: Marcos Paulo de Souza <[email protected]>
56a717704SMarcos Paulo de Souza
66a717704SMarcos Paulo de Souza. $(dirname $0)/functions.sh
76a717704SMarcos Paulo de Souza
86a717704SMarcos Paulo de SouzaMOD_SYSCALL=test_klp_syscall
96a717704SMarcos Paulo de Souza
106a717704SMarcos Paulo de Souzasetup_config
116a717704SMarcos Paulo de Souza
126a717704SMarcos Paulo de Souza# - Start _NRPROC processes calling getpid and load a livepatch to patch the
136a717704SMarcos Paulo de Souza#   getpid syscall. Check if all the processes transitioned to the livepatched
146a717704SMarcos Paulo de Souza#   state.
156a717704SMarcos Paulo de Souza
166a717704SMarcos Paulo de Souzastart_test "patch getpid syscall while being heavily hammered"
176a717704SMarcos Paulo de Souza
1846edf5d7SRyan SullivanNPROC=$(getconf _NPROCESSORS_ONLN)
1946edf5d7SRyan SullivanMAXPROC=128
2046edf5d7SRyan Sullivan
2146edf5d7SRyan Sullivanfor i in $(seq 1 $(($NPROC < $MAXPROC ? $NPROC : $MAXPROC))); do
226a717704SMarcos Paulo de Souza	./test_klp-call_getpid &
236a717704SMarcos Paulo de Souza	pids[$i]="$!"
246a717704SMarcos Paulo de Souzadone
256a717704SMarcos Paulo de Souza
266a717704SMarcos Paulo de Souzapid_list=$(echo ${pids[@]} | tr ' ' ',')
276a717704SMarcos Paulo de Souzaload_lp $MOD_SYSCALL klp_pids=$pid_list
286a717704SMarcos Paulo de Souza
296a717704SMarcos Paulo de Souza# wait for all tasks to transition to patched state
30*59766286SMichael Vetterloop_until 'grep -q '^0$' $SYSFS_KERNEL_DIR/$MOD_SYSCALL/npids'
316a717704SMarcos Paulo de Souza
32*59766286SMichael Vetterpending_pids=$(cat $SYSFS_KERNEL_DIR/$MOD_SYSCALL/npids)
336a717704SMarcos Paulo de Souzalog "$MOD_SYSCALL: Remaining not livepatched processes: $pending_pids"
346a717704SMarcos Paulo de Souza
356a717704SMarcos Paulo de Souzafor pid in ${pids[@]}; do
366a717704SMarcos Paulo de Souza	kill $pid || true
376a717704SMarcos Paulo de Souzadone
386a717704SMarcos Paulo de Souza
396a717704SMarcos Paulo de Souzadisable_lp $MOD_SYSCALL
406a717704SMarcos Paulo de Souzaunload_lp $MOD_SYSCALL
416a717704SMarcos Paulo de Souza
426a717704SMarcos Paulo de Souzacheck_result "% insmod test_modules/$MOD_SYSCALL.ko klp_pids=$pid_list
436a717704SMarcos Paulo de Souzalivepatch: enabling patch '$MOD_SYSCALL'
446a717704SMarcos Paulo de Souzalivepatch: '$MOD_SYSCALL': initializing patching transition
456a717704SMarcos Paulo de Souzalivepatch: '$MOD_SYSCALL': starting patching transition
466a717704SMarcos Paulo de Souzalivepatch: '$MOD_SYSCALL': completing patching transition
476a717704SMarcos Paulo de Souzalivepatch: '$MOD_SYSCALL': patching complete
486a717704SMarcos Paulo de Souza$MOD_SYSCALL: Remaining not livepatched processes: 0
49637c7309SMichael Vetter% echo 0 > $SYSFS_KLP_DIR/$MOD_SYSCALL/enabled
506a717704SMarcos Paulo de Souzalivepatch: '$MOD_SYSCALL': initializing unpatching transition
516a717704SMarcos Paulo de Souzalivepatch: '$MOD_SYSCALL': starting unpatching transition
526a717704SMarcos Paulo de Souzalivepatch: '$MOD_SYSCALL': completing unpatching transition
536a717704SMarcos Paulo de Souzalivepatch: '$MOD_SYSCALL': unpatching complete
546a717704SMarcos Paulo de Souza% rmmod $MOD_SYSCALL"
556a717704SMarcos Paulo de Souza
566a717704SMarcos Paulo de Souzaexit 0
57