Received: by 10.223.185.116 with SMTP id b49csp239379wrg; Thu, 8 Mar 2018 16:33:00 -0800 (PST) X-Google-Smtp-Source: AG47ELuBmvSoQ3zoYSW80pESP/mkYDf+kiozPzYCbtjGlEC1TL4guQhRfUo8GcbbSFXOenLHiBTJ X-Received: by 10.99.117.76 with SMTP id f12mr23157362pgn.410.1520555580775; Thu, 08 Mar 2018 16:33:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1520555580; cv=none; d=google.com; s=arc-20160816; b=ixNge4S2lxqJJhadHLYYHxJK7QSFMgs1TUG1hYzGxTkngHV0TzBL/TDSUbvL5txZ6B D9zrhSuHDx2BtysiqV+oDWNEL+PGyIWH6LNtKJTMbMVBA2K63tqNM4f4cxOOf+onsXIq PoCp+MT50bLybbympFKnW0aPaXAIpKiRivSXcL5bCJirSaa2keIDOLK0lMeMm4jhUFyI XQkcUdUJacQmANiN8dJLhcVlvfSbTGeVVzMMyJBMvHxsDhFvWiRZpsMO3TWvueo+xjVG zZHc/Zv4uf6Q+eUx1dqyCFWOveB4VWLI4Mj/h8VCZ53PZi6NhgHpcmmk1ydf23Y4VnbL wepA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:content-transfer-encoding :content-id:content-language:accept-language:in-reply-to:references :message-id:date:thread-index:thread-topic:subject:cc:to:from :arc-authentication-results; bh=/ur2E3UYu1hLzj4rikbchjnpdvVuhTd0z+Y2A0hHvI0=; b=mi2a+gkF3mg9gpknh78iMV7tjECAGZslfL7pV8CDDRhGhXb9Smtc4NNcmA+7xAlz2E qFUeMrTAyxjKoW3w8rNDizcuqEkYkLIv9z+MemCD60/ncrF/lHXcRQrXjhlEZr1K65Cl lbM3NWb5vwFY1XTTvHpJTJ2m5yqS1OXqLOYWMBa5xnULQcpV2DxV925b9gSUD91o/DJM bhsBeh8/83KM8AVlVl2Qd3nQRaPHCMeP3deEQAi8T/sssll++9fE9aj5Hb/7LzjFE27M mi88ird+xteNMA1lAGeTyLVLzQgSM1VIQV/UNlzogLTYsatq3Id9K5YnpvG/9UEQrUFX auxg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w2si12009856pgm.458.2018.03.08.16.32.46; Thu, 08 Mar 2018 16:33:00 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751486AbeCIAbr convert rfc822-to-8bit (ORCPT + 99 others); Thu, 8 Mar 2018 19:31:47 -0500 Received: from mga06.intel.com ([134.134.136.31]:62707 "EHLO mga06.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750908AbeCIAbp (ORCPT ); Thu, 8 Mar 2018 19:31:45 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 08 Mar 2018 16:31:45 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.47,443,1515484800"; d="scan'208";a="22893579" Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by fmsmga007.fm.intel.com with ESMTP; 08 Mar 2018 16:31:45 -0800 Received: from fmsmsx101.amr.corp.intel.com (10.18.124.199) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.319.2; Thu, 8 Mar 2018 16:31:45 -0800 Received: from FMSMSX109.amr.corp.intel.com ([169.254.15.144]) by fmsmsx101.amr.corp.intel.com ([169.254.1.97]) with mapi id 14.03.0319.002; Thu, 8 Mar 2018 16:31:44 -0800 From: "Dilger, Andreas" To: NeilBrown CC: "Drokin, Oleg" , Greg Kroah-Hartman , James Simmons , "Linux Kernel Mailing List" , Lustre Development List Subject: Re: [PATCH 15/17] staging: lustre: ptlrpc: move thread creation out of module initialization Thread-Topic: [PATCH 15/17] staging: lustre: ptlrpc: move thread creation out of module initialization Thread-Index: AQHTsbXRpQsEtwqfkUmpeNeMs23euKPHnrAA Date: Fri, 9 Mar 2018 00:31:44 +0000 Message-ID: References: <151994679573.7628.1024109499321778846.stgit@noble> <151994708557.7628.14705551472003114360.stgit@noble> In-Reply-To: <151994708557.7628.14705551472003114360.stgit@noble> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.254.37.249] Content-Type: text/plain; charset="us-ascii" Content-ID: <1A2FD8D57796E94289FD9CECA433E848@intel.com> Content-Transfer-Encoding: 8BIT MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mar 1, 2018, at 16:31, NeilBrown wrote: > > When the ptlrpc module is loaded, it starts the pinger thread and > calls LNetNIInit which starts various threads. > > We don't need these threads until the module is actually being > used, such as when a lustre filesystem is mounted. > > So move the thread creation into new ptlrpc_inc_ref() (modeled on > ptlrpcd_inc_ref()), and call that when needed, such as at mount time. It looks like this is still done early enough in the mount sequence, so the earlier "[06/17] get entropy from nid when nid set" action is still done before the client UUID is generated in ll_init_sbi(). Reviewed-by: Andreas Dilger > Signed-off-by: NeilBrown > --- > drivers/staging/lustre/lustre/include/lustre_net.h | 3 + > drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c | 12 ++++ > drivers/staging/lustre/lustre/llite/llite_lib.c | 18 +++++- > .../staging/lustre/lustre/ptlrpc/ptlrpc_module.c | 56 +++++++++++++------- > 4 files changed, 65 insertions(+), 24 deletions(-) > > diff --git a/drivers/staging/lustre/lustre/include/lustre_net.h b/drivers/staging/lustre/lustre/include/lustre_net.h > index 108683c54127..d35ae0cda8d2 100644 > --- a/drivers/staging/lustre/lustre/include/lustre_net.h > +++ b/drivers/staging/lustre/lustre/include/lustre_net.h > @@ -1804,6 +1804,9 @@ int ptlrpc_register_rqbd(struct ptlrpc_request_buffer_desc *rqbd); > */ > void ptlrpc_request_committed(struct ptlrpc_request *req, int force); > > +int ptlrpc_inc_ref(void); > +void ptlrpc_dec_ref(void); > + > void ptlrpc_init_client(int req_portal, int rep_portal, char *name, > struct ptlrpc_client *); > struct ptlrpc_connection *ptlrpc_uuid_to_connection(struct obd_uuid *uuid); > diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c b/drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c > index 58913e628124..c772c68e5a49 100644 > --- a/drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c > +++ b/drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c > @@ -869,6 +869,10 @@ int ldlm_get_ref(void) > { > int rc = 0; > > + rc = ptlrpc_inc_ref(); > + if (rc) > + return rc; > + > mutex_lock(&ldlm_ref_mutex); > if (++ldlm_refcount == 1) { > rc = ldlm_setup(); > @@ -877,14 +881,18 @@ int ldlm_get_ref(void) > } > mutex_unlock(&ldlm_ref_mutex); > > + if (rc) > + ptlrpc_dec_ref(); > + > return rc; > } > > void ldlm_put_ref(void) > { > + int rc = 0; > mutex_lock(&ldlm_ref_mutex); > if (ldlm_refcount == 1) { > - int rc = ldlm_cleanup(); > + rc = ldlm_cleanup(); > > if (rc) > CERROR("ldlm_cleanup failed: %d\n", rc); > @@ -894,6 +902,8 @@ void ldlm_put_ref(void) > ldlm_refcount--; > } > mutex_unlock(&ldlm_ref_mutex); > + if (!rc) > + ptlrpc_dec_ref(); > } > > static ssize_t cancel_unused_locks_before_replay_show(struct kobject *kobj, > diff --git a/drivers/staging/lustre/lustre/llite/llite_lib.c b/drivers/staging/lustre/lustre/llite/llite_lib.c > index 844182ad7dd7..706b14bf8981 100644 > --- a/drivers/staging/lustre/lustre/llite/llite_lib.c > +++ b/drivers/staging/lustre/lustre/llite/llite_lib.c > @@ -879,9 +879,15 @@ int ll_fill_super(struct super_block *sb) > > CDEBUG(D_VFSTRACE, "VFS Op: sb %p\n", sb); > > + err = ptlrpc_inc_ref(); > + if (err) > + return err; > + > cfg = kzalloc(sizeof(*cfg), GFP_NOFS); > - if (!cfg) > - return -ENOMEM; > + if (!cfg) { > + err = -ENOMEM; > + goto out_put; > + } > > try_module_get(THIS_MODULE); > > @@ -891,7 +897,8 @@ int ll_fill_super(struct super_block *sb) > if (!sbi) { > module_put(THIS_MODULE); > kfree(cfg); > - return -ENOMEM; > + err = -ENOMEM; > + goto out_put; > } > > err = ll_options(lsi->lsi_lmd->lmd_opts, &sbi->ll_flags); > @@ -958,6 +965,9 @@ int ll_fill_super(struct super_block *sb) > LCONSOLE_WARN("Mounted %s\n", profilenm); > > kfree(cfg); > +out_put: > + if (err) > + ptlrpc_dec_ref(); > return err; > } /* ll_fill_super */ > > @@ -1028,6 +1038,8 @@ void ll_put_super(struct super_block *sb) > cl_env_cache_purge(~0); > > module_put(THIS_MODULE); > + > + ptlrpc_dec_ref(); > } /* client_put_super */ > > struct inode *ll_inode_from_resource_lock(struct ldlm_lock *lock) > diff --git a/drivers/staging/lustre/lustre/ptlrpc/ptlrpc_module.c b/drivers/staging/lustre/lustre/ptlrpc/ptlrpc_module.c > index 131fc6d9646e..38923418669f 100644 > --- a/drivers/staging/lustre/lustre/ptlrpc/ptlrpc_module.c > +++ b/drivers/staging/lustre/lustre/ptlrpc/ptlrpc_module.c > @@ -45,6 +45,42 @@ extern spinlock_t ptlrpc_last_xid_lock; > extern spinlock_t ptlrpc_rs_debug_lock; > #endif > > +DEFINE_MUTEX(ptlrpc_startup); > +static int ptlrpc_active = 0; > + > +int ptlrpc_inc_ref(void) > +{ > + int rc = 0; > + > + mutex_lock(&ptlrpc_startup); > + if (ptlrpc_active++ == 0) { > + ptlrpc_put_connection_superhack = ptlrpc_connection_put; > + > + rc = ptlrpc_init_portals(); > + if (!rc) { > + rc= ptlrpc_start_pinger(); > + if (rc) > + ptlrpc_exit_portals(); > + } > + if (rc) > + ptlrpc_active--; > + } > + mutex_unlock(&ptlrpc_startup); > + return rc; > +} > +EXPORT_SYMBOL(ptlrpc_inc_ref); > + > +void ptlrpc_dec_ref(void) > +{ > + mutex_lock(&ptlrpc_startup); > + if (--ptlrpc_active == 0) { > + ptlrpc_stop_pinger(); > + ptlrpc_exit_portals(); > + } > + mutex_unlock(&ptlrpc_startup); > +} > +EXPORT_SYMBOL(ptlrpc_dec_ref); > + > static int __init ptlrpc_init(void) > { > int rc, cleanup_phase = 0; > @@ -71,24 +107,12 @@ static int __init ptlrpc_init(void) > if (rc) > goto cleanup; > > - cleanup_phase = 2; > - rc = ptlrpc_init_portals(); > - if (rc) > - goto cleanup; > - > cleanup_phase = 3; > > rc = ptlrpc_connection_init(); > if (rc) > goto cleanup; > > - cleanup_phase = 4; > - ptlrpc_put_connection_superhack = ptlrpc_connection_put; > - > - rc = ptlrpc_start_pinger(); > - if (rc) > - goto cleanup; > - > cleanup_phase = 5; > rc = ldlm_init(); > if (rc) > @@ -122,15 +146,9 @@ static int __init ptlrpc_init(void) > ldlm_exit(); > /* Fall through */ > case 5: > - ptlrpc_stop_pinger(); > - /* Fall through */ > - case 4: > ptlrpc_connection_fini(); > /* Fall through */ > case 3: > - ptlrpc_exit_portals(); > - /* Fall through */ > - case 2: > ptlrpc_request_cache_fini(); > /* Fall through */ > case 1: > @@ -150,8 +168,6 @@ static void __exit ptlrpc_exit(void) > ptlrpc_nrs_fini(); > sptlrpc_fini(); > ldlm_exit(); > - ptlrpc_stop_pinger(); > - ptlrpc_exit_portals(); > ptlrpc_request_cache_fini(); > ptlrpc_hr_fini(); > ptlrpc_connection_fini(); > > Cheers, Andreas -- Andreas Dilger Lustre Principal Architect Intel Corporation