From ae79f46a3ee4a542731bdae8b30976729ede00e5 Mon Sep 17 00:00:00 2001 From: Thomas Schoebel-Theuer Date: Thu, 18 Nov 2021 15:53:05 +0100 Subject: [PATCH] infra: defend against OOM and fork limits --- kernel/brick.h | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/kernel/brick.h b/kernel/brick.h index 8116a723..ec9542db 100644 --- a/kernel/brick.h +++ b/kernel/brick.h @@ -702,17 +702,26 @@ typedef enum { ({ \ brick_thread_t *_thr = NULL; \ int _max_retry = 3; \ + int _nr_retry = 0; \ \ - while (_max_retry-- > 0) { \ + for (;;) { \ int _err; \ \ flush_signals(current); \ _thr = kthread_create(_thread_fn, _data, _fmt, ##_args); \ if (likely(!IS_ERR(_thr))) \ break; \ + brick_yield(); \ _err = PTR_ERR(_thr); \ - if (_err == -EAGAIN || _err == -EINTR) \ + if (_err == -EAGAIN || \ + _err == -ENOMEM || \ + _err == -EINTR || \ + _max_retry-- > 0) { \ + brick_msleep(_nr_retry++); \ + if (_nr_retry > 1000) \ + _nr_retry = 1000; \ continue; \ + } \ BRICK_ERR("cannot create thread '%s', status = %d\n", _fmt, _err); \ _thr = NULL; \ break; \