In particular, we make it clear that &drm_device.mode_config.idr_mutex
protects the lease idr and list structures for drm_master. The lessor
field itself doesn't need to be protected as it doesn't change after
it's set in drm_lease_create.

Additionally, we add descriptions for the lifetime of lessors and
leases to make it easier to reason about them.

Signed-off-by: Desmond Cheong Zhi Xi <desmondcheon...@gmail.com>
---
 include/drm/drm_auth.h | 62 ++++++++++++++++++++++++++++++++++--------
 1 file changed, 51 insertions(+), 11 deletions(-)

diff --git a/include/drm/drm_auth.h b/include/drm/drm_auth.h
index f99d3417f304..c978c85464fa 100644
--- a/include/drm/drm_auth.h
+++ b/include/drm/drm_auth.h
@@ -58,12 +58,6 @@ struct drm_lock_data {
  * @refcount: Refcount for this master object.
  * @dev: Link back to the DRM device
  * @driver_priv: Pointer to driver-private information.
- * @lessor: Lease holder
- * @lessee_id: id for lessees. Owners always have id 0
- * @lessee_list: other lessees of the same master
- * @lessees: drm_masters leasing from this one
- * @leases: Objects leased to this drm_master.
- * @lessee_idr: All lessees under this owner (only used where lessor == NULL)
  *
  * Note that master structures are only relevant for the legacy/primary device
  * nodes, hence there can only be one per device, not one per drm_minor.
@@ -88,17 +82,63 @@ struct drm_master {
        struct idr magic_map;
        void *driver_priv;
 
-       /* Tree of display resource leases, each of which is a drm_master struct
-        * All of these get activated simultaneously, so drm_device master 
points
-        * at the top of the tree (for which lessor is NULL). Protected by
-        * &drm_device.mode_config.idr_mutex.
+       /**
+        * @lessor:
+        *
+        * Lease holder. The lessor does not change once it's set in
+        * drm_lease_create(). Each lessee holds a reference to its lessor that
+        * it releases upon being destroyed in drm_lease_destroy().
+        *
+        * Display resource leases form a tree of &struct drm_master. All of
+        * these get activated simultaneously, so &drm_device.master
+        * points at the top of the tree (for which lessor is NULL).
         */
-
        struct drm_master *lessor;
+
+       /**
+        * @lessee_id:
+        *
+        * ID for lessees. Owners always have ID 0. Protected by
+        * &drm_device.mode_config's &drm_mode_config.idr_mutex.
+        */
        int     lessee_id;
+
+       /**
+        * @lessee_list:
+        *
+        * List of lessees of the same master. Protected by
+        * &drm_device.mode_config's &drm_mode_config.idr_mutex.
+        */
        struct list_head lessee_list;
+
+       /**
+        * @lessees:
+        *
+        * List of drm_masters leasing from this one. Protected by
+        * &drm_device.mode_config's &drm_mode_config.idr_mutex.
+        *
+        * This master cannot be destroyed unless this list is empty as lessors
+        * are referenced by all their lessees.
+        */
        struct list_head lessees;
+
+       /**
+        * @leases:
+        *
+        * Objects leased to this drm_master. Protected by
+        * &drm_device.mode_config's &drm_mode_config.idr_mutex.
+        *
+        * Objects are leased all together in drm_lease_create(), and are
+        * removed all together when the lease is revoked.
+        */
        struct idr leases;
+
+       /**
+        * @lessee_idr:
+        *
+        * All lessees under this owner (only used where lessor is NULL).
+        * Protected by &drm_device.mode_config's &drm_mode_config.idr_mutex.
+        */
        struct idr lessee_idr;
        /* private: */
 #if IS_ENABLED(CONFIG_DRM_LEGACY)
-- 
2.25.1

Reply via email to