sync: add timestamps to sync_pts
Erik Gilling [Thu, 15 Mar 2012 21:59:33 +0000 (14:59 -0700)]
Change-Id: I2ad855072b86873880769a09a3176e85aa1199d7
Signed-off-by: Erik Gilling <konkers@android.com>

drivers/base/sync.c
include/linux/sync.h

index 4a8604b..ea0b664 100644 (file)
@@ -155,12 +155,17 @@ void sync_pt_free(struct sync_pt *pt)
 /* call with pt->parent->active_list_lock held */
 static int _sync_pt_has_signaled(struct sync_pt *pt)
 {
+       int old_status = pt->status;
+
        if (!pt->status)
                pt->status = pt->parent->ops->has_signaled(pt);
 
        if (!pt->status && pt->parent->destroyed)
                pt->status = -ENOENT;
 
+       if (pt->status != old_status)
+               pt->timestamp = ktime_get();
+
        return pt->status;
 }
 
index 388acd1..a8e289d 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/types.h>
 #ifdef __KERNEL__
 
+#include <linux/ktime.h>
 #include <linux/list.h>
 #include <linux/spinlock.h>
 #include <linux/wait.h>
@@ -90,6 +91,8 @@ struct sync_timeline {
  * @fence:             sync_fence to which the sync_pt belongs
  * @pt_list:           membership in sync_fence.pt_list_head
  * @status:            1: signaled, 0:active, <0: error
+ * @timestamp:         time which sync_pt status transitioned from active to
+ *                       singaled or error.
  */
 struct sync_pt {
        struct sync_timeline            *parent;
@@ -102,6 +105,8 @@ struct sync_pt {
 
        /* protected by parent->active_list_lock */
        int                     status;
+
+       ktime_t                 timestamp;
 };
 
 /**