]> Git Repo - J-linux.git/blob - arch/s390/kernel/abs_lowcore.c
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / arch / s390 / kernel / abs_lowcore.c
1 // SPDX-License-Identifier: GPL-2.0
2
3 #include <linux/pgtable.h>
4 #include <asm/abs_lowcore.h>
5
6 unsigned long __bootdata_preserved(__abs_lowcore);
7 int __bootdata_preserved(relocate_lowcore);
8
9 int abs_lowcore_map(int cpu, struct lowcore *lc, bool alloc)
10 {
11         unsigned long addr = __abs_lowcore + (cpu * sizeof(struct lowcore));
12         unsigned long phys = __pa(lc);
13         int rc, i;
14
15         for (i = 0; i < LC_PAGES; i++) {
16                 rc = __vmem_map_4k_page(addr, phys, PAGE_KERNEL, alloc);
17                 if (rc) {
18                         /*
19                          * Do not unmap allocated page tables in case the
20                          * allocation was not requested. In such a case the
21                          * request is expected coming from an atomic context,
22                          * while the unmap attempt might sleep.
23                          */
24                         if (alloc) {
25                                 for (--i; i >= 0; i--) {
26                                         addr -= PAGE_SIZE;
27                                         vmem_unmap_4k_page(addr);
28                                 }
29                         }
30                         return rc;
31                 }
32                 addr += PAGE_SIZE;
33                 phys += PAGE_SIZE;
34         }
35         return 0;
36 }
37
38 void abs_lowcore_unmap(int cpu)
39 {
40         unsigned long addr = __abs_lowcore + (cpu * sizeof(struct lowcore));
41         int i;
42
43         for (i = 0; i < LC_PAGES; i++) {
44                 vmem_unmap_4k_page(addr);
45                 addr += PAGE_SIZE;
46         }
47 }
This page took 0.027802 seconds and 4 git commands to generate.