diff options
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/cmd/mdb/common/modules/genunix/memory.c | 18 | ||||
-rw-r--r-- | usr/src/uts/common/fs/zfs/dmu.c | 7 | ||||
-rw-r--r-- | usr/src/uts/common/fs/zfs/sys/zfs_znode.h | 5 | ||||
-rw-r--r-- | usr/src/uts/common/fs/zfs/zfs_vnops.c | 45 | ||||
-rw-r--r-- | usr/src/uts/common/vm/seg_kmem.c | 8 |
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); |