My guess there was a bug in your DMA mapping code. I don't think kmap is what is normally used for this. I think with get_user_pages one usually takes the returned page pointers to create an SG list and uses dma_map_sg to create a DMA mapping for them.
Looking at the actual code, I see that I had used kmap() only to obtain
kernel virtual addresses for the array of struct pages obtained from
user space by using get_user_pages.
Subsequently, I had used dma_map_single() and dma_unmap_single() calls
for single buffer calls.
The code didn't have bugs IMHO since it was used for extensive stress
testing the initial FPGA prototype as well as the final ASIC chip ,
sometimes running for over 4 days non-stop without breaking.
However, using Test Access Points on the board and using a Logic
Analyzer showed that DMA was NOT taking place when RAM > 896 MB was
used. The hardware gurus said that PCI bus cycles just didn't seem to be
taking place when RAM > 896 MB was used as the source OR destination
address.
--
Perhaps this was a problem in the earlier kernel(s) and has since been
rectified ? ( I was using 2.6.15 then ... )
I am just curious since Sanka Piyaratna reported a 'similar' kind of
situation.
Regards
V. Radhakrishnan