[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] What is the current state of Dom0 kernel support? / crash



On 07/22/09 13:53, Pasi Kärkkäinen wrote:
> On Wed, Jul 22, 2009 at 01:25:45PM -0700, Jeremy Fitzhardinge wrote:
>   
>> On 07/22/09 12:57, Pasi Kärkkäinen wrote:
>>     
>>> On Wed, Jul 22, 2009 at 10:35:30PM +0300, Pasi Kärkkäinen wrote:
>>>   
>>>       
>>>> On Wed, Jul 22, 2009 at 12:14:37PM -0700, Jeremy Fitzhardinge wrote:
>>>>     
>>>>         
>>>>> On 07/21/09 06:03, Pasi Kärkkäinen wrote:
>>>>>       
>>>>>           
>>>>>> I just tried the latest 32b PAE rebase/master tree (2.6.31-rc3).
>>>>>>
>>>>>> http://pasik.reaktio.net/xen/pv_ops-dom0-debug/pv_ops-dom0-log-10-rebase-master-with-highpte.txt
>>>>>>
>>>>>> Checking if this processor honours the WP bit even in supervisor mode...
>>>>>> BUG: unable to handle kernel NULL pointer dereference at (null)
>>>>>> IP: [<c058cdcb>] xen_evtchn_do_upcall+0xcc/0x13f
>>>>>> *pdpt = 000000003d275001 
>>>>>> Thread overran stack, or stack corrupted
>>>>>> Oops: 0000 [#1] SMP 
>>>>>> last sysfs file: 
>>>>>> Modules linked in:
>>>>>>
>>>>>> Pid: 0, comm: swapper Not tainted (2.6.31-rc3 #20) P8SC8
>>>>>> EIP: 0061:[<c058cdcb>] EFLAGS: 00010046 CPU: 0
>>>>>> EIP is at xen_evtchn_do_upcall+0xcc/0x13f
>>>>>> EAX: 00000000 EBX: ffffffff ECX: 00000000 EDX: 00000000
>>>>>> ESI: 00000000 EDI: c08ec558 EBP: c087eedc ESP: c087eea0
>>>>>>  DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: e021
>>>>>> Process swapper (pid: 0, ti=c087e000 task=c083b1a0 task.ti=c087e000)
>>>>>> Stack:
>>>>>>  00001a6e 00000220 00000200 00000000 00000000 00000000 e3201014 c08ec558
>>>>>> <0> c087eee4 f5681000 e3201010 00000000 00000000 c09017f8 f54ff000 
>>>>>> c087ef20
>>>>>> <0> c0409927 00000000 c09017f8 f54ff000 c09017f8 f54ff000 c087ef20 
>>>>>> c0843f70
>>>>>> Call Trace:
>>>>>>  [<c0409927>] ? xen_do_upcall+0x7/0xc
>>>>>>  [<c0404581>] ? xen_pte_clear+0x9/0x12
>>>>>>  [<c0427a94>] ? set_pte_vaddr+0xb4/0xc4
>>>>>>  [<c0426c8c>] ? __native_set_fixmap+0x25/0x30
>>>>>>  [<c040471a>] ? xen_set_fixmap+0xc7/0xcc
>>>>>>  [<c0897d86>] ? mem_init+0x24a/0x298
>>>>>>  [<c088367e>] ? start_kernel+0x14b/0x2cd
>>>>>>  [<c088336f>] ? unknown_bootoption+0x0/0x18e
>>>>>>  [<c0883082>] ? i386_start_kernel+0x71/0x79
>>>>>>  [<c0886188>] ? xen_start_kernel+0x52a/0x533
>>>>>> Code: d0 89 45 cc 89 55 c8 eb 16 0f bc c8 03 4d d4 8b 04 8a 83 f8 ff 74 
>>>>>> f8
>>>>>> 8b 55 e4 e8 36 de e7 ff 8b 55 f0 8b 45 d0 03 
>>>>>> 05 1c 0c 97 c0 <8b> 0c 10 8b 55 e8 8b 45 cc 23 0c 82 8b 45 c8 8b 04 82 
>>>>>> 8b 15
>>>>>> 18 
>>>>>> EIP: [<c058cdcb>] xen_evtchn_do_upcall+0xcc/0x13f SS:ESP e021:c087eea0
>>>>>> CR2: 0000000000000000
>>>>>> ---[ end trace 4eaa2a86a8e2da22 ]---
>>>>>> Kernel panic - not syncing: Fatal exception in interrupt
>>>>>>   
>>>>>>         
>>>>>>             
>>>>> Haven't seen that one before.  
>>>>>
>>>>>       
>>>>>           
>>>> Ok. I've seen many people report crashes during startup with rebase/master
>>>> on 32b PAE. I assume they're seeing this same issue.
>>>>
>>>>     
>>>>         
>>>>> The stack backtrace is a bit fuzzy; do you have CONFIG_FRAMEPOINTER 
>>>>> enabled?  
>>>>> And if you have CONFIG_DEBUGINFO enabled, you can map the eip c058cdcb 
>>>>> to a specific source line (its not clear to me which pointer is NULL).
>>>>>
>>>>>       
>>>>>           
>>>> [root@dom0test linux-2.6-xen]# grep -i CONFIG_FRAMEPOINTER .config
>>>> [root@dom0test linux-2.6-xen]# grep -i CONFIG_DEBUGINFO .config
>>>> [root@dom0test linux-2.6-xen]# 
>>>>
>>>> Unfortunately those were not enabled.. I'll build a new kernel with
>>>> CONFIG_DEBUGINFO enabled.
>>>>
>>>>     
>>>>         
>>> Actually CONFIG_DEBUG_INFO was enabled, if you meant that? 
>>>   
>>>       
>> Yes, that's it.
>>     
>>> (gdb) x/i 0xc058cdcb
>>>   
>>>       
>> Try "list *0xc058cdcb".
>>
>>     
>
> (gdb) list *0xc058cdcb
> 0xc058cdcb is in active_evtchns (drivers/xen/events.c:237).
> 232
> 233     static inline unsigned long active_evtchns(unsigned int cpu,
> 234                                                struct shared_info *sh,
> 235                                                unsigned int idx)
> 236     {
> 237             return (sh->evtchn_pending[idx] &
> 238                     cpu_evtchn_mask(cpu)[idx] &
> 239                     ~sh->evtchn_mask[idx]);
> 240     }
> 241
> (gdb)
>
>
> -- Pasi
>
>   

Does this help?

    J

Subject: [PATCH] xen: use proper percpu variable for cpu_evtchn_mask

cpu_evtchn_mask is a per-cpu mask of event channels, so it should
be implemented as a proper per_cpu variable.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@xxxxxxxxxx>

diff --git a/drivers/xen/events.c b/drivers/xen/events.c
index abad71b..4443b0f 100644
--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
@@ -93,14 +93,11 @@ static struct irq_info irq_info[NR_IRQS];
 static int evtchn_to_irq[NR_EVENT_CHANNELS] = {
        [0 ... NR_EVENT_CHANNELS-1] = -1
 };
-struct cpu_evtchn_s {
-       unsigned long bits[NR_EVENT_CHANNELS/BITS_PER_LONG];
-};
-static struct cpu_evtchn_s *cpu_evtchn_mask_p;
-static inline unsigned long *cpu_evtchn_mask(int cpu)
-{
-       return cpu_evtchn_mask_p[cpu].bits;
-}
+
+#define NR_EVENT_CHANNEL_LONGS (NR_EVENT_CHANNELS/BITS_PER_LONG)
+static DEFINE_PER_CPU(unsigned long,
+                     cpu_evtchn_mask[NR_EVENT_CHANNEL_LONGS]) =
+       {[0 ... NR_EVENT_CHANNEL_LONGS-1] = ~0};
 
 /* Xen will never allocate port zero for any purpose. */
 #define VALID_EVTCHN(chn)      ((chn) != 0)
@@ -223,7 +220,7 @@ static inline unsigned long active_evtchns(unsigned int cpu,
                                           unsigned int idx)
 {
        return (sh->evtchn_pending[idx] &
-               cpu_evtchn_mask(cpu)[idx] &
+               per_cpu(cpu_evtchn_mask, cpu)[idx] &
                ~sh->evtchn_mask[idx]);
 }
 
@@ -236,8 +233,8 @@ static void bind_evtchn_to_cpu(unsigned int chn, unsigned 
int cpu)
        cpumask_copy(irq_to_desc(irq)->affinity, cpumask_of(cpu));
 #endif
 
-       __clear_bit(chn, cpu_evtchn_mask(cpu_from_irq(irq)));
-       __set_bit(chn, cpu_evtchn_mask(cpu));
+       __clear_bit(chn, per_cpu(cpu_evtchn_mask, cpu_from_irq(irq)));
+       __set_bit(chn, per_cpu(cpu_evtchn_mask, cpu));
 
        irq_info[irq].cpu = cpu;
 }
@@ -253,8 +250,6 @@ static void init_evtchn_cpu_bindings(void)
                cpumask_copy(desc->affinity, cpumask_of(0));
        }
 #endif
-
-       memset(cpu_evtchn_mask(0), ~0, sizeof(cpu_evtchn_mask(0)));
 }
 
 static inline void clear_evtchn(int port)
@@ -928,10 +923,6 @@ void __init xen_init_IRQ(void)
 {
        int i;
 
-       cpu_evtchn_mask_p = kcalloc(nr_cpu_ids, sizeof(struct cpu_evtchn_s),
-                                   GFP_KERNEL);
-       BUG_ON(cpu_evtchn_mask_p == NULL);
-
        init_evtchn_cpu_bindings();
 
        /* No event channels are 'live' right now. */



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.