Skip to content

Commit 5af627a

Browse files
committed
csky/mm/highmem: Switch to generic kmap atomic
No reason having the same code in every architecture. Signed-off-by: Thomas Gleixner <[email protected]> Cc: Guo Ren <[email protected]> Cc: Arnd Bergmann <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent 2a15ba8 commit 5af627a

File tree

4 files changed

+8
-78
lines changed

4 files changed

+8
-78
lines changed

arch/csky/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,7 @@ config NR_CPUS
286286
config HIGHMEM
287287
bool "High Memory Support"
288288
depends on !CPU_CK610
289+
select KMAP_LOCAL
289290
default y
290291

291292
config FORCE_MAX_ZONEORDER

arch/csky/include/asm/fixmap.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
#include <asm/memory.h>
99
#ifdef CONFIG_HIGHMEM
1010
#include <linux/threads.h>
11-
#include <asm/kmap_types.h>
11+
#include <asm/kmap_size.h>
1212
#endif
1313

1414
enum fixed_addresses {
@@ -17,7 +17,7 @@ enum fixed_addresses {
1717
#endif
1818
#ifdef CONFIG_HIGHMEM
1919
FIX_KMAP_BEGIN,
20-
FIX_KMAP_END = FIX_KMAP_BEGIN + (KM_TYPE_NR * NR_CPUS) - 1,
20+
FIX_KMAP_END = FIX_KMAP_BEGIN + (KM_MAX_IDX * NR_CPUS) - 1,
2121
#endif
2222
__end_of_fixed_addresses
2323
};

arch/csky/include/asm/highmem.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
#include <linux/init.h>
1010
#include <linux/interrupt.h>
1111
#include <linux/uaccess.h>
12-
#include <asm/kmap_types.h>
12+
#include <asm/kmap_size.h>
1313
#include <asm/cache.h>
1414

1515
/* undef for production */
@@ -32,10 +32,12 @@ extern pte_t *pkmap_page_table;
3232

3333
#define ARCH_HAS_KMAP_FLUSH_TLB
3434
extern void kmap_flush_tlb(unsigned long addr);
35-
extern void *kmap_atomic_pfn(unsigned long pfn);
3635

3736
#define flush_cache_kmaps() do {} while (0)
3837

38+
#define arch_kmap_local_post_map(vaddr, pteval) kmap_flush_tlb(vaddr)
39+
#define arch_kmap_local_post_unmap(vaddr) kmap_flush_tlb(vaddr)
40+
3941
extern void kmap_init(void);
4042

4143
#endif /* __KERNEL__ */

arch/csky/mm/highmem.c

Lines changed: 1 addition & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99
#include <asm/tlbflush.h>
1010
#include <asm/cacheflush.h>
1111

12-
static pte_t *kmap_pte;
13-
1412
unsigned long highstart_pfn, highend_pfn;
1513

1614
void kmap_flush_tlb(unsigned long addr)
@@ -19,67 +17,7 @@ void kmap_flush_tlb(unsigned long addr)
1917
}
2018
EXPORT_SYMBOL(kmap_flush_tlb);
2119

22-
void *kmap_atomic_high_prot(struct page *page, pgprot_t prot)
23-
{
24-
unsigned long vaddr;
25-
int idx, type;
26-
27-
type = kmap_atomic_idx_push();
28-
idx = type + KM_TYPE_NR*smp_processor_id();
29-
vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
30-
#ifdef CONFIG_DEBUG_HIGHMEM
31-
BUG_ON(!pte_none(*(kmap_pte - idx)));
32-
#endif
33-
set_pte(kmap_pte-idx, mk_pte(page, prot));
34-
flush_tlb_one((unsigned long)vaddr);
35-
36-
return (void *)vaddr;
37-
}
38-
EXPORT_SYMBOL(kmap_atomic_high_prot);
39-
40-
void kunmap_atomic_high(void *kvaddr)
41-
{
42-
unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
43-
int idx;
44-
45-
if (vaddr < FIXADDR_START)
46-
return;
47-
48-
#ifdef CONFIG_DEBUG_HIGHMEM
49-
idx = KM_TYPE_NR*smp_processor_id() + kmap_atomic_idx();
50-
51-
BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx));
52-
53-
pte_clear(&init_mm, vaddr, kmap_pte - idx);
54-
flush_tlb_one(vaddr);
55-
#else
56-
(void) idx; /* to kill a warning */
57-
#endif
58-
kmap_atomic_idx_pop();
59-
}
60-
EXPORT_SYMBOL(kunmap_atomic_high);
61-
62-
/*
63-
* This is the same as kmap_atomic() but can map memory that doesn't
64-
* have a struct page associated with it.
65-
*/
66-
void *kmap_atomic_pfn(unsigned long pfn)
67-
{
68-
unsigned long vaddr;
69-
int idx, type;
70-
71-
pagefault_disable();
72-
73-
type = kmap_atomic_idx_push();
74-
idx = type + KM_TYPE_NR*smp_processor_id();
75-
vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
76-
set_pte(kmap_pte-idx, pfn_pte(pfn, PAGE_KERNEL));
77-
flush_tlb_one(vaddr);
78-
79-
return (void *) vaddr;
80-
}
81-
82-
static void __init kmap_pages_init(void)
20+
void __init kmap_init(void)
8321
{
8422
unsigned long vaddr;
8523
pgd_t *pgd;
@@ -96,14 +34,3 @@ static void __init kmap_pages_init(void)
9634
pte = pte_offset_kernel(pmd, vaddr);
9735
pkmap_page_table = pte;
9836
}
99-
100-
void __init kmap_init(void)
101-
{
102-
unsigned long vaddr;
103-
104-
kmap_pages_init();
105-
106-
vaddr = __fix_to_virt(FIX_KMAP_BEGIN);
107-
108-
kmap_pte = pte_offset_kernel((pmd_t *)pgd_offset_k(vaddr), vaddr);
109-
}

0 commit comments

Comments
 (0)