Message ID | 1448039840-11367-5-git-send-email-phil@nwl.cc |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
On Fri, Nov 20, 2015 at 06:17:20PM +0100, Phil Sutter wrote: > 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. Please note that this problem does not show every time when running the test in default configuration on my system. With increased number of threads though, it becomes very visible. Load test_rhashtable like so: modprobe test_rhashtable enomem_retry=1 tcount=20 and grep dmesg for 'insertions retried after -ENOMEM'. In my case: # dmesg | grep -E '(insertions retried after -ENOMEM|Started)' | tail [ 34.642980] 1 insertions retried after -ENOMEM [ 34.642989] 1 insertions retried after -ENOMEM [ 34.642994] 1 insertions retried after -ENOMEM [ 34.648353] 28294 insertions retried after -ENOMEM [ 34.689687] 31262 insertions retried after -ENOMEM [ 34.714015] 16280 insertions retried after -ENOMEM [ 34.736019] 15327 insertions retried after -ENOMEM [ 34.755100] 39012 insertions retried after -ENOMEM [ 34.769116] 49369 insertions retried after -ENOMEM [ 35.387200] Started 20 threads, 0 failed Cheers, Phil -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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; }
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> --- lib/test_rhashtable.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)