Help understanding block layer sample in LDD3
pranjas at gmail.com
Fri Jul 29 06:28:28 EDT 2016
On Fri, Jul 29, 2016 at 3:14 PM, François <fser at code-libre.org> wrote:
> Hi there,
> I've been reading LDD3's chapter 16 on block devices a few times, and have made toys
> block layers module. Now I've been looking at the up-to-date examples provided by martinez javier,
> but still there's a fundamental concept I fail to understand.
> Considering only the RM_FULL and RM_SIMPLE cases, a request queue is created, bound with a lock, and associated
> with a request function.
> In the simple case, that function "sbull_request" processes each request from the request queue, and delegates
> the work to "sbull_transfer", which basically performs some arithmetic and does the actual data copy.
> This function is given a sector, a number of sectors, a pointer to a buffer, and a read or write parameter
> extracted from the request using blk_rq_pos(), blk_rq_cur_sectors(), req->buffer and rq_data_dir() respectively.
> On the other hand, the same mechanism is used, but a different function is associated: "sbull_full_request".
> That function also extracts requests and delegates the actual work to "sbull_xfer_request" which iterates on
> the request's bio, calls "sbull_xfer_bio" which itself iterates on the bio's segments and finally,
> calls the same "sbull_transfer" function.
> What I fail to understand is: how (with the same initialization) the behaviour of the module using those two
> somehow different mechanism is equivalent.
I don't see req->buffer. Which version you are using?
> One has to understand the full complexity of the underlying data structure (requests having bio, having segments)
> while the other only reads the containing structure (the struct request) and do the same job, without iterations.
> Bonus point, to give some context: I'm writing an asynchronous block-layer which has to split requests into custom subrequest.
> I'm wondering which approach (between those two) I should pickup.
If this is a memory backed block driver, then perhaps you can handle
multiple requests[?]. I don't think you need
to actually break up the same request into multiple requests.
> Thanks for reading so far, and for any hints :)
>  https://github.com/martinezjavier/ldd3/blob/master/sbull/sbull.c
> Kernelnewbies mailing list
> Kernelnewbies at kernelnewbies.org
More information about the Kernelnewbies