lkml.org 
[lkml]   [2022]   [Aug]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[RFC PATCH 03/28] mm: introduce __find_vma to be used without mmap_lock protection
    From
    Add __find_vma function to be used for VMA lookup under rcu protection.

    Signed-off-by: Suren Baghdasaryan <surenb@google.com>
    ---
    drivers/gpu/drm/i915/i915_gpu_error.c | 4 ++--
    include/linux/mm.h | 9 ++++++++-
    mm/mmap.c | 6 ++----
    3 files changed, 12 insertions(+), 7 deletions(-)

    diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c
    index 32e92651ef7c..fc94985c95c8 100644
    --- a/drivers/gpu/drm/i915/i915_gpu_error.c
    +++ b/drivers/gpu/drm/i915/i915_gpu_error.c
    @@ -507,7 +507,7 @@ static void error_print_context(struct drm_i915_error_state_buf *m,
    }

    static struct i915_vma_coredump *
    -__find_vma(struct i915_vma_coredump *vma, const char *name)
    +__i915_find_vma(struct i915_vma_coredump *vma, const char *name)
    {
    while (vma) {
    if (strcmp(vma->name, name) == 0)
    @@ -521,7 +521,7 @@ __find_vma(struct i915_vma_coredump *vma, const char *name)
    struct i915_vma_coredump *
    intel_gpu_error_find_batch(const struct intel_engine_coredump *ee)
    {
    - return __find_vma(ee->vma, "batch");
    + return __i915_find_vma(ee->vma, "batch");
    }

    static void error_print_engine(struct drm_i915_error_state_buf *m,
    diff --git a/include/linux/mm.h b/include/linux/mm.h
    index 21f8b27bd9fd..7d322a979455 100644
    --- a/include/linux/mm.h
    +++ b/include/linux/mm.h
    @@ -2712,7 +2712,14 @@ extern int expand_upwards(struct vm_area_struct *vma, unsigned long address);
    #endif

    /* Look up the first VMA which satisfies addr < vm_end, NULL if none. */
    -extern struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr);
    +extern struct vm_area_struct *__find_vma(struct mm_struct *mm, unsigned long addr);
    +static inline
    +struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr)
    +{
    + mmap_assert_locked(mm);
    + return __find_vma(mm, addr);
    +}
    +
    extern struct vm_area_struct * find_vma_prev(struct mm_struct * mm, unsigned long addr,
    struct vm_area_struct **pprev);

    diff --git a/mm/mmap.c b/mm/mmap.c
    index 9d780f415be3..693e6776be39 100644
    --- a/mm/mmap.c
    +++ b/mm/mmap.c
    @@ -2250,12 +2250,11 @@ get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,
    EXPORT_SYMBOL(get_unmapped_area);

    /* Look up the first VMA which satisfies addr < vm_end, NULL if none. */
    -struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr)
    +struct vm_area_struct *__find_vma(struct mm_struct *mm, unsigned long addr)
    {
    struct rb_node *rb_node;
    struct vm_area_struct *vma;

    - mmap_assert_locked(mm);
    /* Check the cache first. */
    vma = vmacache_find(mm, addr);
    if (likely(vma))
    @@ -2281,8 +2280,7 @@ struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr)
    vmacache_update(addr, vma);
    return vma;
    }
    -
    -EXPORT_SYMBOL(find_vma);
    +EXPORT_SYMBOL(__find_vma);

    /*
    * Same as find_vma, but also return a pointer to the previous VMA in *pprev.
    --
    2.37.2.672.g94769d06f0-goog
    \
     
     \ /
      Last update: 2022-08-29 23:26    [W:3.067 / U:0.620 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site