blk-throttle: Fix that bps of child could exceed bps limited in parent
[linux-2.6-microblaze.git] / mm / vmalloc.c
index dd6cdb2..ccaa461 100644 (file)
@@ -320,6 +320,9 @@ int ioremap_page_range(unsigned long addr, unsigned long end,
        err = vmap_range_noflush(addr, end, phys_addr, pgprot_nx(prot),
                                 ioremap_max_page_shift);
        flush_cache_vmap(addr, end);
+       if (!err)
+               kmsan_ioremap_page_range(addr, end, phys_addr, prot,
+                                        ioremap_max_page_shift);
        return err;
 }
 
@@ -416,7 +419,7 @@ static void vunmap_p4d_range(pgd_t *pgd, unsigned long addr, unsigned long end,
  *
  * This is an internal function only. Do not use outside mm/.
  */
-void vunmap_range_noflush(unsigned long start, unsigned long end)
+void __vunmap_range_noflush(unsigned long start, unsigned long end)
 {
        unsigned long next;
        pgd_t *pgd;
@@ -438,6 +441,12 @@ void vunmap_range_noflush(unsigned long start, unsigned long end)
                arch_sync_kernel_mappings(start, end);
 }
 
+void vunmap_range_noflush(unsigned long start, unsigned long end)
+{
+       kmsan_vunmap_range_noflush(start, end);
+       __vunmap_range_noflush(start, end);
+}
+
 /**
  * vunmap_range - unmap kernel virtual addresses
  * @addr: start of the VM area to unmap
@@ -575,7 +584,7 @@ static int vmap_small_pages_range_noflush(unsigned long addr, unsigned long end,
  *
  * This is an internal function only. Do not use outside mm/.
  */
-int vmap_pages_range_noflush(unsigned long addr, unsigned long end,
+int __vmap_pages_range_noflush(unsigned long addr, unsigned long end,
                pgprot_t prot, struct page **pages, unsigned int page_shift)
 {
        unsigned int i, nr = (end - addr) >> PAGE_SHIFT;
@@ -590,7 +599,7 @@ int vmap_pages_range_noflush(unsigned long addr, unsigned long end,
                int err;
 
                err = vmap_range_noflush(addr, addr + (1UL << page_shift),
-                                       __pa(page_address(pages[i])), prot,
+                                       page_to_phys(pages[i]), prot,
                                        page_shift);
                if (err)
                        return err;
@@ -601,6 +610,13 @@ int vmap_pages_range_noflush(unsigned long addr, unsigned long end,
        return 0;
 }
 
+int vmap_pages_range_noflush(unsigned long addr, unsigned long end,
+               pgprot_t prot, struct page **pages, unsigned int page_shift)
+{
+       kmsan_vmap_pages_range_noflush(addr, end, prot, pages, page_shift);
+       return __vmap_pages_range_noflush(addr, end, prot, pages, page_shift);
+}
+
 /**
  * vmap_pages_range - map pages to a kernel virtual address
  * @addr: start of the VM area to map
@@ -1300,12 +1316,12 @@ find_vmap_lowest_match(struct rb_root *root, unsigned long size,
 #include <linux/random.h>
 
 static struct vmap_area *
-find_vmap_lowest_linear_match(unsigned long size,
+find_vmap_lowest_linear_match(struct list_head *head, unsigned long size,
        unsigned long align, unsigned long vstart)
 {
        struct vmap_area *va;
 
-       list_for_each_entry(va, &free_vmap_area_list, list) {
+       list_for_each_entry(va, head, list) {
                if (!is_within_this_va(va, size, align, vstart))
                        continue;
 
@@ -1316,7 +1332,8 @@ find_vmap_lowest_linear_match(unsigned long size,
 }
 
 static void
-find_vmap_lowest_match_check(unsigned long size, unsigned long align)
+find_vmap_lowest_match_check(struct rb_root *root, struct list_head *head,
+                            unsigned long size, unsigned long align)
 {
        struct vmap_area *va_1, *va_2;
        unsigned long vstart;
@@ -1325,8 +1342,8 @@ find_vmap_lowest_match_check(unsigned long size, unsigned long align)
        get_random_bytes(&rnd, sizeof(rnd));
        vstart = VMALLOC_START + rnd;
 
-       va_1 = find_vmap_lowest_match(size, align, vstart, false);
-       va_2 = find_vmap_lowest_linear_match(size, align, vstart);
+       va_1 = find_vmap_lowest_match(root, size, align, vstart, false);
+       va_2 = find_vmap_lowest_linear_match(head, size, align, vstart);
 
        if (va_1 != va_2)
                pr_emerg("not lowest: t: 0x%p, l: 0x%p, v: 0x%lx\n",
@@ -1513,7 +1530,7 @@ __alloc_vmap_area(struct rb_root *root, struct list_head *head,
                return vend;
 
 #if DEBUG_AUGMENT_LOWEST_MATCH_CHECK
-       find_vmap_lowest_match_check(size, align);
+       find_vmap_lowest_match_check(root, head, size, align);
 #endif
 
        return nva_start_addr;