OK, I will look into this. Is it OK to block vm_fault?
I have another question. In my userspace program, I mmap() my device, then read something, then munmap() my device() and then mmap() my device again. The program do this in a loop. Everytime it mmap() the same address and offset.
My device maintains a list of pages. In vm_operations fault, I just map the address to the head of the list. And in vm_operations close, I just delete the head from the list and free the page.
Everything seems to be OK except that after I call the munmap() in the program, there is an error message. The error seems to happens between the call of vm_operations fault and vm_operations close. I have posted this question before (
See this ).
[42522.596689] logger_mmap():start:7f8ff57be000, end:7f8ff57bf000
//this is the mmap() function of my device module
[42522.596694] logger_vma_fault():vmf->pgoff:0d,start:7f8ff57be000,pgoff:0,offset:0
//this is the fault function of struct vm_operations_struct
[42522.596729] BUG: Bad page map in process logger_pro
pte:8000000612a30025 pmd:314175067 //this is the error
[42522.596740] page:ffffea00184a8c00 count:2 mapcount:-2146959356
mapping: (null) index:0xffff880612a36000
[42522.596747] page flags: 0x200000000004080(slab|head)
[42522.596811] addr:00007f8ff57be000 vm_flags:04040071 anon_vma:
(null) mapping:ffff880613b25f08 index:0
[42522.596824] vma->vm_ops->fault: logger_vma_fault+0x0/0x140 [logger]
[42522.596834] vma->vm_file->f_op->mmap: logger_mmap+0x0/0xd50 [logger]
[42522.596842] CPU: 1 PID: 21571 Comm: logger_pro Tainted: G B
IO 3.11.0+ #1
[42522.596844] Hardware name: Dell Inc. PowerEdge M610/000HYJ, BIOS
2.0.13 04/06/2010
[42522.596846] 00007f8ff57be000 ffff880314199c98 ffffffff816ad166
0000000000006959
[42522.596851] ffff880314539a98 ffff880314199ce8 ffffffff8114e270
ffffea00184a8c00
[42522.596854] 0000000000000000 ffff880314199cc8 00007f8ff57be000
ffff880314199e18
[42522.596858] Call Trace:
[42522.596867] [<ffffffff816ad166>] dump_stack+0x46/0x58
[42522.596872] [<ffffffff8114e270>] print_bad_pte+0x190/0x250
[42522.596877] [<ffffffff8115027b>] unmap_single_vma+0x6cb/0x7a0
[42522.596880] [<ffffffff81150bd4>] unmap_vmas+0x54/0xa0
[42522.596885] [<ffffffff81155aa7>] unmap_region+0xa7/0x110
[42522.596888] [<ffffffff81157f97>] do_munmap+0x1f7/0x3e0
[42522.596891] [<ffffffff811581ce>] vm_munmap+0x4e/0x70
[42522.596904] [<ffffffff811591bb>] SyS_munmap+0x2b/0x40
[42522.596915] [<ffffffff816bc9c2>] system_call_fastpath+0x16/0x1b
[42522.596920] logger_vma_close():start:7f8ff57be000,
end:7f8ff57bf000, vmas:0 //this is the close function of struct vm_operations_struct
So do you have any idea about this error?
Thanks very much!