Current-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Recent USB changes broke kernel memory allocation



Fixed now. If you update the tree to have sys/dev/usb/umass.c rev.
1.174 you'll get the fixed files.

Jaromir

Le dim. 10 févr. 2019 à 19:31, Tom Ivar Helbekkmo
<tih%hamartun.priv.no@localhost> a écrit :
>
> It seems that changes made to USB code on February 7th broke the kernel
> memory allocation arena.  After that point, it is enough to insert a USB
> memory stick into my amd64 laptop, and then remove it, to make the
> kernel crash.  It seems the changes to the allocating and freeing calls
> got a bit messed up, leading to internal disagreements about item sizes,
> at least in the umass code:
>
> : dejah# ;cd /var/crash
> : dejah# ;dmesg -N netbsd.26 -M netbsd.26.core | tail -23
> [  1525.390177] umass0: SMI Corporation (0x90c) USB DISK (0x1000), rev 2.00/11.00, addr 2
> [  1525.390177] umass0: using SCSI over Bulk-Only
> [  1525.390177] scsibus0 at umass0: 2 targets, 1 lun per target
> [  1525.660323] sd0 at scsibus0 target 0 lun 0: <S31B1103, USB DISK, 1100> disk removable
> [  1525.660323] sd0: 3864 MB, 7872 cyl, 16 head, 63 sec, 512 bytes/sect x 7913472 sectors
> [  1537.266612] sd0: detached
> [  1537.266612] scsibus0: detached
> [  1537.266612] panic: kmem_free(0xffff8412b3188208, 8) != allocated size 472
> [  1537.266612] cpu1: Begin traceback...
> [  1537.266612] vpanic() at netbsd:vpanic+0x16f
> [  1537.266612] snprintf() at netbsd:snprintf
> [  1537.266612] kmem_alloc() at netbsd:kmem_alloc
> [  1537.266612] umass_detach() at netbsd:umass_detach+0xe1
> [  1537.266612] config_detach() at netbsd:config_detach+0x121
> [  1537.266612] usb_disconnect_port() at netbsd:usb_disconnect_port+0xb8
> [  1537.266612] uhub_explore() at netbsd:uhub_explore+0x221
> [  1537.266612] usb_discover.isra.2() at netbsd:usb_discover.isra.2+0x68
> [  1537.266612] usb_event_thread() at netbsd:usb_event_thread+0x77
> [  1537.266612] cpu1: End traceback...
>
> [  1537.266612] dumping to dev 0,1 (offset=1472, size=1045482):
> [  1537.266612] dump
> : dejah# ;gdb netbsd.gdb
> GNU gdb (GDB) 8.0.1
> Copyright (C) 2017 Free Software Foundation, Inc.
> License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
> This is free software: you are free to change and redistribute it.
> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
> and "show warranty" for details.
> This GDB was configured as "x86_64--netbsd".
> Type "show configuration" for configuration details.
> For bug reporting instructions, please see:
> <http://www.gnu.org/software/gdb/bugs/>.
> Find the GDB manual and other documentation resources online at:
> <http://www.gnu.org/software/gdb/documentation/>.
> For help, type "help".
> Type "apropos word" to search for commands related to "word"...
> Reading symbols from netbsd.gdb...done.
> (gdb) target kvm netbsd.26.core
> 0xffffffff80222d75 in cpu_reboot (howto=howto@entry=260, bootstr=bootstr@entry=0x0)
>     at /usr/src/sys/arch/amd64/amd64/machdep.c:726
> 726                     dumpsys();
> (gdb) bt
> #0  0xffffffff80222d75 in cpu_reboot (howto=howto@entry=260, bootstr=bootstr@entry=0x0)
>     at /usr/src/sys/arch/amd64/amd64/machdep.c:726
> #1  0xffffffff809ec2c7 in vpanic (fmt=fmt@entry=0xffffffff813f8838 "kmem_free(%p, %zu) != allocated size %zu",
>     ap=ap@entry=0xffff84806a1d5d78) at /usr/src/sys/kern/subr_prf.c:335
> #2  0xffffffff809ec35e in panic (fmt=fmt@entry=0xffffffff813f8838 "kmem_free(%p, %zu) != allocated size %zu")
>     at /usr/src/sys/kern/subr_prf.c:254
> #3  0xffffffff809e1944 in kmem_size_check (sz=8, p=0xffff8412b3188200) at /usr/src/sys/kern/subr_kmem.c:549
> #4  kmem_intr_free (p=0xffff8412b3188200, requested_size=8) at /usr/src/sys/kern/subr_kmem.c:337
> #5  0xffffffff8047d794 in umass_detach (self=<optimized out>, flags=1) at /usr/src/sys/dev/usb/umass.c:844
> #6  0xffffffff809d337b in config_detach (dev=dev@entry=0xffff8412a6f78908, flags=flags@entry=1)
>     at /usr/src/sys/kern/subr_autoconf.c:1748
> #7  0xffffffff804697df in usb_disconnect_port (up=up@entry=0xffff84129e303210, parent=<optimized out>,
>     flags=flags@entry=1) at /usr/src/sys/dev/usb/usb_subr.c:1665
> #8  0xffffffff8046a3a2 in uhub_explore (dev=0xffff84129e2fae20) at /usr/src/sys/dev/usb/uhub.c:637
> #9  0xffffffff80463e47 in usb_discover (sc=<optimized out>, sc=<optimized out>) at /usr/src/sys/dev/usb/usb.c:1004
> #10 0xffffffff80463f0e in usb_event_thread (arg=0xffff84129e16bf68) at /usr/src/sys/dev/usb/usb.c:562
> #11 0xffffffff802097c7 in lwp_trampoline ()
> #12 0x0000000000000000 in ?? ()
> (gdb) up
> #1  0xffffffff809ec2c7 in vpanic (fmt=fmt@entry=0xffffffff813f8838 "kmem_free(%p, %zu) != allocated size %zu",
>     ap=ap@entry=0xffff84806a1d5d78) at /usr/src/sys/kern/subr_prf.c:335
> 335             cpu_reboot(bootopt, NULL);
> (gdb) up
> #2  0xffffffff809ec35e in panic (fmt=fmt@entry=0xffffffff813f8838 "kmem_free(%p, %zu) != allocated size %zu")
>     at /usr/src/sys/kern/subr_prf.c:254
> 254             vpanic(fmt, ap);
> (gdb) up
> #3  0xffffffff809e1944 in kmem_size_check (sz=8, p=0xffff8412b3188200) at /usr/src/sys/kern/subr_kmem.c:549
> 549                     panic("kmem_free(%p, %zu) != allocated size %zu",
> (gdb) list
> 544
> 545             hd = (struct kmem_header *)p;
> 546             hsz = hd->size;
> 547
> 548             if (hsz != sz) {
> 549                     panic("kmem_free(%p, %zu) != allocated size %zu",
> 550                         (const uint8_t *)p + SIZE_SIZE, sz, hsz);
> 551             }
> 552
> 553             hd->size = -1;
> (gdb) up
> #4  kmem_intr_free (p=0xffff8412b3188200, requested_size=8) at /usr/src/sys/kern/subr_kmem.c:337
> 337             kmem_size_check(p, requested_size);
> (gdb) up
> #5  0xffffffff8047d794 in umass_detach (self=<optimized out>, flags=1) at /usr/src/sys/dev/usb/umass.c:844
> 844                     kmem_free(scbus, sizeof(*scbus));
> (gdb) list
> 839                     default:
> 840                             /* nothing to do */
> 841                             break;
> 842                     }
> 843
> 844                     kmem_free(scbus, sizeof(*scbus));
> 845                     sc->bus = NULL;
> 846             }
> 847
> 848             if (rv != 0)
> (gdb) quit
> : dejah# ;
>
> -tih
> --
> Most people who graduate with CS degrees don't understand the significance
> of Lisp.  Lisp is the most important idea in computer science.  --Alan Kay


Home | Main Index | Thread Index | Old Index