Signed-off-by: Yury Kamenev <damtev@xxxxxxxxxxxxxx> --- .../admin-guide/kernel-parameters.txt | 3 +++ drivers/block/Kconfig | 7 +++++ drivers/block/virtio_blk.c | 26 +++++++++++++++++++ include/uapi/linux/virtio_blk.h | 2 ++ 4 files changed, 38 insertions(+) diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index bdb22006f713..941bdaf5c167 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -6076,6 +6076,9 @@ brightness level. default: 1 + virtiopartscan + Enable virtio block device partition scanning omission based on VIRTIO_BLK_F_NO_PART_SCAN feature flag. + virtio_mmio.device= [VMMIO] Memory mapped virtio (platform) device. diff --git a/drivers/block/Kconfig b/drivers/block/Kconfig index 63056cfd4b62..69ecd3fd7037 100644 --- a/drivers/block/Kconfig +++ b/drivers/block/Kconfig @@ -399,6 +399,13 @@ config VIRTIO_BLK This is the virtual block driver for virtio. It can be used with QEMU based VMMs (like KVM or Xen). Say Y or M. +config VIRTIO_BLK_NO_PART_SCAN + bool "Disable partition scanning for devices with no partitions" + depends on VIRTIO_BLK + help + Disable partition scanning for devices with no partitions. + Can reduce the kernel start time for tiny systems like squashfs images. + config BLK_DEV_RBD tristate "Rados block device (RBD)" depends on INET && BLOCK diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c index 4b49df2dfd23..479711d3791c 100644 --- a/drivers/block/virtio_blk.c +++ b/drivers/block/virtio_blk.c @@ -692,6 +692,19 @@ static const struct blk_mq_ops virtio_mq_ops = { static unsigned int virtblk_queue_depth; module_param_named(queue_depth, virtblk_queue_depth, uint, 0444); +#ifndef MODULE +#ifdef CONFIG_VIRTIO_BLK_NO_PART_SCAN +static int partitions_scanning_disable __read_mostly; + +static int __init partitions_scanning_setup(char *__unused) +{ + partitions_scanning_disable = 1; + return 1; +} +__setup("nopartscan", partitions_scanning_setup); +#endif +#endif + static int virtblk_probe(struct virtio_device *vdev) { struct virtio_blk *vblk; @@ -790,6 +803,13 @@ static int virtblk_probe(struct virtio_device *vdev) vblk->disk->flags |= GENHD_FL_EXT_DEVT; vblk->index = index; +#ifdef CONFIG_VIRTIO_BLK_NO_PART_SCAN + if (unlikely(partitions_scanning_disable)) + /* disable partitions scanning if it was stated in virtio features*/ + if (virtio_has_feature(vdev, VIRTIO_BLK_F_NO_PART_SCAN)) + vblk->disk->flags |= GENHD_FL_NO_PART_SCAN; +#endif + /* configure queue flush support */ virtblk_update_cache_mode(vdev); @@ -966,6 +986,9 @@ static unsigned int features_legacy[] = { VIRTIO_BLK_F_RO, VIRTIO_BLK_F_BLK_SIZE, VIRTIO_BLK_F_FLUSH, VIRTIO_BLK_F_TOPOLOGY, VIRTIO_BLK_F_CONFIG_WCE, VIRTIO_BLK_F_MQ, VIRTIO_BLK_F_DISCARD, VIRTIO_BLK_F_WRITE_ZEROES, +#ifdef CONFIG_VIRTIO_BLK_NO_PART_SCAN + VIRTIO_BLK_F_NO_PART_SCAN, +#endif } ; static unsigned int features[] = { @@ -973,6 +996,9 @@ static unsigned int features[] = { VIRTIO_BLK_F_RO, VIRTIO_BLK_F_BLK_SIZE, VIRTIO_BLK_F_FLUSH, VIRTIO_BLK_F_TOPOLOGY, VIRTIO_BLK_F_CONFIG_WCE, VIRTIO_BLK_F_MQ, VIRTIO_BLK_F_DISCARD, VIRTIO_BLK_F_WRITE_ZEROES, +#ifdef CONFIG_VIRTIO_BLK_NO_PART_SCAN + VIRTIO_BLK_F_NO_PART_SCAN, +#endif }; static struct virtio_driver virtio_blk = { diff --git a/include/uapi/linux/virtio_blk.h b/include/uapi/linux/virtio_blk.h index d888f013d9ff..9b381675342a 100644 --- a/include/uapi/linux/virtio_blk.h +++ b/include/uapi/linux/virtio_blk.h @@ -40,6 +40,7 @@ #define VIRTIO_BLK_F_MQ 12 /* support more than one vq */ #define VIRTIO_BLK_F_DISCARD 13 /* DISCARD is supported */ #define VIRTIO_BLK_F_WRITE_ZEROES 14 /* WRITE ZEROES is supported */ +#define VIRTIO_BLK_F_NO_PART_SCAN 16 /* Disable partition scanning */ /* Legacy feature bits */ #ifndef VIRTIO_BLK_NO_LEGACY -- 2.24.3 (Apple Git-128)