Driver not unset properly after kldunload



Hi,
It seems that after I load and then unload a driver its name stays
linked to the device e.g:

nfe0@pci0:10:0: class=0x068000 card=0x81411043 chip=0x005710de rev=0xa3
hdr=0x00

but of course if_nfe is neither compiled in kernel nor is loaded as
module anymore.
I digged around in kernel and saw this in device_detach():

if (!(dev->flags & DF_FIXEDCLASS))
devclass_delete_device(dev->devclass, dev);

dev->state = DS_NOTPRESENT;
device_set_driver(dev, NULL);
device_set_desc(dev, NULL);
device_sysctl_fini(dev);

I've put some device_printf()s around and then looked at
devclass_delete_device(). It destroys (frees) a lot of the info about
the device and so the device_printf() prints device name as
"unknown" (NULL). That seems to be a problem for at least
device_set_driver(dev, NULL) - it doesn't unset the driver. I'm not so
sure about the other 2 but I guess it's same there. So when I changed the
order of this funcs everything worked fine (at least it looks like it
worked fine :) I'm not absolutely sure that this won't broke something
else). I've attached a patch for review.

(I've filled a PR http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/104777)

--- subr_bus.c.bak Sun Oct 22 18:42:11 2006
+++ subr_bus.c Mon Oct 23 00:27:22 2006
@@ -2417,13 +2417,14 @@
if (dev->parent)
BUS_CHILD_DETACHED(dev->parent, dev);

+ device_set_driver(dev, NULL);
+ device_set_desc(dev, NULL);
+ device_sysctl_fini(dev);
+
if (!(dev->flags & DF_FIXEDCLASS))
devclass_delete_device(dev->devclass, dev);

dev->state = DS_NOTPRESENT;
- device_set_driver(dev, NULL);
- device_set_desc(dev, NULL);
- device_sysctl_fini(dev);

return (0);
}
_______________________________________________
freebsd-hackers@xxxxxxxxxxx mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@xxxxxxxxxxx"

Relevant Pages

  • Re: Dynamically loading binaries in Kernel mode.
    ... standard filesystem and unless you load it using standard export driver ... Allocate kernel level memory that is big enough to ... receive the binary image of the dynamic code ...
    (microsoft.public.development.device.drivers)
  • Re: need RAID driver for install, but no floppy drive
    ... >> which in this case will be the install kernel. ... > driver on the rescue floppy. ... How do I mount those Debian install ... it should work when you try to load a driver off the floppy using the ...
    (Debian-User)
  • Re: Evil: TI ACX111 non-success
    ... Perhaps ndis returning 6 and failing to load is a result of the ... This chip has two ranges, ... it seems this driver wants the FwRad16.bin image. ... If you plan to load the ndis.ko and if_ndis.ko kernel modules AFTER ...
    (freebsd-current)
  • Re: Dynamically loading binaries in Kernel mode.
    ... Right now only the kernel will load ... Windows 2k/XP/2k3 Filesystem and Driver Consulting ...
    (microsoft.public.development.device.drivers)
  • Re: Dynamically loading binaries in Kernel mode.
    ... standard filesystem and unless you load it using standard export driver ... Allocate kernel level memory that is big enough to ... receive the binary image of the dynamic code ...
    (microsoft.public.development.device.drivers)