Re: Help understanding block layer sample in LDD3

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Jul 29, 2016 at 3:14 PM, François <fser@xxxxxxxxxxxxxx> 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[1],
> 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 :)
>
>
> [1] https://github.com/martinezjavier/ldd3/blob/master/sbull/sbull.c
> --
> François
>
> _______________________________________________
> Kernelnewbies mailing list
> Kernelnewbies@xxxxxxxxxxxxxxxxx
> https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies



-- 
        ---P.K.S

_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@xxxxxxxxxxxxxxxxx
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies




[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux