OSDN Git Service

Merge android-4.4-p.203 (40ef73d) into msm-4.4
[sagit-ice-cold/kernel_xiaomi_msm8998.git] / mm / shmem.c
index 3a88c66..bfc2012 100644 (file)
@@ -1003,7 +1003,7 @@ static int shmem_replace_page(struct page **pagep, gfp_t gfp,
        copy_highpage(newpage, oldpage);
        flush_dcache_page(newpage);
 
-       __set_page_locked(newpage);
+       __SetPageLocked(newpage);
        SetPageUptodate(newpage);
        SetPageSwapBacked(newpage);
        set_page_private(newpage, swap_index);
@@ -1195,7 +1195,7 @@ repeat:
                }
 
                __SetPageSwapBacked(page);
-               __set_page_locked(page);
+               __SetPageLocked(page);
                if (sgp == SGP_WRITE)
                        __SetPageReferenced(page);
 
@@ -1854,31 +1854,33 @@ static void shmem_tag_pins(struct address_space *mapping)
        void **slot;
        pgoff_t start;
        struct page *page;
+       unsigned int tagged = 0;
 
        lru_add_drain();
        start = 0;
-       rcu_read_lock();
 
+       spin_lock_irq(&mapping->tree_lock);
 restart:
        radix_tree_for_each_slot(slot, &mapping->page_tree, &iter, start) {
-               page = radix_tree_deref_slot(slot);
+               page = radix_tree_deref_slot_protected(slot, &mapping->tree_lock);
                if (!page || radix_tree_exception(page)) {
                        if (radix_tree_deref_retry(page))
                                goto restart;
                } else if (page_count(page) - page_mapcount(page) > 1) {
-                       spin_lock_irq(&mapping->tree_lock);
                        radix_tree_tag_set(&mapping->page_tree, iter.index,
                                           SHMEM_TAG_PINNED);
-                       spin_unlock_irq(&mapping->tree_lock);
                }
 
-               if (need_resched()) {
-                       cond_resched_rcu();
-                       start = iter.index + 1;
-                       goto restart;
-               }
+               if (++tagged % 1024)
+                       continue;
+
+               spin_unlock_irq(&mapping->tree_lock);
+               cond_resched();
+               start = iter.index + 1;
+               spin_lock_irq(&mapping->tree_lock);
+               goto restart;
        }
-       rcu_read_unlock();
+       spin_unlock_irq(&mapping->tree_lock);
 }
 
 /*