mmap'd physical memory not updating user virtual

I am writing a user space MAC driver in Linux 2.6.23 hosted on a Arm11 mpcore. A contiguous block of physical memory is allocated and mmap'd to userspace.

/dev/mem with O_SYNC flag is used to mmap so that the user virtual memory is uncached (with no much benefit).

kptr = kmalloc(sz, GFP_DMA|GFP_KERNEL);
pptr = __pa(kptr);

fd = open("/dev/mem", O_RDWR|O_SYNC);
uptr = mmap(0, sz, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_LOCKED,fd, pptr);

The map'd user virtual memory is carved into network buffers and used for DMA.The MAC is successfully able to DMA ethernet frames to the physical memory. From the Rx interrupt handler bh (kernel logical memory) the frames received could be viewed and the cache functions also work fine. However, the mmap'd memory in user space does not reflect the changes.

Why is the physical memory mapped to user virtual does not reflect the chages ?

Or any suggestions on what could be going wrong here ?

Deb Rupam Banerjee

P.S: Please note that all buffer alignment's are taken care of.

Hi Deb, How did you solve

dono8's picture

Hi Deb,

How did you solve this issue? I am also facing similar problem with ARM9. I have reserved 4M Bytes of memory at boot time, for using with the DMA and using the following code:

#define DMAMEM_START 0x73C00000

dma_fd = open("/dev/mem", O_RDWR | O_SYNC);

DMA_write(DMAMEM_START, INST_Add, 16);
err = msync(dma_mem, (size_t) 64, MS_SYNC | MS_INVALIDATE);
DMA_read(INST_Add, DMAMEM_START+32, 16);

Using DMA_READ, I can see the data at DMAMEM_START, but sometime it is correct sometime incorrect.

I appreciate your step by step help!



debrupam's picture


Thanks for your comments. I was able to solve the problem as follows:

I was using the cache (flush/inv) routines used on the kernel logical address and was able to see the DMA'd data. The same idea I used for the user virtual mapping and the DMA'd data was visible in the user space mapping.



Mitch Frazier's picture

Presumably mmap() is returning a valid pointer, correct? And you're not seeing any other errors occur, correct? You just never see the data change in the mapped area.

Does your kernel have CONFIG_STRICT_DEVMEM enabled?

Mitch Frazier is an Associate Editor for Linux Journal.

One Click, Universal Protection: Implementing Centralized Security Policies on Linux Systems

As Linux continues to play an ever increasing role in corporate data centers and institutions, ensuring the integrity and protection of these systems must be a priority. With 60% of the world's websites and an increasing share of organization's mission-critical workloads running on Linux, failing to stop malware and other advanced threats on Linux can increasingly impact an organization's reputation and bottom line.

Learn More

Sponsored by Bit9

Linux Backup and Recovery Webinar

Most companies incorporate backup procedures for critical data, which can be restored quickly if a loss occurs. However, fewer companies are prepared for catastrophic system failures, in which they lose all data, the entire operating system, applications, settings, patches and more, reducing their system(s) to “bare metal.” After all, before data can be restored to a system, there must be a system to restore it to.

In this one hour webinar, learn how to enhance your existing backup strategies for better disaster recovery preparedness using Storix System Backup Administrator (SBAdmin), a highly flexible bare-metal recovery solution for UNIX and Linux systems.

Learn More

Sponsored by Storix