]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/atomic: WARN about invalid drm_foo_get_state() usage
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Fri, 17 Oct 2025 16:33:27 +0000 (19:33 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 28 Oct 2025 19:45:14 +0000 (21:45 +0200)
drm_{crtc,plane,connector,private_obj}_get_state() must not
be called after the atomic check phase. At that point the commit
has been carved in stone and no new objects must be introduced
into it. WARN if anyone attempts to violate this rule.

Cc: Maxime Ripard <mripard@kernel.org>
Cc: Dan Carpenter <dan.carpenter@linaro.org>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patch.msgid.link/20251017163327.9074-2-ville.syrjala@linux.intel.com
Reviewed-by: Maxime Ripard <mripard@kernel.org>
drivers/gpu/drm/drm_atomic.c
include/drm/drm_atomic.h

index 5d31b20e67ab96ad94831523ba156c0bcb6297b7..e05820b188327da2b7e9817b60c4432666e8015b 100644 (file)
@@ -200,6 +200,8 @@ void drm_atomic_state_default_clear(struct drm_atomic_state *state)
 
        drm_dbg_atomic(dev, "Clearing atomic state %p\n", state);
 
+       state->checked = false;
+
        for (i = 0; i < state->num_connector; i++) {
                struct drm_connector *connector = state->connectors[i].ptr;
 
@@ -348,6 +350,7 @@ drm_atomic_get_crtc_state(struct drm_atomic_state *state,
        struct drm_crtc_state *crtc_state;
 
        WARN_ON(!state->acquire_ctx);
+       drm_WARN_ON(state->dev, state->checked);
 
        crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
        if (crtc_state)
@@ -528,6 +531,7 @@ drm_atomic_get_plane_state(struct drm_atomic_state *state,
        struct drm_plane_state *plane_state;
 
        WARN_ON(!state->acquire_ctx);
+       drm_WARN_ON(state->dev, state->checked);
 
        /* the legacy pointers should never be set */
        WARN_ON(plane->fb);
@@ -837,6 +841,7 @@ drm_atomic_get_private_obj_state(struct drm_atomic_state *state,
        struct drm_private_state *obj_state;
 
        WARN_ON(!state->acquire_ctx);
+       drm_WARN_ON(state->dev, state->checked);
 
        obj_state = drm_atomic_get_new_private_obj_state(state, obj);
        if (obj_state)
@@ -1131,6 +1136,7 @@ drm_atomic_get_connector_state(struct drm_atomic_state *state,
        struct drm_connector_state *connector_state;
 
        WARN_ON(!state->acquire_ctx);
+       drm_WARN_ON(state->dev, state->checked);
 
        ret = drm_modeset_lock(&config->connection_mutex, state->acquire_ctx);
        if (ret)
@@ -1543,6 +1549,8 @@ int drm_atomic_check_only(struct drm_atomic_state *state)
                     requested_crtc, affected_crtc);
        }
 
+       state->checked = true;
+
        return 0;
 }
 EXPORT_SYMBOL(drm_atomic_check_only);
index 155e82f87e4d47161475b57fc28762d7ba8fd206..2e433d44658d6cba94eb1f0a1773b1a8f108eb3a 100644 (file)
@@ -523,6 +523,14 @@ struct drm_atomic_state {
         */
        bool duplicated : 1;
 
+       /**
+        * @checked:
+        *
+        * Indicates the state has been checked and thus must no longer
+        * be mutated. For internal use only, do not consult from drivers.
+        */
+       bool checked : 1;
+
        /**
         * @planes:
         *