On Fri, Nov 1, 2013 at 12:17 PM, neha naik <[email protected]> wrote:
> Hi Rajat, > Thanks for the information. One more question : > Say my block device driver doesn't support reads and the > application always does aligned io in 512 chunks (but it is not direct > io). In that case, will i get a read because the page size is 4096 and > yet we are writing 512. Because i am not getting any read which is why > i am confused.I have been doing the io after syncing the page cache so > it is not like i get a pagecache hit every time. > sync does not evict page cache. And is your block device sector size declared as 512 ? > I am doing a normal dd without any special flags, just 'bs=512'. > > Regards, > Neha > > > On Fri, Nov 1, 2013 at 12:16 PM, Rajat Sharma <[email protected]> wrote: > > Hi Neha, > > > > > > On Fri, Nov 1, 2013 at 10:26 AM, neha naik <[email protected]> wrote: > >> > >> Hi, > >> I am writing a block device driver and i am using the > >> 'blq_queue_make_request' call while registering my block device > >> driver. > >> Now as far as i understand this will bypass the linux kernel queue > >> for each block device driver (bypassing the elevator algorithm etc). > >> However, i am still not very clear about exactly how i get a request. > >> > >> 1. Consider i am doing a dd on the block device directly : > >> Will it bypass the buffer cache(/page cache) or will it use it. > >> Example if i register my block device with set_blocksize() as 512. And > >> i do a dd of 512 bytes will i get a read because it passes through the > >> buffer cache and since the minimum page size is 4096 it has to read > >> the page first and then pass it to me. > >> I am still unclear about the 'page' in the bvec. What does that > >> refer to? Is it a page from the page cache or a user buffer (DMA). > >> > > > > If you are not using oflag=direct with dd, then you are getting 'page' in > > bvec that belongs to buffer cache (in 2.6 it is implemented as > page-cache of > > block_device->bd_inode->i_mapping). You get user buffer only with direct > IO, > > but then you need to take care to issue aligned IO requests yourself (if > > your block device wants only aligned buffers its your implementation > > though). > > > >> > >> 2. Another thing i am not clear about is a queue. When i register my > >> driver, the 'make_request' function gets called whenever there is an > >> io. Now in my device driver, i have some more logic about writing > >> this io i.e some time may be spent in the device driver for each io. > >> In such a case, if i get two ios on the same block one after the other > >> (say one is writing 'a' and the other is writing 'b') then isn't it > >> possible that i may end up passing 'b' followed by 'a' to the layer > >> below me (changing the order because thread 'a' took more time than > >> thread 'b'). Then in that case should i be using a queue in my layer - > >> put the ios in the queue whenever i get a call to 'make_request'. > >> Another thread keeps pulling the ios from the queue and processing > >> them and passing it to the layer below. > >> > > > > If your application does not quarantee the ordering of writes, then you > > don't have to worry either. Most likely block layer will do the merges in > > page-cache if it is not a direct IO. As a driver developer, you don't > need > > to worry about out of order writes from application. > > > >> > >> > >> Regards, > >> Neha > >> > >> _______________________________________________ > >> Kernelnewbies mailing list > >> [email protected] > >> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies > > > > >
_______________________________________________ Kernelnewbies mailing list [email protected] http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
