Skip to content

Commit 8b694b4

Browse files
jlawrynokwachows
authored andcommitted
accel/ivpu: Fix page fault in ivpu_bo_unbind_all_bos_from_context()
Don't add BO to the vdev->bo_list in ivpu_gem_create_object(). When failure happens inside drm_gem_shmem_create(), the BO is not fully created and ivpu_gem_bo_free() callback will not be called causing a deleted BO to be left on the list. Fixes: 8d88e4c ("accel/ivpu: Use GEM shmem helper for all buffers") Signed-off-by: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com> Signed-off-by: Maciej Falkowski <maciej.falkowski@linux.intel.com> Reviewed-by: Karol Wachowski <karol.wachowski@linux.intel.com> Signed-off-by: Karol Wachowski <karol.wachowski@linux.intel.com> Link: https://lore.kernel.org/r/20250925145114.1446283-1-maciej.falkowski@linux.intel.com
1 parent e0c0891 commit 8b694b4

1 file changed

Lines changed: 16 additions & 6 deletions

File tree

drivers/accel/ivpu/ivpu_gem.c

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,6 @@ void ivpu_bo_unbind_all_bos_from_context(struct ivpu_device *vdev, struct ivpu_m
194194

195195
struct drm_gem_object *ivpu_gem_create_object(struct drm_device *dev, size_t size)
196196
{
197-
struct ivpu_device *vdev = to_ivpu_device(dev);
198197
struct ivpu_bo *bo;
199198

200199
if (size == 0 || !PAGE_ALIGNED(size))
@@ -209,20 +208,17 @@ struct drm_gem_object *ivpu_gem_create_object(struct drm_device *dev, size_t siz
209208

210209
INIT_LIST_HEAD(&bo->bo_list_node);
211210

212-
mutex_lock(&vdev->bo_list_lock);
213-
list_add_tail(&bo->bo_list_node, &vdev->bo_list);
214-
mutex_unlock(&vdev->bo_list_lock);
215-
216-
ivpu_dbg(vdev, BO, " alloc: bo %8p size %9zu\n", bo, size);
217211
return &bo->base.base;
218212
}
219213

220214
struct drm_gem_object *ivpu_gem_prime_import(struct drm_device *dev,
221215
struct dma_buf *dma_buf)
222216
{
217+
struct ivpu_device *vdev = to_ivpu_device(dev);
223218
struct device *attach_dev = dev->dev;
224219
struct dma_buf_attachment *attach;
225220
struct drm_gem_object *obj;
221+
struct ivpu_bo *bo;
226222
int ret;
227223

228224
attach = dma_buf_attach(dma_buf, attach_dev);
@@ -240,6 +236,14 @@ struct drm_gem_object *ivpu_gem_prime_import(struct drm_device *dev,
240236
obj->import_attach = attach;
241237
obj->resv = dma_buf->resv;
242238

239+
bo = to_ivpu_bo(obj);
240+
241+
mutex_lock(&vdev->bo_list_lock);
242+
list_add_tail(&bo->bo_list_node, &vdev->bo_list);
243+
mutex_unlock(&vdev->bo_list_lock);
244+
245+
ivpu_dbg(vdev, BO, "import: bo %8p size %9zu\n", bo, ivpu_bo_size(bo));
246+
243247
return obj;
244248

245249
fail_detach:
@@ -270,6 +274,12 @@ static struct ivpu_bo *ivpu_bo_alloc(struct ivpu_device *vdev, u64 size, u32 fla
270274
bo->base.map_wc = flags & DRM_IVPU_BO_WC;
271275
bo->flags = flags;
272276

277+
mutex_lock(&vdev->bo_list_lock);
278+
list_add_tail(&bo->bo_list_node, &vdev->bo_list);
279+
mutex_unlock(&vdev->bo_list_lock);
280+
281+
ivpu_dbg(vdev, BO, " alloc: bo %8p size %9llu\n", bo, size);
282+
273283
return bo;
274284
}
275285

0 commit comments

Comments
 (0)