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 | #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 | ||
| 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 | extern void __kunmap_atomic(void *kvaddr); | 64 | extern void __kunmap_atomic(void *kvaddr); |
| 56 | 65 | ||
| 57 | static inline void *kmap_atomic(struct page *page) | 66 | static inline void *kmap_atomic(struct page *page) |
| @@ -32,18 +32,12 @@ · 31 unmodified lines | |||
| 32 | */ | 32 | */ |
| 33 | #include <asm/tlbflush.h> | 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 | 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 | } |
| 58 | EXPORT_SYMBOL(kmap_atomic_prot); | 52 | EXPORT_SYMBOL(kmap_atomic_high_prot); |
| 59 | 53 | ||
| 60 | void __kunmap_atomic(void *kvaddr) | 54 | void __kunmap_atomic(void *kvaddr) |
| 61 | { | 55 | { |
| @@ -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 | ||
| 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 | extern void __kunmap_atomic(void *kvaddr); | 72 | extern void __kunmap_atomic(void *kvaddr); |
| 64 | 73 | ||
| 65 | static inline void *kmap_atomic(struct page *page) | 74 | static inline void *kmap_atomic(struct page *page) |
| @@ -30,16 +30,11 @@ · 29 unmodified lines | |||
| 30 | * be used in IRQ contexts, so in some (very limited) cases we need | 30 | * be used in IRQ contexts, so in some (very limited) cases we need |
| 31 | * it. | 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 | 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 | } |
| 52 | EXPORT_SYMBOL(kmap_atomic_prot); | 47 | EXPORT_SYMBOL(kmap_atomic_high_prot); |
| 53 | 48 | ||
| 54 | void __kunmap_atomic(void *kvaddr) | 49 | void __kunmap_atomic(void *kvaddr) |
| 55 | { | 50 | { |
| @@ -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 | ||
| 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 | void *kmap_atomic(struct page *page); | 71 | void *kmap_atomic(struct page *page); |
| 63 | void __kunmap_atomic(void *kvaddr); | 72 | void __kunmap_atomic(void *kvaddr); |
| 64 | void *kmap_atomic_pfn(unsigned long pfn); | 73 | void *kmap_atomic_pfn(unsigned long pfn); |
| @@ -12,17 +12,11 @@ · 11 unmodified lines | |||
| 12 | * However when holding an atomic kmap it is not legal to sleep, so atomic | 12 | * 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 | */ |
| 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 | 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 | } |
| 35 | EXPORT_SYMBOL(kmap_atomic_prot); | 29 | EXPORT_SYMBOL(kmap_atomic_high_prot); |
| 36 | 30 | ||
| 37 | void *kmap_atomic(struct page *page) | 31 | void *kmap_atomic(struct page *page) |
| 38 | { | 32 | { |