mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-20 23:35:02 +00:00
Don't dink with interrupts in vm_page_zero_idle(). This code assumed it
was being called with interrupts disabled, when it was actually being called with them enabled. Pointed out by: tegge
This commit is contained in:
parent
3c884b5097
commit
a555b1468d
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=67477
|
@ -542,7 +542,7 @@ vm_page_zero_idle()
|
||||||
static int free_rover;
|
static int free_rover;
|
||||||
static int zero_state;
|
static int zero_state;
|
||||||
vm_page_t m;
|
vm_page_t m;
|
||||||
int s, intrsave;
|
int s;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Attempt to maintain approximately 1/2 of our free pages in a
|
* Attempt to maintain approximately 1/2 of our free pages in a
|
||||||
|
@ -560,8 +560,6 @@ vm_page_zero_idle()
|
||||||
|
|
||||||
if (mtx_try_enter(&Giant, MTX_DEF)) {
|
if (mtx_try_enter(&Giant, MTX_DEF)) {
|
||||||
s = splvm();
|
s = splvm();
|
||||||
intrsave = save_intr();
|
|
||||||
enable_intr();
|
|
||||||
zero_state = 0;
|
zero_state = 0;
|
||||||
m = vm_page_list_find(PQ_FREE, free_rover, FALSE);
|
m = vm_page_list_find(PQ_FREE, free_rover, FALSE);
|
||||||
if (m != NULL && (m->flags & PG_ZERO) == 0) {
|
if (m != NULL && (m->flags & PG_ZERO) == 0) {
|
||||||
|
@ -583,16 +581,9 @@ vm_page_zero_idle()
|
||||||
}
|
}
|
||||||
free_rover = (free_rover + PQ_PRIME2) & PQ_L2_MASK;
|
free_rover = (free_rover + PQ_PRIME2) & PQ_L2_MASK;
|
||||||
splx(s);
|
splx(s);
|
||||||
restore_intr(intrsave);
|
|
||||||
mtx_exit(&Giant, MTX_DEF);
|
mtx_exit(&Giant, MTX_DEF);
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
* We have to enable interrupts for a moment if the try_mplock fails
|
|
||||||
* in order to potentially take an IPI. XXX this should be in
|
|
||||||
* swtch.s
|
|
||||||
*/
|
|
||||||
__asm __volatile("sti; nop; cli" : : : "memory");
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -542,7 +542,7 @@ vm_page_zero_idle()
|
||||||
static int free_rover;
|
static int free_rover;
|
||||||
static int zero_state;
|
static int zero_state;
|
||||||
vm_page_t m;
|
vm_page_t m;
|
||||||
int s, intrsave;
|
int s;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Attempt to maintain approximately 1/2 of our free pages in a
|
* Attempt to maintain approximately 1/2 of our free pages in a
|
||||||
|
@ -560,8 +560,6 @@ vm_page_zero_idle()
|
||||||
|
|
||||||
if (mtx_try_enter(&Giant, MTX_DEF)) {
|
if (mtx_try_enter(&Giant, MTX_DEF)) {
|
||||||
s = splvm();
|
s = splvm();
|
||||||
intrsave = save_intr();
|
|
||||||
enable_intr();
|
|
||||||
zero_state = 0;
|
zero_state = 0;
|
||||||
m = vm_page_list_find(PQ_FREE, free_rover, FALSE);
|
m = vm_page_list_find(PQ_FREE, free_rover, FALSE);
|
||||||
if (m != NULL && (m->flags & PG_ZERO) == 0) {
|
if (m != NULL && (m->flags & PG_ZERO) == 0) {
|
||||||
|
@ -583,16 +581,9 @@ vm_page_zero_idle()
|
||||||
}
|
}
|
||||||
free_rover = (free_rover + PQ_PRIME2) & PQ_L2_MASK;
|
free_rover = (free_rover + PQ_PRIME2) & PQ_L2_MASK;
|
||||||
splx(s);
|
splx(s);
|
||||||
restore_intr(intrsave);
|
|
||||||
mtx_exit(&Giant, MTX_DEF);
|
mtx_exit(&Giant, MTX_DEF);
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
* We have to enable interrupts for a moment if the try_mplock fails
|
|
||||||
* in order to potentially take an IPI. XXX this should be in
|
|
||||||
* swtch.s
|
|
||||||
*/
|
|
||||||
__asm __volatile("sti; nop; cli" : : : "memory");
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue