newbie trouble with destroy_dev

Ricky Charlet RCharlet at adaranet.com
Thu Sep 23 17:42:37 UTC 2010


Thanks.
        That totally worked. Lesson learned = destroy_dev sooner than destroy cv's and mutexes's and internal state.

        One question though... I did not find any "DYING" flag in relation to cv's or mutexes. So I just skipped that step in your advice. I only found the string "DYING" in relation to jails, sound-drivers, some network stuff and ipsec. Will you give me a little more specific pointer to what "DYING" flag you were referring to?

        FYI, my userland program sitting in the read loop exited cleanly and got errno=ENXIO, which is beautiful.

Thanks again.

---
Ricky Charlet
Adara Networks
USA 408-433-4942




-----Original Message-----
From: John Baldwin [mailto:jhb at freebsd.org]
Sent: Thursday, September 23, 2010 6:49 AM
To: freebsd-drivers at freebsd.org
Cc: Ricky Charlet
Subject: Re: newbie trouble with destroy_dev

On Wednesday, September 22, 2010 3:11:10 pm Ricky Charlet wrote:
> Howdy,
>
>                 My goal is to destroy a character device which is currently
open for read. Is that allowable? I'm hoping the userland program doing the
reading will simply get a read error back (possibly with no data or truncated
data).
>
>                 My experience so far is that I crash the box.
>
>                 I'm using BSD 8.0.  My program with the driver is a kernel
module. Upon using the `kldunload` utility, the d_close() method is called.  I
have tried these logic flows:
>
> Test 1
> ---------------------
>  Unhook my packet-filter-hooks
>  cv_broadcast;
> cv_destory
> mMtx_destroy
> destroy_dev
> free associated buffers
>
> Test 2
> --------------------
> Unhook my packet-filter-hooks
>  cv_broadcast;
> cv_destory
> mMtx_destroy
> destroy_dev_sched_cb
> free associated buffers
>
>   Test 3
> ----------------------
> Unhook my packet-filter-hooks
>  cv_broadcast;
> cv_destory
> mMtx_destroy
> free associated buffers
>
>
>                 In all cases I get a kernel crash and the system reboots.
Note that the userland program has the associated charater device open and is
in a for-ever loop reading the fd.
>
>                 I'm a newbie and have not yet attached a debugger. I'll go
start reading about that and trying it out while I hopefully await replies.

Call destroy_dev() earlier, before you destroy any state.  Your cdevsw
routines can be invoked right up until destroy_dev() returns, so if you
destroy the mutex before destroy_dev() you might destroy it before a cdevsw
routine tries to use it.  I suspect you might need something like:

        unhook_packet_filters
        set DYING flag (for listeners to the cv to know to exit, etc.)
        cv_broadcast()
        destroy_dev()
        free buffers
        cv_destroy()
        mtx_destroy()

--
John Baldwin


More information about the freebsd-drivers mailing list