[LTP] [PATCH v2] lib: Use backoff polling to wait for loop device nodes
Li Wang
li.wang@linux.dev
Tue Aug 4 05:58:33 CEST 2026
Hi Wake,
Wake Liu via ltp wrote:
> From: Wake Liu via ltp <ltp@lists.linux.it>
>
> 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@google.com/
> Signed-off-by: Wake Liu <wakel@google.com>
> ---
> 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
More information about the ltp
mailing list