From: NeilBrown Date: Tue, 25 Jun 2013 05:56:22 +0000 (+1000) Subject: Subject: Make wait_for and open_dev_excl faster X-Git-Tag: mdadm-3.3-rc2~97 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=399e0b9709311bebde461c57f5622be68e15c6a0;p=thirdparty%2Fmdadm.git Subject: Make wait_for and open_dev_excl faster When we crete or assemble an array, we wait for udev to create the device file in /dev so that as soon as mdadm complete, the device can be used. This waiting is performed in multiples of 200ms, which can sometimes be too long to wait. So change to an exponential backoff. Wait 1, then 2, then 4 msec etc. Once we get to 256msec, stop backing off and continue waiting 256ms at a time until we reach the limit which is now 4.608sec rather than 5sec which it was before. Ditto for open_dev_excl. Signed-off-by: NeilBrown --- diff --git a/util.c b/util.c index 90b63eb3..a9aaea48 100644 --- a/util.c +++ b/util.c @@ -962,6 +962,7 @@ int open_dev_excl(char *devnm) int i; int flags = O_RDWR; int devid = devnm2devid(devnm); + long delay = 1000; sprintf(buf, "%d:%d", major(devid), minor(devid)); for (i = 0 ; i < 25 ; i++) { @@ -974,7 +975,9 @@ int open_dev_excl(char *devnm) } if (errno != EBUSY) return fd; - usleep(200000); + usleep(delay); + if (delay < 200000) + delay *= 2; } return -1; } @@ -997,6 +1000,7 @@ void wait_for(char *dev, int fd) { int i; struct stat stb_want; + long delay = 1000; if (fstat(fd, &stb_want) != 0 || (stb_want.st_mode & S_IFMT) != S_IFBLK) @@ -1008,7 +1012,9 @@ void wait_for(char *dev, int fd) (stb.st_mode & S_IFMT) == S_IFBLK && (stb.st_rdev == stb_want.st_rdev)) return; - usleep(200000); + usleep(delay); + if (delay < 200000) + delay *= 2; } if (i == 25) dprintf("%s: timeout waiting for %s\n", __func__, dev);