lkml.org 
[lkml]   [2011]   [Mar]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/6] mm: factor out main logic of access_process_vm
    Date
    Introduce an internal helper __access_remote_vm and base access_process_vm on
    top of it. This new method may be called with a NULL task_struct if page fault
    accounting is not desired. This code will be shared with a new address space
    accessor that is independent of task_struct.

    Signed-off-by: Stephen Wilson <wilsons@start.ca>
    ---
    mm/memory.c | 35 +++++++++++++++++++++++++----------
    1 files changed, 25 insertions(+), 10 deletions(-)

    diff --git a/mm/memory.c b/mm/memory.c
    index 36445e3..68eec4f 100644
    --- a/mm/memory.c
    +++ b/mm/memory.c
    @@ -3593,20 +3593,15 @@ int generic_access_phys(struct vm_area_struct *vma, unsigned long addr,
    #endif

    /*
    - * Access another process' address space.
    - * Source/target buffer must be kernel space,
    - * Do not walk the page table directly, use get_user_pages
    + * Access another process' address space as given in mm. If non-NULL, use the
    + * given task for page fault accounting.
    */
    -int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write)
    +static int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm,
    + unsigned long addr, void *buf, int len, int write)
    {
    - struct mm_struct *mm;
    struct vm_area_struct *vma;
    void *old_buf = buf;

    - mm = get_task_mm(tsk);
    - if (!mm)
    - return 0;
    -
    down_read(&mm->mmap_sem);
    /* ignore errors, just check how much was successfully transferred */
    while (len) {
    @@ -3655,12 +3650,32 @@ int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, in
    addr += bytes;
    }
    up_read(&mm->mmap_sem);
    - mmput(mm);

    return buf - old_buf;
    }

    /*
    + * Access another process' address space.
    + * Source/target buffer must be kernel space,
    + * Do not walk the page table directly, use get_user_pages
    + */
    +int access_process_vm(struct task_struct *tsk, unsigned long addr,
    + void *buf, int len, int write)
    +{
    + struct mm_struct *mm;
    + int ret;
    +
    + mm = get_task_mm(tsk);
    + if (!mm)
    + return 0;
    +
    + ret = __access_remote_vm(tsk, mm, addr, buf, len, write);
    + mmput(mm);
    +
    + return ret;
    +}
    +
    +/*
    * Print the name of a VMA.
    */
    void print_vma_addr(char *prefix, unsigned long ip)
    --
    1.7.3.5


    \
     
     \ /
      Last update: 2011-03-09 01:45    [W:3.189 / U:0.108 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site