return -EINVAL;
drm_modeset_lock_all(dev);
+ drm_modeset_set_locker_all(dev, current);
arg_obj = drm_mode_object_find(dev, arg->obj_id, arg->obj_type);
if (!arg_obj) {
drm_property_change_valid_put(property, ref);
out:
+ drm_modeset_set_locker_all(dev, NULL);
drm_modeset_unlock_all(dev);
return ret;
}
struct drm_mode_set *modeset;
int ret = 0;
int i;
+ bool need_lock = current != drm_modeset_get_locker_all(dev);
if (oops_in_progress)
return -EBUSY;
- drm_modeset_lock_all(dev);
+ if (need_lock) {
+ drm_modeset_lock_all(dev);
+ }
+
if (!drm_fb_helper_is_bound(fb_helper)) {
- drm_modeset_unlock_all(dev);
- return -EBUSY;
+ ret = -EBUSY;
+ goto unlock;
}
if (fb_helper->atomic) {
}
}
unlock:
- drm_modeset_unlock_all(dev);
+ if (need_lock) {
+ drm_modeset_unlock_all(dev);
+ }
return ret;
}
EXPORT_SYMBOL(drm_fb_helper_pan_display);
return 0;
}
EXPORT_SYMBOL(drm_modeset_lock_all_crtcs);
+
+struct task_struct *drm_modeset_get_locker_all(struct drm_device *dev)
+{
+#if defined(CONFIG_MUTEX_SPIN_ON_OWNER)
+ return ((struct mutex *)&dev->mode_config.mutex)->owner;
+#endif
+ return NULL;
+}
+EXPORT_SYMBOL(drm_modeset_get_locker_all);
+
+void drm_modeset_set_locker_all(struct drm_device *dev,
+ struct task_struct *locker)
+{
+#if defined(CONFIG_MUTEX_SPIN_ON_OWNER)
+ ((struct mutex *)&dev->mode_config.mutex)->owner = locker;
+#endif
+}
+EXPORT_SYMBOL(drm_modeset_set_locker_all);
struct drm_crtc *crtc;
int i, j, ret = 0;
int start;
+ bool need_lock = current != drm_modeset_get_locker_all(dev);
+
+ if (need_lock) {
+ drm_modeset_lock_all(dev);
+ }
- drm_modeset_lock_all(dev);
if (!vigs_fbdev_helper_is_bound(fb_helper)) {
- drm_modeset_unlock_all(dev);
- return -EBUSY;
+ ret = -EBUSY;
+ goto out;
}
for (i = 0; i < fb_helper->crtc_count; i++) {
}
out:
- drm_modeset_unlock_all(dev);
+ if (need_lock) {
+ drm_modeset_unlock_all(dev);
+ }
return ret;
}
int drm_modeset_lock_all_crtcs(struct drm_device *dev,
struct drm_modeset_acquire_ctx *ctx);
+struct task_struct *drm_modeset_get_locker_all(struct drm_device *dev);
+
+void drm_modeset_set_locker_all(struct drm_device *dev,
+ struct task_struct *locker);
+
#endif /* DRM_MODESET_LOCK_H_ */