<p dir="ltr"><br>
On 29-Jul-2014 1:34 PM, &quot;Anh Le&quot; &lt;<a href="mailto:anhlq2110@gmail.com">anhlq2110@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt; Hi everyone,<br>
&gt; I&#39;m trying to write a misc char driver with read and write operations,<br>
&gt; and I choose reader writer lock for synchronization between them.<br>
&gt; Suppose that when writing 2000 bytes, the write operation is called<br>
&gt; twice, each time writing only 1000 bytes. There are 2 ways to<br>
&gt; implement synchronization as below:</p>
<p dir="ltr">Your application is doing 2 writes as I understand. So let&#39;s say if only your process is the only one writing do you need locking?</p>
<p dir="ltr">&gt; 1. Acquire and release lock everytime the write operation is called.<br>
&gt; Same with read operation.<br>
&gt; 2. Acquire the lock when the write operation is called for the first<br>
&gt; time, and release when the whole write procedure is completed. In this<br>
&gt; case, the lock is acquired before transfering the 1st byte, and<br>
&gt; released after transfering the 2000th byte. Same with read operation.<br>
&gt;<br>
How about doing page flipping here? Your locking will be for shorter duration for reads.</p>
<p dir="ltr">See your read/write as one operation no matter how many bytes. You are synchronizing for different processes.</p>
<p dir="ltr">&gt; As how I see it, both of these approaches have problems. The first one<br>
&gt; release the lock in between the write operations, so a reader can get<br>
&gt; in while the writer has only finished a portion of its work. With the<br>
&gt; second approach, I have no way to tell that the write procedure ends</p>
<p dir="ltr">One read / write thats it. You make promise at kernel level that you wont give false data on reads and wont allow parallel write op. Thats all. </p>
<p dir="ltr">How applications honor who goes first is upto them. Say 4 processes writing on same file no synchronization at user space level is gonna screw data even when you made a good enough promise that write op wont be in parallel. The syncing is at 2 places not only kernel.<br>
</p>
<p dir="ltr">&gt; with the 2000th byte. What if there are more?<br>
&gt;<br>
&gt; Could anyone tell me the proper way to deal with this situation?<br>
&gt; Thanks in advance.</p>
<p dir="ltr">Just make a good enough promise that data reads would be valid and that writes wont be screwed up.</p>
<p dir="ltr">If applications are not good citizens then kernel cant do anything except keep its own promises.</p>
<p dir="ltr">&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>