Abstraction fix; move physical address -> per-page metadata (struct

vm_page *) "reverse" lookup code from uvm_page.h to uvm_page.c, to
help migration to not do that.

Likewise move per-page metadata (struct vm_page *) -> physical
address "forward" conversion code into *.c too.  This is called
only low-layer VM and MD code.
This commit is contained in:
uebayasi 2010-11-12 05:23:41 +00:00
parent 9a0d0defa9
commit 77d80f38cd
3 changed files with 51 additions and 24 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: vm.c,v 1.98 2010/10/27 20:44:49 pooka Exp $ */ /* $NetBSD: vm.c,v 1.99 2010/11/12 05:23:41 uebayasi Exp $ */
/* /*
* Copyright (c) 2007-2010 Antti Kantee. All Rights Reserved. * Copyright (c) 2007-2010 Antti Kantee. All Rights Reserved.
@ -41,7 +41,7 @@
*/ */
#include <sys/cdefs.h> #include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: vm.c,v 1.98 2010/10/27 20:44:49 pooka Exp $"); __KERNEL_RCSID(0, "$NetBSD: vm.c,v 1.99 2010/11/12 05:23:41 uebayasi Exp $");
#include <sys/param.h> #include <sys/param.h>
#include <sys/atomic.h> #include <sys/atomic.h>
@ -798,6 +798,24 @@ uvmpdpol_anfree(struct vm_anon *an)
/* nada */ /* nada */
} }
/*
* Physical address accessors.
*/
struct vm_page *
uvm_phys_to_vm_page(paddr_t pa)
{
return NULL;
}
paddr_t
uvm_vm_page_to_phys(const struct vm_page *pg)
{
return 0;
}
/* /*
* Routines related to the Page Baroness. * Routines related to the Page Baroness.
*/ */

View File

@ -1,4 +1,4 @@
/* $NetBSD: uvm_page.c,v 1.162 2010/11/12 03:21:04 uebayasi Exp $ */ /* $NetBSD: uvm_page.c,v 1.163 2010/11/12 05:23:41 uebayasi Exp $ */
/* /*
* Copyright (c) 2010 The NetBSD Foundation, Inc. * Copyright (c) 2010 The NetBSD Foundation, Inc.
@ -97,7 +97,7 @@
*/ */
#include <sys/cdefs.h> #include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.162 2010/11/12 03:21:04 uebayasi Exp $"); __KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.163 2010/11/12 05:23:41 uebayasi Exp $");
#include "opt_ddb.h" #include "opt_ddb.h"
#include "opt_uvmhist.h" #include "opt_uvmhist.h"
@ -977,6 +977,30 @@ vm_physseg_find_linear(struct vm_physseg *segs, int nsegs, paddr_t pframe, int *
} }
#endif #endif
/*
* PHYS_TO_VM_PAGE: find vm_page for a PA. used by MI code to get vm_pages
* back from an I/O mapping (ugh!). used in some MD code as well.
*/
struct vm_page *
uvm_phys_to_vm_page(paddr_t pa)
{
paddr_t pf = atop(pa);
int off;
int psi;
psi = vm_physseg_find(pf, &off);
if (psi != -1)
return(&VM_PHYSMEM_PTR(psi)->pgs[off]);
return(NULL);
}
paddr_t
uvm_vm_page_to_phys(const struct vm_page *pg)
{
return pg->phys_addr;
}
/* /*
* uvm_page_recolor: Recolor the pages if the new bucket count is * uvm_page_recolor: Recolor the pages if the new bucket count is
* larger than the old one. * larger than the old one.

View File

@ -1,4 +1,4 @@
/* $NetBSD: uvm_page.h,v 1.64 2010/11/12 03:21:04 uebayasi Exp $ */ /* $NetBSD: uvm_page.h,v 1.65 2010/11/12 05:23:41 uebayasi Exp $ */
/* /*
* Copyright (c) 1997 Charles D. Cranor and Washington University. * Copyright (c) 1997 Charles D. Cranor and Washington University.
@ -294,8 +294,9 @@ bool uvm_pageismanaged(paddr_t);
int uvm_page_lookup_freelist(struct vm_page *); int uvm_page_lookup_freelist(struct vm_page *);
static struct vm_page *PHYS_TO_VM_PAGE(paddr_t);
int vm_physseg_find(paddr_t, int *); int vm_physseg_find(paddr_t, int *);
struct vm_page *uvm_phys_to_vm_page(paddr_t);
paddr_t uvm_vm_page_to_phys(const struct vm_page *);
/* /*
* macros * macros
@ -303,7 +304,7 @@ int vm_physseg_find(paddr_t, int *);
#define UVM_PAGE_TREE_PENALTY 4 /* XXX: a guess */ #define UVM_PAGE_TREE_PENALTY 4 /* XXX: a guess */
#define VM_PAGE_TO_PHYS(entry) ((entry)->phys_addr) #define VM_PAGE_TO_PHYS(entry) uvm_vm_page_to_phys(entry)
/* /*
* Compute the page color bucket for a given page. * Compute the page color bucket for a given page.
@ -311,23 +312,7 @@ int vm_physseg_find(paddr_t, int *);
#define VM_PGCOLOR_BUCKET(pg) \ #define VM_PGCOLOR_BUCKET(pg) \
(atop(VM_PAGE_TO_PHYS((pg))) & uvmexp.colormask) (atop(VM_PAGE_TO_PHYS((pg))) & uvmexp.colormask)
#define PHYS_TO_VM_PAGE(pa) uvm_phys_to_vm_page(pa)
/*
* PHYS_TO_VM_PAGE: find vm_page for a PA. used by MI code to get vm_pages
* back from an I/O mapping (ugh!). used in some MD code as well.
*/
static inline struct vm_page *
PHYS_TO_VM_PAGE(paddr_t pa)
{
paddr_t pf = atop(pa);
int off;
int psi;
psi = vm_physseg_find(pf, &off);
if (psi != -1)
return(&vm_physmem[psi].pgs[off]);
return(NULL);
}
#define VM_PAGE_IS_FREE(entry) ((entry)->pqflags & PQ_FREE) #define VM_PAGE_IS_FREE(entry) ((entry)->pqflags & PQ_FREE)
#define VM_FREE_PAGE_TO_CPU(pg) ((struct uvm_cpu *)((uintptr_t)pg->offset)) #define VM_FREE_PAGE_TO_CPU(pg) ((struct uvm_cpu *)((uintptr_t)pg->offset))