Merge remote-tracking branch 'net/master'
[sfrench/cifs-2.6.git] / arch / ia64 / mm / init.c
index d5e12ff1d73cf69f1350577d61f311b5081e8075..e49200e31750d1a78a98ab33bb5b8982de6b1cc1 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 
+#include <linux/dma-noncoherent.h>
 #include <linux/efi.h>
 #include <linux/elf.h>
 #include <linux/memblock.h>
@@ -66,24 +67,22 @@ __ia64_sync_icache_dcache (pte_t pte)
        set_bit(PG_arch_1, &page->flags);       /* mark page as clean */
 }
 
+#ifdef CONFIG_SWIOTLB
 /*
  * Since DMA is i-cache coherent, any (complete) pages 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
-dma_mark_clean(void *addr, size_t size)
+void arch_sync_dma_for_cpu(struct device *dev, phys_addr_t paddr,
+               size_t size, enum dma_data_direction dir)
 {
-       unsigned long pg_addr, end;
-
-       pg_addr = PAGE_ALIGN((unsigned long) addr);
-       end = (unsigned long) addr + size;
-       while (pg_addr + PAGE_SIZE <= end) {
-               struct page *page = virt_to_page(pg_addr);
-               set_bit(PG_arch_1, &page->flags);
-               pg_addr += PAGE_SIZE;
-       }
+       unsigned long pfn = PHYS_PFN(paddr);
+
+       do {
+               set_bit(PG_arch_1, &pfn_to_page(pfn)->flags);
+       } while (++pfn <= PHYS_PFN(paddr + size - 1));
 }
+#endif
 
 inline void
 ia64_set_rbs_bot (void)
@@ -445,23 +444,45 @@ int __init create_mem_map_page_table(u64 start, u64 end, void *arg)
 
        for (address = start_page; address < end_page; address += PAGE_SIZE) {
                pgd = pgd_offset_k(address);
-               if (pgd_none(*pgd))
-                       pgd_populate(&init_mm, pgd, memblock_alloc_node(PAGE_SIZE, PAGE_SIZE, node));
+               if (pgd_none(*pgd)) {
+                       pud = memblock_alloc_node(PAGE_SIZE, PAGE_SIZE, node);
+                       if (!pud)
+                               goto err_alloc;
+                       pgd_populate(&init_mm, pgd, pud);
+               }
                pud = pud_offset(pgd, address);
 
-               if (pud_none(*pud))
-                       pud_populate(&init_mm, pud, memblock_alloc_node(PAGE_SIZE, PAGE_SIZE, node));
+               if (pud_none(*pud)) {
+                       pmd = memblock_alloc_node(PAGE_SIZE, PAGE_SIZE, node);
+                       if (!pmd)
+                               goto err_alloc;
+                       pud_populate(&init_mm, pud, pmd);
+               }
                pmd = pmd_offset(pud, address);
 
-               if (pmd_none(*pmd))
-                       pmd_populate_kernel(&init_mm, pmd, memblock_alloc_node(PAGE_SIZE, PAGE_SIZE, node));
+               if (pmd_none(*pmd)) {
+                       pte = memblock_alloc_node(PAGE_SIZE, PAGE_SIZE, node);
+                       if (!pte)
+                               goto err_alloc;
+                       pmd_populate_kernel(&init_mm, pmd, pte);
+               }
                pte = pte_offset_kernel(pmd, address);
 
-               if (pte_none(*pte))
-                       set_pte(pte, pfn_pte(__pa(memblock_alloc_node(PAGE_SIZE, PAGE_SIZE, node)) >> PAGE_SHIFT,
+               if (pte_none(*pte)) {
+                       void *page = memblock_alloc_node(PAGE_SIZE, PAGE_SIZE,
+                                                        node);
+                       if (!page)
+                               goto err_alloc;
+                       set_pte(pte, pfn_pte(__pa(page) >> PAGE_SHIFT,
                                             PAGE_KERNEL));
+               }
        }
        return 0;
+
+err_alloc:
+       panic("%s: Failed to allocate %lu bytes align=0x%lx nid=%d\n",
+             __func__, PAGE_SIZE, PAGE_SIZE, node);
+       return -ENOMEM;
 }
 
 struct memmap_init_callback_data {
@@ -661,7 +682,7 @@ int arch_add_memory(int nid, u64 start, u64 size, struct vmem_altmap *altmap,
 }
 
 #ifdef CONFIG_MEMORY_HOTREMOVE
-int arch_remove_memory(u64 start, u64 size, struct vmem_altmap *altmap)
+int arch_remove_memory(int nid, u64 start, u64 size, struct vmem_altmap *altmap)
 {
        unsigned long start_pfn = start >> PAGE_SHIFT;
        unsigned long nr_pages = size >> PAGE_SHIFT;