Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/debugfs: show lingering bridges

The usefulness of /sys/kernel/debug/dri/bridges is limited as it only shows
bridges between drm_bridge_add() and drm_bridge_remove(). However
refcounted bridges can stay allocated and lingering for a long time after
drm_bridge_remove(), and a memory leak due to a missing drm_bridge_put()
would not be visible in this debugfs file.

Add lingering bridges to the /sys/kernel/debug/dri/bridges output.

Reviewed-by: Maxime Ripard <mripard@kernel.org>
Link: https://lore.kernel.org/r/20250915-drm-bridge-debugfs-removed-v9-2-6e5c0aff5de9@bootlin.com
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>

+11 -5
+11 -5
drivers/gpu/drm/drm_bridge.c
··· 1447 1447 1448 1448 static void drm_bridge_debugfs_show_bridge(struct drm_printer *p, 1449 1449 struct drm_bridge *bridge, 1450 - unsigned int idx) 1450 + unsigned int idx, 1451 + bool lingering) 1451 1452 { 1452 1453 drm_printf(p, "bridge[%u]: %ps\n", idx, bridge->funcs); 1453 1454 1454 - drm_printf(p, "\trefcount: %u\n", kref_read(&bridge->refcount)); 1455 + drm_printf(p, "\trefcount: %u%s\n", kref_read(&bridge->refcount), 1456 + lingering ? " [lingering]" : ""); 1455 1457 1456 1458 drm_printf(p, "\ttype: [%d] %s\n", 1457 1459 bridge->type, 1458 1460 drm_get_connector_type_name(bridge->type)); 1459 1461 1460 - if (bridge->of_node) 1462 + /* The OF node could be freed after drm_bridge_remove() */ 1463 + if (bridge->of_node && !lingering) 1461 1464 drm_printf(p, "\tOF: %pOFfc\n", bridge->of_node); 1462 1465 1463 1466 drm_printf(p, "\tops: [0x%x]", bridge->ops); ··· 1486 1483 mutex_lock(&bridge_lock); 1487 1484 1488 1485 list_for_each_entry(bridge, &bridge_list, list) 1489 - drm_bridge_debugfs_show_bridge(&p, bridge, idx++); 1486 + drm_bridge_debugfs_show_bridge(&p, bridge, idx++, false); 1487 + 1488 + list_for_each_entry(bridge, &bridge_lingering_list, list) 1489 + drm_bridge_debugfs_show_bridge(&p, bridge, idx++, true); 1490 1490 1491 1491 mutex_unlock(&bridge_lock); 1492 1492 ··· 1504 1498 unsigned int idx = 0; 1505 1499 1506 1500 drm_for_each_bridge_in_chain_scoped(encoder, bridge) 1507 - drm_bridge_debugfs_show_bridge(&p, bridge, idx++); 1501 + drm_bridge_debugfs_show_bridge(&p, bridge, idx++, false); 1508 1502 1509 1503 return 0; 1510 1504 }