]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
bootdev: avoid infinite probe loop
authorCaleb Connolly <caleb.connolly@linaro.org>
Thu, 4 Jan 2024 16:03:35 +0000 (16:03 +0000)
committerTom Rini <trini@konsulko.com>
Thu, 18 Jan 2024 17:18:48 +0000 (12:18 -0500)
Sometimes, when only one bootdev is available, and it fails to probe, we
end up in an infinite loop calling probe() on the same device over and
over. With only debug level log output.

Break the loop if we fail to probe the same device twice in a row, and
promote the probe failure message to log_warning().

Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Dragan Simic <dsimic@manjaro.org>
boot/bootdev-uclass.c

index 4926a50da85d0740f39e91949790ca535f123b91..35afb93c0e736a040d1e62ec19cb5c5c04aa8374 100644 (file)
@@ -632,7 +632,7 @@ int bootdev_next_label(struct bootflow_iter *iter, struct udevice **devp,
 
 int bootdev_next_prio(struct bootflow_iter *iter, struct udevice **devp)
 {
-       struct udevice *dev = *devp;
+       struct udevice *dev = *devp, *last_dev = NULL;
        bool found;
        int ret;
 
@@ -682,9 +682,19 @@ int bootdev_next_prio(struct bootflow_iter *iter, struct udevice **devp)
                        }
                } else {
                        ret = device_probe(dev);
+                       if (!ret)
+                               last_dev = dev;
                        if (ret) {
-                               log_debug("Device '%s' failed to probe\n",
+                               log_warning("Device '%s' failed to probe\n",
                                          dev->name);
+                               if (last_dev == dev) {
+                                       /*
+                                        * We have already tried this device
+                                        * and it failed to probe. Give up.
+                                        */
+                                       return log_msg_ret("probe", ret);
+                               }
+                               last_dev = dev;
                                dev = NULL;
                        }
                }