lkml.org 
[lkml]   [2015]   [May]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH 18/36] HMM: add new HMM page table flag (select flag).
Date
From: Jérôme Glisse <jglisse@redhat.com>

When migrating memory the same array for HMM page table entry might be
use with several different devices. Add a new select flag so current
device driver callback can know which entry are selected for the device.

Signed-off-by: Jérôme Glisse <jglisse@redhat.com>
---
include/linux/hmm_pt.h | 6 ++++--
mm/hmm.c | 5 ++++-
2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/include/linux/hmm_pt.h b/include/linux/hmm_pt.h
index 26cfe5e..36f7e00 100644
--- a/include/linux/hmm_pt.h
+++ b/include/linux/hmm_pt.h
@@ -77,8 +77,9 @@ static inline unsigned long hmm_pde_pfn(dma_addr_t pde)
#define HMM_PTE_VALID_DEV_BIT 0
#define HMM_PTE_VALID_DMA_BIT 1
#define HMM_PTE_VALID_PFN_BIT 2
-#define HMM_PTE_WRITE_BIT 3
-#define HMM_PTE_DIRTY_BIT 4
+#define HMM_PTE_SELECT 3
+#define HMM_PTE_WRITE_BIT 4
+#define HMM_PTE_DIRTY_BIT 5
/*
* Reserve some bits for device driver private flags. Note that thus can only
* be manipulated using the hmm_pte_*_bit() sets of helpers.
@@ -170,6 +171,7 @@ static inline bool hmm_pte_test_and_set_bit(dma_addr_t *ptep,
HMM_PTE_BIT_HELPER(valid_dev, HMM_PTE_VALID_DEV_BIT)
HMM_PTE_BIT_HELPER(valid_dma, HMM_PTE_VALID_DMA_BIT)
HMM_PTE_BIT_HELPER(valid_pfn, HMM_PTE_VALID_PFN_BIT)
+HMM_PTE_BIT_HELPER(select, HMM_PTE_SELECT)
HMM_PTE_BIT_HELPER(dirty, HMM_PTE_DIRTY_BIT)
HMM_PTE_BIT_HELPER(write, HMM_PTE_WRITE_BIT)

diff --git a/mm/hmm.c b/mm/hmm.c
index 2143a58..761905a 100644
--- a/mm/hmm.c
+++ b/mm/hmm.c
@@ -757,6 +757,7 @@ static int hmm_mirror_fault_hpmd(struct hmm_mirror *mirror,
hmm_pte[i] = hmm_pte_from_pfn(pfn);
if (pmd_write(*pmdp))
hmm_pte_set_write(&hmm_pte[i]);
+ hmm_pte_set_select(&hmm_pte[i]);
} while (addr = next, pfn++, i++, addr != hmm_end);
hmm_pt_iter_directory_unlock(iter, &mirror->pt);
mirror_fault->addr = addr;
@@ -826,6 +827,7 @@ static int hmm_mirror_fault_pmd(pmd_t *pmdp,
hmm_pte[i] = hmm_pte_from_pfn(pte_pfn(*ptep));
if (pte_write(*ptep))
hmm_pte_set_write(&hmm_pte[i]);
+ hmm_pte_set_select(&hmm_pte[i]);
} while (addr = next, ptep++, i++, addr != hmm_end);
hmm_pt_iter_directory_unlock(iter, &mirror->pt);
pte_unmap(ptep - 1);
@@ -864,7 +866,8 @@ static int hmm_mirror_dma_map(struct hmm_mirror *mirror,

again:
pte = ACCESS_ONCE(hmm_pte[i]);
- if (!hmm_pte_test_valid_pfn(&pte)) {
+ if (!hmm_pte_test_valid_pfn(&pte) ||
+ !hmm_pte_test_select(&pte)) {
if (!hmm_pte_test_valid_dma(&pte)) {
ret = -ENOENT;
break;
--
1.9.3


\
 
 \ /
  Last update: 2015-05-21 22:01    [W:0.394 / U:0.084 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site