Unverified Commit a161fff2 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!11651 large folio: Performance and bugfix

Merge Pull Request from: @ci-robot 
 
PR sync from: Liu Shixin <liushixin2@huawei.com>
https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/QHJY7DX734LWKN2HOVNQ6TYDX2AUHLBQ/ 
Patch [1-3] are cleanups for shmem.
Patch [4,5] fix performance of shmem write.
Patch [6-11] fix fault handler's handling of poisoned tail pages.

Baolin Wang (3):
  mm: shmem: simplify the suitable huge orders validation for tmpfs
  mm: shmem: rename shmem_is_huge() to shmem_huge_global_enabled()
  mm: shmem: move shmem_huge_global_enabled() into
    shmem_allowable_huge_orders()

Kefeng Wang (1):
  tmpfs: fault in smaller chunks if large folio allocation not allowed

Matthew Wilcox (Oracle) (6):
  mm: make mapping_evict_folio() the preferred way to evict clean folios
  mm: convert __do_fault() to use a folio
  mm: use mapping_evict_folio() in truncate_error_page()
  mm: convert soft_offline_in_use_page() to use a folio
  mm: convert isolate_page() to mf_isolate_folio()
  mm: remove invalidate_inode_page()

Rik van Riel (1):
  mm,tmpfs: consider end of file write in shmem_is_huge


-- 
2.34.1
 
https://gitee.com/openeuler/kernel/issues/IAO6NS 
 
Link:https://gitee.com/openeuler/kernel/pulls/11651

 

Reviewed-by: default avatarKefeng Wang <wangkefeng.wang@huawei.com>
Signed-off-by: default avatarZhang Peng <zhangpeng362@huawei.com>
parents cd87e596 5153997f
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -372,6 +372,8 @@ enum rw_hint {
#define IOCB_DIO_CALLER_COMP	(1 << 22)
/* kiocb is a read or write operation submitted by fs/aio.c. */
#define IOCB_AIO_RW		(1 << 23)
/* fault int small chunks(PAGE_SIZE) from userspace */
#define IOCB_NO_LARGE_CHUNK	(1 << 24)

/* for use in trace events */
#define TRACE_IOCB_STRINGS \
+4 −11
Original line number Diff line number Diff line
@@ -115,20 +115,13 @@ extern void shmem_truncate_range(struct inode *inode, loff_t start, loff_t end);
int shmem_unuse(unsigned int type);

#ifdef CONFIG_TRANSPARENT_HUGEPAGE
extern bool shmem_is_huge(struct inode *inode, pgoff_t index, bool shmem_huge_force,
			  struct mm_struct *mm, unsigned long vm_flags);
unsigned long shmem_allowable_huge_orders(struct inode *inode,
				struct vm_area_struct *vma, pgoff_t index,
				bool global_huge);
				loff_t write_end, bool shmem_huge_force);
#else
static __always_inline bool shmem_is_huge(struct inode *inode, pgoff_t index, bool shmem_huge_force,
					  struct mm_struct *mm, unsigned long vm_flags)
{
	return false;
}
static inline unsigned long shmem_allowable_huge_orders(struct inode *inode,
				struct vm_area_struct *vma, pgoff_t index,
				bool global_huge)
				loff_t write_end, bool shmem_huge_force)
{
	return 0;
}
@@ -154,8 +147,8 @@ enum sgp_type {
	SGP_FALLOC,	/* like SGP_WRITE, but make existing page Uptodate */
};

int shmem_get_folio(struct inode *inode, pgoff_t index, struct folio **foliop,
		enum sgp_type sgp);
int shmem_get_folio(struct inode *inode, pgoff_t index, loff_t write_end,
		struct folio **foliop, enum sgp_type sgp);
struct folio *shmem_read_folio_gfp(struct address_space *mapping,
		pgoff_t index, gfp_t gfp);

+6 −1
Original line number Diff line number Diff line
@@ -4043,9 +4043,14 @@ ssize_t generic_perform_write(struct kiocb *iocb, struct iov_iter *i)
	loff_t pos = iocb->ki_pos;
	struct address_space *mapping = file->f_mapping;
	const struct address_space_operations *a_ops = mapping->a_ops;
	size_t chunk = mapping_max_folio_size(mapping);
	long status = 0;
	ssize_t written = 0;
	size_t chunk;

	if (iocb->ki_flags & IOCB_NO_LARGE_CHUNK)
		chunk = PAGE_SIZE;
	else
		chunk = mapping_max_folio_size(mapping);

	do {
		struct page *page;
+3 −8
Original line number Diff line number Diff line
@@ -156,15 +156,10 @@ unsigned long __thp_vma_allowable_orders(struct vm_area_struct *vma,
	 * Must be done before hugepage flags check since shmem has its
	 * own flags.
	 */
	if (!in_pf && shmem_file(vma->vm_file)) {
		bool global_huge = shmem_is_huge(file_inode(vma->vm_file), vma->vm_pgoff,
							!enforce_sysfs, vma->vm_mm, vm_flags);

		if (!vma_is_anon_shmem(vma))
			return global_huge ? orders : 0;
	if (!in_pf && shmem_file(vma->vm_file))
		return shmem_allowable_huge_orders(file_inode(vma->vm_file),
							vma, vma->vm_pgoff, global_huge);
	}
						   vma, vma->vm_pgoff, 0,
						   !enforce_sysfs);

	if (!vma_is_anonymous(vma)) {
		/*
+1 −1
Original line number Diff line number Diff line
@@ -343,7 +343,7 @@ void filemap_free_folio(struct address_space *mapping, struct folio *folio);
int truncate_inode_folio(struct address_space *mapping, struct folio *folio);
bool truncate_inode_partial_folio(struct folio *folio, loff_t start,
		loff_t end);
long invalidate_inode_page(struct page *page);
long mapping_evict_folio(struct address_space *mapping, struct folio *folio);
unsigned long mapping_try_invalidate(struct address_space *mapping,
		pgoff_t start, pgoff_t end, unsigned long *nr_failed);

Loading