From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756471AbdESDZW (ORCPT ); Thu, 18 May 2017 23:25:22 -0400 Received: from mail.kernel.org ([198.145.29.99]:47670 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754392AbdESDYw (ORCPT ); Thu, 18 May 2017 23:24:52 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 46562239E6 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=mcgrof@kernel.org From: "Luis R. Rodriguez" To: shuah@kernel.org, jeyu@redhat.com, rusty@rustcorp.com.au, ebiederm@xmission.com, dmitry.torokhov@gmail.com, acme@redhat.com, corbet@lwn.net Cc: martin.wilck@suse.com, mmarek@suse.com, pmladek@suse.com, hare@suse.com, rwright@hpe.com, jeffm@suse.com, DSterba@suse.com, fdmanana@suse.com, neilb@suse.com, linux@roeck-us.net, rgoldwyn@suse.com, subashab@codeaurora.org, xypron.glpk@gmx.de, keescook@chromium.org, atomlin@redhat.com, mbenes@suse.cz, paulmck@linux.vnet.ibm.com, dan.j.williams@intel.com, jpoimboe@redhat.com, davem@davemloft.net, mingo@redhat.com, akpm@linux-foundation.org, torvalds@linux-foundation.org, gregkh@linuxfoundation.org, linux-kselftest@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, "Luis R. Rodriguez" Subject: [PATCH 3/6] kmod: provide wrappers for kmod_concurrent inc/dec Date: Thu, 18 May 2017 20:24:41 -0700 Message-Id: <20170519032444.18416-4-mcgrof@kernel.org> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170519032444.18416-1-mcgrof@kernel.org> References: <20170519032444.18416-1-mcgrof@kernel.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org kmod_concurrent is used as an atomic counter for enabling the allowed limit of modprobe calls, provide wrappers for it to enable this to be expanded on more easily. This will be done later. Signed-off-by: Luis R. Rodriguez --- kernel/kmod.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/kernel/kmod.c b/kernel/kmod.c index 6fe6848787b2..7635915dc91c 100644 --- a/kernel/kmod.c +++ b/kernel/kmod.c @@ -59,6 +59,7 @@ static DEFINE_SPINLOCK(umh_sysctl_lock); static DECLARE_RWSEM(umhelper_sem); #ifdef CONFIG_MODULES +static atomic_t kmod_concurrent = ATOMIC_INIT(0); /* modprobe_path is set via /proc/sys. @@ -110,6 +111,20 @@ static int call_modprobe(char *module_name, int wait) return -ENOMEM; } +static int kmod_umh_threads_get(void) +{ + atomic_inc(&kmod_concurrent); + if (atomic_read(&kmod_concurrent) <= max_modprobes) + return 0; + atomic_dec(&kmod_concurrent); + return -ENOMEM; +} + +static void kmod_umh_threads_put(void) +{ + atomic_dec(&kmod_concurrent); +} + /** * __request_module - try to load a kernel module * @wait: wait (or not) for the operation to complete @@ -131,7 +146,6 @@ int __request_module(bool wait, const char *fmt, ...) va_list args; char module_name[MODULE_NAME_LEN]; int ret; - static atomic_t kmod_concurrent = ATOMIC_INIT(0); static int kmod_loop_msg; /* @@ -155,8 +169,8 @@ int __request_module(bool wait, const char *fmt, ...) if (ret) return ret; - atomic_inc(&kmod_concurrent); - if (atomic_read(&kmod_concurrent) > max_modprobes) { + ret = kmod_umh_threads_get(); + if (ret) { /* We may be blaming an innocent here, but unlikely */ if (kmod_loop_msg < 5) { printk(KERN_ERR @@ -164,15 +178,14 @@ int __request_module(bool wait, const char *fmt, ...) module_name); kmod_loop_msg++; } - atomic_dec(&kmod_concurrent); - return -ENOMEM; + return ret; } trace_module_request(module_name, wait, _RET_IP_); ret = call_modprobe(module_name, wait ? UMH_WAIT_PROC : UMH_WAIT_EXEC); - atomic_dec(&kmod_concurrent); + kmod_umh_threads_put(); return ret; } EXPORT_SYMBOL(__request_module); -- 2.11.0