lkml.org 
[lkml]   [2017]   [Jul]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.12 122/196] drm/i915/gvt: Fix inconsistent locks holding sequence
    Date
    4.12-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Chuanxiao Dong <chuanxiao.dong@intel.com>

    commit f16bd3dda2c8bf6699e808cd9cc540cfab10e60e upstream.

    There are two kinds of locking sequence.

    One is in the thread which is started by vfio ioctl to do
    the iommu unmapping. The locking sequence is:
    down_read(&group_lock) ----> mutex_lock(&cached_lock)

    The other is in the vfio release thread which will unpin all
    the cached pages. The lock sequence is:
    mutex_lock(&cached_lock) ---> down_read(&group_lock)

    And, the cache_lock is used to protect the rb tree of the cache
    node and doing vfio unpin doesn't require this lock. Move the
    vfio unpin out of the cache_lock protected region.

    v2:
    - use for style instead of do{}while(1). (Zhenyu)

    Fixes: f30437c5e7bf ("drm/i915/gvt: add KVMGT support")
    Signed-off-by: Chuanxiao Dong <chuanxiao.dong@intel.com>
    Cc: Zhenyu Wang <zhenyuw@linux.intel.com>
    Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/gpu/drm/i915/gvt/kvmgt.c | 14 +++++++++-----
    1 file changed, 9 insertions(+), 5 deletions(-)

    --- a/drivers/gpu/drm/i915/gvt/kvmgt.c
    +++ b/drivers/gpu/drm/i915/gvt/kvmgt.c
    @@ -232,16 +232,20 @@ static void gvt_cache_destroy(struct int
    struct device *dev = mdev_dev(vgpu->vdev.mdev);
    unsigned long gfn;

    - mutex_lock(&vgpu->vdev.cache_lock);
    - while ((node = rb_first(&vgpu->vdev.cache))) {
    + for (;;) {
    + mutex_lock(&vgpu->vdev.cache_lock);
    + node = rb_first(&vgpu->vdev.cache);
    + if (!node) {
    + mutex_unlock(&vgpu->vdev.cache_lock);
    + break;
    + }
    dma = rb_entry(node, struct gvt_dma, node);
    gvt_dma_unmap_iova(vgpu, dma->iova);
    gfn = dma->gfn;
    -
    - vfio_unpin_pages(dev, &gfn, 1);
    __gvt_cache_remove_entry(vgpu, dma);
    + mutex_unlock(&vgpu->vdev.cache_lock);
    + vfio_unpin_pages(dev, &gfn, 1);
    }
    - mutex_unlock(&vgpu->vdev.cache_lock);
    }

    static struct intel_vgpu_type *intel_gvt_find_vgpu_type(struct intel_gvt *gvt,

    \
     
     \ /
      Last update: 2017-07-25 21:46    [W:3.080 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site