Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 1 Feb 2010 12:43:28 +0200
From:      Kostik Belousov <kostikbel@gmail.com>
To:        Alexander Motin <mav@freebsd.org>
Cc:        freebsd-hackers@freebsd.org, FreeBSD-Current <freebsd-current@freebsd.org>, Pawel Jakub Dawidek <pjd@freebsd.org>, freebsd-geom@freebsd.org
Subject:   Re: Deadlock between GEOM and devfs device destroy and process exit.
Message-ID:  <20100201104328.GD15587@deviant.kiev.zoral.com.ua>
In-Reply-To: <4B66A669.2070406@FreeBSD.org>
References:  <4B636812.8060403@FreeBSD.org> <20100130112749.GA1660@garage.freebsd.pl> <20100130114451.GB1660@garage.freebsd.pl> <20100201092334.GB1743@garage.freebsd.pl> <4B66A669.2070406@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help

--xB0nW4MQa6jZONgY
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Mon, Feb 01, 2010 at 12:01:13PM +0200, Alexander Motin wrote:
> Pawel Jakub Dawidek wrote:
> > On Sat, Jan 30, 2010 at 12:44:51PM +0100, Pawel Jakub Dawidek wrote:
> >> Maybe I'll add how I understand what's going on:
> >>
> >> GEOM calls destroy_dev() while holding the topology lock.
> >>
> >> Destroy_dev() wants to destroy device, but can't because there are
> >> threads that still have it open.
> >>
> >> The threads can't close it, because to close it they need the topology
> >> lock.
> >>
> >> The deadlock is quite obvious, IMHO.
> >=20
> > Guys, changing destroy_dev() to destroy_dev_sched() in geom_dev.c fixes
> > the problem for me (at least it makes race window so small that I can't
> > reproduce it). Is there anyone who isn't happy with such a change?
>=20
> Have you done some locking there? Because my system crashes with such
> straightforward change, when g_dev_close() called after geom node being
> destroyed. Attached patch fixes that for me, but I have doubts that it
> is complete. There is still seems to be a race with new I/O requests and
> ioctl's, that are not protected by topology lock. At least if devfs code
> doesn't handle it somehow.

Devfs prevents new threads from entering cdevsw methods after
destroy_dev_sched() is called. It is driver responsibility to take care
about other code pathes that may access cdev.


--xB0nW4MQa6jZONgY
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (FreeBSD)

iEYEARECAAYFAktmsFAACgkQC3+MBN1Mb4hNzQCg2m16aRPIrgVnePtnZj0tCrYU
AqYAoJZ0iO6X7ivDvPxIgD5rdeEuLje/
=7DeA
-----END PGP SIGNATURE-----

--xB0nW4MQa6jZONgY--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20100201104328.GD15587>