It seems like i mistyped in reproduction steps... The easiest way to deadlock is just to do this inside the live Hurd
stat /dev/rumpusbdisk With this patch, that won't be happening any more Thanks, Milos On Tue, Jan 27, 2026 at 12:01 PM Milos Nikic <[email protected]> wrote: > 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 > >
