From patchwork Sat Aug 20 11:46:14 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Rankin X-Patchwork-Id: 276 Return-path: Envelope-to: mchehab@infradead.org Delivery-date: Sat, 20 Aug 2011 11:46:23 +0000 Received: from casper.infradead.org [85.118.1.10] by gaivota with IMAP (fetchmail-6.3.20) for (single-drop); Sat, 20 Aug 2011 04:50:36 -0700 (PDT) Received: from vger.kernel.org ([209.132.180.67]) by casper.infradead.org with esmtp (Exim 4.76 #1 (Red Hat Linux)) id 1Quk0N-0007Ye-Ai; Sat, 20 Aug 2011 11:46:23 +0000 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753525Ab1HTLqT (ORCPT + 1 other); Sat, 20 Aug 2011 07:46:19 -0400 Received: from nm4.bt.bullet.mail.ird.yahoo.com ([212.82.108.235]:43110 "HELO nm4.bt.bullet.mail.ird.yahoo.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1752389Ab1HTLqS (ORCPT ); Sat, 20 Aug 2011 07:46:18 -0400 Received: from [212.82.108.231] by nm4.bt.bullet.mail.ird.yahoo.com with NNFMP; 20 Aug 2011 11:46:17 -0000 Received: from [212.82.108.226] by tm4.bt.bullet.mail.ird.yahoo.com with NNFMP; 20 Aug 2011 11:46:17 -0000 Received: from [127.0.0.1] by omp1003.bt.mail.ird.yahoo.com with NNFMP; 20 Aug 2011 11:46:17 -0000 X-Yahoo-Newman-Id: 539015.74068.bm@omp1003.bt.mail.ird.yahoo.com Received: (qmail 65180 invoked from network); 20 Aug 2011 11:46:17 -0000 DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com; h=DKIM-Signature:X-Yahoo-Newman-Property:X-YMail-OSG:X-Yahoo-SMTP:Received:Received:Message-ID:Date:From:User-Agent:MIME-Version:To:CC:Subject:References:In-Reply-To:Content-Type; b=OBKpAgM+O8o3H+itXA+xipjjPmuqOoHU+5C8/SSeTDLw/YoV2yQmmBfyCjbOwutJsGBElzeODkBpVyuGO0QwqPI7F4BwFkdhATOjXaZX+gplbsumkEiOuFwgYGBQlJT3WgYPj3CvKUN0BJ7tcDIB4dAvNQsilqGh3YpRHClU/AM= ; DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s1024; t=1313840777; bh=sndk4HG/tsLFVN0NAJr+Lr6JVDRKmmFShB/m+0R/6To=; h=X-Yahoo-Newman-Property:X-YMail-OSG:X-Yahoo-SMTP:Received:Received:Message-ID:Date:From:User-Agent:MIME-Version:To:CC:Subject:References:In-Reply-To:Content-Type; b=EUjKI0UcQax7WsZ5gBkwelRM0TQTLB3eVgqY0TxJwwwWbc0QcHFqrbjnVjuwGUKurRYBhwFvJ2FL/SppCbw3Q6SeYWaz1memXYcVn+QY+LD2RtfX43+QsCvXQdYQyJGkEHkdLtHfwawK4PbjDRPUxkgqqdyWLKOvWPTMQG52v4Q= X-Yahoo-Newman-Property: ymail-3 X-YMail-OSG: eVumnLwVM1lu8M0NNCxY4OsqCWvriPWcV_s.0FmvrBcF977 njIauvIa9egpqK9.blOURQC5dpe3E47GSjkBEiJTcbnes_w6pHegKq3llonb Dkj5t8W848MzRY6NyFkEZFQyxqvHLVJM8.yX0AFDKxtu.pt21jtV_xNBi6Ux 2VGOC9IqaGVYy9tl3B7f8JI0YqzXAWdmO1R5ZoVi79hA7E1OwcG8Nr_redkt rpYD0l9bADl4Wk4MxXQFnOPwqfhGzA7fDG4e1GZeg.O3HWUujw2MggUOmbDS SCWQVKEVNwdlUwM2aWw7GhUJy6lwiOvCzTNMO4o7zBhsMXbeUPqnsoP071Ci ooRdYRQV7SETXBxXR84CBfMW4CmXBwAHSFM7gaqF3c0tZ4ALOkIMSiF3Ld.5 O.Q-- X-Yahoo-SMTP: dMK34oyswBBlfKesWTI5ovDjFOUFE6shtILt.ZXnUEjQHhWq Received: from wellhouse.underworld (rankincj@86.182.26.38 with login) by smtp818.mail.ird.yahoo.com with SMTP; 20 Aug 2011 11:46:17 +0000 GMT Received: from volcano.underworld (volcano.underworld [192.168.0.3]) by wellhouse.underworld (8.14.3/8.14.3/Debian-5+lenny1) with ESMTP id p7KBkEfX011505 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT); Sat, 20 Aug 2011 12:46:16 +0100 Message-ID: <4E4F9E86.7030001@yahoo.com> Date: Sat, 20 Aug 2011 12:46:14 +0100 From: Chris Rankin User-Agent: Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20110707 Thunderbird/5.0 MIME-Version: 1.0 To: Mauro Carvalho Chehab CC: Devin Heitmueller , linux-media@vger.kernel.org, Antti Palosaari Subject: [PATCH 2/2] EM28xx - fix deadlock when unplugging and replugging a DVB adapter References: <4E4D5157.2080406@yahoo.com> <4E4D8DFD.5060800@yahoo.com> <4E4DFA65.4090508@redhat.com> In-Reply-To: <4E4DFA65.4090508@redhat.com> Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org The final patch removes the unplug/replug deadlock by not holding the device mutex during dvb_init(). However, this mutex has already been locked during device initialisation by em28xx_usb_probe() and is not released again until all extensions have been initialised successfully. The device mutex is not held during either em28xx_register_extension() or em28xx_unregister_extension() any more. More importantly, I don't believe it can safely be held by these functions because they must both - by their nature - acquire the device list mutex before they can iterate through the device list. In other words, while usb_probe() and usb_disconnect() acquire the device mutex followed by the device list mutex, the register/unregister_extension() functions would need to acquire these mutexes in the opposite order. And that sounds like a potential deadlock. On the other hand, the new situation is a definite improvement :-). Signed-off-by: Chris Rankin --- linux-3.0/drivers/media/video/em28xx/em28xx-dvb.c.orig 2011-08-19 00:50:41.000000000 +0100 +++ linux-3.0/drivers/media/video/em28xx/em28xx-dvb.c 2011-08-19 00:51:03.000000000 +0100 @@ -542,7 +542,6 @@ dev->dvb = dvb; dvb->fe[0] = dvb->fe[1] = NULL; - mutex_lock(&dev->lock); em28xx_set_mode(dev, EM28XX_DIGITAL_MODE); /* init frontend */ switch (dev->model) { @@ -711,7 +710,6 @@ em28xx_info("Successfully loaded em28xx-dvb\n"); ret: em28xx_set_mode(dev, EM28XX_SUSPEND); - mutex_unlock(&dev->lock); return result; out_free: