From 3e8c30a857d98d36357e8d9bb04b7ccb72264543 Mon Sep 17 00:00:00 2001
From: Gerd Hoffmann <kraxel@redhat.com>
Date: Fri, 29 Sep 2017 08:59:34 +0200
Subject: [PATCH] fix locking
---
drivers/gpu/drm/i915/gvt/dmabuf.c | 26 +++++++++++++-------------
1 file changed, 13 insertions(+), 13 deletions(-)
@@ -84,24 +84,25 @@ static void intel_vgpu_fb_obj_release(struct kref *kref)
{
struct intel_vgpu_fb_obj *fb_obj =
container_of(kref, struct intel_vgpu_fb_obj, kref);
- struct intel_vgpu *vgpu;
- vgpu = fb_obj->vgpu;
- mutex_lock(&vgpu->fb_obj_list_lock);
list_del(&fb_obj->list);
- mutex_unlock(&vgpu->fb_obj_list_lock);
kfree(fb_obj);
}
static void intel_vgpu_gem_release(struct drm_i915_gem_object *obj)
{
+ struct intel_vgpu *vgpu;
+
if (WARN_ON(!obj->gvt || !obj->gvt->vgpu)) {
gvt_err("gvt info is invalid\n");
return;
}
- intel_gvt_hypervisor_put_vfio_device(obj->gvt->vgpu);
+ vgpu = obj->gvt->vgpu;
+ intel_gvt_hypervisor_put_vfio_device(vgpu);
+ mutex_lock(&vgpu->fb_obj_list_lock);
kref_put(&obj->gvt->kref, intel_vgpu_fb_obj_release);
+ mutex_unlock(&vgpu->fb_obj_list_lock);
obj->gvt = NULL;
}
@@ -239,7 +240,6 @@ intel_vgpu_pick_exposed_dmabuf(struct intel_vgpu *vgpu,
struct list_head *pos;
struct intel_vgpu_fb_obj *fb_obj;
- mutex_lock(&vgpu->fb_obj_list_lock);
list_for_each(pos, &vgpu->fb_obj_list_head) {
fb_obj = container_of(pos, struct intel_vgpu_fb_obj,
list);
@@ -251,11 +251,9 @@ intel_vgpu_pick_exposed_dmabuf(struct intel_vgpu *vgpu,
(fb_obj->fb.width == latest_info->width) &&
(fb_obj->fb.height == latest_info->height) &&
(fb_obj->fb.stride == latest_info->stride)) {
- mutex_unlock(&vgpu->fb_obj_list_lock);
return fb_obj;
}
}
- mutex_unlock(&vgpu->fb_obj_list_lock);
return NULL;
}
@@ -265,16 +263,13 @@ intel_vgpu_find_dmabuf(struct intel_vgpu *vgpu, u32 dmabuf_id)
struct list_head *pos;
struct intel_vgpu_fb_obj *fb_obj;
- mutex_lock(&vgpu->fb_obj_list_lock);
list_for_each(pos, &vgpu->fb_obj_list_head) {
fb_obj = container_of(pos, struct intel_vgpu_fb_obj,
list);
if (fb_obj->dmabuf_id == dmabuf_id) {
- mutex_unlock(&vgpu->fb_obj_list_lock);
return fb_obj;
}
}
- mutex_unlock(&vgpu->fb_obj_list_lock);
return NULL;
}
@@ -327,8 +322,10 @@ int intel_vgpu_query_plane(struct intel_vgpu *vgpu, void *args)
return ret;
/* If exists, pick up the exposed dmabuf fd */
+ mutex_lock(&vgpu->fb_obj_list_lock);
fb_obj = intel_vgpu_pick_exposed_dmabuf(vgpu, &fb_info);
if (fb_obj != NULL) {
+ mutex_unlock(&vgpu->fb_obj_list_lock);
update_fb_info(gvt_dmabuf, fb_obj);
return 0;
}
@@ -345,7 +342,6 @@ int intel_vgpu_query_plane(struct intel_vgpu *vgpu, void *args)
fb_obj->fb = fb_info;
fb_obj->dmabuf_id = id++;
- mutex_lock(&vgpu->fb_obj_list_lock);
list_add_tail(&fb_obj->list, &vgpu->fb_obj_list_head);
mutex_unlock(&vgpu->fb_obj_list_lock);
update_fb_info(gvt_dmabuf, fb_obj);
@@ -362,11 +358,15 @@ int intel_vgpu_get_dmabuf(struct intel_vgpu *vgpu, void *args)
struct dma_buf *dmabuf;
int ret;
+ mutex_lock(&vgpu->fb_obj_list_lock);
fb_obj = intel_vgpu_find_dmabuf(vgpu, gvt_dmabuf->dmabuf_id);
- if (NULL == fb_obj)
+ if (NULL == fb_obj) {
+ mutex_unlock(&vgpu->fb_obj_list_lock);
return -EINVAL;
+ }
obj = intel_vgpu_create_gem(dev, fb_obj);
+ mutex_unlock(&vgpu->fb_obj_list_lock);
if (obj == NULL) {
gvt_vgpu_err("create gvt gem obj failed:%d\n", vgpu->id);
return -ENOMEM;
--
2.9.3