|
@@ -1577,7 +1577,14 @@ gotten:
|
|
entry = mk_pte(new_page, vma->vm_page_prot);
|
|
entry = mk_pte(new_page, vma->vm_page_prot);
|
|
entry = maybe_mkwrite(pte_mkdirty(entry), vma);
|
|
entry = maybe_mkwrite(pte_mkdirty(entry), vma);
|
|
lazy_mmu_prot_update(entry);
|
|
lazy_mmu_prot_update(entry);
|
|
- ptep_establish(vma, address, page_table, entry);
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Clear the pte entry and flush it first, before updating the
|
|
|
|
+ * pte with the new entry. This will avoid a race condition
|
|
|
|
+ * seen in the presence of one thread doing SMC and another
|
|
|
|
+ * thread doing COW.
|
|
|
|
+ */
|
|
|
|
+ ptep_clear_flush(vma, address, page_table);
|
|
|
|
+ set_pte_at(mm, address, page_table, entry);
|
|
update_mmu_cache(vma, address, entry);
|
|
update_mmu_cache(vma, address, entry);
|
|
lru_cache_add_active(new_page);
|
|
lru_cache_add_active(new_page);
|
|
page_add_new_anon_rmap(new_page, vma, address);
|
|
page_add_new_anon_rmap(new_page, vma, address);
|