So I've been doing some research into SMP on MIPS as I mentioned a while back,
and as I think I mentioned, I've run into issues with put_user, well, not
putting. In particular, I found that it was engaging in the classic SMP
pastime of sitting in a spinlock forever, doing nothing.
My current configuration is one emulated 5kc with 64mb of emulated RAM. After
adding some preliminary support to GXemul so that it can act as a GDB server,
I managed to dig up the following backtrace before my crummy GDB server
implementation blew up:
(gdb) bt
#0 0xffffffff8027f4b8 in _spin_lock (lock=0x3af0) at spinlock.h:60
#1 0xffffffff80194bac in handle_mm_fault (mm=0x3a80, vma=0x310948,
address=64321698660352, write_access=0) at mm/memory.c:2029
Cannot access memory at address 0x81b758
(gdb)
In particular, line 2029 is the spinlock within the following snippet of code:
/*
* We need the page table lock to synchronize with kswapd
* and the SMP-safe atomic PTE updates.
*/
pgd = pgd_offset(mm, address);
spin_lock(&mm->page_table_lock);
I'm not sure where this is being held that I'm not seeing it. I guess I should
probably enable spinlock debugging, although I've tried that once in the past
and gotten a total of zero spinlock-debug related messages. I'll give it
another shot, in case I selected the wrong option or some such.
Does anyone have any insight as to what's going on here?
Thanks in advance,
joshua
|