#include <linux/types.h>
 #include <linux/tracepoint.h>
+#include <linux/mm.h>
+#include <linux/memcontrol.h>
 #include "gfpflags.h"
 
 #define RECLAIM_WB_ANON                0x0001u
                show_reclaim_flags(__entry->reclaim_flags))
 );
 
+TRACE_EVENT(replace_swap_token,
+       TP_PROTO(struct mm_struct *old_mm,
+                struct mm_struct *new_mm),
+
+       TP_ARGS(old_mm, new_mm),
+
+       TP_STRUCT__entry(
+               __field(struct mm_struct*,      old_mm)
+               __field(unsigned int,           old_prio)
+               __field(struct mm_struct*,      new_mm)
+               __field(unsigned int,           new_prio)
+       ),
+
+       TP_fast_assign(
+               __entry->old_mm   = old_mm;
+               __entry->old_prio = old_mm ? old_mm->token_priority : 0;
+               __entry->new_mm   = new_mm;
+               __entry->new_prio = new_mm->token_priority;
+       ),
+
+       TP_printk("old_token_mm=%p old_prio=%u new_token_mm=%p new_prio=%u",
+                 __entry->old_mm, __entry->old_prio,
+                 __entry->new_mm, __entry->new_prio)
+);
+
+DECLARE_EVENT_CLASS(put_swap_token_template,
+       TP_PROTO(struct mm_struct *swap_token_mm),
+
+       TP_ARGS(swap_token_mm),
+
+       TP_STRUCT__entry(
+               __field(struct mm_struct*, swap_token_mm)
+       ),
+
+       TP_fast_assign(
+               __entry->swap_token_mm = swap_token_mm;
+       ),
+
+       TP_printk("token_mm=%p", __entry->swap_token_mm)
+);
+
+DEFINE_EVENT(put_swap_token_template, put_swap_token,
+       TP_PROTO(struct mm_struct *swap_token_mm),
+       TP_ARGS(swap_token_mm)
+);
+
+DEFINE_EVENT_CONDITION(put_swap_token_template, disable_swap_token,
+       TP_PROTO(struct mm_struct *swap_token_mm),
+       TP_ARGS(swap_token_mm),
+       TP_CONDITION(swap_token_mm != NULL)
+);
+
+TRACE_EVENT_CONDITION(update_swap_token_priority,
+       TP_PROTO(struct mm_struct *mm,
+                unsigned int old_prio),
+
+       TP_ARGS(mm, old_prio),
+
+       TP_CONDITION(mm->token_priority != old_prio),
+
+       TP_STRUCT__entry(
+               __field(struct mm_struct*, mm)
+               __field(unsigned int, old_prio)
+               __field(unsigned int, new_prio)
+       ),
+
+       TP_fast_assign(
+               __entry->mm = mm;
+               __entry->old_prio = old_prio;
+               __entry->new_prio = mm->token_priority;
+       ),
+
+       TP_printk("mm=%p old_prio=%u new_prio=%u",
+                 __entry->mm, __entry->old_prio, __entry->new_prio)
+);
 
 #endif /* _TRACE_VMSCAN_H */
 
 
 #include <linux/swap.h>
 #include <linux/memcontrol.h>
 
+#include <trace/events/vmscan.h>
+
 static DEFINE_SPINLOCK(swap_token_lock);
 struct mm_struct *swap_token_mm;
 struct mem_cgroup *swap_token_memcg;
 void grab_swap_token(struct mm_struct *mm)
 {
        int current_interval;
+       unsigned int old_prio = mm->token_priority;
 
        global_faults++;
 
 
        if (mm == swap_token_mm) {
                mm->token_priority += 2;
-               goto out;
+               goto update_priority;
        }
 
        if (current_interval < mm->last_interval)
        if (mm->token_priority > swap_token_mm->token_priority)
                goto replace_token;
 
+update_priority:
+       trace_update_swap_token_priority(mm, old_prio);
+
 out:
        mm->faultstamp = global_faults;
        mm->last_interval = current_interval;
 
 replace_token:
        mm->token_priority += 2;
+       trace_replace_swap_token(swap_token_mm, mm);
        swap_token_mm = mm;
        swap_token_memcg = swap_token_memcg_from_mm(mm);
        goto out;
 {
        spin_lock(&swap_token_lock);
        if (likely(mm == swap_token_mm)) {
+               trace_put_swap_token(swap_token_mm);
                swap_token_mm = NULL;
                swap_token_memcg = NULL;
        }
        if (match_memcg(memcg, swap_token_memcg)) {
                spin_lock(&swap_token_lock);
                if (match_memcg(memcg, swap_token_memcg)) {
+                       trace_disable_swap_token(swap_token_mm);
                        swap_token_mm = NULL;
                        swap_token_memcg = NULL;
                }