All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mike Snitzer <snitzer@redhat.com>
To: Peter Korsgaard <peter@korsgaard.com>
Cc: Jonathan Corbet <corbet@lwn.net>,
	Mike Snitzer <snitzer@kernel.org>,
	dm-devel@redhat.com, fabio.aiuto@amarulasolutions.com,
	Helen Koike <helen.koike@collabora.com>,
	michael@amarulasolutions.com
Subject: Re: [dm-devel] [PATCH v2] dm init: add dm-mod.waitfor to wait for asynchronously probed block devices
Date: Wed, 30 Nov 2022 18:07:46 -0500	[thread overview]
Message-ID: <Y4fiQvg9OOATD5Cv@redhat.com> (raw)
In-Reply-To: <877czkhc7u.fsf@dell.be.48ers.dk>

On Thu, Nov 24 2022 at  5:35P -0500,
Peter Korsgaard <peter@korsgaard.com> wrote:

> >>>>> "Peter" == Peter Korsgaard <peter@korsgaard.com> writes:
> 
>  > Just calling wait_for_device_probe() is not enough to ensure that
>  > asynchronously probed block devices are available (E.G.  mmc, usb, ..), so
>  > add a "dm-mod.waitfor=<device1>[,..,<deviceN>]" parameter to get dm-init to
>  > explicitly wait for specific block devices before initializing the tables
>  > with logic similar to the rootwait logic in init/do_mounts.c.
> 
>  > E.G. with dm-verity on mmc with
>  > dm-mod.waitfor="PARTLABEL=hash-a,PARTLABEL=root-a"
> 
>  > [    0.671671] device-mapper: init: waiting for all devices to be available before creating mapped devices
>  > [    0.671679] device-mapper: init: waiting for PARTLABEL=hash-a
>  > [    0.710695] mmc0: new HS200 MMC card at address 0001
>  > [    0.711158] mmcblk0: mmc0:0001 004GA0 3.69 GiB
>  > [    0.715954] mmcblk0boot0: mmc0:0001 004GA0 partition 1 2.00 MiB
>  > [    0.722085] mmcblk0boot1: mmc0:0001 004GA0 partition 2 2.00 MiB
>  > [    0.728093] mmcblk0rpmb: mmc0:0001 004GA0 partition 3 512 KiB, chardev (249:0)
>  > [    0.738274]  mmcblk0: p1 p2 p3 p4 p5 p6 p7
>  > [    0.751282] device-mapper: init: waiting for PARTLABEL=root-a
>  > [    0.751306] device-mapper: init: all devices available
>  > [    0.751683] device-mapper: verity: sha256 using implementation "sha256-generic"
>  > [    0.759344] device-mapper: ioctl: dm-0 (vroot) is ready
>  > [    0.766540] VFS: Mounted root (squashfs filesystem) readonly on device 254:0.
> 
>  > Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
>  > ---
>  > Changes since v1:
>  > - Fix s/dm-init/dm-mod/ typo in documentation, drop trailing newline
> 
> Ping?
> 
> FYI: I was recently made aware that other patches fixing this issue
> (but less nice, E.G. with a fixed delay) have been posted in the past,
> so there seems to be a general need for something like this.
> 
> E.G:
> https://lore.kernel.org/all/20220406154631.277107-1-fabio.aiuto@amarulasolutions.com/
> 
> 
> 
>  >  .../admin-guide/device-mapper/dm-init.rst     |  8 +++++++
>  >  drivers/md/dm-init.c                          | 23 ++++++++++++++++++-
>  >  2 files changed, 30 insertions(+), 1 deletion(-)
> 
>  > diff --git a/Documentation/admin-guide/device-mapper/dm-init.rst b/Documentation/admin-guide/device-mapper/dm-init.rst
>  > index e5242ff17e9b..981d6a907699 100644
>  > --- a/Documentation/admin-guide/device-mapper/dm-init.rst
>  > +++ b/Documentation/admin-guide/device-mapper/dm-init.rst
>  > @@ -123,3 +123,11 @@ Other examples (per target):
>  >      0 1638400 verity 1 8:1 8:2 4096 4096 204800 1 sha256
>  >      fb1a5a0f00deb908d8b53cb270858975e76cf64105d412ce764225d53b8f3cfd
>  >      51934789604d1b92399c52e7cb149d1b3a1b74bbbcb103b2a0aaacbed5c08584
>  > +
>  > +For setups using device-mapper on top of asynchronously probed block
>  > +devices (MMC, USB, ..), it may be necessary to tell dm-init to
>  > +explicitly wait for them to become available before setting up the
>  > +device-mapper tables. This can be done with the "dm-mod.waitfor="
>  > +module parameter, which takes a list of devices to wait for::
>  > +
>  > +  dm-mod.waitfor=<device1>[,..,<deviceN>]
>  > diff --git a/drivers/md/dm-init.c b/drivers/md/dm-init.c
>  > index b0c45c6ebe0b..fc70b568e072 100644
>  > --- a/drivers/md/dm-init.c
>  > +++ b/drivers/md/dm-init.c
>  > @@ -8,6 +8,7 @@
>  >   */
>  
>  >  #include <linux/ctype.h>
>  > +#include <linux/delay.h>
>  >  #include <linux/device.h>
>  >  #include <linux/device-mapper.h>
>  >  #include <linux/init.h>
>  > @@ -18,12 +19,17 @@
>  >  #define DM_MAX_DEVICES 256
>  >  #define DM_MAX_TARGETS 256
>  >  #define DM_MAX_STR_SIZE 4096
>  > +#define DM_MAX_WAITFOR 256
>  
>  >  static char *create;
>  
>  > +static char *waitfor[DM_MAX_WAITFOR];
>  > +
>  >  /*
>  >   * Format: dm-mod.create=<name>,<uuid>,<minor>,<flags>,<table>[,<table>+][;<name>,<uuid>,<minor>,<flags>,<table>[,<table>+]+]
>  >   * Table format: <start_sector> <num_sectors> <target_type> <target_args>
>  > + * Block devices to wait for to become available before setting up tables:
>  > + * dm-mod.waitfor=<device1>[,..,<deviceN>]
>  >   *
>  >   * See Documentation/admin-guide/device-mapper/dm-init.rst for dm-mod.create="..." format
>  >   * details.
>  > @@ -266,7 +272,7 @@ static int __init dm_init_init(void)
>  >  	struct dm_device *dev;
>  >  	LIST_HEAD(devices);
>  >  	char *str;
>  > -	int r;
>  > +	int i, r;
>  
>  >  	if (!create)
>  >  		return 0;
>  > @@ -286,6 +292,18 @@ static int __init dm_init_init(void)
>  >  	DMINFO("waiting for all devices to be available before creating mapped devices");
>  >  	wait_for_device_probe();
>  
>  > +	for (i = 0; i < ARRAY_SIZE(waitfor); i++) {
>  > +		if (waitfor[i]) {
>  > +			DMINFO("waiting for %s", waitfor[i]);
>  > +
>  > +			while (!dm_get_dev_t(waitfor[i]))
>  > +				msleep(20);
>  > +		}
>  > +	}
>  > +
>  > +	if (waitfor[0])
>  > +		DMINFO("all devices available");
>  > +

Why 20?  Also, why is waiting indefinitely OK?  Would really like to
hear from other consumers of dm-init that this module param is useful
and needed.

Mike


>  >  	list_for_each_entry(dev, &devices, list) {
>  >  		if (dm_early_create(&dev->dmi, dev->table,
>  dev-> target_args_array))
>  > @@ -301,3 +319,6 @@ late_initcall(dm_init_init);
>  
>  >  module_param(create, charp, 0);
>  >  MODULE_PARM_DESC(create, "Create a mapped device in early boot");
>  > +
>  > +module_param_array(waitfor, charp, NULL, 0);
>  > +MODULE_PARM_DESC(waitfor, "Devices to wait for before setting up tables");
>  > -- 
> 
>  > 2.30.2
> 
> 
> -- 
> Bye, Peter Korsgaard
> 


--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


  reply	other threads:[~2022-11-30 23:35 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-16  6:16 [dm-devel] [PATCH v2] dm init: add dm-mod.waitfor to wait for asynchronously probed block devices Peter Korsgaard
2022-11-24 10:35 ` Peter Korsgaard
2022-11-30 23:07   ` Mike Snitzer [this message]
2022-12-01  7:28     ` Peter Korsgaard
2022-12-01 16:13       ` Mike Snitzer
2022-12-01 16:38         ` Peter Korsgaard
2022-12-02  6:44           ` Mike Snitzer
2022-12-02  6:51             ` Peter Korsgaard

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Y4fiQvg9OOATD5Cv@redhat.com \
    --to=snitzer@redhat.com \
    --cc=corbet@lwn.net \
    --cc=dm-devel@redhat.com \
    --cc=fabio.aiuto@amarulasolutions.com \
    --cc=helen.koike@collabora.com \
    --cc=michael@amarulasolutions.com \
    --cc=peter@korsgaard.com \
    --cc=snitzer@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.