summaryrefslogtreecommitdiff
path: root/pci-arbiter/main.c
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2022-09-08 09:32:52 +0000
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2022-09-11 21:20:53 +0200
commit22676a3a6e4d99e13ee75c1ad2f4976ae6b0ce52 (patch)
tree166b5a14fa24eb45382c8c03e83279de8007de7f /pci-arbiter/main.c
parentfab864748c2daf57b3fdad7382cba5f9b9d5c9d8 (diff)
machdev, pci-arbiter, rumpdisk: Fix race condition in bootstrap
This fixes a known race condition in bootstrapping by separating the fsys_startup call from the server demuxer loop into two separate functions that the caller can decide when to call. Message-Id: <20220908093229.499494-1-damien@zamaudio.com>
Diffstat (limited to 'pci-arbiter/main.c')
-rw-r--r--pci-arbiter/main.c31
1 files changed, 12 insertions, 19 deletions
diff --git a/pci-arbiter/main.c b/pci-arbiter/main.c
index ec9be796..5e54b2f2 100644
--- a/pci-arbiter/main.c
+++ b/pci-arbiter/main.c
@@ -188,7 +188,7 @@ main (int argc, char **argv)
error_t err;
mach_port_t bootstrap;
mach_port_t next_task;
- pthread_t t, nt;
+ pthread_t t, mt;
file_t underlying_node = MACH_PORT_NULL;
/* Parse options */
@@ -214,7 +214,7 @@ main (int argc, char **argv)
machdev_device_init ();
err = pthread_create (&t, NULL, machdev_server, NULL);
if (err)
- error (1, err, "Creating machdev thread");
+ error (1, err, "Creating machdev_server thread");
pthread_detach (t);
}
else
@@ -238,17 +238,7 @@ main (int argc, char **argv)
error (1, err, "Starting the PCI system");
if (next_task != MACH_PORT_NULL)
- {
- void *run_server(void *arg) {
- machdev_trivfs_server(bootstrap);
- return NULL;
- }
-
- pthread_t t;
- pthread_create(&t, NULL, run_server, NULL);
- pthread_detach(t);
- /* Timer started, quickly do all these next, before we call rump_init */
- }
+ machdev_trivfs_server_startup (bootstrap);
if (next_task == MACH_PORT_NULL)
underlying_node = netfs_startup (bootstrap, O_READ);
@@ -275,13 +265,16 @@ main (int argc, char **argv)
if (err)
error (1, err, "Setting permissions");
- err = pthread_create (&nt, NULL, netfs_server_func, NULL);
- if (err)
- error (1, err, "Creating netfs loop thread");
- pthread_detach (nt);
+ if (next_task != MACH_PORT_NULL)
+ {
+ err = pthread_create(&mt, NULL, machdev_trivfs_server_loop, NULL);
+ if (err)
+ error(1, err, "Creating machdev_trivfs_server_loop thread");
+ pthread_detach(mt);
+ }
+
+ netfs_server_func (NULL);
- /* Let the other threads do their job */
- pthread_exit(NULL);
/* Never reached */
return 0;
}