rhashtable-test: allow to retry even if -ENOMEM was returned
authorPhil Sutter <phil@nwl.cc>
Fri, 20 Nov 2015 17:17:20 +0000 (18:17 +0100)
committerDavid S. Miller <davem@davemloft.net>
Mon, 23 Nov 2015 17:36:08 +0000 (12:36 -0500)
This is rather a hack to expose the current issue with rhashtable to
under high pressure sometimes return -ENOMEM even though system memory
is not exhausted and a consecutive insert may succeed.

Signed-off-by: Phil Sutter <phil@nwl.cc>
Signed-off-by: David S. Miller <davem@davemloft.net>
lib/test_rhashtable.c

index 6fa77b3f0e805ddd03b396c7d150ff55647d1fbb..270bf7289b1e0182a9a34a11e2b0bb2b152463ae 100644 (file)
@@ -52,6 +52,10 @@ static int tcount = 10;
 module_param(tcount, int, 0);
 MODULE_PARM_DESC(tcount, "Number of threads to spawn (default: 10)");
 
+static bool enomem_retry = false;
+module_param(enomem_retry, bool, 0);
+MODULE_PARM_DESC(enomem_retry, "Retry insert even if -ENOMEM was returned (default: off)");
+
 struct test_obj {
        int                     value;
        struct rhash_head       node;
@@ -79,14 +83,22 @@ static struct semaphore startup_sem = __SEMAPHORE_INITIALIZER(startup_sem, 0);
 static int insert_retry(struct rhashtable *ht, struct rhash_head *obj,
                         const struct rhashtable_params params)
 {
-       int err, retries = -1;
+       int err, retries = -1, enomem_retries = 0;
 
        do {
                retries++;
                cond_resched();
                err = rhashtable_insert_fast(ht, obj, params);
+               if (err == -ENOMEM && enomem_retry) {
+                       enomem_retries++;
+                       err = -EBUSY;
+               }
        } while (err == -EBUSY);
 
+       if (enomem_retries)
+               pr_info(" %u insertions retried after -ENOMEM\n",
+                       enomem_retries);
+
        return err ? : retries;
 }