<p dir="ltr"><br>
On 29-Jul-2014 5:54 PM, &quot;Anh Le&quot; &lt;<a href="mailto:anhlq2110@gmail.com">anhlq2110@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt; Thanks, Jonathan, for the quick reply.<br>
&gt;<br>
&gt; On Tue, Jul 29, 2014 at 3:36 PM, Jonathan Neuschäfer<br>
&gt; &lt;<a href="mailto:j.neuschaefer@gmx.net">j.neuschaefer@gmx.net</a>&gt; wrote:<br>
&gt; &gt; Which &quot;write operation&quot; is called twice in your scenario?<br>
&gt;<br>
&gt; It&#39;s the &quot;write&quot; method of the &quot;struct file_operations&quot; structure. I<br>
&gt; define it like this (no synchronizatin yet):<br>
&gt; static ssize_t sample_write(struct file *f, const char __user *buf,<br>
&gt; size_t len, loff_t *ppos)<br>
&gt; {<br>
&gt;         printk(KERN_DEBUG &quot;[sample] buf len: %u, *ppos: %u\n&quot;, len, *ppos);<br>
&gt;         return simple_write_to_buffer(kbuf, 2048, ppos, buf, len);<br>
&gt; }<br>
&gt;<br>
&gt; &gt; If a userspace program writes 1000 bytes at first, how can you know that<br>
&gt; &gt; it wants to perform another write later on?<br>
&gt;<br>
&gt; I use printk to debug the module. More details in the answer below.<br>
&gt;<br>
&gt; &gt; If a userspace program wants to write a chunk of data atomically, it<br>
&gt; &gt; should use just one call to write(2). (On Linux, one can save some<br>
&gt; &gt; copying by using writev(2), which writes data from multiple buffers in<br>
&gt; &gt; one atomic step.)<br>
&gt;<br>
&gt; I tried the following command: echo $(perl -e &quot;print &#39;a&#39;x2000&quot;) &gt; /dev/sample<br>
&gt; and get the following messages from dmesg:<br>
&gt; [30884.066433] [sample] buf len: 1008, *ppos: 0<br>
&gt; [30884.066451] [sample] buf len: 993, *ppos: 1008<br>
&gt;<br>
&gt; So as I understand my 2001 bytes has been split into 2 chunks, the</p>
<p dir="ltr">Who do you think did this split? I would say write a simple program and do only a single write syscall for your buffer size. Just see if that split happens again.</p>
<p dir="ltr">&gt; first one with 1008 bytes and the second one with 993 bytes, and<br>
&gt; therefore the write operation is called 2 times to consume the whole<br>
&gt; input.<br>
&gt;<br>
&gt; --<br>
&gt; Le Quoc Anh<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; Kernelnewbies mailing list<br>
&gt; <a href="mailto:Kernelnewbies@kernelnewbies.org">Kernelnewbies@kernelnewbies.org</a><br>
&gt; <a href="http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies">http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies</a><br>
</p>