linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/1] virtio: disable partitions scanning for no partitions block
@ 2021-07-15  9:47 Yury Kamenev
  2021-07-15  9:47 ` [PATCH 1/1] " Yury Kamenev
  0 siblings, 1 reply; 6+ messages in thread
From: Yury Kamenev @ 2021-07-15  9:47 UTC (permalink / raw)
  To: mst, jasowang, pbonzini, stefanha, axboe, hch, cand,
	virtualization, linux-block, linux-kernel
  Cc: Yury Kamenev

Some virtio blocks definitely have no partitions and should not be scanned.

Yury Kamenev (1):
  virtio: disable partitions scanning for no partitions block

 .../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(+)

-- 
2.24.3 (Apple Git-128)


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/1] virtio: disable partitions scanning for no partitions block
  2021-07-15  9:47 [PATCH 0/1] virtio: disable partitions scanning for no partitions block Yury Kamenev
@ 2021-07-15  9:47 ` Yury Kamenev
  2021-07-15 11:22   ` Paolo Bonzini
                     ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Yury Kamenev @ 2021-07-15  9:47 UTC (permalink / raw)
  To: mst, jasowang, pbonzini, stefanha, axboe, hch, cand,
	virtualization, linux-block, linux-kernel
  Cc: Yury Kamenev

Signed-off-by: Yury Kamenev <damtev@yandex-team.ru>
---
 .../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)


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/1] virtio: disable partitions scanning for no partitions block
  2021-07-15  9:47 ` [PATCH 1/1] " Yury Kamenev
@ 2021-07-15 11:22   ` Paolo Bonzini
  2021-07-16  1:09   ` kernel test robot
  2021-07-16  2:57   ` Jason Wang
  2 siblings, 0 replies; 6+ messages in thread
From: Paolo Bonzini @ 2021-07-15 11:22 UTC (permalink / raw)
  To: Yury Kamenev, mst, jasowang, stefanha, axboe, hch, cand,
	virtualization, linux-block, linux-kernel

On 15/07/21 11:47, Yury Kamenev wrote:
> +#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
> +

Has this been added to the spec?  It doesn't seem like a good idea, as 
pointed out by Stefan[1], Christoph[2] and myself[3].

Paolo

[1] 
https://lore.kernel.org/linux-block/20210524145654.GA2632@lst.de/T/#m2697cb41578490aad49ed1d8fa6604bf0924b54d
[2] 
https://lore.kernel.org/linux-block/20210524145654.GA2632@lst.de/T/#mc59329fd824102f94ac2f6b29fe94a652849aca0
[3] 
https://lore.kernel.org/linux-block/20210524145654.GA2632@lst.de/T/#mee6787c4fd87790b64feccc9e77fd5f618c2c336


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/1] virtio: disable partitions scanning for no partitions block
  2021-07-15  9:47 ` [PATCH 1/1] " Yury Kamenev
  2021-07-15 11:22   ` Paolo Bonzini
@ 2021-07-16  1:09   ` kernel test robot
  2021-07-16  2:57   ` Jason Wang
  2 siblings, 0 replies; 6+ messages in thread
From: kernel test robot @ 2021-07-16  1:09 UTC (permalink / raw)
  To: Yury Kamenev, mst, jasowang, pbonzini, stefanha, axboe, hch,
	cand, virtualization, linux-block, linux-kernel
  Cc: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 10420 bytes --]

Hi Yury,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on block/for-next]
[also build test ERROR on vhost/linux-next hch-configfs/for-next linus/master v5.14-rc1 next-20210715]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Yury-Kamenev/virtio-disable-partitions-scanning-for-no-partitions-block/20210715-175107
base:   https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next
config: ia64-allmodconfig (attached as .config)
compiler: ia64-linux-gcc (GCC) 10.3.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/b5b35e33f22266b3905186a005992d54ae71e51b
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Yury-Kamenev/virtio-disable-partitions-scanning-for-no-partitions-block/20210715-175107
        git checkout b5b35e33f22266b3905186a005992d54ae71e51b
        # save the attached .config to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-10.3.0 make.cross O=build_dir ARCH=ia64 SHELL=/bin/bash drivers/block/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   In file included from include/linux/kernel.h:11,
                    from include/linux/list.h:9,
                    from include/linux/preempt.h:11,
                    from include/linux/spinlock.h:51,
                    from drivers/block/virtio_blk.c:3:
   drivers/block/virtio_blk.c: In function 'virtblk_probe':
>> drivers/block/virtio_blk.c:807:15: error: 'partitions_scanning_disable' undeclared (first use in this function)
     807 |  if (unlikely(partitions_scanning_disable))
         |               ^~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/compiler.h:78:42: note: in definition of macro 'unlikely'
      78 | # define unlikely(x) __builtin_expect(!!(x), 0)
         |                                          ^
   drivers/block/virtio_blk.c:807:15: note: each undeclared identifier is reported only once for each function it appears in
     807 |  if (unlikely(partitions_scanning_disable))
         |               ^~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/compiler.h:78:42: note: in definition of macro 'unlikely'
      78 | # define unlikely(x) __builtin_expect(!!(x), 0)
         |                                          ^


vim +/partitions_scanning_disable +807 drivers/block/virtio_blk.c

   707	
   708	static int virtblk_probe(struct virtio_device *vdev)
   709	{
   710		struct virtio_blk *vblk;
   711		struct request_queue *q;
   712		int err, index;
   713	
   714		u32 v, blk_size, max_size, sg_elems, opt_io_size;
   715		u16 min_io_size;
   716		u8 physical_block_exp, alignment_offset;
   717		unsigned int queue_depth;
   718	
   719		if (!vdev->config->get) {
   720			dev_err(&vdev->dev, "%s failure: config access disabled\n",
   721				__func__);
   722			return -EINVAL;
   723		}
   724	
   725		err = ida_simple_get(&vd_index_ida, 0, minor_to_index(1 << MINORBITS),
   726				     GFP_KERNEL);
   727		if (err < 0)
   728			goto out;
   729		index = err;
   730	
   731		/* We need to know how many segments before we allocate. */
   732		err = virtio_cread_feature(vdev, VIRTIO_BLK_F_SEG_MAX,
   733					   struct virtio_blk_config, seg_max,
   734					   &sg_elems);
   735	
   736		/* We need at least one SG element, whatever they say. */
   737		if (err || !sg_elems)
   738			sg_elems = 1;
   739	
   740		/* Prevent integer overflows and honor max vq size */
   741		sg_elems = min_t(u32, sg_elems, VIRTIO_BLK_MAX_SG_ELEMS - 2);
   742	
   743		/* We need extra sg elements at head and tail. */
   744		sg_elems += 2;
   745		vdev->priv = vblk = kmalloc(sizeof(*vblk), GFP_KERNEL);
   746		if (!vblk) {
   747			err = -ENOMEM;
   748			goto out_free_index;
   749		}
   750	
   751		/* This reference is dropped in virtblk_remove(). */
   752		refcount_set(&vblk->refs, 1);
   753		mutex_init(&vblk->vdev_mutex);
   754	
   755		vblk->vdev = vdev;
   756		vblk->sg_elems = sg_elems;
   757	
   758		INIT_WORK(&vblk->config_work, virtblk_config_changed_work);
   759	
   760		err = init_vq(vblk);
   761		if (err)
   762			goto out_free_vblk;
   763	
   764		/* Default queue sizing is to fill the ring. */
   765		if (likely(!virtblk_queue_depth)) {
   766			queue_depth = vblk->vqs[0].vq->num_free;
   767			/* ... but without indirect descs, we use 2 descs per req */
   768			if (!virtio_has_feature(vdev, VIRTIO_RING_F_INDIRECT_DESC))
   769				queue_depth /= 2;
   770		} else {
   771			queue_depth = virtblk_queue_depth;
   772		}
   773	
   774		memset(&vblk->tag_set, 0, sizeof(vblk->tag_set));
   775		vblk->tag_set.ops = &virtio_mq_ops;
   776		vblk->tag_set.queue_depth = queue_depth;
   777		vblk->tag_set.numa_node = NUMA_NO_NODE;
   778		vblk->tag_set.flags = BLK_MQ_F_SHOULD_MERGE;
   779		vblk->tag_set.cmd_size =
   780			sizeof(struct virtblk_req) +
   781			sizeof(struct scatterlist) * sg_elems;
   782		vblk->tag_set.driver_data = vblk;
   783		vblk->tag_set.nr_hw_queues = vblk->num_vqs;
   784	
   785		err = blk_mq_alloc_tag_set(&vblk->tag_set);
   786		if (err)
   787			goto out_free_vq;
   788	
   789		vblk->disk = blk_mq_alloc_disk(&vblk->tag_set, vblk);
   790		if (IS_ERR(vblk->disk)) {
   791			err = PTR_ERR(vblk->disk);
   792			goto out_free_tags;
   793		}
   794		q = vblk->disk->queue;
   795	
   796		virtblk_name_format("vd", index, vblk->disk->disk_name, DISK_NAME_LEN);
   797	
   798		vblk->disk->major = major;
   799		vblk->disk->first_minor = index_to_minor(index);
   800		vblk->disk->minors = 1 << PART_BITS;
   801		vblk->disk->private_data = vblk;
   802		vblk->disk->fops = &virtblk_fops;
   803		vblk->disk->flags |= GENHD_FL_EXT_DEVT;
   804		vblk->index = index;
   805	
   806	#ifdef CONFIG_VIRTIO_BLK_NO_PART_SCAN
 > 807		if (unlikely(partitions_scanning_disable))
   808			/* disable partitions scanning if it was stated in virtio features*/
   809			if (virtio_has_feature(vdev, VIRTIO_BLK_F_NO_PART_SCAN))
   810				vblk->disk->flags |= GENHD_FL_NO_PART_SCAN;
   811	#endif
   812	
   813		/* configure queue flush support */
   814		virtblk_update_cache_mode(vdev);
   815	
   816		/* If disk is read-only in the host, the guest should obey */
   817		if (virtio_has_feature(vdev, VIRTIO_BLK_F_RO))
   818			set_disk_ro(vblk->disk, 1);
   819	
   820		/* We can handle whatever the host told us to handle. */
   821		blk_queue_max_segments(q, vblk->sg_elems-2);
   822	
   823		/* No real sector limit. */
   824		blk_queue_max_hw_sectors(q, -1U);
   825	
   826		max_size = virtio_max_dma_size(vdev);
   827	
   828		/* Host can optionally specify maximum segment size and number of
   829		 * segments. */
   830		err = virtio_cread_feature(vdev, VIRTIO_BLK_F_SIZE_MAX,
   831					   struct virtio_blk_config, size_max, &v);
   832		if (!err)
   833			max_size = min(max_size, v);
   834	
   835		blk_queue_max_segment_size(q, max_size);
   836	
   837		/* Host can optionally specify the block size of the device */
   838		err = virtio_cread_feature(vdev, VIRTIO_BLK_F_BLK_SIZE,
   839					   struct virtio_blk_config, blk_size,
   840					   &blk_size);
   841		if (!err)
   842			blk_queue_logical_block_size(q, blk_size);
   843		else
   844			blk_size = queue_logical_block_size(q);
   845	
   846		/* Use topology information if available */
   847		err = virtio_cread_feature(vdev, VIRTIO_BLK_F_TOPOLOGY,
   848					   struct virtio_blk_config, physical_block_exp,
   849					   &physical_block_exp);
   850		if (!err && physical_block_exp)
   851			blk_queue_physical_block_size(q,
   852					blk_size * (1 << physical_block_exp));
   853	
   854		err = virtio_cread_feature(vdev, VIRTIO_BLK_F_TOPOLOGY,
   855					   struct virtio_blk_config, alignment_offset,
   856					   &alignment_offset);
   857		if (!err && alignment_offset)
   858			blk_queue_alignment_offset(q, blk_size * alignment_offset);
   859	
   860		err = virtio_cread_feature(vdev, VIRTIO_BLK_F_TOPOLOGY,
   861					   struct virtio_blk_config, min_io_size,
   862					   &min_io_size);
   863		if (!err && min_io_size)
   864			blk_queue_io_min(q, blk_size * min_io_size);
   865	
   866		err = virtio_cread_feature(vdev, VIRTIO_BLK_F_TOPOLOGY,
   867					   struct virtio_blk_config, opt_io_size,
   868					   &opt_io_size);
   869		if (!err && opt_io_size)
   870			blk_queue_io_opt(q, blk_size * opt_io_size);
   871	
   872		if (virtio_has_feature(vdev, VIRTIO_BLK_F_DISCARD)) {
   873			q->limits.discard_granularity = blk_size;
   874	
   875			virtio_cread(vdev, struct virtio_blk_config,
   876				     discard_sector_alignment, &v);
   877			q->limits.discard_alignment = v ? v << SECTOR_SHIFT : 0;
   878	
   879			virtio_cread(vdev, struct virtio_blk_config,
   880				     max_discard_sectors, &v);
   881			blk_queue_max_discard_sectors(q, v ? v : UINT_MAX);
   882	
   883			virtio_cread(vdev, struct virtio_blk_config, max_discard_seg,
   884				     &v);
   885			blk_queue_max_discard_segments(q,
   886						       min_not_zero(v,
   887								    MAX_DISCARD_SEGMENTS));
   888	
   889			blk_queue_flag_set(QUEUE_FLAG_DISCARD, q);
   890		}
   891	
   892		if (virtio_has_feature(vdev, VIRTIO_BLK_F_WRITE_ZEROES)) {
   893			virtio_cread(vdev, struct virtio_blk_config,
   894				     max_write_zeroes_sectors, &v);
   895			blk_queue_max_write_zeroes_sectors(q, v ? v : UINT_MAX);
   896		}
   897	
   898		virtblk_update_capacity(vblk, false);
   899		virtio_device_ready(vdev);
   900	
   901		device_add_disk(&vdev->dev, vblk->disk, virtblk_attr_groups);
   902		return 0;
   903	
   904	out_free_tags:
   905		blk_mq_free_tag_set(&vblk->tag_set);
   906	out_free_vq:
   907		vdev->config->del_vqs(vdev);
   908		kfree(vblk->vqs);
   909	out_free_vblk:
   910		kfree(vblk);
   911	out_free_index:
   912		ida_simple_remove(&vd_index_ida, index);
   913	out:
   914		return err;
   915	}
   916	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 64549 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/1] virtio: disable partitions scanning for no partitions block
  2021-07-15  9:47 ` [PATCH 1/1] " Yury Kamenev
  2021-07-15 11:22   ` Paolo Bonzini
  2021-07-16  1:09   ` kernel test robot
@ 2021-07-16  2:57   ` Jason Wang
  2 siblings, 0 replies; 6+ messages in thread
From: Jason Wang @ 2021-07-16  2:57 UTC (permalink / raw)
  To: Yury Kamenev, mst, pbonzini, stefanha, axboe, hch, cand,
	virtualization, linux-block, linux-kernel


在 2021/7/15 下午5:47, Yury Kamenev 写道:
> Signed-off-by: Yury Kamenev <damtev@yandex-team.ru>


I think we need a better commit log here.

And why do we need a Kconfig for this? If there's a good reason, I guess 
the right approach is to invent something in the virtio core (via /sys)?

Thanks


> ---
>   .../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)
>


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 0/1] virtio: disable partitions scanning for no partitions block
@ 2021-05-20 13:39 Yury Kamenev
  0 siblings, 0 replies; 6+ messages in thread
From: Yury Kamenev @ 2021-05-20 13:39 UTC (permalink / raw)
  To: mst, jasowang, pbonzini, stefanha, axboe, virtualization,
	linux-block, linux-kernel
  Cc: Yury Kamenev

Some virtio blocks definitely have no partitions and should not be scanned.

Yury Kamenev (1):
  virtio: disable partitions scanning for no partitions block

 drivers/block/virtio_blk.c      | 6 ++++++
 include/uapi/linux/virtio_blk.h | 1 +
 2 files changed, 7 insertions(+)

-- 
2.24.3 (Apple Git-128)


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2021-07-16  2:58 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-15  9:47 [PATCH 0/1] virtio: disable partitions scanning for no partitions block Yury Kamenev
2021-07-15  9:47 ` [PATCH 1/1] " Yury Kamenev
2021-07-15 11:22   ` Paolo Bonzini
2021-07-16  1:09   ` kernel test robot
2021-07-16  2:57   ` Jason Wang
  -- strict thread matches above, loose matches on Subject: below --
2021-05-20 13:39 [PATCH 0/1] " Yury Kamenev

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).