__pcpu_map_pages() clears the PTEs it installed when it fails, so
pcpu_map_pages() only has to tear down the CPUs it mapped before
the failing one.

Signed-off-by: Hao Ge <[email protected]>
---
 mm/percpu-vm.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/mm/percpu-vm.c b/mm/percpu-vm.c
index 509d8901835c..59d3a336a6bd 100644
--- a/mm/percpu-vm.c
+++ b/mm/percpu-vm.c
@@ -252,10 +252,11 @@ static int pcpu_map_pages(struct pcpu_chunk *chunk, 
struct page **pages,
        return 0;
 err:
        for_each_possible_cpu(tcpu) {
-               __pcpu_unmap_pages(pcpu_chunk_addr(chunk, tcpu, page_start),
-                                  page_end - page_start);
+               /* The failing CPU's partial mapping undoes itself */
                if (tcpu == cpu)
                        break;
+               __pcpu_unmap_pages(pcpu_chunk_addr(chunk, tcpu, page_start),
+                                  page_end - page_start);
        }
        pcpu_post_unmap_tlb_flush(chunk, page_start, page_end);
        return err;
-- 
2.25.1


Reply via email to