lkml.org 
[lkml]   [2018]   [Mar]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC, PATCH 09/22] mm, rmap: Add arch-specific field into anon_vma
    Date
    MKTME enabling requires a way to find out which encryption KeyID has to
    be used to access the page. There's not enough space in struct page to
    store this information.

    As a way out we can store it in anon_vma for the page: all pages in the
    same anon_vma tree will be encrypted with the same KeyID.

    This patch adds arch-specific field into anon_vma. For x86 it will be
    used to store KeyID.

    Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    ---
    include/linux/rmap.h | 6 ++++++
    mm/rmap.c | 15 ++++++++++++---
    2 files changed, 18 insertions(+), 3 deletions(-)

    diff --git a/include/linux/rmap.h b/include/linux/rmap.h
    index 988d176472df..54c7ea330827 100644
    --- a/include/linux/rmap.h
    +++ b/include/linux/rmap.h
    @@ -12,6 +12,10 @@
    #include <linux/memcontrol.h>
    #include <linux/highmem.h>

    +#ifndef arch_anon_vma
    +struct arch_anon_vma {};
    +#endif
    +
    /*
    * The anon_vma heads a list of private "related" vmas, to scan if
    * an anonymous page pointing to this anon_vma needs to be unmapped:
    @@ -59,6 +63,8 @@ struct anon_vma {

    /* Interval tree of private "related" vmas */
    struct rb_root_cached rb_root;
    +
    + struct arch_anon_vma arch_anon_vma;
    };

    /*
    diff --git a/mm/rmap.c b/mm/rmap.c
    index 47db27f8049e..c0470a69a4c9 100644
    --- a/mm/rmap.c
    +++ b/mm/rmap.c
    @@ -74,7 +74,14 @@
    static struct kmem_cache *anon_vma_cachep;
    static struct kmem_cache *anon_vma_chain_cachep;

    -static inline struct anon_vma *anon_vma_alloc(void)
    +#ifndef arch_anon_vma_init
    +static inline void arch_anon_vma_init(struct anon_vma *anon_vma,
    + struct vm_area_struct *vma)
    +{
    +}
    +#endif
    +
    +static inline struct anon_vma *anon_vma_alloc(struct vm_area_struct *vma)
    {
    struct anon_vma *anon_vma;

    @@ -88,6 +95,8 @@ static inline struct anon_vma *anon_vma_alloc(void)
    * from fork, the root will be reset to the parents anon_vma.
    */
    anon_vma->root = anon_vma;
    +
    + arch_anon_vma_init(anon_vma, vma);
    }

    return anon_vma;
    @@ -186,7 +195,7 @@ int __anon_vma_prepare(struct vm_area_struct *vma)
    anon_vma = find_mergeable_anon_vma(vma);
    allocated = NULL;
    if (!anon_vma) {
    - anon_vma = anon_vma_alloc();
    + anon_vma = anon_vma_alloc(vma);
    if (unlikely(!anon_vma))
    goto out_enomem_free_avc;
    allocated = anon_vma;
    @@ -337,7 +346,7 @@ int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma)
    return 0;

    /* Then add our own anon_vma. */
    - anon_vma = anon_vma_alloc();
    + anon_vma = anon_vma_alloc(vma);
    if (!anon_vma)
    goto out_error;
    avc = anon_vma_chain_alloc(GFP_KERNEL);
    --
    2.16.1
    \
     
     \ /
      Last update: 2018-03-05 17:32    [W:3.211 / U:0.272 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site