/* Architecture-specific MM context */
        mm_context_t context;
 
-       /* Swap token stuff */
-       /*
-        * Last value of global fault stamp as seen by this process.
-        * In other words, this value gives an indication of how long
-        * it has been since this task got the token.
-        * Look at mm/thrash.c
-        */
-       unsigned int faultstamp;
-       unsigned int token_priority;
-       unsigned int last_interval;
-
        unsigned long flags; /* Must use atomic bitops to access the bits */
 
        struct core_state *core_state; /* coredumping support */
 
 extern int try_to_free_swap(struct page *);
 struct backing_dev_info;
 
-/* linux/mm/thrash.c */
-extern struct mm_struct *swap_token_mm;
-extern void grab_swap_token(struct mm_struct *);
-extern void __put_swap_token(struct mm_struct *);
-extern void disable_swap_token(struct mem_cgroup *memcg);
-
-static inline int has_swap_token(struct mm_struct *mm)
-{
-       return (mm == swap_token_mm);
-}
-
-static inline void put_swap_token(struct mm_struct *mm)
-{
-       if (has_swap_token(mm))
-               __put_swap_token(mm);
-}
-
 #ifdef CONFIG_CGROUP_MEM_RES_CTLR
 extern void
 mem_cgroup_uncharge_swapcache(struct page *page, swp_entry_t ent, bool swapout);
        return entry;
 }
 
-/* linux/mm/thrash.c */
-static inline void put_swap_token(struct mm_struct *mm)
-{
-}
-
-static inline void grab_swap_token(struct mm_struct *mm)
-{
-}
-
-static inline int has_swap_token(struct mm_struct *mm)
-{
-       return 0;
-}
-
-static inline void disable_swap_token(struct mem_cgroup *memcg)
-{
-}
-
 static inline void
 mem_cgroup_uncharge_swapcache(struct page *page, swp_entry_t ent)
 {
 
                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,
-                struct mm_struct *swap_token_mm),
-
-       TP_ARGS(mm, old_prio, swap_token_mm),
-
-       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)
-               __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->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 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 */
 
 /* This part must be outside protection */
 
                        list_del(&mm->mmlist);
                        spin_unlock(&mmlist_lock);
                }
-               put_swap_token(mm);
                if (mm->binfmt)
                        module_put(mm->binfmt->module);
                mmdrop(mm);
        memcpy(mm, oldmm, sizeof(*mm));
        mm_init_cpumask(mm);
 
-       /* Initializing for Swap token stuff */
-       mm->token_priority = 0;
-       mm->last_interval = 0;
-
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
        mm->pmd_huge_pte = NULL;
 #endif
                goto fail_nomem;
 
 good_mm:
-       /* Initializing for Swap token stuff */
-       mm->token_priority = 0;
-       mm->last_interval = 0;
-
        tsk->mm = mm;
        tsk->active_mm = mm;
        return 0;
 
 obj-$(CONFIG_HAVE_MEMBLOCK) += memblock.o
 
 obj-$(CONFIG_BOUNCE)   += bounce.o
-obj-$(CONFIG_SWAP)     += page_io.o swap_state.o swapfile.o thrash.o
+obj-$(CONFIG_SWAP)     += page_io.o swap_state.o swapfile.o
 obj-$(CONFIG_HAS_DMA)  += dmapool.o
 obj-$(CONFIG_HUGETLBFS)        += hugetlb.o
 obj-$(CONFIG_NUMA)     += mempolicy.o
 
        if (mm) {
                if (mc.to)
                        mem_cgroup_move_charge(mm);
-               put_swap_token(mm);
                mmput(mm);
        }
        if (mc.to)
 
        delayacct_set_flag(DELAYACCT_PF_SWAPIN);
        page = lookup_swap_cache(entry);
        if (!page) {
-               grab_swap_token(mm); /* Contend for token _before_ read-in */
                page = swapin_readahead(entry,
                                        GFP_HIGHUSER_MOVABLE, vma, address);
                if (!page) {
        }
 
        locked = lock_page_or_retry(page, mm, flags);
+
        delayacct_clear_flag(DELAYACCT_PF_SWAPIN);
        if (!locked) {
                ret |= VM_FAULT_RETRY;
 
                pte_unmap_unlock(pte, ptl);
        }
 
-       /* Pretend the page is referenced if the task has the
-          swap token and is in the middle of a page fault. */
-       if (mm != current->mm && has_swap_token(mm) &&
-                       rwsem_is_locked(&mm->mmap_sem))
-               referenced++;
-
        (*mapcount)--;
 
        if (referenced)
 
+++ /dev/null
-/*
- * mm/thrash.c
- *
- * Copyright (C) 2004, Red Hat, Inc.
- * Copyright (C) 2004, Rik van Riel <riel@redhat.com>
- * Released under the GPL, see the file COPYING for details.
- *
- * Simple token based thrashing protection, using the algorithm
- * described in: http://www.cse.ohio-state.edu/hpcs/WWW/HTML/publications/abs05-1.html
- *
- * Sep 2006, Ashwin Chaugule <ashwin.chaugule@celunite.com>
- * Improved algorithm to pass token:
- * Each task has a priority which is incremented if it contended
- * for the token in an interval less than its previous attempt.
- * If the token is acquired, that task's priority is boosted to prevent
- * the token from bouncing around too often and to let the task make
- * some progress in its execution.
- */
-
-#include <linux/jiffies.h>
-#include <linux/mm.h>
-#include <linux/sched.h>
-#include <linux/swap.h>
-#include <linux/memcontrol.h>
-
-#include <trace/events/vmscan.h>
-
-#define TOKEN_AGING_INTERVAL   (0xFF)
-
-static DEFINE_SPINLOCK(swap_token_lock);
-struct mm_struct *swap_token_mm;
-static struct mem_cgroup *swap_token_memcg;
-
-#ifdef CONFIG_CGROUP_MEM_RES_CTLR
-static struct mem_cgroup *swap_token_memcg_from_mm(struct mm_struct *mm)
-{
-       struct mem_cgroup *memcg;
-
-       memcg = try_get_mem_cgroup_from_mm(mm);
-       if (memcg)
-               css_put(mem_cgroup_css(memcg));
-
-       return memcg;
-}
-#else
-static struct mem_cgroup *swap_token_memcg_from_mm(struct mm_struct *mm)
-{
-       return NULL;
-}
-#endif
-
-void grab_swap_token(struct mm_struct *mm)
-{
-       int current_interval;
-       unsigned int old_prio = mm->token_priority;
-       static unsigned int global_faults;
-       static unsigned int last_aging;
-
-       global_faults++;
-
-       current_interval = global_faults - mm->faultstamp;
-
-       if (!spin_trylock(&swap_token_lock))
-               return;
-
-       /* First come first served */
-       if (!swap_token_mm)
-               goto replace_token;
-
-       /*
-        * Usually, we don't need priority aging because long interval faults
-        * makes priority decrease quickly. But there is one exception. If the
-        * token owner task is sleeping, it never make long interval faults.
-        * Thus, we need a priority aging mechanism instead. The requirements
-        * of priority aging are
-        *  1) An aging interval is reasonable enough long. Too short aging
-        *     interval makes quick swap token lost and decrease performance.
-        *  2) The swap token owner task have to get priority aging even if
-        *     it's under sleep.
-        */
-       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;
-       }
-
-       if (current_interval < mm->last_interval)
-               mm->token_priority++;
-       else {
-               if (likely(mm->token_priority > 0))
-                       mm->token_priority--;
-       }
-
-       /* Check if we deserve the token */
-       if (mm->token_priority > swap_token_mm->token_priority)
-               goto replace_token;
-
-update_priority:
-       trace_update_swap_token_priority(mm, old_prio, swap_token_mm);
-
-out:
-       mm->faultstamp = global_faults;
-       mm->last_interval = current_interval;
-       spin_unlock(&swap_token_lock);
-       return;
-
-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);
-       last_aging = global_faults;
-       goto out;
-}
-
-/* Called on process exit. */
-void __put_swap_token(struct mm_struct *mm)
-{
-       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;
-       }
-       spin_unlock(&swap_token_lock);
-}
-
-static bool match_memcg(struct mem_cgroup *a, struct mem_cgroup *b)
-{
-       if (!a)
-               return true;
-       if (!b)
-               return true;
-       if (a == b)
-               return true;
-       return false;
-}
-
-void disable_swap_token(struct mem_cgroup *memcg)
-{
-       /* memcg reclaim don't disable unrelated mm token. */
-       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;
-               }
-               spin_unlock(&swap_token_lock);
-       }
-}
 
 
        for (priority = DEF_PRIORITY; priority >= 0; priority--) {
                sc->nr_scanned = 0;
-               if (!priority)
-                       disable_swap_token(sc->target_mem_cgroup);
                aborted_reclaim = shrink_zones(priority, zonelist, sc);
 
                /*
                unsigned long lru_pages = 0;
                int has_under_min_watermark_zone = 0;
 
-               /* The swap token gets in the way of swapout... */
-               if (!priority)
-                       disable_swap_token(NULL);
-
                all_zones_ok = 1;
                balanced = 0;