* [PATCH] binfmt_elf.c: core file shrinking
@ 2011-10-11 15:36 Thanh-Lam NGUYEN
2011-10-14 8:52 ` Thanh-Lam NGUYEN
2011-10-18 7:52 ` Thanh-Lam NGUYEN
0 siblings, 2 replies; 5+ messages in thread
From: Thanh-Lam NGUYEN @ 2011-10-11 15:36 UTC (permalink / raw)
To: Alexander Viro; +Cc: linux-fsdevel, linux-kernel, Benjamin ZORES
The vma_shrink function looks for the 1st allocated and the last
allocated page. Only this part is dumped to the disk (the virual
start address and the size are dupdated to reflect the new dumped
information).
Signed-off-by: Thanh Lam NGUYEN <thanh-lam.nguyen@alcatel-lucent.com>
Signed-off-by: Benjamin ZORES <Benjamin.Zores@alcatel-lucent.com>
---
linux/fs/binfmt_elf.c | 54
++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 55 insertions(+), 4 deletions(-)
--- linux/fs/binfmt_elf.c
+++ linux/fs/binfmt_elf.c
@@ -1085,6 +1085,48 @@
* Jeremy Fitzhardinge <jeremy@sw.oz.au>
*/
+/*
+ * Search for 1st and last allocated page from vma_start to vma_end.
+ * Update vma_start and vma_end to reflect the result.
+ */
+void vma_shrink(struct vm_area_struct *vma, unsigned long *vma_start,
+ unsigned long *vma_end)
+{
+ int allocated;
+ unsigned long start, addr, end;
+
+ allocated = 0;
+ start = end = *vma_start;
+ for (addr = *vma_start; _addr < *vma_end; addr += PAGE_SIZE) {
+ struct page *page;
+ if (get_user_pages(current, current->mm, addr, 1, 0, 1,
+ &page, NULL) <= 0) {
+ /* NO PAGE */
+ if (!allocated)
+ start = addr;
+ } else {
+ if (page == ZERO_PAGE(0)) {
+ /* ZERO PAGE */
+ if (!allocated)
+ start = addr;
+ } else {
+ /* ALLOCATED PAGE */
+ if (!allocated)
+ start = addr;
+ end = addr;
+ allocated = 1;
+ }
+ page_cache_release(page);
+ }
+ }
+ if (end < start)
+ end = start;
+ if (allocated)
+ end += PAGE_SIZE;
+ *vma_start = start;
+ *vma_end = end;
+}
+
/*
* Decide what to dump of a segment, part, all or none.
*/
@@ -1980,13 +2022,19 @@ static int elf_core_dump(struct coredump_params
*cprm)
for (vma = first_vma(current, gate_vma); vma != NULL;
vma = next_vma(vma, gate_vma)) {
struct elf_phdr phdr;
+ unsigned long start = vma->vm_start;
+ unsigned long end = vma->vm_end;
phdr.p_type = PT_LOAD;
phdr.p_offset = offset;
- phdr.p_vaddr = vma->vm_start;
phdr.p_paddr = 0;
phdr.p_filesz = vma_dump_size(vma, cprm->mm_flags);
- phdr.p_memsz = vma->vm_end - vma->vm_start;
+ if (phdr.p_filesz) {
+ vma_shrink(vma, &start, &end);
+ phdr.p_filesz = end-start;
+ }
+ phdr.p_vaddr = start;
+ phdr.p_memsz = vma->vm_end - phdr.p_vaddr;
offset += phdr.p_filesz;
phdr.p_flags = vma->vm_flags & VM_READ ? PF_R : 0;
if (vma->vm_flags & VM_WRITE)
@@ -2018,11 +2066,15 @@ static int elf_core_dump(struct coredump_params
*cprm)
for (vma = first_vma(current, gate_vma); vma != NULL;
vma = next_vma(vma, gate_vma)) {
unsigned long addr;
+ unsigned long start;
unsigned long end;
- end = vma->vm_start + vma_dump_size(vma, cprm->mm_flags);
+ start = vma->vm_start;
+ end = start + vma_dump_size(vma, cprm->mm_flags);
+ if (start < end)
+ vma_shrink(vma, &start, &end);
- for (addr = vma->vm_start; addr < end; addr += PAGE_SIZE) {
+ for (addr = start; addr < end; addr += PAGE_SIZE) {
struct page *page;
int stop;
---
=~=~=~=~=~=~=~=~=~=~=~=~==~=~=~=~=~=~=~=~=~=~=~=~=~=~=
Thanh lam NGUYEN
Prestataire externe ALTEN | ALTEN Subcontractor
pour ALCATEL-LUCENT | in ALCATEL-LUCENT
email: tlnguyen@webmail.alten.fr
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] binfmt_elf.c: core file shrinking
2011-10-11 15:36 [PATCH] binfmt_elf.c: core file shrinking Thanh-Lam NGUYEN
@ 2011-10-14 8:52 ` Thanh-Lam NGUYEN
2011-10-14 14:45 ` Hillf Danton
2011-10-18 7:52 ` Thanh-Lam NGUYEN
1 sibling, 1 reply; 5+ messages in thread
From: Thanh-Lam NGUYEN @ 2011-10-14 8:52 UTC (permalink / raw)
To: Alexander Viro; +Cc: linux-fsdevel, linux-kernel
Sorry for upping the patch,
as it is my first contribution I would like to know if there is any
problem with it.
Best regard
Thanh lam NGUYEN
On 11/10/2011 17:36, Thanh-Lam NGUYEN wrote:
> The vma_shrink function looks for the 1st allocated and the last
> allocated page. Only this part is dumped to the disk (the virual
> start address and the size are dupdated to reflect the new dumped
> information).
>
> Signed-off-by: Thanh Lam NGUYEN <thanh-lam.nguyen@alcatel-lucent.com>
> Signed-off-by: Benjamin ZORES <Benjamin.Zores@alcatel-lucent.com>
> ---
> linux/fs/binfmt_elf.c | 54
> ++++++++++++++++++++++++++++++++++++++++++++++----
> 1 file changed, 55 insertions(+), 4 deletions(-)
>
> --- linux/fs/binfmt_elf.c
> +++ linux/fs/binfmt_elf.c
> @@ -1085,6 +1085,48 @@
> * Jeremy Fitzhardinge <jeremy@sw.oz.au>
> */
>
> +/*
> + * Search for 1st and last allocated page from vma_start to vma_end.
> + * Update vma_start and vma_end to reflect the result.
> + */
> +void vma_shrink(struct vm_area_struct *vma, unsigned long *vma_start,
> + unsigned long *vma_end)
> +{
> + int allocated;
> + unsigned long start, addr, end;
> +
> + allocated = 0;
> + start = end = *vma_start;
> + for (addr = *vma_start; _addr < *vma_end; addr += PAGE_SIZE) {
> + struct page *page;
> + if (get_user_pages(current, current->mm, addr, 1, 0, 1,
> + &page, NULL) <= 0) {
> + /* NO PAGE */
> + if (!allocated)
> + start = addr;
> + } else {
> + if (page == ZERO_PAGE(0)) {
> + /* ZERO PAGE */
> + if (!allocated)
> + start = addr;
> + } else {
> + /* ALLOCATED PAGE */
> + if (!allocated)
> + start = addr;
> + end = addr;
> + allocated = 1;
> + }
> + page_cache_release(page);
> + }
> + }
> + if (end < start)
> + end = start;
> + if (allocated)
> + end += PAGE_SIZE;
> + *vma_start = start;
> + *vma_end = end;
> +}
> +
> /*
> * Decide what to dump of a segment, part, all or none.
> */
> @@ -1980,13 +2022,19 @@ static int elf_core_dump(struct coredump_params
> *cprm)
> for (vma = first_vma(current, gate_vma); vma != NULL;
> vma = next_vma(vma, gate_vma)) {
> struct elf_phdr phdr;
> + unsigned long start = vma->vm_start;
> + unsigned long end = vma->vm_end;
> phdr.p_type = PT_LOAD;
> phdr.p_offset = offset;
> - phdr.p_vaddr = vma->vm_start;
> phdr.p_paddr = 0;
> phdr.p_filesz = vma_dump_size(vma, cprm->mm_flags);
> - phdr.p_memsz = vma->vm_end - vma->vm_start;
> + if (phdr.p_filesz) {
> + vma_shrink(vma, &start, &end);
> + phdr.p_filesz = end-start;
> + }
> + phdr.p_vaddr = start;
> + phdr.p_memsz = vma->vm_end - phdr.p_vaddr;
> offset += phdr.p_filesz;
> phdr.p_flags = vma->vm_flags & VM_READ ? PF_R : 0;
> if (vma->vm_flags & VM_WRITE)
> @@ -2018,11 +2066,15 @@ static int elf_core_dump(struct coredump_params
> *cprm)
> for (vma = first_vma(current, gate_vma); vma != NULL;
> vma = next_vma(vma, gate_vma)) {
> unsigned long addr;
> + unsigned long start;
> unsigned long end;
> - end = vma->vm_start + vma_dump_size(vma, cprm->mm_flags);
> + start = vma->vm_start;
> + end = start + vma_dump_size(vma, cprm->mm_flags);
> + if (start < end)
> + vma_shrink(vma, &start, &end);
> - for (addr = vma->vm_start; addr < end; addr += PAGE_SIZE) {
> + for (addr = start; addr < end; addr += PAGE_SIZE) {
> struct page *page;
> int stop;
>
> ---
> =~=~=~=~=~=~=~=~=~=~=~=~==~=~=~=~=~=~=~=~=~=~=~=~=~=~=
> Thanh lam NGUYEN
> Prestataire externe ALTEN | ALTEN Subcontractor
> pour ALCATEL-LUCENT | in ALCATEL-LUCENT
>
> email: tlnguyen@webmail.alten.fr
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>
--
=~=~=~=~=~=~=~=~=~=~=~=~==~=~=~=~=~=~=~=~=~=~=~=~=~=~=
Thanh lam NGUYEN
Prestataire externe ALTEN | ALTEN Subcontractor
pour ALCATEL-LUCENT | in ALCATEL-LUCENT
Tel: +333906 77095
Equipe/Team: SWINT
email: tlnguyen@webmail.alten.fr
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] binfmt_elf.c: core file shrinking
2011-10-14 8:52 ` Thanh-Lam NGUYEN
@ 2011-10-14 14:45 ` Hillf Danton
2011-10-14 15:04 ` Thanh-Lam NGUYEN
0 siblings, 1 reply; 5+ messages in thread
From: Hillf Danton @ 2011-10-14 14:45 UTC (permalink / raw)
To: Thanh-Lam NGUYEN; +Cc: Alexander Viro, linux-fsdevel, linux-kernel
On Fri, Oct 14, 2011 at 4:52 PM, Thanh-Lam NGUYEN
<thanh-lam.nguyen@alcatel-lucent.com> wrote:
> Sorry for upping the patch,
> as it is my first contribution I would like to know if there is any
> problem with it.
>
> Best regard
> Thanh lam NGUYEN
>
> On 11/10/2011 17:36, Thanh-Lam NGUYEN wrote:
>
>> The vma_shrink function looks for the 1st allocated and the last
>> allocated page. Only this part is dumped to the disk (the virual
>> start address and the size are dupdated to reflect the new dumped
>> information).
>>
>> Signed-off-by: Thanh Lam NGUYEN <thanh-lam.nguyen@alcatel-lucent.com>
>> Signed-off-by: Benjamin ZORES <Benjamin.Zores@alcatel-lucent.com>
>> ---
>> linux/fs/binfmt_elf.c | 54
>> ++++++++++++++++++++++++++++++++++++++++++++++----
corrupted message?
>> 1 file changed, 55 insertions(+), 4 deletions(-)
>>
>> --- linux/fs/binfmt_elf.c
>> +++ linux/fs/binfmt_elf.c
>> @@ -1085,6 +1085,48 @@
>> * Jeremy Fitzhardinge <jeremy@sw.oz.au>
>> */
>>
>> +/*
>> + * Search for 1st and last allocated page from vma_start to vma_end.
>> + * Update vma_start and vma_end to reflect the result.
>> + */
>> +void vma_shrink(struct vm_area_struct *vma, unsigned long *vma_start,
>> + unsigned long *vma_end)
>> +{
>> + int allocated;
>> + unsigned long start, addr, end;
>> +
>> + allocated = 0;
>> + start = end = *vma_start;
>> + for (addr = *vma_start; _addr < *vma_end; addr += PAGE_SIZE) {
-----^
where is _addr from?
>> + struct page *page;
>> + if (get_user_pages(current, current->mm, addr, 1, 0, 1,
>> + &page, NULL) <= 0) {
>> + /* NO PAGE */
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] binfmt_elf.c: core file shrinking
2011-10-14 14:45 ` Hillf Danton
@ 2011-10-14 15:04 ` Thanh-Lam NGUYEN
0 siblings, 0 replies; 5+ messages in thread
From: Thanh-Lam NGUYEN @ 2011-10-14 15:04 UTC (permalink / raw)
To: Hillf Danton; +Cc: Alexander Viro, linux-fsdevel, linux-kernel
On 14/10/2011 16:45, Hillf Danton wrote:
> On Fri, Oct 14, 2011 at 4:52 PM, Thanh-Lam NGUYEN
> <thanh-lam.nguyen@alcatel-lucent.com> wrote:
>> Sorry for upping the patch,
>> as it is my first contribution I would like to know if there is any
>> problem with it.
>>
>> Best regard
>> Thanh lam NGUYEN
>>
>> On 11/10/2011 17:36, Thanh-Lam NGUYEN wrote:
>>
>>> The vma_shrink function looks for the 1st allocated and the last
>>> allocated page. Only this part is dumped to the disk (the virual
>>> start address and the size are dupdated to reflect the new dumped
>>> information).
>>>
>>> Signed-off-by: Thanh Lam NGUYEN <thanh-lam.nguyen@alcatel-lucent.com>
>>> Signed-off-by: Benjamin ZORES <Benjamin.Zores@alcatel-lucent.com>
>>> ---
>>> linux/fs/binfmt_elf.c | 54
>>> ++++++++++++++++++++++++++++++++++++++++++++++----
>
> corrupted message?
>
>>> 1 file changed, 55 insertions(+), 4 deletions(-)
>>>
>>> --- linux/fs/binfmt_elf.c
>>> +++ linux/fs/binfmt_elf.c
>>> @@ -1085,6 +1085,48 @@
>>> * Jeremy Fitzhardinge <jeremy@sw.oz.au>
>>> */
>>>
>>> +/*
>>> + * Search for 1st and last allocated page from vma_start to vma_end.
>>> + * Update vma_start and vma_end to reflect the result.
>>> + */
>>> +void vma_shrink(struct vm_area_struct *vma, unsigned long *vma_start,
>>> + unsigned long *vma_end)
>>> +{
>>> + int allocated;
>>> + unsigned long start, addr, end;
>>> +
>>> + allocated = 0;
>>> + start = end = *vma_start;
>>> + for (addr = *vma_start; _addr < *vma_end; addr += PAGE_SIZE) {
> -----^
> where is _addr from?
>
My bad, it's addr and not _addr.
>>> + struct page *page;
>>> + if (get_user_pages(current, current->mm, addr, 1, 0, 1,
>>> + &page, NULL) <= 0) {
>>> + /* NO PAGE */
> --
> To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
--
=~=~=~=~=~=~=~=~=~=~=~=~==~=~=~=~=~=~=~=~=~=~=~=~=~=~=
Thanh lam NGUYEN
Prestataire externe ALTEN | ALTEN Subcontractor
pour ALCATEL-LUCENT | in ALCATEL-LUCENT
Tel: +333906 77095
Equipe/Team: SWINT
email: tlnguyen@webmail.alten.fr
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] binfmt_elf.c: core file shrinking
2011-10-11 15:36 [PATCH] binfmt_elf.c: core file shrinking Thanh-Lam NGUYEN
2011-10-14 8:52 ` Thanh-Lam NGUYEN
@ 2011-10-18 7:52 ` Thanh-Lam NGUYEN
1 sibling, 0 replies; 5+ messages in thread
From: Thanh-Lam NGUYEN @ 2011-10-18 7:52 UTC (permalink / raw)
To: Alexander Viro; +Cc: linux-fsdevel, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 376 bytes --]
Here is the patch with the fix on the variable name.
To be sure that the mailer does not screw the patch, it is attached and
not inlined.
--
=~=~=~=~=~=~=~=~=~=~=~=~==~=~=~=~=~=~=~=~=~=~=~=~=~=~=
Thanh lam NGUYEN
Prestataire externe ALTEN | ALTEN Subcontractor
pour ALCATEL-LUCENT | in ALCATEL-LUCENT
Equipe/Team: SWINT
email: tlnguyen@webmail.alten.fr
[-- Attachment #2: vma_shrink.patch --]
[-- Type: text/plain, Size: 2984 bytes --]
The vma_shrink function looks for the 1st allocated and the last allocated page.
Only this part is dumped to the disk (the virual start address and the size are
updated to reflect the new dumped information).
Signed-off-by: Thanh Lam NGUYEN <thanh-lam.nguyen@alcatel-lucent.com>
Signed-off-by: Benjamin ZORES <Benjamin.Zores@alcatel-lucent.com>
---
linux/fs/binfmt_elf.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 55 insertions(+), 4 deletions(-)
--- linux/fs/binfmt_elf.c
+++ linux/fs/binfmt_elf.c
@@ -1085,6 +1085,48 @@
* Jeremy Fitzhardinge <jeremy@sw.oz.au>
*/
+/*
+ * Search for 1st and last allocated page from vma_start to vma_end.
+ * Update vma_start and vma_end to reflect the result.
+ */
+void vma_shrink(struct vm_area_struct *vma, unsigned long *vma_start,
+ unsigned long *vma_end)
+{
+ int allocated;
+ unsigned long start, addr, end;
+
+ allocated = 0;
+ start = end = *vma_start;
+ for (addr = *vma_start; addr < *vma_end; addr += PAGE_SIZE) {
+ struct page *page;
+ if (get_user_pages(current, current->mm, addr, 1, 0, 1,
+ &page, NULL) <= 0) {
+ /* NO PAGE */
+ if (!allocated)
+ start = addr;
+ } else {
+ if (page == ZERO_PAGE(0)) {
+ /* ZERO PAGE */
+ if (!allocated)
+ start = addr;
+ } else {
+ /* ALLOCATED PAGE */
+ if (!allocated)
+ start = addr;
+ end = addr;
+ allocated = 1;
+ }
+ page_cache_release(page);
+ }
+ }
+ if (end < start)
+ end = start;
+ if (allocated)
+ end += PAGE_SIZE;
+ *vma_start = start;
+ *vma_end = end;
+}
+
/*
* Decide what to dump of a segment, part, all or none.
*/
@@ -1980,13 +2022,19 @@ static int elf_core_dump(struct coredump_params *cprm)
for (vma = first_vma(current, gate_vma); vma != NULL;
vma = next_vma(vma, gate_vma)) {
struct elf_phdr phdr;
+ unsigned long start = vma->vm_start;
+ unsigned long end = vma->vm_end;
phdr.p_type = PT_LOAD;
phdr.p_offset = offset;
- phdr.p_vaddr = vma->vm_start;
phdr.p_paddr = 0;
phdr.p_filesz = vma_dump_size(vma, cprm->mm_flags);
- phdr.p_memsz = vma->vm_end - vma->vm_start;
+ if (phdr.p_filesz) {
+ vma_shrink(vma, &start, &end);
+ phdr.p_filesz = end-start;
+ }
+ phdr.p_vaddr = start;
+ phdr.p_memsz = vma->vm_end - phdr.p_vaddr;
offset += phdr.p_filesz;
phdr.p_flags = vma->vm_flags & VM_READ ? PF_R : 0;
if (vma->vm_flags & VM_WRITE)
@@ -2018,11 +2066,15 @@ static int elf_core_dump(struct coredump_params *cprm)
for (vma = first_vma(current, gate_vma); vma != NULL;
vma = next_vma(vma, gate_vma)) {
unsigned long addr;
+ unsigned long start;
unsigned long end;
- end = vma->vm_start + vma_dump_size(vma, cprm->mm_flags);
+ start = vma->vm_start;
+ end = start + vma_dump_size(vma, cprm->mm_flags);
+ if (start < end)
+ vma_shrink(vma, &start, &end);
- for (addr = vma->vm_start; addr < end; addr += PAGE_SIZE) {
+ for (addr = start; addr < end; addr += PAGE_SIZE) {
struct page *page;
int stop;
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2011-10-18 7:52 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-10-11 15:36 [PATCH] binfmt_elf.c: core file shrinking Thanh-Lam NGUYEN
2011-10-14 8:52 ` Thanh-Lam NGUYEN
2011-10-14 14:45 ` Hillf Danton
2011-10-14 15:04 ` Thanh-Lam NGUYEN
2011-10-18 7:52 ` Thanh-Lam NGUYEN
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).