在 2014-05-14三的 11:21 -0400,Naoya Horiguchi写道: > When a memory error happens on an in-use page or (free and in-use) hugepage, > the victim page is isolated with its refcount set to one. When you try to > unpoison it later, unpoison_memory() calls put_page() for it twice in order to > bring the page back to free page pool (buddy or free hugepage list.) > However, if another memory error occurs on the page which we are unpoisoning, > memory_failure() returns without releasing the refcount which was incremented > in the same call at first, which results in memory leak and unconsistent > num_poisoned_pages statistics. This patch fixes it. We assume that a new memory error occurs on the hugepage which we are unpoisoning. A unpoisoned B poisoned C hugepage: |---------------+++++++++++++++++| There are two cases, so shown. 1. the victim page belongs to A-B, the memory_failure will be blocked by lock_page() until unlock_page() invoked by unpoison_memory(). 2. the victim page belongs to B-C, the memory_failure() will return very soon at the beginning of this function. So the new memory error will have no effect what you say so. thx! cyc > > Signed-off-by: Naoya Horiguchi <n-horiguchi@xxxxxxxxxxxxx> > Cc: <stable@xxxxxxxxxxxxxxx> [2.6.32+] > --- > mm/memory-failure.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git next-20140512.orig/mm/memory-failure.c next-20140512/mm/memory-failure.c > index 9872af1b1e9d..93a08bd78c78 100644 > --- next-20140512.orig/mm/memory-failure.c > +++ next-20140512/mm/memory-failure.c > @@ -1153,6 +1153,8 @@ int memory_failure(unsigned long pfn, int trapno, int flags) > */ > if (!PageHWPoison(p)) { > printk(KERN_ERR "MCE %#lx: just unpoisoned\n", pfn); > + atomic_long_sub(nr_pages, &num_poisoned_pages); > + put_page(hpage); > res = 0; > goto out; > } -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>