From mboxrd@z Thu Jan 1 00:00:00 1970 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 44D72C433F5 for ; Tue, 29 Mar 2022 15:47:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237587AbiC2Pte (ORCPT ); Tue, 29 Mar 2022 11:49:34 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51018 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233532AbiC2Ptd (ORCPT ); Tue, 29 Mar 2022 11:49:33 -0400 Received: from fieldses.org (fieldses.org [IPv6:2600:3c00:e000:2f7::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7F43649F3A; Tue, 29 Mar 2022 08:47:50 -0700 (PDT) Received: by fieldses.org (Postfix, from userid 2815) id 1EEAD70B7; Tue, 29 Mar 2022 11:47:50 -0400 (EDT) DKIM-Filter: OpenDKIM Filter v2.11.0 fieldses.org 1EEAD70B7 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fieldses.org; s=default; t=1648568870; bh=S54UHWYDtTPUCac+MX2l13i8R6McH19QX5jarb4AyjA=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=ltpPEmjz2ReUg1EpA2qROHzB9gFKl23WTBdYmmmDayenwutVQxdxD4JvMEwUz8QU9 DFEMln7nRGeTAkpsu4ukYDWNDRna8+iMWBklrggsfpEzVjdu3KgRdb00u1Rm94IfBf VZSXsHGZMqjc/TsotQ8TB3l2XbNpVvILHNC4lOjA= Date: Tue, 29 Mar 2022 11:47:50 -0400 From: "J. Bruce Fields" To: Dai Ngo Cc: chuck.lever@oracle.com, jlayton@redhat.com, viro@zeniv.linux.org.uk, linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: Re: [PATCH RFC v18 02/11] NFSD: Add courtesy client state, macro and spinlock to support courteous server Message-ID: <20220329154750.GE29634@fieldses.org> References: <1648182891-32599-1-git-send-email-dai.ngo@oracle.com> <1648182891-32599-3-git-send-email-dai.ngo@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1648182891-32599-3-git-send-email-dai.ngo@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org On Thu, Mar 24, 2022 at 09:34:42PM -0700, Dai Ngo wrote: > Update nfs4_client to add: > . cl_cs_client_state: courtesy client state > . cl_cs_lock: spinlock to synchronize access to cl_cs_client_state > . cl_cs_list: list used by laundromat to process courtesy clients > > Modify alloc_client to initialize these fields. > > Signed-off-by: Dai Ngo > --- > fs/nfsd/nfs4state.c | 2 ++ > fs/nfsd/nfsd.h | 1 + > fs/nfsd/state.h | 33 +++++++++++++++++++++++++++++++++ > 3 files changed, 36 insertions(+) > > diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c > index 234e852fcdfa..a65d59510681 100644 > --- a/fs/nfsd/nfs4state.c > +++ b/fs/nfsd/nfs4state.c > @@ -2009,12 +2009,14 @@ static struct nfs4_client *alloc_client(struct xdr_netobj name) > INIT_LIST_HEAD(&clp->cl_delegations); > INIT_LIST_HEAD(&clp->cl_lru); > INIT_LIST_HEAD(&clp->cl_revoked); > + INIT_LIST_HEAD(&clp->cl_cs_list); > #ifdef CONFIG_NFSD_PNFS > INIT_LIST_HEAD(&clp->cl_lo_states); > #endif > INIT_LIST_HEAD(&clp->async_copies); > spin_lock_init(&clp->async_lock); > spin_lock_init(&clp->cl_lock); > + spin_lock_init(&clp->cl_cs_lock); > rpc_init_wait_queue(&clp->cl_cb_waitq, "Backchannel slot table"); > return clp; > err_no_hashtbl: > diff --git a/fs/nfsd/nfsd.h b/fs/nfsd/nfsd.h > index 4fc1fd639527..23996c6ca75e 100644 > --- a/fs/nfsd/nfsd.h > +++ b/fs/nfsd/nfsd.h > @@ -336,6 +336,7 @@ void nfsd_lockd_shutdown(void); > #define COMPOUND_ERR_SLACK_SPACE 16 /* OP_SETATTR */ > > #define NFSD_LAUNDROMAT_MINTIMEOUT 1 /* seconds */ > +#define NFSD_COURTESY_CLIENT_TIMEOUT (24 * 60 * 60) /* seconds */ > > /* > * The following attributes are currently not supported by the NFSv4 server: > diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h > index 95457cfd37fc..40e390abc842 100644 > --- a/fs/nfsd/state.h > +++ b/fs/nfsd/state.h > @@ -283,6 +283,35 @@ struct nfsd4_sessionid { > #define HEXDIR_LEN 33 /* hex version of 16 byte md5 of cl_name plus '\0' */ > > /* > + * CLIENT_ CLIENT_ CLIENT_ > + * COURTESY EXPIRED RECONNECTED Meaning Where set > + * ----------------------------------------------------------------------------- > + * | false | false | false | Confirmed, active | Default | > + * |---------------------------------------------------------------------------| > + * | true | false | false | Courtesy state. | nfs4_get_client_reaplist | > + * | | | | Lease/lock/share | | > + * | | | | reservation conflict | | > + * | | | | can cause Courtesy | | > + * | | | | client to be expired | | > + * |---------------------------------------------------------------------------| > + * | false | true | false | Courtesy client to be| nfs4_laundromat | > + * | | | | expired by Laundromat| nfsd4_lm_lock_expired | > + * | | | | due to conflict | nfsd4_discard_courtesy_clnt | > + * | | | | | nfsd4_expire_courtesy_clnt | > + * |---------------------------------------------------------------------------| > + * | false | false | true | Courtesy client | nfsd4_courtesy_clnt_expired| > + * | | | | reconnected, | | > + * | | | | becoming active | | > + * ----------------------------------------------------------------------------- These are mutually exclusive values, not bits that may set to 0 or 1, so the three boolean columns are confusing. I'd just structure the table like: client state meaning where set 0 Confirmed, active Default CLIENT_COURTESY Courtesy state.... nfs4_get_client_reaplist CLIENT_EXPIRED Courtesy client to be.. nfs4_laundromat etc. --b. > + */ > + > +enum courtesy_client_state { > + NFSD4_CLIENT_COURTESY = 1, > + NFSD4_CLIENT_EXPIRED, > + NFSD4_CLIENT_RECONNECTED, > +}; > + > +/* > * struct nfs4_client - one per client. Clientids live here. > * > * The initial object created by an NFS client using SETCLIENTID (for NFSv4.0) > @@ -385,6 +414,10 @@ struct nfs4_client { > struct list_head async_copies; /* list of async copies */ > spinlock_t async_lock; /* lock for async copies */ > atomic_t cl_cb_inflight; /* Outstanding callbacks */ > + > + enum courtesy_client_state cl_cs_client_state; > + spinlock_t cl_cs_lock; > + struct list_head cl_cs_list; > }; > > /* struct nfs4_client_reset > -- > 2.9.5