Re: [LTP] mmap syscall problem

Michal Simek
2009-07-06T14:43:54Z

Arnd Bergmann wrote:
> On Monday 06 July 2009, Michal Simek wrote:
>
>>> Not necessarily, even on platforms that manage aliases in hardware
>>> mappings that violate the aliasing constraints can still result in
>>> undefined behaviour, this really depends more on your cache controller
>>> and MMU than anything else. I notice that microblaze sets SHMLBA to
>>> PAGE_SIZE, you may want to see if this test still breaks after bumping it
>>> up to something like PAGE_SIZE * 4.
>>>
>>>
>> Yes, test still break - behavior is the same. I don't have accurate
>> information about MMU unit
>> but I will ask a question about. We are able to turn off cache
>> controller directly in HW.
>>
>
> There may still be a problem with data being queued in some write
> buffers that don't get flushed before reading back from another
> address.
>
> What happens in a simple user space program that mmaps the same
> page to two addresses? Something like
>
> #include <sys/mman.h>
> #include <fcntl.h>
> int main(void)
> {
> int fd = open("existing-4k-file", O_RDWR);
> char *p1 = mmap(0, 4096, PROT_READ | PROT_WRITE,
> MAP_SHARED, fd, 0);
> char *p2 = mmap(p1 + 4096, 4096, PROT_READ | PROT_WRITE,
> MAP_SHARED | MAP_FIXED, fd, 0);
>
> *p1 = 0xaa; *p2 = 0x55;
>
I closed fd too.
close(fd);
> return *p1; /* returns 0xaa if broken, 0x55 if correct */
> }
>
# ls -la existing-4k-file
-rw-rw-r-- 1 monstr monstr 4096 Jul 6 2009 existing-4k-file

# ./test-arnd
# echo $?
85
# dd if=existing-4k-file of=/dev/console count=1 2>/dev/null
U#

in file is first char U (0x55) which is IMO correct.

Michal

> Arnd <><