From pjd@darkness.comp.waw.pl  Fri Jul 22 22:53:29 2005
Return-Path: <pjd@darkness.comp.waw.pl>
Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125])
	by hub.freebsd.org (Postfix) with ESMTP id D7D6216A420;
	Fri, 22 Jul 2005 22:53:29 +0000 (GMT)
	(envelope-from pjd@darkness.comp.waw.pl)
Received: from darkness.comp.waw.pl (darkness.comp.waw.pl [195.117.238.136])
	by mx1.FreeBSD.org (Postfix) with ESMTP id 994E743D45;
	Fri, 22 Jul 2005 22:53:28 +0000 (GMT)
	(envelope-from pjd@darkness.comp.waw.pl)
Received: by darkness.comp.waw.pl (Postfix, from userid 1009)
	id 0F460ACAF4; Sat, 23 Jul 2005 00:53:20 +0200 (CEST)
Message-Id: <20050722225320.0F460ACAF4@darkness.comp.waw.pl>
Date: Sat, 23 Jul 2005 00:53:20 +0200 (CEST)
From: Pawe Jakub Dawidek <pjd@FreeBSD.org>
Reply-To: Pawe Jakub Dawidek <pjd@FreeBSD.org>
To: FreeBSD-gnats-submit@freebsd.org
Cc: sam@FreeBSD.org
Subject: crypto_q_mtx recursion when unloading hifn.ko.
X-Send-Pr-Version: 3.113
X-GNATS-Notify:

>Number:         83930
>Category:       kern
>Synopsis:       [hifn] crypto_q_mtx recursion when unloading hifn.ko.
>Confidential:   no
>Severity:       serious
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Fri Jul 22 23:00:32 GMT 2005
>Closed-Date:    
>Last-Modified:  Sun Feb 24 22:59:18 UTC 2013
>Originator:     Pawel Jakub Dawidek
>Release:        FreeBSD 5.x
>Organization:
>Environment:
>Description:
I had a panic related to mutex recursion when unloading hifn.ko module.
The code path is as follows:

	crypto_dispatch()
	CRYPTO_Q_LOCK()
	crypto_invoke()
	crypto_done()
	cryptodev_cb() (via crp->crp_callback)
	crypto_dispatch()
	CRYPTO_Q_LOCK() <- recursion.
>How-To-Repeat:
>Fix:
Not sure how to fix it. Calling 'locked' version of crypto_dispatch()
is not an option, as we can call cryptodev_cb() with or without
crypto_q_mtx held.
The only fix I can came up with right not is a "pseudo-recursion" in
crypto_dispatch():

	int unlock = 0;

	[...]

	if (!mtx_owned(&crypto_q_mtx)) {
		unlock = 1;
		CRYPTO_Q_LOCK();
	}

	[...]

	if (unlock)
		CRYPTO_Q_LOCK();
>Release-Note:
>Audit-Trail:
Responsible-Changed-From-To: freebsd-bugs->sam 
Responsible-Changed-By: pjd 
Responsible-Changed-When: Fri Jul 22 23:02:34 GMT 2005 
Responsible-Changed-Why:  
Sam asked for this PR. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=83930 
Responsible-Changed-From-To: sam->freebsd-bugs 
Responsible-Changed-By: linimon 
Responsible-Changed-When: Sun Feb 24 22:58:48 UTC 2013 
Responsible-Changed-Why:  
Sam has not been active in some time. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=83930 
>Unformatted:
