From: Rob Clark <robdclark@gmail.com>
To: dri-devel@lists.freedesktop.org
Subject: [RFCv3 02/14] drm: convert crtc to ww_mutex
Date: Wed, 20 Nov 2013 15:48:01 -0500 [thread overview]
Message-ID: <1384980493-25499-3-git-send-email-robdclark@gmail.com> (raw)
In-Reply-To: <1384980493-25499-1-git-send-email-robdclark@gmail.com>
At the moment, this doesn't do anything. But for atomic we will have an
ww_acquire_ctx associated with the state, to simplify the locking and
avoid potential deadlock when we cannot control the locking order.
---
drivers/gpu/drm/drm_crtc.c | 20 +++++++++++---------
drivers/gpu/drm/i915/intel_display.c | 16 ++++++++--------
drivers/gpu/drm/omapdrm/omap_crtc.c | 10 +++++-----
drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 12 ++++++++----
include/drm/drm_crtc.h | 3 ++-
5 files changed, 34 insertions(+), 27 deletions(-)
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 81ac351..55f37db 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -52,7 +52,7 @@ void drm_modeset_lock_all(struct drm_device *dev)
mutex_lock(&dev->mode_config.mutex);
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head)
- mutex_lock_nest_lock(&crtc->mutex, &dev->mode_config.mutex);
+ mutex_lock_nest_lock(&crtc->mutex.base, &dev->mode_config.mutex);
}
EXPORT_SYMBOL(drm_modeset_lock_all);
@@ -65,7 +65,7 @@ void drm_modeset_unlock_all(struct drm_device *dev)
struct drm_crtc *crtc;
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head)
- mutex_unlock(&crtc->mutex);
+ ww_mutex_unlock(&crtc->mutex);
mutex_unlock(&dev->mode_config.mutex);
}
@@ -84,7 +84,7 @@ void drm_warn_on_modeset_not_all_locked(struct drm_device *dev)
return;
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head)
- WARN_ON(!mutex_is_locked(&crtc->mutex));
+ WARN_ON(!ww_mutex_is_locked(&crtc->mutex));
WARN_ON(!mutex_is_locked(&dev->mode_config.mutex));
}
@@ -613,6 +613,8 @@ void drm_framebuffer_remove(struct drm_framebuffer *fb)
}
EXPORT_SYMBOL(drm_framebuffer_remove);
+static DEFINE_WW_CLASS(crtc_ww_class);
+
/**
* drm_crtc_init - Initialise a new CRTC object
* @dev: DRM device
@@ -634,8 +636,8 @@ int drm_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
crtc->invert_dimensions = false;
drm_modeset_lock_all(dev);
- mutex_init(&crtc->mutex);
- mutex_lock_nest_lock(&crtc->mutex, &dev->mode_config.mutex);
+ ww_mutex_init(&crtc->mutex, &crtc_ww_class);
+ mutex_lock_nest_lock(&crtc->mutex.base, &dev->mode_config.mutex);
ret = drm_mode_object_get(dev, &crtc->base, DRM_MODE_OBJECT_CRTC);
if (ret)
@@ -2284,7 +2286,7 @@ static int drm_mode_cursor_common(struct drm_device *dev,
}
crtc = obj_to_crtc(obj);
- mutex_lock(&crtc->mutex);
+ ww_mutex_lock(&crtc->mutex, NULL);
if (req->flags & DRM_MODE_CURSOR_BO) {
if (!crtc->funcs->cursor_set && !crtc->funcs->cursor_set2) {
ret = -ENXIO;
@@ -2308,7 +2310,7 @@ static int drm_mode_cursor_common(struct drm_device *dev,
}
}
out:
- mutex_unlock(&crtc->mutex);
+ ww_mutex_unlock(&crtc->mutex);
return ret;
@@ -3657,7 +3659,7 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev,
return -ENOENT;
crtc = obj_to_crtc(obj);
- mutex_lock(&crtc->mutex);
+ ww_mutex_lock(&crtc->mutex, NULL);
if (crtc->fb == NULL) {
/* The framebuffer is currently unbound, presumably
* due to a hotplug event, that userspace has not
@@ -3741,7 +3743,7 @@ out:
drm_framebuffer_unreference(fb);
if (old_fb)
drm_framebuffer_unreference(old_fb);
- mutex_unlock(&crtc->mutex);
+ ww_mutex_unlock(&crtc->mutex);
return ret;
}
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 3cddd50..741188f 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -2232,11 +2232,11 @@ void intel_display_handle_reset(struct drm_device *dev)
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
- mutex_lock(&crtc->mutex);
+ ww_mutex_lock(&crtc->mutex, NULL);
if (intel_crtc->active)
dev_priv->display.update_plane(crtc, crtc->fb,
crtc->x, crtc->y);
- mutex_unlock(&crtc->mutex);
+ ww_mutex_unlock(&crtc->mutex);
}
}
@@ -7550,7 +7550,7 @@ bool intel_get_load_detect_pipe(struct drm_connector *connector,
if (encoder->crtc) {
crtc = encoder->crtc;
- mutex_lock(&crtc->mutex);
+ ww_mutex_lock(&crtc->mutex, NULL);
old->dpms_mode = connector->dpms;
old->load_detect_temp = false;
@@ -7581,7 +7581,7 @@ bool intel_get_load_detect_pipe(struct drm_connector *connector,
return false;
}
- mutex_lock(&crtc->mutex);
+ ww_mutex_lock(&crtc->mutex, NULL);
intel_encoder->new_crtc = to_intel_crtc(crtc);
to_intel_connector(connector)->new_encoder = intel_encoder;
@@ -7609,7 +7609,7 @@ bool intel_get_load_detect_pipe(struct drm_connector *connector,
DRM_DEBUG_KMS("reusing fbdev for load-detection framebuffer\n");
if (IS_ERR(fb)) {
DRM_DEBUG_KMS("failed to allocate framebuffer for load-detection\n");
- mutex_unlock(&crtc->mutex);
+ ww_mutex_unlock(&crtc->mutex);
return false;
}
@@ -7617,7 +7617,7 @@ bool intel_get_load_detect_pipe(struct drm_connector *connector,
DRM_DEBUG_KMS("failed to set mode on load-detect pipe\n");
if (old->release_fb)
old->release_fb->funcs->destroy(old->release_fb);
- mutex_unlock(&crtc->mutex);
+ ww_mutex_unlock(&crtc->mutex);
return false;
}
@@ -7648,7 +7648,7 @@ void intel_release_load_detect_pipe(struct drm_connector *connector,
drm_framebuffer_unreference(old->release_fb);
}
- mutex_unlock(&crtc->mutex);
+ ww_mutex_unlock(&crtc->mutex);
return;
}
@@ -7656,7 +7656,7 @@ void intel_release_load_detect_pipe(struct drm_connector *connector,
if (old->dpms_mode != DRM_MODE_DPMS_ON)
connector->funcs->dpms(connector, old->dpms_mode);
- mutex_unlock(&crtc->mutex);
+ ww_mutex_unlock(&crtc->mutex);
}
static int i9xx_pll_refclk(struct drm_device *dev,
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
index 5dd22ab..c09d29f 100644
--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
@@ -307,13 +307,13 @@ static void page_flip_worker(struct work_struct *work)
struct drm_display_mode *mode = &crtc->mode;
struct drm_gem_object *bo;
- mutex_lock(&crtc->mutex);
+ ww_mutex_lock(&crtc->mutex, NULL);
omap_plane_mode_set(omap_crtc->plane, crtc, crtc->fb,
0, 0, mode->hdisplay, mode->vdisplay,
crtc->x << 16, crtc->y << 16,
mode->hdisplay << 16, mode->vdisplay << 16,
vblank_cb, crtc);
- mutex_unlock(&crtc->mutex);
+ ww_mutex_unlock(&crtc->mutex);
bo = omap_framebuffer_bo(crtc->fb, 0);
drm_gem_object_unreference_unlocked(bo);
@@ -447,7 +447,7 @@ static void apply_worker(struct work_struct *work)
* the callbacks and list modification all serialized
* with respect to modesetting ioctls from userspace.
*/
- mutex_lock(&crtc->mutex);
+ ww_mutex_lock(&crtc->mutex, NULL);
dispc_runtime_get();
/*
@@ -492,7 +492,7 @@ static void apply_worker(struct work_struct *work)
out:
dispc_runtime_put();
- mutex_unlock(&crtc->mutex);
+ ww_mutex_unlock(&crtc->mutex);
}
int omap_crtc_apply(struct drm_crtc *crtc,
@@ -500,7 +500,7 @@ int omap_crtc_apply(struct drm_crtc *crtc,
{
struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
- WARN_ON(!mutex_is_locked(&crtc->mutex));
+ WARN_ON(!ww_mutex_is_locked(&crtc->mutex));
/* no need to queue it again if it is already queued: */
if (apply->queued)
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
index f91447c..7b3bf18 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
@@ -186,7 +186,7 @@ int vmw_du_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv,
* can do this since the caller in the drm core doesn't check anything
* which is protected by any looks.
*/
- mutex_unlock(&crtc->mutex);
+ ww_mutex_unlock(&crtc->mutex);
drm_modeset_lock_all(dev_priv->dev);
/* A lot of the code assumes this */
@@ -251,7 +251,9 @@ int vmw_du_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv,
ret = 0;
out:
drm_modeset_unlock_all(dev_priv->dev);
- mutex_lock(&crtc->mutex);
+// XXX umm, we probably need the state object here to properly
+// re-aquire the lock..
+ ww_mutex_lock(&crtc->mutex, NULL);
return ret;
}
@@ -272,7 +274,7 @@ int vmw_du_crtc_cursor_move(struct drm_crtc *crtc, int x, int y)
* can do this since the caller in the drm core doesn't check anything
* which is protected by any looks.
*/
- mutex_unlock(&crtc->mutex);
+ ww_mutex_unlock(&crtc->mutex);
drm_modeset_lock_all(dev_priv->dev);
vmw_cursor_update_position(dev_priv, shown,
@@ -280,7 +282,9 @@ int vmw_du_crtc_cursor_move(struct drm_crtc *crtc, int x, int y)
du->cursor_y + du->hotspot_y);
drm_modeset_unlock_all(dev_priv->dev);
- mutex_lock(&crtc->mutex);
+// XXX umm, we probably need the state object here to properly
+// re-aquire the lock..
+ ww_mutex_lock(&crtc->mutex, NULL);
return 0;
}
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index 0ca684a..3650254 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -27,6 +27,7 @@
#include <linux/i2c.h>
#include <linux/spinlock.h>
+#include <linux/ww_mutex.h>
#include <linux/types.h>
#include <linux/idr.h>
#include <linux/fb.h>
@@ -417,7 +418,7 @@ struct drm_crtc {
* state, ...) and a write lock for everything which can be update
* without a full modeset (fb, cursor data, ...)
*/
- struct mutex mutex;
+ struct ww_mutex mutex;
struct drm_mode_object base;
--
1.8.4.2
next prev parent reply other threads:[~2013-11-20 20:48 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-20 20:47 [RFCv3 00/14] Atomic/nuclear modeset/pageflip Rob Clark
2013-11-20 20:48 ` [RFCv3 01/14] drm: add atomic fxns Rob Clark
2013-11-20 20:48 ` Rob Clark [this message]
2013-11-21 14:11 ` [RFCv3 02/14] drm: convert crtc to ww_mutex Maarten Lankhorst
2013-11-21 15:12 ` Rob Clark
2013-11-20 20:48 ` [RFCv3 03/14] drm: add object property type Rob Clark
2013-11-20 20:48 ` [RFCv3 04/14] drm: add DRM_MODE_PROP_DYNAMIC property flag Rob Clark
2013-11-20 20:48 ` [RFCv3 05/14] drm: add DRM_MODE_PROP_SIGNED " Rob Clark
2013-11-20 20:48 ` [RFCv3 06/14] drm: helpers to find mode objects Rob Clark
2013-11-20 20:48 ` [RFCv3 07/14] drm: split propvals out and blob property support Rob Clark
2013-11-20 20:48 ` [RFCv3 08/14] drm: Allow drm_mode_object_find() to look up an object of any type Rob Clark
2013-11-20 20:48 ` [RFCv3 09/14] drm: Refactor object property check code Rob Clark
2013-11-20 20:48 ` [RFCv3 10/14] drm: convert plane to properties/state Rob Clark
2013-11-20 20:48 ` [RFCv3 11/14] drm: convert crtc " Rob Clark
2013-11-21 14:25 ` Maarten Lankhorst
2013-11-20 20:48 ` [RFCv3 12/14] drm: Atomic modeset ioctl Rob Clark
2013-11-22 8:35 ` Inki Dae
2013-11-22 12:34 ` Rob Clark
2013-11-20 20:48 ` [RFCv3 13/14] drm/msm: add atomic support Rob Clark
2013-11-20 20:48 ` [RFCv3 14/14] HACK: drm: allow FB's in drm_mode_object_find Rob Clark
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1384980493-25499-3-git-send-email-robdclark@gmail.com \
--to=robdclark@gmail.com \
--cc=dri-devel@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.