Linux-NFS Archive on lore.kernel.org
 help / color / Atom feed
From: "Benjamin Coddington" <bcodding@redhat.com>
To: trondmy@kernel.org
Cc: linux-nfs@vger.kernel.org
Subject: Re: [PATCH 02/12] NFS: Clean up readdir struct nfs_cache_array
Date: Tue, 03 Nov 2020 09:09:14 -0500
Message-ID: <ACB62869-286C-4189-9BF9-C4F622C02C73@redhat.com> (raw)
In-Reply-To: <015FB69A-1E45-4A93-89F3-2755F2A565F0@redhat.com>

On 3 Nov 2020, at 8:35, Benjamin Coddington wrote:

> On 2 Nov 2020, at 13:06, trondmy@kernel.org wrote:
>
>> From: Trond Myklebust <trond.myklebust@hammerspace.com>
>>
>> Since the 'eof_index' is only ever used as a flag, make it so.
>> Also add a flag to detect if the page has been completely filled.
>>
>> Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
>> ---
>>  fs/nfs/dir.c | 66 
>> ++++++++++++++++++++++++++++++++++++++--------------
>>  1 file changed, 49 insertions(+), 17 deletions(-)
>>
>> diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
>> index 67d8595cd6e5..604ebe015387 100644
>> --- a/fs/nfs/dir.c
>> +++ b/fs/nfs/dir.c
>> @@ -138,9 +138,10 @@ struct nfs_cache_array_entry {
>>  };
>>
>>  struct nfs_cache_array {
>> -	int size;
>> -	int eof_index;
>>  	u64 last_cookie;
>> +	unsigned int size;
>> +	unsigned char page_full : 1,
>> +		      page_is_eof : 1;
>>  	struct nfs_cache_array_entry array[];
>>  };
>>
>> @@ -172,7 +173,6 @@ void nfs_readdir_init_array(struct page *page)
>>
>>  	array = kmap_atomic(page);
>>  	memset(array, 0, sizeof(struct nfs_cache_array));
>> -	array->eof_index = -1;
>>  	kunmap_atomic(array);
>>  }
>>
>> @@ -192,6 +192,17 @@ void nfs_readdir_clear_array(struct page *page)
>>  	kunmap_atomic(array);
>>  }
>>
>> +static void nfs_readdir_array_set_eof(struct nfs_cache_array *array)
>> +{
>> +	array->page_is_eof = 1;
>> +	array->page_full = 1;
>> +}
>> +
>> +static bool nfs_readdir_array_is_full(struct nfs_cache_array *array)
>> +{
>> +	return array->page_full;
>> +}
>> +
>>  /*
>>   * the caller is responsible for freeing qstr.name
>>   * when called by nfs_readdir_add_to_array, the strings will be 
>> freed in
>> @@ -213,6 +224,23 @@ int nfs_readdir_make_qstr(struct qstr *string, 
>> const char *name, unsigned int le
>>  	return 0;
>>  }
>>
>> +/*
>> + * Check that the next array entry lies entirely within the page 
>> bounds
>> + */
>> +static int nfs_readdir_array_can_expand(struct nfs_cache_array 
>> *array)
>> +{
>> +	struct nfs_cache_array_entry *cache_entry;
>> +
>> +	if (array->page_full)
>> +		return -ENOSPC;
>> +	cache_entry = &array->array[array->size + 1];
>> +	if ((char *)cache_entry - (char *)array > PAGE_SIZE) {
>> +		array->page_full = 1;
>> +		return -ENOSPC;
>> +	}
>> +	return 0;
>> +}
>> +
>
> I think we could do this calculation at compile-time instead of doing 
> it for
> each entry, for dubious nominal gains..

and doing so might allow us to detect the case where the array is full
before doing another RPC that we'll discard.

Ben


  reply index

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-02 18:06 [PATCH 00/12] Readdir enhancements trondmy
2020-11-02 18:06 ` [PATCH 01/12] NFS: Ensure contents of struct nfs_open_dir_context are consistent trondmy
2020-11-02 18:06   ` [PATCH 02/12] NFS: Clean up readdir struct nfs_cache_array trondmy
2020-11-02 18:06     ` [PATCH 03/12] NFS: Clean up nfs_readdir_page_filler() trondmy
2020-11-02 18:06       ` [PATCH 04/12] NFS: Clean up directory array handling trondmy
2020-11-02 18:06         ` [PATCH 05/12] NFS: Don't discard readdir results trondmy
2020-11-02 18:06           ` [PATCH 06/12] NFS: Remove unnecessary kmap in nfs_readdir_xdr_to_array() trondmy
2020-11-02 18:06             ` [PATCH 07/12] NFS: Replace kmap() with kmap_atomic() in nfs_readdir_search_array() trondmy
2020-11-02 18:06               ` [PATCH 08/12] NFS: Simplify struct nfs_cache_array_entry trondmy
2020-11-02 18:06                 ` [PATCH 09/12] NFS: Support larger readdir buffers trondmy
2020-11-02 18:06                   ` [PATCH 10/12] NFS: More readdir cleanups trondmy
2020-11-02 18:06                     ` [PATCH 11/12] NFS: nfs_do_filldir() does not return a value trondmy
2020-11-02 18:06                       ` [PATCH 12/12] NFS: Reduce readdir stack usage trondmy
2020-11-03 14:18       ` [PATCH 03/12] NFS: Clean up nfs_readdir_page_filler() Benjamin Coddington
2020-11-03 14:24         ` Benjamin Coddington
2020-11-03 13:35     ` [PATCH 02/12] NFS: Clean up readdir struct nfs_cache_array Benjamin Coddington
2020-11-03 14:09       ` Benjamin Coddington [this message]
2020-11-03 14:34         ` Benjamin Coddington
2020-11-02 20:40 ` [PATCH 00/12] Readdir enhancements David Wysochanski
2020-11-02 21:32   ` Trond Myklebust

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=ACB62869-286C-4189-9BF9-C4F622C02C73@redhat.com \
    --to=bcodding@redhat.com \
    --cc=linux-nfs@vger.kernel.org \
    --cc=trondmy@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

Linux-NFS Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-nfs/0 linux-nfs/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-nfs linux-nfs/ https://lore.kernel.org/linux-nfs \
		linux-nfs@vger.kernel.org
	public-inbox-index linux-nfs

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-nfs


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git