The NFS server should ask clients to voluntarily return unused
delegations when the number of granted delegations reaches the
max_delegations. This is so that the server can continue to
grant delegations for new requests.
Signed-off-by: Dai Ngo <[email protected]>
---
fs/nfsd/nfs4state.c | 3 +++
1 file changed, 3 insertions(+)
v2: move declaration of deleg_reaper() up to other forward
declarations in the file.
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index fdc95bfbfbb6..961000261b3e 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -87,6 +87,7 @@ static void nfs4_free_ol_stateid(struct nfs4_stid *stid);
void nfsd4_end_grace(struct nfsd_net *nn);
static void _free_cpntf_state_locked(struct nfsd_net *nn, struct nfs4_cpntf_state *cps);
static void nfsd4_file_hash_remove(struct nfs4_file *fi);
+static void deleg_reaper(struct nfsd_net *nn);
/* Locking: */
@@ -6550,6 +6551,8 @@ nfs4_laundromat(struct nfsd_net *nn)
/* service the server-to-server copy delayed unmount list */
nfsd4_ssc_expire_umount(nn);
#endif
+ if (atomic_long_read(&num_delegations) >= max_delegations)
+ deleg_reaper(nn);
out:
return max_t(time64_t, lt.new_timeo, NFSD_LAUNDROMAT_MINTIMEOUT);
}
--
2.39.3
> -----?ʼ?ԭ??-----
> ??????: Dai Ngo <[email protected]>
> ????ʱ??: 2024??3??4?? 6:23
> ?ռ???: [email protected]; [email protected]
> ????: [email protected]
> ????: [PATCH v2 1/1] NFSD: send OP_CB_RECALL_ANY to clients when number
> of delegations reaches its limit
>
> The NFS server should ask clients to voluntarily return unused
> delegations when the number of granted delegations reaches the
> max_delegations. This is so that the server can continue to
> grant delegations for new requests.
>
> Signed-off-by: Dai Ngo <[email protected]>
> ---
>
Tested-by: Chen Hanxiao <[email protected]>
Regards,
- Chen
On Sun, 2024-03-03 at 14:23 -0800, Dai Ngo wrote:
> The NFS server should ask clients to voluntarily return unused
> delegations when the number of granted delegations reaches the
> max_delegations. This is so that the server can continue to
> grant delegations for new requests.
>
> Signed-off-by: Dai Ngo <[email protected]>
> ---
> fs/nfsd/nfs4state.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> v2: move declaration of deleg_reaper() up to other forward
> declarations in the file.
>
> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
> index fdc95bfbfbb6..961000261b3e 100644
> --- a/fs/nfsd/nfs4state.c
> +++ b/fs/nfsd/nfs4state.c
> @@ -87,6 +87,7 @@ static void nfs4_free_ol_stateid(struct nfs4_stid *stid);
> void nfsd4_end_grace(struct nfsd_net *nn);
> static void _free_cpntf_state_locked(struct nfsd_net *nn, struct nfs4_cpntf_state *cps);
> static void nfsd4_file_hash_remove(struct nfs4_file *fi);
> +static void deleg_reaper(struct nfsd_net *nn);
>
> /* Locking: */
>
> @@ -6550,6 +6551,8 @@ nfs4_laundromat(struct nfsd_net *nn)
> /* service the server-to-server copy delayed unmount list */
> nfsd4_ssc_expire_umount(nn);
> #endif
> + if (atomic_long_read(&num_delegations) >= max_delegations)
> + deleg_reaper(nn);
> out:
> return max_t(time64_t, lt.new_timeo, NFSD_LAUNDROMAT_MINTIMEOUT);
> }
Seems like a reasonable thing to do:
Reviewed-by: Jeff Layton <[email protected]>
On Sun, Mar 03, 2024 at 05:23:02PM -0500, Dai Ngo wrote:
> The NFS server should ask clients to voluntarily return unused
> delegations when the number of granted delegations reaches the
> max_delegations. This is so that the server can continue to
> grant delegations for new requests.
>
> Signed-off-by: Dai Ngo <[email protected]>
> ---
> fs/nfsd/nfs4state.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> v2: move declaration of deleg_reaper() up to other forward
> declarations in the file.
>
> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
> index fdc95bfbfbb6..961000261b3e 100644
> --- a/fs/nfsd/nfs4state.c
> +++ b/fs/nfsd/nfs4state.c
> @@ -87,6 +87,7 @@ static void nfs4_free_ol_stateid(struct nfs4_stid *stid);
> void nfsd4_end_grace(struct nfsd_net *nn);
> static void _free_cpntf_state_locked(struct nfsd_net *nn, struct nfs4_cpntf_state *cps);
> static void nfsd4_file_hash_remove(struct nfs4_file *fi);
> +static void deleg_reaper(struct nfsd_net *nn);
>
> /* Locking: */
>
> @@ -6550,6 +6551,8 @@ nfs4_laundromat(struct nfsd_net *nn)
> /* service the server-to-server copy delayed unmount list */
> nfsd4_ssc_expire_umount(nn);
> #endif
> + if (atomic_long_read(&num_delegations) >= max_delegations)
> + deleg_reaper(nn);
> out:
> return max_t(time64_t, lt.new_timeo, NFSD_LAUNDROMAT_MINTIMEOUT);
> }
> --
> 2.39.3
>
Applied to nfsd-next. Thanks, Dai!
--
Chuck Lever
On Sun, 3 Mar 2024 at 23:23, Dai Ngo <[email protected]> wrote:
>
> The NFS server should ask clients to voluntarily return unused
> delegations when the number of granted delegations reaches the
> max_delegations. This is so that the server can continue to
> grant delegations for new requests.
What is this limit max_delegations? Where is it set, and where can an
admin alter it at runtime?
Are you aware that for example the msnfs41client Windows NFSv4.1
driver easily uses a few hundred delegations, as required by the
highly multithreaded nature (i.e. every Win32 syscall is async) of the
Windows kernel?
Ced
--
Cedric Blancher <[email protected]>
[https://plus.google.com/u/0/+CedricBlancher/]
Institute Pasteur
On 3/5/24 12:49 AM, Cedric Blancher wrote:
> On Sun, 3 Mar 2024 at 23:23, Dai Ngo <[email protected]> wrote:
>> The NFS server should ask clients to voluntarily return unused
>> delegations when the number of granted delegations reaches the
>> max_delegations. This is so that the server can continue to
>> grant delegations for new requests.
> What is this limit max_delegations?
4 delegations per megabyte of available RAM.
> Where is it set,
when nfsd starts up.
> and where can an
> admin alter it at runtime?
There is no admin tool to change this setting. But if you want to
play with it then you can poke the memory and change its value,
The code uses max_delegations dynamically.
-Dai
>
> Are you aware that for example the msnfs41client Windows NFSv4.1
> driver easily uses a few hundred delegations, as required by the
> highly multithreaded nature (i.e. every Win32 syscall is async) of the
> Windows kernel?
>
> Ced