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