[PATCH v4 4/8] vmcore: Add helper function vmcore_add()

From: HATAYAMA Daisuke
Date: Thu Apr 18 2013 - 05:35:10 EST


Later patch will introduce a helper function, vmcore_add_per_unit, to
add memory chunks per a given size in vmcore_list. As a preparation
this patch introduces a helper function that adds a given memory chunk
in vmcore_list in a simple manner.

Signed-off-by: HATAYAMA Daisuke <d.hatayama@xxxxxxxxxxxxxx>
---

fs/proc/vmcore.c | 44 ++++++++++++++++++++------------------------
1 files changed, 20 insertions(+), 24 deletions(-)

diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c
index 7e7c7ca..131d8fa 100644
--- a/fs/proc/vmcore.c
+++ b/fs/proc/vmcore.c
@@ -186,6 +186,20 @@ static struct vmcore* __init get_new_element(void)
return kzalloc(sizeof(struct vmcore), GFP_KERNEL);
}

+static int __init vmcore_add(struct list_head *vc_list, u64 paddr, u64 size)
+{
+ struct vmcore *new;
+
+ new = get_new_element();
+ if (!new)
+ return -ENOMEM;
+ new->paddr = paddr;
+ new->size = size;
+ list_add_tail(&new->list, vc_list);
+
+ return 0;
+}
+
static u64 __init get_vmcore_size_elf64(char *elfptr, size_t elfsz)
{
int i;
@@ -236,7 +250,6 @@ static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz,
for (i = 0; i < ehdr_ptr->e_phnum; i++, phdr_ptr++) {
int j;
void *notes_section;
- struct vmcore *new;
u64 offset, max_sz, sz, real_sz = 0;
if (phdr_ptr->p_type != PT_NOTE)
continue;
@@ -263,14 +276,11 @@ static int __init merge_note_headers_elf64(char *elfptr, size_t *elfsz,
}

/* Add this contiguous chunk of notes section to vmcore list.*/
- new = get_new_element();
- if (!new) {
+ if (vmcore_add(vc_list, phdr_ptr->p_offset, real_sz)) {
kfree(notes_section);
return -ENOMEM;
}
- new->paddr = phdr_ptr->p_offset;
- new->size = real_sz;
- list_add_tail(&new->list, vc_list);
+
phdr_sz += real_sz;
kfree(notes_section);
}
@@ -319,7 +329,6 @@ static int __init merge_note_headers_elf32(char *elfptr, size_t *elfsz,
for (i = 0; i < ehdr_ptr->e_phnum; i++, phdr_ptr++) {
int j;
void *notes_section;
- struct vmcore *new;
u64 offset, max_sz, sz, real_sz = 0;
if (phdr_ptr->p_type != PT_NOTE)
continue;
@@ -346,14 +355,11 @@ static int __init merge_note_headers_elf32(char *elfptr, size_t *elfsz,
}

/* Add this contiguous chunk of notes section to vmcore list.*/
- new = get_new_element();
- if (!new) {
+ if (vmcore_add(vc_list, phdr_ptr->p_offset, real_sz)) {
kfree(notes_section);
return -ENOMEM;
}
- new->paddr = phdr_ptr->p_offset;
- new->size = real_sz;
- list_add_tail(&new->list, vc_list);
+
phdr_sz += real_sz;
kfree(notes_section);
}
@@ -396,7 +402,6 @@ static int __init process_ptload_program_headers_elf64(char *elfptr,
Elf64_Ehdr *ehdr_ptr;
Elf64_Phdr *phdr_ptr;
loff_t vmcore_off;
- struct vmcore *new;

ehdr_ptr = (Elf64_Ehdr *)elfptr;
phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr)); /* PT_NOTE hdr */
@@ -409,12 +414,8 @@ static int __init process_ptload_program_headers_elf64(char *elfptr,
continue;

/* Add this contiguous chunk of memory to vmcore list.*/
- new = get_new_element();
- if (!new)
+ if (vmcore_add(vc_list, phdr_ptr->p_offset, phdr_ptr->p_memsz))
return -ENOMEM;
- new->paddr = phdr_ptr->p_offset;
- new->size = phdr_ptr->p_memsz;
- list_add_tail(&new->list, vc_list);

/* Update the program header offset. */
phdr_ptr->p_offset = vmcore_off;
@@ -431,7 +432,6 @@ static int __init process_ptload_program_headers_elf32(char *elfptr,
Elf32_Ehdr *ehdr_ptr;
Elf32_Phdr *phdr_ptr;
loff_t vmcore_off;
- struct vmcore *new;

ehdr_ptr = (Elf32_Ehdr *)elfptr;
phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr)); /* PT_NOTE hdr */
@@ -444,12 +444,8 @@ static int __init process_ptload_program_headers_elf32(char *elfptr,
continue;

/* Add this contiguous chunk of memory to vmcore list.*/
- new = get_new_element();
- if (!new)
+ if (vmcore_add(vc_list, phdr_ptr->p_offset, phdr_ptr->p_memsz))
return -ENOMEM;
- new->paddr = phdr_ptr->p_offset;
- new->size = phdr_ptr->p_memsz;
- list_add_tail(&new->list, vc_list);

/* Update the program header offset */
phdr_ptr->p_offset = vmcore_off;

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/