NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
re: kern/49709: radeondrmkms panic if "/dev/" is on NFS root
The following reply was made to PR kern/49709; it has been noted by GNATS.
From: matthew green <mrg%eterna.com.au@localhost>
To: gnats-bugs%NetBSD.org@localhost
Cc: kern-bug-people%netbsd.org@localhost, gnats-admin%netbsd.org@localhost,
netbsd-bugs%netbsd.org@localhost
Subject: re: kern/49709: radeondrmkms panic if "/dev/" is on NFS root
Date: Mon, 02 Mar 2015 16:29:31 +1100
> >Synopsis: radeondrmkms panic if "/dev/" is on NFS root
actually, it's a timing issue, not NFS root related.
the problem is that /sbin/init is allowed to run as soon as mountroot
completes, but before the paused configuration threads complete their
task and in this case, the radeondrmkms driver has not gotten to
attaching a wsdisplay0 and taking over the console.
fortunately, we have working fixes for this, and are just trying to
figure out which is the best. one that i've tested that work is
below.
.mrg.
Index: sys/device.h
===================================================================
RCS file: /cvsroot/src/sys/sys/device.h,v
retrieving revision 1.146
diff -p -u -r1.146 device.h
--- sys/device.h 22 Nov 2014 11:04:57 -0000 1.146
+++ sys/device.h 1 Mar 2015 13:02:53 -0000
@@ -479,6 +479,7 @@ void config_create_mountrootthreads(void
int config_finalize_register(device_t, int (*)(device_t));
void config_finalize(void);
+void config_finalize_mountroot(void);
void config_twiddle_init(void);
void config_twiddle_fn(void *);
Index: kern/init_main.c
===================================================================
RCS file: /cvsroot/src/sys/kern/init_main.c,v
retrieving revision 1.461
diff -p -u -r1.461 init_main.c
--- kern/init_main.c 27 Nov 2014 14:38:09 -0000 1.461
+++ kern/init_main.c 1 Mar 2015 13:02:53 -0000
@@ -712,6 +712,9 @@ main(void)
uvm_aiodone_worker, NULL, PRI_VM, IPL_NONE, WQ_MPSAFE))
panic("fork aiodoned");
+ /* Wait for final configure threads to complete. */
+ config_finalize_mountroot();
+
/*
* Okay, now we can let init(8) exec! It's off to userland!
*/
Index: kern/subr_autoconf.c
===================================================================
RCS file: /cvsroot/src/sys/kern/subr_autoconf.c,v
retrieving revision 1.233
diff -p -u -r1.233 subr_autoconf.c
--- kern/subr_autoconf.c 6 Nov 2014 08:46:04 -0000 1.233
+++ kern/subr_autoconf.c 1 Mar 2015 13:02:53 -0000
@@ -202,6 +202,7 @@ int interrupt_config_threads = 8;
struct deferred_config_head mountroot_config_queue =
TAILQ_HEAD_INITIALIZER(mountroot_config_queue);
int mountroot_config_threads = 2;
+lwp_t **mountroot_config_lwpids;
static bool root_is_mounted = false;
static void config_process_deferred(struct deferred_config_head *, device_t);
@@ -481,9 +482,32 @@ config_create_mountrootthreads(void)
if (!root_is_mounted)
root_is_mounted = true;
+ mountroot_config_lwpids = kmem_alloc(sizeof(mountroot_config_lwpids) *
+ mountroot_config_threads,
+ KM_NOSLEEP);
+ KASSERT(mountroot_config_lwpids);
for (i = 0; i < mountroot_config_threads; i++) {
- (void)kthread_create(PRI_NONE, 0, NULL,
- config_mountroot_thread, NULL, NULL, "configroot");
+ mountroot_config_lwpids[i] = 0;
+ (void)kthread_create(PRI_NONE, KTHREAD_MUSTJOIN, NULL,
+ config_mountroot_thread, NULL,
+ &mountroot_config_lwpids[i],
+ "configroot");
+ }
+}
+
+void
+config_finalize_mountroot(void)
+{
+ int i, error;
+
+ for (i = 0; i < mountroot_config_threads; i++) {
+ if (mountroot_config_lwpids[i] == 0)
+ continue;
+
+ error = kthread_join(mountroot_config_lwpids[i]);
+ if (error)
+ printf("%s: thread %x joined with error %d\n",
+ __func__, i, error);
}
}
Home |
Main Index |
Thread Index |
Old Index