#ifndef _UVM_UVM_PMEMRANGE_H_
#define _UVM_UVM_PMEMRANGE_H_
RBT_HEAD(uvm_pmr_addr, vm_page);
RBT_HEAD(uvm_pmr_size, vm_page);
#define UVM_PMR_MEMTYPE_DIRTY 0
#define UVM_PMR_MEMTYPE_ZERO 1
#define UVM_PMR_MEMTYPE_MAX 2
struct uvm_pmemrange {
struct uvm_pmr_addr addr;
struct uvm_pmr_size size[UVM_PMR_MEMTYPE_MAX];
TAILQ_HEAD(, vm_page) single[UVM_PMR_MEMTYPE_MAX];
paddr_t low;
paddr_t high;
int use;
psize_t nsegs;
TAILQ_ENTRY(uvm_pmemrange) pmr_use;
RBT_ENTRY(uvm_pmemrange) pmr_addr;
};
RBT_HEAD(uvm_pmemrange_addr, uvm_pmemrange);
TAILQ_HEAD(uvm_pmemrange_use, uvm_pmemrange);
struct uvm_pmr_control {
struct uvm_pmemrange_addr addr;
struct uvm_pmemrange_use use;
};
void uvm_pmr_freepages(struct vm_page *, psize_t);
void uvm_pmr_freepageq(struct pglist *);
int uvm_pmr_getpages(psize_t, paddr_t, paddr_t, paddr_t, paddr_t,
int, int, struct pglist *);
void uvm_pmr_init(void);
int uvm_wait_pla(paddr_t, paddr_t, paddr_t, int);
void uvm_wakeup_pla(paddr_t, psize_t);
#if defined(DDB) || defined(DEBUG)
int uvm_pmr_isfree(struct vm_page *pg);
#endif
int uvm_pmr_addr_cmp(const struct vm_page *, const struct vm_page *);
int uvm_pmr_size_cmp(const struct vm_page *, const struct vm_page *);
RBT_PROTOTYPE(uvm_pmr_addr, vm_page, objt, uvm_pmr_addr_cmp);
RBT_PROTOTYPE(uvm_pmr_size, vm_page, objt, uvm_pmr_size_cmp);
RBT_PROTOTYPE(uvm_pmemrange_addr, uvm_pmemrange, pmr_addr,
uvm_pmemrange_addr_cmp);
struct vm_page *uvm_pmr_insert_addr(struct uvm_pmemrange *,
struct vm_page *, int);
void uvm_pmr_insert_size(struct uvm_pmemrange *,
struct vm_page *);
struct vm_page *uvm_pmr_insert(struct uvm_pmemrange *,
struct vm_page *, int);
void uvm_pmr_remove_addr(struct uvm_pmemrange *,
struct vm_page *);
void uvm_pmr_remove_size(struct uvm_pmemrange *,
struct vm_page *);
void uvm_pmr_remove(struct uvm_pmemrange *,
struct vm_page *);
struct vm_page *uvm_pmr_extract_range(struct uvm_pmemrange *,
struct vm_page *, paddr_t, paddr_t,
struct pglist *);
struct vm_page *uvm_pmr_cache_get(int);
void uvm_pmr_cache_put(struct vm_page *);
unsigned int uvm_pmr_cache_drain(void);
#endif