diff options
| author | Ingo Molnar <mingo@elte.hu> | 2010-10-18 12:43:43 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2010-10-18 12:43:46 -0400 |
| commit | f2f108eb4511f22a6f7568090cfcf4e7b2dc0f62 (patch) | |
| tree | 4b75771ec02543372808c7df31a1a65e37fdb361 /mm/memory-failure.c | |
| parent | 756b0322e50aebc4b9afb4488a2d3f6c802b4e64 (diff) | |
| parent | 2b666ca4a68cbc22483b0f2e1ba3c0e59b01ae9e (diff) | |
Merge branch 'linus' into core/locking
Merge reason: Update to almost-final-.36
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'mm/memory-failure.c')
| -rw-r--r-- | mm/memory-failure.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 9c26eeca1342..757f6b0accfe 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c | |||
| @@ -183,7 +183,7 @@ EXPORT_SYMBOL_GPL(hwpoison_filter); | |||
| 183 | * signal. | 183 | * signal. |
| 184 | */ | 184 | */ |
| 185 | static int kill_proc_ao(struct task_struct *t, unsigned long addr, int trapno, | 185 | static int kill_proc_ao(struct task_struct *t, unsigned long addr, int trapno, |
| 186 | unsigned long pfn) | 186 | unsigned long pfn, struct page *page) |
| 187 | { | 187 | { |
| 188 | struct siginfo si; | 188 | struct siginfo si; |
| 189 | int ret; | 189 | int ret; |
| @@ -198,7 +198,7 @@ static int kill_proc_ao(struct task_struct *t, unsigned long addr, int trapno, | |||
| 198 | #ifdef __ARCH_SI_TRAPNO | 198 | #ifdef __ARCH_SI_TRAPNO |
| 199 | si.si_trapno = trapno; | 199 | si.si_trapno = trapno; |
| 200 | #endif | 200 | #endif |
| 201 | si.si_addr_lsb = PAGE_SHIFT; | 201 | si.si_addr_lsb = compound_order(compound_head(page)) + PAGE_SHIFT; |
| 202 | /* | 202 | /* |
| 203 | * Don't use force here, it's convenient if the signal | 203 | * Don't use force here, it's convenient if the signal |
| 204 | * can be temporarily blocked. | 204 | * can be temporarily blocked. |
| @@ -235,7 +235,7 @@ void shake_page(struct page *p, int access) | |||
| 235 | int nr; | 235 | int nr; |
| 236 | do { | 236 | do { |
| 237 | nr = shrink_slab(1000, GFP_KERNEL, 1000); | 237 | nr = shrink_slab(1000, GFP_KERNEL, 1000); |
| 238 | if (page_count(p) == 0) | 238 | if (page_count(p) == 1) |
| 239 | break; | 239 | break; |
| 240 | } while (nr > 10); | 240 | } while (nr > 10); |
| 241 | } | 241 | } |
| @@ -327,7 +327,7 @@ static void add_to_kill(struct task_struct *tsk, struct page *p, | |||
| 327 | * wrong earlier. | 327 | * wrong earlier. |
| 328 | */ | 328 | */ |
| 329 | static void kill_procs_ao(struct list_head *to_kill, int doit, int trapno, | 329 | static void kill_procs_ao(struct list_head *to_kill, int doit, int trapno, |
| 330 | int fail, unsigned long pfn) | 330 | int fail, struct page *page, unsigned long pfn) |
| 331 | { | 331 | { |
| 332 | struct to_kill *tk, *next; | 332 | struct to_kill *tk, *next; |
| 333 | 333 | ||
| @@ -352,7 +352,7 @@ static void kill_procs_ao(struct list_head *to_kill, int doit, int trapno, | |||
| 352 | * process anyways. | 352 | * process anyways. |
| 353 | */ | 353 | */ |
| 354 | else if (kill_proc_ao(tk->tsk, tk->addr, trapno, | 354 | else if (kill_proc_ao(tk->tsk, tk->addr, trapno, |
| 355 | pfn) < 0) | 355 | pfn, page) < 0) |
| 356 | printk(KERN_ERR | 356 | printk(KERN_ERR |
| 357 | "MCE %#lx: Cannot send advisory machine check signal to %s:%d\n", | 357 | "MCE %#lx: Cannot send advisory machine check signal to %s:%d\n", |
| 358 | pfn, tk->tsk->comm, tk->tsk->pid); | 358 | pfn, tk->tsk->comm, tk->tsk->pid); |
| @@ -928,7 +928,7 @@ static int hwpoison_user_mappings(struct page *p, unsigned long pfn, | |||
| 928 | * any accesses to the poisoned memory. | 928 | * any accesses to the poisoned memory. |
| 929 | */ | 929 | */ |
| 930 | kill_procs_ao(&tokill, !!PageDirty(hpage), trapno, | 930 | kill_procs_ao(&tokill, !!PageDirty(hpage), trapno, |
| 931 | ret != SWAP_SUCCESS, pfn); | 931 | ret != SWAP_SUCCESS, p, pfn); |
| 932 | 932 | ||
| 933 | return ret; | 933 | return ret; |
| 934 | } | 934 | } |
