Hi everybody,
I'm writing a Linux driver for a USB Video Class compliant USB device. I manage to understand pretty much everything on my own until the point where I have to allocate video buffers.
I read other drivers to understand how they proceed. Most of them used vmalloc with SetPageReserved and remap_pfn_range to map the memory to user space. I thought I understood that, when I noticed that vm_insert_page has been added in 2.6.15. I wasn't sure how to prevent pages from being swapped out, so I read the excellent "Understanding the Linux Virtual Memory Manager", but I'm still not sure to understand everything. This is where I ask for your help.
I need to allocate big buffers, so vmalloc is the way to go, as I don't need contiguous memory. I need to map those buffers to user space, and I understand that vm_insert_page will do the job nicely. My fears come from pages being swapped out. I suppose I need to prevent that, as a page fault in interrupt is a Bad Thing(TM). I'm not sure how PG_reserved and VM_RESERVED interract with eachother. Can kernel pages be swapped out if they are not mapped to user space ? Or does kswapd only walk VMAs when it tries to find pages that will be swapped out ? If the later is true, is it enough to set VM_RESERVED on the VMA in the mmap handler ?