From patchwork Wed Apr 5 20:35:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luis Chamberlain X-Patchwork-Id: 13202505 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 93A93C76188 for ; Wed, 5 Apr 2023 20:35:13 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 08B886B007B; Wed, 5 Apr 2023 16:35:13 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 014EA6B007D; Wed, 5 Apr 2023 16:35:12 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id DD17B6B007E; Wed, 5 Apr 2023 16:35:12 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id C933A6B007B for ; Wed, 5 Apr 2023 16:35:12 -0400 (EDT) Received: from smtpin15.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 99C1C1604D9 for ; Wed, 5 Apr 2023 20:35:12 +0000 (UTC) X-FDA: 80648492064.15.21D4673 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) by imf08.hostedemail.com (Postfix) with ESMTP id EDE6B160005 for ; Wed, 5 Apr 2023 20:35:10 +0000 (UTC) Authentication-Results: imf08.hostedemail.com; dkim=pass header.d=infradead.org header.s=bombadil.20210309 header.b=gfUuvSKg; spf=none (imf08.hostedemail.com: domain of mcgrof@infradead.org has no SPF policy when checking 198.137.202.133) smtp.mailfrom=mcgrof@infradead.org; dmarc=fail reason="No valid SPF, DKIM not aligned (relaxed)" header.from=kernel.org (policy=none) ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1680726911; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=YNsOcxvyBsREks0tqN6x4wPg4m3MWZPixrfEIPIhg1U=; b=VAzylIuGZZ7d1hZ5yg2m/GKZMKswVFOEjR8V79ohtLQdVLaoijq02+4/Z2iP1NSkhBoO1d lvHjoezSUjDF6qXDiRPhRPyBDau0wr68CkwcKcecfumK7n8KUU3k4+JdiRc+xphkDEDFR3 PDAlP0RhzsE1y/cA5eECiyQkO7J+Eh4= ARC-Authentication-Results: i=1; imf08.hostedemail.com; dkim=pass header.d=infradead.org header.s=bombadil.20210309 header.b=gfUuvSKg; spf=none (imf08.hostedemail.com: domain of mcgrof@infradead.org has no SPF policy when checking 198.137.202.133) smtp.mailfrom=mcgrof@infradead.org; dmarc=fail reason="No valid SPF, DKIM not aligned (relaxed)" header.from=kernel.org (policy=none) ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1680726911; a=rsa-sha256; cv=none; b=WGEptoUU4QuErygKmwfLHDB+8aWOKgK3sS4TaCmOlEHpYkDbi4wTJFzaKDLpcN0WbGu3RK G1K1gCqsuXKSKh6MRxdR0kjNSThRzNtW4vX+QUzxQ26XO8/2MmzldWcLqvGjQ9zvwshynQ +oDUn5ZDFnVM5q/d4taGjjU2rJKjvGQ= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Sender:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description; bh=YNsOcxvyBsREks0tqN6x4wPg4m3MWZPixrfEIPIhg1U=; b=gfUuvSKg4yYImkFYNGmsyBbM9/ 98+9D7ZfdVo5oy0g+qCsN+zRZAdeIcw42D6VL+3B4EETojpzrqXxf2fPwN5IrpuXCzNsChVc8ePOW bzq20BGd/mVGhBbLILr3CvX48WxYtJL9sRJ3Oe1bzyk6981tRGzBPh8znM++Pop3RGrpUwwgqpGNi hczxpBcuxOjTfJsezWUl6mrDXv6j4w6WsSccnsoXFIJ7rVVSqVCKi1gjncinIWeBtXqnM8IMFIUvz 5B5Z79iMSHvBm3Ns+7ZzHWRzMhw7m440onLHSzpBwnCLi0BRl520qUOiTOIWiYocYXHd/dnrb5ALb yTVa8mag==; Received: from mcgrof by bombadil.infradead.org with local (Exim 4.96 #2 (Red Hat Linux)) id 1pk9qT-005dWc-2p; Wed, 05 Apr 2023 20:35:05 +0000 From: Luis Chamberlain To: david@redhat.com, patches@lists.linux.dev, linux-modules@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, pmladek@suse.com, petr.pavlu@suse.com, prarit@redhat.com, torvalds@linux-foundation.org, gregkh@linuxfoundation.org, rafael@kernel.org Cc: christophe.leroy@csgroup.eu, tglx@linutronix.de, peterz@infradead.org, song@kernel.org, rppt@kernel.org, dave@stgolabs.net, willy@infradead.org, vbabka@suse.cz, mhocko@suse.com, dave.hansen@linux.intel.com, colin.i.king@gmail.com, jim.cromie@gmail.com, catalin.marinas@arm.com, jbaron@akamai.com, rick.p.edgecombe@intel.com, mcgrof@kernel.org Subject: [PATCH v2 2/2] modules/kmod: replace implementation with a sempahore Date: Wed, 5 Apr 2023 13:35:05 -0700 Message-Id: <20230405203505.1343562-3-mcgrof@kernel.org> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20230405203505.1343562-1-mcgrof@kernel.org> References: <20230405203505.1343562-1-mcgrof@kernel.org> MIME-Version: 1.0 X-Rspamd-Queue-Id: EDE6B160005 X-Stat-Signature: 5xkephtmgcaabtk98di36afjkobynhb5 X-Rspam-User: X-Rspamd-Server: rspam08 X-HE-Tag: 1680726910-651522 X-HE-Meta: U2FsdGVkX18sHeINJQy8PB2RoNciZYxEPl+9DgXpQtTxd2I/3eTFSLB5CyQ2Pp7Xyg/ix9GI/dE9bqQGds2NQirHNBkfPW7n7szMRyIbnOvZYIu8XzdHB8rzfJ7b4dlDwSzQQKgpdDTwyWteNJ1Drp2U/QnfGZyFxuR/2XSKE/V0A+qaV2JCm5uda1v+Nqa2ojqnQhXhOLogTZ8/i4YUTrA6zBRETfMH8FgVrDMq5OnxuR922gIzaI8HUVtl7rdXMYBJu1fENe36VrInJJPAMxEJp80iz8GnlFuDn9xd8ozf+SAO6EqrEjp+dFn9N1sAdFFKRz4/ERYiYYqVQuY2z2lKOzrR7I6RAeaOlD3ynAelXWWsoJH6YunZajy8tt3O8GVmYEgjs8zzygHOn+V9gCb6GnmVqRkNt+bWww6imdbFzPzZVQbyLdTtCMoBazrPxxaWcDSN6w+2ay/T92pJEaX/k23nDTqsb/vjlDJRA15h+HyAH582VhxQBPz4QKSqtEYeaE132FqcusORMf+vc3w7q8eyjuUsyWvfjBCLdHFCCAp68rnqUiMJStCiM61MGtxwKa+Sq76MeFxLSBHZ9j14LugF54feoT/b+9zZArLjcfWPVM4Oj2s5eYbJMfRFr9R8nXrkD3A1S3tI3MuC1gWi+3JPH/3XPB5iKLkurQOlRqG89NcixjXbcx/hbyluwUSQn8uV4wfg1xy7WtaYd0iLVUP8FN7Du4WiSFvjvEKazVBpP+pusguyMOcRH8ntPS8VrIRkgOGXvwGtbiRC6bBYOvALsB7aec8I9ryBKD1oayQCuXAFaGXTM8ecAFMTngrtj5P1VbfGIlfaS1MdQB9pSlaJYfuWMeD+L5IK1YUG7seQTE5qI22rT9fgEN3jI/nZd5au04dnjDgYNqZZx0lmkWiRISsSFIp/mQ26m5Cn35PxryUwrz0Y2yxhMPlP6a1KTjj75c0/wDdJG5g t1N38v02 U28jL++qlLfoON8WhghVKcZ6mmdA5MnBbWC7Lu4HiPTK4qpif5mW5Zw7ibJcBdWqtFA7R1tsLqJ3aTbIwXrL1GjXLdBQgDpF/8Yp++Rfx6aVgdPGX0dd3CuUh98lI6aCukDfEXYFksovzgRTZt1HJKvh7h7zfi86IKyacoEfsn7kMEXlGZev7Uu1Xft6Wc3WezyPKN8zOeFv4WHqhDwVrOYFnPfhjyvYaZgB1/wME2VDUW38a2rQt6vnuuPagcL+L34JI5HG2+OD8zvuASFcYw3bVvxm6831tCN7ceTkIGpTqYpWQ+hGmD9E6kAbEBez6Lw5QT8NNhgFETWVwZ1PkkFSueJ6GT0wsrdxypwZxSHnVz6Phs7dRgPmPsA6fHZhCv04NeHVLGPDksQOqTGfWfQnOloBuVJOlQO4I3Ytyypdi1Psvf1/xEWMu9H0y+1F4RACvROWPSlfQw+IMecLHqnW0nF4LqyRTyp8k8FH9/0cferw= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Simplfy the concurrency delimiter we user for kmod with the semaphore. I had used the kmod strategy to try to implement a similar concurrency delimiter for the kernel_read*() calls from the finit_module() path so to reduce vmalloc() memory pressure. That effort didn't provid yet conclusive results, but one thing that did became clear is we can use the suggested alternative solution with semaphores which Linus hinted at instead of using the atomic / wait strategy. I've stress tested this with kmod test 0008: time /data/linux-next/tools/testing/selftests/kmod/kmod.sh -t 0008 And I get only a *slight* delay. That delay however is small, a few seconds for a full test loop run that runs 150 times, for about ~30-40 seconds. The small delay is worth the simplfication IMHO. Signed-off-by: Luis Chamberlain Reviewed-by: Davidlohr Bueso Reviewed-by: David Hildenbrand --- kernel/module/kmod.c | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/kernel/module/kmod.c b/kernel/module/kmod.c index b717134ebe17..925eb85b8346 100644 --- a/kernel/module/kmod.c +++ b/kernel/module/kmod.c @@ -40,8 +40,7 @@ * effect. Systems like these are very unlikely if modules are enabled. */ #define MAX_KMOD_CONCURRENT 50 -static atomic_t kmod_concurrent_max = ATOMIC_INIT(MAX_KMOD_CONCURRENT); -static DECLARE_WAIT_QUEUE_HEAD(kmod_wq); +static DEFINE_SEMAPHORE(kmod_concurrent_max, MAX_KMOD_CONCURRENT); /* * This is a restriction on having *all* MAX_KMOD_CONCURRENT threads @@ -148,29 +147,18 @@ int __request_module(bool wait, const char *fmt, ...) if (ret) return ret; - if (atomic_dec_if_positive(&kmod_concurrent_max) < 0) { - pr_warn_ratelimited("request_module: kmod_concurrent_max (%u) close to 0 (max_modprobes: %u), for module %s, throttling...", - atomic_read(&kmod_concurrent_max), - MAX_KMOD_CONCURRENT, module_name); - ret = wait_event_killable_timeout(kmod_wq, - atomic_dec_if_positive(&kmod_concurrent_max) >= 0, - MAX_KMOD_ALL_BUSY_TIMEOUT * HZ); - if (!ret) { - pr_warn_ratelimited("request_module: modprobe %s cannot be processed, kmod busy with %d threads for more than %d seconds now", - module_name, MAX_KMOD_CONCURRENT, MAX_KMOD_ALL_BUSY_TIMEOUT); - return -ETIME; - } else if (ret == -ERESTARTSYS) { - pr_warn_ratelimited("request_module: sigkill sent for modprobe %s, giving up", module_name); - return ret; - } + ret = down_timeout(&kmod_concurrent_max, MAX_KMOD_ALL_BUSY_TIMEOUT); + if (ret) { + pr_warn_ratelimited("request_module: modprobe %s cannot be processed, kmod busy with %d threads for more than %d seconds now", + module_name, MAX_KMOD_CONCURRENT, MAX_KMOD_ALL_BUSY_TIMEOUT); + return ret; } trace_module_request(module_name, wait, _RET_IP_); ret = call_modprobe(module_name, wait ? UMH_WAIT_PROC : UMH_WAIT_EXEC); - atomic_inc(&kmod_concurrent_max); - wake_up(&kmod_wq); + up(&kmod_concurrent_max); return ret; }