mm/memory-failure.c clean up around tk pre-allocation
Subsystems (2)
[email protected]
maintainerPATCH 71/158 mm/memory-failure.c clean up around tk pre-allocation
From: Jane Chu <[email protected]>
Subject: mm/memory-failure.c clean up around tk pre-allocation
add_to_kill() expects the first 'tk' to be pre-allocated, it makes subsequent allocations on need basis, this makes the code a bit difficult to read. Move all the allocation internal to add_to_kill() and drop the **tk argument.
Signed-off-by Jane Chu <[email protected]>
Reviewed-by Dan Williams <[email protected]>
Acked-by Naoya Horiguchi <[email protected]>
Cc Michal Hocko <[email protected]>
Signed-off-by Andrew Morton <[email protected]>
---
mm/memory-failure.c | 40 +++++++++++++--------------------------- 1 file changed, 13 insertions(+), 27 deletions(-)
mm/memory-failure.c renamed from mm/memory-failure.c~mm-memory-failurec-clean-up-around-tk-pre-allocation +13 -27
@@ -303,25 +303,19 @@ static unsigned long dev_pagemap_mapping/* * Schedule a process for later kill. * Uses GFP_ATOMIC allocations to avoid potential recursions in the VM. -* TBD would GFP_NOIO be enough? */ static void add_to_kill (struct task_struct *tsk,struct page *p,struct vm_area_struct *vma, -struct list_head *to_kill, -struct to_kill **tkc) +struct list_head *to_kill) {struct to_kill *tk; -if (*tkc) { - tk = *tkc; - *tkc =NULL ; - }else { - tk =kmalloc (sizeof (struct to_kill ),GFP_ATOMIC ); -if (!tk) { -pr_err ("Memory failure: Out of memory while machine check handling\n" ); -return ; - } + tk =kmalloc (sizeof (struct to_kill ),GFP_ATOMIC ); +if (!tk) { +pr_err ("Memory failure: Out of memory while machine check handling\n" ); +return ; } + tk->addr =page_address_in_vma (p, vma);if (is_zone_device_page (p)) tk->size_shift =dev_pagemap_mapping_shift (p, vma);
@@ -345,6 +339,7 @@ static void add_to_kill(struct task_strukfree (tk);return ; } +get_task_struct (tsk); tk->tsk = tsk;list_add_tail (&tk->nd, to_kill);
@@ -436,7 +431,7 @@ static struct task_struct *task_early_ki* Collect processes when the error hit an anonymous page. */ static void collect_procs_anon (struct page *page,struct list_head *to_kill, -struct to_kill **tkc,int force_early) +int force_early) {struct vm_area_struct *vma;struct task_struct *tsk;
@@ -461,7 +456,7 @@ static void collect_procs_anon(struct paif (!page_mapped_in_vma (page, vma))continue ;if (vma->vm_mm == t->mm) -add_to_kill (t, page, vma, to_kill, tkc); +add_to_kill (t, page, vma, to_kill); } }read_unlock (&tasklist_lock);
@@ -472,7 +467,7 @@ static void collect_procs_anon(struct pa* Collect processes when the error hit a file mapped page. */ static void collect_procs_file (struct page *page,struct list_head *to_kill, -struct to_kill **tkc,int force_early) +int force_early) {struct vm_area_struct *vma;struct task_struct *tsk;
@@ -496,7 +491,7 @@ static void collect_procs_file(struct pa* to be informed of all such data corruptions. */ if (vma->vm_mm == t->mm) -add_to_kill (t, page, vma, to_kill, tkc); +add_to_kill (t, page, vma, to_kill); } }read_unlock (&tasklist_lock);
@@ -505,26 +500,17 @@ static void collect_procs_file(struct pa/* * Collect the processes who have the corrupted page mapped to kill. -* This is done in two steps for locking reasons. -* First preallocate one tokill structure outside the spin locks, -* so that we can kill at least one process reasonably reliable. */ static void collect_procs (struct page *page,struct list_head *tokill,int force_early) { -struct to_kill *tk; -if (!page->mapping)return ; - tk =kmalloc (sizeof (struct to_kill ),GFP_NOIO ); -if (!tk) -return ;if (PageAnon (page)) -collect_procs_anon (page, tokill, &tk, force_early); +collect_procs_anon (page, tokill, force_early);else -collect_procs_file (page, tokill, &tk, force_early); -kfree (tk); +collect_procs_file (page, tokill, force_early); }static const char *action_name[] = {
_