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