Doubt regarding BIO handling
Hi all, I have a doubt regarding the handling of bios. Suppose I receive a bio at some layer, and I want to split it into multiple bios. There are layers below the one I am working on and the final I/O operations will be handled by those layers. So, basically , after some processing, I want to hand over the bio to the lower layer. Now, if I have split the original bio into multiple bios and submitted all the newly formed bios, I shall receive each such bio in the bio->bio_end_io function. Here is it necessary to merge these bios so that the original bio can be formed or is it ok to just split the original bio, receive the requested data in multiple bios and leave it at that ? Looking forward to some help..... Regards, Gaurav
Hi Gaurav, I think you can find something similar in md/dm code for RAID stripping. Rajat On Mon, Dec 27, 2010 at 11:31 AM, Gaurav Mahajan <gauravmahajan2007@gmail.com> wrote:
Hi all,
I have a doubt regarding the handling of bios.
Suppose I receive a bio at some layer, and I want to split it into multiple bios. There are layers below the one I am working on and the final I/O operations will be handled by those layers. So, basically , after some processing, I want to hand over the bio to the lower layer. Now, if I have split the original bio into multiple bios and submitted all the newly formed bios, I shall receive each such bio in the bio->bio_end_io function.
Here is it necessary to merge these bios so that the original bio can be formed or is it ok to just split the original bio, receive the requested data in multiple bios and leave it at that ?
Looking forward to some help.....
Regards, Gaurav
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
On Mon, Dec 27, 2010 at 6:01 AM, Gaurav Mahajan <gauravmahajan2007@gmail.com> wrote:
Hi all,
I have a doubt regarding the handling of bios.
Suppose I receive a bio at some layer, and I want to split it into multiple bios. There are layers below the one I am working on and the final I/O operations will be handled by those layers. So, basically , after some processing, I want to hand over the bio to the lower layer. Now, if I have split the original bio into multiple bios and submitted all the newly formed bios, I shall receive each such bio in the bio->bio_end_io function.
Here is it necessary to merge these bios so that the original bio can be formed or is it ok to just split the original bio, receive the requested data in multiple bios and leave it at that ?
IMHO, you still need to call bio->bio_end_io on the original BIO structure. So instead of splitting the original BIO. I think, You might want to keep the original BIO as it is. The smaller BIOs need to point back to original BIO and once all of the smaller BIOs have been serviced. You might want to call bio_end_io() on the original BIO. Have a look if you can use bi_private field.
Looking forward to some help.....
Regards, Gaurav
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
Hello all, Thanks for the information!!! On Mon, Dec 27, 2010 at 2:37 PM, Prasad Joshi <prasadjoshi124@gmail.com> wrote:
On Mon, Dec 27, 2010 at 6:01 AM, Gaurav Mahajan <gauravmahajan2007@gmail.com> wrote:
Hi all,
I have a doubt regarding the handling of bios.
Suppose I receive a bio at some layer, and I want to split it into multiple bios. There are layers below the one I am working on and the final I/O operations will be handled by those layers. So, basically , after some processing, I want to hand over the bio to the lower layer. Now, if I have split the original bio into multiple bios and submitted all the newly formed bios, I shall receive each such bio in the bio->bio_end_io function.
Here is it necessary to merge these bios so that the original bio can be formed or is it ok to just split the original bio, receive the requested data in multiple bios and leave it at that ?
IMHO, you still need to call bio->bio_end_io on the original BIO structure. So instead of splitting the original BIO. I think, You might want to keep the original BIO as it is. The smaller BIOs need to point back to original BIO and once all of the smaller BIOs have been serviced. You might want to call bio_end_io() on the original BIO.
I think the method of pointing back to original bio, you wrote here is about managing bi_idx fields of the split bios and keeping bio_vec array same for all. Can you please elaborate on this, if I'm wrong? Also I wanted to split one bvec into two bvecs. So I tried to split it using bvec's length and offset fields, but I am facing problem in merging these split bvecs in one. Or there is some other way I can do this? I am doubtful whether the pages are allocated for a bio when "read" is requested or when the actual data is read from disk (at the layer of I/O scheduler or device driver)?
Have a look if you can use bi_private field.
Looking forward to some help.....
Regards, Gaurav
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
Thanks, Gaurav.
On Mon, Dec 27, 2010 at 7:18 PM, Gaurav Mahajan <gauravmahajan2007@gmail.com> wrote:
Hello all,
Thanks for the information!!!
On Mon, Dec 27, 2010 at 2:37 PM, Prasad Joshi <prasadjoshi124@gmail.com> wrote:
On Mon, Dec 27, 2010 at 6:01 AM, Gaurav Mahajan <gauravmahajan2007@gmail.com> wrote:
Hi all,
I have a doubt regarding the handling of bios.
Suppose I receive a bio at some layer, and I want to split it into multiple bios. There are layers below the one I am working on and the final I/O operations will be handled by those layers. So, basically , after some processing, I want to hand over the bio to the lower layer. Now, if I have split the original bio into multiple bios and submitted all the newly formed bios, I shall receive each such bio in the bio->bio_end_io function.
Here is it necessary to merge these bios so that the original bio can be formed or is it ok to just split the original bio, receive the requested data in multiple bios and leave it at that ?
IMHO, you still need to call bio->bio_end_io on the original BIO structure. So instead of splitting the original BIO. I think, You might want to keep the original BIO as it is. The smaller BIOs need to point back to original BIO and once all of the smaller BIOs have been serviced. You might want to call bio_end_io() on the original BIO.
I think the method of pointing back to original bio, you wrote here is about managing bi_idx fields of the split bios and keeping bio_vec array same for all. Can you please elaborate on this, if I'm wrong?
Also I wanted to split one bvec into two bvecs. So I tried to split it using bvec's length and offset fields, but I am facing problem in merging these split bvecs in one. Or there is some other way I can do this?
I am doubtful whether the pages are allocated for a bio when "read" is requested or when the actual data is read from disk (at the layer of I/O scheduler or device driver)?
I am not sure about this I did this some time back. As far as I can remember, I think I created multiple BIOs and used bi_private field to keep track of the parent BIOs and the number child BIOs. This new BIOs had their own end_io function. In the child_bio->end_io(), I would decrement the count of number of child BIOs. If the number is zero, call the end_io function of the parent BIO. Hope this helps. Speaking about the ordering of the BIOs, in my opinion, BIOs can be reodere by IO schedular.
Have a look if you can use bi_private field.
Looking forward to some help.....
Regards, Gaurav
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
Thanks, Gaurav.
participants (3)
-
Gaurav Mahajan -
Prasad Joshi -
Rajat Sharma