145749Smckusick /* 245749Smckusick * Copyright (c) 1990 University of Utah. 363379Sbostic * Copyright (c) 1991, 1993 463379Sbostic * The Regents of the University of California. All rights reserved. 545749Smckusick * 645749Smckusick * This code is derived from software contributed to Berkeley by 745749Smckusick * the Systems Programming Group of the University of Utah Computer 845749Smckusick * Science Department. 945749Smckusick * 1045749Smckusick * %sccs.include.redist.c% 1145749Smckusick * 12*67495Shibler * @(#)vm_pager.h 8.5 (Berkeley) 07/07/94 1345749Smckusick */ 1445749Smckusick 1545749Smckusick /* 1645749Smckusick * Pager routine interface definition. 1745749Smckusick * For BSD we use a cleaner version of the internal pager interface. 1845749Smckusick */ 1945749Smckusick 2045749Smckusick #ifndef _VM_PAGER_ 2145749Smckusick #define _VM_PAGER_ 2245749Smckusick 2365129Smckusick TAILQ_HEAD(pagerlst, pager_struct); 2465129Smckusick 2545749Smckusick struct pager_struct { 2665129Smckusick TAILQ_ENTRY(pager_struct) pg_list; /* links for list management */ 2765129Smckusick caddr_t pg_handle; /* ext. handle (vp, dev, fp) */ 2865129Smckusick int pg_type; /* type of pager */ 2965693Shibler int pg_flags; /* flags */ 3065129Smckusick struct pagerops *pg_ops; /* pager operations */ 3165129Smckusick void *pg_data; /* private pager data */ 3245749Smckusick }; 3345749Smckusick 3445749Smckusick /* pager types */ 3545749Smckusick #define PG_DFLT -1 3645749Smckusick #define PG_SWAP 0 3745749Smckusick #define PG_VNODE 1 3845749Smckusick #define PG_DEVICE 2 3945749Smckusick 4065693Shibler /* flags */ 4165693Shibler #define PG_CLUSTERGET 1 4265693Shibler #define PG_CLUSTERPUT 2 4365693Shibler 4445749Smckusick struct pagerops { 4553337Sbostic void (*pgo_init) /* Initialize pager. */ 4653337Sbostic __P((void)); 4753337Sbostic vm_pager_t (*pgo_alloc) /* Allocate pager. */ 4864827Storek __P((caddr_t, vm_size_t, vm_prot_t, vm_offset_t)); 4953337Sbostic void (*pgo_dealloc) /* Disassociate. */ 5053337Sbostic __P((vm_pager_t)); 5165693Shibler int (*pgo_getpages) /* Get (read) page. */ 5265693Shibler __P((vm_pager_t, vm_page_t *, int, boolean_t)); 5365693Shibler int (*pgo_putpages) /* Put (write) page. */ 5465693Shibler __P((vm_pager_t, vm_page_t *, int, boolean_t)); 5553337Sbostic boolean_t (*pgo_haspage) /* Does pager have page? */ 5653337Sbostic __P((vm_pager_t, vm_offset_t)); 5765693Shibler void (*pgo_cluster) /* Return range of cluster. */ 5865693Shibler __P((vm_pager_t, vm_offset_t, 5965693Shibler vm_offset_t *, vm_offset_t *)); 6045749Smckusick }; 6145749Smckusick 6245749Smckusick /* 6345749Smckusick * get/put return values 6456319Shibler * OK operation was successful 6556319Shibler * BAD specified data was out of the accepted range 6656319Shibler * FAIL specified data was in range, but doesn't exist 6756319Shibler * PEND operations was initiated but not completed 6856319Shibler * ERROR error while accessing data that is in range and exists 6965693Shibler * AGAIN temporary resource shortage prevented operation from happening 7045749Smckusick */ 7145749Smckusick #define VM_PAGER_OK 0 7245749Smckusick #define VM_PAGER_BAD 1 7345749Smckusick #define VM_PAGER_FAIL 2 7445749Smckusick #define VM_PAGER_PEND 3 7556319Shibler #define VM_PAGER_ERROR 4 7665693Shibler #define VM_PAGER_AGAIN 5 7745749Smckusick 7845749Smckusick #ifdef KERNEL 7953337Sbostic extern struct pagerops *dfltpagerops; 8045749Smckusick 8164827Storek vm_pager_t vm_pager_allocate 8264827Storek __P((int, caddr_t, vm_size_t, vm_prot_t, vm_offset_t)); 8365693Shibler vm_page_t vm_pager_atop __P((vm_offset_t)); 8465693Shibler void vm_pager_cluster 8565693Shibler __P((vm_pager_t, vm_offset_t, 8665693Shibler vm_offset_t *, vm_offset_t *)); 8765693Shibler void vm_pager_clusternull 8865693Shibler __P((vm_pager_t, vm_offset_t, 8965693Shibler vm_offset_t *, vm_offset_t *)); 9053337Sbostic void vm_pager_deallocate __P((vm_pager_t)); 9165693Shibler int vm_pager_get_pages 9265693Shibler __P((vm_pager_t, vm_page_t *, int, boolean_t)); 9353337Sbostic boolean_t vm_pager_has_page __P((vm_pager_t, vm_offset_t)); 9453337Sbostic void vm_pager_init __P((void)); 9565129Smckusick vm_pager_t vm_pager_lookup __P((struct pagerlst *, caddr_t)); 9665693Shibler vm_offset_t vm_pager_map_pages __P((vm_page_t *, int, boolean_t)); 9765693Shibler int vm_pager_put_pages 9865693Shibler __P((vm_pager_t, vm_page_t *, int, boolean_t)); 9953337Sbostic void vm_pager_sync __P((void)); 10065693Shibler void vm_pager_unmap_pages __P((vm_offset_t, int)); 10165693Shibler 10265693Shibler #define vm_pager_cancluster(p, b) ((p)->pg_flags & (b)) 10365693Shibler 10465693Shibler /* 10565693Shibler * XXX compat with old interface 10665693Shibler */ 107*67495Shibler int vm_pager_get __P((vm_pager_t, vm_page_t, boolean_t)); 108*67495Shibler int vm_pager_put __P((vm_pager_t, vm_page_t, boolean_t)); 10945749Smckusick #endif 11045749Smckusick 11145749Smckusick #endif /* _VM_PAGER_ */ 112