Applied, thanks!

Milos Nikic, le mar. 27 janv. 2026 12:01:00 -0800, a ecrit:
> Currently, rumpdisk initializes the Rump kernel and probes the PCI bus 
> immediately during main(). When rumpdisk is configured as a passive 
> translator (e.g., for /dev/rumpusbdisk), a simple stat or ls on the node 
> triggers translator startup. This causes a second Rump instance to attempt to 
> probe hardware already owned by the primary disk driver, leading to a 
> system-wide deadlock.
> 
> To reproduce:
> stat /dev/rumpdiskusb
> (rump starts again ... deadlock)
> 
> With this patch:
> stat /dev/rumpdiskusb
> (normal printout of stats, no deadlock)
> ---
>  rumpdisk/main.c | 14 +++++++++++++-
>  1 file changed, 13 insertions(+), 1 deletion(-)
> 
> diff --git a/rumpdisk/main.c b/rumpdisk/main.c
> index 3676b472..0bd753e2 100644
> --- a/rumpdisk/main.c
> +++ b/rumpdisk/main.c
> @@ -40,6 +40,15 @@
>  
>  mach_port_t bootstrap_resume_task = MACH_PORT_NULL;
>  
> +static pthread_once_t rump_hw_initialized = PTHREAD_ONCE_INIT;
> +
> +static void
> +do_rump_hw_init (void)
> +{
> +  mach_print("rumpdisk: Initializing Rump block device layer...\n");
> +  rump_register_block ();
> +}
> +
>  static const struct argp_option options[] = {
>    {"host-priv-port", 'h', "PORT", 0, "Host private port PORT"},
>    {"device-master-port",'d', "PORT", 0, "Device master port PORT"},
> @@ -102,6 +111,7 @@ static const struct argp *rumpdisk_argp_bootup = 
> &rumpdisk_argp;
>  static int __thread wired = 0;
>  static int rumpdisk_demuxer (mach_msg_header_t *inp, mach_msg_header_t *outp)
>  {
> +  pthread_once (&rump_hw_initialized, do_rump_hw_init);
>    /* FIXME: we are not wired while receiving our first message.  */
>    if (!wired)
>      {
> @@ -150,7 +160,6 @@ main (int argc, char **argv)
>        error(1, err, "Missing parameters for bootstrap");
>      }
>  
> -  rump_register_block ();
>    machdev_trivfs_init (argc, argv, bootstrap_resume_task, RUMPNAME, "/dev/" 
> RUMPNAME, &bootstrap);
>  
>    /* Make sure we will not swap out, in case we drive the disk used for
> @@ -162,6 +171,9 @@ main (int argc, char **argv)
>    if (err != KERN_SUCCESS)
>      error (1, err, "cannot get vm_privilege");
>  
> +  if (bootstrap_resume_task != MACH_PORT_NULL)
> +    pthread_once (&rump_hw_initialized, do_rump_hw_init);
> +
>    machdev_device_init ();
>    err = pthread_create (&t, NULL, rumpdisk_multithread_server, NULL);
>    if (err)
> -- 
> 2.52.0
> 
> 

-- 
Samuel
quit   When the quit statement is read, the  bc  processor
       is  terminated, regardless of where the quit state-
       ment is found.  For example, "if  (0  ==  1)  quit"
       will cause bc to terminate.
(Seen in the manpage for "bc". Note the "if" statement's logic)

Reply via email to