Skip to content

Commit 99e5a24

Browse files
committed
LoongArch: Don't inline kasan_mem_to_shadow()/kasan_shadow_to_mem()
As Linus suggested, kasan_mem_to_shadow()/kasan_shadow_to_mem() are not performance-critical and too big to inline. This is simply wrong so just define them out-of-line. If they really need to be inlined in future, such as the objtool / SMAP issue for X86, we should mark them __always_inline. Suggested-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
1 parent 2a86f1b commit 99e5a24

File tree

2 files changed

+57
-53
lines changed

2 files changed

+57
-53
lines changed

arch/loongarch/include/asm/kasan.h

Lines changed: 6 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -60,63 +60,16 @@
6060
extern bool kasan_early_stage;
6161
extern unsigned char kasan_early_shadow_page[PAGE_SIZE];
6262

63-
#define kasan_arch_is_ready kasan_arch_is_ready
64-
static __always_inline bool kasan_arch_is_ready(void)
65-
{
66-
return !kasan_early_stage;
67-
}
68-
6963
#define kasan_mem_to_shadow kasan_mem_to_shadow
70-
static inline void *kasan_mem_to_shadow(const void *addr)
71-
{
72-
if (!kasan_arch_is_ready()) {
73-
return (void *)(kasan_early_shadow_page);
74-
} else {
75-
unsigned long maddr = (unsigned long)addr;
76-
unsigned long xrange = (maddr >> XRANGE_SHIFT) & 0xffff;
77-
unsigned long offset = 0;
78-
79-
maddr &= XRANGE_SHADOW_MASK;
80-
switch (xrange) {
81-
case XKPRANGE_CC_SEG:
82-
offset = XKPRANGE_CC_SHADOW_OFFSET;
83-
break;
84-
case XKPRANGE_UC_SEG:
85-
offset = XKPRANGE_UC_SHADOW_OFFSET;
86-
break;
87-
case XKVRANGE_VC_SEG:
88-
offset = XKVRANGE_VC_SHADOW_OFFSET;
89-
break;
90-
default:
91-
WARN_ON(1);
92-
return NULL;
93-
}
94-
95-
return (void *)((maddr >> KASAN_SHADOW_SCALE_SHIFT) + offset);
96-
}
97-
}
64+
void *kasan_mem_to_shadow(const void *addr);
9865

9966
#define kasan_shadow_to_mem kasan_shadow_to_mem
100-
static inline const void *kasan_shadow_to_mem(const void *shadow_addr)
67+
const void *kasan_shadow_to_mem(const void *shadow_addr);
68+
69+
#define kasan_arch_is_ready kasan_arch_is_ready
70+
static __always_inline bool kasan_arch_is_ready(void)
10171
{
102-
unsigned long addr = (unsigned long)shadow_addr;
103-
104-
if (unlikely(addr > KASAN_SHADOW_END) ||
105-
unlikely(addr < KASAN_SHADOW_START)) {
106-
WARN_ON(1);
107-
return NULL;
108-
}
109-
110-
if (addr >= XKVRANGE_VC_SHADOW_OFFSET)
111-
return (void *)(((addr - XKVRANGE_VC_SHADOW_OFFSET) << KASAN_SHADOW_SCALE_SHIFT) + XKVRANGE_VC_START);
112-
else if (addr >= XKPRANGE_UC_SHADOW_OFFSET)
113-
return (void *)(((addr - XKPRANGE_UC_SHADOW_OFFSET) << KASAN_SHADOW_SCALE_SHIFT) + XKPRANGE_UC_START);
114-
else if (addr >= XKPRANGE_CC_SHADOW_OFFSET)
115-
return (void *)(((addr - XKPRANGE_CC_SHADOW_OFFSET) << KASAN_SHADOW_SCALE_SHIFT) + XKPRANGE_CC_START);
116-
else {
117-
WARN_ON(1);
118-
return NULL;
119-
}
72+
return !kasan_early_stage;
12073
}
12174

12275
#define addr_has_metadata addr_has_metadata

arch/loongarch/mm/kasan_init.c

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,57 @@ static pgd_t kasan_pg_dir[PTRS_PER_PGD] __initdata __aligned(PAGE_SIZE);
3535

3636
bool kasan_early_stage = true;
3737

38+
void *kasan_mem_to_shadow(const void *addr)
39+
{
40+
if (!kasan_arch_is_ready()) {
41+
return (void *)(kasan_early_shadow_page);
42+
} else {
43+
unsigned long maddr = (unsigned long)addr;
44+
unsigned long xrange = (maddr >> XRANGE_SHIFT) & 0xffff;
45+
unsigned long offset = 0;
46+
47+
maddr &= XRANGE_SHADOW_MASK;
48+
switch (xrange) {
49+
case XKPRANGE_CC_SEG:
50+
offset = XKPRANGE_CC_SHADOW_OFFSET;
51+
break;
52+
case XKPRANGE_UC_SEG:
53+
offset = XKPRANGE_UC_SHADOW_OFFSET;
54+
break;
55+
case XKVRANGE_VC_SEG:
56+
offset = XKVRANGE_VC_SHADOW_OFFSET;
57+
break;
58+
default:
59+
WARN_ON(1);
60+
return NULL;
61+
}
62+
63+
return (void *)((maddr >> KASAN_SHADOW_SCALE_SHIFT) + offset);
64+
}
65+
}
66+
67+
const void *kasan_shadow_to_mem(const void *shadow_addr)
68+
{
69+
unsigned long addr = (unsigned long)shadow_addr;
70+
71+
if (unlikely(addr > KASAN_SHADOW_END) ||
72+
unlikely(addr < KASAN_SHADOW_START)) {
73+
WARN_ON(1);
74+
return NULL;
75+
}
76+
77+
if (addr >= XKVRANGE_VC_SHADOW_OFFSET)
78+
return (void *)(((addr - XKVRANGE_VC_SHADOW_OFFSET) << KASAN_SHADOW_SCALE_SHIFT) + XKVRANGE_VC_START);
79+
else if (addr >= XKPRANGE_UC_SHADOW_OFFSET)
80+
return (void *)(((addr - XKPRANGE_UC_SHADOW_OFFSET) << KASAN_SHADOW_SCALE_SHIFT) + XKPRANGE_UC_START);
81+
else if (addr >= XKPRANGE_CC_SHADOW_OFFSET)
82+
return (void *)(((addr - XKPRANGE_CC_SHADOW_OFFSET) << KASAN_SHADOW_SCALE_SHIFT) + XKPRANGE_CC_START);
83+
else {
84+
WARN_ON(1);
85+
return NULL;
86+
}
87+
}
88+
3889
/*
3990
* Alloc memory for shadow memory page table.
4091
*/

0 commit comments

Comments
 (0)