Sorry that nobody has replied you so far.....but I can try:

Mine is 12.04.2 LTS Ubuntu (32-bit) too.   But I downloaded the latest 
(almost) Linus git tree and recompile the kernel.   

3.11.0-rc3+

And then I use ftrace method to trace the kernel execution behavior when 
"ls /root" is done.   This is my bash script:

echo 0 >/sys/kernel/debug/tracing/tracing_on ####: quick way to re-enable 
tracing
echo >/sys/kernel/debug/tracing/trace ####: trace clear

echo blk* "*request*" > /sys/kernel/debug/tracing/set_ftrace_filter
echo function >/sys/kernel/debug/tracing/current_tracer
echo 1 >/sys/kernel/debug/tracing/tracing_on ####: quick way to re-enable 
tracing

ls -R /root

echo 0 >/sys/kernel/debug/tracing/tracing_on ####: quick way to re-enable 
tracingcat /sys/kernel/debug/tracing/trace 

The details are documented in /sys/kernel/debug/tracing/README.

Please read the documentation, as the above script will need to be changed 
for a slightly earlier version of the kernel.

>From above script, I focus only on the "blk*" and "*get_request*" function, 
which is why all the following traces is generated (for the "ls" operation):

              ls-13654 [001] ....  7116.341799: blk_rq_init <-get_request
              ls-13654 [001] ....  7116.341799: elv_set_request 
<-get_request
              ls-13654 [001] ....  7116.341799: cfq_set_request 
<-elv_set_request
              ls-13654 [001] ....  7116.341799: init_request_from_bio 
<-blk_queue_bio
              ls-13654 [001] ....  7116.341799: blk_rq_bio_prep 
<-init_request_from_bio
              ls-13654 [001] ....  7116.341799: blk_recount_segments 
<-bio_phys_segments
              ls-13654 [001] d...  7116.341799: __elv_add_request 
<-blk_queue_bio
              ls-13654 [001] d...  7116.341800: cfq_insert_request 
<-__elv_add_request
              ls-13654 [001] d...  7116.341800: scsi_request_fn 
<-__blk_run_queue
              ls-13654 [001] d...  7116.341800: blk_peek_request 
<-scsi_request_fn
              ls-13654 [001] d...  7116.341800: cfq_dispatch_requests 
<-blk_peek_request
              ls-13654 [001] d...  7116.341800: cfq_remove_request 
<-cfq_dispatch_insert
              ls-13654 [001] d...  7116.341800: cfq_activate_request 
<-blk_peek_request
              ls-13654 [001] d...  7116.341801: blk_rq_map_sg 
<-scsi_init_sgtable
              ls-13654 [001] d...  7116.341801: blk_start_request 
<-scsi_request_fn
              ls-13654 [001] d...  7116.341801: blk_dequeue_request 
<-blk_start_request
              ls-13654 [001] d...  7116.341801: blk_add_timer 
<-blk_start_request
              ls-13654 [001] d...  7116.341802: blk_peek_request 
<-scsi_request_fn
              ls-13654 [001] d...  7116.341802: cfq_dispatch_requests 
<-blk_peek_request
              ls-13654 [001] ....  7116.341803: generic_make_request 
<-submit_bio
              ls-13654 [001] ....  7116.341803: generic_make_request_checks 
<-generic_make_request
              ls-13654 [001] ....  7116.341803: blk_throtl_bio 
<-generic_make_request_checks
              ls-13654 [001] ....  7116.341803: blk_queue_bio 
<-generic_make_request
              ls-13654 [001] ....  7116.341804: blk_queue_bounce 
<-blk_queue_bio
              ls-13654 [001] d...  7116.341804: get_request <-blk_queue_bio
              ls-13654 [001] ....  7116.341804: blk_rq_init <-get_request
              ls-13654 [001] ....  7116.341804: elv_set_request 
<-get_request
              ls-13654 [001] ....  7116.341804: cfq_set_request 
<-elv_set_request
              ls-13654 [001] ....  7116.341804: init_request_from_bio 
<-blk_queue_bio
              ls-13654 [001] ....  7116.341804: blk_rq_bio_prep 
<-init_request_from_bio
              ls-13654 [001] ....  7116.341804: blk_recount_segments 
<-bio_phys_segments
              ls-13654 [001] d...  7116.341805: __elv_add_request 
<-blk_queue_bio
              ls-13654 [001] d...  7116.341805: cfq_insert_request 
<-__elv_add_request
              ls-13654 [001] d...  7116.341805: scsi_request_fn 
<-__blk_run_queue
              ls-13654 [001] d...  7116.341805: blk_peek_request 
<-scsi_request_fn
              ls-13654 [001] d...  7116.341805: cfq_dispatch_requests 
<-blk_peek_request
              ls-13654 [001] d...  7116.341805: cfq_remove_request 
<-cfq_dispatch_insert
              ls-13654 [001] d...  7116.341806: cfq_activate_request 
<-blk_peek_request
              ls-13654 [001] d...  7116.341806: blk_rq_map_sg 
<-scsi_init_sgtable
              ls-13654 [001] d...  7116.341806: blk_start_request 
<-scsi_request_fn
              ls-13654 [001] d...  7116.341807: blk_dequeue_request 
<-blk_start_request
              ls-13654 [001] d...  7116.341807: blk_add_timer 
<-blk_start_request
              ls-13654 [001] d...  7116.341807: blk_peek_request 
<-scsi_request_fn
              ls-13654 [001] d...  7116.341807: cfq_dispatch_requests 
<-blk_peek_request
              ls-13654 [001] ....  7116.341808: generic_make_request 
<-submit_bio
              ls-13654 [001] ....  7116.341808: generic_make_request_checks 
<-generic_make_request
              ls-13654 [001] ....  7116.341808: blk_throtl_bio 
<-generic_make_request_checks
              ls-13654 [001] ....  7116.341808: blk_queue_bio 
<-generic_make_request
              ls-13654 [001] ....  7116.341809: blk_queue_bounce 
<-blk_queue_bio
              ls-13654 [001] d...  7116.341809: get_request <-blk_queue_bio
              ls-13654 [001] ....  7116.341809: blk_rq_init <-get_request
              ls-13654 [001] ....  7116.341809: elv_set_request 
<-get_request
              ls-13654 [001] ....  7116.341809: cfq_set_request 
<-elv_set_request

I hope you will know how to read and analyse the caller-callee 
relationship.   pid of "ls" is 13654.

On Tuesday, October 15, 2013 6:35:40 PM UTC+8, Intekhab shaikh wrote:
>
> Hi,
>
> I am new to Linux Kernel development. So please bare with me for trivial 
> things.
> If it is not the right forum to post then please let me know the 
> appropriate channel
>
> I am facing issues on Ubuntu 12.04.2 and 12.04.3. For one project I need 
> to hook into the make_request function of existing block devices and need 
> to do some processing on the read data before passing it onto user mode 
> applications.
>
> My_hooked_in_make_request_fn=>clone the existing bio and change bio_endio 
> callback to my own callback fn (hook_bio_endio)=> In hook_bio_endio do some 
> processing => call original bio's bi_endio function
>
> Code works perfectly fine with 32-bit and 64-bit versions of 2.6.34 and 
> 3.2 kernel versions and it also works on 3.6 and 3.8 kernel version but 
> only on 64-bit.
>
> Investigations revealed that it is happening because in bio_endio callback 
> function I get bio->bi_size as non zero value. And it is same size which is 
> requested from block device. I was at-least expecting it to be smaller than 
> the requested size.
>
> Why I am getting the same size in hook_bio_endio function? Is it due to IO 
> splitting/partially completed IO's? How do I handle it?
>
> I have noticed that for smaller request like 4K hook_bio_endio is 
> receiving bi_size as 0 and for 128K or little smaller getting same 128K 
> size in bi_size.
>
> Please help me understand why and how it is happening and how to deal with 
> it.
>
> Thanks & Regards,
> Intekhab
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"linuxkernelnewbies" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to linuxkernelnewbies+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to