On Sun, Apr 02, 2023 at 07:29:02PM +0000, Miod Vallat wrote: > pmap_copy() is an optional pmap interface which has never been > implemented. In pure Mary Kondo style, we should thank it for the joy it > brought to CSRG people, and move it to the recycling bin - it's not > going to be implemented anytime soon.
In Mach (Tevanian's thesis) it was described as: "This routine is only advisory and need not do anything" ok jsg@ > > Index: share/man/man9/pmap.9 > =================================================================== > RCS file: /OpenBSD/src/share/man/man9/pmap.9,v > retrieving revision 1.19 > diff -u -p -r1.19 pmap.9 > --- share/man/man9/pmap.9 16 Dec 2019 10:34:04 -0000 1.19 > +++ share/man/man9/pmap.9 2 Apr 2023 19:23:11 -0000 > @@ -49,8 +49,7 @@ > .Nm pmap_growkernel , > .Nm pmap_update , > .Nm pmap_collect , > -.Nm pmap_virtual_space , > -.Nm pmap_copy > +.Nm pmap_virtual_space > .Nd machine dependent interface to the MMU > .Sh SYNOPSIS > .In machine/pmap.h > @@ -366,9 +365,6 @@ it contains no valid mappings. > .Fn pmap_collect "pmap_t pmap" > .Ft void > .Fn pmap_virtual_space "vaddr_t *vstartp" "vaddr_t *vendp" > -.Ft void > -.Fn pmap_copy "pmap_t dst_pmap" "pmap_t src_pmap" "vaddr_t dst_addr" \ > - "vsize_t len" "vaddr_t src_addr" > .nr nS 0 > .Pp > Wired memory allocation before the virtual memory system is bootstrapped > @@ -398,26 +394,6 @@ is not expected to be used for some time > module a chance to prioritize. > The initial bounds of the kernel virtual address space are returned by > .Fn pmap_virtual_space . > -.Pp > -The > -.Fn pmap_copy > -function copies the range specified by > -.Fa src_addr > -and > -.Fa src_len > -from > -.Fa src_pmap > -to the range described by > -.Fa dst_addr > -and > -.Fa dst_len > -in > -.Fa dst_map . > -.Fn pmap_copy > -is called during a > -.Xr fork 2 > -operation to give the child process an initial set of low-level > -mappings. > .Sh SEE ALSO > .Xr fork 2 , > .Xr uvm_init 9 > Index: sys/arch/alpha/alpha/pmap.c > =================================================================== > RCS file: /OpenBSD/src/sys/arch/alpha/alpha/pmap.c,v > retrieving revision 1.89 > diff -u -p -r1.89 pmap.c > --- sys/arch/alpha/alpha/pmap.c 6 Feb 2023 11:16:22 -0000 1.89 > +++ sys/arch/alpha/alpha/pmap.c 2 Apr 2023 19:23:11 -0000 > @@ -2017,17 +2017,6 @@ pmap_extract(pmap_t pmap, vaddr_t va, pa > } > > /* > - * pmap_copy: [ INTERFACE ] > - * > - * Copy the mapping range specified by src_addr/len > - * from the source map to the range dst_addr/len > - * in the destination map. > - * > - * This routine is only advisory and need not do anything. > - */ > -/* call deleted in <machine/pmap.h> */ > - > -/* > * pmap_collect: [ INTERFACE ] > * > * Garbage collects the physical map system for pages which are no > Index: sys/arch/alpha/include/pmap.h > =================================================================== > RCS file: /OpenBSD/src/sys/arch/alpha/include/pmap.h,v > retrieving revision 1.44 > diff -u -p -r1.44 pmap.h > --- sys/arch/alpha/include/pmap.h 6 Feb 2023 11:16:22 -0000 1.44 > +++ sys/arch/alpha/include/pmap.h 2 Apr 2023 19:23:11 -0000 > @@ -155,7 +155,6 @@ void pmap_do_tlb_shootdown(struct cpu_in > #define pmap_resident_count(pmap) > ((pmap)->pm_stats.resident_count) > #define pmap_wired_count(pmap) ((pmap)->pm_stats.wired_count) > > -#define pmap_copy(dp, sp, da, l, sa) /* nothing */ > #define pmap_update(pmap) /* nothing (yet) */ > > #define pmap_proc_iflush(p, va, len) /* nothing */ > Index: sys/arch/amd64/amd64/pmap.c > =================================================================== > RCS file: /OpenBSD/src/sys/arch/amd64/amd64/pmap.c,v > retrieving revision 1.162 > diff -u -p -r1.162 pmap.c > --- sys/arch/amd64/amd64/pmap.c 30 Jan 2023 11:21:26 -0000 1.162 > +++ sys/arch/amd64/amd64/pmap.c 2 Apr 2023 19:23:11 -0000 > @@ -2257,17 +2257,6 @@ pmap_collect(struct pmap *pmap) > } > #endif > > -/* > - * pmap_copy: copy mappings from one pmap to another > - * > - * => optional function > - * void pmap_copy(dst_pmap, src_pmap, dst_addr, len, src_addr) > - */ > - > -/* > - * defined as macro in pmap.h > - */ > - > void > pmap_enter_special(vaddr_t va, paddr_t pa, vm_prot_t prot) > { > Index: sys/arch/amd64/include/pmap.h > =================================================================== > RCS file: /OpenBSD/src/sys/arch/amd64/include/pmap.h,v > retrieving revision 1.85 > diff -u -p -r1.85 pmap.h > --- sys/arch/amd64/include/pmap.h 31 Jan 2023 15:18:54 -0000 1.85 > +++ sys/arch/amd64/include/pmap.h 2 Apr 2023 19:23:11 -0000 > @@ -369,7 +369,6 @@ extern const long nbpd[], nkptpmax[]; > > #define pmap_clear_modify(pg) pmap_clear_attrs(pg, PG_M) > #define pmap_clear_reference(pg) pmap_clear_attrs(pg, PG_U) > -#define pmap_copy(DP,SP,D,L,S) > #define pmap_is_modified(pg) pmap_test_attrs(pg, PG_M) > #define pmap_is_referenced(pg) pmap_test_attrs(pg, PG_U) > #define pmap_move(DP,SP,D,L,S) > Index: sys/arch/arm/include/pmap.h > =================================================================== > RCS file: /OpenBSD/src/sys/arch/arm/include/pmap.h,v > retrieving revision 1.53 > diff -u -p -r1.53 pmap.h > --- sys/arch/arm/include/pmap.h 31 Jan 2023 15:18:54 -0000 1.53 > +++ sys/arch/arm/include/pmap.h 2 Apr 2023 19:23:11 -0000 > @@ -240,7 +240,6 @@ extern struct pmap kernel_pmap_store; > (((pg)->mdpage.pvh_attrs & PVF_REF) != 0) > > #define pmap_deactivate(p) do { /* nothing */ } while (0) > -#define pmap_copy(dp, sp, da, l, sa) do { /* nothing */ } while (0) > > #define pmap_unuse_final(p) do { /* nothing */ } while (0) > #define pmap_remove_holes(vm) do { /* nothing */ } while (0) > Index: sys/arch/arm64/arm64/pmap.c > =================================================================== > RCS file: /OpenBSD/src/sys/arch/arm64/arm64/pmap.c,v > retrieving revision 1.93 > diff -u -p -r1.93 pmap.c > --- sys/arch/arm64/arm64/pmap.c 27 Mar 2023 19:02:47 -0000 1.93 > +++ sys/arch/arm64/arm64/pmap.c 2 Apr 2023 19:23:11 -0000 > @@ -1927,13 +1927,6 @@ pmap_clear_reference(struct vm_page *pg) > } > > void > -pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vaddr_t dst_addr, > - vsize_t len, vaddr_t src_addr) > -{ > - /* NOOP */ > -} > - > -void > pmap_unwire(pmap_t pm, vaddr_t va) > { > struct pte_desc *pted; > Index: sys/arch/hppa/include/pmap.h > =================================================================== > RCS file: /OpenBSD/src/sys/arch/hppa/include/pmap.h,v > retrieving revision 1.54 > diff -u -p -r1.54 pmap.h > --- sys/arch/hppa/include/pmap.h 24 Jan 2023 16:51:06 -0000 1.54 > +++ sys/arch/hppa/include/pmap.h 2 Apr 2023 19:23:11 -0000 > @@ -102,7 +102,6 @@ struct vm_page *pmap_unmap_direct(vaddr_ > #define pmap_kernel() (&kernel_pmap_store) > #define pmap_resident_count(pmap) > ((pmap)->pm_stats.resident_count) > #define pmap_update(pm) (void)(pm) > -#define pmap_copy(dpmap,spmap,da,len,sa) > > #define PG_PMAP_MOD PG_PMAP0 /* modified */ > #define PG_PMAP_REF PG_PMAP1 /* referenced */ > Index: sys/arch/i386/i386/pmap.c > =================================================================== > RCS file: /OpenBSD/src/sys/arch/i386/i386/pmap.c,v > retrieving revision 1.220 > diff -u -p -r1.220 pmap.c > --- sys/arch/i386/i386/pmap.c 30 Jan 2023 10:49:05 -0000 1.220 > +++ sys/arch/i386/i386/pmap.c 2 Apr 2023 19:23:11 -0000 > @@ -2263,17 +2263,6 @@ pmap_collect(struct pmap *pmap) > } > > /* > - * pmap_copy: copy mappings from one pmap to another > - * > - * => optional function > - * void pmap_copy(dst_pmap, src_pmap, dst_addr, len, src_addr) > - */ > - > -/* > - * defined as macro in pmap.h > - */ > - > -/* > * pmap_enter: enter a mapping into a pmap > * > * => must be done "now" ... no lazy-evaluation > Index: sys/arch/i386/i386/pmapae.c > =================================================================== > RCS file: /OpenBSD/src/sys/arch/i386/i386/pmapae.c,v > retrieving revision 1.68 > diff -u -p -r1.68 pmapae.c > --- sys/arch/i386/i386/pmapae.c 30 Jan 2023 10:49:05 -0000 1.68 > +++ sys/arch/i386/i386/pmapae.c 2 Apr 2023 19:23:11 -0000 > @@ -820,8 +820,6 @@ pmap_bootstrap_pae(void) > * => we should not be holding any pv_head locks (in case we are forced > * to call pmap_steal_ptp()) > * => we may need to lock pv_head's if we have to steal a PTP > - * => just_try: true if we want a PTP, but not enough to steal one > - * from another pmap (e.g. during optional functions like pmap_copy) > */ > > struct vm_page * > @@ -1670,17 +1668,6 @@ pmap_unwire_pae(struct pmap *pmap, vaddr > } > #endif > } > - > -/* > - * pmap_copy: copy mappings from one pmap to another > - * > - * => optional function > - * void pmap_copy(dst_pmap, src_pmap, dst_addr, len, src_addr) > - */ > - > -/* > - * defined as macro in pmap.h > - */ > > /* > * pmap_enter: enter a mapping into a pmap > Index: sys/arch/i386/include/pmap.h > =================================================================== > RCS file: /OpenBSD/src/sys/arch/i386/include/pmap.h,v > retrieving revision 1.92 > diff -u -p -r1.92 pmap.h > --- sys/arch/i386/include/pmap.h 31 Jan 2023 15:18:54 -0000 1.92 > +++ sys/arch/i386/include/pmap.h 2 Apr 2023 19:23:11 -0000 > @@ -205,7 +205,6 @@ extern struct pool pmap_pv_pool; > > #define pmap_clear_modify(pg) pmap_clear_attrs(pg, PG_M) > #define pmap_clear_reference(pg) pmap_clear_attrs(pg, PG_U) > -#define pmap_copy(DP,SP,D,L,S) > #define pmap_is_modified(pg) pmap_test_attrs(pg, PG_M) > #define pmap_is_referenced(pg) pmap_test_attrs(pg, PG_U) > #define pmap_valid_entry(E) ((E) & PG_V) /* is PDE or PTE valid? */ > Index: sys/arch/m88k/include/pmap.h > =================================================================== > RCS file: /OpenBSD/src/sys/arch/m88k/include/pmap.h,v > retrieving revision 1.28 > diff -u -p -r1.28 pmap.h > --- sys/arch/m88k/include/pmap.h 12 Feb 2023 07:02:43 -0000 1.28 > +++ sys/arch/m88k/include/pmap.h 2 Apr 2023 19:23:11 -0000 > @@ -51,7 +51,6 @@ extern apr_t kernel_apr, userland_apr; > #define pmap_resident_count(pmap) ((pmap)->pm_stats.resident_count) > #define pmap_wired_count(pmap) ((pmap)->pm_stats.wired_count) > > -#define pmap_copy(dp,sp,d,l,s) do { /* nothing */ } while (0) > #define pmap_update(pmap) do { /* nothing */ } while (0) > > #define pmap_clear_modify(pg) pmap_unsetbit(pg, PG_M) > Index: sys/arch/mips64/mips64/pmap.c > =================================================================== > RCS file: /OpenBSD/src/sys/arch/mips64/mips64/pmap.c,v > retrieving revision 1.124 > diff -u -p -r1.124 pmap.c > --- sys/arch/mips64/mips64/pmap.c 11 Jan 2023 03:19:52 -0000 1.124 > +++ sys/arch/mips64/mips64/pmap.c 2 Apr 2023 19:23:11 -0000 > @@ -1407,22 +1407,6 @@ pmap_extract(pmap_t pmap, vaddr_t va, pa > } > > /* > - * Copy the range specified by src_addr/len > - * from the source map to the range dst_addr/len > - * in the destination map. > - * > - * This routine is only advisory and need not do anything. > - */ > -void > -pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vaddr_t dst_addr, vsize_t len, > - vaddr_t src_addr) > -{ > - > - DPRINTF(PDB_FOLLOW,("pmap_copy(%p, %p, %p, 0x%lx, %p)\n", > - dst_pmap, src_pmap, (void *)dst_addr, len, (void *)src_addr)); > -} > - > -/* > * pmap_zero_page zeros the specified (machine independent) page. > */ > void > Index: sys/arch/powerpc/include/pmap.h > =================================================================== > RCS file: /OpenBSD/src/sys/arch/powerpc/include/pmap.h,v > retrieving revision 1.63 > diff -u -p -r1.63 pmap.h > --- sys/arch/powerpc/include/pmap.h 31 Jan 2023 15:18:55 -0000 1.63 > +++ sys/arch/powerpc/include/pmap.h 2 Apr 2023 19:23:11 -0000 > @@ -148,7 +148,6 @@ int pmap_copyinsn(pmap_t, vaddr_t, uint3 > void pmap_real_memory(vaddr_t *start, vsize_t *size); > > int pte_spill_v(struct pmap *pm, u_int32_t va, u_int32_t dsisr, int > exec_fault); > -#define pmap_copy(dst_pmap, src_pmap, dst_addr, len, src_addr) ; > int reserve_dumppages(caddr_t p); > > #define pmap_unuse_final(p) /* nothing */ > Index: sys/arch/powerpc64/powerpc64/pmap.c > =================================================================== > RCS file: /OpenBSD/src/sys/arch/powerpc64/powerpc64/pmap.c,v > retrieving revision 1.59 > diff -u -p -r1.59 pmap.c > --- sys/arch/powerpc64/powerpc64/pmap.c 25 Jan 2023 09:53:53 -0000 > 1.59 > +++ sys/arch/powerpc64/powerpc64/pmap.c 2 Apr 2023 19:23:11 -0000 > @@ -1047,12 +1047,6 @@ pmap_init(void) > pmap_initialized = 1; > } > > -void > -pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vaddr_t dst_addr, > - vsize_t len, vaddr_t src_addr) > -{ > -} > - > int > pmap_enter(pmap_t pm, vaddr_t va, paddr_t pa, vm_prot_t prot, int flags) > { > Index: sys/arch/riscv64/riscv64/pmap.c > =================================================================== > RCS file: /OpenBSD/src/sys/arch/riscv64/riscv64/pmap.c,v > retrieving revision 1.29 > diff -u -p -r1.29 pmap.c > --- sys/arch/riscv64/riscv64/pmap.c 11 Jan 2023 11:10:25 -0000 1.29 > +++ sys/arch/riscv64/riscv64/pmap.c 2 Apr 2023 19:23:11 -0000 > @@ -1862,13 +1862,6 @@ pmap_clear_reference(struct vm_page *pg) > } > > void > -pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vaddr_t dst_addr, > - vsize_t len, vaddr_t src_addr) > -{ > - /* NOOP */ > -} > - > -void > pmap_unwire(pmap_t pm, vaddr_t va) > { > struct pte_desc *pted; > Index: sys/arch/sh/include/pmap.h > =================================================================== > RCS file: /OpenBSD/src/sys/arch/sh/include/pmap.h,v > retrieving revision 1.19 > diff -u -p -r1.19 pmap.h > --- sys/arch/sh/include/pmap.h 8 Mar 2023 04:43:07 -0000 1.19 > +++ sys/arch/sh/include/pmap.h 2 Apr 2023 19:23:11 -0000 > @@ -65,7 +65,6 @@ void pmap_bootstrap(void); > #define pmap_kernel() (&__pmap_kernel) > #define pmap_deactivate(pmap) do { /* nothing */ } while (0) > #define pmap_update(pmap) do { /* nothing */ } while (0) > -#define pmap_copy(dp,sp,d,l,s) do { /* nothing */ } while (0) > #define pmap_wired_count(pmap) ((pmap)->pm_stats.wired_count) > #define pmap_resident_count(pmap) > ((pmap)->pm_stats.resident_count) > > Index: sys/arch/sparc64/sparc64/pmap.c > =================================================================== > RCS file: /OpenBSD/src/sys/arch/sparc64/sparc64/pmap.c,v > retrieving revision 1.110 > diff -u -p -r1.110 pmap.c > --- sys/arch/sparc64/sparc64/pmap.c 24 Jan 2023 07:26:34 -0000 1.110 > +++ sys/arch/sparc64/sparc64/pmap.c 2 Apr 2023 19:23:11 -0000 > @@ -1528,19 +1528,6 @@ pmap_release(struct pmap *pm) > } > > /* > - * Copy the range specified by src_addr/len > - * from the source map to the range dst_addr/len > - * in the destination map. > - * > - * This routine is only advisory and need not do anything. > - */ > -void > -pmap_copy(struct pmap *dst_pmap, struct pmap *src_pmap, vaddr_t dst_addr, > - vsize_t len, vaddr_t src_addr) > -{ > -} > - > -/* > * Garbage collects the physical map system for > * pages which are no longer used. > * Success need not be guaranteed -- that is, there > Index: sys/uvm/uvm_map.c > =================================================================== > RCS file: /OpenBSD/src/sys/uvm/uvm_map.c,v > retrieving revision 1.313 > diff -u -p -r1.313 uvm_map.c > --- sys/uvm/uvm_map.c 24 Feb 2023 15:17:48 -0000 1.313 > +++ sys/uvm/uvm_map.c 2 Apr 2023 19:23:11 -0000 > @@ -3716,15 +3716,6 @@ uvm_mapent_forkshared(struct vmspace *ne > old_entry->end - old_entry->start, 0, old_entry->protection, > old_entry->max_protection, old_map, old_entry, dead); > > - /* > - * pmap_copy the mappings: this routine is optional > - * but if it is there it will reduce the number of > - * page faults in the new proc. > - */ > - if (!UVM_ET_ISHOLE(new_entry)) > - pmap_copy(new_map->pmap, old_map->pmap, new_entry->start, > - (new_entry->end - new_entry->start), new_entry->start); > - > return (new_entry); > } > > @@ -3805,8 +3796,6 @@ uvm_mapent_forkcopy(struct vmspace *new_ > * resolve all copy-on-write faults now > * (note that there is nothing to do if > * the old mapping does not have an amap). > - * XXX: is it worthwhile to bother with > - * pmap_copy in this case? > */ > if (old_entry->aref.ar_amap) > amap_cow_now(new_map, new_entry); > @@ -3821,12 +3810,7 @@ uvm_mapent_forkcopy(struct vmspace *new_ > * fork operation. > * > * if we do not write-protect the parent, then > - * we must be sure to write-protect the child > - * after the pmap_copy() operation. > - * > - * XXX: pmap_copy should have some way of telling > - * us that it didn't do anything so we can avoid > - * calling pmap_protect needlessly. > + * we must be sure to write-protect the child. > */ > if (!UVM_ET_ISNEEDSCOPY(old_entry)) { > if (old_entry->max_protection & PROT_WRITE) { > @@ -3854,15 +3838,6 @@ uvm_mapent_forkcopy(struct vmspace *new_ > else > protect_child = FALSE; > } > - /* > - * copy the mappings > - * XXX: need a way to tell if this does anything > - */ > - if (!UVM_ET_ISHOLE(new_entry)) > - pmap_copy(new_map->pmap, old_map->pmap, > - new_entry->start, > - (old_entry->end - old_entry->start), > - old_entry->start); > > /* protect the child's mappings if necessary */ > if (protect_child) { > @@ -4526,13 +4501,6 @@ uvm_map_extract(struct vm_map *srcmap, v > newentry->protection != PROT_NONE) > newentry->protection = newentry->max_protection; > newentry->protection &= ~PROT_EXEC; > - > - /* > - * Step 2: perform pmap copy. > - * (Doing this in the loop saves one RB traversal.) > - */ > - pmap_copy(kernel_map->pmap, srcmap->pmap, > - cp_start - start + dstaddr, cp_len, cp_start); > } > pmap_update(kernel_map->pmap); > > Index: sys/uvm/uvm_pmap.h > =================================================================== > RCS file: /OpenBSD/src/sys/uvm/uvm_pmap.h,v > retrieving revision 1.32 > diff -u -p -r1.32 uvm_pmap.h > --- sys/uvm/uvm_pmap.h 1 Jan 2023 19:49:18 -0000 1.32 > +++ sys/uvm/uvm_pmap.h 2 Apr 2023 19:23:11 -0000 > @@ -128,9 +128,6 @@ boolean_t pmap_clear_reference(struct v > #if !defined(pmap_collect) && defined(__HAVE_PMAP_COLLECT) > void pmap_collect(pmap_t); > #endif > -#if !defined(pmap_copy) > -void pmap_copy(pmap_t, pmap_t, vaddr_t, vsize_t, vaddr_t); > -#endif > #if !defined(pmap_copy_page) > void pmap_copy_page(struct vm_page *, struct vm_page *); > #endif > >