On Thu, 19 Oct 2006, Giorgos Keramidas wrote:
FWIW, reverting revision 1.199 of kern_conf.c locally fixes the
unkillable xterms, stuck in "devdrn", problem.

  With rev 1.199, modules that do destroy_dev() in their d_close() will
hang in "devdrn" state upon device closing.  For example, netsmb and snp:

        # mount_smbfs -I server //server/share /mnt
        Password:
        [hang]

        # watch
        Snoop started.
        Enter device name []:^C
        [hang]

  It turns out that devfs_close() does a dev_refthread() before invoking
device specific d_close(), which makes subsequent destroy_dev() being
blocked in the "devdrn" loop.

Before someone teaches these drivers not doing destroy_dev() in their d_close(), following bandaid can workaround this hanging problem:

Index: sys/netsmb/smb_dev.c
===================================================================
RCS file: /home/ncvs/src/sys/netsmb/smb_dev.c,v
retrieving revision 1.29
diff -u -p -u -r1.29 smb_dev.c
--- sys/netsmb/smb_dev.c        22 Nov 2005 02:15:46 -0000      1.29
+++ sys/netsmb/smb_dev.c        14 Nov 2006 13:49:37 -0000
@@ -175,6 +175,7 @@ nsmb_dev_close(struct cdev *dev, int fla
 */
        dev->si_drv1 = NULL;
        free(sdp, M_NSMBDEV);
+       dev_relthread(dev);     /* XXX dealing with si_threadcount */
        destroy_dev(dev);
        splx(s);
        return 0;
Index: sys/dev/snp/snp.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/snp/snp.c,v
retrieving revision 1.102
diff -u -p -u -r1.102 snp.c
--- sys/dev/snp/snp.c   19 Sep 2005 13:48:45 -0000      1.102
+++ sys/dev/snp/snp.c   14 Nov 2006 13:49:37 -0000
@@ -489,6 +489,7 @@ snpclose(dev, flags, fmt, td)
        free(snp->snp_buf, M_SNP);
        snp->snp_flags &= ~SNOOP_OPEN;
        dev->si_drv1 = NULL;
+       dev_relthread(dev);     /* XXX dealing with si_threadcount */
        destroy_dev(dev);

        return (snp_detach(snp));

  On the other hand, si_threadcount could be negative with aforementioned
patch... :(

On 2006-10-19 02:49, Giorgos Keramidas <[EMAIL PROTECTED]> wrote:

Maybe it's not related, but all xterm's seem unkillable and blocked
forever in "devdrn" here, in a build from 2006.10.18.15.56.11.

An earlier sync from 2006.10.13.12.45.54 didn't exhibit this behavior,
so I guess there's something mildly buggy with this change?

On 2006-10-15 09:15, Martin Blapp <[EMAIL PROTECTED]> wrote:

Cool, thank you !

Martin

Martin Blapp, <[EMAIL PROTECTED]> <[EMAIL PROTECTED]>
------------------------------------------------------------------
ImproWare AG, UNIXSP & ISP, Zurlindenstrasse 29, 4133 Pratteln, CH
Phone: +41 61 826 93 00 Fax: +41 61 826 93 01
PGP: <finger -l [EMAIL PROTECTED]>
PGP Fingerprint: B434 53FC C87C FE7B 0A18 B84C 8686 EF22 D300 551E
------------------------------------------------------------------

On Fri, 13 Oct 2006, Tor Egge wrote:

tegge       2006-10-13 20:49:24 UTC

FreeBSD src repository

Modified files:
  sys/kern             kern_conf.c
Log:
Wait for thread count to reach zero in destroy_devl() even when no purge
method is defined, to avoid memory being modified after free.

Temporarily increase refcount in destroy_devl() to avoid a double free
if dev_rel() is called while waiting for thread count to reach zero.

Revision  Changes    Path
1.199     +6 -0      src/sys/kern/kern_conf.c

--
Cheers,

Tai-hwa Liang
_______________________________________________
cvs-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/cvs-all
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to