Merge tag 'acpi-5.17-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
[linux-2.6-microblaze.git] / mm / swapfile.c
index caa9f81..bf0df7a 100644 (file)
@@ -49,7 +49,7 @@ static bool swap_count_continued(struct swap_info_struct *, pgoff_t,
                                 unsigned char);
 static void free_swap_count_continuations(struct swap_info_struct *);
 
-DEFINE_SPINLOCK(swap_lock);
+static DEFINE_SPINLOCK(swap_lock);
 static unsigned int nr_swapfiles;
 atomic_long_t nr_swap_pages;
 /*
@@ -71,7 +71,7 @@ static const char Unused_offset[] = "Unused swap offset entry ";
  * all active swap_info_structs
  * protected with swap_lock, and ordered by priority.
  */
-PLIST_HEAD(swap_active_head);
+static PLIST_HEAD(swap_active_head);
 
 /*
  * all available (active, not full) swap_info_structs
@@ -1923,8 +1923,7 @@ out:
 
 static int unuse_pte_range(struct vm_area_struct *vma, pmd_t *pmd,
                        unsigned long addr, unsigned long end,
-                       unsigned int type, bool frontswap,
-                       unsigned long *fs_pages_to_unuse)
+                       unsigned int type)
 {
        struct page *page;
        swp_entry_t entry;
@@ -1945,9 +1944,6 @@ static int unuse_pte_range(struct vm_area_struct *vma, pmd_t *pmd,
                        continue;
 
                offset = swp_offset(entry);
-               if (frontswap && !frontswap_test(si, offset))
-                       continue;
-
                pte_unmap(pte);
                swap_map = &si->swap_map[offset];
                page = lookup_swap_cache(entry, vma, addr);
@@ -1979,11 +1975,6 @@ static int unuse_pte_range(struct vm_area_struct *vma, pmd_t *pmd,
                try_to_free_swap(page);
                unlock_page(page);
                put_page(page);
-
-               if (*fs_pages_to_unuse && !--(*fs_pages_to_unuse)) {
-                       ret = FRONTSWAP_PAGES_UNUSED;
-                       goto out;
-               }
 try_next:
                pte = pte_offset_map(pmd, addr);
        } while (pte++, addr += PAGE_SIZE, addr != end);
@@ -1996,8 +1987,7 @@ out:
 
 static inline int unuse_pmd_range(struct vm_area_struct *vma, pud_t *pud,
                                unsigned long addr, unsigned long end,
-                               unsigned int type, bool frontswap,
-                               unsigned long *fs_pages_to_unuse)
+                               unsigned int type)
 {
        pmd_t *pmd;
        unsigned long next;
@@ -2009,8 +1999,7 @@ static inline int unuse_pmd_range(struct vm_area_struct *vma, pud_t *pud,
                next = pmd_addr_end(addr, end);
                if (pmd_none_or_trans_huge_or_clear_bad(pmd))
                        continue;
-               ret = unuse_pte_range(vma, pmd, addr, next, type,
-                                     frontswap, fs_pages_to_unuse);
+               ret = unuse_pte_range(vma, pmd, addr, next, type);
                if (ret)
                        return ret;
        } while (pmd++, addr = next, addr != end);
@@ -2019,8 +2008,7 @@ static inline int unuse_pmd_range(struct vm_area_struct *vma, pud_t *pud,
 
 static inline int unuse_pud_range(struct vm_area_struct *vma, p4d_t *p4d,
                                unsigned long addr, unsigned long end,
-                               unsigned int type, bool frontswap,
-                               unsigned long *fs_pages_to_unuse)
+                               unsigned int type)
 {
        pud_t *pud;
        unsigned long next;
@@ -2031,8 +2019,7 @@ static inline int unuse_pud_range(struct vm_area_struct *vma, p4d_t *p4d,
                next = pud_addr_end(addr, end);
                if (pud_none_or_clear_bad(pud))
                        continue;
-               ret = unuse_pmd_range(vma, pud, addr, next, type,
-                                     frontswap, fs_pages_to_unuse);
+               ret = unuse_pmd_range(vma, pud, addr, next, type);
                if (ret)
                        return ret;
        } while (pud++, addr = next, addr != end);
@@ -2041,8 +2028,7 @@ static inline int unuse_pud_range(struct vm_area_struct *vma, p4d_t *p4d,
 
 static inline int unuse_p4d_range(struct vm_area_struct *vma, pgd_t *pgd,
                                unsigned long addr, unsigned long end,
-                               unsigned int type, bool frontswap,
-                               unsigned long *fs_pages_to_unuse)
+                               unsigned int type)
 {
        p4d_t *p4d;
        unsigned long next;
@@ -2053,16 +2039,14 @@ static inline int unuse_p4d_range(struct vm_area_struct *vma, pgd_t *pgd,
                next = p4d_addr_end(addr, end);
                if (p4d_none_or_clear_bad(p4d))
                        continue;
-               ret = unuse_pud_range(vma, p4d, addr, next, type,
-                                     frontswap, fs_pages_to_unuse);
+               ret = unuse_pud_range(vma, p4d, addr, next, type);
                if (ret)
                        return ret;
        } while (p4d++, addr = next, addr != end);
        return 0;
 }
 
-static int unuse_vma(struct vm_area_struct *vma, unsigned int type,
-                    bool frontswap, unsigned long *fs_pages_to_unuse)
+static int unuse_vma(struct vm_area_struct *vma, unsigned int type)
 {
        pgd_t *pgd;
        unsigned long addr, end, next;
@@ -2076,16 +2060,14 @@ static int unuse_vma(struct vm_area_struct *vma, unsigned int type,
                next = pgd_addr_end(addr, end);
                if (pgd_none_or_clear_bad(pgd))
                        continue;
-               ret = unuse_p4d_range(vma, pgd, addr, next, type,
-                                     frontswap, fs_pages_to_unuse);
+               ret = unuse_p4d_range(vma, pgd, addr, next, type);
                if (ret)
                        return ret;
        } while (pgd++, addr = next, addr != end);
        return 0;
 }
 
-static int unuse_mm(struct mm_struct *mm, unsigned int type,
-                   bool frontswap, unsigned long *fs_pages_to_unuse)
+static int unuse_mm(struct mm_struct *mm, unsigned int type)
 {
        struct vm_area_struct *vma;
        int ret = 0;
@@ -2093,8 +2075,7 @@ static int unuse_mm(struct mm_struct *mm, unsigned int type,
        mmap_read_lock(mm);
        for (vma = mm->mmap; vma; vma = vma->vm_next) {
                if (vma->anon_vma) {
-                       ret = unuse_vma(vma, type, frontswap,
-                                       fs_pages_to_unuse);
+                       ret = unuse_vma(vma, type);
                        if (ret)
                                break;
                }
@@ -2110,7 +2091,7 @@ static int unuse_mm(struct mm_struct *mm, unsigned int type,
  * if there are no inuse entries after prev till end of the map.
  */
 static unsigned int find_next_to_unuse(struct swap_info_struct *si,
-                                       unsigned int prev, bool frontswap)
+                                       unsigned int prev)
 {
        unsigned int i;
        unsigned char count;
@@ -2124,8 +2105,7 @@ static unsigned int find_next_to_unuse(struct swap_info_struct *si,
        for (i = prev + 1; i < si->max; i++) {
                count = READ_ONCE(si->swap_map[i]);
                if (count && swap_count(count) != SWAP_MAP_BAD)
-                       if (!frontswap || frontswap_test(si, i))
-                               break;
+                       break;
                if ((i % LATENCY_LIMIT) == 0)
                        cond_resched();
        }
@@ -2136,12 +2116,7 @@ static unsigned int find_next_to_unuse(struct swap_info_struct *si,
        return i;
 }
 
-/*
- * If the boolean frontswap is true, only unuse pages_to_unuse pages;
- * pages_to_unuse==0 means all pages; ignored if frontswap is false
- */
-int try_to_unuse(unsigned int type, bool frontswap,
-                unsigned long pages_to_unuse)
+static int try_to_unuse(unsigned int type)
 {
        struct mm_struct *prev_mm;
        struct mm_struct *mm;
@@ -2155,13 +2130,10 @@ int try_to_unuse(unsigned int type, bool frontswap,
        if (!READ_ONCE(si->inuse_pages))
                return 0;
 
-       if (!frontswap)
-               pages_to_unuse = 0;
-
 retry:
-       retval = shmem_unuse(type, frontswap, &pages_to_unuse);
+       retval = shmem_unuse(type);
        if (retval)
-               goto out;
+               return retval;
 
        prev_mm = &init_mm;
        mmget(prev_mm);
@@ -2178,11 +2150,10 @@ retry:
                spin_unlock(&mmlist_lock);
                mmput(prev_mm);
                prev_mm = mm;
-               retval = unuse_mm(mm, type, frontswap, &pages_to_unuse);
-
+               retval = unuse_mm(mm, type);
                if (retval) {
                        mmput(prev_mm);
-                       goto out;
+                       return retval;
                }
 
                /*
@@ -2199,7 +2170,7 @@ retry:
        i = 0;
        while (READ_ONCE(si->inuse_pages) &&
               !signal_pending(current) &&
-              (i = find_next_to_unuse(si, i, frontswap)) != 0) {
+              (i = find_next_to_unuse(si, i)) != 0) {
 
                entry = swp_entry(type, i);
                page = find_get_page(swap_address_space(entry), i);
@@ -2217,14 +2188,6 @@ retry:
                try_to_free_swap(page);
                unlock_page(page);
                put_page(page);
-
-               /*
-                * For frontswap, we just need to unuse pages_to_unuse, if
-                * it was specified. Need not check frontswap again here as
-                * we already zeroed out pages_to_unuse if not frontswap.
-                */
-               if (pages_to_unuse && --pages_to_unuse == 0)
-                       goto out;
        }
 
        /*
@@ -2242,10 +2205,10 @@ retry:
        if (READ_ONCE(si->inuse_pages)) {
                if (!signal_pending(current))
                        goto retry;
-               retval = -EINTR;
+               return -EINTR;
        }
-out:
-       return (retval == FRONTSWAP_PAGES_UNUSED) ? 0 : retval;
+
+       return 0;
 }
 
 /*
@@ -2463,7 +2426,8 @@ static void enable_swap_info(struct swap_info_struct *p, int prio,
                                struct swap_cluster_info *cluster_info,
                                unsigned long *frontswap_map)
 {
-       frontswap_init(p->type, frontswap_map);
+       if (IS_ENABLED(CONFIG_FRONTSWAP))
+               frontswap_init(p->type, frontswap_map);
        spin_lock(&swap_lock);
        spin_lock(&p->lock);
        setup_swap_info(p, prio, swap_map, cluster_info);
@@ -2576,7 +2540,7 @@ SYSCALL_DEFINE1(swapoff, const char __user *, specialfile)
        disable_swap_slots_cache_lock();
 
        set_current_oom_origin();
-       err = try_to_unuse(p->type, false, 0); /* force unuse all pages */
+       err = try_to_unuse(p->type);
        clear_current_oom_origin();
 
        if (err) {