* [Adeos-main] [BUG] ipipe_sync_stage deadlock
@ 2008-05-08 20:26 Jan Kiszka
2008-05-08 20:55 ` Philippe Gerum
0 siblings, 1 reply; 5+ messages in thread
From: Jan Kiszka @ 2008-05-08 20:26 UTC (permalink / raw)
To: adeos-main
[-- Attachment #1: Type: text/plain, Size: 1116 bytes --]
I love KVM - not only because I'm heavily hacking on it now, also
because it is so easy to trigger various kinds of guest issues with
it (SMP host + threaded virtual CPUs => true SMP guest - and if you
want to watch fancy things happen, just load one host core).
Here is one I found that way:
void fastcall __ipipe_sync_stage(unsigned long syncmask)
{
[ ... ]
while ((mask = (ipipe_this_cpudom_var(irqpend_himask) & syncmask)) != 0) {
level = __ipipe_ffnz(mask);
while ((submask = ipipe_this_cpudom_var(irqpend_lomask)[level]) != 0) {
rank = __ipipe_ffnz(submask);
irq = (level << IPIPE_IRQ_ISHIFT) + rank;
if (test_bit(IPIPE_LOCK_FLAG, &ipd->irqs[irq].control)) {
__clear_bit(rank, &ipipe_this_cpudom_var(irqpend_lomask)[level]);
continue;
}
__clear_bit(rank, &ipipe_this_cpudom_var(irqpend_lomask)[level]);
if (ipipe_this_cpudom_var(irqpend_lomask)[level] == 0)
__clear_bit(level, &ipipe_this_cpudom_var(irqpend_himask));
[ ... ]
Who sees the deadlock? 100 points for the right answer! But be quick,
I'm already hacking on a fix. :)
Jan
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 254 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Adeos-main] [BUG] ipipe_sync_stage deadlock
2008-05-08 20:26 [Adeos-main] [BUG] ipipe_sync_stage deadlock Jan Kiszka
@ 2008-05-08 20:55 ` Philippe Gerum
2008-05-08 21:00 ` Philippe Gerum
0 siblings, 1 reply; 5+ messages in thread
From: Philippe Gerum @ 2008-05-08 20:55 UTC (permalink / raw)
To: Jan Kiszka; +Cc: adeos-main
Jan Kiszka wrote:
> I love KVM - not only because I'm heavily hacking on it now, also
> because it is so easy to trigger various kinds of guest issues with
> it (SMP host + threaded virtual CPUs => true SMP guest - and if you
> want to watch fancy things happen, just load one host core).
>
> Here is one I found that way:
>
> void fastcall __ipipe_sync_stage(unsigned long syncmask)
> {
> [ ... ]
> while ((mask = (ipipe_this_cpudom_var(irqpend_himask) & syncmask)) != 0) {
> level = __ipipe_ffnz(mask);
>
> while ((submask = ipipe_this_cpudom_var(irqpend_lomask)[level]) != 0) {
> rank = __ipipe_ffnz(submask);
> irq = (level << IPIPE_IRQ_ISHIFT) + rank;
>
> if (test_bit(IPIPE_LOCK_FLAG, &ipd->irqs[irq].control)) {
> __clear_bit(rank, &ipipe_this_cpudom_var(irqpend_lomask)[level]);
- continue;
+ goto rpm_needs_more_neurons;
> }
>
> __clear_bit(rank, &ipipe_this_cpudom_var(irqpend_lomask)[level]);
>
+ rpm_needs_more_neurons:
> if (ipipe_this_cpudom_var(irqpend_lomask)[level] == 0)
> __clear_bit(level, &ipipe_this_cpudom_var(irqpend_himask));
> [ ... ]
>
> Who sees the deadlock? 100 points for the right answer! But be quick,
> I'm already hacking on a fix. :)
>
> Jan
>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Adeos-main mailing list
> Adeos-main@domain.hid
> https://mail.gna.org/listinfo/adeos-main
--
Philippe.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Adeos-main] [BUG] ipipe_sync_stage deadlock
2008-05-08 20:55 ` Philippe Gerum
@ 2008-05-08 21:00 ` Philippe Gerum
2008-05-08 21:13 ` Jan Kiszka
0 siblings, 1 reply; 5+ messages in thread
From: Philippe Gerum @ 2008-05-08 21:00 UTC (permalink / raw)
To: Jan Kiszka; +Cc: adeos-main
Philippe Gerum wrote:
> Jan Kiszka wrote:
>> I love KVM - not only because I'm heavily hacking on it now, also
>> because it is so easy to trigger various kinds of guest issues with
>> it (SMP host + threaded virtual CPUs => true SMP guest - and if you
>> want to watch fancy things happen, just load one host core).
>>
>> Here is one I found that way:
>>
>> void fastcall __ipipe_sync_stage(unsigned long syncmask)
>> {
>> [ ... ]
>> while ((mask = (ipipe_this_cpudom_var(irqpend_himask) & syncmask)) != 0) {
>> level = __ipipe_ffnz(mask);
>>
>> while ((submask = ipipe_this_cpudom_var(irqpend_lomask)[level]) != 0) {
>> rank = __ipipe_ffnz(submask);
>> irq = (level << IPIPE_IRQ_ISHIFT) + rank;
>>
>> if (test_bit(IPIPE_LOCK_FLAG, &ipd->irqs[irq].control)) {
>> __clear_bit(rank, &ipipe_this_cpudom_var(irqpend_lomask)[level]);
> - continue;
> + goto rpm_needs_more_neurons;
>> }
>>
>> __clear_bit(rank, &ipipe_this_cpudom_var(irqpend_lomask)[level]);
>>
> + rpm_needs_more_neurons:
>> if (ipipe_this_cpudom_var(irqpend_lomask)[level] == 0)
>> __clear_bit(level, &ipipe_this_cpudom_var(irqpend_himask));
>> [ ... ]
>>
Of course, I'm not saying this is the real fix, but that just points at a
possible issue. I do want those 100 points on my score card.
>> Who sees the deadlock? 100 points for the right answer! But be quick,
>> I'm already hacking on a fix. :)
>>
>> Jan
>>
>>
>>
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> Adeos-main mailing list
>> Adeos-main@domain.hid
>> https://mail.gna.org/listinfo/adeos-main
>
>
--
Philippe.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Adeos-main] [BUG] ipipe_sync_stage deadlock
2008-05-08 21:00 ` Philippe Gerum
@ 2008-05-08 21:13 ` Jan Kiszka
2008-05-08 21:23 ` Philippe Gerum
0 siblings, 1 reply; 5+ messages in thread
From: Jan Kiszka @ 2008-05-08 21:13 UTC (permalink / raw)
To: rpm; +Cc: adeos-main
[-- Attachment #1: Type: text/plain, Size: 2459 bytes --]
Philippe Gerum wrote:
> Philippe Gerum wrote:
>> Jan Kiszka wrote:
>>> I love KVM - not only because I'm heavily hacking on it now, also
>>> because it is so easy to trigger various kinds of guest issues with
>>> it (SMP host + threaded virtual CPUs => true SMP guest - and if you
>>> want to watch fancy things happen, just load one host core).
>>>
>>> Here is one I found that way:
>>>
>>> void fastcall __ipipe_sync_stage(unsigned long syncmask)
>>> {
>>> [ ... ]
>>> while ((mask = (ipipe_this_cpudom_var(irqpend_himask) & syncmask)) != 0) {
>>> level = __ipipe_ffnz(mask);
>>>
>>> while ((submask = ipipe_this_cpudom_var(irqpend_lomask)[level]) != 0) {
>>> rank = __ipipe_ffnz(submask);
>>> irq = (level << IPIPE_IRQ_ISHIFT) + rank;
>>>
>>> if (test_bit(IPIPE_LOCK_FLAG, &ipd->irqs[irq].control)) {
>>> __clear_bit(rank, &ipipe_this_cpudom_var(irqpend_lomask)[level]);
>> - continue;
>> + goto rpm_needs_more_neurons;
>>> }
>>>
>>> __clear_bit(rank, &ipipe_this_cpudom_var(irqpend_lomask)[level]);
>>>
>> + rpm_needs_more_neurons:
>>> if (ipipe_this_cpudom_var(irqpend_lomask)[level] == 0)
>>> __clear_bit(level, &ipipe_this_cpudom_var(irqpend_himask));
>>> [ ... ]
>>>
>
> Of course, I'm not saying this is the real fix, but that just points at a
> possible issue. I do want those 100 points on my score card.
Well, I wasn't asking for a fix, just for spotting the gremlin - so you
won! :->
Then let us fix this for real:
---
kernel/ipipe/core.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
Index: b/kernel/ipipe/core.c
===================================================================
--- a/kernel/ipipe/core.c
+++ b/kernel/ipipe/core.c
@@ -957,16 +957,14 @@ void fastcall __ipipe_sync_stage(unsigne
rank = __ipipe_ffnz(submask);
irq = (level << IPIPE_IRQ_ISHIFT) + rank;
- if (test_bit(IPIPE_LOCK_FLAG, &ipd->irqs[irq].control)) {
- __clear_bit(rank, &ipipe_this_cpudom_var(irqpend_lomask)[level]);
- continue;
- }
-
__clear_bit(rank, &ipipe_this_cpudom_var(irqpend_lomask)[level]);
if (ipipe_this_cpudom_var(irqpend_lomask)[level] == 0)
__clear_bit(level, &ipipe_this_cpudom_var(irqpend_himask));
+ if (test_bit(IPIPE_LOCK_FLAG, &ipd->irqs[irq].control))
+ continue;
+
__set_bit(IPIPE_STALL_FLAG, &ipipe_this_cpudom_var(status));
if (ipd == ipipe_root_domain)
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 254 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Adeos-main] [BUG] ipipe_sync_stage deadlock
2008-05-08 21:13 ` Jan Kiszka
@ 2008-05-08 21:23 ` Philippe Gerum
0 siblings, 0 replies; 5+ messages in thread
From: Philippe Gerum @ 2008-05-08 21:23 UTC (permalink / raw)
To: Jan Kiszka; +Cc: adeos-main
Jan Kiszka wrote:
> Philippe Gerum wrote:
>> Philippe Gerum wrote:
>>> Jan Kiszka wrote:
>>>> I love KVM - not only because I'm heavily hacking on it now, also
>>>> because it is so easy to trigger various kinds of guest issues with
>>>> it (SMP host + threaded virtual CPUs => true SMP guest - and if you
>>>> want to watch fancy things happen, just load one host core).
>>>>
>>>> Here is one I found that way:
>>>>
>>>> void fastcall __ipipe_sync_stage(unsigned long syncmask)
>>>> {
>>>> [ ... ]
>>>> while ((mask = (ipipe_this_cpudom_var(irqpend_himask) & syncmask)) != 0) {
>>>> level = __ipipe_ffnz(mask);
>>>>
>>>> while ((submask = ipipe_this_cpudom_var(irqpend_lomask)[level]) != 0) {
>>>> rank = __ipipe_ffnz(submask);
>>>> irq = (level << IPIPE_IRQ_ISHIFT) + rank;
>>>>
>>>> if (test_bit(IPIPE_LOCK_FLAG, &ipd->irqs[irq].control)) {
>>>> __clear_bit(rank, &ipipe_this_cpudom_var(irqpend_lomask)[level]);
>>> - continue;
>>> + goto rpm_needs_more_neurons;
>>>> }
>>>>
>>>> __clear_bit(rank, &ipipe_this_cpudom_var(irqpend_lomask)[level]);
>>>>
>>> + rpm_needs_more_neurons:
>>>> if (ipipe_this_cpudom_var(irqpend_lomask)[level] == 0)
>>>> __clear_bit(level, &ipipe_this_cpudom_var(irqpend_himask));
>>>> [ ... ]
>>>>
>> Of course, I'm not saying this is the real fix, but that just points at a
>> possible issue. I do want those 100 points on my score card.
>
> Well, I wasn't asking for a fix, just for spotting the gremlin - so you
> won! :->
>
Ah! Great. So this is the ultimate proof that when it comes to software
development, one neuron is one too many!
> Then let us fix this for real:
>
Ok, will merge thanks.
> ---
> kernel/ipipe/core.c | 8 +++-----
> 1 file changed, 3 insertions(+), 5 deletions(-)
>
> Index: b/kernel/ipipe/core.c
> ===================================================================
> --- a/kernel/ipipe/core.c
> +++ b/kernel/ipipe/core.c
> @@ -957,16 +957,14 @@ void fastcall __ipipe_sync_stage(unsigne
> rank = __ipipe_ffnz(submask);
> irq = (level << IPIPE_IRQ_ISHIFT) + rank;
>
> - if (test_bit(IPIPE_LOCK_FLAG, &ipd->irqs[irq].control)) {
> - __clear_bit(rank, &ipipe_this_cpudom_var(irqpend_lomask)[level]);
> - continue;
> - }
> -
> __clear_bit(rank, &ipipe_this_cpudom_var(irqpend_lomask)[level]);
>
> if (ipipe_this_cpudom_var(irqpend_lomask)[level] == 0)
> __clear_bit(level, &ipipe_this_cpudom_var(irqpend_himask));
>
> + if (test_bit(IPIPE_LOCK_FLAG, &ipd->irqs[irq].control))
> + continue;
> +
> __set_bit(IPIPE_STALL_FLAG, &ipipe_this_cpudom_var(status));
>
> if (ipd == ipipe_root_domain)
>
--
Philippe.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2008-05-08 21:23 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-05-08 20:26 [Adeos-main] [BUG] ipipe_sync_stage deadlock Jan Kiszka
2008-05-08 20:55 ` Philippe Gerum
2008-05-08 21:00 ` Philippe Gerum
2008-05-08 21:13 ` Jan Kiszka
2008-05-08 21:23 ` Philippe Gerum
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.