On Fri, 14 Aug 2009, Andrew Gallatin wrote: > I've been porting a closed-source driver to FreeBSD 8 from FreeBSD 5/6/7. It > use the dev_clone() eventhandler to mimic linux-like open semantics (for > linux binary compat). No particular experience with unloading cloning stuff, but have you noticed that in 8.x we now have per-file descriptor device state? This is often the semantics people actually want, rather than cloning. See devfs_set_cdevpriv(9) for details -- there are several synthetic devices in the tree that use it now (although some of them do too much error-checking, and should assert rather than return errors, I think). Robert N M Watson Computer Laboratory University of Cambridge > > From the eventhandler, I do: > > fake_unit = -1; > i = clone_create(&mx_clones, &mx_cdevsw, &fake_unit, cdev, 0); > > if (i) { > /* need to allocate a new /dev/mx_fake.%d device node */ > *cdev = make_dev(&mx_cdevsw, unit2minor(fake_unit), > UID_ROOT, GID_WHEEL, > mode, "mx_fake.%d", fake_unit); > } > > This has worked fine from 5.x through 7.x, > but in 8.x, the /dev/mx_fake.* devices persist after > unload. If anything attempts to access them, the machine > falls over (trace appended). > > I'm assuming these files are lingering because clone_cleanup() > (called at device detach) is not cleaning up these lingering > device nodes. I've tried writing a dtrace script to trace > clone_cleanup. But since that happens from device detach, > dtrace doesn't work (blocks driver unload). I've also tried > setting a breakpoint in ddb(), but the breakpoint seems to > be ignored (other breakpoints work fine, which is odd). > > What changed between 7.x and 8 with respect to device cloning? > > BTW, is there any easier option now in 8.x? > > Thanks, > > Drew > > Fatal trap 12: page fault while in kernel mode > cpuid = 0; apic id = 00 > fault virtual address = 0xffffffff81528a64 > fault code = supervisor read data, page not present > instruction pointer = 0x20:0xffffffff8052f009 > stack pointer = 0x28:0xffffff8018a75730 > frame pointer = 0x28:0xffffff8018a757a0 > code segment = base 0x0, limit 0xfffff, type 0x1b > = DPL 0, pres 1, long 1, def32 0, gran 1 > processor eflags = interrupt enabled, resume, IOPL = 0 > current process = 18087 (cat) > [thread pid 18087 tid 100061 ] > Stopped at devfs_open+0x69: testb $0x4,0x4(%rax) > db> bt > Tracing pid 18087 tid 100061 td 0xffffff000188bab0 > devfs_open() at devfs_open+0x69 > VOP_OPEN_APV() at VOP_OPEN_APV+0x44 > vn_open_cred() at vn_open_cred+0x2f4 > kern_openat() at kern_openat+0x179 > syscall() at syscall+0x28f > Xfast_syscall() at Xfast_syscall+0xd0 > --- syscall (5, FreeBSD ELF64, open), rip = 0x8007272ac, rsp = > 0x7fffffffe0d8, rbp = 0 --- > db> > Tracing pid 18087 tid 100061 td 0xffffff000188bab0 > devfs_open() at devfs_open+0x69 > VOP_OPEN_APV() at VOP_OPEN_APV+0x44 > vn_open_cred() at vn_open_cred+0x2f4 > kern_openat() at kern_openat+0x179 > syscall() at syscall+0x28f > Xfast_syscall() at Xfast_syscall+0xd0 > --- syscall (5, FreeBSD ELF64, open), rip = 0x8007272ac, rsp = > 0x7fffffffe0d8, rbp = 0 --- > _______________________________________________ > freebsd-current_at_freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-current > To unsubscribe, send any mail to "freebsd-current-unsubscribe_at_freebsd.org" >Received on Fri Aug 14 2009 - 14:41:55 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:53 UTC