2008-03-05 23:26:54

by Adrian McMenamin

[permalink] [raw]
Subject: Behaviour of device_register

The observed behaviour for me is that it appears to be blocking the
vblank interrupt on my box (or more accurately stopping the workqueue
that the interrupt handler calls from running). And without the vblank
my bus won't process dma and so therefore the attempt to register the
device in question fails.

But I can see no reason from a glance over the code why that (vblanks
being blocked) would be the case - have I missed something and the
vblanks will be blocked, or should I be looking elsewhere for the root
cause of this problem?

Thanks

Adrian


2008-03-05 23:47:19

by Greg KH

[permalink] [raw]
Subject: Re: Behaviour of device_register

On Wed, Mar 05, 2008 at 11:25:48PM +0000, Adrian McMenamin wrote:
> The observed behaviour for me is that it appears to be blocking the
> vblank interrupt on my box (or more accurately stopping the workqueue
> that the interrupt handler calls from running). And without the vblank
> my bus won't process dma and so therefore the attempt to register the
> device in question fails.
>
> But I can see no reason from a glance over the code why that (vblanks
> being blocked) would be the case - have I missed something and the
> vblanks will be blocked, or should I be looking elsewhere for the root
> cause of this problem?

device_register(), on it's own, does not touch any hardware, nor prevent
anything else in the kernel from happening.

So I think you need to look elsewhere, like into the bus that is doing
the device_register() call :)

good luck,

greg k-h

2008-03-06 12:34:37

by Adrian McMenamin

[permalink] [raw]
Subject: Re: Behaviour of device_register

On Wed, March 5, 2008 11:46 pm, Greg KH wrote:
> On Wed, Mar 05, 2008 at 11:25:48PM +0000, Adrian McMenamin wrote:
>> The observed behaviour for me is that it appears to be blocking the
>> vblank interrupt on my box (or more accurately stopping the workqueue
>> that the interrupt handler calls from running). And without the vblank
>> my bus won't process dma and so therefore the attempt to register the
>> device in question fails.
>>
>> But I can see no reason from a glance over the code why that (vblanks
>> being blocked) would be the case - have I missed something and the
>> vblanks will be blocked, or should I be looking elsewhere for the root
>> cause of this problem?
>
> device_register(), on it's own, does not touch any hardware, nor prevent
> anything else in the kernel from happening.
>
> So I think you need to look elsewhere, like into the bus that is doing
> the device_register() call :)
>


It turns out this is a lock contention issue.

The code blocks waiting for a lock that will never be freed.

2008-03-06 16:31:15

by Greg KH

[permalink] [raw]
Subject: Re: Behaviour of device_register

On Thu, Mar 06, 2008 at 12:31:21PM -0000, Adrian McMenamin wrote:
> On Wed, March 5, 2008 11:46 pm, Greg KH wrote:
> > On Wed, Mar 05, 2008 at 11:25:48PM +0000, Adrian McMenamin wrote:
> >> The observed behaviour for me is that it appears to be blocking the
> >> vblank interrupt on my box (or more accurately stopping the workqueue
> >> that the interrupt handler calls from running). And without the vblank
> >> my bus won't process dma and so therefore the attempt to register the
> >> device in question fails.
> >>
> >> But I can see no reason from a glance over the code why that (vblanks
> >> being blocked) would be the case - have I missed something and the
> >> vblanks will be blocked, or should I be looking elsewhere for the root
> >> cause of this problem?
> >
> > device_register(), on it's own, does not touch any hardware, nor prevent
> > anything else in the kernel from happening.
> >
> > So I think you need to look elsewhere, like into the bus that is doing
> > the device_register() call :)
> >
>
>
> It turns out this is a lock contention issue.
>
> The code blocks waiting for a lock that will never be freed.

The device_register() code blocks? Or something else?

2008-03-06 18:00:31

by Adrian McMenamin

[permalink] [raw]
Subject: Re: Behaviour of device_register

On Thu, March 6, 2008 4:30 pm, Greg KH wrote:
> On Thu, Mar 06, 2008 at 12:31:21PM -0000, Adrian McMenamin wrote:
>> On Wed, March 5, 2008 11:46 pm, Greg KH wrote:
>> > On Wed, Mar 05, 2008 at 11:25:48PM +0000, Adrian McMenamin wrote:
>> >> The observed behaviour for me is that it appears to be blocking the
>> >> vblank interrupt on my box (or more accurately stopping the workqueue
>> >> that the interrupt handler calls from running). And without the
>> vblank
>> >> my bus won't process dma and so therefore the attempt to register the
>> >> device in question fails.
>> >>
>> >> But I can see no reason from a glance over the code why that (vblanks
>> >> being blocked) would be the case - have I missed something and the
>> >> vblanks will be blocked, or should I be looking elsewhere for the
>> root
>> >> cause of this problem?
>> >
>> > device_register(), on it's own, does not touch any hardware, nor
>> prevent
>> > anything else in the kernel from happening.
>> >
>> > So I think you need to look elsewhere, like into the bus that is doing
>> > the device_register() call :)
>> >
>>
>>
>> It turns out this is a lock contention issue.
>>
>> The code blocks waiting for a lock that will never be freed.
>
> The device_register() code blocks? Or something else?
>

No my code. The hotplug event results in a message which is stored in a
linked list which is protected by a lock. To query the device I need to
queue a message in that linked list which is obviously locked. So
everything is timed out.

I need to make the device query asychronous from the hotplug. Not perfect,
but the only memory safe way of doing it I think.