ia64: implement the new page table range API
[linux-2.6-microblaze.git] / arch / ia64 / mm / init.c
index 7f5353e..05b0f2f 100644 (file)
@@ -50,30 +50,44 @@ void
 __ia64_sync_icache_dcache (pte_t pte)
 {
        unsigned long addr;
-       struct page *page;
+       struct folio *folio;
 
-       page = pte_page(pte);
-       addr = (unsigned long) page_address(page);
+       folio = page_folio(pte_page(pte));
+       addr = (unsigned long)folio_address(folio);
 
-       if (test_bit(PG_arch_1, &page->flags))
+       if (test_bit(PG_arch_1, &folio->flags))
                return;                         /* i-cache is already coherent with d-cache */
 
-       flush_icache_range(addr, addr + page_size(page));
-       set_bit(PG_arch_1, &page->flags);       /* mark page as clean */
+       flush_icache_range(addr, addr + folio_size(folio));
+       set_bit(PG_arch_1, &folio->flags);      /* mark page as clean */
 }
 
 /*
- * Since DMA is i-cache coherent, any (complete) pages that were written via
+ * Since DMA is i-cache coherent, any (complete) folios that were written via
  * DMA can be marked as "clean" so that lazy_mmu_prot_update() doesn't have to
  * flush them when they get mapped into an executable vm-area.
  */
 void arch_dma_mark_clean(phys_addr_t paddr, size_t size)
 {
        unsigned long pfn = PHYS_PFN(paddr);
+       struct folio *folio = page_folio(pfn_to_page(pfn));
+       ssize_t left = size;
+       size_t offset = offset_in_folio(folio, paddr);
 
-       do {
+       if (offset) {
+               left -= folio_size(folio) - offset;
+               if (left <= 0)
+                       return;
+               folio = folio_next(folio);
+       }
+
+       while (left >= (ssize_t)folio_size(folio)) {
+               left -= folio_size(folio);
                set_bit(PG_arch_1, &pfn_to_page(pfn)->flags);
-       } while (++pfn <= PHYS_PFN(paddr + size - 1));
+               if (!left)
+                       break;
+               folio = folio_next(folio);
+       }
 }
 
 inline void