Skip to content

Commit afaf2b3

Browse files
committed
Merge tag 'drm-misc-next-fixes-2023-09-11' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes
Short summary of fixes pull: * nouveau: Lockdep workaround * fbdev/g364fb: Build fix Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> From: Thomas Zimmermann <tzimmermann@suse.de> Link: https://patchwork.freedesktop.org/patch/msgid/20230911141915.GA983@linux-uq9g
2 parents 0bb80ec + d20b484 commit afaf2b3

File tree

2 files changed

+32
-5
lines changed

2 files changed

+32
-5
lines changed

drivers/gpu/drm/drm_exec.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ static void drm_exec_unlock_all(struct drm_exec *exec)
5656
struct drm_gem_object *obj;
5757
unsigned long index;
5858

59-
drm_exec_for_each_locked_object(exec, index, obj) {
59+
drm_exec_for_each_locked_object_reverse(exec, index, obj) {
6060
dma_resv_unlock(obj->resv);
6161
drm_gem_object_put(obj);
6262
}

include/drm/drm_exec.h

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,20 @@ struct drm_exec {
5151
struct drm_gem_object *prelocked;
5252
};
5353

54+
/**
55+
* drm_exec_obj() - Return the object for a give drm_exec index
56+
* @exec: Pointer to the drm_exec context
57+
* @index: The index.
58+
*
59+
* Return: Pointer to the locked object corresponding to @index if
60+
* index is within the number of locked objects. NULL otherwise.
61+
*/
62+
static inline struct drm_gem_object *
63+
drm_exec_obj(struct drm_exec *exec, unsigned long index)
64+
{
65+
return index < exec->num_objects ? exec->objects[index] : NULL;
66+
}
67+
5468
/**
5569
* drm_exec_for_each_locked_object - iterate over all the locked objects
5670
* @exec: drm_exec object
@@ -59,10 +73,23 @@ struct drm_exec {
5973
*
6074
* Iterate over all the locked GEM objects inside the drm_exec object.
6175
*/
62-
#define drm_exec_for_each_locked_object(exec, index, obj) \
63-
for (index = 0, obj = (exec)->objects[0]; \
64-
index < (exec)->num_objects; \
65-
++index, obj = (exec)->objects[index])
76+
#define drm_exec_for_each_locked_object(exec, index, obj) \
77+
for ((index) = 0; ((obj) = drm_exec_obj(exec, index)); ++(index))
78+
79+
/**
80+
* drm_exec_for_each_locked_object_reverse - iterate over all the locked
81+
* objects in reverse locking order
82+
* @exec: drm_exec object
83+
* @index: unsigned long index for the iteration
84+
* @obj: the current GEM object
85+
*
86+
* Iterate over all the locked GEM objects inside the drm_exec object in
87+
* reverse locking order. Note that @index may go below zero and wrap,
88+
* but that will be caught by drm_exec_obj(), returning a NULL object.
89+
*/
90+
#define drm_exec_for_each_locked_object_reverse(exec, index, obj) \
91+
for ((index) = (exec)->num_objects - 1; \
92+
((obj) = drm_exec_obj(exec, index)); --(index))
6693

6794
/**
6895
* drm_exec_until_all_locked - loop until all GEM objects are locked

0 commit comments

Comments
 (0)