mm: make expand_downwards() symmetrical with expand_upwards()
Currently we have expand_upwards exported while expand_downwards is
accessible only via expand_stack or expand_stack_downwards.
check_stack_guard_page is a nice example of the asymmetry.  It uses
expand_stack for VM_GROWSDOWN while expand_upwards is called for
VM_GROWSUP case.
Let's clean this up by exporting both functions and make those names
consistent.  Let's use expand_{upwards,downwards} because expanding
doesn't always involve stack manipulation (an example is
ia64_do_page_fault which uses expand_upwards for registers backing store
expansion).  expand_downwards has to be defined for both
CONFIG_STACK_GROWS{UP,DOWN} because get_arg_page calls the downwards
version in the early process initialization phase for growsup
configuration.
Signed-off-by: Michal Hocko <mhocko@suse.cz>
Acked-by: Hugh Dickins <hughd@google.com>
Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
Cc: "Luck, Tony" <tony.luck@intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
	
	
This commit is contained in:
		
					parent
					
						
							
								248ac0e194
							
						
					
				
			
			
				commit
				
					
						d05f3169c0
					
				
			
		
					 4 changed files with 8 additions and 11 deletions
				
			
		|  | @ -200,7 +200,7 @@ static struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos, | ||||||
| 
 | 
 | ||||||
| #ifdef CONFIG_STACK_GROWSUP | #ifdef CONFIG_STACK_GROWSUP | ||||||
| 	if (write) { | 	if (write) { | ||||||
| 		ret = expand_stack_downwards(bprm->vma, pos); | 		ret = expand_downwards(bprm->vma, pos); | ||||||
| 		if (ret < 0) | 		if (ret < 0) | ||||||
| 			return NULL; | 			return NULL; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -1518,15 +1518,17 @@ unsigned long ra_submit(struct file_ra_state *ra, | ||||||
| 			struct address_space *mapping, | 			struct address_space *mapping, | ||||||
| 			struct file *filp); | 			struct file *filp); | ||||||
| 
 | 
 | ||||||
| /* Do stack extension */ | /* Generic expand stack which grows the stack according to GROWS{UP,DOWN} */ | ||||||
| extern int expand_stack(struct vm_area_struct *vma, unsigned long address); | extern int expand_stack(struct vm_area_struct *vma, unsigned long address); | ||||||
|  | 
 | ||||||
|  | /* CONFIG_STACK_GROWSUP still needs to to grow downwards at some places */ | ||||||
|  | extern int expand_downwards(struct vm_area_struct *vma, | ||||||
|  | 		unsigned long address); | ||||||
| #if VM_GROWSUP | #if VM_GROWSUP | ||||||
| extern int expand_upwards(struct vm_area_struct *vma, unsigned long address); | extern int expand_upwards(struct vm_area_struct *vma, unsigned long address); | ||||||
| #else | #else | ||||||
|   #define expand_upwards(vma, address) do { } while (0) |   #define expand_upwards(vma, address) do { } while (0) | ||||||
| #endif | #endif | ||||||
| extern int expand_stack_downwards(struct vm_area_struct *vma, |  | ||||||
| 				  unsigned long address); |  | ||||||
| 
 | 
 | ||||||
| /* Look up the first VMA which satisfies  addr < vm_end,  NULL if none. */ | /* Look up the first VMA which satisfies  addr < vm_end,  NULL if none. */ | ||||||
| extern struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr); | extern struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr); | ||||||
|  |  | ||||||
|  | @ -2966,7 +2966,7 @@ static inline int check_stack_guard_page(struct vm_area_struct *vma, unsigned lo | ||||||
| 		if (prev && prev->vm_end == address) | 		if (prev && prev->vm_end == address) | ||||||
| 			return prev->vm_flags & VM_GROWSDOWN ? 0 : -ENOMEM; | 			return prev->vm_flags & VM_GROWSDOWN ? 0 : -ENOMEM; | ||||||
| 
 | 
 | ||||||
| 		expand_stack(vma, address - PAGE_SIZE); | 		expand_downwards(vma, address - PAGE_SIZE); | ||||||
| 	} | 	} | ||||||
| 	if ((vma->vm_flags & VM_GROWSUP) && address + PAGE_SIZE == vma->vm_end) { | 	if ((vma->vm_flags & VM_GROWSUP) && address + PAGE_SIZE == vma->vm_end) { | ||||||
| 		struct vm_area_struct *next = vma->vm_next; | 		struct vm_area_struct *next = vma->vm_next; | ||||||
|  |  | ||||||
|  | @ -1774,7 +1774,7 @@ int expand_upwards(struct vm_area_struct *vma, unsigned long address) | ||||||
| /*
 | /*
 | ||||||
|  * vma is the first one with address < vma->vm_start.  Have to extend vma. |  * vma is the first one with address < vma->vm_start.  Have to extend vma. | ||||||
|  */ |  */ | ||||||
| static int expand_downwards(struct vm_area_struct *vma, | int expand_downwards(struct vm_area_struct *vma, | ||||||
| 				   unsigned long address) | 				   unsigned long address) | ||||||
| { | { | ||||||
| 	int error; | 	int error; | ||||||
|  | @ -1821,11 +1821,6 @@ static int expand_downwards(struct vm_area_struct *vma, | ||||||
| 	return error; | 	return error; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int expand_stack_downwards(struct vm_area_struct *vma, unsigned long address) |  | ||||||
| { |  | ||||||
| 	return expand_downwards(vma, address); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #ifdef CONFIG_STACK_GROWSUP | #ifdef CONFIG_STACK_GROWSUP | ||||||
| int expand_stack(struct vm_area_struct *vma, unsigned long address) | int expand_stack(struct vm_area_struct *vma, unsigned long address) | ||||||
| { | { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Michal Hocko
				Michal Hocko