]> git.hungrycats.org Git - linux/commitdiff
Fix incomplete backport of commit 0f792cf949a0
authorZefan Li <lizefan@huawei.com>
Sun, 9 Oct 2016 11:06:49 +0000 (19:06 +0800)
committerZefan Li <lizefan@huawei.com>
Wed, 26 Oct 2016 15:15:44 +0000 (23:15 +0800)
Signed-off-by: Zefan Li <lizefan@huawei.com>
mm/hugetlb.c

index 416cbfd92ec8f048fc07adb1e63853221361f4b6..6726bfea86237ce97b581d855bcd9076615e5986 100644 (file)
@@ -2929,13 +2929,17 @@ out_page_table_lock:
                unlock_page(pagecache_page);
                put_page(pagecache_page);
        }
-       if (page != pagecache_page)
-               unlock_page(page);
-       put_page(page);
-
 out_mutex:
        mutex_unlock(&hugetlb_instantiation_mutex);
-
+       /*
+        * Generally it's safe to hold refcount during waiting page lock. But
+        * here we just wait to defer the next page fault to avoid busy loop and
+        * the page is not used after unlocked before returning from the current
+        * page fault. So we are safe from accessing freed page, even if we wait
+        * here without taking refcount.
+        */
+       if (need_wait_lock)
+               wait_on_page_locked(page);
        return ret;
 }