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 17/36] HMM: add new HMM page table flag (valid device memory).
    Date
    From: Jérôme Glisse <jglisse@redhat.com>

    For memory migrated to device we need a new type of memory entry.

    Signed-off-by: Jérôme Glisse <jglisse@redhat.com>
    Signed-off-by: Sherry Cheung <SCheung@nvidia.com>
    Signed-off-by: Subhash Gutti <sgutti@nvidia.com>
    Signed-off-by: Mark Hairgrove <mhairgrove@nvidia.com>
    Signed-off-by: John Hubbard <jhubbard@nvidia.com>
    Signed-off-by: Jatin Kumar <jakumar@nvidia.com>
    ---
    include/linux/hmm_pt.h | 24 +++++++++++++++++++-----
    1 file changed, 19 insertions(+), 5 deletions(-)

    diff --git a/include/linux/hmm_pt.h b/include/linux/hmm_pt.h
    index 78a9073..26cfe5e 100644
    --- a/include/linux/hmm_pt.h
    +++ b/include/linux/hmm_pt.h
    @@ -74,10 +74,11 @@ static inline unsigned long hmm_pde_pfn(dma_addr_t pde)
    * In the first case the device driver must ignore any pfn entry as they might
    * show as transient state while HMM is mapping the page.
    */
    -#define HMM_PTE_VALID_DMA_BIT 0
    -#define HMM_PTE_VALID_PFN_BIT 1
    -#define HMM_PTE_WRITE_BIT 2
    -#define HMM_PTE_DIRTY_BIT 3
    +#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
    /*
    * Reserve some bits for device driver private flags. Note that thus can only
    * be manipulated using the hmm_pte_*_bit() sets of helpers.
    @@ -85,7 +86,7 @@ static inline unsigned long hmm_pde_pfn(dma_addr_t pde)
    * WARNING ONLY SET/CLEAR THOSE FLAG ON PTE ENTRY THAT HAVE THE VALID BIT SET
    * AS OTHERWISE ANY BIT SET BY THE DRIVER WILL BE OVERWRITTEN BY HMM.
    */
    -#define HMM_PTE_HW_SHIFT 4
    +#define HMM_PTE_HW_SHIFT 8

    #define HMM_PTE_PFN_MASK (~((dma_addr_t)((1 << PAGE_SHIFT) - 1)))
    #define HMM_PTE_DMA_MASK (~((dma_addr_t)((1 << PAGE_SHIFT) - 1)))
    @@ -166,6 +167,7 @@ static inline bool hmm_pte_test_and_set_bit(dma_addr_t *ptep,
    HMM_PTE_TEST_AND_CLEAR_BIT(name, bit)\
    HMM_PTE_TEST_AND_SET_BIT(name, bit)

    +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(dirty, HMM_PTE_DIRTY_BIT)
    @@ -176,11 +178,23 @@ static inline dma_addr_t hmm_pte_from_pfn(dma_addr_t pfn)
    return (pfn << PAGE_SHIFT) | (1 << HMM_PTE_VALID_PFN_BIT);
    }

    +static inline dma_addr_t hmm_pte_from_dev_addr(dma_addr_t dma_addr)
    +{
    + return (dma_addr & HMM_PTE_DMA_MASK) | (1 << HMM_PTE_VALID_DEV_BIT);
    +}
    +
    static inline dma_addr_t hmm_pte_from_dma_addr(dma_addr_t dma_addr)
    {
    return (dma_addr & HMM_PTE_DMA_MASK) | (1 << HMM_PTE_VALID_DMA_BIT);
    }

    +static inline dma_addr_t hmm_pte_dev_addr(dma_addr_t pte)
    +{
    + /* FIXME Use max dma addr instead of 0 ? */
    + return hmm_pte_test_valid_dev(&pte) ? (pte & HMM_PTE_DMA_MASK) :
    + (dma_addr_t)-1UL;
    +}
    +
    static inline dma_addr_t hmm_pte_dma_addr(dma_addr_t pte)
    {
    /* FIXME Use max dma addr instead of 0 ? */
    --
    1.9.3


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