[Intel-xe] [PATCH v5 2/7] Revert "drm/xe: Use atomic instead of mutex for xe_device_mem_access_ongoing"
Matthew Auld
matthew.auld at intel.com
Wed May 17 15:22:39 UTC 2023
This reverts commit c3712d924f6b5022498f4357009943c326389f9c.
We add a similar version back, once we fix the locking inside
xe_device_mem_access.
Signed-off-by: Matthew Auld <matthew.auld at intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi at intel.com>
---
drivers/gpu/drm/xe/xe_device.c | 18 ++++++++++--------
drivers/gpu/drm/xe/xe_device.h | 18 ++++++++++++------
drivers/gpu/drm/xe/xe_device_types.h | 4 +++-
3 files changed, 25 insertions(+), 15 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
index f7f6a6a97757..d0297ee432b2 100644
--- a/drivers/gpu/drm/xe/xe_device.c
+++ b/drivers/gpu/drm/xe/xe_device.c
@@ -216,6 +216,8 @@ struct xe_device *xe_device_create(struct pci_dev *pdev,
if (err)
goto err_put;
+ drmm_mutex_init(&xe->drm, &xe->mem_access.lock);
+
return xe;
err_put:
@@ -404,25 +406,25 @@ u32 xe_device_ccs_bytes(struct xe_device *xe, u64 size)
void xe_device_mem_access_get(struct xe_device *xe)
{
bool resumed = xe_pm_runtime_resume_if_suspended(xe);
- int ref = atomic_inc_return(&xe->mem_access.ref);
- if (ref == 1)
+ mutex_lock(&xe->mem_access.lock);
+ if (xe->mem_access.ref++ == 0)
xe->mem_access.hold_rpm = xe_pm_runtime_get_if_active(xe);
+ mutex_unlock(&xe->mem_access.lock);
/* The usage counter increased if device was immediately resumed */
if (resumed)
xe_pm_runtime_put(xe);
- XE_WARN_ON(ref == S32_MAX);
+ XE_WARN_ON(xe->mem_access.ref == S32_MAX);
}
void xe_device_mem_access_put(struct xe_device *xe)
{
- bool hold = xe->mem_access.hold_rpm;
- int ref = atomic_dec_return(&xe->mem_access.ref);
-
- if (!ref && hold)
+ mutex_lock(&xe->mem_access.lock);
+ if (--xe->mem_access.ref == 0 && xe->mem_access.hold_rpm)
xe_pm_runtime_put(xe);
+ mutex_unlock(&xe->mem_access.lock);
- XE_WARN_ON(ref < 0);
+ XE_WARN_ON(xe->mem_access.ref < 0);
}
diff --git a/drivers/gpu/drm/xe/xe_device.h b/drivers/gpu/drm/xe/xe_device.h
index cbae480a2092..9ab7e6134f89 100644
--- a/drivers/gpu/drm/xe/xe_device.h
+++ b/drivers/gpu/drm/xe/xe_device.h
@@ -90,14 +90,20 @@ static inline struct xe_force_wake * gt_to_fw(struct xe_gt *gt)
void xe_device_mem_access_get(struct xe_device *xe);
void xe_device_mem_access_put(struct xe_device *xe);
-static inline bool xe_device_mem_access_ongoing(struct xe_device *xe)
-{
- return atomic_read(&xe->mem_access.ref);
-}
-
static inline void xe_device_assert_mem_access(struct xe_device *xe)
{
- XE_WARN_ON(!xe_device_mem_access_ongoing(xe));
+ XE_WARN_ON(!xe->mem_access.ref);
+}
+
+static inline bool xe_device_mem_access_ongoing(struct xe_device *xe)
+{
+ bool ret;
+
+ mutex_lock(&xe->mem_access.lock);
+ ret = xe->mem_access.ref;
+ mutex_unlock(&xe->mem_access.lock);
+
+ return ret;
}
static inline bool xe_device_in_fault_mode(struct xe_device *xe)
diff --git a/drivers/gpu/drm/xe/xe_device_types.h b/drivers/gpu/drm/xe/xe_device_types.h
index cbd18b839236..0b6860156574 100644
--- a/drivers/gpu/drm/xe/xe_device_types.h
+++ b/drivers/gpu/drm/xe/xe_device_types.h
@@ -256,8 +256,10 @@ struct xe_device {
* triggering additional actions when they occur.
*/
struct {
+ /** @lock: protect the ref count */
+ struct mutex lock;
/** @ref: ref count of memory accesses */
- atomic_t ref;
+ s32 ref;
/** @hold_rpm: need to put rpm ref back at the end */
bool hold_rpm;
} mem_access;
--
2.40.1
More information about the Intel-xe
mailing list