|
@@ -1208,7 +1208,7 @@ static void commit_tail(struct drm_atomic_state *state)
|
|
|
|
|
|
drm_atomic_helper_commit_cleanup_done(state);
|
|
drm_atomic_helper_commit_cleanup_done(state);
|
|
|
|
|
|
- drm_atomic_state_free(state);
|
|
|
|
|
|
+ drm_atomic_state_put(state);
|
|
}
|
|
}
|
|
|
|
|
|
static void commit_work(struct work_struct *work)
|
|
static void commit_work(struct work_struct *work)
|
|
@@ -1290,6 +1290,7 @@ int drm_atomic_helper_commit(struct drm_device *dev,
|
|
* make sure work items don't artifically stall on each another.
|
|
* make sure work items don't artifically stall on each another.
|
|
*/
|
|
*/
|
|
|
|
|
|
|
|
+ drm_atomic_state_get(state);
|
|
if (nonblock)
|
|
if (nonblock)
|
|
queue_work(system_unbound_wq, &state->commit_work);
|
|
queue_work(system_unbound_wq, &state->commit_work);
|
|
else
|
|
else
|
|
@@ -1591,7 +1592,7 @@ EXPORT_SYMBOL(drm_atomic_helper_commit_hw_done);
|
|
*
|
|
*
|
|
* This signals completion of the atomic update @state, including any cleanup
|
|
* This signals completion of the atomic update @state, including any cleanup
|
|
* work. If used, it must be called right before calling
|
|
* work. If used, it must be called right before calling
|
|
- * drm_atomic_state_free().
|
|
|
|
|
|
+ * drm_atomic_state_put().
|
|
*
|
|
*
|
|
* This is part of the atomic helper support for nonblocking commits, see
|
|
* This is part of the atomic helper support for nonblocking commits, see
|
|
* drm_atomic_helper_setup_commit() for an overview.
|
|
* drm_atomic_helper_setup_commit() for an overview.
|
|
@@ -2114,18 +2115,13 @@ retry:
|
|
state->legacy_cursor_update = true;
|
|
state->legacy_cursor_update = true;
|
|
|
|
|
|
ret = drm_atomic_commit(state);
|
|
ret = drm_atomic_commit(state);
|
|
- if (ret != 0)
|
|
|
|
- goto fail;
|
|
|
|
-
|
|
|
|
- /* Driver takes ownership of state on successful commit. */
|
|
|
|
- return 0;
|
|
|
|
fail:
|
|
fail:
|
|
if (ret == -EDEADLK)
|
|
if (ret == -EDEADLK)
|
|
goto backoff;
|
|
goto backoff;
|
|
|
|
|
|
- drm_atomic_state_free(state);
|
|
|
|
-
|
|
|
|
|
|
+ drm_atomic_state_put(state);
|
|
return ret;
|
|
return ret;
|
|
|
|
+
|
|
backoff:
|
|
backoff:
|
|
drm_atomic_state_clear(state);
|
|
drm_atomic_state_clear(state);
|
|
drm_atomic_legacy_backoff(state);
|
|
drm_atomic_legacy_backoff(state);
|
|
@@ -2187,18 +2183,13 @@ retry:
|
|
goto fail;
|
|
goto fail;
|
|
|
|
|
|
ret = drm_atomic_commit(state);
|
|
ret = drm_atomic_commit(state);
|
|
- if (ret != 0)
|
|
|
|
- goto fail;
|
|
|
|
-
|
|
|
|
- /* Driver takes ownership of state on successful commit. */
|
|
|
|
- return 0;
|
|
|
|
fail:
|
|
fail:
|
|
if (ret == -EDEADLK)
|
|
if (ret == -EDEADLK)
|
|
goto backoff;
|
|
goto backoff;
|
|
|
|
|
|
- drm_atomic_state_free(state);
|
|
|
|
-
|
|
|
|
|
|
+ drm_atomic_state_put(state);
|
|
return ret;
|
|
return ret;
|
|
|
|
+
|
|
backoff:
|
|
backoff:
|
|
drm_atomic_state_clear(state);
|
|
drm_atomic_state_clear(state);
|
|
drm_atomic_legacy_backoff(state);
|
|
drm_atomic_legacy_backoff(state);
|
|
@@ -2327,18 +2318,13 @@ retry:
|
|
goto fail;
|
|
goto fail;
|
|
|
|
|
|
ret = drm_atomic_commit(state);
|
|
ret = drm_atomic_commit(state);
|
|
- if (ret != 0)
|
|
|
|
- goto fail;
|
|
|
|
-
|
|
|
|
- /* Driver takes ownership of state on successful commit. */
|
|
|
|
- return 0;
|
|
|
|
fail:
|
|
fail:
|
|
if (ret == -EDEADLK)
|
|
if (ret == -EDEADLK)
|
|
goto backoff;
|
|
goto backoff;
|
|
|
|
|
|
- drm_atomic_state_free(state);
|
|
|
|
-
|
|
|
|
|
|
+ drm_atomic_state_put(state);
|
|
return ret;
|
|
return ret;
|
|
|
|
+
|
|
backoff:
|
|
backoff:
|
|
drm_atomic_state_clear(state);
|
|
drm_atomic_state_clear(state);
|
|
drm_atomic_legacy_backoff(state);
|
|
drm_atomic_legacy_backoff(state);
|
|
@@ -2480,11 +2466,8 @@ int drm_atomic_helper_disable_all(struct drm_device *dev,
|
|
}
|
|
}
|
|
|
|
|
|
err = drm_atomic_commit(state);
|
|
err = drm_atomic_commit(state);
|
|
-
|
|
|
|
free:
|
|
free:
|
|
- if (err < 0)
|
|
|
|
- drm_atomic_state_free(state);
|
|
|
|
-
|
|
|
|
|
|
+ drm_atomic_state_put(state);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(drm_atomic_helper_disable_all);
|
|
EXPORT_SYMBOL(drm_atomic_helper_disable_all);
|
|
@@ -2535,7 +2518,7 @@ retry:
|
|
|
|
|
|
err = drm_atomic_helper_disable_all(dev, &ctx);
|
|
err = drm_atomic_helper_disable_all(dev, &ctx);
|
|
if (err < 0) {
|
|
if (err < 0) {
|
|
- drm_atomic_state_free(state);
|
|
|
|
|
|
+ drm_atomic_state_put(state);
|
|
state = ERR_PTR(err);
|
|
state = ERR_PTR(err);
|
|
goto unlock;
|
|
goto unlock;
|
|
}
|
|
}
|
|
@@ -2624,18 +2607,13 @@ retry:
|
|
goto fail;
|
|
goto fail;
|
|
|
|
|
|
ret = drm_atomic_commit(state);
|
|
ret = drm_atomic_commit(state);
|
|
- if (ret != 0)
|
|
|
|
- goto fail;
|
|
|
|
-
|
|
|
|
- /* Driver takes ownership of state on successful commit. */
|
|
|
|
- return 0;
|
|
|
|
fail:
|
|
fail:
|
|
if (ret == -EDEADLK)
|
|
if (ret == -EDEADLK)
|
|
goto backoff;
|
|
goto backoff;
|
|
|
|
|
|
- drm_atomic_state_free(state);
|
|
|
|
-
|
|
|
|
|
|
+ drm_atomic_state_put(state);
|
|
return ret;
|
|
return ret;
|
|
|
|
+
|
|
backoff:
|
|
backoff:
|
|
drm_atomic_state_clear(state);
|
|
drm_atomic_state_clear(state);
|
|
drm_atomic_legacy_backoff(state);
|
|
drm_atomic_legacy_backoff(state);
|
|
@@ -2684,18 +2662,13 @@ retry:
|
|
goto fail;
|
|
goto fail;
|
|
|
|
|
|
ret = drm_atomic_commit(state);
|
|
ret = drm_atomic_commit(state);
|
|
- if (ret != 0)
|
|
|
|
- goto fail;
|
|
|
|
-
|
|
|
|
- /* Driver takes ownership of state on successful commit. */
|
|
|
|
- return 0;
|
|
|
|
fail:
|
|
fail:
|
|
if (ret == -EDEADLK)
|
|
if (ret == -EDEADLK)
|
|
goto backoff;
|
|
goto backoff;
|
|
|
|
|
|
- drm_atomic_state_free(state);
|
|
|
|
-
|
|
|
|
|
|
+ drm_atomic_state_put(state);
|
|
return ret;
|
|
return ret;
|
|
|
|
+
|
|
backoff:
|
|
backoff:
|
|
drm_atomic_state_clear(state);
|
|
drm_atomic_state_clear(state);
|
|
drm_atomic_legacy_backoff(state);
|
|
drm_atomic_legacy_backoff(state);
|
|
@@ -2744,18 +2717,13 @@ retry:
|
|
goto fail;
|
|
goto fail;
|
|
|
|
|
|
ret = drm_atomic_commit(state);
|
|
ret = drm_atomic_commit(state);
|
|
- if (ret != 0)
|
|
|
|
- goto fail;
|
|
|
|
-
|
|
|
|
- /* Driver takes ownership of state on successful commit. */
|
|
|
|
- return 0;
|
|
|
|
fail:
|
|
fail:
|
|
if (ret == -EDEADLK)
|
|
if (ret == -EDEADLK)
|
|
goto backoff;
|
|
goto backoff;
|
|
|
|
|
|
- drm_atomic_state_free(state);
|
|
|
|
-
|
|
|
|
|
|
+ drm_atomic_state_put(state);
|
|
return ret;
|
|
return ret;
|
|
|
|
+
|
|
backoff:
|
|
backoff:
|
|
drm_atomic_state_clear(state);
|
|
drm_atomic_state_clear(state);
|
|
drm_atomic_legacy_backoff(state);
|
|
drm_atomic_legacy_backoff(state);
|
|
@@ -2828,18 +2796,13 @@ retry:
|
|
}
|
|
}
|
|
|
|
|
|
ret = drm_atomic_nonblocking_commit(state);
|
|
ret = drm_atomic_nonblocking_commit(state);
|
|
- if (ret != 0)
|
|
|
|
- goto fail;
|
|
|
|
-
|
|
|
|
- /* Driver takes ownership of state on successful commit. */
|
|
|
|
- return 0;
|
|
|
|
fail:
|
|
fail:
|
|
if (ret == -EDEADLK)
|
|
if (ret == -EDEADLK)
|
|
goto backoff;
|
|
goto backoff;
|
|
|
|
|
|
- drm_atomic_state_free(state);
|
|
|
|
-
|
|
|
|
|
|
+ drm_atomic_state_put(state);
|
|
return ret;
|
|
return ret;
|
|
|
|
+
|
|
backoff:
|
|
backoff:
|
|
drm_atomic_state_clear(state);
|
|
drm_atomic_state_clear(state);
|
|
drm_atomic_legacy_backoff(state);
|
|
drm_atomic_legacy_backoff(state);
|
|
@@ -2915,19 +2878,14 @@ retry:
|
|
crtc_state->active = active;
|
|
crtc_state->active = active;
|
|
|
|
|
|
ret = drm_atomic_commit(state);
|
|
ret = drm_atomic_commit(state);
|
|
- if (ret != 0)
|
|
|
|
- goto fail;
|
|
|
|
-
|
|
|
|
- /* Driver takes ownership of state on successful commit. */
|
|
|
|
- return 0;
|
|
|
|
fail:
|
|
fail:
|
|
if (ret == -EDEADLK)
|
|
if (ret == -EDEADLK)
|
|
goto backoff;
|
|
goto backoff;
|
|
|
|
|
|
connector->dpms = old_mode;
|
|
connector->dpms = old_mode;
|
|
- drm_atomic_state_free(state);
|
|
|
|
-
|
|
|
|
|
|
+ drm_atomic_state_put(state);
|
|
return ret;
|
|
return ret;
|
|
|
|
+
|
|
backoff:
|
|
backoff:
|
|
drm_atomic_state_clear(state);
|
|
drm_atomic_state_clear(state);
|
|
drm_atomic_legacy_backoff(state);
|
|
drm_atomic_legacy_backoff(state);
|
|
@@ -3334,7 +3292,7 @@ drm_atomic_helper_duplicate_state(struct drm_device *dev,
|
|
|
|
|
|
free:
|
|
free:
|
|
if (err < 0) {
|
|
if (err < 0) {
|
|
- drm_atomic_state_free(state);
|
|
|
|
|
|
+ drm_atomic_state_put(state);
|
|
state = ERR_PTR(err);
|
|
state = ERR_PTR(err);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -3449,22 +3407,14 @@ retry:
|
|
goto fail;
|
|
goto fail;
|
|
|
|
|
|
ret = drm_atomic_commit(state);
|
|
ret = drm_atomic_commit(state);
|
|
- if (ret)
|
|
|
|
- goto fail;
|
|
|
|
-
|
|
|
|
- /* Driver takes ownership of state on successful commit. */
|
|
|
|
-
|
|
|
|
- drm_property_unreference_blob(blob);
|
|
|
|
-
|
|
|
|
- return 0;
|
|
|
|
fail:
|
|
fail:
|
|
if (ret == -EDEADLK)
|
|
if (ret == -EDEADLK)
|
|
goto backoff;
|
|
goto backoff;
|
|
|
|
|
|
- drm_atomic_state_free(state);
|
|
|
|
|
|
+ drm_atomic_state_put(state);
|
|
drm_property_unreference_blob(blob);
|
|
drm_property_unreference_blob(blob);
|
|
-
|
|
|
|
return ret;
|
|
return ret;
|
|
|
|
+
|
|
backoff:
|
|
backoff:
|
|
drm_atomic_state_clear(state);
|
|
drm_atomic_state_clear(state);
|
|
drm_atomic_legacy_backoff(state);
|
|
drm_atomic_legacy_backoff(state);
|