summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/cmd/mdb/common/modules/genunix/memory.c18
-rw-r--r--usr/src/uts/common/fs/zfs/dmu.c7
-rw-r--r--usr/src/uts/common/fs/zfs/sys/zfs_znode.h5
-rw-r--r--usr/src/uts/common/fs/zfs/zfs_vnops.c45
-rw-r--r--usr/src/uts/common/vm/seg_kmem.c8
5 files changed, 58 insertions, 25 deletions
diff --git a/usr/src/cmd/mdb/common/modules/genunix/memory.c b/usr/src/cmd/mdb/common/modules/genunix/memory.c
index 6f4ef1ad58..3cff33d22f 100644
--- a/usr/src/cmd/mdb/common/modules/genunix/memory.c
+++ b/usr/src/cmd/mdb/common/modules/genunix/memory.c
@@ -23,8 +23,6 @@
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <mdb/mdb_modapi.h>
#include <sys/types.h>
#include <vm/page.h>
@@ -221,6 +219,7 @@ typedef struct memstat {
struct vnode *ms_kvp; /* Cached address of kernel vnode */
struct vnode *ms_zvp; /* Cached address of zio vnode */
uint64_t ms_kmem; /* Pages of kernel memory */
+ uint64_t ms_zfs_data; /* Pages of zfs data */
uint64_t ms_anon; /* Pages of anonymous memory */
uint64_t ms_vnode; /* Pages of named (vnode) memory */
uint64_t ms_exec; /* Pages of exec/library memory */
@@ -229,8 +228,10 @@ typedef struct memstat {
} memstat_t;
#define MS_PP_ISKAS(pp, stats) \
- (((pp)->p_vnode == (stats)->ms_kvp) || \
- (((stats)->ms_zvp != NULL) && ((pp)->p_vnode == (stats)->ms_zvp)))
+ ((pp)->p_vnode == (stats)->ms_kvp)
+
+#define MS_PP_ISZFS_DATA(pp, stats) \
+ (((stats)->ms_zvp != NULL) && ((pp)->p_vnode == (stats)->ms_zvp))
/*
* Summarize pages by type; called from page walker.
@@ -258,6 +259,8 @@ memstat_callback(page_t *page, page_t *pp, memstat_t *stats)
stats->ms_cachelist++;
else if (vp && IS_SWAPFSVP(vp))
stats->ms_anon++;
+ else if (MS_PP_ISZFS_DATA(pp, stats))
+ stats->ms_zfs_data++;
else if (MS_PP_ISKAS(pp, stats))
stats->ms_kmem++;
else if (vp && (((vp)->v_flag & VVMEXEC)) != 0)
@@ -371,6 +374,13 @@ memstat(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
stats.ms_kmem,
(uint64_t)stats.ms_kmem * pagesize / (1024 * 1024),
MS_PCT_TOTAL(stats.ms_kmem));
+
+ if (stats.ms_zfs_data != 0)
+ mdb_printf("ZFS File Data %16llu %16llu %3lu%%\n",
+ stats.ms_zfs_data,
+ (uint64_t)stats.ms_zfs_data * pagesize / (1024 * 1024),
+ MS_PCT_TOTAL(stats.ms_zfs_data));
+
mdb_printf("Anon %16llu %16llu %3lu%%\n",
stats.ms_anon,
(uint64_t)stats.ms_anon * pagesize / (1024 * 1024),
diff --git a/usr/src/uts/common/fs/zfs/dmu.c b/usr/src/uts/common/fs/zfs/dmu.c
index fdddccbe59..1c50834e6f 100644
--- a/usr/src/uts/common/fs/zfs/dmu.c
+++ b/usr/src/uts/common/fs/zfs/dmu.c
@@ -23,8 +23,6 @@
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <sys/dmu.h>
#include <sys/dmu_impl.h>
#include <sys/dmu_tx.h>
@@ -44,6 +42,7 @@
#include <sys/zio_checksum.h>
#ifdef _KERNEL
#include <sys/vmsystm.h>
+#include <sys/zfs_znode.h>
#endif
const dmu_object_type_info_t dmu_ot[DMU_OT_NUMTYPES] = {
@@ -757,9 +756,9 @@ dmu_write_pages(objset_t *os, uint64_t object, uint64_t offset, uint64_t size,
for (copied = 0; copied < tocpy; copied += PAGESIZE) {
ASSERT3U(pp->p_offset, ==, db->db_offset + bufoff);
thiscpy = MIN(PAGESIZE, tocpy - copied);
- va = ppmapin(pp, PROT_READ, (caddr_t)-1);
+ va = zfs_map_page(pp, S_READ);
bcopy(va, (char *)db->db_data + bufoff, thiscpy);
- ppmapout(va);
+ zfs_unmap_page(pp, va);
pp = pp->p_next;
bufoff += PAGESIZE;
}
diff --git a/usr/src/uts/common/fs/zfs/sys/zfs_znode.h b/usr/src/uts/common/fs/zfs/sys/zfs_znode.h
index bfa21604ff..62c4b5d3bb 100644
--- a/usr/src/uts/common/fs/zfs/sys/zfs_znode.h
+++ b/usr/src/uts/common/fs/zfs/sys/zfs_znode.h
@@ -26,8 +26,6 @@
#ifndef _SYS_FS_ZFS_ZNODE_H
#define _SYS_FS_ZFS_ZNODE_H
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#ifdef _KERNEL
#include <sys/isa_defs.h>
#include <sys/types32.h>
@@ -338,6 +336,9 @@ extern void zfs_log_acl(zilog_t *zilog, dmu_tx_t *tx, znode_t *zp,
extern void zfs_xvattr_set(znode_t *zp, xvattr_t *xvap);
extern void zfs_upgrade(zfsvfs_t *zfsvfs, dmu_tx_t *tx);
+extern caddr_t zfs_map_page(page_t *, enum seg_rw);
+extern void zfs_unmap_page(page_t *, caddr_t);
+
extern zil_get_data_t zfs_get_data;
extern zil_replay_func_t *zfs_replay_vector[TX_MAX_TYPE];
extern int zfsfstype;
diff --git a/usr/src/uts/common/fs/zfs/zfs_vnops.c b/usr/src/uts/common/fs/zfs/zfs_vnops.c
index 85989497e4..509b896cff 100644
--- a/usr/src/uts/common/fs/zfs/zfs_vnops.c
+++ b/usr/src/uts/common/fs/zfs/zfs_vnops.c
@@ -25,8 +25,6 @@
/* Portions Copyright 2007 Jeremy Teo */
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <sys/types.h>
#include <sys/param.h>
#include <sys/time.h>
@@ -47,6 +45,8 @@
#include <vm/seg_vn.h>
#include <vm/pvn.h>
#include <vm/as.h>
+#include <vm/kpm.h>
+#include <vm/seg_kpm.h>
#include <sys/mman.h>
#include <sys/pathname.h>
#include <sys/cmn_err.h>
@@ -303,6 +303,31 @@ zfs_ioctl(vnode_t *vp, int com, intptr_t data, int flag, cred_t *cred,
}
/*
+ * Utility functions to map and unmap a single physical page. These
+ * are used to manage the mappable copies of ZFS file data, and therefore
+ * do not update ref/mod bits.
+ */
+caddr_t
+zfs_map_page(page_t *pp, enum seg_rw rw)
+{
+ if (kpm_enable)
+ return (hat_kpm_mapin(pp, 0));
+ ASSERT(rw == S_READ || rw == S_WRITE);
+ return (ppmapin(pp, PROT_READ | ((rw == S_WRITE) ? PROT_WRITE : 0),
+ (caddr_t)-1));
+}
+
+void
+zfs_unmap_page(page_t *pp, caddr_t addr)
+{
+ if (kpm_enable) {
+ hat_kpm_mapout(pp, 0, addr);
+ } else {
+ ppmapout(addr);
+ }
+}
+
+/*
* When a file is memory mapped, we must keep the IO data synchronized
* between the DMU cache and the memory mapped pages. What this means:
*
@@ -339,13 +364,13 @@ mappedwrite(vnode_t *vp, int nbytes, uio_t *uio, dmu_tx_t *tx)
caddr_t va;
rw_exit(&zp->z_map_lock);
- va = ppmapin(pp, PROT_READ | PROT_WRITE, (caddr_t)-1L);
+ va = zfs_map_page(pp, S_WRITE);
error = uiomove(va+off, bytes, UIO_WRITE, uio);
if (error == 0) {
dmu_write(zfsvfs->z_os, zp->z_id,
woff, bytes, va+off, tx);
}
- ppmapout(va);
+ zfs_unmap_page(pp, va);
page_unlock(pp);
} else {
error = dmu_write_uio(zfsvfs->z_os, zp->z_id,
@@ -388,9 +413,9 @@ mappedread(vnode_t *vp, int nbytes, uio_t *uio)
if (pp = page_lookup(vp, start, SE_SHARED)) {
caddr_t va;
- va = ppmapin(pp, PROT_READ, (caddr_t)-1L);
+ va = zfs_map_page(pp, S_READ);
error = uiomove(va + off, bytes, UIO_READ, uio);
- ppmapout(va);
+ zfs_unmap_page(pp, va);
page_unlock(pp);
} else {
error = dmu_read_uio(os, zp->z_id, uio, bytes);
@@ -3609,10 +3634,10 @@ top:
}
if (zp->z_blksz <= PAGESIZE) {
- caddr_t va = ppmapin(pp, PROT_READ, (caddr_t)-1);
+ caddr_t va = zfs_map_page(pp, S_READ);
ASSERT3U(len, <=, PAGESIZE);
dmu_write(zfsvfs->z_os, zp->z_id, off, len, va, tx);
- ppmapout(va);
+ zfs_unmap_page(pp, va);
} else {
err = dmu_write_pages(zfsvfs->z_os, zp->z_id, off, len, pp, tx);
}
@@ -3895,9 +3920,9 @@ zfs_fillpage(vnode_t *vp, u_offset_t off, struct seg *seg,
cur_pp = pp;
for (total = io_off + io_len; io_off < total; io_off += PAGESIZE) {
ASSERT3U(io_off, ==, cur_pp->p_offset);
- va = ppmapin(cur_pp, PROT_READ | PROT_WRITE, (caddr_t)-1);
+ va = zfs_map_page(cur_pp, S_WRITE);
err = dmu_read(os, oid, io_off, PAGESIZE, va);
- ppmapout(va);
+ zfs_unmap_page(cur_pp, va);
if (err) {
/* On error, toss the entire kluster */
pvn_read_done(pp, B_ERROR);
diff --git a/usr/src/uts/common/vm/seg_kmem.c b/usr/src/uts/common/vm/seg_kmem.c
index fa9663f2c9..b83e1e0011 100644
--- a/usr/src/uts/common/vm/seg_kmem.c
+++ b/usr/src/uts/common/vm/seg_kmem.c
@@ -23,8 +23,6 @@
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <sys/types.h>
#include <sys/t_lock.h>
#include <sys/param.h>
@@ -1501,10 +1499,10 @@ segkmem_zio_init(void *zio_mem_base, size_t zio_mem_size)
ASSERT(zio_mem_base != NULL);
ASSERT(zio_mem_size != 0);
- zio_arena = vmem_create("zio", zio_mem_base, zio_mem_size, PAGESIZE,
- NULL, NULL, NULL, 0, VM_SLEEP);
+ zio_arena = vmem_create("zfs_file_data", zio_mem_base, zio_mem_size,
+ PAGESIZE, NULL, NULL, NULL, 0, VM_SLEEP);
- zio_alloc_arena = vmem_create("zio_buf", NULL, 0, PAGESIZE,
+ zio_alloc_arena = vmem_create("zfs_file_data_buf", NULL, 0, PAGESIZE,
segkmem_zio_alloc, segkmem_zio_free, zio_arena, 0, VM_SLEEP);
ASSERT(zio_arena != NULL);