summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/xe/xe_device.c
diff options
context:
space:
mode:
authorGustavo Sousa <gustavo.sousa@intel.com>2023-05-19 00:56:51 +0300
committerRodrigo Vivi <rodrigo.vivi@intel.com>2023-12-20 02:34:00 +0300
commitc93b6de7cc7610a269afe0e84a0b3e2b81a746cd (patch)
tree6f9f584ca8734d0715ca42eb2a6699acc2f88a7f /drivers/gpu/drm/xe/xe_device.c
parentb67ece5b173375451de5c3a562c43aaf410001c5 (diff)
downloadlinux-c93b6de7cc7610a269afe0e84a0b3e2b81a746cd.tar.xz
drm/xe: Fail xe_device_create() if wq allocation fails
Let's make sure we give the driver a valid workqueue. While at it, also make sure to call destroy_workqueue() only if the workqueue is a valid one. That is necessary because xe_device_destroy() is indirectly called as part of the cleanup process of a failed xe_device_create(). Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com> Link: https://lore.kernel.org/r/20230518215651.502159-3-gustavo.sousa@intel.com Signed-off-by: Gustavo Sousa <gustavo.sousa@intel.com> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Diffstat (limited to 'drivers/gpu/drm/xe/xe_device.c')
-rw-r--r--drivers/gpu/drm/xe/xe_device.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
index 42456d044827..2c65eb84e6e9 100644
--- a/drivers/gpu/drm/xe/xe_device.c
+++ b/drivers/gpu/drm/xe/xe_device.c
@@ -10,6 +10,7 @@
#include <drm/drm_gem_ttm_helper.h>
#include <drm/drm_ioctl.h>
#include <drm/drm_managed.h>
+#include <drm/drm_print.h>
#include <drm/xe_drm.h>
#include "regs/xe_regs.h"
@@ -157,7 +158,9 @@ static void xe_device_destroy(struct drm_device *dev, void *dummy)
{
struct xe_device *xe = to_xe_device(dev);
- destroy_workqueue(xe->ordered_wq);
+ if (xe->ordered_wq)
+ destroy_workqueue(xe->ordered_wq);
+
ttm_device_fini(&xe->ttm);
}
@@ -205,6 +208,11 @@ struct xe_device *xe_device_create(struct pci_dev *pdev,
INIT_LIST_HEAD(&xe->pinned.evicted);
xe->ordered_wq = alloc_ordered_workqueue("xe-ordered-wq", 0);
+ if (!xe->ordered_wq) {
+ drm_err(&xe->drm, "Failed to allocate xe-ordered-wq\n");
+ err = -ENOMEM;
+ goto err_put;
+ }
drmm_mutex_init(&xe->drm, &xe->sb_lock);
xe->enabled_irq_mask = ~0;