From: Kinglong Mee <kinglongmee@gmail.com>
To: Jeff Layton <jlayton@poochiereds.net>
Cc: bfields@fieldses.org, linux-nfs@vger.kernel.org, kinglongmee@gmail.com
Subject: Re: [PATCH v2 04/18] nfsd: add a new struct file caching facility to nfsd
Date: Mon, 10 Aug 2015 19:36:25 +0800 [thread overview]
Message-ID: <55C88CB9.2050306@gmail.com> (raw)
In-Reply-To: <20150808063624.24b6fcc3@tlielax.poochiereds.net>
On 8/8/2015 18:36, Jeff Layton wrote:
> On Sat, 8 Aug 2015 08:14:14 +0800
> Kinglong Mee <kinglongmee@gmail.com> wrote:
>
>> On 8/8/2015 01:18, Jeff Layton wrote:
>>> On Fri, 7 Aug 2015 23:28:41 +0800
>>> Kinglong Mee <kinglongmee@gmail.com> wrote:
>>>
>>>> On 8/6/2015 05:13, Jeff Layton wrote:
>>>>> Currently, NFSv2/3 reads and writes have to open a file, do the read or
>>>>> write and then close it again for each RPC. This is highly inefficient,
>>>>> especially when the underlying filesystem has a relatively slow open
>>>>> routine.
>>>>>
>>>>> This patch adds a new open file cache to knfsd. Rather than doing an
>>>>> open for each RPC, the read/write handlers can call into this cache to
>>>>> see if there is one already there for the correct filehandle and
>>>>> NFS_MAY_READ/WRITE flags.
>>>>>
>>>>> If there isn't an entry, then we create a new one and attempt to
>>>>> perform the open. If there is, then we wait until the entry is fully
>>>>> instantiated and return it if it is at the end of the wait. If it's
>>>>> not, then we attempt to take over construction.
>>>>>
>>>>> Since the main goal is to speed up NFSv2/3 I/O, we don't want to
>>>>> close these files on last put of these objects. We need to keep them
>>>>> around for a little while since we never know when the next READ/WRITE
>>>>> will come in.
>>>>>
>>>>> Cache entries have a hardcoded 1s timeout, and we have a recurring
>>>>> workqueue job that walks the cache and purges any entries that have
>>>>> expired.
>>>>>
>>>>> Signed-off-by: Jeff Layton <jeff.layton@primarydata.com>
>>>> ... snip ...
>>>>> diff --git a/fs/nfsd/filecache.h b/fs/nfsd/filecache.h
>>>>> index 9051ee54faa3..adf7e78b8e43 100644
>>>>> --- a/fs/nfsd/filecache.h
>>>>> +++ b/fs/nfsd/filecache.h
>>>>> @@ -4,6 +4,7 @@
>>>>> #include <linux/jhash.h>
>>>>> #include <linux/sunrpc/xdr.h>
>>>>>
>>>>> +#include "nfsfh.h"
>>>>> #include "export.h"
>>>>>
>>>>> /* hash table for nfs4_file */
>>>>> @@ -22,4 +23,24 @@ file_hashval(struct knfsd_fh *fh)
>>>>> return nfsd_fh_hashval(fh) & (NFSD_FILE_HASH_SIZE - 1);
>>>>> }
>>>>>
>>>>> +struct nfsd_file {
>>>>
>>>> There is a nfs4_file in nfsd, it's not easy to distinguish them for a new folk.
>>>> More comments or a meaningful name is better.
>>>>
>>>
>>> Maybe. Again, any suggestions? My hope was that eventually we can unify
>>> the two caches somehow but maybe that's naive.
>>
>> I cannot find a better name for the new file cache. More comments.
>>
>> I don't agree with merging those two into one cache.
>>
>> nfsv4's file cache is a state resource of client which will exist since close
>> or lease expire. But nfsd_file cache is a temporary resource for nfsv2/v3 client
>> without state.
>>
>
> You're probably right here. It was idle thought from when I first
> started this work. What we probably would want to do however is to
> layer the nfs4_file cache on top of this cache instead of having it
> manage filps on its own.
>
> I tried to design this cache so that it can handle O_RDWR opens, even
> though the current callers don't actually ever request those. It should
> be possible to hook up the nfs4_file cache to it, though I'd prefer to
> wait until we have this code in place first and then do that later.
>
>> Also, for nfsv4's conflict checking, should we check the temporary file cache
>> for nfsv2/v3 too?
>>
>
> You mean for share/deny modes? We traditionally have not done that, and
> I don't see a compelling reason to start now. That would be a separate
> project in its own right, IMO. We'd need to lift the share/deny mode
> handling into this new cache.
OK.
I will look forward to the new project.
>
> There's also the problem of there not being any protocol support for
> that in NFSv2/3. What would we return to the client if there's a deny
> mode conflict when it's trying to do (e.g.) a READ?
>
It's my worry too.
Without this cache, this case only influence an NFSv2/3 RPC process time,
but, with this cache, it's more than 1s at worst.
>
>>>
>>>>> + struct hlist_node nf_node;
>>>>> + struct list_head nf_dispose;
>>>>> + struct rcu_head nf_rcu;
>>>>> + struct file *nf_file;
>>>>> + unsigned long nf_time;
>>>>> +#define NFSD_FILE_HASHED (0)
>>>>
>>>> Why not using hlist_unhashed()?
>>>>
>>>
>>> These entries are removed from the list using hlist_del_rcu(), and
>>> hlist_unhashed will not return true after that.
>>
>> As I understand, NFSD_FILE_HASHED means the file cache is added to
>> nfsd_file_hashtbl, and increased the global file count.
>>
>> With calling hlist_del_rcu, file cache has be deleted from the hashtbl,
>> and clear the NFSD_FILE_HASHED bit.
>>
>
> That's correct.
>
>> As using in the codes, the bit and hlist_unhashed have the same meaning.
>> Any mistake of my understand?
>>
>
> hlist_unhashed() won't work here:
>
> static inline int hlist_unhashed(const struct hlist_node *h)
> {
> return !h->pprev;
> }
>
> ...but:
>
> static inline void hlist_del_rcu(struct hlist_node *n)
> {
> __hlist_del(n);
> n->pprev = LIST_POISON2;
> }
Got it.
You are right.
thanks,
Kinglong Mee
next prev parent reply other threads:[~2015-08-10 11:36 UTC|newest]
Thread overview: 69+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-30 13:52 [PATCH 0/9] nfsd: open file caching for v2/3 Jeff Layton
2015-07-30 13:52 ` [PATCH] nfsd: do nfs4_check_fh in nfs4_check_file instead of nfs4_check_olstateid Jeff Layton
2015-07-30 13:53 ` Jeff Layton
2015-07-30 15:51 ` Christoph Hellwig
2015-07-30 16:20 ` Jeff Layton
2015-07-30 16:34 ` Christoph Hellwig
2015-07-30 13:52 ` [PATCH 1/9] nfsd: include linux/nfs4.h in export.h Jeff Layton
2015-07-30 13:52 ` [PATCH 2/9] nfsd: move some file caching helpers to a common header Jeff Layton
2015-07-30 13:52 ` [PATCH 3/9] nfsd: convert laundry_wq to something less nfsd4 specific Jeff Layton
2015-07-31 21:32 ` J. Bruce Fields
2015-07-31 22:27 ` Jeff Layton
2015-07-30 13:52 ` [PATCH 4/9] nfsd: add a new struct file caching facility to nfsd Jeff Layton
2015-07-30 13:52 ` [PATCH 5/9] nfsd: hook up nfsd_write to the new nfsd_file cache Jeff Layton
2015-07-30 13:52 ` [PATCH 6/9] nfsd: hook up nfsd_read to the " Jeff Layton
2015-07-30 13:52 ` [PATCH 7/9] sunrpc: add a new cache_detail operation for when a cache is flushed Jeff Layton
2015-07-30 13:52 ` [PATCH 8/9] nfsd: add a ->flush routine to svc_export_cache Jeff Layton
2015-07-30 13:52 ` [PATCH 9/9] nfsd: allow the file cache expire time to be tunable Jeff Layton
2015-08-05 21:13 ` [PATCH v2 00/18] nfsd: open file caching for v2/3 Jeff Layton
2015-08-05 21:13 ` [PATCH v2 01/18] nfsd: include linux/nfs4.h in export.h Jeff Layton
2015-08-09 7:12 ` Christoph Hellwig
2015-08-05 21:13 ` [PATCH v2 02/18] nfsd: move some file caching helpers to a common header Jeff Layton
2015-08-07 15:25 ` Kinglong Mee
2015-08-07 17:07 ` Jeff Layton
2015-08-09 7:12 ` Christoph Hellwig
2015-08-05 21:13 ` [PATCH v2 03/18] nfsd: convert laundry_wq to something less nfsd4 specific Jeff Layton
2015-08-07 15:26 ` Kinglong Mee
2015-08-07 17:12 ` Jeff Layton
2015-08-09 7:14 ` Christoph Hellwig
2015-08-09 11:11 ` Jeff Layton
2015-08-10 8:26 ` Christoph Hellwig
2015-08-10 11:23 ` Jeff Layton
2015-08-10 12:10 ` Christoph Hellwig
2015-08-10 12:14 ` Jeff Layton
2015-08-10 14:33 ` J. Bruce Fields
2015-08-05 21:13 ` [PATCH v2 04/18] nfsd: add a new struct file caching facility to nfsd Jeff Layton
2015-08-07 15:28 ` Kinglong Mee
2015-08-07 17:18 ` Jeff Layton
2015-08-08 0:14 ` Kinglong Mee
2015-08-08 10:36 ` Jeff Layton
2015-08-10 11:36 ` Kinglong Mee [this message]
2015-08-09 7:17 ` Christoph Hellwig
2015-08-09 11:19 ` Jeff Layton
2015-08-10 8:28 ` Christoph Hellwig
2015-08-10 11:31 ` Jeff Layton
2015-08-05 21:13 ` [PATCH v2 05/18] nfsd: hook up nfsd_write to the new nfsd_file cache Jeff Layton
2015-08-05 21:13 ` [PATCH v2 06/18] nfsd: hook up nfsd_read to the " Jeff Layton
2015-08-07 15:29 ` Kinglong Mee
2015-08-07 17:26 ` Jeff Layton
2015-08-08 0:19 ` Kinglong Mee
2015-08-05 21:13 ` [PATCH v2 07/18] sunrpc: add a new cache_detail operation for when a cache is flushed Jeff Layton
2015-08-05 21:13 ` [PATCH v2 08/18] nfsd: add a ->flush routine to svc_export_cache Jeff Layton
2015-08-05 21:13 ` [PATCH v2 09/18] nfsd: allow the file cache expire time to be tunable Jeff Layton
2015-08-05 21:13 ` [PATCH v2 10/18] nfsd: handle NFSD_MAY_NOT_BREAK_LEASE in open file cache Jeff Layton
2015-08-05 21:13 ` [PATCH v2 11/18] nfsd: hook nfsd_commit up to the nfsd_file cache Jeff Layton
2015-08-05 21:13 ` [PATCH v2 12/18] nfsd: move include of state.h from trace.c to trace.h Jeff Layton
2015-08-09 7:18 ` Christoph Hellwig
2015-08-05 21:13 ` [PATCH v2 13/18] nfsd: add new tracepoints for nfsd_file cache Jeff Layton
2015-08-05 21:13 ` [PATCH v2 14/18] nfsd: have _fh_update take a knfsd_fh instead of a svc_fh Jeff Layton
2015-08-09 7:21 ` Christoph Hellwig
2015-08-05 21:13 ` [PATCH v2 15/18] nfsd: have set_version_and_fsid_type take a knfsd_fh instead of svc_fh Jeff Layton
2015-08-09 7:21 ` Christoph Hellwig
2015-08-05 21:13 ` [PATCH v2 16/18] nfsd: add a fh_compose_shallow Jeff Layton
2015-08-07 15:33 ` Kinglong Mee
2015-08-07 17:56 ` Jeff Layton
2015-08-07 18:24 ` Jeff Layton
2015-08-08 0:27 ` Kinglong Mee
2015-08-08 10:38 ` Jeff Layton
2015-08-05 21:13 ` [PATCH v2 17/18] nfsd: close cached files prior to a REMOVE or RENAME that would replace target Jeff Layton
2015-08-05 21:13 ` [PATCH v2 18/18] nfsd: call flush_delayed_fput from nfsd_file_close_fh Jeff Layton
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=55C88CB9.2050306@gmail.com \
--to=kinglongmee@gmail.com \
--cc=bfields@fieldses.org \
--cc=jlayton@poochiereds.net \
--cc=linux-nfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.