Makes SDT able to track dependencies by swait.

Signed-off-by: Byungchul Park <byungchul.p...@lge.com>
---
 include/linux/swait.h |  4 ++++
 kernel/sched/swait.c  | 10 ++++++++++
 2 files changed, 14 insertions(+)

diff --git a/include/linux/swait.h b/include/linux/swait.h
index 6a8c22b..dbdf2ce 100644
--- a/include/linux/swait.h
+++ b/include/linux/swait.h
@@ -6,6 +6,7 @@
 #include <linux/stddef.h>
 #include <linux/spinlock.h>
 #include <linux/wait.h>
+#include <linux/dept_sdt.h>
 #include <asm/current.h>
 
 /*
@@ -43,6 +44,7 @@
 struct swait_queue_head {
        raw_spinlock_t          lock;
        struct list_head        task_list;
+       struct dept_map         dmap;
 };
 
 struct swait_queue {
@@ -61,6 +63,7 @@ struct swait_queue {
 #define __SWAIT_QUEUE_HEAD_INITIALIZER(name) {                         \
        .lock           = __RAW_SPIN_LOCK_UNLOCKED(name.lock),          \
        .task_list      = LIST_HEAD_INIT((name).task_list),             \
+       .dmap           = DEPT_SDT_MAP_INIT(name),                      \
 }
 
 #define DECLARE_SWAIT_QUEUE_HEAD(name)                                 \
@@ -72,6 +75,7 @@ extern void __init_swait_queue_head(struct swait_queue_head 
*q, const char *name
 #define init_swait_queue_head(q)                               \
        do {                                                    \
                static struct lock_class_key __key;             \
+               sdt_map_init(&(q)->dmap);                       \
                __init_swait_queue_head((q), #q, &__key);       \
        } while (0)
 
diff --git a/kernel/sched/swait.c b/kernel/sched/swait.c
index e1c655f..4ca7d6e 100644
--- a/kernel/sched/swait.c
+++ b/kernel/sched/swait.c
@@ -27,6 +27,7 @@ void swake_up_locked(struct swait_queue_head *q)
                return;
 
        curr = list_first_entry(&q->task_list, typeof(*curr), task_list);
+       sdt_event(&q->dmap);
        wake_up_process(curr->task);
        list_del_init(&curr->task_list);
 }
@@ -69,6 +70,7 @@ void swake_up_all(struct swait_queue_head *q)
        while (!list_empty(&tmp)) {
                curr = list_first_entry(&tmp, typeof(*curr), task_list);
 
+               sdt_event(&q->dmap);
                wake_up_state(curr->task, TASK_NORMAL);
                list_del_init(&curr->task_list);
 
@@ -97,6 +99,9 @@ void prepare_to_swait_exclusive(struct swait_queue_head *q, 
struct swait_queue *
        __prepare_to_swait(q, wait);
        set_current_state(state);
        raw_spin_unlock_irqrestore(&q->lock, flags);
+
+       if (state & TASK_NORMAL)
+               sdt_wait_prepare(&q->dmap);
 }
 EXPORT_SYMBOL(prepare_to_swait_exclusive);
 
@@ -119,12 +124,16 @@ long prepare_to_swait_event(struct swait_queue_head *q, 
struct swait_queue *wait
        }
        raw_spin_unlock_irqrestore(&q->lock, flags);
 
+       if (!ret && state & TASK_NORMAL)
+               sdt_wait_prepare(&q->dmap);
+
        return ret;
 }
 EXPORT_SYMBOL(prepare_to_swait_event);
 
 void __finish_swait(struct swait_queue_head *q, struct swait_queue *wait)
 {
+       sdt_wait_finish();
        __set_current_state(TASK_RUNNING);
        if (!list_empty(&wait->task_list))
                list_del_init(&wait->task_list);
@@ -134,6 +143,7 @@ void finish_swait(struct swait_queue_head *q, struct 
swait_queue *wait)
 {
        unsigned long flags;
 
+       sdt_wait_finish();
        __set_current_state(TASK_RUNNING);
 
        if (!list_empty_careful(&wait->task_list)) {
-- 
1.9.1

Reply via email to