forked from mirrors/linux
		
	mm/page_io.c: annotate refault stalls from swap_readpage
If a block device supports rw_page operation, it doesn't submit bios so the annotation in submit_bio() for refault stall doesn't work. It happens with zram in android, especially swap read path which could consume CPU cycle for decompress. It is also a problem for zswap which uses frontswap. Annotate swap_readpage() to account the synchronous IO overhead to prevent underreport memory pressure. [akpm@linux-foundation.org: add comment, per Johannes] Link: http://lkml.kernel.org/r/20191010152134.38545-1-minchan@kernel.org Signed-off-by: Minchan Kim <minchan@google.com> Acked-by: Johannes Weiner <hannes@cmpxchg.org> Reviewed-by: Shakeel Butt <shakeelb@google.com> Cc: Seth Jennings <sjenning@redhat.com> Cc: Dan Streetman <ddstreet@ieee.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									dd33d29a19
								
							
						
					
					
						commit
						937790699b
					
				
					 1 changed files with 13 additions and 2 deletions
				
			
		
							
								
								
									
										15
									
								
								mm/page_io.c
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								mm/page_io.c
									
									
									
									
									
								
							|  | @ -22,6 +22,7 @@ | |||
| #include <linux/writeback.h> | ||||
| #include <linux/frontswap.h> | ||||
| #include <linux/blkdev.h> | ||||
| #include <linux/psi.h> | ||||
| #include <linux/uio.h> | ||||
| #include <linux/sched/task.h> | ||||
| #include <asm/pgtable.h> | ||||
|  | @ -354,10 +355,19 @@ int swap_readpage(struct page *page, bool synchronous) | |||
| 	struct swap_info_struct *sis = page_swap_info(page); | ||||
| 	blk_qc_t qc; | ||||
| 	struct gendisk *disk; | ||||
| 	unsigned long pflags; | ||||
| 
 | ||||
| 	VM_BUG_ON_PAGE(!PageSwapCache(page) && !synchronous, page); | ||||
| 	VM_BUG_ON_PAGE(!PageLocked(page), page); | ||||
| 	VM_BUG_ON_PAGE(PageUptodate(page), page); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Count submission time as memory stall. When the device is congested, | ||||
| 	 * or the submitting cgroup IO-throttled, submission can be a | ||||
| 	 * significant part of overall IO time. | ||||
| 	 */ | ||||
| 	psi_memstall_enter(&pflags); | ||||
| 
 | ||||
| 	if (frontswap_load(page) == 0) { | ||||
| 		SetPageUptodate(page); | ||||
| 		unlock_page(page); | ||||
|  | @ -371,7 +381,7 @@ int swap_readpage(struct page *page, bool synchronous) | |||
| 		ret = mapping->a_ops->readpage(swap_file, page); | ||||
| 		if (!ret) | ||||
| 			count_vm_event(PSWPIN); | ||||
| 		return ret; | ||||
| 		goto out; | ||||
| 	} | ||||
| 
 | ||||
| 	ret = bdev_read_page(sis->bdev, swap_page_sector(page), page); | ||||
|  | @ -382,7 +392,7 @@ int swap_readpage(struct page *page, bool synchronous) | |||
| 		} | ||||
| 
 | ||||
| 		count_vm_event(PSWPIN); | ||||
| 		return 0; | ||||
| 		goto out; | ||||
| 	} | ||||
| 
 | ||||
| 	ret = 0; | ||||
|  | @ -418,6 +428,7 @@ int swap_readpage(struct page *page, bool synchronous) | |||
| 	bio_put(bio); | ||||
| 
 | ||||
| out: | ||||
| 	psi_memstall_leave(&pflags); | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Minchan Kim
						Minchan Kim