FPU init: Do potentially blocking operations before disabling interrupts
In particular, uma_zcreate creates sysctl oids, which locks an sx lock, which uses IPIs under contention. IPIs tend not to work very well when interrupts are disabled. Who knew, right? Reviewed by: cem kib MFC after: 2 weeks Sponsored by: Dell EMC Isilon Differential Revision: https://reviews.freebsd.org/D25098
This commit is contained in:
parent
f092a3c71c
commit
674cbe7908
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=362119
@ -368,8 +368,18 @@ fpuinitstate(void *arg __unused)
|
|||||||
register_t saveintr;
|
register_t saveintr;
|
||||||
int cp[4], i, max_ext_n;
|
int cp[4], i, max_ext_n;
|
||||||
|
|
||||||
|
/* Do potentially blocking operations before disabling interrupts. */
|
||||||
|
fpu_save_area_zone = uma_zcreate("FPU_save_area",
|
||||||
|
cpu_max_ext_state_size, NULL, NULL, NULL, NULL,
|
||||||
|
XSAVE_AREA_ALIGN - 1, 0);
|
||||||
fpu_initialstate = malloc(cpu_max_ext_state_size, M_DEVBUF,
|
fpu_initialstate = malloc(cpu_max_ext_state_size, M_DEVBUF,
|
||||||
M_WAITOK | M_ZERO);
|
M_WAITOK | M_ZERO);
|
||||||
|
if (use_xsave) {
|
||||||
|
max_ext_n = flsl(xsave_mask);
|
||||||
|
xsave_area_desc = malloc(max_ext_n * sizeof(struct
|
||||||
|
xsave_area_elm_descr), M_DEVBUF, M_WAITOK | M_ZERO);
|
||||||
|
}
|
||||||
|
|
||||||
saveintr = intr_disable();
|
saveintr = intr_disable();
|
||||||
stop_emulating();
|
stop_emulating();
|
||||||
|
|
||||||
@ -399,9 +409,6 @@ fpuinitstate(void *arg __unused)
|
|||||||
offsetof(struct xstate_hdr, xstate_bv));
|
offsetof(struct xstate_hdr, xstate_bv));
|
||||||
*xstate_bv = XFEATURE_ENABLED_X87 | XFEATURE_ENABLED_SSE;
|
*xstate_bv = XFEATURE_ENABLED_X87 | XFEATURE_ENABLED_SSE;
|
||||||
|
|
||||||
max_ext_n = flsl(xsave_mask);
|
|
||||||
xsave_area_desc = malloc(max_ext_n * sizeof(struct
|
|
||||||
xsave_area_elm_descr), M_DEVBUF, M_WAITOK | M_ZERO);
|
|
||||||
/* x87 state */
|
/* x87 state */
|
||||||
xsave_area_desc[0].offset = 0;
|
xsave_area_desc[0].offset = 0;
|
||||||
xsave_area_desc[0].size = 160;
|
xsave_area_desc[0].size = 160;
|
||||||
@ -416,10 +423,6 @@ fpuinitstate(void *arg __unused)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fpu_save_area_zone = uma_zcreate("FPU_save_area",
|
|
||||||
cpu_max_ext_state_size, NULL, NULL, NULL, NULL,
|
|
||||||
XSAVE_AREA_ALIGN - 1, 0);
|
|
||||||
|
|
||||||
start_emulating();
|
start_emulating();
|
||||||
intr_restore(saveintr);
|
intr_restore(saveintr);
|
||||||
}
|
}
|
||||||
|
@ -479,8 +479,21 @@ npxinitstate(void *arg __unused)
|
|||||||
if (!hw_float)
|
if (!hw_float)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* Do potentially blocking operations before disabling interrupts. */
|
||||||
|
fpu_save_area_zone = uma_zcreate("FPU_save_area",
|
||||||
|
cpu_max_ext_state_size, NULL, NULL, NULL, NULL,
|
||||||
|
XSAVE_AREA_ALIGN - 1, 0);
|
||||||
npx_initialstate = malloc(cpu_max_ext_state_size, M_DEVBUF,
|
npx_initialstate = malloc(cpu_max_ext_state_size, M_DEVBUF,
|
||||||
M_WAITOK | M_ZERO);
|
M_WAITOK | M_ZERO);
|
||||||
|
if (use_xsave) {
|
||||||
|
if (xsave_mask >> 32 != 0)
|
||||||
|
max_ext_n = fls(xsave_mask >> 32) + 32;
|
||||||
|
else
|
||||||
|
max_ext_n = fls(xsave_mask);
|
||||||
|
xsave_area_desc = malloc(max_ext_n * sizeof(struct
|
||||||
|
xsave_area_elm_descr), M_DEVBUF, M_WAITOK | M_ZERO);
|
||||||
|
}
|
||||||
|
|
||||||
saveintr = intr_disable();
|
saveintr = intr_disable();
|
||||||
stop_emulating();
|
stop_emulating();
|
||||||
|
|
||||||
@ -522,12 +535,6 @@ npxinitstate(void *arg __unused)
|
|||||||
offsetof(struct xstate_hdr, xstate_bv));
|
offsetof(struct xstate_hdr, xstate_bv));
|
||||||
*xstate_bv = XFEATURE_ENABLED_X87 | XFEATURE_ENABLED_SSE;
|
*xstate_bv = XFEATURE_ENABLED_X87 | XFEATURE_ENABLED_SSE;
|
||||||
|
|
||||||
if (xsave_mask >> 32 != 0)
|
|
||||||
max_ext_n = fls(xsave_mask >> 32) + 32;
|
|
||||||
else
|
|
||||||
max_ext_n = fls(xsave_mask);
|
|
||||||
xsave_area_desc = malloc(max_ext_n * sizeof(struct
|
|
||||||
xsave_area_elm_descr), M_DEVBUF, M_WAITOK | M_ZERO);
|
|
||||||
/* x87 state */
|
/* x87 state */
|
||||||
xsave_area_desc[0].offset = 0;
|
xsave_area_desc[0].offset = 0;
|
||||||
xsave_area_desc[0].size = 160;
|
xsave_area_desc[0].size = 160;
|
||||||
@ -542,10 +549,6 @@ npxinitstate(void *arg __unused)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fpu_save_area_zone = uma_zcreate("FPU_save_area",
|
|
||||||
cpu_max_ext_state_size, NULL, NULL, NULL, NULL,
|
|
||||||
XSAVE_AREA_ALIGN - 1, 0);
|
|
||||||
|
|
||||||
start_emulating();
|
start_emulating();
|
||||||
intr_restore(saveintr);
|
intr_restore(saveintr);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user