Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/vm_phys.h
Show All 36 Lines | |||||
* Physical memory system definitions | * Physical memory system definitions | ||||
*/ | */ | ||||
#ifndef _VM_PHYS_H_ | #ifndef _VM_PHYS_H_ | ||||
#define _VM_PHYS_H_ | #define _VM_PHYS_H_ | ||||
#ifdef _KERNEL | #ifdef _KERNEL | ||||
#include <machine/vmparam.h> | |||||
#ifndef VM_NFREEORDER_MAX | #ifndef VM_NFREEORDER_MAX | ||||
#define VM_NFREEORDER_MAX VM_NFREEORDER | #define VM_NFREEORDER_MAX VM_NFREEORDER | ||||
#endif | #endif | ||||
extern vm_paddr_t phys_avail[PHYS_AVAIL_COUNT]; | extern vm_paddr_t phys_avail[]; | ||||
/* Domains must be dense (non-sparse) and zero-based. */ | /* Domains must be dense (non-sparse) and zero-based. */ | ||||
struct mem_affinity { | struct mem_affinity { | ||||
vm_paddr_t start; | vm_paddr_t start; | ||||
vm_paddr_t end; | vm_paddr_t end; | ||||
int domain; | int domain; | ||||
}; | }; | ||||
#ifdef NUMA | #ifdef NUMA | ||||
extern struct mem_affinity *mem_affinity; | extern struct mem_affinity *mem_affinity; | ||||
extern int *mem_locality; | extern int *mem_locality; | ||||
#endif | #endif | ||||
struct vm_page; | |||||
#ifndef VM_PAGE_HAVE_PGLIST | |||||
TAILQ_HEAD(pglist, vm_page); | |||||
#define VM_PAGE_HAVE_PGLIST | |||||
#endif | |||||
struct vm_freelist { | struct vm_freelist { | ||||
struct pglist pl; | struct pglist pl; | ||||
int lcnt; | int lcnt; | ||||
}; | }; | ||||
struct vm_phys_seg { | struct vm_phys_seg { | ||||
vm_paddr_t start; | vm_paddr_t start; | ||||
vm_paddr_t end; | vm_paddr_t end; | ||||
Show All 39 Lines | |||||
boolean_t vm_phys_unfree_page(vm_page_t m); | boolean_t vm_phys_unfree_page(vm_page_t m); | ||||
int vm_phys_mem_affinity(int f, int t); | int vm_phys_mem_affinity(int f, int t); | ||||
void vm_phys_early_add_seg(vm_paddr_t start, vm_paddr_t end); | void vm_phys_early_add_seg(vm_paddr_t start, vm_paddr_t end); | ||||
vm_paddr_t vm_phys_early_alloc(int domain, size_t alloc_size); | vm_paddr_t vm_phys_early_alloc(int domain, size_t alloc_size); | ||||
void vm_phys_early_startup(void); | void vm_phys_early_startup(void); | ||||
int vm_phys_avail_largest(void); | int vm_phys_avail_largest(void); | ||||
vm_paddr_t vm_phys_avail_size(int i); | vm_paddr_t vm_phys_avail_size(int i); | ||||
#ifdef _VM_PAGE_ | |||||
/* | /* | ||||
* | * | ||||
* vm_phys_domain: | * vm_phys_page_domain: | ||||
* | * | ||||
* Return the index of the domain the page belongs to. | * Return the index of the domain the page belongs to. | ||||
*/ | */ | ||||
static inline int | static inline int | ||||
vm_phys_domain(vm_page_t m) | vm_phys_page_domain(vm_page_t m) | ||||
alc: In general, I'm a fan of longer names, especially ones that include a verb. :-) But, in this… | |||||
{ | { | ||||
#ifdef NUMA | #ifdef NUMA | ||||
int domn, segind; | int domn, segind; | ||||
/* XXXKIB try to assert that the page is managed */ | /* XXXKIB try to assert that the page is managed */ | ||||
segind = m->segind; | segind = m->segind; | ||||
KASSERT(segind < vm_phys_nsegs, ("segind %d m %p", segind, m)); | KASSERT(segind < vm_phys_nsegs, ("segind %d m %p", segind, m)); | ||||
domn = vm_phys_segs[segind].domain; | domn = vm_phys_segs[segind].domain; | ||||
KASSERT(domn < vm_ndomains, ("domain %d m %p", domn, m)); | KASSERT(domn >= 0 && domn < vm_ndomains, ("domain %d m %p", domn, m)); | ||||
return (domn); | return (domn); | ||||
#else | #else | ||||
return (0); | return (0); | ||||
#endif | #endif | ||||
} | } | ||||
int _vm_phys_domain(vm_paddr_t pa); | #endif | ||||
static inline int | |||||
vm_phys_domain(vm_paddr_t pa) | |||||
{ | |||||
#ifdef NUMA | |||||
int i; | |||||
if (vm_ndomains == 1) | |||||
return (0); | |||||
for (i = 0; mem_affinity[i].end != 0; i++) | |||||
if (mem_affinity[i].start <= pa && | |||||
mem_affinity[i].end >= pa) | |||||
return (mem_affinity[i].domain); | |||||
return (-1); | |||||
#else | |||||
return (0); | |||||
#endif | |||||
} | |||||
#endif /* _KERNEL */ | #endif /* _KERNEL */ | ||||
#endif /* !_VM_PHYS_H_ */ | #endif /* !_VM_PHYS_H_ */ |
In general, I'm a fan of longer names, especially ones that include a verb. :-) But, in this case, I would advocate for the shorter vm_page_domain(). The only thing that the phys_ prefix does is hint at where the function is implemented. But, conceptually this is an operation on a vm_page.