Module Name: src
Committed By: thorpej
Date: Sun May 30 01:24:19 UTC 2021
Modified Files:
src/sys/arch/alpha/alpha: pmap.c
Log Message:
Change pmap_physpage_alloc() to return the vm_page * so that the
callers have access to it.
To generate a diff of this commit:
cvs rdiff -u -r1.282 -r1.283 src/sys/arch/alpha/alpha/pmap.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/alpha/alpha/pmap.c
diff -u src/sys/arch/alpha/alpha/pmap.c:1.282 src/sys/arch/alpha/alpha/pmap.c:1.283
--- src/sys/arch/alpha/alpha/pmap.c:1.282 Sun May 30 00:34:27 2021
+++ src/sys/arch/alpha/alpha/pmap.c Sun May 30 01:24:19 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.282 2021/05/30 00:34:27 thorpej Exp $ */
+/* $NetBSD: pmap.c,v 1.283 2021/05/30 01:24:19 thorpej Exp $ */
/*-
* Copyright (c) 1998, 1999, 2000, 2001, 2007, 2008, 2020
@@ -135,7 +135,7 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.282 2021/05/30 00:34:27 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.283 2021/05/30 01:24:19 thorpej Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -1162,7 +1162,7 @@ static u_int pmap_asn_alloc(pmap_t, stru
/*
* Misc. functions.
*/
-static bool pmap_physpage_alloc(int, paddr_t *);
+static struct vm_page *pmap_physpage_alloc(int);
static void pmap_physpage_free(paddr_t);
static int pmap_physpage_addref(void *);
static int pmap_physpage_delref(void *);
@@ -3349,11 +3349,11 @@ pmap_pv_remove(pmap_t pmap, struct vm_pa
static void *
pmap_pv_page_alloc(struct pool *pp, int flags)
{
- paddr_t pg;
-
- if (pmap_physpage_alloc(PGU_PVENT, &pg))
- return ((void *)ALPHA_PHYS_TO_K0SEG(pg));
- return (NULL);
+ struct vm_page * const pg = pmap_physpage_alloc(PGU_PVENT);
+ if (__predict_false(pg == NULL)) {
+ return NULL;
+ }
+ return (void *)ALPHA_PHYS_TO_K0SEG(VM_PAGE_TO_PHYS(pg));
}
/*
@@ -3376,11 +3376,10 @@ pmap_pv_page_free(struct pool *pp, void
* Allocate a single page from the VM system and return the
* physical address for that page.
*/
-static bool
-pmap_physpage_alloc(int usage, paddr_t *pap)
+static struct vm_page *
+pmap_physpage_alloc(int usage)
{
struct vm_page *pg;
- paddr_t pa;
/*
* Don't ask for a zero'd page in the L1PT case -- we will
@@ -3390,7 +3389,6 @@ pmap_physpage_alloc(int usage, paddr_t *
pg = uvm_pagealloc(NULL, 0, NULL, usage == PGU_L1PT ?
UVM_PGA_USERESERVE : UVM_PGA_USERESERVE|UVM_PGA_ZERO);
if (pg != NULL) {
- pa = VM_PAGE_TO_PHYS(pg);
#ifdef DEBUG
struct vm_page_md * const md = VM_PAGE_TO_MD(pg);
if (md->pvh_refcnt != 0) {
@@ -3399,10 +3397,8 @@ pmap_physpage_alloc(int usage, paddr_t *
panic("pmap_physpage_alloc");
}
#endif
- *pap = pa;
- return (true);
}
- return (false);
+ return pg;
}
/*
@@ -3485,7 +3481,12 @@ pmap_kptpage_alloc(paddr_t *pap)
return true;
}
- return pmap_physpage_alloc(PGU_NORMAL, pap);
+ struct vm_page * const pg = pmap_physpage_alloc(PGU_NORMAL);
+ if (__predict_true(pg != NULL)) {
+ *pap = VM_PAGE_TO_PHYS(pg);
+ return true;
+ }
+ return false;
}
/*
@@ -3620,15 +3621,14 @@ pmap_l1pt_ctor(void *arg, void *object,
static void *
pmap_l1pt_alloc(struct pool *pp, int flags)
{
- paddr_t ptpa;
-
/*
* Attempt to allocate a free page.
*/
- if (pmap_physpage_alloc(PGU_L1PT, &ptpa) == false)
- return (NULL);
-
- return ((void *) ALPHA_PHYS_TO_K0SEG(ptpa));
+ struct vm_page * const pg = pmap_physpage_alloc(PGU_L1PT);
+ if (__predict_false(pg == NULL)) {
+ return NULL;
+ }
+ return (void *)ALPHA_PHYS_TO_K0SEG(VM_PAGE_TO_PHYS(pg));
}
/*
@@ -3654,18 +3654,18 @@ pmap_l1pt_free(struct pool *pp, void *v)
static int
pmap_ptpage_alloc(pt_entry_t * const pte, int const usage)
{
- paddr_t ptpa;
-
/*
* Allocate the page table page.
*/
- if (pmap_physpage_alloc(usage, &ptpa) == false)
- return (ENOMEM);
+ struct vm_page * const pg = pmap_physpage_alloc(usage);
+ if (__predict_false(pg == NULL)) {
+ return ENOMEM;
+ }
/*
* Initialize the referencing PTE.
*/
- const pt_entry_t npte = ((ptpa >> PGSHIFT) << PG_SHIFT) |
+ const pt_entry_t npte = ((VM_PAGE_TO_PHYS(pg) >> PGSHIFT) << PG_SHIFT) |
PG_V | PG_KRE | PG_KWE | PG_WIRED;
atomic_store_relaxed(pte, npte);