selftests: net: py: ensure defer() is only used within a test case

I wasted a couple of hours recently after accidentally adding
a defer() from within a function which itself was called as
part of defer(). This leads to an infinite loop of defer().
Make sure this cannot happen and raise a helpful exception.

I understand that the pair of _ksft_defer_arm() calls may
not be the most Pythonic way to implement this, but it's
easy enough to understand.

Reviewed-by: Petr Machata <petrm@nvidia.com>
Link: https://patch.msgid.link/20260108225257.2684238-2-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Jakub Kicinski 2026-01-08 14:52:57 -08:00
parent 799a4912ee
commit 7a1ff3545a
2 changed files with 10 additions and 0 deletions

View File

@ -153,6 +153,11 @@ def ktap_result(ok, cnt=1, case_name="", comment=""):
print(res, flush=True)
def _ksft_defer_arm(state):
""" Allow or disallow the use of defer() """
utils.GLOBAL_DEFER_ARMED = state
def ksft_flush_defer():
global KSFT_RESULT
@ -315,6 +320,7 @@ def ksft_run(cases=None, globs=None, case_pfx=None, args=()):
comment = ""
cnt_key = ""
_ksft_defer_arm(True)
try:
func(*args)
except KsftSkipEx as e:
@ -332,6 +338,7 @@ def ksft_run(cases=None, globs=None, case_pfx=None, args=()):
ksft_pr(f"Stopping tests due to {type(e).__name__}.")
KSFT_RESULT = False
cnt_key = 'fail'
_ksft_defer_arm(False)
try:
ksft_flush_defer()

View File

@ -142,6 +142,7 @@ class bkg(cmd):
GLOBAL_DEFER_QUEUE = []
GLOBAL_DEFER_ARMED = False
class defer:
@ -153,6 +154,8 @@ class defer:
self.args = args
self.kwargs = kwargs
if not GLOBAL_DEFER_ARMED:
raise Exception("defer queue not armed, did you use defer() outside of a test case?")
self._queue = GLOBAL_DEFER_QUEUE
self._queue.append(self)