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 <p...@nwl.cc>
---
 lib/test_rhashtable.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/lib/test_rhashtable.c b/lib/test_rhashtable.c
index 6fa77b3..270bf72 100644
--- a/lib/test_rhashtable.c
+++ b/lib/test_rhashtable.c
@@ -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;
 }
 
-- 
2.1.2

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to