Loading drivers/gpu/msm/adreno_debugfs.c +6 −5 Original line number Diff line number Diff line Loading @@ -137,11 +137,8 @@ static void sync_event_print(struct seq_file *s, break; } case KGSL_CMD_SYNCPOINT_TYPE_FENCE: { char fence_str[128]; kgsl_dump_fence(sync_event->handle, fence_str, sizeof(fence_str)); seq_printf(s, "sync: [%pK] %s", sync_event->handle, fence_str); seq_printf(s, "sync: [%pK] %s", sync_event->handle, sync_event->fence_name); break; } default: Loading Loading @@ -241,6 +238,9 @@ static void cmdobj_print(struct seq_file *s, static void drawobj_print(struct seq_file *s, struct kgsl_drawobj *drawobj) { if (!kref_get_unless_zero(&drawobj->refcount)) return; if (drawobj->type == SYNCOBJ_TYPE) syncobj_print(s, SYNCOBJ(drawobj)); else if ((drawobj->type == CMDOBJ_TYPE) || Loading @@ -251,6 +251,7 @@ static void drawobj_print(struct seq_file *s, print_flags(s, drawobj_flags, ARRAY_SIZE(drawobj_flags), drawobj->flags); kgsl_drawobj_put(drawobj); seq_puts(s, "\n"); } Loading drivers/gpu/msm/adreno_drawctxt.c +5 −0 Original line number Diff line number Diff line Loading @@ -95,6 +95,9 @@ void adreno_drawctxt_dump(struct kgsl_device *device, goto stats; } if (!kref_get_unless_zero(&drawobj->refcount)) goto stats; if (drawobj->type == SYNCOBJ_TYPE) { struct kgsl_drawobj_sync *syncobj = SYNCOBJ(drawobj); Loading @@ -106,6 +109,8 @@ void adreno_drawctxt_dump(struct kgsl_device *device, kgsl_dump_syncpoints(device, syncobj); } } kgsl_drawobj_put(drawobj); } stats: Loading drivers/gpu/msm/kgsl.c +1 −1 Original line number Diff line number Diff line Loading @@ -1955,7 +1955,7 @@ static long gpuobj_free_on_fence(struct kgsl_device_private *dev_priv, } handle = kgsl_sync_fence_async_wait(event.fd, gpuobj_free_fence_func, entry); gpuobj_free_fence_func, entry, NULL, 0); /* if handle is NULL the fence has already signaled */ if (handle == NULL) Loading drivers/gpu/msm/kgsl_drawobj.c +29 −37 Original line number Diff line number Diff line Loading @@ -44,7 +44,7 @@ static struct kmem_cache *memobjs_cache; static struct kmem_cache *sparseobjs_cache; static void drawobj_destroy_object(struct kref *kref) void kgsl_drawobj_destroy_object(struct kref *kref) { struct kgsl_drawobj *drawobj = container_of(kref, struct kgsl_drawobj, refcount); Loading @@ -68,12 +68,6 @@ static void drawobj_destroy_object(struct kref *kref) } } static inline void drawobj_put(struct kgsl_drawobj *drawobj) { if (drawobj) kref_put(&drawobj->refcount, drawobj_destroy_object); } void kgsl_dump_syncpoints(struct kgsl_device *device, struct kgsl_drawobj_sync *syncobj) { Loading @@ -100,30 +94,35 @@ void kgsl_dump_syncpoints(struct kgsl_device *device, retired); break; } case KGSL_CMD_SYNCPOINT_TYPE_FENCE: { char fence_str[128]; kgsl_dump_fence(event->handle, fence_str, sizeof(fence_str)); dev_err(device->dev, " fence: %s\n", fence_str); case KGSL_CMD_SYNCPOINT_TYPE_FENCE: dev_err(device->dev, " fence: %s\n", event->fence_name); break; } } } } static void syncobj_timer(unsigned long data) { struct kgsl_device *device; struct kgsl_drawobj_sync *syncobj = (struct kgsl_drawobj_sync *) data; struct kgsl_drawobj *drawobj = DRAWOBJ(syncobj); struct kgsl_drawobj *drawobj; struct kgsl_drawobj_sync_event *event; unsigned int i; if (syncobj == NULL || drawobj->context == NULL) if (syncobj == NULL) return; drawobj = DRAWOBJ(syncobj); if (!kref_get_unless_zero(&drawobj->refcount)) return; if (drawobj->context == NULL) { kgsl_drawobj_put(drawobj); return; } device = drawobj->context->device; dev_err(device->dev, Loading @@ -147,18 +146,14 @@ static void syncobj_timer(unsigned long data) dev_err(device->dev, " [%d] TIMESTAMP %d:%d\n", i, event->context->id, event->timestamp); break; case KGSL_CMD_SYNCPOINT_TYPE_FENCE: { char fence_str[128]; kgsl_dump_fence(event->handle, fence_str, sizeof(fence_str)); case KGSL_CMD_SYNCPOINT_TYPE_FENCE: dev_err(device->dev, " [%d] FENCE %s\n", i, fence_str); i, event->fence_name); break; } } } kgsl_drawobj_put(drawobj); dev_err(device->dev, "--gpu syncpoint deadlock print end--\n"); } Loading Loading @@ -204,7 +199,7 @@ static void drawobj_sync_func(struct kgsl_device *device, drawobj_sync_expire(device, event); kgsl_context_put(event->context); drawobj_put(&event->syncobj->base); kgsl_drawobj_put(&event->syncobj->base); } static inline void memobj_list_free(struct list_head *list) Loading Loading @@ -265,7 +260,7 @@ static void drawobj_destroy_sync(struct kgsl_drawobj *drawobj) break; case KGSL_CMD_SYNCPOINT_TYPE_FENCE: if (kgsl_sync_fence_async_cancel(event->handle)) drawobj_put(drawobj); kgsl_drawobj_put(drawobj); break; } } Loading Loading @@ -321,21 +316,19 @@ void kgsl_drawobj_destroy(struct kgsl_drawobj *drawobj) else return; drawobj_put(drawobj); kgsl_drawobj_put(drawobj); } EXPORT_SYMBOL(kgsl_drawobj_destroy); static void drawobj_sync_fence_func(void *priv) { struct kgsl_drawobj_sync_event *event = priv; char fence_str[128]; kgsl_dump_fence(event->handle, fence_str, sizeof(fence_str)); trace_syncpoint_fence_expire(event->syncobj, fence_str); trace_syncpoint_fence_expire(event->syncobj, event->fence_name); drawobj_sync_expire(event->device, event); drawobj_put(&event->syncobj->base); kgsl_drawobj_put(&event->syncobj->base); } /* drawobj_add_sync_fence() - Add a new sync fence syncpoint Loading @@ -352,7 +345,6 @@ static int drawobj_add_sync_fence(struct kgsl_device *device, struct kgsl_drawobj *drawobj = DRAWOBJ(syncobj); struct kgsl_drawobj_sync_event *event; unsigned int id; char fence_str[128]; kref_get(&drawobj->refcount); Loading @@ -369,7 +361,8 @@ static int drawobj_add_sync_fence(struct kgsl_device *device, set_bit(event->id, &syncobj->pending); event->handle = kgsl_sync_fence_async_wait(sync->fd, drawobj_sync_fence_func, event); drawobj_sync_fence_func, event, event->fence_name, sizeof(event->fence_name)); if (IS_ERR_OR_NULL(event->handle)) { int ret = PTR_ERR(event->handle); Loading @@ -377,7 +370,7 @@ static int drawobj_add_sync_fence(struct kgsl_device *device, clear_bit(event->id, &syncobj->pending); event->handle = NULL; drawobj_put(drawobj); kgsl_drawobj_put(drawobj); /* * If ret == 0 the fence was already signaled - print a trace Loading @@ -389,8 +382,7 @@ static int drawobj_add_sync_fence(struct kgsl_device *device, return ret; } kgsl_dump_fence(event->handle, fence_str, sizeof(fence_str)); trace_syncpoint_fence(syncobj, fence_str); trace_syncpoint_fence(syncobj, event->fence_name); return 0; } Loading Loading @@ -457,7 +449,7 @@ static int drawobj_add_sync_timestamp(struct kgsl_device *device, if (ret) { clear_bit(event->id, &syncobj->pending); drawobj_put(drawobj); kgsl_drawobj_put(drawobj); } else { trace_syncpoint_timestamp(syncobj, context, sync->timestamp); } Loading drivers/gpu/msm/kgsl_drawobj.h +13 −0 Original line number Diff line number Diff line Loading @@ -105,6 +105,8 @@ struct kgsl_drawobj_sync { unsigned long timeout_jiffies; }; #define KGSL_FENCE_NAME_LEN 74 /** * struct kgsl_drawobj_sync_event * @id: identifer (positiion within the pending bitmap) Loading @@ -114,6 +116,7 @@ struct kgsl_drawobj_sync { * register this event * @timestamp: Pending timestamp for the event * @handle: Pointer to a sync fence handle * @fence_name: A fence name string to describe the fence * @device: Pointer to the KGSL device */ struct kgsl_drawobj_sync_event { Loading @@ -123,6 +126,7 @@ struct kgsl_drawobj_sync_event { struct kgsl_context *context; unsigned int timestamp; struct kgsl_sync_fence_cb *handle; char fence_name[KGSL_FENCE_NAME_LEN]; struct kgsl_device *device; }; Loading Loading @@ -206,6 +210,8 @@ void kgsl_dump_syncpoints(struct kgsl_device *device, void kgsl_drawobj_destroy(struct kgsl_drawobj *drawobj); void kgsl_drawobj_destroy_object(struct kref *kref); static inline bool kgsl_drawobj_events_pending( struct kgsl_drawobj_sync *syncobj) { Loading @@ -220,4 +226,11 @@ static inline bool kgsl_drawobj_event_pending( return test_bit(bit, &syncobj->pending); } static inline void kgsl_drawobj_put(struct kgsl_drawobj *drawobj) { if (drawobj) kref_put(&drawobj->refcount, kgsl_drawobj_destroy_object); } #endif /* __KGSL_DRAWOBJ_H */ Loading
drivers/gpu/msm/adreno_debugfs.c +6 −5 Original line number Diff line number Diff line Loading @@ -137,11 +137,8 @@ static void sync_event_print(struct seq_file *s, break; } case KGSL_CMD_SYNCPOINT_TYPE_FENCE: { char fence_str[128]; kgsl_dump_fence(sync_event->handle, fence_str, sizeof(fence_str)); seq_printf(s, "sync: [%pK] %s", sync_event->handle, fence_str); seq_printf(s, "sync: [%pK] %s", sync_event->handle, sync_event->fence_name); break; } default: Loading Loading @@ -241,6 +238,9 @@ static void cmdobj_print(struct seq_file *s, static void drawobj_print(struct seq_file *s, struct kgsl_drawobj *drawobj) { if (!kref_get_unless_zero(&drawobj->refcount)) return; if (drawobj->type == SYNCOBJ_TYPE) syncobj_print(s, SYNCOBJ(drawobj)); else if ((drawobj->type == CMDOBJ_TYPE) || Loading @@ -251,6 +251,7 @@ static void drawobj_print(struct seq_file *s, print_flags(s, drawobj_flags, ARRAY_SIZE(drawobj_flags), drawobj->flags); kgsl_drawobj_put(drawobj); seq_puts(s, "\n"); } Loading
drivers/gpu/msm/adreno_drawctxt.c +5 −0 Original line number Diff line number Diff line Loading @@ -95,6 +95,9 @@ void adreno_drawctxt_dump(struct kgsl_device *device, goto stats; } if (!kref_get_unless_zero(&drawobj->refcount)) goto stats; if (drawobj->type == SYNCOBJ_TYPE) { struct kgsl_drawobj_sync *syncobj = SYNCOBJ(drawobj); Loading @@ -106,6 +109,8 @@ void adreno_drawctxt_dump(struct kgsl_device *device, kgsl_dump_syncpoints(device, syncobj); } } kgsl_drawobj_put(drawobj); } stats: Loading
drivers/gpu/msm/kgsl.c +1 −1 Original line number Diff line number Diff line Loading @@ -1955,7 +1955,7 @@ static long gpuobj_free_on_fence(struct kgsl_device_private *dev_priv, } handle = kgsl_sync_fence_async_wait(event.fd, gpuobj_free_fence_func, entry); gpuobj_free_fence_func, entry, NULL, 0); /* if handle is NULL the fence has already signaled */ if (handle == NULL) Loading
drivers/gpu/msm/kgsl_drawobj.c +29 −37 Original line number Diff line number Diff line Loading @@ -44,7 +44,7 @@ static struct kmem_cache *memobjs_cache; static struct kmem_cache *sparseobjs_cache; static void drawobj_destroy_object(struct kref *kref) void kgsl_drawobj_destroy_object(struct kref *kref) { struct kgsl_drawobj *drawobj = container_of(kref, struct kgsl_drawobj, refcount); Loading @@ -68,12 +68,6 @@ static void drawobj_destroy_object(struct kref *kref) } } static inline void drawobj_put(struct kgsl_drawobj *drawobj) { if (drawobj) kref_put(&drawobj->refcount, drawobj_destroy_object); } void kgsl_dump_syncpoints(struct kgsl_device *device, struct kgsl_drawobj_sync *syncobj) { Loading @@ -100,30 +94,35 @@ void kgsl_dump_syncpoints(struct kgsl_device *device, retired); break; } case KGSL_CMD_SYNCPOINT_TYPE_FENCE: { char fence_str[128]; kgsl_dump_fence(event->handle, fence_str, sizeof(fence_str)); dev_err(device->dev, " fence: %s\n", fence_str); case KGSL_CMD_SYNCPOINT_TYPE_FENCE: dev_err(device->dev, " fence: %s\n", event->fence_name); break; } } } } static void syncobj_timer(unsigned long data) { struct kgsl_device *device; struct kgsl_drawobj_sync *syncobj = (struct kgsl_drawobj_sync *) data; struct kgsl_drawobj *drawobj = DRAWOBJ(syncobj); struct kgsl_drawobj *drawobj; struct kgsl_drawobj_sync_event *event; unsigned int i; if (syncobj == NULL || drawobj->context == NULL) if (syncobj == NULL) return; drawobj = DRAWOBJ(syncobj); if (!kref_get_unless_zero(&drawobj->refcount)) return; if (drawobj->context == NULL) { kgsl_drawobj_put(drawobj); return; } device = drawobj->context->device; dev_err(device->dev, Loading @@ -147,18 +146,14 @@ static void syncobj_timer(unsigned long data) dev_err(device->dev, " [%d] TIMESTAMP %d:%d\n", i, event->context->id, event->timestamp); break; case KGSL_CMD_SYNCPOINT_TYPE_FENCE: { char fence_str[128]; kgsl_dump_fence(event->handle, fence_str, sizeof(fence_str)); case KGSL_CMD_SYNCPOINT_TYPE_FENCE: dev_err(device->dev, " [%d] FENCE %s\n", i, fence_str); i, event->fence_name); break; } } } kgsl_drawobj_put(drawobj); dev_err(device->dev, "--gpu syncpoint deadlock print end--\n"); } Loading Loading @@ -204,7 +199,7 @@ static void drawobj_sync_func(struct kgsl_device *device, drawobj_sync_expire(device, event); kgsl_context_put(event->context); drawobj_put(&event->syncobj->base); kgsl_drawobj_put(&event->syncobj->base); } static inline void memobj_list_free(struct list_head *list) Loading Loading @@ -265,7 +260,7 @@ static void drawobj_destroy_sync(struct kgsl_drawobj *drawobj) break; case KGSL_CMD_SYNCPOINT_TYPE_FENCE: if (kgsl_sync_fence_async_cancel(event->handle)) drawobj_put(drawobj); kgsl_drawobj_put(drawobj); break; } } Loading Loading @@ -321,21 +316,19 @@ void kgsl_drawobj_destroy(struct kgsl_drawobj *drawobj) else return; drawobj_put(drawobj); kgsl_drawobj_put(drawobj); } EXPORT_SYMBOL(kgsl_drawobj_destroy); static void drawobj_sync_fence_func(void *priv) { struct kgsl_drawobj_sync_event *event = priv; char fence_str[128]; kgsl_dump_fence(event->handle, fence_str, sizeof(fence_str)); trace_syncpoint_fence_expire(event->syncobj, fence_str); trace_syncpoint_fence_expire(event->syncobj, event->fence_name); drawobj_sync_expire(event->device, event); drawobj_put(&event->syncobj->base); kgsl_drawobj_put(&event->syncobj->base); } /* drawobj_add_sync_fence() - Add a new sync fence syncpoint Loading @@ -352,7 +345,6 @@ static int drawobj_add_sync_fence(struct kgsl_device *device, struct kgsl_drawobj *drawobj = DRAWOBJ(syncobj); struct kgsl_drawobj_sync_event *event; unsigned int id; char fence_str[128]; kref_get(&drawobj->refcount); Loading @@ -369,7 +361,8 @@ static int drawobj_add_sync_fence(struct kgsl_device *device, set_bit(event->id, &syncobj->pending); event->handle = kgsl_sync_fence_async_wait(sync->fd, drawobj_sync_fence_func, event); drawobj_sync_fence_func, event, event->fence_name, sizeof(event->fence_name)); if (IS_ERR_OR_NULL(event->handle)) { int ret = PTR_ERR(event->handle); Loading @@ -377,7 +370,7 @@ static int drawobj_add_sync_fence(struct kgsl_device *device, clear_bit(event->id, &syncobj->pending); event->handle = NULL; drawobj_put(drawobj); kgsl_drawobj_put(drawobj); /* * If ret == 0 the fence was already signaled - print a trace Loading @@ -389,8 +382,7 @@ static int drawobj_add_sync_fence(struct kgsl_device *device, return ret; } kgsl_dump_fence(event->handle, fence_str, sizeof(fence_str)); trace_syncpoint_fence(syncobj, fence_str); trace_syncpoint_fence(syncobj, event->fence_name); return 0; } Loading Loading @@ -457,7 +449,7 @@ static int drawobj_add_sync_timestamp(struct kgsl_device *device, if (ret) { clear_bit(event->id, &syncobj->pending); drawobj_put(drawobj); kgsl_drawobj_put(drawobj); } else { trace_syncpoint_timestamp(syncobj, context, sync->timestamp); } Loading
drivers/gpu/msm/kgsl_drawobj.h +13 −0 Original line number Diff line number Diff line Loading @@ -105,6 +105,8 @@ struct kgsl_drawobj_sync { unsigned long timeout_jiffies; }; #define KGSL_FENCE_NAME_LEN 74 /** * struct kgsl_drawobj_sync_event * @id: identifer (positiion within the pending bitmap) Loading @@ -114,6 +116,7 @@ struct kgsl_drawobj_sync { * register this event * @timestamp: Pending timestamp for the event * @handle: Pointer to a sync fence handle * @fence_name: A fence name string to describe the fence * @device: Pointer to the KGSL device */ struct kgsl_drawobj_sync_event { Loading @@ -123,6 +126,7 @@ struct kgsl_drawobj_sync_event { struct kgsl_context *context; unsigned int timestamp; struct kgsl_sync_fence_cb *handle; char fence_name[KGSL_FENCE_NAME_LEN]; struct kgsl_device *device; }; Loading Loading @@ -206,6 +210,8 @@ void kgsl_dump_syncpoints(struct kgsl_device *device, void kgsl_drawobj_destroy(struct kgsl_drawobj *drawobj); void kgsl_drawobj_destroy_object(struct kref *kref); static inline bool kgsl_drawobj_events_pending( struct kgsl_drawobj_sync *syncobj) { Loading @@ -220,4 +226,11 @@ static inline bool kgsl_drawobj_event_pending( return test_bit(bit, &syncobj->pending); } static inline void kgsl_drawobj_put(struct kgsl_drawobj *drawobj) { if (drawobj) kref_put(&drawobj->refcount, kgsl_drawobj_destroy_object); } #endif /* __KGSL_DRAWOBJ_H */