summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/vm
diff options
context:
space:
mode:
authorJohn Levon <john.levon@joyent.com>2018-03-02 17:34:28 +0000
committerPatrick Mooney <pmooney@pfmooney.com>2020-05-08 15:21:40 +0000
commit04909c8c9ef61a86dd44bdaf341a1d9a2f0206e5 (patch)
tree74e23b43e523bc806eb23f6e3bee23498140f503 /usr/src/uts/common/vm
parentbbe1232ef8d8a5a776f6afde8466f315c8143dd4 (diff)
downloadillumos-joyent-04909c8c9ef61a86dd44bdaf341a1d9a2f0206e5.tar.gz
12608 want memory arena for vmm applications
12609 x86 memory DR should be disabled Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com> Reviewed by: Patrick Mooney <patrick.mooney@joyent.com> Reviewed by: Toomas Soome <tsoome@me.com> Approved by: Gordon Ross <gordon.w.ross@gmail.com>
Diffstat (limited to 'usr/src/uts/common/vm')
-rw-r--r--usr/src/uts/common/vm/page_lock.c9
-rw-r--r--usr/src/uts/common/vm/page_retire.c7
-rw-r--r--usr/src/uts/common/vm/seg_kmem.c75
-rw-r--r--usr/src/uts/common/vm/seg_kmem.h18
4 files changed, 63 insertions, 46 deletions
diff --git a/usr/src/uts/common/vm/page_lock.c b/usr/src/uts/common/vm/page_lock.c
index 2a9b2e1f5a..a5a39d04c1 100644
--- a/usr/src/uts/common/vm/page_lock.c
+++ b/usr/src/uts/common/vm/page_lock.c
@@ -141,9 +141,8 @@ static pad_mutex_t pszc_mutex[PSZC_MTX_TABLE_SIZE];
& (VPH_TABLE_SIZE - 1))
/*
- * Two slots after VPH_TABLE_SIZE are reserved in vph_mutex for kernel vnodes.
- * The lock for kvp is VPH_TABLE_SIZE + 0, and the lock for zvp is
- * VPH_TABLE_SIZE + 1.
+ * Two slots after VPH_TABLE_SIZE are reserved in vph_mutex for kernel vnodes,
+ * one for kvps[KV_ZVP], and one for other kvps[] users.
*/
kmutex_t vph_mutex[VPH_TABLE_SIZE + 2];
@@ -880,10 +879,10 @@ static int page_vnode_mutex_stress = 0;
kmutex_t *
page_vnode_mutex(vnode_t *vp)
{
- if (vp == &kvp)
+ if (vp == &kvp || vp == &kvps[KV_VVP])
return (&vph_mutex[VPH_TABLE_SIZE + 0]);
- if (vp == &zvp)
+ if (vp == &kvps[KV_ZVP])
return (&vph_mutex[VPH_TABLE_SIZE + 1]);
#ifdef DEBUG
if (page_vnode_mutex_stress != 0)
diff --git a/usr/src/uts/common/vm/page_retire.c b/usr/src/uts/common/vm/page_retire.c
index 76be970a45..f4e8d0737f 100644
--- a/usr/src/uts/common/vm/page_retire.c
+++ b/usr/src/uts/common/vm/page_retire.c
@@ -22,6 +22,7 @@
* Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
* Copyright (c) 2016 by Delphix. All rights reserved.
+ * Copyright 2018 Joyent, Inc.
*/
/*
@@ -851,9 +852,8 @@ page_retire_incr_pend_count(void *datap)
{
PR_INCR_KSTAT(pr_pending);
- if ((datap == &kvp) || (datap == &zvp)) {
+ if (datap == &kvp || datap == &kvps[KV_ZVP] || datap == &kvps[KV_VVP])
PR_INCR_KSTAT(pr_pending_kas);
- }
}
void
@@ -861,9 +861,8 @@ page_retire_decr_pend_count(void *datap)
{
PR_DECR_KSTAT(pr_pending);
- if ((datap == &kvp) || (datap == &zvp)) {
+ if (datap == &kvp || datap == &kvps[KV_ZVP] || datap == &kvps[KV_VVP])
PR_DECR_KSTAT(pr_pending_kas);
- }
}
/*
diff --git a/usr/src/uts/common/vm/seg_kmem.c b/usr/src/uts/common/vm/seg_kmem.c
index 3ed5660a9f..540f2b251b 100644
--- a/usr/src/uts/common/vm/seg_kmem.c
+++ b/usr/src/uts/common/vm/seg_kmem.c
@@ -122,6 +122,11 @@ vmem_t *static_alloc_arena; /* arena for allocating static memory */
vmem_t *zio_arena = NULL; /* arena for allocating zio memory */
vmem_t *zio_alloc_arena = NULL; /* arena for allocating zio memory */
+#if defined(__amd64)
+vmem_t *kvmm_arena; /* arena for vmm VA */
+struct seg kvmmseg; /* Segment for vmm memory */
+#endif
+
/*
* seg_kmem driver can map part of the kernel heap with large pages.
* Currently this functionality is implemented for sparc platforms only.
@@ -655,13 +660,19 @@ segkmem_dump(struct seg *seg)
segkmem_dump_range, seg->s_as);
vmem_walk(heaptext_arena, VMEM_ALLOC | VMEM_REENTRANT,
segkmem_dump_range, seg->s_as);
+ /*
+ * We don't want to dump pages attached to kzioseg since they
+ * contain file data from ZFS. If this page's segment is
+ * kzioseg return instead of writing it to the dump device.
+ *
+ * Same applies to VM memory allocations.
+ */
} else if (seg == &kzioseg) {
- /*
- * We don't want to dump pages attached to kzioseg since they
- * contain file data from ZFS. If this page's segment is
- * kzioseg return instead of writing it to the dump device.
- */
return;
+#if defined(__amd64)
+ } else if (seg == &kvmmseg) {
+ return;
+#endif
} else {
segkmem_dump_range(seg->s_as, seg->s_base, seg->s_size);
}
@@ -802,21 +813,18 @@ struct seg_ops segkmem_ops = {
};
int
-segkmem_zio_create(struct seg *seg)
-{
- ASSERT(seg->s_as == &kas && RW_WRITE_HELD(&kas.a_lock));
- seg->s_ops = &segkmem_ops;
- seg->s_data = &zvp;
- kas.a_size += seg->s_size;
- return (0);
-}
-
-int
segkmem_create(struct seg *seg)
{
ASSERT(seg->s_as == &kas && RW_WRITE_HELD(&kas.a_lock));
seg->s_ops = &segkmem_ops;
- seg->s_data = &kvp;
+ if (seg == &kzioseg)
+ seg->s_data = &kvps[KV_ZVP];
+#if defined(__amd64)
+ else if (seg == &kvmmseg)
+ seg->s_data = &kvps[KV_VVP];
+#endif
+ else
+ seg->s_data = &kvps[KV_KVP];
kas.a_size += seg->s_size;
return (0);
}
@@ -967,10 +975,10 @@ segkmem_alloc(vmem_t *vmp, size_t size, int vmflag)
return (segkmem_alloc_vn(vmp, size, vmflag, &kvp));
}
-void *
+static void *
segkmem_zio_alloc(vmem_t *vmp, size_t size, int vmflag)
{
- return (segkmem_alloc_vn(vmp, size, vmflag, &zvp));
+ return (segkmem_alloc_vn(vmp, size, vmflag, &kvps[KV_ZVP]));
}
/*
@@ -979,8 +987,8 @@ segkmem_zio_alloc(vmem_t *vmp, size_t size, int vmflag)
* we currently don't have a special kernel segment for non-paged
* kernel memory that is exported by drivers to user space.
*/
-static void
-segkmem_free_vn(vmem_t *vmp, void *inaddr, size_t size, struct vnode *vp,
+void
+segkmem_xfree(vmem_t *vmp, void *inaddr, size_t size, struct vnode *vp,
void (*func)(page_t *))
{
page_t *pp;
@@ -1037,21 +1045,15 @@ segkmem_free_vn(vmem_t *vmp, void *inaddr, size_t size, struct vnode *vp,
}
void
-segkmem_xfree(vmem_t *vmp, void *inaddr, size_t size, void (*func)(page_t *))
-{
- segkmem_free_vn(vmp, inaddr, size, &kvp, func);
-}
-
-void
segkmem_free(vmem_t *vmp, void *inaddr, size_t size)
{
- segkmem_free_vn(vmp, inaddr, size, &kvp, NULL);
+ segkmem_xfree(vmp, inaddr, size, &kvp, NULL);
}
-void
+static void
segkmem_zio_free(vmem_t *vmp, void *inaddr, size_t size)
{
- segkmem_free_vn(vmp, inaddr, size, &zvp, NULL);
+ segkmem_xfree(vmp, inaddr, size, &kvps[KV_ZVP], NULL);
}
void
@@ -1533,8 +1535,21 @@ segkmem_zio_init(void *zio_mem_base, size_t zio_mem_size)
ASSERT(zio_alloc_arena != NULL);
}
-#ifdef __sparc
+#if defined(__amd64)
+
+void
+segkmem_kvmm_init(void *base, size_t size)
+{
+ ASSERT(base != NULL);
+ ASSERT(size != 0);
+
+ kvmm_arena = vmem_create("kvmm_arena", base, size, 1024 * 1024,
+ NULL, NULL, NULL, 0, VM_SLEEP);
+
+ ASSERT(kvmm_arena != NULL);
+}
+#elif defined(__sparc)
static void *
segkmem_alloc_ppa(vmem_t *vmp, size_t size, int vmflag)
diff --git a/usr/src/uts/common/vm/seg_kmem.h b/usr/src/uts/common/vm/seg_kmem.h
index 1db85826b1..9a20101670 100644
--- a/usr/src/uts/common/vm/seg_kmem.h
+++ b/usr/src/uts/common/vm/seg_kmem.h
@@ -21,7 +21,7 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
- * Copyright 2016 Joyent, Inc.
+ * Copyright 2018 Joyent, Inc.
* Copyright 2017 RackTop Systems.
*/
@@ -65,12 +65,18 @@ extern vmem_t *static_arena; /* arena for caches to import static memory */
extern vmem_t *static_alloc_arena; /* arena for allocating static memory */
extern vmem_t *zio_arena; /* arena for zio caches */
extern vmem_t *zio_alloc_arena; /* arena for zio caches */
+
+#if defined(__amd64)
+extern struct seg kvmmseg; /* Segment for vmm mappings */
+extern vmem_t *kvmm_arena; /* arena for vmm VA */
+extern void segkmem_kvmm_init(void *, size_t);
+#endif
+
extern struct vnode kvps[];
/*
- * segkmem page vnodes
+ * segkmem page vnodes (please don't add more defines here...)
*/
#define kvp (kvps[KV_KVP])
-#define zvp (kvps[KV_ZVP])
#if defined(__sparc)
#define mpvp (kvps[KV_MPVP])
#define promvp (kvps[KV_PROMVP])
@@ -83,16 +89,14 @@ extern void *segkmem_xalloc(vmem_t *, void *, size_t, int, uint_t,
extern void *segkmem_alloc(vmem_t *, size_t, int);
extern void *segkmem_alloc_permanent(vmem_t *, size_t, int);
extern void segkmem_free(vmem_t *, void *, size_t);
-extern void segkmem_xfree(vmem_t *, void *, size_t, void (*)(page_t *));
+extern void segkmem_xfree(vmem_t *, void *, size_t,
+ struct vnode *, void (*)(page_t *));
extern void *boot_alloc(void *, size_t, uint_t);
extern void boot_mapin(caddr_t addr, size_t size);
extern void kernelheap_init(void *, void *, char *, void *, void *);
extern void segkmem_gc(void);
-extern void *segkmem_zio_alloc(vmem_t *, size_t, int);
-extern int segkmem_zio_create(struct seg *);
-extern void segkmem_zio_free(vmem_t *, void *, size_t);
extern void segkmem_zio_init(void *, size_t);
/*