In process_slab(), "p = get_freepointer()" could return a tagged
pointer, but "addr = page_address()" always return a native pointer. As
the result, slab_index() is messed up here,
return (p - addr) / s->size;
All other callers of slab_index() have the same situation where "addr"
is from page_address(), so just need to untag "p".
# cat /sys/kernel/slab/hugetlbfs_inode_cache/alloc_calls
Unable to handle kernel paging request at virtual address
2bff808aa4856d48
Mem abort info:
ESR = 0x96000007
Exception class = DABT (current EL), IL = 32 bits
SET = 0, FnV = 0
EA = 0, S1PTW = 0
Data abort info:
ISV = 0, ISS = 0x00000007
CM = 0, WnR = 0
swapper pgtable: 64k pages, 48-bit VAs, pgdp =
0000000002498338
[
2bff808aa4856d48] pgd=
00000097fcfd0003, pud=
00000097fcfd0003, pmd=
00000097fca30003, pte=
00e8008b24850712
Internal error: Oops:
96000007 [#1] SMP
CPU: 3 PID: 79210 Comm: read_all Tainted: G L 5.0.0-rc7+ #84
Hardware name: HPE Apollo 70 /C01_APACHE_MB , BIOS L50_5.13_1.0.6 07/10/2018
pstate:
00400089 (nzcv daIf +PAN -UAO)
pc : get_map+0x78/0xec
lr : get_map+0xa0/0xec
sp :
aeff808989e3f8e0
x29:
aeff808989e3f940 x28:
ffff800826200000
x27:
ffff100012d47000 x26:
9700000000002500
x25:
0000000000000001 x24:
52ff8008200131f8
x23:
52ff8008200130a0 x22:
52ff800820013098
x21:
ffff800826200000 x20:
ffff100013172ba0
x19:
2bff808a8971bc00 x18:
ffff1000148f5538
x17:
000000000000001b x16:
00000000000000ff
x15:
ffff1000148f5000 x14:
00000000000000d2
x13:
0000000000000001 x12:
0000000000000000
x11:
0000000020000002 x10:
2bff808aa4856d48
x9 :
0000020000000000 x8 :
68ff80082620ebb0
x7 :
0000000000000000 x6 :
ffff1000105da1dc
x5 :
0000000000000000 x4 :
0000000000000000
x3 :
0000000000000010 x2 :
2bff808a8971bc00
x1 :
ffff7fe002098800 x0 :
ffff80082620ceb0
Process read_all (pid: 79210, stack limit = 0x00000000f65b9361)
Call trace:
get_map+0x78/0xec
process_slab+0x7c/0x47c
list_locations+0xb0/0x3c8
alloc_calls_show+0x34/0x40
slab_attr_show+0x34/0x48
sysfs_kf_seq_show+0x2e4/0x570
kernfs_seq_show+0x12c/0x1a0
seq_read+0x48c/0xf84
kernfs_fop_read+0xd4/0x448
__vfs_read+0x94/0x5d4
vfs_read+0xcc/0x194
ksys_read+0x6c/0xe8
__arm64_sys_read+0x68/0xb0
el0_svc_handler+0x230/0x3bc
el0_svc+0x8/0xc
Code:
d3467d2a 9ac92329 8b0a0e6a f9800151 (
c85f7d4b)
---[ end trace
a383a9a44ff13176 ]---
Kernel panic - not syncing: Fatal exception
SMP: stopping secondary CPUs
SMP: failed to stop secondary CPUs 1-7,32,40,127
Kernel Offset: disabled
CPU features: 0x002,
20000c18
Memory Limit: none
---[ end Kernel panic - not syncing: Fatal exception ]---
Link: http://lkml.kernel.org/r/20190220020251.82039-1-cai@lca.pw
Signed-off-by: Qian Cai <cai@lca.pw>
Reviewed-by: Andrey Konovalov <andreyknvl@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
/* Determine object index from a given position */
static inline unsigned int slab_index(void *p, struct kmem_cache *s, void *addr)
{
- return (p - addr) / s->size;
+ return (kasan_reset_tag(p) - addr) / s->size;
}
static inline unsigned int order_objects(unsigned int order, unsigned int size)