mirror of https://gitee.com/openkylin/linux.git
drm: simplify the locking in the GETCRTC ioctl
No need to grab both plane and crtc locks at the same time, we can do them one after the other. If userspace races it'll get what it deserves either way. This removes another user of drm_modeset_lock_crtc. There's only one left. v2: Make sure all access to primary->state is properly protected (Harry). Cc: Harry Wentland <harry.wentland@amd.com> Reviewed-by: Harry Wentland <harry.wentland@amd.com> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/20170328070145.21520-1-daniel.vetter@ffwll.ch
This commit is contained in:
parent
043e7fb6e6
commit
2c77bb29d3
|
@ -406,9 +406,9 @@ int drm_mode_getcrtc(struct drm_device *dev,
|
||||||
if (!crtc)
|
if (!crtc)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
|
|
||||||
drm_modeset_lock_crtc(crtc, crtc->primary);
|
|
||||||
crtc_resp->gamma_size = crtc->gamma_size;
|
crtc_resp->gamma_size = crtc->gamma_size;
|
||||||
|
|
||||||
|
drm_modeset_lock(&crtc->primary->mutex, NULL);
|
||||||
if (crtc->primary->state && crtc->primary->state->fb)
|
if (crtc->primary->state && crtc->primary->state->fb)
|
||||||
crtc_resp->fb_id = crtc->primary->state->fb->base.id;
|
crtc_resp->fb_id = crtc->primary->state->fb->base.id;
|
||||||
else if (!crtc->primary->state && crtc->primary->fb)
|
else if (!crtc->primary->state && crtc->primary->fb)
|
||||||
|
@ -416,9 +416,14 @@ int drm_mode_getcrtc(struct drm_device *dev,
|
||||||
else
|
else
|
||||||
crtc_resp->fb_id = 0;
|
crtc_resp->fb_id = 0;
|
||||||
|
|
||||||
if (crtc->state) {
|
if (crtc->primary->state) {
|
||||||
crtc_resp->x = crtc->primary->state->src_x >> 16;
|
crtc_resp->x = crtc->primary->state->src_x >> 16;
|
||||||
crtc_resp->y = crtc->primary->state->src_y >> 16;
|
crtc_resp->y = crtc->primary->state->src_y >> 16;
|
||||||
|
}
|
||||||
|
drm_modeset_unlock(&crtc->primary->mutex);
|
||||||
|
|
||||||
|
drm_modeset_lock(&crtc->mutex, NULL);
|
||||||
|
if (crtc->state) {
|
||||||
if (crtc->state->enable) {
|
if (crtc->state->enable) {
|
||||||
drm_mode_convert_to_umode(&crtc_resp->mode, &crtc->state->mode);
|
drm_mode_convert_to_umode(&crtc_resp->mode, &crtc->state->mode);
|
||||||
crtc_resp->mode_valid = 1;
|
crtc_resp->mode_valid = 1;
|
||||||
|
@ -437,7 +442,7 @@ int drm_mode_getcrtc(struct drm_device *dev,
|
||||||
crtc_resp->mode_valid = 0;
|
crtc_resp->mode_valid = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
drm_modeset_unlock_crtc(crtc);
|
drm_modeset_unlock(&crtc->mutex);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12468,6 +12468,11 @@ static int intel_atomic_check(struct drm_device *dev,
|
||||||
ret = drm_atomic_helper_check_modeset(dev, state);
|
ret = drm_atomic_helper_check_modeset(dev, state);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
/* enocder->atomic_check might upgrade some crtc to a full modeset */
|
||||||
|
ret = drm_atomic_helper_check_modeset(dev, state);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
|
||||||
for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, crtc_state, i) {
|
for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, crtc_state, i) {
|
||||||
struct intel_crtc_state *pipe_config =
|
struct intel_crtc_state *pipe_config =
|
||||||
|
|
Loading…
Reference in New Issue