tree: https://github.com/hnaz/linux-mm master head: 31e523f69aa14a1f4ba298c63034d8dc62c4aae7 commit: 4dde2cf1e43ead900b72f260528ed42c2a13e266 [221/304] mm: build migrate_vma_* for all configs with ZONE_DEVICE support config: x86_64-randconfig-a006-20220214 (https://download.01.org/0day-ci/archive/20220214/202202141000.yiusACzP-lkp@xxxxxxxxx/config) compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project ea071884b0cc7210b3cc5fe858f0e892a779a23b) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/hnaz/linux-mm/commit/4dde2cf1e43ead900b72f260528ed42c2a13e266 git remote add hnaz-mm https://github.com/hnaz/linux-mm git fetch --no-tags hnaz-mm master git checkout 4dde2cf1e43ead900b72f260528ed42c2a13e266 # save the config file to linux build tree mkdir build_dir COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@xxxxxxxxx> All errors (new ones prefixed by >>): >> mm/migrate_device.c:236:3: error: implicit declaration of function 'flush_tlb_range' [-Werror,-Wimplicit-function-declaration] flush_tlb_range(walk->vma, start, end); ^ mm/migrate_device.c:236:3: note: did you mean 'flush_cache_range'? include/asm-generic/cacheflush.h:33:20: note: 'flush_cache_range' declared here static inline void flush_cache_range(struct vm_area_struct *vma, ^ 1 error generated. vim +/flush_tlb_range +236 mm/migrate_device.c 85854f9b0061e4 Christoph Hellwig 2022-02-11 54 85854f9b0061e4 Christoph Hellwig 2022-02-11 55 static int migrate_vma_collect_pmd(pmd_t *pmdp, 85854f9b0061e4 Christoph Hellwig 2022-02-11 56 unsigned long start, 85854f9b0061e4 Christoph Hellwig 2022-02-11 57 unsigned long end, 85854f9b0061e4 Christoph Hellwig 2022-02-11 58 struct mm_walk *walk) 85854f9b0061e4 Christoph Hellwig 2022-02-11 59 { 85854f9b0061e4 Christoph Hellwig 2022-02-11 60 struct migrate_vma *migrate = walk->private; 85854f9b0061e4 Christoph Hellwig 2022-02-11 61 struct vm_area_struct *vma = walk->vma; 85854f9b0061e4 Christoph Hellwig 2022-02-11 62 struct mm_struct *mm = vma->vm_mm; 85854f9b0061e4 Christoph Hellwig 2022-02-11 63 unsigned long addr = start, unmapped = 0; 85854f9b0061e4 Christoph Hellwig 2022-02-11 64 spinlock_t *ptl; 85854f9b0061e4 Christoph Hellwig 2022-02-11 65 pte_t *ptep; 85854f9b0061e4 Christoph Hellwig 2022-02-11 66 85854f9b0061e4 Christoph Hellwig 2022-02-11 67 again: 85854f9b0061e4 Christoph Hellwig 2022-02-11 68 if (pmd_none(*pmdp)) 85854f9b0061e4 Christoph Hellwig 2022-02-11 69 return migrate_vma_collect_hole(start, end, -1, walk); 85854f9b0061e4 Christoph Hellwig 2022-02-11 70 85854f9b0061e4 Christoph Hellwig 2022-02-11 71 if (pmd_trans_huge(*pmdp)) { 85854f9b0061e4 Christoph Hellwig 2022-02-11 72 struct page *page; 85854f9b0061e4 Christoph Hellwig 2022-02-11 73 85854f9b0061e4 Christoph Hellwig 2022-02-11 74 ptl = pmd_lock(mm, pmdp); 85854f9b0061e4 Christoph Hellwig 2022-02-11 75 if (unlikely(!pmd_trans_huge(*pmdp))) { 85854f9b0061e4 Christoph Hellwig 2022-02-11 76 spin_unlock(ptl); 85854f9b0061e4 Christoph Hellwig 2022-02-11 77 goto again; 85854f9b0061e4 Christoph Hellwig 2022-02-11 78 } 85854f9b0061e4 Christoph Hellwig 2022-02-11 79 85854f9b0061e4 Christoph Hellwig 2022-02-11 80 page = pmd_page(*pmdp); 85854f9b0061e4 Christoph Hellwig 2022-02-11 81 if (is_huge_zero_page(page)) { 85854f9b0061e4 Christoph Hellwig 2022-02-11 82 spin_unlock(ptl); 85854f9b0061e4 Christoph Hellwig 2022-02-11 83 split_huge_pmd(vma, pmdp, addr); 85854f9b0061e4 Christoph Hellwig 2022-02-11 84 if (pmd_trans_unstable(pmdp)) 85854f9b0061e4 Christoph Hellwig 2022-02-11 85 return migrate_vma_collect_skip(start, end, 85854f9b0061e4 Christoph Hellwig 2022-02-11 86 walk); 85854f9b0061e4 Christoph Hellwig 2022-02-11 87 } else { 85854f9b0061e4 Christoph Hellwig 2022-02-11 88 int ret; 85854f9b0061e4 Christoph Hellwig 2022-02-11 89 85854f9b0061e4 Christoph Hellwig 2022-02-11 90 get_page(page); 85854f9b0061e4 Christoph Hellwig 2022-02-11 91 spin_unlock(ptl); 85854f9b0061e4 Christoph Hellwig 2022-02-11 92 if (unlikely(!trylock_page(page))) 85854f9b0061e4 Christoph Hellwig 2022-02-11 93 return migrate_vma_collect_skip(start, end, 85854f9b0061e4 Christoph Hellwig 2022-02-11 94 walk); 85854f9b0061e4 Christoph Hellwig 2022-02-11 95 ret = split_huge_page(page); 85854f9b0061e4 Christoph Hellwig 2022-02-11 96 unlock_page(page); 85854f9b0061e4 Christoph Hellwig 2022-02-11 97 put_page(page); 85854f9b0061e4 Christoph Hellwig 2022-02-11 98 if (ret) 85854f9b0061e4 Christoph Hellwig 2022-02-11 99 return migrate_vma_collect_skip(start, end, 85854f9b0061e4 Christoph Hellwig 2022-02-11 100 walk); 85854f9b0061e4 Christoph Hellwig 2022-02-11 101 if (pmd_none(*pmdp)) 85854f9b0061e4 Christoph Hellwig 2022-02-11 102 return migrate_vma_collect_hole(start, end, -1, 85854f9b0061e4 Christoph Hellwig 2022-02-11 103 walk); 85854f9b0061e4 Christoph Hellwig 2022-02-11 104 } 85854f9b0061e4 Christoph Hellwig 2022-02-11 105 } 85854f9b0061e4 Christoph Hellwig 2022-02-11 106 85854f9b0061e4 Christoph Hellwig 2022-02-11 107 if (unlikely(pmd_bad(*pmdp))) 85854f9b0061e4 Christoph Hellwig 2022-02-11 108 return migrate_vma_collect_skip(start, end, walk); 85854f9b0061e4 Christoph Hellwig 2022-02-11 109 85854f9b0061e4 Christoph Hellwig 2022-02-11 110 ptep = pte_offset_map_lock(mm, pmdp, addr, &ptl); 85854f9b0061e4 Christoph Hellwig 2022-02-11 111 arch_enter_lazy_mmu_mode(); 85854f9b0061e4 Christoph Hellwig 2022-02-11 112 85854f9b0061e4 Christoph Hellwig 2022-02-11 113 for (; addr < end; addr += PAGE_SIZE, ptep++) { 85854f9b0061e4 Christoph Hellwig 2022-02-11 114 unsigned long mpfn = 0, pfn; 85854f9b0061e4 Christoph Hellwig 2022-02-11 115 struct page *page; 85854f9b0061e4 Christoph Hellwig 2022-02-11 116 swp_entry_t entry; 85854f9b0061e4 Christoph Hellwig 2022-02-11 117 pte_t pte; 85854f9b0061e4 Christoph Hellwig 2022-02-11 118 85854f9b0061e4 Christoph Hellwig 2022-02-11 119 pte = *ptep; 85854f9b0061e4 Christoph Hellwig 2022-02-11 120 85854f9b0061e4 Christoph Hellwig 2022-02-11 121 if (pte_none(pte)) { 85854f9b0061e4 Christoph Hellwig 2022-02-11 122 if (vma_is_anonymous(vma)) { 85854f9b0061e4 Christoph Hellwig 2022-02-11 123 mpfn = MIGRATE_PFN_MIGRATE; 85854f9b0061e4 Christoph Hellwig 2022-02-11 124 migrate->cpages++; 85854f9b0061e4 Christoph Hellwig 2022-02-11 125 } 85854f9b0061e4 Christoph Hellwig 2022-02-11 126 goto next; 85854f9b0061e4 Christoph Hellwig 2022-02-11 127 } 85854f9b0061e4 Christoph Hellwig 2022-02-11 128 85854f9b0061e4 Christoph Hellwig 2022-02-11 129 if (!pte_present(pte)) { 85854f9b0061e4 Christoph Hellwig 2022-02-11 130 /* 85854f9b0061e4 Christoph Hellwig 2022-02-11 131 * Only care about unaddressable device page special 85854f9b0061e4 Christoph Hellwig 2022-02-11 132 * page table entry. Other special swap entries are not 85854f9b0061e4 Christoph Hellwig 2022-02-11 133 * migratable, and we ignore regular swapped page. 85854f9b0061e4 Christoph Hellwig 2022-02-11 134 */ 85854f9b0061e4 Christoph Hellwig 2022-02-11 135 entry = pte_to_swp_entry(pte); 85854f9b0061e4 Christoph Hellwig 2022-02-11 136 if (!is_device_private_entry(entry)) 85854f9b0061e4 Christoph Hellwig 2022-02-11 137 goto next; 85854f9b0061e4 Christoph Hellwig 2022-02-11 138 85854f9b0061e4 Christoph Hellwig 2022-02-11 139 page = pfn_swap_entry_to_page(entry); 85854f9b0061e4 Christoph Hellwig 2022-02-11 140 if (!(migrate->flags & 85854f9b0061e4 Christoph Hellwig 2022-02-11 141 MIGRATE_VMA_SELECT_DEVICE_PRIVATE) || 85854f9b0061e4 Christoph Hellwig 2022-02-11 142 page->pgmap->owner != migrate->pgmap_owner) 85854f9b0061e4 Christoph Hellwig 2022-02-11 143 goto next; 85854f9b0061e4 Christoph Hellwig 2022-02-11 144 85854f9b0061e4 Christoph Hellwig 2022-02-11 145 mpfn = migrate_pfn(page_to_pfn(page)) | 85854f9b0061e4 Christoph Hellwig 2022-02-11 146 MIGRATE_PFN_MIGRATE; 85854f9b0061e4 Christoph Hellwig 2022-02-11 147 if (is_writable_device_private_entry(entry)) 85854f9b0061e4 Christoph Hellwig 2022-02-11 148 mpfn |= MIGRATE_PFN_WRITE; 85854f9b0061e4 Christoph Hellwig 2022-02-11 149 } else { 85854f9b0061e4 Christoph Hellwig 2022-02-11 150 if (!(migrate->flags & MIGRATE_VMA_SELECT_SYSTEM)) 85854f9b0061e4 Christoph Hellwig 2022-02-11 151 goto next; 85854f9b0061e4 Christoph Hellwig 2022-02-11 152 pfn = pte_pfn(pte); 85854f9b0061e4 Christoph Hellwig 2022-02-11 153 if (is_zero_pfn(pfn)) { 85854f9b0061e4 Christoph Hellwig 2022-02-11 154 mpfn = MIGRATE_PFN_MIGRATE; 85854f9b0061e4 Christoph Hellwig 2022-02-11 155 migrate->cpages++; 85854f9b0061e4 Christoph Hellwig 2022-02-11 156 goto next; 85854f9b0061e4 Christoph Hellwig 2022-02-11 157 } 85854f9b0061e4 Christoph Hellwig 2022-02-11 158 page = vm_normal_page(migrate->vma, addr, pte); 85854f9b0061e4 Christoph Hellwig 2022-02-11 159 mpfn = migrate_pfn(pfn) | MIGRATE_PFN_MIGRATE; 85854f9b0061e4 Christoph Hellwig 2022-02-11 160 mpfn |= pte_write(pte) ? MIGRATE_PFN_WRITE : 0; 85854f9b0061e4 Christoph Hellwig 2022-02-11 161 } 85854f9b0061e4 Christoph Hellwig 2022-02-11 162 85854f9b0061e4 Christoph Hellwig 2022-02-11 163 /* FIXME support THP */ 85854f9b0061e4 Christoph Hellwig 2022-02-11 164 if (!page || !page->mapping || PageTransCompound(page)) { 85854f9b0061e4 Christoph Hellwig 2022-02-11 165 mpfn = 0; 85854f9b0061e4 Christoph Hellwig 2022-02-11 166 goto next; 85854f9b0061e4 Christoph Hellwig 2022-02-11 167 } 85854f9b0061e4 Christoph Hellwig 2022-02-11 168 85854f9b0061e4 Christoph Hellwig 2022-02-11 169 /* 85854f9b0061e4 Christoph Hellwig 2022-02-11 170 * By getting a reference on the page we pin it and that blocks 85854f9b0061e4 Christoph Hellwig 2022-02-11 171 * any kind of migration. Side effect is that it "freezes" the 85854f9b0061e4 Christoph Hellwig 2022-02-11 172 * pte. 85854f9b0061e4 Christoph Hellwig 2022-02-11 173 * 85854f9b0061e4 Christoph Hellwig 2022-02-11 174 * We drop this reference after isolating the page from the lru 85854f9b0061e4 Christoph Hellwig 2022-02-11 175 * for non device page (device page are not on the lru and thus 85854f9b0061e4 Christoph Hellwig 2022-02-11 176 * can't be dropped from it). 85854f9b0061e4 Christoph Hellwig 2022-02-11 177 */ 85854f9b0061e4 Christoph Hellwig 2022-02-11 178 get_page(page); 85854f9b0061e4 Christoph Hellwig 2022-02-11 179 85854f9b0061e4 Christoph Hellwig 2022-02-11 180 /* 85854f9b0061e4 Christoph Hellwig 2022-02-11 181 * Optimize for the common case where page is only mapped once 85854f9b0061e4 Christoph Hellwig 2022-02-11 182 * in one process. If we can lock the page, then we can safely 85854f9b0061e4 Christoph Hellwig 2022-02-11 183 * set up a special migration page table entry now. 85854f9b0061e4 Christoph Hellwig 2022-02-11 184 */ 85854f9b0061e4 Christoph Hellwig 2022-02-11 185 if (trylock_page(page)) { 85854f9b0061e4 Christoph Hellwig 2022-02-11 186 pte_t swp_pte; 85854f9b0061e4 Christoph Hellwig 2022-02-11 187 85854f9b0061e4 Christoph Hellwig 2022-02-11 188 migrate->cpages++; 85854f9b0061e4 Christoph Hellwig 2022-02-11 189 ptep_get_and_clear(mm, addr, ptep); 85854f9b0061e4 Christoph Hellwig 2022-02-11 190 85854f9b0061e4 Christoph Hellwig 2022-02-11 191 /* Setup special migration page table entry */ 85854f9b0061e4 Christoph Hellwig 2022-02-11 192 if (mpfn & MIGRATE_PFN_WRITE) 85854f9b0061e4 Christoph Hellwig 2022-02-11 193 entry = make_writable_migration_entry( 85854f9b0061e4 Christoph Hellwig 2022-02-11 194 page_to_pfn(page)); 85854f9b0061e4 Christoph Hellwig 2022-02-11 195 else 85854f9b0061e4 Christoph Hellwig 2022-02-11 196 entry = make_readable_migration_entry( 85854f9b0061e4 Christoph Hellwig 2022-02-11 197 page_to_pfn(page)); 85854f9b0061e4 Christoph Hellwig 2022-02-11 198 swp_pte = swp_entry_to_pte(entry); 85854f9b0061e4 Christoph Hellwig 2022-02-11 199 if (pte_present(pte)) { 85854f9b0061e4 Christoph Hellwig 2022-02-11 200 if (pte_soft_dirty(pte)) 85854f9b0061e4 Christoph Hellwig 2022-02-11 201 swp_pte = pte_swp_mksoft_dirty(swp_pte); 85854f9b0061e4 Christoph Hellwig 2022-02-11 202 if (pte_uffd_wp(pte)) 85854f9b0061e4 Christoph Hellwig 2022-02-11 203 swp_pte = pte_swp_mkuffd_wp(swp_pte); 85854f9b0061e4 Christoph Hellwig 2022-02-11 204 } else { 85854f9b0061e4 Christoph Hellwig 2022-02-11 205 if (pte_swp_soft_dirty(pte)) 85854f9b0061e4 Christoph Hellwig 2022-02-11 206 swp_pte = pte_swp_mksoft_dirty(swp_pte); 85854f9b0061e4 Christoph Hellwig 2022-02-11 207 if (pte_swp_uffd_wp(pte)) 85854f9b0061e4 Christoph Hellwig 2022-02-11 208 swp_pte = pte_swp_mkuffd_wp(swp_pte); 85854f9b0061e4 Christoph Hellwig 2022-02-11 209 } 85854f9b0061e4 Christoph Hellwig 2022-02-11 210 set_pte_at(mm, addr, ptep, swp_pte); 85854f9b0061e4 Christoph Hellwig 2022-02-11 211 85854f9b0061e4 Christoph Hellwig 2022-02-11 212 /* 85854f9b0061e4 Christoph Hellwig 2022-02-11 213 * This is like regular unmap: we remove the rmap and 85854f9b0061e4 Christoph Hellwig 2022-02-11 214 * drop page refcount. Page won't be freed, as we took 85854f9b0061e4 Christoph Hellwig 2022-02-11 215 * a reference just above. 85854f9b0061e4 Christoph Hellwig 2022-02-11 216 */ 85854f9b0061e4 Christoph Hellwig 2022-02-11 217 page_remove_rmap(page, vma, false); 85854f9b0061e4 Christoph Hellwig 2022-02-11 218 put_page(page); 85854f9b0061e4 Christoph Hellwig 2022-02-11 219 85854f9b0061e4 Christoph Hellwig 2022-02-11 220 if (pte_present(pte)) 85854f9b0061e4 Christoph Hellwig 2022-02-11 221 unmapped++; 85854f9b0061e4 Christoph Hellwig 2022-02-11 222 } else { 85854f9b0061e4 Christoph Hellwig 2022-02-11 223 put_page(page); 85854f9b0061e4 Christoph Hellwig 2022-02-11 224 mpfn = 0; 85854f9b0061e4 Christoph Hellwig 2022-02-11 225 } 85854f9b0061e4 Christoph Hellwig 2022-02-11 226 85854f9b0061e4 Christoph Hellwig 2022-02-11 227 next: 85854f9b0061e4 Christoph Hellwig 2022-02-11 228 migrate->dst[migrate->npages] = 0; 85854f9b0061e4 Christoph Hellwig 2022-02-11 229 migrate->src[migrate->npages++] = mpfn; 85854f9b0061e4 Christoph Hellwig 2022-02-11 230 } 85854f9b0061e4 Christoph Hellwig 2022-02-11 231 arch_leave_lazy_mmu_mode(); 85854f9b0061e4 Christoph Hellwig 2022-02-11 232 pte_unmap_unlock(ptep - 1, ptl); 85854f9b0061e4 Christoph Hellwig 2022-02-11 233 85854f9b0061e4 Christoph Hellwig 2022-02-11 234 /* Only flush the TLB if we actually modified any entries */ 85854f9b0061e4 Christoph Hellwig 2022-02-11 235 if (unmapped) 85854f9b0061e4 Christoph Hellwig 2022-02-11 @236 flush_tlb_range(walk->vma, start, end); 85854f9b0061e4 Christoph Hellwig 2022-02-11 237 85854f9b0061e4 Christoph Hellwig 2022-02-11 238 return 0; 85854f9b0061e4 Christoph Hellwig 2022-02-11 239 } 85854f9b0061e4 Christoph Hellwig 2022-02-11 240 :::::: The code at line 236 was first introduced by commit :::::: 85854f9b0061e47f43a835799780054c7f9c03b6 mm: move the migrate_vma_* device migration code into it's own file :::::: TO: Christoph Hellwig <hch@xxxxxx> :::::: CC: Johannes Weiner <hannes@xxxxxxxxxxx> --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx