lkml.org 
[lkml]   [2022]   [Aug]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v13 37/70] cxl: remove vma linked list walk
    Date
    From: "Matthew Wilcox (Oracle)" <willy@infradead.org>

    Use the VMA iterator instead. This requires a little restructuring of the
    surrounding code to hoist the mm to the caller. That turns
    cxl_prefault_one() into a trivial function, so call cxl_fault_segment()
    directly.

    Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
    Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
    Acked-by: Vlastimil Babka <vbabka@suse.cz>
    ---
    drivers/misc/cxl/fault.c | 45 ++++++++++++++--------------------------
    1 file changed, 15 insertions(+), 30 deletions(-)

    diff --git a/drivers/misc/cxl/fault.c b/drivers/misc/cxl/fault.c
    index 60c829113299..2c64f55cf01f 100644
    --- a/drivers/misc/cxl/fault.c
    +++ b/drivers/misc/cxl/fault.c
    @@ -280,22 +280,6 @@ void cxl_handle_fault(struct work_struct *fault_work)
    mmput(mm);
    }

    -static void cxl_prefault_one(struct cxl_context *ctx, u64 ea)
    -{
    - struct mm_struct *mm;
    -
    - mm = get_mem_context(ctx);
    - if (mm == NULL) {
    - pr_devel("cxl_prefault_one unable to get mm %i\n",
    - pid_nr(ctx->pid));
    - return;
    - }
    -
    - cxl_fault_segment(ctx, mm, ea);
    -
    - mmput(mm);
    -}
    -
    static u64 next_segment(u64 ea, u64 vsid)
    {
    if (vsid & SLB_VSID_B_1T)
    @@ -306,23 +290,16 @@ static u64 next_segment(u64 ea, u64 vsid)
    return ea + 1;
    }

    -static void cxl_prefault_vma(struct cxl_context *ctx)
    +static void cxl_prefault_vma(struct cxl_context *ctx, struct mm_struct *mm)
    {
    u64 ea, last_esid = 0;
    struct copro_slb slb;
    + VMA_ITERATOR(vmi, mm, 0);
    struct vm_area_struct *vma;
    int rc;
    - struct mm_struct *mm;
    -
    - mm = get_mem_context(ctx);
    - if (mm == NULL) {
    - pr_devel("cxl_prefault_vm unable to get mm %i\n",
    - pid_nr(ctx->pid));
    - return;
    - }

    mmap_read_lock(mm);
    - for (vma = mm->mmap; vma; vma = vma->vm_next) {
    + for_each_vma(vmi, vma) {
    for (ea = vma->vm_start; ea < vma->vm_end;
    ea = next_segment(ea, slb.vsid)) {
    rc = copro_calculate_slb(mm, ea, &slb);
    @@ -337,20 +314,28 @@ static void cxl_prefault_vma(struct cxl_context *ctx)
    }
    }
    mmap_read_unlock(mm);
    -
    - mmput(mm);
    }

    void cxl_prefault(struct cxl_context *ctx, u64 wed)
    {
    + struct mm_struct *mm = get_mem_context(ctx);
    +
    + if (mm == NULL) {
    + pr_devel("cxl_prefault unable to get mm %i\n",
    + pid_nr(ctx->pid));
    + return;
    + }
    +
    switch (ctx->afu->prefault_mode) {
    case CXL_PREFAULT_WED:
    - cxl_prefault_one(ctx, wed);
    + cxl_fault_segment(ctx, mm, wed);
    break;
    case CXL_PREFAULT_ALL:
    - cxl_prefault_vma(ctx);
    + cxl_prefault_vma(ctx, mm);
    break;
    default:
    break;
    }
    +
    + mmput(mm);
    }
    --
    2.35.1
    \
     
     \ /
      Last update: 2022-08-22 17:10    [W:5.030 / U:0.104 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site