<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Nov 1, 2013 at 12:17 PM, neha naik <span dir="ltr">&lt;<a href="mailto:nehanaik27@gmail.com" target="_blank">nehanaik27@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">Hi Rajat,<br>
 Thanks for the information. One more question :<br>
   Say my block device driver doesn&#39;t support reads and the<br>
application always does aligned io in 512 chunks (but it is not direct<br>
io). In that case, will i get a read because the page size is 4096 and<br>
yet we are writing 512. Because i am not getting any read which is why<br>
i am confused.I have been doing the io after syncing the page cache so<br>
it is not like i get a pagecache hit every time.<br></blockquote><div><br></div><div>sync does not evict page cache. And is your block device sector size declared as 512 ?<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

  I am doing a normal dd without any special flags, just &#39;bs=512&#39;.<br>
<br>
Regards,<br>
Neha<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
On Fri, Nov 1, 2013 at 12:16 PM, Rajat Sharma &lt;<a href="mailto:fs.rajat@gmail.com">fs.rajat@gmail.com</a>&gt; wrote:<br>
&gt; Hi Neha,<br>
&gt;<br>
&gt;<br>
&gt; On Fri, Nov 1, 2013 at 10:26 AM, neha naik &lt;<a href="mailto:nehanaik27@gmail.com">nehanaik27@gmail.com</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; Hi,<br>
&gt;&gt;   I am writing a block device driver and i am using the<br>
&gt;&gt; &#39;blq_queue_make_request&#39; call while registering my block device<br>
&gt;&gt; driver.<br>
&gt;&gt;   Now as far as i understand this will bypass the linux kernel queue<br>
&gt;&gt; for each block device driver (bypassing the elevator algorithm etc).<br>
&gt;&gt; However, i am still not very clear about exactly how i get a request.<br>
&gt;&gt;<br>
&gt;&gt;  1.  Consider i am doing a dd on the block device directly :<br>
&gt;&gt;   Will it bypass the buffer cache(/page cache) or will it use it.<br>
&gt;&gt; Example if i register my block device with set_blocksize() as 512. And<br>
&gt;&gt; i do a dd of 512 bytes will i get a read because it passes through the<br>
&gt;&gt; buffer cache and since the minimum page size is 4096 it has to read<br>
&gt;&gt; the page first and then pass it to me.<br>
&gt;&gt;     I am still unclear about the &#39;page&#39; in the bvec. What does that<br>
&gt;&gt; refer to? Is it a page from the page cache or a user buffer (DMA).<br>
&gt;&gt;<br>
&gt;<br>
&gt; If you are not using oflag=direct with dd, then you are getting &#39;page&#39; in<br>
&gt; bvec that belongs to buffer cache (in 2.6 it is implemented as page-cache of<br>
&gt; block_device-&gt;bd_inode-&gt;i_mapping). You get user buffer only with direct IO,<br>
&gt; but then you need to take care to issue aligned IO requests yourself (if<br>
&gt; your block device wants only aligned buffers its your implementation<br>
&gt; though).<br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt; 2. Another thing i am not clear about is a queue. When i register my<br>
&gt;&gt; driver, the &#39;make_request&#39; function gets called whenever there is an<br>
&gt;&gt; io. Now in my device driver, i have some more logic about  writing<br>
&gt;&gt; this io i.e some time may be spent in the device driver for each io.<br>
&gt;&gt; In such a case, if i get two ios on the same block one after the other<br>
&gt;&gt; (say one is writing &#39;a&#39; and the other is writing &#39;b&#39;) then isn&#39;t it<br>
&gt;&gt; possible that i may end up passing &#39;b&#39; followed by &#39;a&#39; to the layer<br>
&gt;&gt; below me (changing the order because thread &#39;a&#39; took more time than<br>
&gt;&gt; thread &#39;b&#39;). Then in that case should i be using a queue in my layer -<br>
&gt;&gt; put the ios in the queue whenever i get a call to &#39;make_request&#39;.<br>
&gt;&gt; Another thread keeps pulling the ios from the queue and processing<br>
&gt;&gt; them and passing it to the layer below.<br>
&gt;&gt;<br>
&gt;<br>
&gt; If your application does not quarantee the ordering of writes, then you<br>
&gt; don&#39;t have to worry either. Most likely block layer will do the merges in<br>
&gt; page-cache if it is not a direct IO. As a driver developer, you don&#39;t need<br>
&gt; to worry about out of order writes from application.<br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; Regards,<br>
&gt;&gt; Neha<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></div>