Skip to content

Commit 7b57455

Browse files
committed
drm/i915: Add getter/setter for i915_gem_object->frontbuffer
Add getter/setter for i915_gem_object->frontbuffer and use it instead of directly touching i915_gem_object->frontbuffer frontbuffer pointer. v3: - Fix intel_frontbuffer_get return value - s/front_ret/cur/ v2: Move getter/setter into i915_gem_object.h Signed-off-by: Jouni Högander <[email protected]> Reviewed-by: Nirmoy Das <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 72e31c0 commit 7b57455

File tree

5 files changed

+77
-43
lines changed

5 files changed

+77
-43
lines changed

drivers/gpu/drm/i915/display/intel_frontbuffer.c

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ static void frontbuffer_release(struct kref *ref)
237237
}
238238
spin_unlock(&obj->vma.lock);
239239

240-
RCU_INIT_POINTER(obj->frontbuffer, NULL);
240+
i915_gem_object_set_frontbuffer(obj, NULL);
241241
spin_unlock(&intel_bo_to_i915(obj)->display.fb_tracking.lock);
242242

243243
i915_active_fini(&front->write);
@@ -250,9 +250,9 @@ struct intel_frontbuffer *
250250
intel_frontbuffer_get(struct drm_i915_gem_object *obj)
251251
{
252252
struct drm_i915_private *i915 = intel_bo_to_i915(obj);
253-
struct intel_frontbuffer *front;
253+
struct intel_frontbuffer *front, *cur;
254254

255-
front = __intel_frontbuffer_get(obj);
255+
front = i915_gem_object_get_frontbuffer(obj);
256256
if (front)
257257
return front;
258258

@@ -269,17 +269,11 @@ intel_frontbuffer_get(struct drm_i915_gem_object *obj)
269269
I915_ACTIVE_RETIRE_SLEEPS);
270270

271271
spin_lock(&i915->display.fb_tracking.lock);
272-
if (rcu_access_pointer(obj->frontbuffer)) {
273-
kfree(front);
274-
front = rcu_dereference_protected(obj->frontbuffer, true);
275-
kref_get(&front->ref);
276-
} else {
277-
i915_gem_object_get(obj);
278-
rcu_assign_pointer(obj->frontbuffer, front);
279-
}
272+
cur = i915_gem_object_set_frontbuffer(obj, front);
280273
spin_unlock(&i915->display.fb_tracking.lock);
281-
282-
return front;
274+
if (cur != front)
275+
kfree(front);
276+
return cur;
283277
}
284278

285279
void intel_frontbuffer_put(struct intel_frontbuffer *front)

drivers/gpu/drm/i915/display/intel_frontbuffer.h

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -75,33 +75,6 @@ void intel_frontbuffer_flip(struct drm_i915_private *i915,
7575

7676
void intel_frontbuffer_put(struct intel_frontbuffer *front);
7777

78-
static inline struct intel_frontbuffer *
79-
__intel_frontbuffer_get(const struct drm_i915_gem_object *obj)
80-
{
81-
struct intel_frontbuffer *front;
82-
83-
if (likely(!rcu_access_pointer(obj->frontbuffer)))
84-
return NULL;
85-
86-
rcu_read_lock();
87-
do {
88-
front = rcu_dereference(obj->frontbuffer);
89-
if (!front)
90-
break;
91-
92-
if (unlikely(!kref_get_unless_zero(&front->ref)))
93-
continue;
94-
95-
if (likely(front == rcu_access_pointer(obj->frontbuffer)))
96-
break;
97-
98-
intel_frontbuffer_put(front);
99-
} while (1);
100-
rcu_read_unlock();
101-
102-
return front;
103-
}
104-
10578
struct intel_frontbuffer *
10679
intel_frontbuffer_get(struct drm_i915_gem_object *obj);
10780

drivers/gpu/drm/i915/gem/i915_gem_object.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,7 @@ void __i915_gem_object_flush_frontbuffer(struct drm_i915_gem_object *obj,
469469
{
470470
struct intel_frontbuffer *front;
471471

472-
front = __intel_frontbuffer_get(obj);
472+
front = i915_gem_object_get_frontbuffer(obj);
473473
if (front) {
474474
intel_frontbuffer_flush(front, origin);
475475
intel_frontbuffer_put(front);
@@ -481,7 +481,7 @@ void __i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
481481
{
482482
struct intel_frontbuffer *front;
483483

484-
front = __intel_frontbuffer_get(obj);
484+
front = i915_gem_object_get_frontbuffer(obj);
485485
if (front) {
486486
intel_frontbuffer_invalidate(front, origin);
487487
intel_frontbuffer_put(front);

drivers/gpu/drm/i915/gem/i915_gem_object.h

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -891,4 +891,71 @@ static inline int i915_gem_object_userptr_validate(struct drm_i915_gem_object *o
891891

892892
#endif
893893

894+
/**
895+
* i915_gem_object_get_frontbuffer - Get the object's frontbuffer
896+
* @obj: The object whose frontbuffer to get.
897+
*
898+
* Get pointer to object's frontbuffer if such exists. Please note that RCU
899+
* mechanism is used to handle e.g. ongoing removal of frontbuffer pointer.
900+
*
901+
* Return: pointer to object's frontbuffer is such exists or NULL
902+
*/
903+
static inline struct intel_frontbuffer *
904+
i915_gem_object_get_frontbuffer(const struct drm_i915_gem_object *obj)
905+
{
906+
struct intel_frontbuffer *front;
907+
908+
if (likely(!rcu_access_pointer(obj->frontbuffer)))
909+
return NULL;
910+
911+
rcu_read_lock();
912+
do {
913+
front = rcu_dereference(obj->frontbuffer);
914+
if (!front)
915+
break;
916+
917+
if (unlikely(!kref_get_unless_zero(&front->ref)))
918+
continue;
919+
920+
if (likely(front == rcu_access_pointer(obj->frontbuffer)))
921+
break;
922+
923+
intel_frontbuffer_put(front);
924+
} while (1);
925+
rcu_read_unlock();
926+
927+
return front;
928+
}
929+
930+
/**
931+
* i915_gem_object_set_frontbuffer - Set the object's frontbuffer
932+
* @obj: The object whose frontbuffer to set.
933+
* @front: The frontbuffer to set
934+
*
935+
* Set object's frontbuffer pointer. If frontbuffer is already set for the
936+
* object keep it and return it's pointer to the caller. Please note that RCU
937+
* mechanism is used to handle e.g. ongoing removal of frontbuffer pointer. This
938+
* function is protected by i915->display.fb_tracking.lock
939+
*
940+
* Return: pointer to frontbuffer which was set.
941+
*/
942+
static inline struct intel_frontbuffer *
943+
i915_gem_object_set_frontbuffer(struct drm_i915_gem_object *obj,
944+
struct intel_frontbuffer *front)
945+
{
946+
struct intel_frontbuffer *cur = front;
947+
948+
if (!front) {
949+
RCU_INIT_POINTER(obj->frontbuffer, NULL);
950+
} else if (rcu_access_pointer(obj->frontbuffer)) {
951+
cur = rcu_dereference_protected(obj->frontbuffer, true);
952+
kref_get(&cur->ref);
953+
} else {
954+
drm_gem_object_get(intel_bo_to_drm_bo(obj));
955+
rcu_assign_pointer(obj->frontbuffer, front);
956+
}
957+
958+
return cur;
959+
}
960+
894961
#endif

drivers/gpu/drm/i915/i915_vma.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1908,7 +1908,7 @@ int _i915_vma_move_to_active(struct i915_vma *vma,
19081908
if (flags & EXEC_OBJECT_WRITE) {
19091909
struct intel_frontbuffer *front;
19101910

1911-
front = __intel_frontbuffer_get(obj);
1911+
front = i915_gem_object_get_frontbuffer(obj);
19121912
if (unlikely(front)) {
19131913
if (intel_frontbuffer_invalidate(front, ORIGIN_CS))
19141914
i915_active_add_request(&front->write, rq);

0 commit comments

Comments
 (0)