History

{x86,powerpc,microblaze}/kmap: move preempt disable

During this kmap() conversion series we must maintain bisect-ability. To do this, kmap_atomic_prot() in x86, powerpc, and microblaze need to remain functional. Create a temporary inline version of kmap_atomic_prot within these architectures so we can rework their kmap_atomic() calls and then lift kmap_atomic_prot() to the core.

Ira Weiny committed 6 years ago

Commit ee9bc5f1 parent e23c4596 files · +36 −26Browse files

Unified · Split

6 files
  1. arch/microblaze/include/asm/highmem.h +10 −1
  2. arch/microblaze/mm/highmem.c +2 −8
  3. arch/powerpc/include/asm/highmem.h +10 −1
  4. arch/powerpc/mm/highmem.c +2 −7
  5. arch/x86/include/asm/highmem.h +10 −1
  6. arch/x86/mm/highmem_32.c +2 −8
arch/microblaze/include/asm/highmem.h+10−1
@@ -51,7 +51,16 @@ extern pte_t *pkmap_page_table; · 50 unmodified lines
51#define PKMAP_NR(virt) ((virt - PKMAP_BASE) >> PAGE_SHIFT)51#define PKMAP_NR(virt) ((virt - PKMAP_BASE) >> PAGE_SHIFT)
52#define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))52#define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))
53 53
54extern void *kmap_atomic_prot(struct page *page, pgprot_t prot);54extern void *kmap_atomic_high_prot(struct page *page, pgprot_t prot);
55static inline void *kmap_atomic_prot(struct page *page, pgprot_t prot)
56{
57 preempt_disable();
58 pagefault_disable();
59 if (!PageHighMem(page))
60 return page_address(page);
61
62 return kmap_atomic_high_prot(page, prot);
63}
55extern void __kunmap_atomic(void *kvaddr);64extern void __kunmap_atomic(void *kvaddr);
56 65
57static inline void *kmap_atomic(struct page *page)66static inline void *kmap_atomic(struct page *page)
arch/microblaze/mm/highmem.c+2−8
@@ -32,18 +32,12 @@ · 31 unmodified lines
32 */32 */
33#include <asm/tlbflush.h>33#include <asm/tlbflush.h>
34 34
35void *kmap_atomic_prot(struct page *page, pgprot_t prot)35void *kmap_atomic_high_prot(struct page *page, pgprot_t prot)
36{36{
37 37
38 unsigned long vaddr;38 unsigned long vaddr;
39 int idx, type;39 int idx, type;
40 40
41 preempt_disable();
42 pagefault_disable();
43 if (!PageHighMem(page))
44 return page_address(page);
45
46
47 type = kmap_atomic_idx_push();41 type = kmap_atomic_idx_push();
48 idx = type + KM_TYPE_NR*smp_processor_id();42 idx = type + KM_TYPE_NR*smp_processor_id();
49 vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);43 vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
@@ -55,7 +49,7 @@ void *kmap_atomic_prot(struct page *page, pgprot_t prot) · 5 unmodified lines
55 49
56 return (void *) vaddr;50 return (void *) vaddr;
57}51}
58EXPORT_SYMBOL(kmap_atomic_prot);52EXPORT_SYMBOL(kmap_atomic_high_prot);
59 53
60void __kunmap_atomic(void *kvaddr)54void __kunmap_atomic(void *kvaddr)
61{55{
arch/powerpc/include/asm/highmem.h+10−1
@@ -59,7 +59,16 @@ extern pte_t *pkmap_page_table; · 58 unmodified lines
59#define PKMAP_NR(virt) ((virt-PKMAP_BASE) >> PAGE_SHIFT)59#define PKMAP_NR(virt) ((virt-PKMAP_BASE) >> PAGE_SHIFT)
60#define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))60#define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))
61 61
62extern void *kmap_atomic_prot(struct page *page, pgprot_t prot);62extern void *kmap_atomic_high_prot(struct page *page, pgprot_t prot);
63static inline void *kmap_atomic_prot(struct page *page, pgprot_t prot)
64{
65 preempt_disable();
66 pagefault_disable();
67 if (!PageHighMem(page))
68 return page_address(page);
69
70 return kmap_atomic_high_prot(page, prot);
71}
63extern void __kunmap_atomic(void *kvaddr);72extern void __kunmap_atomic(void *kvaddr);
64 73
65static inline void *kmap_atomic(struct page *page)74static inline void *kmap_atomic(struct page *page)
arch/powerpc/mm/highmem.c+2−7
@@ -30,16 +30,11 @@ · 29 unmodified lines
30 * be used in IRQ contexts, so in some (very limited) cases we need30 * be used in IRQ contexts, so in some (very limited) cases we need
31 * it.31 * it.
32 */32 */
33void *kmap_atomic_prot(struct page *page, pgprot_t prot)33void *kmap_atomic_high_prot(struct page *page, pgprot_t prot)
34{34{
35 unsigned long vaddr;35 unsigned long vaddr;
36 int idx, type;36 int idx, type;
37 37
38 preempt_disable();
39 pagefault_disable();
40 if (!PageHighMem(page))
41 return page_address(page);
42
43 type = kmap_atomic_idx_push();38 type = kmap_atomic_idx_push();
44 idx = type + KM_TYPE_NR*smp_processor_id();39 idx = type + KM_TYPE_NR*smp_processor_id();
45 vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);40 vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
@@ -49,7 +44,7 @@ void *kmap_atomic_prot(struct page *page, pgprot_t prot) · 3 unmodified lines
49 44
50 return (void*) vaddr;45 return (void*) vaddr;
51}46}
52EXPORT_SYMBOL(kmap_atomic_prot);47EXPORT_SYMBOL(kmap_atomic_high_prot);
53 48
54void __kunmap_atomic(void *kvaddr)49void __kunmap_atomic(void *kvaddr)
55{50{
arch/x86/include/asm/highmem.h+10−1
@@ -58,7 +58,16 @@ extern unsigned long highstart_pfn, highend_pfn; · 57 unmodified lines
58#define PKMAP_NR(virt) ((virt-PKMAP_BASE) >> PAGE_SHIFT)58#define PKMAP_NR(virt) ((virt-PKMAP_BASE) >> PAGE_SHIFT)
59#define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))59#define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))
60 60
61void *kmap_atomic_prot(struct page *page, pgprot_t prot);61extern void *kmap_atomic_high_prot(struct page *page, pgprot_t prot);
62static inline void *kmap_atomic_prot(struct page *page, pgprot_t prot)
63{
64 preempt_disable();
65 pagefault_disable();
66 if (!PageHighMem(page))
67 return page_address(page);
68
69 return kmap_atomic_high_prot(page, prot);
70}
62void *kmap_atomic(struct page *page);71void *kmap_atomic(struct page *page);
63void __kunmap_atomic(void *kvaddr);72void __kunmap_atomic(void *kvaddr);
64void *kmap_atomic_pfn(unsigned long pfn);73void *kmap_atomic_pfn(unsigned long pfn);
arch/x86/mm/highmem_32.c+2−8
@@ -12,17 +12,11 @@ · 11 unmodified lines
12 * However when holding an atomic kmap it is not legal to sleep, so atomic12 * However when holding an atomic kmap it is not legal to sleep, so atomic
13 * kmaps are appropriate for short, tight code paths only.13 * kmaps are appropriate for short, tight code paths only.
14 */14 */
15void *kmap_atomic_prot(struct page *page, pgprot_t prot)15void *kmap_atomic_high_prot(struct page *page, pgprot_t prot)
16{16{
17 unsigned long vaddr;17 unsigned long vaddr;
18 int idx, type;18 int idx, type;
19 19
20 preempt_disable();
21 pagefault_disable();
22
23 if (!PageHighMem(page))
24 return page_address(page);
25
26 type = kmap_atomic_idx_push();20 type = kmap_atomic_idx_push();
27 idx = type + KM_TYPE_NR*smp_processor_id();21 idx = type + KM_TYPE_NR*smp_processor_id();
28 vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);22 vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
@@ -32,7 +26,7 @@ void *kmap_atomic_prot(struct page *page, pgprot_t prot) · 3 unmodified lines
32 26
33 return (void *)vaddr;27 return (void *)vaddr;
34}28}
35EXPORT_SYMBOL(kmap_atomic_prot);29EXPORT_SYMBOL(kmap_atomic_high_prot);
36 30
37void *kmap_atomic(struct page *page)31void *kmap_atomic(struct page *page)
38{32{

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t