Remove Giant from init creation and vfs_mountroot.

Sponsored by: Netflix
Discussed with: kib@, mckusick@
Differential Review: https://reviews.freebsd.org/D14712
This commit is contained in:
Warner Losh 2018-03-21 14:46:54 +00:00
parent 30b3274fff
commit d5292812f8
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=331294
3 changed files with 4 additions and 20 deletions

View File

@ -703,10 +703,6 @@ start_init(void *dummy)
struct thread *td;
struct proc *p;
mtx_lock(&Giant);
GIANT_REQUIRED;
TSENTER(); /* Here so we don't overlap with mi_startup. */
td = curthread;
@ -801,7 +797,6 @@ start_init(void *dummy)
* to user mode as init!
*/
if ((error = sys_execve(td, &args)) == EJUSTRETURN) {
mtx_unlock(&Giant);
TSEXIT();
return;
}

View File

@ -268,13 +268,10 @@ sys_reboot(struct thread *td, struct reboot_args *uap)
if (error == 0)
error = priv_check(td, PRIV_REBOOT);
if (error == 0) {
if (uap->opt & RB_REROOT) {
if (uap->opt & RB_REROOT)
error = kern_reroot();
} else {
mtx_lock(&Giant);
else
kern_reboot(uap->opt);
mtx_unlock(&Giant);
}
}
return (error);
}

View File

@ -579,9 +579,7 @@ parse_dir_md(char **conf)
if (root_mount_mddev != -1) {
mdio->md_unit = root_mount_mddev;
DROP_GIANT();
error = kern_ioctl(td, fd, MDIOCDETACH, (void *)mdio);
PICKUP_GIANT();
/* Ignore errors. We don't care. */
root_mount_mddev = -1;
}
@ -590,9 +588,7 @@ parse_dir_md(char **conf)
mdio->md_options = MD_AUTOUNIT | MD_READONLY;
mdio->md_mediasize = sb.st_size;
mdio->md_unit = 0;
DROP_GIANT();
error = kern_ioctl(td, fd, MDIOCATTACH, (void *)mdio);
PICKUP_GIANT();
if (error)
goto out;
@ -601,9 +597,7 @@ parse_dir_md(char **conf)
mdio->md_file = NULL;
mdio->md_options = 0;
mdio->md_mediasize = 0;
DROP_GIANT();
error = kern_ioctl(td, fd, MDIOCDETACH, (void *)mdio);
PICKUP_GIANT();
/* Ignore errors. We don't care. */
error = ERANGE;
goto out;
@ -960,9 +954,7 @@ vfs_mountroot_wait(void)
curfail = 0;
while (1) {
DROP_GIANT();
g_waitidle();
PICKUP_GIANT();
mtx_lock(&root_holds_mtx);
if (LIST_EMPTY(&root_holds)) {
mtx_unlock(&root_holds_mtx);
@ -1004,9 +996,7 @@ vfs_mountroot_wait_if_neccessary(const char *fs, const char *dev)
* Note that we must wait for GEOM to finish reconfiguring itself,
* eg for geom_part(4) to finish tasting.
*/
DROP_GIANT();
g_waitidle();
PICKUP_GIANT();
if (parse_mount_dev_present(dev))
return (0);
@ -1038,6 +1028,8 @@ vfs_mountroot(void)
time_t timebase;
int error;
mtx_assert(&Giant, MA_NOTOWNED);
TSENTER();
td = curthread;