diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/trace/blktrace.c | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index c0bd0308741c..190d98fbed27 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c | |||
| @@ -739,6 +739,12 @@ static void blk_add_trace_rq_complete(void *ignore, | |||
| 739 | struct request_queue *q, | 739 | struct request_queue *q, |
| 740 | struct request *rq) | 740 | struct request *rq) |
| 741 | { | 741 | { |
| 742 | struct blk_trace *bt = q->blk_trace; | ||
| 743 | |||
| 744 | /* if control ever passes through here, it's a request based driver */ | ||
| 745 | if (unlikely(bt && !bt->rq_based)) | ||
| 746 | bt->rq_based = true; | ||
| 747 | |||
| 742 | blk_add_trace_rq(q, rq, BLK_TA_COMPLETE); | 748 | blk_add_trace_rq(q, rq, BLK_TA_COMPLETE); |
| 743 | } | 749 | } |
| 744 | 750 | ||
| @@ -774,10 +780,24 @@ static void blk_add_trace_bio_bounce(void *ignore, | |||
| 774 | blk_add_trace_bio(q, bio, BLK_TA_BOUNCE, 0); | 780 | blk_add_trace_bio(q, bio, BLK_TA_BOUNCE, 0); |
| 775 | } | 781 | } |
| 776 | 782 | ||
| 777 | static void blk_add_trace_bio_complete(void *ignore, | 783 | static void blk_add_trace_bio_complete(void *ignore, struct bio *bio, int error) |
| 778 | struct request_queue *q, struct bio *bio, | ||
| 779 | int error) | ||
| 780 | { | 784 | { |
| 785 | struct request_queue *q; | ||
| 786 | struct blk_trace *bt; | ||
| 787 | |||
| 788 | if (!bio->bi_bdev) | ||
| 789 | return; | ||
| 790 | |||
| 791 | q = bdev_get_queue(bio->bi_bdev); | ||
| 792 | bt = q->blk_trace; | ||
| 793 | |||
| 794 | /* | ||
| 795 | * Request based drivers will generate both rq and bio completions. | ||
| 796 | * Ignore bio ones. | ||
| 797 | */ | ||
| 798 | if (likely(!bt) || bt->rq_based) | ||
| 799 | return; | ||
| 800 | |||
| 781 | blk_add_trace_bio(q, bio, BLK_TA_COMPLETE, error); | 801 | blk_add_trace_bio(q, bio, BLK_TA_COMPLETE, error); |
| 782 | } | 802 | } |
| 783 | 803 | ||
