TRACE_EVENT_CONDITION(update_swap_token_priority,
        TP_PROTO(struct mm_struct *mm,
-                unsigned int old_prio),
+                unsigned int old_prio,
+                struct mm_struct *swap_token_mm),
 
-       TP_ARGS(mm, old_prio),
+       TP_ARGS(mm, old_prio, swap_token_mm),
 
        TP_CONDITION(mm->token_priority != old_prio),
 
                __field(struct mm_struct*, mm)
                __field(unsigned int, old_prio)
                __field(unsigned int, new_prio)
+               __field(struct mm_struct*, swap_token_mm)
+               __field(unsigned int, swap_token_prio)
        ),
 
        TP_fast_assign(
-               __entry->mm = mm;
-               __entry->old_prio = old_prio;
-               __entry->new_prio = mm->token_priority;
+               __entry->mm             = mm;
+               __entry->old_prio       = old_prio;
+               __entry->new_prio       = mm->token_priority;
+               __entry->swap_token_mm  = swap_token_mm;
+               __entry->swap_token_prio = swap_token_mm ? swap_token_mm->token_priority : 0;
        ),
 
-       TP_printk("mm=%p old_prio=%u new_prio=%u",
-                 __entry->mm, __entry->old_prio, __entry->new_prio)
+       TP_printk("mm=%p old_prio=%u new_prio=%u swap_token_mm=%p token_prio=%u",
+                 __entry->mm, __entry->old_prio, __entry->new_prio,
+                 __entry->swap_token_mm, __entry->swap_token_prio)
 );
 
 #endif /* _TRACE_VMSCAN_H */
 
 
 #include <trace/events/vmscan.h>
 
+#define TOKEN_AGING_INTERVAL   (0xFF)
+
 static DEFINE_SPINLOCK(swap_token_lock);
 struct mm_struct *swap_token_mm;
 struct mem_cgroup *swap_token_memcg;
 static unsigned int global_faults;
+static unsigned int last_aging;
 
 #ifdef CONFIG_CGROUP_MEM_RES_CTLR
 static struct mem_cgroup *swap_token_memcg_from_mm(struct mm_struct *mm)
        if (!swap_token_mm)
                goto replace_token;
 
+       if ((global_faults - last_aging) > TOKEN_AGING_INTERVAL) {
+               swap_token_mm->token_priority /= 2;
+               last_aging = global_faults;
+       }
+
        if (mm == swap_token_mm) {
                mm->token_priority += 2;
                goto update_priority;
                goto replace_token;
 
 update_priority:
-       trace_update_swap_token_priority(mm, old_prio);
+       trace_update_swap_token_priority(mm, old_prio, swap_token_mm);
 
 out:
        mm->faultstamp = global_faults;
        trace_replace_swap_token(swap_token_mm, mm);
        swap_token_mm = mm;
        swap_token_memcg = swap_token_memcg_from_mm(mm);
+       last_aging = global_faults;
        goto out;
 }