[Bug 278826] [hpet] cdev->si_refcount leakage when enable hpet as timecounter hardware
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 278826] [hpet] cdev->si_refcount leakage when enable hpet as timecounter hardware"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 278826] [hpet] cdev->si_refcount leakage when enable hpet as timecounter hardware"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 278826] [hpet] cdev->si_refcount leakage when enable hpet as timecounter hardware"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 278826] [hpet] cdev->si_refcount leakage when enable hpet as timecounter hardware"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 278826] [hpet] cdev->si_refcount leakage when enable hpet as timecounter hardware"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 278826] [hpet] cdev->si_refcount leakage when enable hpet as timecounter hardware"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 278826] [hpet] cdev->si_refcount leakage when enable hpet as timecounter hardware"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 278826] [hpet] cdev->si_refcount leakage when enable hpet as timecounter hardware"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 278826] [hpet] cdev->si_refcount leakage when enable hpet as timecounter hardware"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 278826] [hpet] cdev->si_refcount leakage when enable hpet as timecounter hardware"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 278826] [hpet] cdev->si_refcount leakage when enable hpet as timecounter hardware"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 07 May 2024 05:19:57 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=278826 Bug ID: 278826 Summary: [hpet] cdev->si_refcount leakage when enable hpet as timecounter hardware Product: Base System Version: 15.0-CURRENT Hardware: amd64 OS: Any Status: New Severity: Affects Only Me Priority: --- Component: kern Assignee: bugs@FreeBSD.org Reporter: austin.zhang@dell.com reproduce the issue on the latest 15.0-CURRENT ``` [root@freebsd-main ~]# uname -a FreeBSD freebsd-main 15.0-CURRENT FreeBSD 15.0-CURRENT #13 main-n269920-7929aeebbde1: Mon May 6 20:44:10 CST 2024 root@freebsd-main:/usr/obj/root/workspace/freebsd-src/amd64.amd64/sys/GENERIC amd64 ``` test steps: select hpet as timecounter hardware ``` [root@freebsd-main ~]# sysctl kern.timecounter.hardware=HPET kern.timecounter.hardware: TSC -> HPET ``` when HPET is chosen as timecounter, libc's VDSO implementation will map `/dev/hpet0` into process's mmap, then we could observe `cdev->si_refcount` leakage occurs ``` [root@freebsd-main ~]# dtrace -n 'fbt::dev_ref:entry {printf("[%s]: invoke dev_ref: %s, refcount:%d", execname, args[0]->si_name, args[0]->si_refcount)}' dtrace: description 'fbt::dev_ref:entry ' matched 1 probe CPU ID FUNCTION:NAME 1 43845 dev_ref:entry [sshd]: invoke dev_ref: hpet0, refcount:11 0 43845 dev_ref:entry [sshd]: invoke dev_ref: hpet0, refcount:12 0 43845 dev_ref:entry [bash]: invoke dev_ref: hpet0, refcount:13 1 43845 dev_ref:entry [resizewin]: invoke dev_ref: hpet0, refcount:14 1 43845 dev_ref:entry [sysctl]: invoke dev_ref: hpet0, refcount:15 1 43845 dev_ref:entry [sysctl]: invoke dev_ref: hpet0, refcount:16 1 43845 dev_ref:entry [sysctl]: invoke dev_ref: hpet0, refcount:17 1 43845 dev_ref:entry [sysctl]: invoke dev_ref: hpet0, refcount:18 1 43845 dev_ref:entry [sysctl]: invoke dev_ref: hpet0, refcount:19 1 43845 dev_ref:entry [sysctl]: invoke dev_ref: hpet0, refcount:20 1 43845 dev_ref:entry [sysctl]: invoke dev_ref: hpet0, refcount:21 1 43845 dev_ref:entry [sysctl]: invoke dev_ref: hpet0, refcount:22 1 43845 dev_ref:entry [sysctl]: invoke dev_ref: hpet0, refcount:23 1 43845 dev_ref:entry [sysctl]: invoke dev_ref: hpet0, refcount:24 1 43845 dev_ref:entry [sh]: invoke dev_ref: hpet0, refcount:25 1 43845 dev_ref:entry [atrun]: invoke dev_ref: hpet0, refcount:26 ``` this cdev->si_refcount leak might have kernel panic risk if enable KASSERT(), see dev_rel() ``` void dev_rel(struct cdev *dev) { int flag = 0; dev_lock_assert_unlocked(); dev_lock(); dev->si_refcount--; KASSERT(dev->si_refcount >= 0, ("dev_rel(%s) gave negative count", devtoname(dev))); if (dev->si_devsw == NULL && dev->si_refcount == 0) { LIST_REMOVE(dev, si_list); flag = 1; } dev_unlock(); if (flag) devfs_free(dev); } ``` -- You are receiving this mail because: You are the assignee for the bug.