Selaa lähdekoodia

md: remove plug_cnt feature of plugging.

This seemed like a good idea at the time, but after further thought I
cannot see it making a difference other than very occasionally and
testing to try to exercise the case it is most likely to help did not
show any performance difference by removing it.

So remove the counting of active plugs and allow 'pending writes' to
be activated at any time, not just when no plugs are active.

This is only relevant when there is a write-intent bitmap, and the
updating of the bitmap will likely introduce enough delay that
the single-threading of bitmap updates will be enough to collect large
numbers of updates together.

Removing this will make it easier to centralise the unplug code, and
will clear the other for other unplug enhancements which have a
measurable effect.

Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
NeilBrown 13 vuotta sitten
vanhempi
commit
0021b7bc04
5 muutettua tiedostoa jossa 5 lisäystä ja 14 poistoa
  1. 1 4
      drivers/md/md.c
  2. 0 3
      drivers/md/md.h
  3. 1 2
      drivers/md/raid1.c
  4. 1 2
      drivers/md/raid10.c
  5. 2 3
      drivers/md/raid5.c

+ 1 - 4
drivers/md/md.c

@@ -514,8 +514,7 @@ struct md_plug_cb {
 static void plugger_unplug(struct blk_plug_cb *cb)
 static void plugger_unplug(struct blk_plug_cb *cb)
 {
 {
 	struct md_plug_cb *mdcb = container_of(cb, struct md_plug_cb, cb);
 	struct md_plug_cb *mdcb = container_of(cb, struct md_plug_cb, cb);
-	if (atomic_dec_and_test(&mdcb->mddev->plug_cnt))
-		md_wakeup_thread(mdcb->mddev->thread);
+	md_wakeup_thread(mdcb->mddev->thread);
 	kfree(mdcb);
 	kfree(mdcb);
 }
 }
 
 
@@ -548,7 +547,6 @@ int mddev_check_plugged(struct mddev *mddev)
 
 
 	mdcb->mddev = mddev;
 	mdcb->mddev = mddev;
 	mdcb->cb.callback = plugger_unplug;
 	mdcb->cb.callback = plugger_unplug;
-	atomic_inc(&mddev->plug_cnt);
 	list_add(&mdcb->cb.list, &plug->cb_list);
 	list_add(&mdcb->cb.list, &plug->cb_list);
 	return 1;
 	return 1;
 }
 }
@@ -602,7 +600,6 @@ void mddev_init(struct mddev *mddev)
 	atomic_set(&mddev->active, 1);
 	atomic_set(&mddev->active, 1);
 	atomic_set(&mddev->openers, 0);
 	atomic_set(&mddev->openers, 0);
 	atomic_set(&mddev->active_io, 0);
 	atomic_set(&mddev->active_io, 0);
-	atomic_set(&mddev->plug_cnt, 0);
 	spin_lock_init(&mddev->write_lock);
 	spin_lock_init(&mddev->write_lock);
 	atomic_set(&mddev->flush_pending, 0);
 	atomic_set(&mddev->flush_pending, 0);
 	init_waitqueue_head(&mddev->sb_wait);
 	init_waitqueue_head(&mddev->sb_wait);

+ 0 - 3
drivers/md/md.h

@@ -266,9 +266,6 @@ struct mddev {
 	int				new_chunk_sectors;
 	int				new_chunk_sectors;
 	int				reshape_backwards;
 	int				reshape_backwards;
 
 
-	atomic_t			plug_cnt;	/* If device is expecting
-							 * more bios soon.
-							 */
 	struct md_thread		*thread;	/* management thread */
 	struct md_thread		*thread;	/* management thread */
 	struct md_thread		*sync_thread;	/* doing resync or reconstruct */
 	struct md_thread		*sync_thread;	/* doing resync or reconstruct */
 	sector_t			curr_resync;	/* last block scheduled */
 	sector_t			curr_resync;	/* last block scheduled */

+ 1 - 2
drivers/md/raid1.c

@@ -2173,8 +2173,7 @@ static void raid1d(struct mddev *mddev)
 	blk_start_plug(&plug);
 	blk_start_plug(&plug);
 	for (;;) {
 	for (;;) {
 
 
-		if (atomic_read(&mddev->plug_cnt) == 0)
-			flush_pending_writes(conf);
+		flush_pending_writes(conf);
 
 
 		spin_lock_irqsave(&conf->device_lock, flags);
 		spin_lock_irqsave(&conf->device_lock, flags);
 		if (list_empty(head)) {
 		if (list_empty(head)) {

+ 1 - 2
drivers/md/raid10.c

@@ -2660,8 +2660,7 @@ static void raid10d(struct mddev *mddev)
 	blk_start_plug(&plug);
 	blk_start_plug(&plug);
 	for (;;) {
 	for (;;) {
 
 
-		if (atomic_read(&mddev->plug_cnt) == 0)
-			flush_pending_writes(conf);
+		flush_pending_writes(conf);
 
 
 		spin_lock_irqsave(&conf->device_lock, flags);
 		spin_lock_irqsave(&conf->device_lock, flags);
 		if (list_empty(head)) {
 		if (list_empty(head)) {

+ 2 - 3
drivers/md/raid5.c

@@ -4543,7 +4543,7 @@ static void raid5d(struct mddev *mddev)
 	while (1) {
 	while (1) {
 		struct bio *bio;
 		struct bio *bio;
 
 
-		if (atomic_read(&mddev->plug_cnt) == 0 &&
+		if (
 		    !list_empty(&conf->bitmap_list)) {
 		    !list_empty(&conf->bitmap_list)) {
 			/* Now is a good time to flush some bitmap updates */
 			/* Now is a good time to flush some bitmap updates */
 			conf->seq_flush++;
 			conf->seq_flush++;
@@ -4553,8 +4553,7 @@ static void raid5d(struct mddev *mddev)
 			conf->seq_write = conf->seq_flush;
 			conf->seq_write = conf->seq_flush;
 			activate_bit_delay(conf);
 			activate_bit_delay(conf);
 		}
 		}
-		if (atomic_read(&mddev->plug_cnt) == 0)
-			raid5_activate_delayed(conf);
+		raid5_activate_delayed(conf);
 
 
 		while ((bio = remove_bio_from_retry(conf))) {
 		while ((bio = remove_bio_from_retry(conf))) {
 			int ok;
 			int ok;