[PATCH v11 19/63] page cache: Convert page deletion to XArray

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 04/14/2018 09:12 AM, Matthew Wilcox wrote:
> From: Matthew Wilcox <mawilcox@xxxxxxxxxxxxx>
> 
> The code is slightly shorter and simpler.
> 
> Signed-off-by: Matthew Wilcox <mawilcox@xxxxxxxxxxxxx>
> ---
>  mm/filemap.c | 30 ++++++++++++++----------------
>  1 file changed, 14 insertions(+), 16 deletions(-)
> 
> diff --git a/mm/filemap.c b/mm/filemap.c
> index 070b5e4527ac..4af06a1a9818 100644
> --- a/mm/filemap.c
> +++ b/mm/filemap.c
> @@ -111,30 +111,28 @@
>   *   ->tasklist_lock            (memory_failure, collect_procs_ao)
>   */
>  
> -static void page_cache_tree_delete(struct address_space *mapping,
> +static void page_cache_delete(struct address_space *mapping,
>  				   struct page *page, void *shadow)
>  {
> -	int i, nr;
> +	XA_STATE(xas, &mapping->i_pages, page->index);
> +	unsigned int i, nr;
>  
> -	/* hugetlb pages are represented by one entry in the radix tree */
> +	mapping_set_update(&xas, mapping);
> +
> +	/* hugetlb pages are represented by a single entry in the xarray */
>  	nr = PageHuge(page) ? 1 : hpage_nr_pages(page);
>  
>  	VM_BUG_ON_PAGE(!PageLocked(page), page);
>  	VM_BUG_ON_PAGE(PageTail(page), page);
>  	VM_BUG_ON_PAGE(nr != 1 && shadow, page);
>  
> -	for (i = 0; i < nr; i++) {
> -		struct radix_tree_node *node;
> -		void **slot;
> -
> -		__radix_tree_lookup(&mapping->i_pages, page->index + i,
> -				    &node, &slot);
> -
> -		VM_BUG_ON_PAGE(!node && nr != 1, page);
> -
> -		radix_tree_clear_tags(&mapping->i_pages, node, slot);
> -		__radix_tree_replace(&mapping->i_pages, node, slot, shadow,
> -				workingset_lookup_update(mapping));
> +	i = nr;
> +repeat:
> +	xas_store(&xas, shadow);
> +	xas_init_tags(&xas);
> +	if (--i) {
> +		xas_next(&xas);
> +		goto repeat;
>  	}

Can this be converted into a do {} while (or even for) loop instead?
Loops are easier to read and understand in such a situation.

>  
>  	page->mapping = NULL;
> @@ -234,7 +232,7 @@ void __delete_from_page_cache(struct page *page, void *shadow)
>  	trace_mm_filemap_delete_from_page_cache(page);
>  
>  	unaccount_page_cache_page(mapping, page);
> -	page_cache_tree_delete(mapping, page, shadow);
> +	page_cache_delete(mapping, page, shadow);
>  }
>  
>  static void page_cache_free_page(struct address_space *mapping,
> 

-- 
Goldwyn





[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux