MPC8260 strange virtual addresses returned by kmalloc()

Eugene Surovegin ebs at ebshome.net
Fri Jan 7 05:59:37 EST 2005


On Thu, Jan 06, 2005 at 06:42:50PM +0100, Laurent Lagrange wrote:
> My PAGE_OFFSET is defined as follow :
> #define PAGE_OFFSET  CONFIG_KERNEL_START     in
> ./linux/include/asm-ppc/page.h
> #define CONFIG_KERNEL_START (0xc0000000)     in
> ./linux/include/linux/autoconf.h
> 
> After reading kmalloc manual pages, I am in doubt.
> My call is like
> if ((tmpbuffer = kmalloc(128 * 1024, GFP_KERNEL)) == NULL){
>     return(1);
> }
> 
> This is the first time, I kmallocate a 128KB buffer which seems to be the
> max
> contiguous memory space which can be allocated.
> Is it true on PPC ? Some PPC drivers seems to only allocate multiple
> PAGE_SIZE (4KB) buffers.

kmalloc implementation isn't PPC specific. It's the same code for 
every arch.

Regardless, if kmalloc cannot allocate amount of memory you have 
requested, it'll return NULL and you must handle this gracefully. 

kmalloc _always_ allocate physically continuous pages. That's why 
trying to allocate 128K is bad idea, because it's more likely to fail.

> My allocated buffer is intended to be used for DMA accesses.
> Must I add the GFP_DMA flag to force the kmalloc to use contiguous memory ?

You need to use this flag to get DMA memory, although on PPC usually 
all RAM is available for DMA.

> > The Linux code for vmalloc is based on successive kmalloc calls, but I don't
> know
> what the kmalloc do when the desired size is greater than the PAGE_SIZE.

That's not correct. vmalloc uses kmalloc only to allocate vm_struct. 
Actual memory is allocated using alloc_page and then this page is 
mapped by installing PTE into the kernel page table.

> What is the right way to allocate big (128KB ???) DMA buffers ?
> The manual pages say "Only for DMA kmalloc or __get_dma_pages() has to be
> used"

Generally for PAGE_SIZE * n allocations it's more efficient to use 
__get_free_pages and friends. But kmalloc should also be OK. The only 
limitation is the maximum size of such allocations, but you already 
know this.

> The global variable is well in the loaded module.
> OK, I use a kmalloc for the buffer instead of using the global variable.

Memory for DMA should always be allocated using specially designed 
functions. Don't use stack or static storage unless you know what you 
are doing :).

--
Eugene



More information about the Linuxppc-embedded mailing list