]> www.infradead.org Git - mtd-utils.git/commitdiff
ubi: tests: Speedup io_paral by using rand_r()
authorRichard Weinberger <richard@nod.at>
Mon, 22 Feb 2016 13:52:05 +0000 (14:52 +0100)
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>
Tue, 21 Feb 2017 09:13:26 +0000 (10:13 +0100)
rand() is not thread safe, but glibc seems to use a shared state which is
protected by a mutex. io_paral spawns a few threads and they call rand()
more or less in parallel, which causes heavy lock contention. That
makes the test extremely slow on some setups.

Signed-off-by: Richard Weinberger <richard@nod.at>
Signed-off-by: David Gstir <david@sigma-star.at>
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
tests/ubi-tests/io_paral.c

index becbb522cb88cfa123c8665f8767bba16b18fd7d..b2b462e1ae4161d82a429e93f5319d11e540901b 100644 (file)
@@ -55,6 +55,7 @@ static int update_volume(int vol_id, int bytes)
        char *vol_node = vol_nodes[vol_id];
        unsigned char *wbuf = wbufs[vol_id];
        unsigned char *rbuf = rbufs[vol_id];
+       unsigned int seed = seed_random_generator();
 
        fd = open(vol_node, O_RDWR);
        if (fd == -1) {
@@ -64,7 +65,7 @@ static int update_volume(int vol_id, int bytes)
        }
 
        for (i = 0; i < bytes; i++)
-               wbuf[i] = rand() % 255;
+               wbuf[i] = rand_r(&seed) % 255;
        memset(rbuf, '\0', bytes);
 
        ret = ubi_update_start(libubi, fd, bytes);
@@ -75,7 +76,7 @@ static int update_volume(int vol_id, int bytes)
        }
 
        while (written < bytes) {
-               int to_write = rand() % (bytes - written);
+               int to_write = rand_r(&seed) % (bytes - written);
 
                if (to_write == 0)
                        to_write = 1;
@@ -104,7 +105,7 @@ static int update_volume(int vol_id, int bytes)
 
        /* read data back and check */
        while (rd < bytes) {
-               int to_read = rand() % (bytes - rd);
+               int to_read = rand_r(&seed) % (bytes - rd);
 
                if (to_read == 0)
                        to_read = 1;
@@ -136,10 +137,11 @@ err_close:
 static void *update_thread(void *ptr)
 {
        int vol_id = (long)ptr, i;
+       unsigned int seed = seed_random_generator();
 
        for (i = 0; i < ITERATIONS; i++) {
-               int ret, bytes = (rand() % (vol_size - 1)) + 1;
-               int remove = !(rand() % 16);
+               int ret, bytes = (rand_r(&seed) % (vol_size - 1)) + 1;
+               int remove = !(rand_r(&seed) % 16);
 
                /* From time to time remove the volume */
                if (remove) {
@@ -171,6 +173,7 @@ static void *write_thread(void *ptr)
        char *vol_node = vol_nodes[vol_id];
        unsigned char *wbuf = wbufs[vol_id];
        unsigned char *rbuf = rbufs[vol_id];
+       unsigned int seed = seed_random_generator();
 
        fd = open(vol_node, O_RDWR);
        if (fd == -1) {
@@ -186,7 +189,7 @@ static void *write_thread(void *ptr)
        }
 
        for (i = 0; i < ITERATIONS * VOL_LEBS; i++) {
-               int j, leb = rand() % VOL_LEBS;
+               int j, leb = rand_r(&seed) % VOL_LEBS;
                off_t offs = dev_info.leb_size * leb;
 
                ret = ubi_leb_unmap(fd, leb);
@@ -197,7 +200,7 @@ static void *write_thread(void *ptr)
                }
 
                for (j = 0; j < dev_info.leb_size; j++)
-                       wbuf[j] = rand() % 255;
+                       wbuf[j] = rand_r(&seed) % 255;
                memset(rbuf, '\0', dev_info.leb_size);
 
                ret = pwrite(fd, wbuf, dev_info.leb_size, offs);
@@ -233,7 +236,6 @@ int main(int argc, char * const argv[])
        int i, ret;
        pthread_t threads[THREADS_NUM];
 
-       seed_random_generator();
        if (initial_check(argc, argv))
                return 1;