Merge branch 'hwpoison-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/ak/linux-mce-2.6

* 'hwpoison-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/ak/linux-mce-2.6:
HWPOISON: Stop shrinking at right page count
HWPOISON: Report correct address granuality for AO huge page errors
HWPOISON: Copy si_addr_lsb to user
page-types.c: fix name of unpoison interface

+15 -7
+1 -1
Documentation/vm/page-types.c
··· 478 } 479 480 if (opt_unpoison && !hwpoison_forget_fd) { 481 - sprintf(buf, "%s/renew-pfn", hwpoison_debug_fs); 482 hwpoison_forget_fd = checked_open(buf, O_WRONLY); 483 } 484 }
··· 478 } 479 480 if (opt_unpoison && !hwpoison_forget_fd) { 481 + sprintf(buf, "%s/unpoison-pfn", hwpoison_debug_fs); 482 hwpoison_forget_fd = checked_open(buf, O_WRONLY); 483 } 484 }
+8
kernel/signal.c
··· 2215 #ifdef __ARCH_SI_TRAPNO 2216 err |= __put_user(from->si_trapno, &to->si_trapno); 2217 #endif 2218 break; 2219 case __SI_CHLD: 2220 err |= __put_user(from->si_pid, &to->si_pid);
··· 2215 #ifdef __ARCH_SI_TRAPNO 2216 err |= __put_user(from->si_trapno, &to->si_trapno); 2217 #endif 2218 + #ifdef BUS_MCEERR_AO 2219 + /* 2220 + * Other callers might not initialize the si_lsb field, 2221 + * so check explicitely for the right codes here. 2222 + */ 2223 + if (from->si_code == BUS_MCEERR_AR || from->si_code == BUS_MCEERR_AO) 2224 + err |= __put_user(from->si_addr_lsb, &to->si_addr_lsb); 2225 + #endif 2226 break; 2227 case __SI_CHLD: 2228 err |= __put_user(from->si_pid, &to->si_pid);
+6 -6
mm/memory-failure.c
··· 183 * signal. 184 */ 185 static int kill_proc_ao(struct task_struct *t, unsigned long addr, int trapno, 186 - unsigned long pfn) 187 { 188 struct siginfo si; 189 int ret; ··· 198 #ifdef __ARCH_SI_TRAPNO 199 si.si_trapno = trapno; 200 #endif 201 - si.si_addr_lsb = PAGE_SHIFT; 202 /* 203 * Don't use force here, it's convenient if the signal 204 * can be temporarily blocked. ··· 235 int nr; 236 do { 237 nr = shrink_slab(1000, GFP_KERNEL, 1000); 238 - if (page_count(p) == 0) 239 break; 240 } while (nr > 10); 241 } ··· 327 * wrong earlier. 328 */ 329 static void kill_procs_ao(struct list_head *to_kill, int doit, int trapno, 330 - int fail, unsigned long pfn) 331 { 332 struct to_kill *tk, *next; 333 ··· 352 * process anyways. 353 */ 354 else if (kill_proc_ao(tk->tsk, tk->addr, trapno, 355 - pfn) < 0) 356 printk(KERN_ERR 357 "MCE %#lx: Cannot send advisory machine check signal to %s:%d\n", 358 pfn, tk->tsk->comm, tk->tsk->pid); ··· 928 * any accesses to the poisoned memory. 929 */ 930 kill_procs_ao(&tokill, !!PageDirty(hpage), trapno, 931 - ret != SWAP_SUCCESS, pfn); 932 933 return ret; 934 }
··· 183 * signal. 184 */ 185 static int kill_proc_ao(struct task_struct *t, unsigned long addr, int trapno, 186 + unsigned long pfn, struct page *page) 187 { 188 struct siginfo si; 189 int ret; ··· 198 #ifdef __ARCH_SI_TRAPNO 199 si.si_trapno = trapno; 200 #endif 201 + si.si_addr_lsb = compound_order(compound_head(page)) + PAGE_SHIFT; 202 /* 203 * Don't use force here, it's convenient if the signal 204 * can be temporarily blocked. ··· 235 int nr; 236 do { 237 nr = shrink_slab(1000, GFP_KERNEL, 1000); 238 + if (page_count(p) == 1) 239 break; 240 } while (nr > 10); 241 } ··· 327 * wrong earlier. 328 */ 329 static void kill_procs_ao(struct list_head *to_kill, int doit, int trapno, 330 + int fail, struct page *page, unsigned long pfn) 331 { 332 struct to_kill *tk, *next; 333 ··· 352 * process anyways. 353 */ 354 else if (kill_proc_ao(tk->tsk, tk->addr, trapno, 355 + pfn, page) < 0) 356 printk(KERN_ERR 357 "MCE %#lx: Cannot send advisory machine check signal to %s:%d\n", 358 pfn, tk->tsk->comm, tk->tsk->pid); ··· 928 * any accesses to the poisoned memory. 929 */ 930 kill_procs_ao(&tokill, !!PageDirty(hpage), trapno, 931 + ret != SWAP_SUCCESS, p, pfn); 932 933 return ret; 934 }