瀏覽代碼

bcache/md: Use raid stripe size

Now that we've got code for raid5/6 stripe awareness, bcache just needs
to know about the stripes and when writing partial stripes is expensive
- we probably don't want to enable this optimization for raid1 or 10,
even though they have stripes. So add a flag to queue_limits.

Signed-off-by: Kent Overstreet <kmo@daterainc.com>
Kent Overstreet 12 年之前
父節點
當前提交
c78afc6261
共有 4 個文件被更改,包括 12 次插入0 次删除
  1. 4 0
      block/blk-settings.c
  2. 6 0
      drivers/md/bcache/super.c
  3. 1 0
      drivers/md/raid5.c
  4. 1 0
      include/linux/blkdev.h

+ 4 - 0
block/blk-settings.c

@@ -592,6 +592,10 @@ int blk_stack_limits(struct queue_limits *t, struct queue_limits *b,
 		ret = -1;
 		ret = -1;
 	}
 	}
 
 
+	t->raid_partial_stripes_expensive =
+		max(t->raid_partial_stripes_expensive,
+		    b->raid_partial_stripes_expensive);
+
 	/* Find lowest common alignment_offset */
 	/* Find lowest common alignment_offset */
 	t->alignment_offset = lcm(t->alignment_offset, alignment)
 	t->alignment_offset = lcm(t->alignment_offset, alignment)
 		& (max(t->physical_block_size, t->io_min) - 1);
 		& (max(t->physical_block_size, t->io_min) - 1);

+ 6 - 0
drivers/md/bcache/super.c

@@ -1134,6 +1134,12 @@ static int cached_dev_init(struct cached_dev *dc, unsigned block_size)
 		hlist_add_head(&io->hash, dc->io_hash + RECENT_IO);
 		hlist_add_head(&io->hash, dc->io_hash + RECENT_IO);
 	}
 	}
 
 
+	dc->disk.stripe_size = q->limits.io_opt >> 9;
+
+	if (dc->disk.stripe_size)
+		dc->partial_stripes_expensive =
+			q->limits.raid_partial_stripes_expensive;
+
 	ret = bcache_device_init(&dc->disk, block_size,
 	ret = bcache_device_init(&dc->disk, block_size,
 			 dc->bdev->bd_part->nr_sects - dc->sb.data_offset);
 			 dc->bdev->bd_part->nr_sects - dc->sb.data_offset);
 	if (ret)
 	if (ret)

+ 1 - 0
drivers/md/raid5.c

@@ -6101,6 +6101,7 @@ static int run(struct mddev *mddev)
 		blk_queue_io_min(mddev->queue, chunk_size);
 		blk_queue_io_min(mddev->queue, chunk_size);
 		blk_queue_io_opt(mddev->queue, chunk_size *
 		blk_queue_io_opt(mddev->queue, chunk_size *
 				 (conf->raid_disks - conf->max_degraded));
 				 (conf->raid_disks - conf->max_degraded));
+		mddev->queue->limits.raid_partial_stripes_expensive = 1;
 		/*
 		/*
 		 * We can only discard a whole stripe. It doesn't make sense to
 		 * We can only discard a whole stripe. It doesn't make sense to
 		 * discard data disk but write parity disk
 		 * discard data disk but write parity disk

+ 1 - 0
include/linux/blkdev.h

@@ -291,6 +291,7 @@ struct queue_limits {
 	unsigned char		discard_misaligned;
 	unsigned char		discard_misaligned;
 	unsigned char		cluster;
 	unsigned char		cluster;
 	unsigned char		discard_zeroes_data;
 	unsigned char		discard_zeroes_data;
+	unsigned char		raid_partial_stripes_expensive;
 };
 };
 
 
 struct request_queue {
 struct request_queue {