[Bug 278392] virtio: device_detach crashes the system

From: <bugzilla-noreply_at_freebsd.org>
Date: Tue, 16 Apr 2024 17:29:45 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=278392

            Bug ID: 278392
           Summary: virtio: device_detach crashes the system
           Product: Base System
           Version: 14.0-RELEASE
          Hardware: amd64
                OS: Any
            Status: New
          Severity: Affects Many People
          Priority: ---
         Component: kern
          Assignee: bugs@FreeBSD.org
          Reporter: sade@blackberry.com

Steps to reproduce:
devctl delete -f vtnet0
devctl delete -f virtio_pci0

Reason:
When the the child device is deleted, vtpci_child_dev is not set to NULL.
Thus, vtpci_delete_child() tries to delete the child again and system crashes.

Possible fix:
Implementing bus_child_deleted method for vtpci legacy/modern devices which
would clear vtpci_child_dev when child is deleted.
I.e: 
vtpci_legacy_child_deleted(device_t dev, device_t child)
{
        struct vtpci_legacy_softc *sc;

        sc = device_get_softc(dev);

        sc->vtpci_common.vtpci_child_dev = NULL;
}

Logs:
root@freebsd:~ # devctl delete -f vtnet0
Apr 16 15:35:15 freebsd dhclient[592]: receive_packet failed on vtnet0: Device
not configured
Apr 16 15:35:15 freebsd dhclient[592]: ioctl(SIOCGIFFLAGS) on vtnet0: Operation
not permitted
Apr 16 15:35:15 freebsd dhclient[592]: Interface vtnet0 no longer appears
valid.
Apr 16 15:35:15 freebsd dhclient[592]: No live interfaces to poll on - exiting.
Apr 16 15:35:15 freebsd dhclient[592]: exiting.
Apr 16 15:35:15 freebsd dhclient[592]: connection closed
Apr 16 15:35:15 freebsd dhclient[592]: exiting.
vtnet0: detached
root@freebsd:~ # devctl delete -f virtio_pci0


Fatal trap 12: page fault while in kernel mode
cpuid = 0; apic id = 00
fault virtual address   = 0x800
fault code              = supervisor read data, page not present
instruction pointer     = 0x20:0xffffffff80b91407
stack pointer           = 0x28:0xfffffe004beeea10
frame pointer           = 0x28:0xfffffe004beeea40
code segment            = base 0x0, limit 0xfffff, type 0x1b
                        = DPL 0, pres 1, long 1, def32 0, gran 1
processor eflags        = interrupt enabled, IOPL = 0
current process         = 1064 (devctl)
rdi: fffff80003625100 rsi: ffffffff816d9e30 rdx: 0000000000000020
rcx: fffff800036d3600  r8: fffffe004c165000  r9: 0000000000000000
rax: 0000000000000000 rbx: ffffffff816d9e30 rbp: fffffe004beeea40
r10: 0000000000000000 r11: fffffe004c165520 r12: fffff8000305e928
r13: 0000000000000000 r14: fffff80003625100 r15: fffffe004c165000
trap number             = 12
panic: page fault
cpuid = 0
time = 1713281726
KDB: stack backtrace:
#0 0xffffffff80b9002d at kdb_backtrace+0x5d
#1 0xffffffff80b43132 at vpanic+0x132
#2 0xffffffff80b42ff3 at panic+0x43
#3 0xffffffff8100c85c at trap_fatal+0x40c
#4 0xffffffff8100c8af at trap_pfault+0x4f
#5 0xffffffff80fe3828 at calltrap+0x8
#6 0xffffffff80b7db47 at device_delete_child+0x127
#7 0xffffffff8096705c at vtpci_delete_child+0x1c
#8 0xffffffff8096896b at vtpci_legacy_detach+0x1b
#9 0xffffffff80b7dcf6 at device_detach+0x186
#10 0xffffffff80b7da35 at device_delete_child+0x15
#11 0xffffffff80b84d32 at devctl2_ioctl+0x4d2
#12 0xffffffff809d10dc at devfs_ioctl+0xcc
#13 0xffffffff80c3b9b4 at vn_ioctl+0xd4
#14 0xffffffff809d177e at devfs_ioctl_f+0x1e
#15 0xffffffff80bb1535 at kern_ioctl+0x255
#16 0xffffffff80bb1273 at sys_ioctl+0x123
#17 0xffffffff8100d119 at amd64_syscall+0x109
Uptime: 5m15s
Dumping 79 out of 95 MB:..21%..41%..61%..81%
Dump complete

-- 
You are receiving this mail because:
You are the assignee for the bug.