From: Mauro Carvalho Chehab <mchehab@redhat.com>
To: Chris Rankin <rankincj@yahoo.com>
Cc: linux-media@vger.kernel.org
Subject: Re: [PATCH v3] EM28xx - fix deadlock when unplugging and replugging a DVB adapter
Date: Sun, 25 Sep 2011 16:43:35 -0300 [thread overview]
Message-ID: <4E7F8467.1090106@redhat.com> (raw)
In-Reply-To: <4E7F2D6B.5000603@yahoo.com>
Em 25-09-2011 10:32, Chris Rankin escreveu:
> On 25/09/11 14:00, Mauro Carvalho Chehab wrote:
>> Hmm... This would probably work better (not tested). Could you please test it
>> on your hardware?
>
> Hmm, I don't understand this.
> The deadlock isn't about taking em28xx_devlist_mutex, but happens because em28xx_dvb_init() tries to retake dev->lock when em28xx_usb_probe() is already holding it. That's why I unlocked dev->lock before calling em28xx_init_extension().
>
> So why are you avoiding locking em28xx_devlist_mutex?
Yeah, I realized it just after sending it. I didn't have time to re-post another
email, as I was about to leave.
I'm still not comfortable on releasing the mutex too early, as this may cause driver
hungup, due to udev early access. I'll try to do some tests with it here, and think on
a better solution.
>
> Cheers,
> Chris
>
>> diff --git a/drivers/media/video/em28xx/em28xx-cards.c b/drivers/media/video/em28xx/em28xx-cards.c
>> index 7297d90..c92c177 100644
>> --- a/drivers/media/video/em28xx/em28xx-cards.c
>> +++ b/drivers/media/video/em28xx/em28xx-cards.c
>> @@ -3005,7 +3005,8 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
>> goto fail;
>> }
>>
>> - em28xx_init_extension(dev);
>> + /* dev->lock needs to be holded */
>> + __em28xx_init_extension(dev);
>>
>> /* Save some power by putting tuner to sleep */
>> v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_power, 0);
>> @@ -3301,10 +3302,10 @@ static void em28xx_usb_disconnect(struct usb_interface *interface)
>> em28xx_release_resources(dev);
>> }
>>
>> - em28xx_close_extension(dev);
>> -
>> mutex_unlock(&dev->lock);
>>
>> + em28xx_close_extension(dev);
>> +
>> if (!dev->users) {
>> kfree(dev->alt_max_pkt_size);
>> kfree(dev);
>> diff --git a/drivers/media/video/em28xx/em28xx-core.c b/drivers/media/video/em28xx/em28xx-core.c
>> index 804a4ab..afddfea 100644
>> --- a/drivers/media/video/em28xx/em28xx-core.c
>> +++ b/drivers/media/video/em28xx/em28xx-core.c
>> @@ -1218,16 +1218,22 @@ void em28xx_unregister_extension(struct em28xx_ops *ops)
>> }
>> EXPORT_SYMBOL(em28xx_unregister_extension);
>>
>> -void em28xx_init_extension(struct em28xx *dev)
>> +/* Need to take the mutex lock before calling it */
>> +void __em28xx_init_extension(struct em28xx *dev)
>> {
>> const struct em28xx_ops *ops = NULL;
>>
>> - mutex_lock(&em28xx_devlist_mutex);
>> list_add_tail(&dev->devlist,&em28xx_devlist);
>> list_for_each_entry(ops,&em28xx_extension_devlist, next) {
>> if (ops->init)
>> ops->init(dev);
>> }
>> +}
>> +
>> +void em28xx_init_extension(struct em28xx *dev)
>> +{
>> + mutex_lock(&em28xx_devlist_mutex);
>> + __em28xx_init_extension(dev);
>> mutex_unlock(&em28xx_devlist_mutex);
>> }
>>
>> diff --git a/drivers/media/video/em28xx/em28xx.h b/drivers/media/video/em28xx/em28xx.h
>> index 1626e4a..a5c1ba2 100644
>> --- a/drivers/media/video/em28xx/em28xx.h
>> +++ b/drivers/media/video/em28xx/em28xx.h
>> @@ -682,6 +682,7 @@ void em28xx_remove_from_devlist(struct em28xx *dev);
>> void em28xx_add_into_devlist(struct em28xx *dev);
>> int em28xx_register_extension(struct em28xx_ops *dev);
>> void em28xx_unregister_extension(struct em28xx_ops *dev);
>> +void __em28xx_init_extension(struct em28xx *dev);
>> void em28xx_init_extension(struct em28xx *dev);
>> void em28xx_close_extension(struct em28xx *dev);
>>
>
prev parent reply other threads:[~2011-09-25 19:43 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-09-24 20:54 [PATCH v3] EM28xx - fix deadlock when unplugging and replugging a DVB adapter Chris Rankin
2011-09-25 12:49 ` Mauro Carvalho Chehab
2011-09-25 13:20 ` Chris Rankin
2011-09-25 19:28 ` Chris Rankin
2011-09-25 19:45 ` Mauro Carvalho Chehab
2011-09-25 21:36 ` Chris Rankin
2011-09-25 13:00 ` Mauro Carvalho Chehab
2011-09-25 13:32 ` Chris Rankin
2011-09-25 19:43 ` Mauro Carvalho Chehab [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4E7F8467.1090106@redhat.com \
--to=mchehab@redhat.com \
--cc=linux-media@vger.kernel.org \
--cc=rankincj@yahoo.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox