Add a vmparam.h constant indicating pmap support for large pages.

Enable SHM_LARGEPAGE support on arm64.

Reviewed by:	alc, kib
Sponsored by:	Juniper Networks, Inc., Klara, Inc.
Differential Revision:	https://reviews.freebsd.org/D26467
This commit is contained in:
Mark Johnston 2020-09-23 19:34:21 +00:00
parent 4168aedcde
commit 78257765f2
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=366090
9 changed files with 38 additions and 3 deletions

View file

@ -253,6 +253,11 @@
*/
#define VM_BATCHQUEUE_SIZE 31
/*
* The pmap can create non-transparent large page mappings.
*/
#define PMAP_HAS_LARGEPAGES 1
/*
* Need a page dump array for minidump.
*/

View file

@ -193,6 +193,11 @@ extern vm_offset_t vm_max_kernel_address;
#define DEVMAP_MAX_VADDR ARM_VECTORS_HIGH
/*
* No non-transparent large page support in the pmap.
*/
#define PMAP_HAS_LARGEPAGES 0
/*
* Need a page dump array for minidump.
*/

View file

@ -243,6 +243,11 @@ extern vm_offset_t init_pt_va;
#define DEVMAP_MAX_VADDR VM_MAX_KERNEL_ADDRESS
/*
* The pmap can create non-transparent large page mappings.
*/
#define PMAP_HAS_LARGEPAGES 1
/*
* Need a page dump array for minidump.
*/

View file

@ -240,6 +240,11 @@
#define PHYS_TO_DMAP(x) ({ panic("No direct map exists"); 0; })
#define DMAP_TO_PHYS(x) ({ panic("No direct map exists"); 0; })
/*
* No non-transparent large page support in the pmap.
*/
#define PMAP_HAS_LARGEPAGES 0
/*
* Need a page dump array for minidump.
*/

View file

@ -1067,10 +1067,8 @@ kern_shm_open2(struct thread *td, const char *userpath, int flags, mode_t mode,
return (EINVAL);
largepage = (shmflags & SHM_LARGEPAGE) != 0;
#if !defined(__amd64__)
if (largepage)
if (largepage && !PMAP_HAS_LARGEPAGES)
return (ENOTTY);
#endif
/*
* Currently only F_SEAL_SEAL may be set when creating or opening shmfd.

View file

@ -197,6 +197,11 @@
#define PHYS_TO_DMAP(x) MIPS_PHYS_TO_DIRECT(x)
#define DMAP_TO_PHYS(x) MIPS_DIRECT_TO_PHYS(x)
/*
* No non-transparent large page support in the pmap.
*/
#define PMAP_HAS_LARGEPAGES 0
/*
* Need a page dump array for minidump.
*/

View file

@ -327,4 +327,9 @@ struct pmap_physseg {
KASSERT(hw_direct_map, ("Direct map not provided by PMAP")); \
(x) &~ DMAP_BASE_ADDRESS; })
/*
* No non-transparent large page support in the pmap.
*/
#define PMAP_HAS_LARGEPAGES 0
#endif /* _MACHINE_VMPARAM_H_ */

View file

@ -236,6 +236,11 @@ extern vm_offset_t init_pt_va;
#define DEVMAP_MAX_VADDR VM_MAX_KERNEL_ADDRESS
/*
* No non-transparent large page support in the pmap.
*/
#define PMAP_HAS_LARGEPAGES 0
/*
* Need a page dump array for minidump.
*/

View file

@ -487,6 +487,8 @@ vm_fault_populate(struct faultstate *fs)
* populate only busies the first page in superpage run.
*/
if (bdry_idx != 0) {
KASSERT(PMAP_HAS_LARGEPAGES,
("missing pmap support for large pages"));
m = vm_page_lookup(fs->first_object, pager_first);
vm_fault_populate_check_page(m);
VM_OBJECT_WUNLOCK(fs->first_object);