When faulting or updating the device page table properly handle the case of
device memory entry.

Signed-off-by: Jérôme Glisse <jgli...@redhat.com>
---
 mm/hmm.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/mm/hmm.c b/mm/hmm.c
index a5706d2..9455443 100644
--- a/mm/hmm.c
+++ b/mm/hmm.c
@@ -616,6 +616,13 @@ static void hmm_mirror_update_pte(struct hmm_mirror 
*mirror,
                goto out;
        }
 
+       if (hmm_pte_test_valid_dev(hmm_pte)) {
+               *hmm_pte &= event->pte_mask;
+               if (!hmm_pte_test_valid_dev(hmm_pte))
+                       hmm_pt_iter_directory_unref(iter);
+               return;
+       }
+
        if (!hmm_pte_test_valid_dma(hmm_pte))
                return;
 
@@ -808,6 +815,12 @@ static int hmm_mirror_fault_pmd(pmd_t *pmdp,
                ptep = pte_offset_map(pmdp, start);
                hmm_pt_iter_directory_lock(iter);
                do {
+                       if (hmm_pte_test_valid_dev(&hmm_pte[i])) {
+                               if (write)
+                                       hmm_pte_set_write(&hmm_pte[i]);
+                               continue;
+                       }
+
                        if (!pte_present(*ptep) ||
                            (write && !pte_write(*ptep)) ||
                            pte_protnone(*ptep)) {
-- 
2.4.3

Reply via email to