mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 08:44:41 +00:00 
			
		
		
		
	fs/proc/kcore: use page_offline_(freeze|thaw)
Let's properly synchronize with drivers that set PageOffline(). Unfreeze/thaw every now and then, so drivers that want to set PageOffline() can make progress. Link: https://lkml.kernel.org/r/20210526093041.8800-7-david@redhat.com Signed-off-by: David Hildenbrand <david@redhat.com> Acked-by: Mike Rapoport <rppt@linux.ibm.com> Reviewed-by: Oscar Salvador <osalvador@suse.de> Cc: Aili Yao <yaoaili@kingsoft.com> Cc: Alexey Dobriyan <adobriyan@gmail.com> Cc: Alex Shi <alex.shi@linux.alibaba.com> Cc: Haiyang Zhang <haiyangz@microsoft.com> Cc: Jason Wang <jasowang@redhat.com> Cc: Jiri Bohac <jbohac@suse.cz> Cc: "K. Y. Srinivasan" <kys@microsoft.com> Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org> Cc: "Michael S. Tsirkin" <mst@redhat.com> Cc: Michal Hocko <mhocko@suse.com> Cc: Mike Kravetz <mike.kravetz@oracle.com> Cc: Naoya Horiguchi <naoya.horiguchi@nec.com> Cc: Roman Gushchin <guro@fb.com> Cc: Stephen Hemminger <sthemmin@microsoft.com> Cc: Steven Price <steven.price@arm.com> Cc: Wei Liu <wei.liu@kernel.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
							
								
									6cc26d7761
								
							
						
					
					
						commit
						c6d9eee2a6
					
				
					 1 changed files with 13 additions and 0 deletions
				
			
		|  | @ -313,6 +313,7 @@ read_kcore(struct file *file, char __user *buffer, size_t buflen, loff_t *fpos) | |||
| { | ||||
| 	char *buf = file->private_data; | ||||
| 	size_t phdrs_offset, notes_offset, data_offset; | ||||
| 	size_t page_offline_frozen = 1; | ||||
| 	size_t phdrs_len, notes_len; | ||||
| 	struct kcore_list *m; | ||||
| 	size_t tsz; | ||||
|  | @ -322,6 +323,11 @@ read_kcore(struct file *file, char __user *buffer, size_t buflen, loff_t *fpos) | |||
| 	int ret = 0; | ||||
| 
 | ||||
| 	down_read(&kclist_lock); | ||||
| 	/*
 | ||||
| 	 * Don't race against drivers that set PageOffline() and expect no | ||||
| 	 * further page access. | ||||
| 	 */ | ||||
| 	page_offline_freeze(); | ||||
| 
 | ||||
| 	get_kcore_size(&nphdr, &phdrs_len, ¬es_len, &data_offset); | ||||
| 	phdrs_offset = sizeof(struct elfhdr); | ||||
|  | @ -480,6 +486,12 @@ read_kcore(struct file *file, char __user *buffer, size_t buflen, loff_t *fpos) | |||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if (page_offline_frozen++ % MAX_ORDER_NR_PAGES == 0) { | ||||
| 			page_offline_thaw(); | ||||
| 			cond_resched(); | ||||
| 			page_offline_freeze(); | ||||
| 		} | ||||
| 
 | ||||
| 		if (&m->list == &kclist_head) { | ||||
| 			if (clear_user(buffer, tsz)) { | ||||
| 				ret = -EFAULT; | ||||
|  | @ -565,6 +577,7 @@ skip: | |||
| 	} | ||||
| 
 | ||||
| out: | ||||
| 	page_offline_thaw(); | ||||
| 	up_read(&kclist_lock); | ||||
| 	if (ret) | ||||
| 		return ret; | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 David Hildenbrand
						David Hildenbrand