#define DO_NUMA(x)     do { } while (0)
 #endif
 
+typedef u8 rmap_age_t;
+
 /**
  * DOC: Overview
  *
  * @node: rb node of this rmap_item in the unstable tree
  * @head: pointer to stable_node heading this list in the stable tree
  * @hlist: link into hlist of rmap_items hanging off that stable_node
+ * @age: number of scan iterations since creation
+ * @remaining_skips: how many scans to skip
  */
 struct ksm_rmap_item {
        struct ksm_rmap_item *rmap_list;
        struct mm_struct *mm;
        unsigned long address;          /* + low bits used for flags below */
        unsigned int oldchecksum;       /* when unstable */
+       rmap_age_t age;
+       rmap_age_t remaining_skips;
        union {
                struct rb_node node;    /* when node of unstable tree */
                struct {                /* when listed from stable tree */
 /* Whether to merge empty (zeroed) pages with actual zero pages */
 static bool ksm_use_zero_pages __read_mostly;
 
+/* Skip pages that couldn't be de-duplicated previously */
+/* Default to true at least temporarily, for testing */
+static bool ksm_smart_scan = true;
+
 /* The number of zero pages which is placed by KSM */
 unsigned long ksm_zero_pages;
 
        return rmap_item;
 }
 
+/*
+ * Calculate skip age for the ksm page age. The age determines how often
+ * de-duplicating has already been tried unsuccessfully. If the age is
+ * smaller, the scanning of this page is skipped for less scans.
+ *
+ * @age: rmap_item age of page
+ */
+static unsigned int skip_age(rmap_age_t age)
+{
+       if (age <= 3)
+               return 1;
+       if (age <= 5)
+               return 2;
+       if (age <= 8)
+               return 4;
+
+       return 8;
+}
+
+/*
+ * Determines if a page should be skipped for the current scan.
+ *
+ * @page: page to check
+ * @rmap_item: associated rmap_item of page
+ */
+static bool should_skip_rmap_item(struct page *page,
+                                 struct ksm_rmap_item *rmap_item)
+{
+       rmap_age_t age;
+
+       if (!ksm_smart_scan)
+               return false;
+
+       /*
+        * Never skip pages that are already KSM; pages cmp_and_merge_page()
+        * will essentially ignore them, but we still have to process them
+        * properly.
+        */
+       if (PageKsm(page))
+               return false;
+
+       age = rmap_item->age;
+       if (age != U8_MAX)
+               rmap_item->age++;
+
+       /*
+        * Smaller ages are not skipped, they need to get a chance to go
+        * through the different phases of the KSM merging.
+        */
+       if (age < 3)
+               return false;
+
+       /*
+        * Are we still allowed to skip? If not, then don't skip it
+        * and determine how much more often we are allowed to skip next.
+        */
+       if (!rmap_item->remaining_skips) {
+               rmap_item->remaining_skips = skip_age(age);
+               return false;
+       }
+
+       /* Skip this page */
+       rmap_item->remaining_skips--;
+       remove_rmap_item_from_tree(rmap_item);
+       return true;
+}
+
 static struct ksm_rmap_item *scan_get_next_rmap_item(struct page **page)
 {
        struct mm_struct *mm;
                                if (rmap_item) {
                                        ksm_scan.rmap_list =
                                                        &rmap_item->rmap_list;
+
+                                       if (should_skip_rmap_item(*page, rmap_item))
+                                               goto next_page;
+
                                        ksm_scan.address += PAGE_SIZE;
                                } else
                                        put_page(*page);
 }
 KSM_ATTR_RO(full_scans);
 
+static ssize_t smart_scan_show(struct kobject *kobj,
+                              struct kobj_attribute *attr, char *buf)
+{
+       return sysfs_emit(buf, "%u\n", ksm_smart_scan);
+}
+
+static ssize_t smart_scan_store(struct kobject *kobj,
+                               struct kobj_attribute *attr,
+                               const char *buf, size_t count)
+{
+       int err;
+       bool value;
+
+       err = kstrtobool(buf, &value);
+       if (err)
+               return -EINVAL;
+
+       ksm_smart_scan = value;
+       return count;
+}
+KSM_ATTR(smart_scan);
+
 static struct attribute *ksm_attrs[] = {
        &sleep_millisecs_attr.attr,
        &pages_to_scan_attr.attr,
        &stable_node_chains_prune_millisecs_attr.attr,
        &use_zero_pages_attr.attr,
        &general_profit_attr.attr,
+       &smart_scan_attr.attr,
        NULL,
 };