Badari Pulavarty wrote:
> > Now I run into next problem :( I am missing something basic.
> >
> > crash: read error: kernel virtual address: ffff81000000fa90 type:
> > "pglist_data node_next"
> >
>
> That's probably coming from node_table_init(). Could the pglist_data
> list now be using per-cpu data structures? But again, I don't understand
> the significance of the ffff8 at the top of the address.
I don't know either. I did some more digging around adding printk()
in 2.6.10, 2.6.14-rc5 kernel where data_offset is getting set.
Interestingly, allocmem() returns different types of address in 2.6.10 &
2.6.14-rc5 (which is causing this huge numbers).
arch/x86_64/kernel/setup.c: setup_per_cpu_areas()
for_each_cpu_mask (i, cpu_possible_map) {
char *ptr;
if (!NODE_DATA(cpu_to_node(i))) {
printk("cpu with no node %d, num_online_nodes %d
\n",
i, num_online_nodes());
ptr = alloc_bootmem(size);
} else {
ptr = alloc_bootmem_node(NODE_DATA(cpu_to_node
(i)), size);
}
if (!ptr)
panic("Cannot allocate cpu data for CPU %d\n",
i);
cpu_pda[i].data_offset = ptr - __per_cpu_start;
printk("i %d ptr %p cpustart %p offset %lx\n", i, ptr, __per_cpu_start,
cpu_pda[i].data_offset);
memcpy(ptr, __per_cpu_start, __per_cpu_end -
__per_cpu_start);
}
Here is the output:
2.6.14-rc5
i 0 ptr ffff8100050eb000 cpustart ffffffff805f50a0 offset
ffff810084af5f60
i 1 ptr ffff8100050f3000 cpustart ffffffff805f50a0 offset
ffff810084afdf60
2.6.10
i 0 ptr 0000010005100000 cpustart ffffffff8057f0a0 offset 10084b80f60
i 1 ptr 0000010005108000 cpustart ffffffff8057f0a0 offset 10084b88f60
i 2 ptr 0000010005110000 cpustart ffffffff8057f0a0 offset 10084b90f60
i 3 ptr 0000010005118000 cpustart ffffffff8057f0a0 offset 10084b98f60
i 4 ptr 0000010005120000 cpustart ffffffff8057f0a0 offset 10084ba0f60
i 5 ptr 0000010005128000 cpustart ffffffff8057f0a0 offset 10084ba8f60
i 6 ptr 0000010005130000 cpustart ffffffff8057f0a0 offset 10084bb0f60
i 7 ptr 0000010005138000 cpustart ffffffff8057f0a0 offset 10084bb8f60
Don't know enough about x86-64 stuff. May be I can ask Andi Kleen
about this change ?
That debug output certainly seems to pinpoint the issue at hand, doesn't it?
Very interesting...
What's strange is that the usage of the cpu_pda[i].data_offset by the
per_cpu() macro in "include/asm-x86_64/percpu.h" is unchanged.
It's probably something very simple going on here, but I don't have
any more ideas at this point.
Dave