Re: [PATCH v2] lib: Use backoff polling to wait for loop device nodes
Li Wang <[email protected]> Tue, 4 Aug 2026 11:58:33 +0800
| Newsgroups | gmane.linux.ltp |
|---|---|
| Message-ID | <[email protected]> |
Hi Wake, Wake Liu via ltp wrote: > From: Wake Liu via ltp <[email protected]> > > On systems where loop device node creation is asynchronous (such as Android > containers or systems with slow udev startup), calling stat() or open() > immediately after LOOP_CTL_GET_FREE can transiently fail because the > device file (e.g. /dev/loopX) has not been fully populated in time. > > Introduce an exponential-backoff retry loop in both > tst_find_free_loopdev() and tst_attach_device() (starting at 1ms delay, > doubling each try, capped at 100ms) to wait for the device node to be > successfully populated. > > This improves the robustness of loop device allocations on asynchronous > virtualized environments while minimizing unnecessary delays on responsive > systems. > > Link: https://lore.kernel.org/ltp/20260803152754.3991113-1-wakel-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org/ > Signed-off-by: Wake Liu <[email protected]> > --- > v1 -> v2: > - Strictly clamp backoff delay to 100ms (prevent overflow exceeding cap). > - Skip usleep on final loop iteration to avoid unnecessary idle delay. > - Reduce max attempts to 30 (stat) and 15 (open) to bound worst-case timeout. > > lib/tst_device.c | 32 +++++++++++++++++++++++++++----- > > diff --git a/lib/tst_device.c b/lib/tst_device.c > index 744173ffef..19e1a8a25c 100644 > --- a/lib/tst_device.c > +++ b/lib/tst_device.c > @@ -82,7 +82,7 @@ static int set_dev_loop_path(int rc, char *path, size_t path_len) > > int tst_find_free_loopdev(char *path, size_t path_len) > { > - int ctl_fd, dev_fd, rc, i; > + int ctl_fd, dev_fd, rc, i, path_set; > struct loop_info loopinfo; > char buf[PATH_MAX]; > > @@ -94,8 +94,18 @@ int tst_find_free_loopdev(char *path, size_t path_len) > if (rc >= 0) { > if (path) { > - if (set_dev_loop_path(rc, path, path_len)) > - tst_brkm(TBROK, NULL, "Could not stat loop device %i", rc); > + unsigned int usec = 1000; /* start with 1ms */ > + > + for (i = 0; i < 30; i++) { > + path_set = set_dev_loop_path(rc, path, path_len); > + if (!path_set) > + break; > + if (i < 29) { > + usleep(usec); > + usec = usec * 2 < 100000 ? usec * 2 : 100000; > + } > + } LTP has already provided the exponential-backoff macro in tst_common.h TST_RETRY_FN_EXP_BACKOFF() Maybe you can reuse it directly? -- Regards, Li Wang -- Mailing list info: https://lists.linux.it/listinfo/ltp