From: Namhyung Kim <namhyung@gmail.com>
To: Jens Axboe <axboe@kernel.dk>
Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/6] block: introduce __bio_endio()
Date: Thu, 01 Sep 2011 10:43:53 +0900 [thread overview]
Message-ID: <87vctdvxye.fsf@gmail.com> (raw)
In-Reply-To: <4E5D36C7.5020706@kernel.dk> (Jens Axboe's message of "Tue, 30 Aug 2011 13:15:19 -0600")
Jens Axboe <axboe@kernel.dk> writes:
> On 2011-08-28 21:47, Namhyung Kim wrote:
>> Currently, bio_endio() lacks its completion tracepoint in it,
>> so that the bio-based devices - except DM which inserted the
>> tracepoint explicitly - cannot send us such an event when using
>> blktrace. Adding the tracepoint in the function will fix this.
>>
>> However, bio_endio() is also used for other ways like some
>> nested bio-handling path and request-based devices. Simply
>> adding will result in duplicated event for those cases. Thus
>> add new __bio_endio() function to do things as before but no
>> tracepoint. Similarly, __bio_io_error() helper was added too.
>
> Not crazy about this solution, it seems a little fragile. And it's hard
> to know what the difference between bio_endio() and __bio_endio() is
> without looking at the code.
>
> I think it would be cleaner to mark a bio as going inflight, so that we
> can check this flag on completion. If it's never been in flight, don't
> trigger a completion event trace for it.
OK. Sounds reasonable.
So, how about this:
diff --git a/block/blk-core.c b/block/blk-core.c
index 90e1ffdeb415..b70c086dc7c0 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -164,6 +164,9 @@ static void req_bio_endio(struct request *rq, struct bio *bio,
if (unlikely(rq->cmd_flags & REQ_QUIET))
set_bit(BIO_QUIET, &bio->bi_flags);
+ /* completion event was already reported in blk_update_request */
+ clear_bit(BIO_IN_FLIGHT, &bio->bi_flags);
+
bio->bi_size -= nbytes;
bio->bi_sector += (nbytes >> 9);
@@ -1545,6 +1548,8 @@ static inline void __generic_make_request(struct bio *bio)
trace_block_bio_queue(q, bio);
+ set_bit(BIO_IN_FLIGHT, &bio->bi_flags);
+
ret = q->make_request_fn(q, bio);
} while (ret);
diff --git a/fs/bio.c b/fs/bio.c
index 9bfade8a609b..0176ca4935c1 100644
--- a/fs/bio.c
+++ b/fs/bio.c
@@ -1447,6 +1447,15 @@ void bio_endio(struct bio *bio, int error)
else if (!test_bit(BIO_UPTODATE, &bio->bi_flags))
error = -EIO;
+ if (test_bit(BIO_IN_FLIGHT, &bio->bi_flags)) {
+ struct request_queue *q = bdev_get_queue(bio->bi_bdev);
+
+ trace_block_bio_complete(q, bio, error);
+
+ /* prevent duplicated completion event report */
+ clear_bit(BIO_IN_FLIGHT, &bio->bi_flags);
+ }
+
if (bio->bi_end_io)
bio->bi_end_io(bio, error);
}
diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h
index 32f0076e844b..daa81a7d1522 100644
--- a/include/linux/blk_types.h
+++ b/include/linux/blk_types.h
@@ -98,6 +98,7 @@ struct bio {
#define BIO_FS_INTEGRITY 10 /* fs owns integrity data, not block layer */
#define BIO_QUIET 11 /* Make BIO Quiet */
#define BIO_MAPPED_INTEGRITY 12/* integrity metadata has been remapped */
+#define BIO_IN_FLIGHT 13 /* report I/O completion event */
#define bio_flagged(bio, flag) ((bio)->bi_flags & (1 << (flag)))
/*
next prev parent reply other threads:[~2011-09-01 1:44 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-08-29 3:47 [PATCH 0/6] blktrace: bio-based device tracing improvement Namhyung Kim
2011-08-29 3:47 ` [PATCH 1/6] block: move trace_block_bio_remap() before blk_partition_remap Namhyung Kim
2011-08-29 3:47 ` [PATCH 2/6] block: introduce __bio_endio() Namhyung Kim
2011-08-30 19:15 ` Jens Axboe
2011-09-01 1:43 ` Namhyung Kim [this message]
2011-08-29 3:47 ` [PATCH 3/6] bounce: convert to __bio_endio() for bounced bio's Namhyung Kim
2011-08-29 3:47 ` Namhyung Kim
2011-08-29 3:47 ` [PATCH 4/6] bio-integrity: convert to __bio_endio() Namhyung Kim
2011-08-29 3:47 ` [PATCH 5/6] Btrfs: " Namhyung Kim
2011-08-29 3:47 ` [PATCH 6/6] dm: get rid of block_bio_complete tracepoint Namhyung Kim
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87vctdvxye.fsf@gmail.com \
--to=namhyung@gmail.com \
--cc=axboe@kernel.dk \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.