On Tue, Feb 06, 2007 at 10:29:54AM -0000, Martyn Welch wrote: > I need to allocate a large buffer for DMA transfers in a driver I'm > working on. I understand that the kernel normally will not allocate > coherent buffers larger than 128KB, the suggested solution (from > O'Reilly's ldd3) seems to be to compile the driver into the kernel and > allocate a buffer at boot using alloc_bootmem_low(). When I tried this I > get a kernel panic: Are you trying to do this from a module? That would explain it doesn't work. > ======================================================================== > ========= > > BUG: unable to handle kernel NULL pointer dereference at virtual address > 000002f0 > printing eip: > c021ca95 > *pde = 00000000 > Oops: 0000 [#1] > SMP > Modules linked in: > CPU: 0 > EIP: 0060:[<c021ca95>] Not tainted VLI > EFLAGS: 00010202 (2.6.17.9 #23) > EIP is at find_next_zero_bit+0x35/0xb0 > eax: 000000bc ebx: c0522c20 ecx: 00000013 edx: ffffffff > esi: 00000000 edi: 000002f0 ebp: 00038000 esp: c17ffef8 > ds: 007b es: 007b ss: 0068 > Process swapper (pid: 1, threadinfo=c17fe000 task=dfbdfa10) > Stack: 00000000 c0522c20 00000000 01000000 00038000 c04e2894 00000000 > 00038000 > 00001793 00000000 ffffffff 00000000 ffffff80 00000246 00000013 > 00000001 > 00001793 00000000 00000001 c0522c20 01000000 00000080 00001000 > c04e2c84 > Call Trace: > <c04e2894> __alloc_bootmem_core+0xe4/0x3a0 <c04e2c84> > __alloc_bootmem_nopanic+0x64/0x80 > <c04e2cc0> __alloc_bootmem+0x20/0x50 <c04eb5cb> > universeII_init+0x2b/0x40 > <c0100423> init+0x123/0x330 <c0102eea> ret_from_fork+0x6/0x14 > <c0100300> init+0x0/0x330 <c0100300> init+0x0/0x330 > <c0100e35> kernel_thread_helper+0x5/0x10 > Code: 20 89 74 24 08 8b 74 24 18 89 7c 24 0c c1 f8 05 83 e1 1f 89 6c 24 > 10 8d 3c 86 8b 6c 24 1c 89 5c 24 04 c7 04 24 00 00 00 00 74 22 <8b> 07 > c7 04 24 20 00 00 00 29 0c 24 d3 e8 f7 d0 0f bc c0 75 05 > EIP: [<c021ca95>] find_next_zero_bit+0x35/0xb0 SS:ESP 0068:c17ffef8 > > ======================================================================== > ========= > > The offending code: > > ======================================================================== > ========= > > static int __init universeII_init(void) > { > void* buffer; > > printk(KERN_INFO "Loading driver.\n"); > > buffer = alloc_bootmem(PAGE_SIZE); > > return 0; > } I hope you do understand you're leaking memory over here. > ======================================================================== > ========= > > I am using: > > kernel version 2.6.17.9 If you're not trying to allocate from a module, you might want to update your kernel to 2.6.20 and see if you can recreate the Oops. Erik -- They're all fools. Don't worry. Darwin may be slow, but he'll eventually get them. -- Matthew Lammers in alt.sysadmin.recovery
Attachment:
signature.asc
Description: Digital signature