diff options
Diffstat (limited to 'mm/filemap.c')
| -rw-r--r-- | mm/filemap.c | 22 | 
1 files changed, 13 insertions, 9 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index 382c3d06bfb1..657bcd887fdb 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -1000,7 +1000,7 @@ struct folio *filemap_alloc_folio_noprof(gfp_t gfp, unsigned int order)  		do {  			cpuset_mems_cookie = read_mems_allowed_begin();  			n = cpuset_mem_spread_node(); -			folio = __folio_alloc_node(gfp, order, n); +			folio = __folio_alloc_node_noprof(gfp, order, n);  		} while (!folio && read_mems_allowed_retry(cpuset_mems_cookie));  		return folio; @@ -1847,7 +1847,7 @@ repeat:  	if (!folio || xa_is_value(folio))  		goto out; -	if (!folio_try_get_rcu(folio)) +	if (!folio_try_get(folio))  		goto repeat;  	if (unlikely(folio != xas_reload(&xas))) { @@ -2001,7 +2001,7 @@ retry:  	if (!folio || xa_is_value(folio))  		return folio; -	if (!folio_try_get_rcu(folio)) +	if (!folio_try_get(folio))  		goto reset;  	if (unlikely(folio != xas_reload(xas))) { @@ -2181,7 +2181,7 @@ unsigned filemap_get_folios_contig(struct address_space *mapping,  		if (xa_is_value(folio))  			goto update_start; -		if (!folio_try_get_rcu(folio)) +		if (!folio_try_get(folio))  			goto retry;  		if (unlikely(folio != xas_reload(&xas))) @@ -2313,7 +2313,7 @@ static void filemap_get_read_batch(struct address_space *mapping,  			break;  		if (xa_is_sibling(folio))  			break; -		if (!folio_try_get_rcu(folio)) +		if (!folio_try_get(folio))  			goto retry;  		if (unlikely(folio != xas_reload(&xas))) @@ -3124,7 +3124,7 @@ static struct file *do_sync_mmap_readahead(struct vm_fault *vmf)  #ifdef CONFIG_TRANSPARENT_HUGEPAGE  	/* Use the readahead code, even if readahead is disabled */ -	if (vm_flags & VM_HUGEPAGE) { +	if ((vm_flags & VM_HUGEPAGE) && HPAGE_PMD_ORDER <= MAX_PAGECACHE_ORDER) {  		fpin = maybe_unlock_mmap_for_io(vmf, fpin);  		ractl._index &= ~((unsigned long)HPAGE_PMD_NR - 1);  		ra->size = HPAGE_PMD_NR; @@ -3231,7 +3231,8 @@ static vm_fault_t filemap_fault_recheck_pte_none(struct vm_fault *vmf)  	if (!(vmf->flags & FAULT_FLAG_ORIG_PTE_VALID))  		return 0; -	ptep = pte_offset_map(vmf->pmd, vmf->address); +	ptep = pte_offset_map_nolock(vma->vm_mm, vmf->pmd, vmf->address, +				     &vmf->ptl);  	if (unlikely(!ptep))  		return VM_FAULT_NOPAGE; @@ -3472,7 +3473,7 @@ static struct folio *next_uptodate_folio(struct xa_state *xas,  			continue;  		if (folio_test_locked(folio))  			continue; -		if (!folio_try_get_rcu(folio)) +		if (!folio_try_get(folio))  			continue;  		/* Has the page moved or been split? */  		if (unlikely(folio != xas_reload(xas))) @@ -4248,6 +4249,9 @@ static void filemap_cachestat(struct address_space *mapping,  	XA_STATE(xas, &mapping->i_pages, first_index);  	struct folio *folio; +	/* Flush stats (and potentially sleep) outside the RCU read section. */ +	mem_cgroup_flush_stats_ratelimited(NULL); +  	rcu_read_lock();  	xas_for_each(&xas, folio, last_index) {  		int order; @@ -4311,7 +4315,7 @@ static void filemap_cachestat(struct address_space *mapping,  					goto resched;  			}  #endif -			if (workingset_test_recent(shadow, true, &workingset)) +			if (workingset_test_recent(shadow, true, &workingset, false))  				cs->nr_recently_evicted += nr_pages;  			goto resched;  |