kms: lock during screen conf changes

This commit is contained in:
Victoria Brekenfeld 2025-07-16 21:13:50 +02:00 committed by Victoria Brekenfeld
parent bb7a6a7113
commit e34a289c01
10 changed files with 747 additions and 382 deletions

View file

@ -1,6 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-only
use crate::{state::BackendData, utils::prelude::*};
use crate::{
backend::kms::MaybeLockedDevice,
state::{BackendData, State},
};
use smithay::{
reexports::wayland_server::{protocol::wl_buffer::WlBuffer, Resource},
wayland::buffer::BufferHandler,

View file

@ -27,10 +27,11 @@ impl DrmLeaseHandler for State {
request: DrmLeaseRequest,
) -> Result<DrmLeaseBuilder, LeaseRejected> {
let kms = self.backend.kms();
let backend = kms
let mut backend = kms
.drm_devices
.get_mut(&node)
.ok_or(LeaseRejected::default())?;
.ok_or(LeaseRejected::default())?
.lock();
let mut renderer = match kms.api.single_renderer(&backend.render_node) {
Ok(renderer) => renderer,
Err(err) => {
@ -108,6 +109,7 @@ impl DrmLeaseHandler for State {
fn lease_destroyed(&mut self, node: DrmNode, lease: u32) {
let kms = self.backend.kms();
if let Some(backend) = kms.drm_devices.get_mut(&node) {
let mut backend = backend.lock();
backend.active_leases.retain(|l| l.id() != lease);
if backend.active_leases.is_empty() {

View file

@ -145,7 +145,8 @@ impl State {
}
}
let res = self.backend.apply_config_for_outputs(
let mut backend = self.backend.lock();
let res = backend.apply_config_for_outputs(
test_only,
&self.common.event_loop_handle,
self.common.config.dynamic_conf.screen_filter(),
@ -168,7 +169,7 @@ impl State {
}
}
if !test_only {
if let Err(err) = self.backend.apply_config_for_outputs(
if let Err(err) = backend.apply_config_for_outputs(
false,
&self.common.event_loop_handle,
self.common.config.dynamic_conf.screen_filter(),