Module Name: src
Committed By: jdolecek
Date: Sat May 19 11:39:37 UTC 2018
Modified Files:
src/sys/arch/x86/include: pmap.h
src/sys/arch/x86/x86: pmap.c
src/sys/kern: kern_synch.c sys_pipe.c
src/sys/sys: pipe.h
src/sys/uvm: files.uvm uvm_extern.h uvm_init.c
Removed Files:
src/sys/uvm: uvm_emap.c
Log Message:
Remove emap support. Unfortunately it never got to state where it would be
used and usable, due to reliability and limited & complicated MD support.
Going forward, we need to concentrate on interface which do not map anything
into kernel in first place (such as direct map or KVA-less I/O), rather
than making those mappings cheaper to do.
To generate a diff of this commit:
cvs rdiff -u -r1.77 -r1.78 src/sys/arch/x86/include/pmap.h
cvs rdiff -u -r1.289 -r1.290 src/sys/arch/x86/x86/pmap.c
cvs rdiff -u -r1.314 -r1.315 src/sys/kern/kern_synch.c
cvs rdiff -u -r1.144 -r1.145 src/sys/kern/sys_pipe.c
cvs rdiff -u -r1.33 -r1.34 src/sys/sys/pipe.h
cvs rdiff -u -r1.28 -r1.29 src/sys/uvm/files.uvm
cvs rdiff -u -r1.13 -r0 src/sys/uvm/uvm_emap.c
cvs rdiff -u -r1.211 -r1.212 src/sys/uvm/uvm_extern.h
cvs rdiff -u -r1.48 -r1.49 src/sys/uvm/uvm_init.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/x86/include/pmap.h
diff -u src/sys/arch/x86/include/pmap.h:1.77 src/sys/arch/x86/include/pmap.h:1.78
--- src/sys/arch/x86/include/pmap.h:1.77 Tue May 8 17:20:44 2018
+++ src/sys/arch/x86/include/pmap.h Sat May 19 11:39:37 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.h,v 1.77 2018/05/08 17:20:44 maxv Exp $ */
+/* $NetBSD: pmap.h,v 1.78 2018/05/19 11:39:37 jdolecek Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -366,8 +366,6 @@ void pmap_tlb_shootdown(pmap_t, vaddr_t
void pmap_tlb_shootnow(void);
void pmap_tlb_intr(void);
-#define __HAVE_PMAP_EMAP
-
#define PMAP_GROWKERNEL /* turn on pmap_growkernel interface */
#define PMAP_FORK /* turn on pmap_fork interface */
Index: src/sys/arch/x86/x86/pmap.c
diff -u src/sys/arch/x86/x86/pmap.c:1.289 src/sys/arch/x86/x86/pmap.c:1.290
--- src/sys/arch/x86/x86/pmap.c:1.289 Sun Mar 4 23:25:35 2018
+++ src/sys/arch/x86/x86/pmap.c Sat May 19 11:39:37 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.289 2018/03/04 23:25:35 jdolecek Exp $ */
+/* $NetBSD: pmap.c,v 1.290 2018/05/19 11:39:37 jdolecek Exp $ */
/*
* Copyright (c) 2008, 2010, 2016, 2017 The NetBSD Foundation, Inc.
@@ -170,7 +170,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.289 2018/03/04 23:25:35 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.290 2018/05/19 11:39:37 jdolecek Exp $");
#include "opt_user_ldt.h"
#include "opt_lockdebug.h"
@@ -1016,67 +1016,6 @@ pmap_kenter_pa(vaddr_t va, paddr_t pa, v
}
}
-void
-pmap_emap_enter(vaddr_t va, paddr_t pa, vm_prot_t prot)
-{
- pt_entry_t *pte, npte;
-
- KASSERT((prot & ~VM_PROT_ALL) == 0);
- pte = (va < VM_MIN_KERNEL_ADDRESS) ? vtopte(va) : kvtopte(va);
-
-#ifdef DOM0OPS
- if (pa < pmap_pa_start || pa >= pmap_pa_end) {
- npte = pa;
- } else
-#endif
- npte = pmap_pa2pte(pa);
-
- npte = pmap_pa2pte(pa);
- npte |= protection_codes[prot] | PG_V;
- pmap_pte_set(pte, npte);
- pmap_pte_flush();
-}
-
-/*
- * pmap_emap_sync: perform TLB flush or pmap load, if it was deferred.
- */
-void
-pmap_emap_sync(bool canload)
-{
- struct cpu_info *ci = curcpu();
- struct pmap *pmap;
-
- KASSERT(kpreempt_disabled());
- if (__predict_true(ci->ci_want_pmapload && canload)) {
- /*
- * XXX: Hint for pmap_reactivate(), which might suggest to
- * not perform TLB flush, if state has not changed.
- */
- pmap = vm_map_pmap(&curlwp->l_proc->p_vmspace->vm_map);
- if (__predict_false(pmap == ci->ci_pmap)) {
- kcpuset_atomic_clear(pmap->pm_cpus, cpu_index(ci));
- }
- pmap_load();
- KASSERT(ci->ci_want_pmapload == 0);
- } else {
- tlbflush();
- }
-}
-
-void
-pmap_emap_remove(vaddr_t sva, vsize_t len)
-{
- pt_entry_t *pte;
- vaddr_t va, eva = sva + len;
-
- for (va = sva; va < eva; va += PAGE_SIZE) {
- pte = (va < VM_MIN_KERNEL_ADDRESS) ? vtopte(va) : kvtopte(va);
- pmap_pte_set(pte, 0);
- }
-
- pmap_pte_flush();
-}
-
__strict_weak_alias(pmap_kenter_ma, pmap_kenter_pa);
#if defined(__x86_64__)
@@ -2925,9 +2864,7 @@ pmap_reactivate(struct pmap *pmap)
*/
kcpuset_atomic_set(pmap->pm_cpus, cid);
- u_int gen = uvm_emap_gen_return();
tlbflush();
- uvm_emap_update(gen);
}
}
@@ -3027,9 +2964,7 @@ pmap_load(void)
lldt(pmap->pm_ldt_sel);
- u_int gen = uvm_emap_gen_return();
cpu_load_pmap(pmap, oldpmap);
- uvm_emap_update(gen);
ci->ci_want_pmapload = 0;
Index: src/sys/kern/kern_synch.c
diff -u src/sys/kern/kern_synch.c:1.314 src/sys/kern/kern_synch.c:1.315
--- src/sys/kern/kern_synch.c:1.314 Fri Feb 16 07:04:51 2018
+++ src/sys/kern/kern_synch.c Sat May 19 11:39:37 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_synch.c,v 1.314 2018/02/16 07:04:51 ozaki-r Exp $ */
+/* $NetBSD: kern_synch.c,v 1.315 2018/05/19 11:39:37 jdolecek Exp $ */
/*-
* Copyright (c) 1999, 2000, 2004, 2006, 2007, 2008, 2009
@@ -69,7 +69,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_synch.c,v 1.314 2018/02/16 07:04:51 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_synch.c,v 1.315 2018/05/19 11:39:37 jdolecek Exp $");
#include "opt_kstack.h"
#include "opt_perfctrs.h"
@@ -730,7 +730,6 @@ mi_switch(lwp_t *l)
* Restore VM context and IPL.
*/
pmap_activate(l);
- uvm_emap_switch(l);
pcu_switchpoint(l);
if (prevlwp != NULL) {
Index: src/sys/kern/sys_pipe.c
diff -u src/sys/kern/sys_pipe.c:1.144 src/sys/kern/sys_pipe.c:1.145
--- src/sys/kern/sys_pipe.c:1.144 Fri Apr 20 19:02:18 2018
+++ src/sys/kern/sys_pipe.c Sat May 19 11:39:37 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: sys_pipe.c,v 1.144 2018/04/20 19:02:18 jdolecek Exp $ */
+/* $NetBSD: sys_pipe.c,v 1.145 2018/05/19 11:39:37 jdolecek Exp $ */
/*-
* Copyright (c) 2003, 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_pipe.c,v 1.144 2018/04/20 19:02:18 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_pipe.c,v 1.145 2018/05/19 11:39:37 jdolecek Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -92,8 +92,6 @@ __KERNEL_RCSID(0, "$NetBSD: sys_pipe.c,v
#include <sys/atomic.h>
#include <sys/pipe.h>
-#include <uvm/uvm_extern.h>
-
/*
* Use this to disable direct I/O and decrease the code size:
* #define PIPE_NODIRECT
@@ -102,6 +100,10 @@ __KERNEL_RCSID(0, "$NetBSD: sys_pipe.c,v
/* XXX Disabled for now; rare hangs switching between direct/buffered */
#define PIPE_NODIRECT
+#ifndef PIPE_NODIRECT
+#include <uvm/uvm.h>
+#endif
+
static int pipe_read(file_t *, off_t *, struct uio *, kauth_cred_t, int);
static int pipe_write(file_t *, off_t *, struct uio *, kauth_cred_t, int);
static int pipe_close(file_t *);
@@ -509,7 +511,6 @@ again:
* Direct copy, bypassing a kernel buffer.
*/
void *va;
- u_int gen;
KASSERT(rpipe->pipe_state & PIPE_DIRECTW);
@@ -518,15 +519,8 @@ again:
size = uio->uio_resid;
va = (char *)rmap->kva + rmap->pos;
- gen = rmap->egen;
mutex_exit(lock);
-
- /*
- * Consume emap and read the data from loaned pages.
- */
- uvm_emap_consume(gen);
error = uiomove(va, size, uio);
-
mutex_enter(lock);
if (error)
break;
@@ -660,7 +654,6 @@ pipe_loan_free(struct pipe *wpipe)
struct pipemapping * const wmap = &wpipe->pipe_map;
const vsize_t len = ptoa(wmap->npages);
- uvm_emap_remove(wmap->kva, len); /* XXX */
uvm_km_free(kernel_map, wmap->kva, len, UVM_KMF_VAONLY);
wmap->kva = 0;
atomic_add_int(&amountpipekva, -len);
@@ -746,10 +739,12 @@ pipe_direct_write(file_t *fp, struct pip
return (ENOMEM); /* so that caller fallback to ordinary write */
}
- /* Enter the loaned pages to KVA, produce new emap generation number. */
- uvm_emap_enter(wmap->kva + ptoa(starting_color), pgs, npages,
- VM_PROT_READ);
- wmap->egen = uvm_emap_produce();
+ /* Enter the loaned pages to kva */
+ vaddr_t kva = wpipe->pipe_map.kva;
+ for (int j = 0; j < npages; j++, kva += PAGE_SIZE) {
+ pmap_kenter_pa(kva, VM_PAGE_TO_PHYS(pgs[j]), VM_PROT_READ, 0);
+ }
+ pmap_update(pmap_kernel());
/* Now we can put the pipe in direct write mode */
wmap->pos = bpos + ptoa(starting_color);
@@ -791,7 +786,8 @@ pipe_direct_write(file_t *fp, struct pip
mutex_exit(lock);
if (pgs != NULL) {
- /* XXX: uvm_emap_remove */
+ pmap_kremove(wpipe->pipe_map.kva, blen);
+ pmap_update(pmap_kernel());
uvm_unloan(pgs, npages, UVM_LOAN_TOPAGE);
}
if (error || amountpipekva > maxpipekva)
@@ -813,7 +809,7 @@ pipe_direct_write(file_t *fp, struct pip
return (error);
}
- bcnt -= wpipe->cnt;
+ bcnt -= wmap->cnt;
}
uio->uio_resid -= bcnt;
@@ -918,7 +914,7 @@ pipe_write(file_t *fp, off_t *offset, st
*/
if ((uio->uio_iov->iov_len >= PIPE_MINDIRECT) &&
(fp->f_flag & FNONBLOCK) == 0 &&
- (wmap->kva || (amountpipekva < limitpipekva))) {
+ (wpipe->pipe_map.kva || (amountpipekva < limitpipekva))) {
error = pipe_direct_write(fp, wpipe, uio);
/*
Index: src/sys/sys/pipe.h
diff -u src/sys/sys/pipe.h:1.33 src/sys/sys/pipe.h:1.34
--- src/sys/sys/pipe.h:1.33 Fri Jan 22 23:38:45 2016
+++ src/sys/sys/pipe.h Sat May 19 11:39:37 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: pipe.h,v 1.33 2016/01/22 23:38:45 dholland Exp $ */
+/* $NetBSD: pipe.h,v 1.34 2018/05/19 11:39:37 jdolecek Exp $ */
/*
* Copyright (c) 1996 John S. Dyson
@@ -82,7 +82,6 @@ struct pipemapping {
voff_t pos; /* current position within page */
int npages; /* how many pages allocated */
struct vm_page **pgs; /* pointers to the pages */
- u_int egen; /* emap generation number */
};
/*
Index: src/sys/uvm/files.uvm
diff -u src/sys/uvm/files.uvm:1.28 src/sys/uvm/files.uvm:1.29
--- src/sys/uvm/files.uvm:1.28 Fri Dec 23 07:15:28 2016
+++ src/sys/uvm/files.uvm Sat May 19 11:39:37 2018
@@ -1,4 +1,4 @@
-# $NetBSD: files.uvm,v 1.28 2016/12/23 07:15:28 cherry Exp $
+# $NetBSD: files.uvm,v 1.29 2018/05/19 11:39:37 jdolecek Exp $
#
# UVM options
@@ -25,7 +25,6 @@ file uvm/uvm_aobj.c uvm
file uvm/uvm_bio.c uvm
file uvm/uvm_coredump.c coredump
file uvm/uvm_device.c uvm
-file uvm/uvm_emap.c uvm
file uvm/uvm_fault.c uvm
file uvm/uvm_glue.c uvm
file uvm/uvm_init.c uvm
Index: src/sys/uvm/uvm_extern.h
diff -u src/sys/uvm/uvm_extern.h:1.211 src/sys/uvm/uvm_extern.h:1.212
--- src/sys/uvm/uvm_extern.h:1.211 Tue May 8 19:33:57 2018
+++ src/sys/uvm/uvm_extern.h Sat May 19 11:39:37 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_extern.h,v 1.211 2018/05/08 19:33:57 christos Exp $ */
+/* $NetBSD: uvm_extern.h,v 1.212 2018/05/19 11:39:37 jdolecek Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -618,32 +618,6 @@ int ubc_uiomove(struct uvm_object *, s
void ubc_zerorange(struct uvm_object *, off_t, size_t, int);
void ubc_purge(struct uvm_object *);
-/* uvm_emap.c */
-void uvm_emap_sysinit(void);
-#ifdef __HAVE_PMAP_EMAP
-void uvm_emap_switch(lwp_t *);
-#else
-#define uvm_emap_switch(l)
-#endif
-
-u_int uvm_emap_gen_return(void);
-void uvm_emap_update(u_int);
-
-vaddr_t uvm_emap_alloc(vsize_t, bool);
-void uvm_emap_free(vaddr_t, size_t);
-
-void uvm_emap_enter(vaddr_t, struct vm_page **, u_int,
- vm_prot_t);
-void uvm_emap_remove(vaddr_t, vsize_t);
-
-#ifdef __HAVE_PMAP_EMAP
-void uvm_emap_consume(u_int);
-u_int uvm_emap_produce(void);
-#else
-#define uvm_emap_consume(x)
-#define uvm_emap_produce() UVM_EMAP_INACTIVE
-#endif
-
/* uvm_fault.c */
#define uvm_fault(m, a, p) uvm_fault_internal(m, a, p, 0)
int uvm_fault_internal(struct vm_map *, vaddr_t, vm_prot_t, int);
Index: src/sys/uvm/uvm_init.c
diff -u src/sys/uvm/uvm_init.c:1.48 src/sys/uvm/uvm_init.c:1.49
--- src/sys/uvm/uvm_init.c:1.48 Fri Dec 23 07:15:28 2016
+++ src/sys/uvm/uvm_init.c Sat May 19 11:39:37 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_init.c,v 1.48 2016/12/23 07:15:28 cherry Exp $ */
+/* $NetBSD: uvm_init.c,v 1.49 2018/05/19 11:39:37 jdolecek Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_init.c,v 1.48 2016/12/23 07:15:28 cherry Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_init.c,v 1.49 2018/05/19 11:39:37 jdolecek Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -167,12 +167,6 @@ uvm_init(void)
uvm_loan_init();
/*
- * Init emap subsystem.
- */
-
- uvm_emap_sysinit();
-
- /*
* The VM system is now up! Now that kmem is up we can resize the
* <obj,off> => <page> hash table for general use and enable paging
* of kernel objects.