mirror of
https://github.com/torvalds/linux.git
synced 2026-05-24 15:12:13 +02:00
drm/xe: Fix error paths of __xe_bo_create_locked
ttm_bo_init_reserved() calls the destroy() callback if it fails. Because of this, __xe_bo_create_locked is required to be responsible for freeing the bo even when it's passed in as argument. Additionally, if the placement check fails, the bo was kept alive. Fix it too. Reported-by: Oded Gabbay <ogabbay@kernel.org> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Reviewed-by: Matthew Brost <matthew.brost@intel.com> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
This commit is contained in:
parent
f82686ef74
commit
2a368a09ae
|
|
@ -1200,8 +1200,10 @@ struct xe_bo *__xe_bo_create_locked(struct xe_device *xe, struct xe_bo *bo,
|
|||
/* Only kernel objects should set GT */
|
||||
XE_WARN_ON(tile && type != ttm_bo_type_kernel);
|
||||
|
||||
if (XE_WARN_ON(!size))
|
||||
if (XE_WARN_ON(!size)) {
|
||||
xe_bo_free(bo);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
if (!bo) {
|
||||
bo = xe_bo_alloc();
|
||||
|
|
@ -1239,8 +1241,10 @@ struct xe_bo *__xe_bo_create_locked(struct xe_device *xe, struct xe_bo *bo,
|
|||
|
||||
if (!(flags & XE_BO_FIXED_PLACEMENT_BIT)) {
|
||||
err = __xe_bo_placement_for_flags(xe, bo, bo->flags);
|
||||
if (WARN_ON(err))
|
||||
if (WARN_ON(err)) {
|
||||
xe_ttm_bo_destroy(&bo->ttm);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
}
|
||||
|
||||
/* Defer populating type_sg bos */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user