Re: memory allocation issue loading a kernel module

From: Maxime Henrion <mux_at_freebsd.org>
Date: Tue, 25 Nov 2003 09:13:50 +0100
Sean McNeil wrote:
> Hi everyone,
> 
> I was wondering if there is a way to flush out pages in memory that
> might not be required.  I have a device driver that allocates 16 distict
> buffers each 32K in size.  This is done with a bus_dma call as they will
> be accessed by a PCI device.  The problem is that if I do a compile on
> my system prior to trying to kldload the module, there isn't enough
> physical memory for the driver.  I am assuming it is the disk cache that
> is eating up that memory and I want to flush out enough pages for my
> bus_dma allocation to work.
> 
> Is this possible?  Any and all comments are appreciated.

The problem has probably nothing to do with the disk cache eating up
memory but I believe what you're seeing is physical address space
fragmentation.  On x86, when devices want to perform DMA operations,
they are given physical addresses, not virtual ones as with other
architectures like sparc64 which have an IOMMU.  This means that for
each of your 32k buffers, you need 8 _physically contiguous_ pages of
memory.

Unfortunately, the more a system is running, the more the physical
address space tends to be fragmented, and it becomes impossible to
reserve large chunks of physically contiguous memory, hence why the
kldload is failing.

If I remember correctly, Alan Cox intended to write a binary buddy
allocator to handle the physical address space (or do coalescing another
way, I'm not sure...) so that this particular problem is solved.

Cheers,
Maxime
Received on Mon Nov 24 2003 - 23:13:51 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:37:30 UTC