STATE LIFETIME(9)
β¨ state lifetime(9) β¨
okay so bestie, this is the Kernel API Manual page for state lifetime, and it's literally all about who lives how long in the DRM atomic state world π
.
drm_atomic_commit represents an update to modeset pipeline state. It's a transient object that holds a state update as a collection of pointers to individual objects' states. drm_atomic_commit has a much shorter lifetime than the objects' states, since it's only allocated while preparing, checking or committing the update, while object states are allocated when preparing the update and kept alive as long as they are active in the device.
Their respective lifetimes are:
- at driver initialization time, the driver calls
drm_mode_config_create_initial_stateto allocate an initial, pristine, state for each object and stores it in the objects state pointer. Historically, this was one ofdrm_mode_config_resetjob, so one might still encounter it in a driver. - When resuming from suspend,
drm_mode_config_resetresets the software and hardware state to a known default and stores it in the object's state pointer. Not all objects are affected bydrm_mode_config_resetthough. - whenever a new update is needed:
drm_atomic_commit_allocallocates a newdrm_atomic_commitinstance.- The code triggering the commit (
ioctl, client modeset,drm_atomic_helper_reset_crtc, etc.) copies the current active state of all entities affected by the update into this newdrm_atomic_commitusingdrm_atomic_get_plane_state,drm_atomic_get_crtc_state,drm_atomic_get_connector_state, ordrm_atomic_get_private_obj_state. This new state can then be modified.
At that point, drm_atomic_commit stores three state pointers for any affected entity: the "old" and "new" states, and state_to_destroy. The old state is the state currently active in the hardware, which is either the one initialized by reset or a newer one if a commit has been made. The new state is the state we just allocated and we might eventually commit to the hardware. The state_to_destroy points to the state we'll eventually have to free when the drm_atomic_commit will be destroyed, and points to the new state for now since the old state is still the active state.
- After the calling code populated the commit with the entities states, it updates the new states with the new values we need to commit. The new commit instance is now ready.
- Then we have two branches depending on the calling code intent:
- If the calling code only wants to check that the commit would work (for example because of the
DRM_MODE_ATOMIC_TEST_ONLYflag). It callsdrm_atomic_check_only, which in turn checks all these states by invokingatomic_checkon all affected pipeline stages. - If the calling code actually wants to trigger a commit, it calls
drm_atomic_commit. The first stage is the check mentioned above, and if the check is successful, it performs the commit. Part of the commit is a call todrm_atomic_helper_swap_statewhich turns the new states into the active states. After swapping states, each object's state pointer now refers to the formerly new state. Thestate_to_destroynow refers to the formerly old state.
- If the calling code only wants to check that the commit would work (for example because of the
- Once done, and when the last reference to our
drm_atomic_commitis given up throughdrm_atomic_commit_put, it calls__drm_atomic_commit_free. In turn,__drm_atomic_commit_freecallsdrm_atomic_commit_clearthat will free allstate_to_destroy(ie. old states), and it finally freesdrm_atomic_commitinstance. - Now, we don't have any active
drm_atomic_commitanymore, and only the entity active states remain allocated.
π SEE ALSO π
Kernel file ./drivers/gpu/drm/drm_atomic.c, plus the whole reference squad, bestie: drm_crtc_commit_wait(9), drm_atomic_commit_default_release(9), drm_atomic_commit_init(9), drm_atomic_commit_alloc(9), drm_atomic_commit_default_clear(9), drm_atomic_commit_clear(9), __drm_atomic_commit_free(9), drm_atomic_get_crtc_state(9), drm_atomic_get_plane_state(9), drm_atomic_get_colorop_state(9), drm_atomic_get_old_colorop_state(9), drm_atomic_get_new_colorop_state(9), drm_atomic_plane_check(9), handling driver private state(9), drm_atomic_private_obj_init(9), drm_atomic_private_obj_fini(9), drm_atomic_get_private_obj_state(9), drm_atomic_get_old_private_obj_state(9), drm_atomic_get_new_private_obj_state(9), drm_atomic_get_old_connector_for_encoder(9), drm_atomic_get_new_connector_for_encoder(9), drm_atomic_get_connector_for_encoder(9), drm_atomic_get_old_crtc_for_encoder(9), drm_atomic_get_new_crtc_for_encoder(9), drm_atomic_get_connector_state(9), drm_atomic_get_bridge_state(9), drm_atomic_get_old_bridge_state(9), drm_atomic_get_new_bridge_state(9), drm_atomic_add_encoder_bridges(9), drm_atomic_add_affected_connectors(9), drm_atomic_add_affected_planes(9), drm_atomic_add_affected_colorops(9), drm_atomic_check_only(9), drm_atomic_commit(9), drm_atomic_nonblocking_commit(9), drm_atomic_print_new_state(9), drm_state_dump(9).
β mwah π from the source at ./drivers/gpu/drm and the date October 2026, on the state lifetime(9) page. periodt π«Ά
π¦ where this page comes from
- nixpkgs unstable: linux-manual 7.3.1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms