git: ac56d36007a5 - main - iflib: Add an admin task detach fail point
Kevin Bowling <[email protected]>
| Newsgroups | gmane.os.freebsd.devel.cvs.src |
|---|---|
| Message-ID | <6a7f9413.1f7a0.46f466a2__30474.9692020536$1786745895$gmane$org@gitrepo.freebsd.org> |
The branch main has been updated by kbowling: URL: https://cgit.FreeBSD.org/src/commit/?id=ac56d36007a5a1a01fe69df370f272060e852e0b commit ac56d36007a5a1a01fe69df370f272060e852e0b Author: Kevin Bowling <[email protected]> AuthorDate: 2026-08-08 06:18:26 +0000 Commit: Kevin Bowling <[email protected]> CommitDate: 2026-08-14 22:17:04 +0000 iflib: Add an admin task detach fail point Add an exact-device fail point immediately after the admin task checks IFC_IN_DETACH. This makes the detach race reproducible without affecting another interface. Use a bounded delay to keep the task active while detach enters the taskqueue drain. Mark the point nonsleepable as a safety backstop, and document a one-shot test for verifying that deregistration drains an already-running task before ether_ifdetach(). Reviewed by: gallatin, kgalazka MFC after: 2 weeks Sponsored by: BBOX.io Differential Revision: https://reviews.freebsd.org/D58720 --- share/man/man4/iflib.4 | 19 +++++++++++++++++++ sys/net/iflib.c | 11 +++++++++++ 2 files changed, 30 insertions(+) diff --git a/share/man/man4/iflib.4 b/share/man/man4/iflib.4 index 031e33a2409e..4cf08602fd04 100644 --- a/share/man/man4/iflib.4 +++ b/share/man/man4/iflib.4 @@ -286,6 +286,25 @@ devctl attach pci0:4:0:0 # succeeds .Pp After detach, a device may no longer have its former name. Use a bus-specific address, as shown in the PCI example above, to reprobe it. +.Pp +The normal detach path can be synchronized with an in-flight admin task to +test taskqueue teardown. +Set +.Va debug.fail_point.iflib.admin_task_device +to the exact device name, bring the interface up, and set +.Va debug.fail_point.iflib.admin_task_after_detach_check +to a one-shot bounded delay, such as +.Ql 1*print(1)->1*delay(5000000) . +The delay keeps the admin task active long enough for detach to begin and +remain blocked in the taskqueue drain. +As a safety backstop, this fail point is marked nonsleepable and converts a +configured +.Sy sleep +action to a delay. +Once the execution message appears in the system log, +detach should wait for the delay to finish. +This exercises the case where an admin task has passed its detach check but +has not yet acquired the context lock. .Sh SEE ALSO .Xr devctl 8 , .Xr fail 9 , diff --git a/sys/net/iflib.c b/sys/net/iflib.c index cda60f174a31..9efd4b56c5d1 100644 --- a/sys/net/iflib.c +++ b/sys/net/iflib.c @@ -575,6 +575,12 @@ SYSCTL_STRING(_debug_fail_point_iflib, OID_AUTO, register_device, iflib_register_fail_device, sizeof(iflib_register_fail_device), "device name eligible for registration fail points"); +static char iflib_admin_task_fail_device[32]; +SYSCTL_STRING(_debug_fail_point_iflib, OID_AUTO, admin_task_device, + CTLFLAG_RW | CTLFLAG_MPSAFE, + iflib_admin_task_fail_device, sizeof(iflib_admin_task_fail_device), + "device name eligible for admin task fail points"); + /* * XXX need to ensure that this can't accidentally cause the head to be moved backwards */ @@ -4233,6 +4239,11 @@ _task_fn_admin(void *context, int pending) return; if (in_detach) return; + KFAIL_POINT_CODE_COND(_debug_fail_point_iflib, + admin_task_after_detach_check, + iflib_admin_task_fail_device[0] != '\0' && + strcmp(device_get_nameunit(ctx->ifc_dev), + iflib_admin_task_fail_device) == 0, FAIL_POINT_NONSLEEPABLE, {}); CTX_LOCK(ctx); if (!do_reset && do_reset_if_up &&