hugetlb: add missing unlock in avoidcopy path in hugetlb_cow()
This patch fixes possible deadlock in hugepage lock_page() by adding missing unlock_page(). libhugetlbfs test will hit this bug when the next patch in this patchset ("hugetlb, HWPOISON: move PG_HWPoison bit check") is applied. Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com> Signed-off-by: Jun'ichi Nomura <j-nomura@ce.jp.nec.com> Acked-by: Fengguang Wu <fengguang.wu@intel.com> Signed-off-by: Andi Kleen <ak@linux.intel.com>
This commit is contained in:
committed by
Andi Kleen
parent
e3390f67a7
commit
28957a5467
@@ -2324,9 +2324,11 @@ retry_avoidcopy:
|
|||||||
* and just make the page writable */
|
* and just make the page writable */
|
||||||
avoidcopy = (page_mapcount(old_page) == 1);
|
avoidcopy = (page_mapcount(old_page) == 1);
|
||||||
if (avoidcopy) {
|
if (avoidcopy) {
|
||||||
if (!trylock_page(old_page))
|
if (!trylock_page(old_page)) {
|
||||||
if (PageAnon(old_page))
|
if (PageAnon(old_page))
|
||||||
page_move_anon_rmap(old_page, vma, address);
|
page_move_anon_rmap(old_page, vma, address);
|
||||||
|
} else
|
||||||
|
unlock_page(old_page);
|
||||||
set_huge_ptep_writable(vma, address, ptep);
|
set_huge_ptep_writable(vma, address, ptep);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user