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: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Adeos-main mailing list
[email protected]
https://mail.gna.org/listinfo/adeos-main

Reply via email to