diff mbox

[v8,01/10] ARM: use _install_special_mapping for sigpage

Message ID 1407003407-31219-2-git-send-email-nathan_lynch@mentor.com (mailing list archive)
State New, archived
Headers show

Commit Message

Nathan Lynch Aug. 2, 2014, 6:16 p.m. UTC
_install_special_mapping allows the VMA to be identifed in
/proc/pid/maps without the use of arch_vma_name, providing a
slight net reduction in object size:

  text    data     bss     dec     hex filename
  2996      96     144    3236     ca4 arch/arm/kernel/process.o (before)
  2956     104     144    3204     c84 arch/arm/kernel/process.o (after)

Signed-off-by: Nathan Lynch <nathan_lynch@mentor.com>
Reviewed-by: Kees Cook <keescook@chromium.org>
---
 arch/arm/kernel/process.c | 24 ++++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

Comments

Will Deacon Aug. 4, 2014, 12:46 p.m. UTC | #1
On Sat, Aug 02, 2014 at 07:16:38PM +0100, Nathan Lynch wrote:
> _install_special_mapping allows the VMA to be identifed in
> /proc/pid/maps without the use of arch_vma_name, providing a
> slight net reduction in object size:
> 
>   text    data     bss     dec     hex filename
>   2996      96     144    3236     ca4 arch/arm/kernel/process.o (before)
>   2956     104     144    3204     c84 arch/arm/kernel/process.o (after)
> 
> Signed-off-by: Nathan Lynch <nathan_lynch@mentor.com>
> Reviewed-by: Kees Cook <keescook@chromium.org>
> ---
>  arch/arm/kernel/process.c | 24 ++++++++++++++++--------
>  1 file changed, 16 insertions(+), 8 deletions(-)
> 
> diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
> index 81ef686a91ca..46fbbb3701a0 100644
> --- a/arch/arm/kernel/process.c
> +++ b/arch/arm/kernel/process.c
> @@ -472,19 +472,23 @@ int in_gate_area_no_mm(unsigned long addr)
>  
>  const char *arch_vma_name(struct vm_area_struct *vma)
>  {
> -	return is_gate_vma(vma) ? "[vectors]" :
> -		(vma->vm_mm && vma->vm_start == vma->vm_mm->context.sigpage) ?
> -		 "[sigpage]" : NULL;
> +	return is_gate_vma(vma) ? "[vectors]" : NULL;
>  }

Why do you need this function? I just removed it for arm64 and I think x86
has done the same.

Will
Nathan Lynch Aug. 4, 2014, 1:12 p.m. UTC | #2
On 08/04/2014 07:46 AM, Will Deacon wrote:
> On Sat, Aug 02, 2014 at 07:16:38PM +0100, Nathan Lynch wrote:
>> _install_special_mapping allows the VMA to be identifed in
>> /proc/pid/maps without the use of arch_vma_name, providing a
>> slight net reduction in object size:
>>
>>   text    data     bss     dec     hex filename
>>   2996      96     144    3236     ca4 arch/arm/kernel/process.o (before)
>>   2956     104     144    3204     c84 arch/arm/kernel/process.o (after)
>>
>> Signed-off-by: Nathan Lynch <nathan_lynch@mentor.com>
>> Reviewed-by: Kees Cook <keescook@chromium.org>
>> ---
>>  arch/arm/kernel/process.c | 24 ++++++++++++++++--------
>>  1 file changed, 16 insertions(+), 8 deletions(-)
>>
>> diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
>> index 81ef686a91ca..46fbbb3701a0 100644
>> --- a/arch/arm/kernel/process.c
>> +++ b/arch/arm/kernel/process.c
>> @@ -472,19 +472,23 @@ int in_gate_area_no_mm(unsigned long addr)
>>  
>>  const char *arch_vma_name(struct vm_area_struct *vma)
>>  {
>> -	return is_gate_vma(vma) ? "[vectors]" :
>> -		(vma->vm_mm && vma->vm_start == vma->vm_mm->context.sigpage) ?
>> -		 "[sigpage]" : NULL;
>> +	return is_gate_vma(vma) ? "[vectors]" : NULL;
>>  }
> 
> Why do you need this function? I just removed it for arm64 and I think x86
> has done the same.

I think arch_vma_name is still needed for arm as long as the vectors
page is not installed using _install_special_mapping.  I'm honestly not
sure whether moving the vectors page to that API would be appropriate,
but it would be a larger undertaking.
Nathan Lynch Aug. 4, 2014, 2:11 p.m. UTC | #3
On 08/04/2014 08:12 AM, Nathan Lynch wrote:
> On 08/04/2014 07:46 AM, Will Deacon wrote:
>> On Sat, Aug 02, 2014 at 07:16:38PM +0100, Nathan Lynch wrote:
>>> _install_special_mapping allows the VMA to be identifed in
>>> /proc/pid/maps without the use of arch_vma_name, providing a
>>> slight net reduction in object size:
>>>
>>>   text    data     bss     dec     hex filename
>>>   2996      96     144    3236     ca4 arch/arm/kernel/process.o (before)
>>>   2956     104     144    3204     c84 arch/arm/kernel/process.o (after)
>>>
>>> Signed-off-by: Nathan Lynch <nathan_lynch@mentor.com>
>>> Reviewed-by: Kees Cook <keescook@chromium.org>
>>> ---
>>>  arch/arm/kernel/process.c | 24 ++++++++++++++++--------
>>>  1 file changed, 16 insertions(+), 8 deletions(-)
>>>
>>> diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
>>> index 81ef686a91ca..46fbbb3701a0 100644
>>> --- a/arch/arm/kernel/process.c
>>> +++ b/arch/arm/kernel/process.c
>>> @@ -472,19 +472,23 @@ int in_gate_area_no_mm(unsigned long addr)
>>>  
>>>  const char *arch_vma_name(struct vm_area_struct *vma)
>>>  {
>>> -	return is_gate_vma(vma) ? "[vectors]" :
>>> -		(vma->vm_mm && vma->vm_start == vma->vm_mm->context.sigpage) ?
>>> -		 "[sigpage]" : NULL;
>>> +	return is_gate_vma(vma) ? "[vectors]" : NULL;
>>>  }
>>
>> Why do you need this function? I just removed it for arm64 and I think x86
>> has done the same.
> 
> I think arch_vma_name is still needed for arm as long as the vectors
> page is not installed using _install_special_mapping.

Actually... if we give arm's gate_vma a vm_ops with a ->name() routine
that returns "[vectors]" we could get rid of arch_vma_name, I think.
This seems to be what x86_64 does.
Will Deacon Aug. 4, 2014, 4:06 p.m. UTC | #4
On Mon, Aug 04, 2014 at 03:11:29PM +0100, Nathan Lynch wrote:
> On 08/04/2014 08:12 AM, Nathan Lynch wrote:
> > On 08/04/2014 07:46 AM, Will Deacon wrote:
> >> On Sat, Aug 02, 2014 at 07:16:38PM +0100, Nathan Lynch wrote:
> >>> _install_special_mapping allows the VMA to be identifed in
> >>> /proc/pid/maps without the use of arch_vma_name, providing a
> >>> slight net reduction in object size:
> >>>
> >>>   text    data     bss     dec     hex filename
> >>>   2996      96     144    3236     ca4 arch/arm/kernel/process.o (before)
> >>>   2956     104     144    3204     c84 arch/arm/kernel/process.o (after)
> >>>
> >>> Signed-off-by: Nathan Lynch <nathan_lynch@mentor.com>
> >>> Reviewed-by: Kees Cook <keescook@chromium.org>
> >>> ---
> >>>  arch/arm/kernel/process.c | 24 ++++++++++++++++--------
> >>>  1 file changed, 16 insertions(+), 8 deletions(-)
> >>>
> >>> diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
> >>> index 81ef686a91ca..46fbbb3701a0 100644
> >>> --- a/arch/arm/kernel/process.c
> >>> +++ b/arch/arm/kernel/process.c
> >>> @@ -472,19 +472,23 @@ int in_gate_area_no_mm(unsigned long addr)
> >>>  
> >>>  const char *arch_vma_name(struct vm_area_struct *vma)
> >>>  {
> >>> -	return is_gate_vma(vma) ? "[vectors]" :
> >>> -		(vma->vm_mm && vma->vm_start == vma->vm_mm->context.sigpage) ?
> >>> -		 "[sigpage]" : NULL;
> >>> +	return is_gate_vma(vma) ? "[vectors]" : NULL;
> >>>  }
> >>
> >> Why do you need this function? I just removed it for arm64 and I think x86
> >> has done the same.
> > 
> > I think arch_vma_name is still needed for arm as long as the vectors
> > page is not installed using _install_special_mapping.
> 
> Actually... if we give arm's gate_vma a vm_ops with a ->name() routine
> that returns "[vectors]" we could get rid of arch_vma_name, I think.
> This seems to be what x86_64 does.

To be honest, I forgot about the vectors page, but giving it a name sounds
like a sensible idea.

Will
diff mbox

Patch

diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
index 81ef686a91ca..46fbbb3701a0 100644
--- a/arch/arm/kernel/process.c
+++ b/arch/arm/kernel/process.c
@@ -472,19 +472,23 @@  int in_gate_area_no_mm(unsigned long addr)
 
 const char *arch_vma_name(struct vm_area_struct *vma)
 {
-	return is_gate_vma(vma) ? "[vectors]" :
-		(vma->vm_mm && vma->vm_start == vma->vm_mm->context.sigpage) ?
-		 "[sigpage]" : NULL;
+	return is_gate_vma(vma) ? "[vectors]" : NULL;
 }
 
 static struct page *signal_page;
 extern struct page *get_signal_page(void);
 
+static const struct vm_special_mapping sigpage_mapping = {
+	.name = "[sigpage]",
+	.pages = &signal_page,
+};
+
 int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
 {
 	struct mm_struct *mm = current->mm;
+	struct vm_area_struct *vma;
 	unsigned long addr;
-	int ret;
+	int ret = 0;
 
 	if (!signal_page)
 		signal_page = get_signal_page();
@@ -498,12 +502,16 @@  int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
 		goto up_fail;
 	}
 
-	ret = install_special_mapping(mm, addr, PAGE_SIZE,
+	vma = _install_special_mapping(mm, addr, PAGE_SIZE,
 		VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC,
-		&signal_page);
+		&sigpage_mapping);
+
+	if (IS_ERR(vma)) {
+		ret = PTR_ERR(vma);
+		goto up_fail;
+	}
 
-	if (ret == 0)
-		mm->context.sigpage = addr;
+	mm->context.sigpage = addr;
 
  up_fail:
 	up_write(&mm->mmap_sem);