FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.


» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > Redhat > Device-mapper Development

 
 
LinkBack Thread Tools
 
Old 02-17-2012, 08:19 PM
Tejun Heo
 
Default block: add missing block_bio_complete() tracepoint

bio completion didn't kick block_bio_complete TP. Only dm was
explicitly triggering the TP on IO completion. This makes
block_bio_complete TP useless for tracers which want to know about
bios, and all other bio based drivers skip generating blktrace
completion events.

This patch makes all bio completions via bio_endio() generate
block_bio_complete TP.

* Explicit trace_block_bio_complete() invocation removed from dm and
the trace point is unexported.

* @rq dropped from trace_block_bio_complete(). bios may fly around
w/o queue associated. Verifying and accessing the assocaited queue
belongs to TP probes.

* blktrace now gets both request and bio completions. Make it ignore
bio completions if request completion path is happening.

This makes all bio based drivers generate blktrace completion events
properly and makes the block_bio_complete TP actually useful.

Signed-off-by: Tejun Heo <tj@kernel.org>
Original-patch-by: Namhyung Kim <namhyung@gmail.com>
Cc: Tejun Heo <tj@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: dm-devel@redhat.com
---
block/blk-core.c | 1 -
drivers/md/dm.c | 1 -
fs/bio.c | 2 ++
include/linux/blktrace_api.h | 1 +
include/trace/events/block.h | 5 ++---
kernel/trace/blktrace.c | 26 +++++++++++++++++++++++---
6 files changed, 28 insertions(+), 8 deletions(-)

Index: work/block/blk-core.c
================================================== =================
--- work.orig/block/blk-core.c
+++ work/block/blk-core.c
@@ -37,7 +37,6 @@

EXPORT_TRACEPOINT_SYMBOL_GPL(block_bio_remap);
EXPORT_TRACEPOINT_SYMBOL_GPL(block_rq_remap);
-EXPORT_TRACEPOINT_SYMBOL_GPL(block_bio_complete);

DEFINE_IDA(blk_queue_ida);

Index: work/drivers/md/dm.c
================================================== =================
--- work.orig/drivers/md/dm.c
+++ work/drivers/md/dm.c
@@ -647,7 +647,6 @@ static void dec_pending(struct dm_io *io
queue_io(md, bio);
} else {
/* done with normal IO or empty flush */
- trace_block_bio_complete(md->queue, bio, io_error);
bio_endio(bio, io_error);
}
}
Index: work/fs/bio.c
================================================== =================
--- work.orig/fs/bio.c
+++ work/fs/bio.c
@@ -1443,6 +1443,8 @@ void bio_endio(struct bio *bio, int erro
else if (!test_bit(BIO_UPTODATE, &bio->bi_flags))
error = -EIO;

+ trace_block_bio_complete(bio, error);
+
if (bio->bi_end_io)
bio->bi_end_io(bio, error);
}
Index: work/include/trace/events/block.h
================================================== =================
--- work.orig/include/trace/events/block.h
+++ work/include/trace/events/block.h
@@ -206,7 +206,6 @@ TRACE_EVENT(block_bio_bounce,

/**
* block_bio_complete - completed all work on the block operation
- * @q: queue holding the block operation
* @bio: block operation completed
* @error: io error value
*
@@ -215,9 +214,9 @@ TRACE_EVENT(block_bio_bounce,
*/
TRACE_EVENT(block_bio_complete,

- TP_PROTO(struct request_queue *q, struct bio *bio, int error),
+ TP_PROTO(struct bio *bio, int error),

- TP_ARGS(q, bio, error),
+ TP_ARGS(bio, error),

TP_STRUCT__entry(
__field( dev_t, dev )
Index: work/kernel/trace/blktrace.c
================================================== =================
--- work.orig/kernel/trace/blktrace.c
+++ work/kernel/trace/blktrace.c
@@ -753,6 +753,12 @@ static void blk_add_trace_rq_complete(vo
struct request_queue *q,
struct request *rq)
{
+ struct blk_trace *bt = q->blk_trace;
+
+ /* if control ever passes through here, it's a request based driver */
+ if (unlikely(bt && !bt->rq_based))
+ bt->rq_based = true;
+
blk_add_trace_rq(q, rq, BLK_TA_COMPLETE);
}

@@ -788,10 +794,24 @@ static void blk_add_trace_bio_bounce(voi
blk_add_trace_bio(q, bio, BLK_TA_BOUNCE, 0);
}

-static void blk_add_trace_bio_complete(void *ignore,
- struct request_queue *q, struct bio *bio,
- int error)
+static void blk_add_trace_bio_complete(void *ignore, struct bio *bio, int error)
{
+ struct request_queue *q;
+ struct blk_trace *bt;
+
+ if (!bio->bi_bdev)
+ return;
+
+ q = bdev_get_queue(bio->bi_bdev);
+ bt = q->blk_trace;
+
+ /*
+ * Request based drivers will generate both rq and bio completions.
+ * Ignore bio ones.
+ */
+ if (likely(!bt) || bt->rq_based)
+ return;
+
blk_add_trace_bio(q, bio, BLK_TA_COMPLETE, error);
}

Index: work/include/linux/blktrace_api.h
================================================== =================
--- work.orig/include/linux/blktrace_api.h
+++ work/include/linux/blktrace_api.h
@@ -151,6 +151,7 @@ struct blk_user_trace_setup {

struct blk_trace {
int trace_state;
+ bool rq_based;
struct rchan *rchan;
unsigned long __percpu *sequence;
unsigned char __percpu *msg_data;

--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel
 
Old 02-18-2012, 02:31 AM
Namhyung Kim
 
Default block: add missing block_bio_complete() tracepoint

Hi,

2012-02-17, 13:19 -0800, Tejun Heo:
> bio completion didn't kick block_bio_complete TP. Only dm was
> explicitly triggering the TP on IO completion. This makes
> block_bio_complete TP useless for tracers which want to know about
> bios, and all other bio based drivers skip generating blktrace
> completion events.
>
> This patch makes all bio completions via bio_endio() generate
> block_bio_complete TP.
>
> * Explicit trace_block_bio_complete() invocation removed from dm and
> the trace point is unexported.
>
> * @rq dropped from trace_block_bio_complete(). bios may fly around
> w/o queue associated. Verifying and accessing the assocaited queue
> belongs to TP probes.
>
> * blktrace now gets both request and bio completions. Make it ignore
> bio completions if request completion path is happening.
>
> This makes all bio based drivers generate blktrace completion events
> properly and makes the block_bio_complete TP actually useful.
>
> Signed-off-by: Tejun Heo <tj@kernel.org>
> Original-patch-by: Namhyung Kim <namhyung@gmail.com>
> Cc: Tejun Heo <tj@kernel.org>
> Cc: Steven Rostedt <rostedt@goodmis.org>
> Cc: dm-devel@redhat.com

Looks better to me, thanks.


--
Regards,
Namhyung Kim


--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel
 

Thread Tools




All times are GMT. The time now is 10:54 PM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright 2007 - 2008, www.linux-archive.org