> > > +disable_lp $MOD_TARGET_PATCH
> > > +unload_lp $MOD_TARGET_PATCH
> > > +
> > > +if [[ "$(cat /proc/$MOD_TARGET)" != "$MOD_TARGET: original output" ]] ; 
> > > then
> > > + echo -e "FAIL\n\n"
> > > + die "livepatch kselftest(s) failed"
> > > +fi
> > > +
> > > +unload_mod $MOD_TARGET
> > > +
> > > +check_result "% insmod test_modules/$MOD_TARGET.ko
> > > +$MOD_TARGET: test_klp_mod_target_init
> > > +% insmod test_modules/$MOD_TARGET_PATCH.ko
> > 
> 
> So following this technique, all the other tests with command sequences
> would need to be re-written as '&&' chains, e.g. the "patch getpid
> syscall while being heavily hammered" one like:
> 
>   pid_list=$(echo "${pids[@]}" | tr ' ' ',') && \
>     load_lp $MOD_SYSCALL klp_pids=$pid_list && \
>     loop_until "grep -q '^0$' $SYSFS_KERNEL_DIR/$MOD_SYSCALL/npids" && \
>     log "$MOD_SYSCALL: Remaining not livepatched processes: $(cat 
> $SYSFS_KERNEL_DIR/$MOD_SYSCALL/npids)"
> 
> so that we only continue down a particular test for as long as it's
> successful, then the cleanup code is unconditional:
> 
>   pending_pids=$(cat $SYSFS_KERNEL_DIR/$MOD_SYSCALL/npids)
>   log "$MOD_SYSCALL: Remaining not livepatched processes: $pending_pids"
> 
>   for pid in ${pids[@]}; do
>           kill $pid || true
>   done
> 
>   disable_lp $MOD_SYSCALL
>   unload_lp $MOD_SYSCALL
> 
>   check_result  <- flags a problem
> 
> Yeah, may be that's not so bad.  The functions.sh helpers may need to be
> hardened a little (can they cancel / bust a transition?  it's been a
> while since I've looked.) 
> 
> Or maybe ... ugh, bash is not a programming language ... each test is
> split into its own script, the die calls can remain as they are, but we
> move the cleanup logic into a trap EXIT handler so it always runs?

We use this technique in OOT https://github.com/SUSE/qa_test_klp/ tests 
(slowly being upstreamed). See 
https://github.com/SUSE/qa_test_klp/blob/master/klp_tc_functions.sh. 
Mainly klp_tc_init(), klp_tc_exit() and klp_tc_abort(). Different tests 
then use what you proposed above... caching pids and modules to clean up.

Miroslav

Reply via email to