Jakub Kicinski <[email protected]> writes:
> Following up on the old discussion [1]. Let the BaseExceptions out of > defer()'ed cleanup. And handle it in the main loop. This allows us to > exit the tests if user hit Ctrl-C during defer(). > > Link: https://lore.kernel.org/[email protected] # [1] > Signed-off-by: Jakub Kicinski <[email protected]> > --- > CC: [email protected] > CC: [email protected] > CC: [email protected] > CC: [email protected] > --- > tools/testing/selftests/net/lib/py/ksft.py | 18 ++++++++++++++++-- > 1 file changed, 16 insertions(+), 2 deletions(-) > > diff --git a/tools/testing/selftests/net/lib/py/ksft.py > b/tools/testing/selftests/net/lib/py/ksft.py > index ebd82940ee50..531e7fa1b3ea 100644 > --- a/tools/testing/selftests/net/lib/py/ksft.py > +++ b/tools/testing/selftests/net/lib/py/ksft.py > @@ -163,7 +163,7 @@ KSFT_DISRUPTIVE = True > entry = global_defer_queue.pop() > try: > entry.exec_only() > - except BaseException: > + except Exception: > ksft_pr(f"Exception while handling defer / cleanup (callback {i} > of {qlen_start})!") > tb = traceback.format_exc() > for line in tb.strip().split('\n'): > @@ -333,7 +333,21 @@ KsftCaseFunction = namedtuple("KsftCaseFunction", > KSFT_RESULT = False > cnt_key = 'fail' > > - ksft_flush_defer() > + try: > + ksft_flush_defer() > + except BaseException as e: > + tb = traceback.format_exc() > + for line in tb.strip().split('\n'): > + ksft_pr("Exception|", line) > + if isinstance(e, KeyboardInterrupt): > + ksft_pr() > + ksft_pr("WARN: defer() interrupted, cleanup may be > incomplete.") > + ksft_pr(" Attempting to finish cleanup before exiting.") > + ksft_pr(" Interrupt again to exit immediately.") > + ksft_pr() > + stop = True > + # Flush was interrupted, try to finish the job best we can > + ksft_flush_defer() > > if not cnt_key: > cnt_key = 'pass' if KSFT_RESULT else 'fail' Nice. Reviewed-by: Petr Machata <[email protected]>
