Add UNPLUG traces to all appropriate places
Subsystems (3)
PATCH 1/1 Add UNPLUG traces to all appropriate places
Added blk_unplug interface, allowing all invocations of unplugs to result in a generated blktrace UNPLUG. Previously, we saw a PLUG on each of the underlying devices, and an UNPLUG on the volume. This patch ensures that we see the UNPLUG calls for each of the underlying devices.
---
block/ll_rw_blk.c | 24 +++++++++++++++--------- drivers/md/bitmap.c | 3 +-- drivers/md/dm-table.c | 3 +-- drivers/md/linear.c | 3 +-- drivers/md/md.c | 4 ++-- drivers/md/multipath.c | 3 +-- drivers/md/raid0.c | 3 +-- drivers/md/raid1.c | 3 +-- drivers/md/raid10.c | 3 +-- drivers/md/raid5.c | 3 +-- include/linux/blkdev.h | 1 + 11 files changed, 26 insertions(+), 27 deletions(-)
block/ll_rw_blk.c +0 -0
@@ -1634,15 +1634,7 @@ static void blk_backing_dev_unplug(struct backing_dev_info *bdi,
{
struct request_queue *q = bdi->unplug_io_data;- /*
- * devices don't necessarily have an ->unplug_fn defined
- */
- if (q->unplug_fn) {
- blk_add_trace_pdu_int(q, BLK_TA_UNPLUG_IO, NULL,
- q->rq.count[READ] + q->rq.count[WRITE]);
-
- q->unplug_fn(q);
- }
+ blk_unplug(q);
}
static void blk_unplug_work(struct work_struct *work)
@@ -1666,6 +1658,20 @@ static void blk_unplug_timeout(unsigned long data)
kblockd_schedule_work(&q->unplug_work); }
+void blk_unplug(struct request_queue *q)
+{
+ /*
+ * devices don't necessarily have an ->unplug_fn defined
+ */
+ if (q->unplug_fn) {
+ blk_add_trace_pdu_int(q, BLK_TA_UNPLUG_IO, NULL,
+ q->rq.count[READ] + q->rq.count[WRITE]);
+
+ q->unplug_fn(q);
+ }
+}
+EXPORT_SYMBOL(blk_unplug);
+
/**
* blk_start_queue - restart a previously stopped queue
* @q: The &struct request_queue in question
drivers/md/bitmap.c +1 -2
@@ -1207,8 +1207,7 @@ int bitmap_startwrite(struct bitmap *bitmap, sector_t offset, unsigned long sectprepare_to_wait (&bitmap->overflow_wait, &__wait,TASK_UNINTERRUPTIBLE );spin_unlock_irq (&bitmap->lock); - bitmap->mddev->queue - ->unplug_fn (bitmap->mddev->queue); +blk_unplug (bitmap->mddev->queue);schedule ();finish_wait (&bitmap->overflow_wait, &__wait);continue ;
drivers/md/dm-table.c +1 -2
@@ -1000,8 +1000,7 @@ void dm_table_unplug_all(struct dm_table *t) struct dm_dev *dd = list_entry(d, struct dm_dev, list);struct request_queue *q =bdev_get_queue (dd->bdev); -if (q->unplug_fn) - q->unplug_fn (q); +blk_unplug (q); }
}
drivers/md/linear.c +0 -0
@@ -87,8 +87,7 @@ static void linear_unplug(struct request_queue *q)for (i=0 ; i < mddev->raid_disks; i++) { struct request_queue *r_queue =
bdev_get_queue(conf->disks[i].rdev->bdev);
- if (r_queue->unplug_fn)
- r_queue->unplug_fn(r_queue);
+ blk_unplug(r_queue);
}
}drivers/md/md.c +2 -2
@@ -5445,7 +5445,7 @@ void md_do_sync(mddev_t *mddev)* about not overloading the IO subsystem. (things like an * e2fsck being done on the RAID array should execute fast) */ - mddev->queue->unplug_fn (mddev->queue); +blk_unplug (mddev->queue);cond_resched (); currspeed = ((unsigned long )(io_sectors-mddev->resync_mark_cnt))/2
@@ -5464,7 +5464,7 @@ void md_do_sync(mddev_t *mddev)* this also signals 'finished resyncing' to md_stop */ out: - mddev->queue->unplug_fn (mddev->queue); +blk_unplug (mddev->queue); wait_event(mddev->recovery_wait,
!atomic_read(&mddev->recovery_active));
drivers/md/multipath.c +1 -2
@@ -125,8 +125,7 @@ static void unplug_slaves(mddev_t *mddev)atomic_inc (&rdev->nr_pending);rcu_read_unlock (); -if (r_queue->unplug_fn) - r_queue->unplug_fn (r_queue); +blk_unplug (r_queue);rdev_dec_pending (rdev, mddev);rcu_read_lock ();
drivers/md/raid0.c +1 -2
@@ -35,8 +35,7 @@ static void raid0_unplug(struct request_queue *q)for (i=0 ; i<mddev->raid_disks; i++) {struct request_queue *r_queue =bdev_get_queue (devlist[i]->bdev); -if (r_queue->unplug_fn) - r_queue->unplug_fn (r_queue); +blk_unplug (r_queue); }
}
drivers/md/raid1.c +1 -2
@@ -549,8 +549,7 @@ static void unplug_slaves(mddev_t *mddev)atomic_inc (&rdev->nr_pending);rcu_read_unlock (); -if (r_queue->unplug_fn) - r_queue->unplug_fn (r_queue); +blk_unplug (r_queue);rdev_dec_pending (rdev, mddev);rcu_read_lock ();
drivers/md/raid10.c +1 -2
@@ -593,8 +593,7 @@ static void unplug_slaves(mddev_t *mddev)atomic_inc (&rdev->nr_pending);rcu_read_unlock (); -if (r_queue->unplug_fn) - r_queue->unplug_fn (r_queue); +blk_unplug (r_queue);rdev_dec_pending (rdev, mddev);rcu_read_lock ();
drivers/md/raid5.c +1 -2
@@ -3186,8 +3186,7 @@ static void unplug_slaves(mddev_t *mddev)atomic_inc (&rdev->nr_pending);rcu_read_unlock (); -if (r_queue->unplug_fn) - r_queue->unplug_fn (r_queue); +blk_unplug (r_queue);rdev_dec_pending (rdev, mddev);rcu_read_lock ();
include/linux/blkdev.h +0 -0
@@ -697,6 +697,7 @@ extern int blk_execute_rq(struct request_queue *, struct gendisk *,
extern void blk_execute_rq_nowait(struct request_queue *, struct gendisk *,
struct request *, int, rq_end_io_fn *);
extern int blk_verify_command(unsigned char *, int); +extern void blk_unplug(struct request_queue *q);
static inline struct request_queue *bdev_get_queue(struct block_device *bdev) {
Signature · 1 line
1.5.2.5
Quoted 4 lines · Alan D. Brunelle
Added
blk_unpluginterface, allowing all invocations of unplugs to result in a generated blktrace UNPLUG. Previously, we saw a PLUG on each of the underlying devices, and an UNPLUG on the volume. This patch ensures that we see the UNPLUG calls for each of the underlying devices.
Looks fine Alan, applied.
Signature · 1 line
Jens Axboe