Re: [next] arm64: db410c: Internal error: Oops: 96000004 - pc : sysfs_kf_seq_show

From: Arnd Bergmann
Date: Wed Jun 15 2022 - 06:49:04 EST


On Tue, Jun 14, 2022 at 10:57 PM Naresh Kamboju
<naresh.kamboju@xxxxxxxxxx> wrote:
>
> Following kernel crash reported while booting arm64 db410c board with
> Linux next-20220614 [1] kfence enabled on this kernel.
>
> CONFIG_KFENCE=y
>
>
> Reported-by: Linux Kernel Functional Testing <lkft@xxxxxxxxxx>

Did it work on older linux-next kernels with KFENCE enabled, or did you
just start enabling it?

>
> Boot log:
> ---------
> [ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd030]
> [ 0.000000] Linux version 5.19.0-rc2-next-20220614
> (tuxmake@tuxmake) (aarch64-linux-gnu-gcc (Debian 11.3.0-3) 11.3.0, GNU
> ld (GNU Binutils for Debian) 2.38) #1 SMP PREEMPT @1655189659
> [ 0.000000] Machine model: Qualcomm Technologies, Inc. APQ 8016 SBC
> [ 0.000000] efi: UEFI not found.
> [ 0.000000] [Firmware Bug]: Kernel image misaligned at boot, please
> fix your bootloader!

This is probably unrelated, but try updating your boot loader to get rid of
this warning.

> <trim>
> [ 0.000000] kfence: initialized - using 2097152 bytes for 255
> objects at 0x(____ptrval____)-0x(____ptrval____)
> <trim>
> [ 11.317288] Unable to handle kernel NULL pointer dereference at
> virtual address 0000000000000000
> [ 11.317361] Mem abort info:
> [ 11.317906] Unable to handle kernel paging request at virtual
> address 0000000029f63007
> [ 11.328825] Unable to handle kernel NULL pointer dereference at
> virtual address 0000000000000009
> [ 11.334704] ESR = 0x0000000096000004
> [ 11.343115] Unable to handle kernel NULL pointer dereference at
> virtual address 0000000000000000
> [ 11.357163] Mem abort info:
> [ 11.357217] ESR = 0x0000000096000004
> [ 11.359935] Mem abort info:
> [ 11.369085] Mem abort info:
> [ 11.369138] ESR = 0x0000000096000004
> [ 11.373564] EC = 0x25: DABT (current EL), IL = 32 bits
> [ 11.374530] SET = 0, FnV = 0
> [ 11.382591] EC = 0x25: DABT (current EL), IL = 32 bits
> [ 11.382864] SET = 0, FnV = 0
> [ 11.400484] ESR = 0x0000000096000004
> [ 11.411713] EC = 0x25: DABT (current EL), IL = 32 bits
> [ 11.411776] SET = 0, FnV = 0
> [ 11.422177] EA = 0, S1PTW = 0
> [ 11.422234] FSC = 0x04: level 0 translation fault
> [ 11.422724] EC = 0x25: DABT (current EL), IL = 32 bits
> [ 11.424129] Data abort info:
> [ 11.428397] EA = 0, S1PTW = 0
> [ 11.428416] FSC = 0x04: level 0 translation fault
> [ 11.428427] Data abort info:
> [ 11.428434] ISV = 0, ISS = 0x00000004
> [ 11.428442] CM = 0, WnR = 0
> [ 11.428451] user pgtable: 4k pages, 48-bit VAs, pgdp=00000000854b8000
> [ 11.428464] [0000000029f63007] pgd=0000000000000000, p4d=0000000000000000
> [ 11.428494] Internal error: Oops: 96000004 [#1] PREEMPT SMP
> [ 11.428503] Modules linked in: venus_enc venus_dec
> videobuf2_dma_contig crct10dif_ce adv7511(+) cec qcom_wcnss_pil
> snd_soc_msm8916_analog qcom_pon qcom_spmi_temp_alarm rtc_pm8xxx
> qcom_spmi_vadc snd_soc_lpass_apq8016 qcom_vadc_common
> snd_soc_msm8916_digital snd_soc_lpass_cpu snd_soc_apq8016_sbc
> snd_soc_lpass_platform qcom_q6v5_mss snd_soc_qcom_common qcom_pil_info
> msm qcom_camss qcom_q6v5 gpu_sched qcom_sysmon drm_dp_aux_bus
> venus_core qcom_common videobuf2_dma_sg v4l2_mem2mem v4l2_fwnode
> qcom_glink_smem v4l2_async videobuf2_memops qmi_helpers videobuf2_v4l2
> mdt_loader qnoc_msm8916 drm_display_helper videobuf2_common
> i2c_qcom_cci qcom_rng qcom_stats icc_smd_rpm rfkill display_connector
> drm_kms_helper drm socinfo rmtfs_mem qrtr fuse
> [ 11.428683] CPU: 3 PID: 312 Comm: systemd-udevd Tainted: G W
> 5.19.0-rc2-next-20220614 #1
> [ 11.428694] Hardware name: Qualcomm Technologies, Inc. APQ 8016 SBC (DT)
> [ 11.428699] pstate: 00000005 (nzcv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
> [ 11.428709] pc : sysfs_kf_seq_show+0x3c/0x130
> [ 11.428724] lr : kernfs_seq_show+0x38/0x44
> [ 11.428735] sp : ffff80000b7ebbf0
> [ 11.428739] x29: ffff80000b7ebbf0 x28: 0000000000000001 x27: 0000000000400cc0
> [ 11.428753] x26: 000000007ffff000 x25: ffff000005581290 x24: ffff000005581280
> [ 11.428767] x23: 0000000000000000 x22: ffff0000056dd520 x21: ffff000004413d00
> [ 11.428780] x20: 0000000029f62fff x19: ffff000005581258 x18: 0000000000000000
> [ 11.428793] x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000000
> [ 11.428806] x14: 0000000000000000 x13: 0000000000000000 x12: 0000000000000000
> [ 11.428819] x11: 0000000000000000 x10: 0000000000000000 x9 : ffff8000084b0ca8
> [ 11.428832] x8 : 0000000000000000 x7 : 0000000000000200 x6 : 0000000000000000
> [ 11.428845] x5 : 0000000000000000 x4 : 0000000000000001 x3 : ffff000004413d00
> [ 11.428857] x2 : ffff8000084b2e64 x1 : 0000000000000001 x0 : ffff000002368a00

It appears that kobj->ktype is x20 here, which is a user space address
(0x29f62fff),
reading ->sysfs_ops at offset 8 from that causes a trap.

static const struct sysfs_ops *sysfs_file_ops(struct kernfs_node *kn)
{
struct kobject *kobj = kn->parent->priv;

if (kn->flags & KERNFS_LOCKDEP)
lockdep_assert_held(kn);
return kobj->ktype ? kobj->ktype->sysfs_ops : NULL;
}
static int sysfs_kf_seq_show(struct seq_file *sf, void *v)
{
struct kernfs_open_file *of = sf->private;
struct kobject *kobj = of->kn->parent->priv;
const struct sysfs_ops *ops = sysfs_file_ops(of->kn);
...

ffff800008432e64 <sysfs_kf_seq_show>:
ffff800008432e64: d503245f bti c
ffff800008432e68: d503201f nop
ffff800008432e6c: d503201f nop
ffff800008432e70: d503233f paciasp
ffff800008432e74: a9bd7bfd stp x29, x30, [sp, #-48]!
ffff800008432e78: 910003fd mov x29, sp
ffff800008432e7c: a90153f3 stp x19, x20, [sp, #16]
ffff800008432e80: aa0003f3 mov x19, x0
ffff800008432e84: a9025bf5 stp x21, x22, [sp, #32]
ffff800008432e88: f9403815 ldr x21, [x0, #112] # of
= sf->private
ffff800008432e8c: f94002a0 ldr x0, [x21] # of->kn
ffff800008432e90: f9400400 ldr x0, [x0, #8] # kn->parent
ffff800008432e94: f9403016 ldr x22, [x0, #96] # kobj
= parent->priv
ffff800008432e98: f94016d4 ldr x20, [x22, #40] # kobj-> ktype
ffff800008432e9c: b4000054 cbz x20, ffff800008432ea4
<sysfs_kf_seq_show+0x40>
ffff800008432ea0: f9400694 ldr x20, [x20, #8] #
ktype->sysfs_ops, traps
...

Arnd