mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-23 11:18:54 +00:00
sun4v requires TSBs (translation storage buffers) to be contiguous and be
size aligned requiring heavy usage of vm_page_alloc_contig This change makes vm_page_alloc_contig SMP safe Approved by: scottl (acting as backup for mentor rwatson)
This commit is contained in:
parent
5fe4c0e842
commit
600c53adf9
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=163259
@ -398,7 +398,8 @@ vm_page_alloc_contig(vm_pindex_t npages, vm_paddr_t low, vm_paddr_t high,
|
|||||||
vm_page_t pga = vm_page_array;
|
vm_page_t pga = vm_page_array;
|
||||||
static vm_pindex_t np = 0;
|
static vm_pindex_t np = 0;
|
||||||
static vm_pindex_t start = 0;
|
static vm_pindex_t start = 0;
|
||||||
int i, pass, pqtype;
|
vm_pindex_t startl = 0;
|
||||||
|
int i, pass, pqtype;
|
||||||
|
|
||||||
size = npages << PAGE_SHIFT;
|
size = npages << PAGE_SHIFT;
|
||||||
if (size == 0)
|
if (size == 0)
|
||||||
@ -417,6 +418,7 @@ vm_page_alloc_contig(vm_pindex_t npages, vm_paddr_t low, vm_paddr_t high,
|
|||||||
* cached amount.
|
* cached amount.
|
||||||
*/
|
*/
|
||||||
for (pass = 0; pass < 2; pass++) {
|
for (pass = 0; pass < 2; pass++) {
|
||||||
|
vm_page_lock_queues();
|
||||||
if ((np == 0) || (np > npages)) {
|
if ((np == 0) || (np > npages)) {
|
||||||
if (atop(high) < vm_page_array_size)
|
if (atop(high) < vm_page_array_size)
|
||||||
start = atop(high) - npages + 1;
|
start = atop(high) - npages + 1;
|
||||||
@ -424,7 +426,6 @@ vm_page_alloc_contig(vm_pindex_t npages, vm_paddr_t low, vm_paddr_t high,
|
|||||||
start = vm_page_array_size - npages + 1;
|
start = vm_page_array_size - npages + 1;
|
||||||
}
|
}
|
||||||
np = 0;
|
np = 0;
|
||||||
vm_page_lock_queues();
|
|
||||||
retry:
|
retry:
|
||||||
start--;
|
start--;
|
||||||
/*
|
/*
|
||||||
@ -517,12 +518,13 @@ vm_page_alloc_contig(vm_pindex_t npages, vm_paddr_t low, vm_paddr_t high,
|
|||||||
if (vm_contig_unqueue_free(m) != 0)
|
if (vm_contig_unqueue_free(m) != 0)
|
||||||
goto retry_page;
|
goto retry_page;
|
||||||
}
|
}
|
||||||
vm_page_unlock_queues();
|
|
||||||
/*
|
/*
|
||||||
* We've found a contiguous chunk that meets are requirements.
|
* We've found a contiguous chunk that meets are requirements.
|
||||||
*/
|
*/
|
||||||
np = npages;
|
np = npages;
|
||||||
return (&pga[start]);
|
startl = start;
|
||||||
|
vm_page_unlock_queues();
|
||||||
|
return (&pga[startl]);
|
||||||
}
|
}
|
||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user