Why do you need to block in mmap()? mmap is supposed to create a mapping area in virtual address space for the process. Actual transfer happens later through page fault handlers on demand basis. look at vm_operations fault/readpage etc methods, these might be the places you want to wait for the data.
On Wed, Feb 26, 2014 at 4:14 PM, Le Tan <tamlokv...@gmail.com> wrote: > So what should I do if I want the mmap() not to return right now? Is > it strange to block in mmap() and few people will do this? Thanks for > your help! > > 2014-02-27 4:45 GMT+08:00 Rajat Sharma <fs.ra...@gmail.com>: > > It seems this task "landscape-sysin" is trying to peek into virtual > memory > > of your processes and the process within mmap call is holding its > > mm->mmap_sem semaphore which grants access to its address space. > > landscape-sysin is trying to grab this semaphore to poke into address > space > > of your mmap process address space. As from your description, it might be > > invoked everytime you are opening a new shell. Not sure why this process > > bother's about other process address space. Little googling shows this as > > relevant to your case: > > > > > http://www.techques.com/question/2-66765/Disable-usage-of-console-kit-daemon-in-Ubuntu > > > > Your read process is innocent and not involved in this deadlock. > > > > -Rajat > > > > > > On Wed, Feb 26, 2014 at 4:13 AM, Le Tan <tamlokv...@gmail.com> wrote: > >> > >> Hi, I am writing a driver module. Now I have some questions about > blocked > >> I/O. > >> my_read() is the read function in the file_operations struct in my > >> module. my_read() is just as simple as this: > >> ssize_t my_read(....) > >> { > >> if(wait_event_interruptible(dev->queue, a == b)) > >> return -ERESTARTSYS; > >> return count; > >> } > >> Then I write a simple program to open and read the device. Obviously > >> the program will be blocked. Now I still can open a new shell window > >> and log in ( I use xshell). > >> > >> However, then I implement my_mmap(), the mmap function in the > >> file_operations struct in my module, like this: > >> int my_mmap(....) > >> { > >> if(wait_event_interruptible(dev->queue, a == b)) > >> return -ERESTARTSYS; > >> return 0; > >> } > >> Then I write a simple program to open and mmap() the device. Obviously > >> the program will be blocked again. However, when I open a new shell > >> window in xshell and try to connect to the linux, it displays like > >> this: > >> > >> Connecting to 192.168.146.118:22... > >> Connection established. > >> To escape to local shell, press 'Ctrl+Alt+]'. > >> > >> And I can't log in! Then after a while, in the syslog, there is one > >> message like this: > >> [38306.614103] INFO: task landscape-sysin:17616 blocked for more than > >> 120 seconds. > >> [38306.614114] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" > >> disables this message. > >> [38306.614120] landscape-sysin D ffffffff8180fb60 0 17616 17609 > >> 0x00000000 > >> [38306.614125] ffff88031d609c90 0000000000000082 ffff88032fffdb08 > >> 0000000000000000 > >> [38306.614130] ffff8803130bdc40 ffff88031d609fd8 ffff88031d609fd8 > >> ffff88031d609fd8 > >> [38306.614133] ffff88062150c530 ffff8803130bdc40 0000004100000000 > >> ffff8803130bdc40 > >> [38306.614137] Call Trace: > >> [38306.614147] [<ffffffff816b2c49>] schedule+0x29/0x70 > >> [38306.614151] [<ffffffff816b3acd>] rwsem_down_read_failed+0x9d/0xf0 > >> [38306.614157] [<ffffffff81341824>] > call_rwsem_down_read_failed+0x14/0x30 > >> [38306.614160] [<ffffffff816b1644>] ? down_read+0x24/0x2b > >> [38306.614166] [<ffffffff81153661>] __access_remote_vm+0x41/0x1f0 > >> [38306.614170] [<ffffffff81153ddb>] access_process_vm+0x5b/0x80 > >> [38306.614175] [<ffffffff811ea423>] proc_pid_cmdline+0x93/0x120 > >> [38306.614178] [<ffffffff811eb425>] proc_info_read+0xa5/0xf0 > >> [38306.614182] [<ffffffff81186e84>] vfs_read+0xb4/0x180 > >> [38306.614185] [<ffffffff81187102>] SyS_read+0x52/0xa0 > >> [38306.614189] [<ffffffff816bc8c2>] system_call_fastpath+0x16/0x1b > >> > >> If I terminate the program by force, then I can log in right now. > >> So, are there any differences between the read and the mmap function > >> to the wait_event_interruptible()? Why? If I want to block mmap() just > >> like blocking read(), what should I do? Or it is impossible? > >> Thanks! > >> > >> _______________________________________________ > >> Kernelnewbies mailing list > >> Kernelnewbies@kernelnewbies.org > >> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies > > > > >
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies