dmu_buf

2012/10/21

dmu_buf 定義

typedef struct dmu_buf {
        uint64_t db_object;         /* この buffer が所属する object */
        uint64_t db_offset;         /* この object 中の byte offset */
        uint64_t db_size;           /* buffer のサイズ(byte) */
       void *db_data;              /* buffer 中の data */
} dmu_buf_t;

dmu_buf_impl 定義

typedef struct dmu_buf_impl {
        /*
         * 以下のメンバーは db_mtx によって保護されており、
         * db.db_data を除いて、不変です。
         */

        /* 公開されるている構造体 */
        dmu_buf_t db;

        /* 所属する objset */
        struct objset *db_objset;

        /*
         * dnode に安全にアクセスするための handle (NULL when evicted)
         */
        struct dnode_handle *db_dnode_handle;

        /*
         * our parent buffer; if the dnode points to us directly,
         * db_parent == db_dnode_handle->dnh_dnode->dn_dbuf
         * only accessed by sync thread ???
         * (NULL when evicted)
         * May change from NULL to non-NULL under the protection of db_mtx
         * (see dbuf_check_blkptr())
         */
        struct dmu_buf_impl *db_parent;

        /*
         * link for hash table of all dmu_buf_impl_t's
         */
        struct dmu_buf_impl *db_hash_next;

        /* our block number */
        uint64_t db_blkid;

        /*
         * Pointer to the blkptr_t which points to us. May be NULL if we
         * don't have one yet. (NULL when evicted)
         */
        blkptr_t *db_blkptr;

        /*
         * Our indirection level.  Data buffers have db_level==0.
         * Indirect buffers which point to data buffers have
         * db_level==1. etc.  Buffers which contain dnodes have
         * db_level==0, since the dnodes are stored in a file.
         */
        uint8_t db_level;

        /* db_mtx protects the members below */
        kmutex_t db_mtx;

        /*
         * Current state of the buffer
         */
        dbuf_states_t db_state;

        /*
         * Refcount accessed by dmu_buf_{hold,rele}.
         * If nonzero, the buffer can't be destroyed.
         * Protected by db_mtx.
         */
        refcount_t db_holds;

        /* buffer holding our data */
        arc_buf_t *db_buf;

        kcondvar_t db_changed;
        dbuf_dirty_record_t *db_data_pending;

        /* pointer to most recent dirty record for this buffer */
        dbuf_dirty_record_t *db_last_dirty;

        /*
         * Our link on the owner dnodes's dn_dbufs list.
         * Protected by its dn_dbufs_mtx.
         */
        list_node_t db_link;

        /* Data which is unique to data (leaf) blocks: */

        /* stuff we store for the user (see dmu_buf_set_user) */
        void *db_user_ptr;
        void **db_user_data_ptr_ptr;
        dmu_buf_evict_func_t *db_evict_func;

        uint8_t db_immediate_evict;
        uint8_t db_freed_in_flight;

        uint8_t db_dirtycnt;
} dmu_buf_impl_t;

サンプルデータ

# mdb -k
> !ls -li /var/adm
total 14144
      1067 drwxrwxr-x   5 adm      adm            5 10月 21日 2011年 acct
      6155 -rw-------   1 uucp     bin            0 10月 21日 2011年 aculog
      1070 drwxr-xr-x   2 adm      adm            4  7月 25日  16:58 exacct
     12389 -r--r--r--   1 root     root          28 10月 19日  16:13 lastlog
      1068 drwxr-xr-x   2 adm      adm            2 10月 21日 2011年 log
    438616 -rw-r--r--   1 root     root           0 10月 17日  03:10 messages
    438556 -rw-r--r--   1 root     root        3566 10月 16日  11:35 messages.0
    438505 -rw-r--r--   1 root     root        1242 10月  9日  11:00 messages.1
    438452 -rw-r--r--   1 root     root         133  9月 28日  18:08 messages.2
    413763 -rw-r--r--   1 root     root      241942  9月 25日  16:24 messages.3
      1069 drwxr-xr-x   2 root     sys            2 10月 21日 2011年 pool
      1066 drwxrwxr-x   2 adm      sys            2 10月 21日 2011年 sa
      1064 drwxr-xr-x   2 root     sys            2 10月 21日 2011年 sm.bin
      1065 drwxr-xr-x   2 root     sys            2 10月 21日 2011年 streams
    315396 -rw-------   1 root     root        1366  3月 20日 2000年 sulog
      6154 lrwxrwxrwx   1 root     root          27  2月 21日 2012年 utmpx -> ../../system/volatile/utmpx
      6153 -rw-r--r--   1 adm      adm      6818760 10月 19日  16:13 wtmpx
> ::dbufs -n rpool/ROOT/solaris-4/var -o 0t438556
0x3001e0aa1c8
0x3082ab43e18
> 0x3001e0aa1c8::dbuf
        addr object lvl blkid holds os
3001e0aa1c8    6b11c 0     bonus  1 rpool/ROOT/solaris-4/var
> 3001e0aa1c8::print -a dmu_buf_impl_t
3001e0aa1c8 {
    3001e0aa1c8 db = {
        3001e0aa1c8 db_object = 0x6b11c
        3001e0aa1d0 db_offset = 0xffffffffffffffff
        3001e0aa1d8 db_size = 0x140
        3001e0aa1e0 db_data = 0x30010943800
    }
    3001e0aa1e8 db_objset = 0x300121fdb80
    3001e0aa1f0 db_dnode_handle = 0x3082b0650d0
    3001e0aa1f8 db_parent = 0x30a662dc9e0
    3001e0aa200 db_hash_next = 0
    3001e0aa208 db_blkid = 0xffffffffffffffff
    3001e0aa210 db_blkoff = 0
    3001e0aa214 db_level = 0
    3001e0aa218 db_mtx = {
        3001e0aa218 _opaque = [ 0 ]
    }
    3001e0aa220 db_birth = 0
    3001e0aa228 db_state = 4 (DB_CACHED)
    3001e0aa230 db_holds = {
        3001e0aa230 rc_count = 0x1
    }
    3001e0aa238 db_writers_waiting = 0
    3001e0aa240 db_ref = 0x3001200fdf0
    3001e0aa248 db_changed = {
        3001e0aa248 _opaque = 0
    }
    3001e0aa250 db_last_dirty = 0
    3001e0aa258 db_data_pending = 0
    3001e0aa260 db_link = {
        3001e0aa260 list_next = 0
        3001e0aa268 list_prev = 0
    }
    3001e0aa270 db_user_ptr = 0x300153f27d8
    3001e0aa278 db_user_data_ptr_ptr = 0
    3001e0aa280 db_evict_func = sa_evict
    3001e0aa288 db_immediate_evict = 0x1
    3001e0aa289 db_freed_in_flight = 0
    3001e0aa28a db_managed = 0x1
    3001e0aa28b db_dirtycnt = 0
}
Read more ...

objset

2012/10/17

objset 定義

struct objset {
        /* Immutable: */
        struct dsl_dataset *os_dsl_dataset;
        spa_t *os_spa;
        arc_buf_t *os_phys_buf;
        objset_phys_t *os_phys;
        /*
         * The following "special" dnodes have no parent and are exempt from
         * dnode_move(), but they root their descendents in this objset using
         * handles anyway, so that all access to dnodes from dbufs consistently
         * uses handles.
         */
        dnode_handle_t os_meta_dnode;
        dnode_handle_t os_userused_dnode;
        dnode_handle_t os_groupused_dnode;
        zilog_t *os_zil;

        /* can change, under dsl_dir's locks: */
        uint8_t os_checksum;
        uint8_t os_compress;
        uint8_t os_copies;
        uint8_t os_dedup_checksum;
        uint8_t os_dedup_verify;
        uint8_t os_logbias;
        uint8_t os_primary_cache;
        uint8_t os_secondary_cache;
        uint8_t os_sync;

        /* no lock needed: */
        struct dmu_tx *os_synctx; /* XXX sketchy */
        blkptr_t *os_rootbp;
        zil_header_t os_zil_header;
        list_t os_synced_dnodes;
        uint64_t os_flags;

        /* Protected by os_obj_lock */
        kmutex_t os_obj_lock;
        uint64_t os_obj_next;

        /* Protected by os_lock */
        kmutex_t os_lock;
        list_t os_dirty_dnodes[TXG_SIZE];
        list_t os_free_dnodes[TXG_SIZE];
        list_t os_dnodes;
        list_t os_downgraded_dbufs;

        /* stuff we store for the user */
        kmutex_t os_user_ptr_lock;
        void *os_user_ptr;

        /* SA layout/attribute registration */
        sa_os_t *os_sa;
};

サンプルデータ

> 0t602::pid2proc |::pfiles -p
FD   TYPE            VNODE PATH
   0  DIR ffffff01cd29a840 /
   1  DIR ffffff01cd29a840 /
   2  DIR ffffff01cd29a840 /
   3 DOOR ffffff01e111a080 /system/volatile/name_service_door
   4  CHR ffffff01e0fc3e80 /devices/pseudo/sysmsg@0:sysmsg
   5  REG ffffff01d9f06b40 /var/adm/messages
   6  REG ffffff01e047d940 /var/log/syslog
   7  CHR ffffff01e0fc3280 /devices/pseudo/log@0:log
   8 DOOR ffffff01ec9a0b00
> ffffff01d9f06b40::print vnode_t v_data
v_data = 0xffffff01d9f05d28
> 0xffffff01d9f05d28::print znode_t z_zfsvfs
z_zfsvfs = 0xffffff01d1e5c080
> 0xffffff01d1e5c080::print zfsvfs_t z_os
z_os = 0xffffff01cf675900
> 0xffffff01cf675900::print objset_t
{
    os_dsl_dataset = 0xffffff01d172b9c0
    os_spa = 0xffffff01cda50000
    os_phys_buf = 0xffffff01d6c47d88
    os_phys = 0xffffff01cf433800
    os_meta_dnode = {
        dnh_rwlock = {
            _opaque = [ 0 ]
        }
        dnh_dnode = 0xffffff01d6c3d658
    }
    os_userused_dnode = {
        dnh_rwlock = {
            _opaque = [ 0 ]
        }
        dnh_dnode = 0xffffff01d6c3d948
    }
    os_groupused_dnode = {
        dnh_rwlock = {
            _opaque = [ 0 ]
        }
        dnh_dnode = 0xffffff01d6c3dc38
    }
    os_zil = 0xffffff01d313e1c0
    os_checksum = 0x7
    os_compress = 0x2
    os_copies = 0x1
    os_dedup_checksum = 0x2
    os_dedup_verify = 0
    os_logbias = 0
    os_primary_cache = 0x2
    os_secondary_cache = 0x2
    os_sync = 0
    os_crypt = 0x2
    os_synctx = 0xffffff01ecaa4960
    os_last_sync = 0x295a
    os_initializing = 0 (B_FALSE)
    os_zil_header = {
        zh_claim_txg = 0
        zh_replay_seq = 0
        zh_log = {
            blk_dva = [
                {
                    dva_word = [ 0x48, 0x102ff63 ]
                },
                {
                    dva_word = [ 0, 0 ]
                },
                {
                    dva_word = [ 0, 0 ]
                },
            ]
            blk_prop = 0x8009090200470047
            blk_pad = [ 0, 0 ]
            blk_phys_birth = 0
            blk_birth = 0x2958
            blk_fill = 0
            blk_cksum = {
                zc_word = [ 0x367aae96ac0e7439, 0xc383ae890100e6d8, 0x3c, 0x4a ]
            }
        }
        zh_claim_blk_seq = 0
        zh_flags = 0
        zh_claim_lr_seq = 0
        zh_pad = [ 0, 0, 0 ]
    }
    os_synced_dnodes = {
        list_size = 0x2f0
        list_offset = 0xb8
        list_head = {
            list_next = 0xffffff01cf675a50
            list_prev = 0xffffff01cf675a50
        }
    }
    os_flags = 0x1
    os_obj_lock = {
        _opaque = [ 0 ]
    }
    os_obj_next = 0x716d
    os_lock = {
        _opaque = [ 0 ]
    }
    os_dirty_dnodes = [
        {
            list_size = 0x2f0
            list_offset = 0x98
            list_head = {
                list_next = 0xffffff01cf675a90
                list_prev = 0xffffff01cf675a90
            }
        },
        {
            list_size = 0x2f0
            list_offset = 0xa8
            list_head = {
                list_next = 0xffffff01cf675ab0
                list_prev = 0xffffff01cf675ab0
            }
        },
        {
            list_size = 0x2f0
            list_offset = 0xb8
            list_head = {
                list_next = 0xffffff01cf675ad0
                list_prev = 0xffffff01cf675ad0
            }
        },
        {
            list_size = 0x2f0
            list_offset = 0xc8
            list_head = {
                list_next = 0xffffff01cf675af0
                list_prev = 0xffffff01cf675af0
            }
        },
    ]
    os_free_dnodes = [
        {
            list_size = 0x2f0
            list_offset = 0x98
            list_head = {
                list_next = 0xffffff01cf675b10
                list_prev = 0xffffff01cf675b10
            }
        },
        {
            list_size = 0x2f0
            list_offset = 0xa8
            list_head = {
                list_next = 0xffffff01cf675b30
                list_prev = 0xffffff01cf675b30
            }
        },
        {
            list_size = 0x2f0
            list_offset = 0xb8
            list_head = {
                list_next = 0xffffff01cf675b50
                list_prev = 0xffffff01cf675b50
            }
        },
        {
            list_size = 0x2f0
            list_offset = 0xc8
            list_head = {
                list_next = 0xffffff01cf675b70
                list_prev = 0xffffff01cf675b70
            }
        },
    ]
    os_dnodes = {
        list_size = 0x2f0
        list_offset = 0x8
        list_head = {
            list_next = 0xffffff01ee99ecc8
            list_prev = 0xffffff01d6c3d660
        }
    }
    os_downgraded_dbufs = {
        list_size = 0xc8
        list_offset = 0x98
        list_head = {
            list_next = 0xffffff01cf675bb0
            list_prev = 0xffffff01cf675bb0
        }
    }
    os_user_ptr_lock = {
        _opaque = [ 0 ]
    }
    os_user_ptr = 0xffffff01d1e5c080
    os_sa = 0xffffff01d392b510
    os_destroy_nokey = 0 (B_FALSE)
}

Read more ...

zfsvfs

2012/10/16

zfsvfs 定義

struct zfsvfs {
        vfs_t           *z_vfs;         /* generic fs struct */
        zfsvfs_t        *z_parent;      /* parent fs */
        objset_t        *z_os;          /* objset reference */
        uint64_t        z_root;         /* id of root znode */
        uint64_t        z_unlinkedobj;  /* id of unlinked zapobj */
        uint64_t        z_max_blksz;    /* maximum block size for files */
        uint64_t        z_fuid_obj;     /* fuid table object number */
        uint64_t        z_fuid_size;    /* fuid table size */
        avl_tree_t      z_fuid_idx;     /* fuid tree keyed by index */
        avl_tree_t      z_fuid_domain;  /* fuid tree keyed by domain */
        krwlock_t       z_fuid_lock;    /* fuid lock */
        boolean_t       z_fuid_loaded;  /* fuid tables are loaded */
        boolean_t       z_fuid_dirty;   /* need to sync fuid table ? */
        struct zfs_fuid_info    *z_fuid_replay; /* fuid info for replay */
        zilog_t         *z_log;         /* intent log pointer */
        uint_t          z_acl_mode;     /* acl chmod/mode behavior */
        uint_t          z_acl_inherit;  /* acl inheritance behavior */
        zfs_case_t      z_case;         /* case-sense */
        boolean_t       z_utf8;         /* utf8-only */
        int             z_norm;         /* normalization flags */
        boolean_t       z_atime;        /* enable atimes mount option */
        boolean_t       z_unmounted;    /* unmounted */
        rrwlock_t       z_teardown_lock;
        krwlock_t       z_teardown_inactive_lock;
        list_t          z_all_znodes;   /* all vnodes in the fs */
        kmutex_t        z_znodes_lock;  /* lock for z_all_znodes */
        vnode_t         *z_ctldir;      /* .zfs directory pointer */
        boolean_t       z_show_ctldir;  /* expose .zfs in the root dir */
        boolean_t       z_issnap;       /* true if this is a snapshot */
        boolean_t       z_vscan;        /* virus scan on/off */
        boolean_t       z_use_fuids;    /* version allows fuids */
        boolean_t       z_replay;       /* set during ZIL replay */
        boolean_t       z_use_sa;       /* version allow system attributes */
        uint64_t        z_version;      /* ZPL version */
        uint64_t        z_shares_dir;   /* hidden shares dir */
        kmutex_t        z_lock;
        uint64_t        z_userquota_obj;
        uint64_t        z_groupquota_obj;
        uint64_t        z_replay_eof;   /* New end of file - replay only */
        sa_attr_type_t  *z_attr_table;  /* SA attr mapping->id */
#define  ZFS_OBJ_MTX_SZ       64
        kmutex_t        z_hold_mtx[ZFS_OBJ_MTX_SZ];     /* znode hold locks */
};

サンプルデータ

> 0t592::pid2proc |::pfiles -p
FD   TYPE            VNODE PATH
   0  DIR ffffff01cd29a840 /
   1  DIR ffffff01cd29a840 /
   2  DIR ffffff01cd29a840 /
   3 DOOR ffffff01e09f1380 /system/volatile/name_service_door
   4  CHR ffffff01e0702600 /devices/pseudo/sysmsg@0:sysmsg
   5  REG ffffff01d0d28100 /var/adm/messages
   6  REG ffffff01da061b40 /var/log/syslog
   7  CHR ffffff01e7964500 /devices/pseudo/log@0:log
   8 DOOR ffffff01e7964200
> ffffff01d0d28100::print -a vnode_t v_data
ffffff01d0d28110 v_data = 0xffffff01d1346148
> 0xffffff01d1346148::print znode_t z_zfsvfs
z_zfsvfs = 0xffffff01d2e2e480
> 0xffffff01d2e2e480::print zfsvfs_t
{
    z_vfs = 0xffffff01cf7081e8
    z_parent = 0xffffff01d2e2e480
    z_os = 0xffffff01d1faea00
    z_root = 0x4
    z_unlinkedobj = 0x3
    z_max_blksz = 0x20000
    z_fuid_obj = 0
    z_fuid_size = 0
    z_fuid_idx = {
        avl_root = 0
        avl_compar = 0
        avl_offset = 0
        avl_numnodes = 0
        avl_size = 0
    }
    z_fuid_domain = {
        avl_root = 0
        avl_compar = 0
        avl_offset = 0
        avl_numnodes = 0
        avl_size = 0
    }
    z_fuid_lock = {
        _opaque = [ 0 ]
    }
    z_fuid_loaded = 0 (B_FALSE)
    z_fuid_dirty = 0 (B_FALSE)
    z_fuid_replay = 0
    z_log = 0xffffff01d096d380
    z_acl_inherit = 0x4
    z_acl_mode = 0
    z_case = 0x2 (ZFS_CASE_MIXED)
    z_utf8 = 0 (B_FALSE)
    z_norm = 0x2
    z_atime = 0x1 (B_TRUE)
    z_unmounted = 0 (B_FALSE)
    z_teardown_lock = {
        rr_lock = {
            _opaque = [ 0 ]
        }
        rr_cv = {
            _opaque = 0
        }
        rr_writer = 0
        rr_anon_rcount = {
            rc_count = 0
        }
        rr_linked_rcount = {
            rc_count = 0
        }
        rr_writer_wanted = 0 (B_FALSE)
    }
    z_teardown_inactive_lock = {
        _opaque = [ 0 ]
    }
    z_all_znodes = {
        list_size = 0x118
        list_offset = 0xf8
        list_head = {
            list_next = 0xffffff01d398eae8
            list_prev = 0xffffff01d32fc240
        }
    }
    z_znodes_lock = {
        _opaque = [ 0 ]
    }
    z_ctldir = 0xffffff01d3121b80
    z_show_ctldir = 0 (B_FALSE)
    z_issnap = 0 (B_FALSE)
    z_vscan = 0 (B_FALSE)
    z_use_fuids = 0x1 (B_TRUE)
    z_replay = 0 (B_FALSE)
    z_use_sa = 0x1 (B_TRUE)
    z_version = 0x5
    z_shares_dir = 0x7
    z_lock = {
        _opaque = [ 0 ]
    }
    z_userquota_obj = 0
    z_groupquota_obj = 0
    z_replay_eof = 0
    z_attr_table = 0xffffff01d387d5c8
    z_tslabel = 0
    z_hold_mtx = [
        {
            _opaque = [ 0 ]
        },
        {
            _opaque = [ 0 ]
        },
        {
            _opaque = [ 0 ]
        },
    ... ]
}


Read more ...

mdb写経/仮想メモリー

2012/10/16

dcmds

address ::addr2smap [offset]

カーネルの segmap アドレス空間セグメント内の指定されたアドレスに対応する smap 構造体アドレスを出力します。

> ffffff01d1399e40::addr2smap ffffff01d1399e40 is smap ffffff01cbd94fc0

as ::as2proc

as_t アドレス as に対応するプロセスの proc_t アドレスを表示します。

> 300169b40f8::as2proc |::print proc_t p_user.u_psargs p_user.u_psargs = [ "/usr/bin/login" ]


[ address ] ::memlist [-aiv]

指定された memlist_t 構造体または既知の memlist_t 構造体の 1 つを表示します。

-i 物理的にインストールされているメモリーを表す memlist が表示されます
-a 利用できる物理メモリーを表す memlist が表示されます
-v 利用できる仮想メモリーを表す memlist が表示されます
> ::memlist -i phys_install: ADDR BASE SIZE 000000000195e5e0 0 10000000 000000000195e600 20000000 10000000
> ::memlist -v virt_avail: ADDR BASE SIZE 000000000195e680 0 1000000 000000000195e6a0 1400000 400000 000000000195e6c0 1c80000 6e380000 000000000195e6e0 700de000 7ff22000 000000000195e700 f0800000 e5f0000 000000000195e720 fef00000 b8000 000000000195e740 feff6000 a000 000000000195e760 fff00000 4000 000000000195e780 fff0e000 4000 000000000195e7a0 fff16000 4000 000000000195e7c0 fff26000 14000 000000000195e7e0 ffff0000 e000 000000000195e800 100000000 2ff00002000 000000000195e820 3000003a000 8000 000000000195e840 3000006a000 18000 000000000195e860 300000d6000 28000 000000000195e880 30000112000 4000 000000000195e8a0 300003a4000 3c000 000000000195e8c0 30000400000 824000 000000000195e8e0 30000c3c000 34000 000000000195e900 30000c80000 10000 000000000195e920 30000d70000 30000 000000000195e940 30000dac000 4000 000000000195e960 30000dd4000 30000 000000000195e980 30000f00000 3ffff100000 000000000195e9a0 70000c00000 ffff400000 000000000195e9c0 fffff80000000000 7fc00000000
> ::memlist -a phys_avail: ADDR BASE SIZE 000000000195e9e0 0 10000000 000000000195ea00 20000000 9bae000 000000000195eb20 2a940000 2c0000 000000000195ea20 2ac6e000 4390000 000000000195ea40 2f23e000 1c2000 000000000195eb40 2f600000 200000 000000000195ea60 2fc08000 a6000 000000000195ea80 2fcb0000 2000 000000000195eaa0 2fcf2000 4a000 000000000195eac0 2fd40000 16c000 000000000195eae0 2feb6000 a000 000000000195eb00 2fee6000 8000


::memstat

システム全体のメモリー使用状況の要約を表示します。システムメモリーの合計とともに、さまざまなクラスのページ (カーネル、匿名メモリー、実行可能ファイルとライブラリ、ページキャッシュ、および空きリスト) が消費しているシステムメモリーの量とパーセンテージが表示されます。

> ::memstat Page Summary Pages MB %Tot ------------ ---------------- ---------------- ---- Kernel 66783 260 26% ZFS File Data 76886 300 30% Anon 27284 106 10% Exec and libs 1573 6 1% Page cache 5221 20 2% Free (cachelist) 8064 31 3% Free (freelist) 74184 289 29% Total 259995 1015 Physical 259994 1015


[ address ] ::page

指定された page_t 構造体のプロパティーを表示します。page_t アドレスを指定しないと、dcmd はすべてのシステムページのプロパティーを表示します。

> ::page PAGE VNODE OFFSET SELOCK LCT COW IO FS ST 000007000160a780 3000ae57d80 0 0 0 0 0 0 0 00000700016a7a80 3000ae57880 0 0 0 0 0 0 0 0000070001663000 3000ae57080 0 0 0 0 0 0 0 00000700016ac900 3000ae57180 0 0 0 0 0 0 0 000007000162b180 3000ae57280 0 0 0 0 0 0 0 000007000162d280 3000ae57380 0 0 0 0 0 0 0 000007000167ab00 3000ae56c80 0 0 0 0 0 0 0 0000070000026900 3000ae56980 14000 0 0 0 0 0 0 0000070001707200 3000ae56980 16000 0 0 0 0 0 80 : :


seg ::seg

指定されたアドレス空間セグメント(seg 構造体)をフォーマットし、表示します。

> ::seg SEG BASE SIZE DATA OPS 3000250dfc0 3000250c040 300001c2170 0 0xffffffff00000000


[ address ] ::swapinfo

アクティブな swapinfo 構造体すべて、あるいは指定された swapinfo 構造体についての情報を表示します。各構造体の v ノード、ファイル名、および統計が表示されます。

> ::swapinfo ADDR VNODE PAGES FREE NAME ffffff00c9430ef0 ffffff00ca42f540 262143 262143 /dev/zvol/dsk/rpool/swap


vnode ::vnode2smap [offset]

指定された vnode_t 構造体のアドレスおよびオフセットに対応する smap 構造体アドレスを出力します。


walker

anon

指定された anon_map 構造体のアドレスを開始点として使用して、関連する anon 構造体のセットに対して反復適用します。

> 30016ed4028::walk anon |::print struct anon an_off an_off = 0xc005c28000 an_off = 0xc005ba8000 an_off = 0xc005a78000 an_off = 0xc005a78000

anonmap_cache

anonmap_cache のすべての anon_map 構造体に対して反復適用します。

> ::walk anonmap_cache |::print struct anon_map ahp ahp = 0x3001bd24488 ahp = 0x300154b99b0 ahp = 0x3001c6deeb8 ahp = 0x300154b94d0 ahp = 0x3001c2b4748 ahp = 0x300154b9a90 : :

anon_cache

anon_cache のすべての anon 構造体に対して反復適用します。

> ::walk anon_cache |::print struct anon an_vp |::vnode2path /system/volatile/svc_nonpersist.db /system/volatile/nfs-mountd.lock /system/volatile/in.routed.pid /system/volatile/init-next.state /system/volatile/svc_nonpersist.db /system/volatile/svc_nonpersist.db : :

as_cache cache

as_cache cache のすべての as 構造体に対して反復適用します。

> ::walk as_cache cache |::print struct as a_proc |::ps S PID PPID PGID SID UID FLAGS ADDR NAME R 1607 11 1607 1607 0 0x4a004000 000003000b933000 login R 1019 1 1019 1019 25 0x52010000 00000300171dd058 sendmail R 1020 1 1020 1020 0 0x52010000 00000300169bf030 sendmail R 586 1 585 585 0 0x42000000 00000300169be0d8 in.routed R 690 1 689 689 0 0x42020000 0000030017467070 dhcpagent R 511 1 510 510 0 0x42000000 000003001400a088 sshd R 539 1 539 539 0 0x42000000 00000300169320c8 syslogd R 484 1 484 484 1 0x42000000 000003000c43e068 lockd : :

memlist

指定された memlist_t 構造体のスパンに対して反復適用します。この walker を ::memlist dcmd と組み合わせて使用すると、各スパンを表示できます。

> 0000000001a3e860::walk memlist |::print memlist_t ml_address ml_address = 0x8000000 ml_address = 0x62c6e000 ml_address = 0x70000000 ml_address = 0x8178a000 ml_address = 0x8178e000 ml_address = 0x81792000 ml_address = 0x81a44000 ml_address = 0x82000000 ml_address = 0x87e84000 ml_address = 0x87e8c000 ml_address = 0x87eaa000 ml_address = 0x87f44000 ml_address = 0x87f8a000

page

すべてのシステムの page 構造体に対して反復適用します。明示的なアドレスを walk に指定すると、vノードのアドレスとして解釈され、walker は vノードに関連するページだけに対して反復適用します。

> ::walk page |::print page_t p_vnode |::vnode2path /system/volatile/system-console-login:vt6.log /system/volatile/network-routing-route:default.log /system/volatile/network-security-krb5kdc:default.log /system/volatile/system-hotplug:default.log /system/volatile/system-fmd:default.log : :

seg

指定された as_t 構造体のアドレスを開始点として使用して、指定されたアドレス空間に関連するアドレス空間セグメント (seg 構造体) のセットに対して反復適用します。

> 3000250dfc0$<seg { s_base = 0x3000250c040 s_size = 0x300001c2170 s_szc = 0x300 s_flags = 0xbe9dfc8 s_as = 1 s_tree = { avl_child = [ 0, 0x19 ] avl_pcb = 0x19 } s_ops = 0xffffffff00000000 s_data = 0 s_pmtx = { _opaque = [ 0x3000250e080 ] } s_phead = { p_lnext = 0x3000250e180 p_lprev = 0x1000000ffffffff } }

swapinfo

アクティブな swapinfo 構造体のリストに対して反復適用します。この walker は ::swapinfo dcmd と組み合わせて使用できます。

> ::walk swapinfo |::print struct swapinfo { si_soff = 0x2000 si_eoff = 0x40000000 si_vp = 0x3000c434080 si_next = 0 si_allocs = 0 si_flags = 0 si_npgs = 0x1ffff si_nfpgs = 0x1ffff si_pnamelen = 0x19 si_pname = 0x3000beaa0e8 "/dev/zvol/dsk/rpool/swap" si_mapsize = 0x4000 si_swapslots = 0x3000bd06000 si_hint = 0 si_checkcnt = 0 si_alloccnt = 0 }
Read more ...

mdb写経/IOドライバ

2012/10/16

dcmds

[ address ] ::ptms [-v] [-f flag] [-F flag]

pseudo-terminal(擬似端末) の情報を表示します。

> ::ptms -v ADDR PTY FL MASTERQ SLAVEQ ZID PID PROC 000003001bcadf08 1 6 0000030016eb1a40 00000300179252d8 0 1579 sshd | +--> PTMOPEN Master side is open PTSOPEN Slave side is open

::sd_state [-s]

sd soft state のリストを表示します。

> ::sd_state walk_addr = ffffff00cea84ec8 walking sd_state units via ptr: ffffff00c8dc7840 32 entries in sd_state table un 0: ffffff00c6db06c0 -------------- { un_sd = 0xffffff00ce042280 un_rqs_bp = 0 un_rqs_pktp = 0 un_sense_isbusy = 0 un_buf_chain_type = 0x2 un_uscsi_chain_type = 0x6 un_direct_chain_type = 0x8 un_priority_chain_type = 0x9 un_waitq_headp = 0 un_waitq_tailp = 0 un_retry_bp = 0 un_retry_statp = 0 un_xbuf_attr = 0xffffff00c8332080 un_sys_blocksize = 0x200 un_tgt_blocksize = 0x200 un_phy_blocksize = 0x200 : : un_wcc_cv = { _opaque = 0 } un_cmlbhandle = 0xffffff00ca6a7000 un_fm_private = 0xffffff00c75f0a80 } --- XBUF ATTR: ---------- 0xffffff00c8332080: mutex allocsize pending 0 128 0 0xffffff00c8332094: active_limit active_count active_lowater 200 0 100 0xffffff00c83320a0: headp tailp 0 0 0xffffff00c83320b0: reserve_mutex reserve_limit reserve_count reserve_headp 0 10 0 0 0xffffff00c83320d8: timeid tq 0 ffffff00ce816258 --- XBUF Q: ------- xbuf Q head: 0 --------------------------- Processed 0 XBUF Q entries --------------------------- UN WAIT Q: ---------- UN wait Q head: 0 ------------------------------ Processed 0 UN WAIT Q entries ------------------------------ un 1: 0 -------------- un 2: 0 -------------- : : un 31: 0 -------------- --------------------------- Processed 1 UN softstate entries ---------------------------

::vhci_states [-v]

全ての vhci state ポインタを表示します。

> ::vhci_states -v Softstate size is 256(0x100) bytes. state pointer instance ============= ======== 0xffffff00c8d76e40::print struct scsi_vhci 0 vhci_conf_flags: 1 VHCI_CONF_FLAGS_AUTO_FAILBACK

::vhciguid

全てのクライアント、または GUID を指定したクライアントのリストを表示する

> ::vhciguid ----------------- mdi_vhci_head @ 0xffffff00c8d8a780 ---------- ----------------- class @ scsi_vhci---------- ----- Number of devices found 0 ---------- ----hash[0] 0xffffff00c9fd2000: devices mapped = 0 -- ----hash[1] 0xffffff00c9fd2010: devices mapped = 0 -- ----hash[2] 0xffffff00c9fd2020: devices mapped = 0 -- ----hash[3] 0xffffff00c9fd2030: devices mapped = 0 -- ----hash[4] 0xffffff00c9fd2040: devices mapped = 0 -- ----hash[5] 0xffffff00c9fd2050: devices mapped = 0 -- ----hash[6] 0xffffff00c9fd2060: devices mapped = 0 -- ----hash[7] 0xffffff00c9fd2070: devices mapped = 0 -- ----hash[8] 0xffffff00c9fd2080: devices mapped = 0 -- ----hash[9] 0xffffff00c9fd2090: devices mapped = 0 -- ----hash[10] 0xffffff00c9fd20a0: devices mapped = 0 -- ----hash[11] 0xffffff00c9fd20b0: devices mapped = 0 -- ----hash[12] 0xffffff00c9fd20c0: devices mapped = 0 -- ----hash[13] 0xffffff00c9fd20d0: devices mapped = 0 -- ----hash[14] 0xffffff00c9fd20e0: devices mapped = 0 -- ----hash[15] 0xffffff00c9fd20f0: devices mapped = 0 -- ----hash[16] 0xffffff00c9fd2100: devices mapped = 0 -- ----hash[17] 0xffffff00c9fd2110: devices mapped = 0 -- ----hash[18] 0xffffff00c9fd2120: devices mapped = 0 -- ----hash[19] 0xffffff00c9fd2130: devices mapped = 0 -- ----hash[20] 0xffffff00c9fd2140: devices mapped = 0 -- ----hash[21] 0xffffff00c9fd2150: devices mapped = 0 -- ----hash[22] 0xffffff00c9fd2160: devices mapped = 0 -- ----hash[23] 0xffffff00c9fd2170: devices mapped = 0 -- ----hash[24] 0xffffff00c9fd2180: devices mapped = 0 -- ----hash[25] 0xffffff00c9fd2190: devices mapped = 0 -- ----hash[26] 0xffffff00c9fd21a0: devices mapped = 0 -- ----hash[27] 0xffffff00c9fd21b0: devices mapped = 0 -- ----hash[28] 0xffffff00c9fd21c0: devices mapped = 0 -- ----hash[29] 0xffffff00c9fd21d0: devices mapped = 0 -- ----hash[30] 0xffffff00c9fd21e0: devices mapped = 0 -- ----hash[31] 0xffffff00c9fd21f0: devices mapped = 0 -- ----------done----------

walker

ptms

pseudo-tty のリストを調べて、pt_ttys 構造体に対して反復します。

> ::walk ptms |::print struct pt_ttys { ptm_rdq = 0x30016eb1a40 pts_rdq = 0x300179252d8 pt_nullmsg = 0x3001482f9e0 pt_pid = 0x62b pt_minor = 0x1 pt_refcnt = 0 pt_state = 0x6 pt_cv = { _opaque = 0 } pt_lock = { _opaque = [ 0 ] } pt_zoneid = 0 pt_ruid = 0 pt_rgid = 0x7 }
Read more ...

mdb写経/STREAMS

2012/10/14

dcmds

[ address ] ::mblk [-q|v] [-f|F flag] [-t|T type] [-l|L|B len] [-d dbaddr]

指定された mblk_t のアドレスのメッセージブロックの情報を表示します。アドレスの指定が無い場合、全てのメッセージブロックの情報を表示します。

-q mblk のアドレスのみを表示します
-d 指定した dblk アドレスに該当する mblk のみを表示します
-f 指定した flag に該当する mblk のみを表示します
-F 指定した flag に該当しない mblk のみを表示します
-t 指定した db_type に該当する mblk のみを表示します
-T 指定した db_type 以外に該当する mblk のみを表示します
-l len MBLKL が len と一致する mblk のみを表示します
-L len MBLKL <= len の mblk のみを表示します
-G len MBLKL >= len の mblk のみを表示します
-b len db_lim - db_base が len と一致する mblk のみを表示します

※参考 mblk(9S)

> ::mblk ADDR FL TYPE LEN BLEN RPTR DBLK 00000300159d2000 0 data 14 64 0000030016721340 00000300167212c0 00000300159d2040 0 data 40 128 0000030015f4fea0 0000030015f4fe00 00000300159d2080 0 break 376 512 000003000c393240 000003000c3931c0 00000300159d2140 0 data 0 128 00000300159cc150 00000300159cc080 00000300159d2180 0 data 32 12288 00000300147f01c0 00000300147f0140 00000300159d21c0 0 data 71 128 00000300159cc204 00000300159cc180 00000300159d2200 0 data 78 128 00000300159cc300 00000300159cc280 00000300159d2240 0 data 78 128 00000300159cc400 00000300159cc380 00000300159d2280 0 data 0 128 00000300159cc544 00000300159cc480 00000300159d22c0 0 data 40 128 00000300159cc620 00000300159cc580 00000300159d2300 0 data 0 128 00000300159cc744 00000300159cc680 00000300159d2340 0 data 126 128 00000300159cc800 00000300159cc780 00000300159d2380 0 data 40 128 00000300159cc920 00000300159cc880 00000300159d23c0 0 data 0 128 00000300159cca48 00000300159cc980 00000300159d2400 0 data 0 320 000003000c39052c 000003000c390380 00000300159d2440 0 data 14 64 000003000a3baf80 000003000a3baf00 00000300159d2480 0 data 78 128 00000300159ccc00 00000300159ccb80 00000300159d24c0 0 data 1504 1536 000003000cada740 000003000cada6c0 00000300159d2500 0 data 48 192 000003000a4b08b0 000003000a4b07c0 : :

address ::mblk2dblk

指定された mblk_t のアドレスを使用して、対応する dblk_t のアドレスを出力します。

> ffffff00cb990800::mblk2dblk ffffff00cb98d900

[ address ] ::mblk_verify

1 つまたは複数のメッセージブロックの整合性を確認します。アドレスを明示的に指定すると、そのメッセージブロックの整合性がチェックされます。アドレスを明示的に指定しないと、アクティブなメッセージブロックすべての整合性がチェックされます。この dcmd は、検出したが無効であるメッセージブロックについても出力します。

> ::mblk_verify mdb: ffffff00cb990380: invalid b_datap pointer mdb: ffffff00d19f1320: invalid b_datap pointer mdb: ffffff00d19f17a0: invalid b_datap pointer mdb: ffffff00d19f1920: invalid b_datap pointer mdb: ffffff00d19f1e60: invalid b_datap pointer mdb: ffffff00c84aa380: invalid b_datap pointer mdb: ffffff00d8e13d00: invalid b_datap pointer mdb: ffffff00cfdfc0a0: invalid b_datap pointer

[ address ] ::queue [-v] [-f flag] [-F flag] [-s syncq]

指定された queue_t をフィルタリングして表示します。

-v 待ち行列フラグが詳細に復号化されます
-q ポインタのみを表示します(フィルタとして使用できます)
-f 指定したフラグがセットされている待ち行列のみを表示します
-F 指定したフラグがセットされていない待ち行列のみを表示します
-m 指定された modname に一致する待ち行列のみを表示します
-s 指定された syncq_t アドレスに一致する待ち行列のみを表示します

> ::queue ADDR MODULE FLAGS NBLK ffffff00daea0000 tl 204032 0 0000000000000000 ffffff00daea02a8 strrhead 044032 0 0000000000000000 ffffff00daea0550 strrhead 044032 0 0000000000000000 ffffff00daea07f8 wc 200832 0 0000000000000000 ffffff00daea0aa0 tl 204032 0 0000000000000000 ffffff00daea0d48 ttcompat 000832 0 0000000000000000 ffffff00dac81008 timod 000832 0 0000000000000000 ffffff00dc4a12b0 tl 204032 0 0000000000000000 ffffff00dac812b0 tl 204032 0 0000000000000000 ffffff00dc4a1558 tl 204032 0 0000000000000000 ffffff00dac81558 strrhead 044030 0 0000000000000000 ffffff00dc4a1800 ttcompat 000832 0 0000000000000000 ffffff00dac81800 timod 000832 0 0000000000000000 ffffff00dc4a1aa8 strrhead 044032 3 ffffff00d6414880 ffffff00dac81aa8 tcp 20204032 0 0000000000000000 ffffff00dc4a1d50 fifostrrhead 044032 0 0000000000000000 ffffff00dac81d50 strrhead 044032 0 0000000000000000 : :
> ffffff00dac81aa8::queue -v ADDR MODULE FLAGS NBLK ffffff00dac81aa8 tcp 20204032 0 0000000000000000 | +--> QWANTR Someone wants to read Q QREADR This is the reader (first) Q QUSE This queue in use (allocation) QMTSAFE stream module is MT-safe QISDRV the Queue is attached to a driver

address ::q2otherq

指定された queue_t のアドレスを使用して、ピアな読み取りまたは書き込み待ち行列構造体のアドレスを出力します。

> ffffff00dc4a1aa8::q2otherq ffffff00dc4a1ba0

address ::q2rdq

指定された queue_t のアドレスを使用して、対応する読み込み待ち行列のアドレスを出力します。

> ffffff00dc4a1aa8::q2rdq ffffff00dc4a1aa8

address ::q2stream

指定された queue_t のアドレスを使用して、 対応する stdata_t のアドレスを出力します。

> ffffff00dac81aa8::q2stream ffffff00dac82cc0

address ::q2syncq

指定された queue_t のアドレスを使用して、対応する syncq_t のアドレスを出力します。

> ffffff00dac81aa8::q2syncq ffffff00dac81c98

address ::q2wrq

指定された queue_t のアドレスを使用して、対応する書き込み待ち行列のアドレスを出力します。

> ffffff00dc4a1aa8::q2wrq ffffff00dc4a1ba0

address ::stdata [-v] [-f flag] [-F flag] [-t type] [-T type]

指定された STREAM ヘッドを表す stdata_t をフィルタリングして表示します。stdata_t のアドレスが指定されていない場合は、stream_head_cache の全ての STREAM ヘッドを表示します。

-v stdata フラグが詳細に復号化されます
-q ポインタのみを表示します(フィルタとして使用できます)
-f flag 指定したフラグがセットされている STREAM ヘッドを表示します
-F flag 指定したフラグがセットされていないる STREAM ヘッドを表示します

ADDR stream head address
WRQ write queue pointer
FLAGS stream head flags (use -v to show in symbolic form)
VNODE stream vnode pointer
N/A pushcount and anchor positions
REF stream head reference counter
> ::stdata ADDR WRQ FLAGS VNODE N/A REF 00000300169ee040 00000300141763b8 40010000 000003000a9cc140 0/0 0 00000300169ee1b8 0000030014847840 00000000 0000030014849c40 0/0 0 00000300169ee798 000003000817c1d0 00018082 0000030016ed0b80 3/0 0 00000300169eed78 0000030017c67148 40010010 000003000822b340 0/0 0 00000300169eeef0 000003000817cea0 00000000 00000300176ed340 0/0 0 00000300169ef068 000003000817d130 40010000 000003001572e340 0/0 0 00000300169ef648 0000030017445b50 00000000 00000300176edc40 2/0 0 00000300169ef7c0 00000300176c7b58 00000000 00000300165fda40 1/0 0 : :
> 00000300169ee798::stdata -v ADDR WRQ FLAGS VNODE N/A REF 00000300169ee798 000003000817c1d0 00018082 0000030016ed0b80 3/0 0 | +--> RSLEEP someone wants to read/recv msg STRISTTY stream is a terminal SNDMREAD used for read notification OLDNDELAY use old NDELAY TTY semantics

address ::str2mate

指定された STREAM ヘッドを表す stdata_t のアドレスを使用して、関連する STREAM ヘッドを出力します。

> 30008cf7d68::str2mate30008cf7d68

address ::str2wrq

指定された STREAM ヘッドを表す stdata_t のアドレスを使用して、書き込み側待ち行列を出力します。

> 0000030008cf9c38::str2wrq 1a133e8

[address] ::stream

指定された STREAM ヘッドを表す stdata_t のアドレスを使用して、カーネル STREAM データ構造体のイメージ図を表示します。読み取りと書き込みの待ち行列へのポインタ、バイト数、各モジュールのフラグが表示され、さらに、指定された待ち行列に関する追加情報が余白に表示される場合もあります。

> ffffff00dac82cc0::stream +-----------------------+-----------------------+ | 0xffffff00dac81e48 | 0xffffff00dac81d50 | | strwhead | strrhead | | | | | cnt = 0t0 | cnt = 0t0 | | flg = 0x00004022 | flg = 0x00044032 | +-----------------------+-----------------------+ | ^ v | +-----------------------+-----------------------+ | 0xffffff00dac818f8 | 0xffffff00dac81800 | | timod | timod | | | | | cnt = 0t0 | cnt = 0t0 | | flg = 0x00000822 | flg = 0x00000832 | +-----------------------+-----------------------+ | ^ v | +-----------------------+-----------------------+ | 0xffffff00dac81ba0 | 0xffffff00dac81aa8 | | tcp | tcp | | | | | cnt = 0t0 | cnt = 0t0 | | flg = 0x20244022 | flg = 0x20204032 | +-----------------------+-----------------------+

address ::syncq [-v] [-f flag] [-F flag] [-t type] [-T type]

指定された syncq_t をフィルタリングして表示します。

-v syncq フラグが詳細に復号化されます
-q ポインタのみを表示します(フィルタとして使用できます)
-f 指定したフラグがセットされている syncq を表示します
-F 指定したフラグがセットされていない syncq を表示します
-t 指定したタイプがセットされている syncq を表示します
-T 指定したタイプがセットされていない syncq を表示します

> ffffff00dc4a1c98::syncq -v ADDR FLG TYP CNT NQS OUTER SF PRI ffffff00dc4a1c98 00 ff 0 0 0000000000000000 0 0 | +--> SQ_CIPUT Concurrent inner put procedure SQ_CISVC Concurrent inner svc procedure SQ_CIOC Concurrent inner open/close SQ_CICB Concurrent inner callback SQ_COPUT Concurrent outer put procedure SQ_COSVC Concurrent outer svc procedure SQ_COOC Concurrent outer open/close SQ_COCB Concurrent outer callback

address ::syncq2q

指定された syncq_t のアドレスを使用して、対応する queue_t のアドレスを出力します。

> ffffff00dac81c98::syncq2q ffffff00dac81aa8

walker

b_cont

指定された mblk_t のアドレスを使用して、b_cont ポインタに従いながら、関連するメッセージ構造体のセットに対して反復適用します。b_cont ポインタは、指定されたメッセージブロックを、同じメッセージ上にある次の関連するメッセージブロックにリンクするために使用されます。メッセージブロックの詳細については、mblk(9S) のマニュアルページを参照してください。

> 0000030014eec1c0::walk b_cont |::print mblk_t b_flag b_flag = 0 b_flag = 0

b_next

指定された mblk_t のアドレスを使用して、b_next ポインタに従いながら、関連するメッセージ構造体のセットに対して反復適用します。b_next ポインタは、指定されたメッセージブロックを、指定された待ち行列上にある次の関連するメッセージブロックにリンクするために使用されます。メッセージブロックの詳細については、mblk(9S) のマニュアルページを参照してください。

> 0000030014eec1c0::walk b_next |::print mblk_t b_flag b_flag = 0

qlink

指定された queue_t のアドレスを使用して、q_link ポインタを使用しながら、関連する待ち行列のリストを調べます。

> 0000030008cf9c38::walk qlink |::print queue_t q_qinfo q_qinfo = wclrinit

qnext

指定された queue_t のアドレスを使用して、q_next ポインタを使用しながら、関連する待ち行列のリストを調べます。

> 0000030008cf9c38::walk qnext |::print queue_t q_qinfo q_qinfo = wclrinit

readq

指定された stdata_t のアドレスを使用して、読み取り側待ち行列構造体のリストを調べます。

> 0000030008cf9c38::q2stream |::walk readq |::print -a queue_t q_qinfo 30008cf9c38 q_qinfo = wclrinit 30008cf99a8 q_qinfo = conskbdurinit

writeq

指定された stdata_t のアドレスを使用して、書き込み側待ち行列構造体のリストを調べます。

> 0000030008cf9c38::q2stream |::walk writeq |::print -a queue_t q_qinfo 30008cf9d30 q_qinfo = wclwinit 30008cf9aa0 q_qinfo = conskbduwinit
Read more ...

vnode

2012/10/14

vnode 定義

typedef struct vnode {
        kmutex_t        v_lock;         /* protects vnode fields */
        uint_t          v_flag;         /* vnode flags (see below) */
        uint_t          v_count;        /* reference count */
        void            *v_data;        /* private data for fs */
        struct vfs      *v_vfsp;        /* ptr to containing VFS */
        struct stdata   *v_stream;      /* associated stream */
        enum vtype      v_type;         /* vnode type */
        dev_t           v_rdev;         /* device (VCHR, VBLK) */

        /* PRIVATE FIELDS BELOW - DO NOT USE */

        struct vfs      *v_vfsmountedhere; /* ptr to vfs mounted here */
        struct vnodeops *v_op;          /* vnode operations */
        struct page     *v_pages;       /* vnode pages list */
        struct filock   *v_filocks;     /* ptr to filock list */
        struct shrlocklist *v_shrlocks; /* ptr to shrlock list */
        krwlock_t       v_nbllock;      /* sync for NBMAND locks */
        kcondvar_t      v_cv;           /* synchronize locking */
        void            *v_locality;    /* hook for locality info */
        struct fem_head *v_femhead;     /* fs monitoring */
        char            *v_path;        /* cached path */
        uint_t          v_rdcnt;        /* open for read count  (VREG only) */
        uint_t          v_wrcnt;        /* open for write count (VREG only) */
        u_longlong_t    v_mmap_read;    /* mmap read count */
        u_longlong_t    v_mmap_write;   /* mmap write count */
        void            *v_mpssdata;    /* info for large page mappings */
        void            *v_fopdata;     /* list of file ops event watches */
        kmutex_t        v_vsd_lock;     /* protects v_vsd field */
        struct vsd_node *v_vsd;         /* vnode specific data */
        struct vnode    *v_xattrdir;    /* unnamed extended attr dir (GFS) */
        uint_t          v_count_dnlc;   /* dnlc reference count */
} vnode_t;

サンプルデータ

# mdb -k
> 0t604::pid2proc |::pfiles -p
FD   TYPE            VNODE PATH
   0  DIR ffffff01cd29a840 /
   1  DIR ffffff01cd29a840 /
   2  DIR ffffff01cd29a840 /
   3 DOOR ffffff01e17bd780 /system/volatile/name_service_door
   4  CHR ffffff01e10e4140 /devices/pseudo/sysmsg@0:sysmsg
   5  REG ffffff01df742940 /var/adm/messages
   6  REG ffffff01dc237940 /var/log/syslog
   7  CHR ffffff01e10ac840 /devices/pseudo/log@0:log
   8 DOOR ffffff01e1c94b00
> ffffff01df742940::print -a vnode_t
ffffff01df742940 {
    ffffff01df742940 v_lock = {
        ffffff01df742940 _opaque = [ 0 ]
    }
    ffffff01df742948 v_flag = 0x10000
    ffffff01df74294c v_count = 0x2
    ffffff01df742950 v_data = 0xffffff01df740c18
    ffffff01df742958 v_vfsp = 0xffffff01cf7121e8
    ffffff01df742960 v_stream = 0
    ffffff01df742968 v_type = 1 (VREG)
    ffffff01df742970 v_rdev = 0xffffffffffffffff
    ffffff01df742978 v_vfsmountedhere = 0
    ffffff01df742980 v_op = 0xffffff01cd292a80
    ffffff01df742988 v_pages = 0
    ffffff01df742990 v_filocks = 0
    ffffff01df742998 v_shrlocks = 0
    ffffff01df7429a0 v_nbllock = {
        ffffff01df7429a0 _opaque = [ 0 ]
    }
    ffffff01df7429a8 v_cv = {
        ffffff01df7429a8 _opaque = 0
    }
    ffffff01df7429aa v_pad = 0xbadd
    ffffff01df7429ac v_count_dnlc = 0x1
    ffffff01df7429b0 v_locality = 0
    ffffff01df7429b8 v_femhead = 0
    ffffff01df7429c0 v_path = 0xffffff01e1074be8 "/var/adm/messages"
    ffffff01df7429c8 v_rdcnt = 0
    ffffff01df7429cc v_wrcnt = 0x1
    ffffff01df7429d0 v_mmap_read = 0
    ffffff01df7429d8 v_mmap_write = 0
    ffffff01df7429e0 v_mpssdata = 0
    ffffff01df7429e8 v_fopdata = 0
    ffffff01df7429f0 v_vsd_lock = {
        ffffff01df7429f0 _opaque = [ 0 ]
    }
    ffffff01df7429f8 v_vsd = 0
    ffffff01df742a00 v_xattrdir = 0
    ffffff01df742a08 v_fw = 0xffffff01df742908
}
Read more ...

znode

2012/10/14

znode 定義

typedef struct znode {
        struct zfsvfs    *z_zfsvfs;
        vnode_t          *z_vnode;
        uint64_t         z_id;           /* この znode の object ID */
        kmutex_t         z_lock;         /* znode modification lock */
        krwlock_t        z_parent_lock;  /* parent lock for directories */
        krwlock_t        z_name_lock;    /* "master" lock for dirent locks */
        zfs_dirlock_t    *z_dirlocks;    /* directory entry lock list */
        kmutex_t         z_range_lock;   /* protects changes to z_range_avl */
        avl_tree_t       z_range_avl;    /* avl tree of file range locks */
        uint8_t          z_unlinked;     /* file has been unlinked */
        uint8_t          z_atime_dirty;  /* atime needs to be synced */
        uint8_t          z_zn_prefetch;  /* Prefetch znodes? */
        uint8_t          z_moved;        /* Has this znode been moved? */
        uint_t           z_blksz;        /* block size in bytes */
        uint_t           z_seq;          /* modification sequence number */
        uint64_t         z_mapcnt;       /* number of pages mapped to file */
        uint64_t         z_gen;          /* generation (cached) */
        uint64_t         z_size;         /* file size (cached) */
        uint64_t         z_atime[2];     /* atime (cached) */
>        uint64_t        z_links;        /* file links (cached) */
        uint64_t         z_pflags;       /* pflags (cached) */
        uint64_t         z_uid;          /* uid fuid (cached) */
        uint64_t         z_gid;          /* gid fuid (cached) */
        mode_t           z_mode;         /* mode (cached) */
        uint32_t         z_sync_cnt;     /* synchronous open count */
        kmutex_t         z_acl_lock;     /* acl data lock */
        zfs_acl_t        *z_acl_cached;  /* cached acl */
        list_node_t      z_link_node;    /* all znodes in fs link */
        sa_handle_t      *z_sa_hdl;      /* handle to sa data */
        boolean_t        z_is_sa;        /* are we native sa? */
} znode_t;

サンプルデータ

> 0t592::pid2proc |::pfiles -p
FD   TYPE            VNODE PATH
   0  DIR ffffff01cd29a840 /
   1  DIR ffffff01cd29a840 /
   2  DIR ffffff01cd29a840 /
   3 DOOR ffffff01e09f1380 /system/volatile/name_service_door
   4  CHR ffffff01e0702600 /devices/pseudo/sysmsg@0:sysmsg
   5  REG ffffff01d0d28100 /var/adm/messages
   6  REG ffffff01da061b40 /var/log/syslog
   7  CHR ffffff01e7964500 /devices/pseudo/log@0:log
   8 DOOR ffffff01e7964200
> ffffff01d0d28100::print -a vnode_t v_data
ffffff01d0d28110 v_data = 0xffffff01d1346148
> 0xffffff01d1346148::print znode_t
{
    z_zfsvfs = 0xffffff01d2e2e480
    z_vnode = 0xffffff01d0d28100
    z_id = 0x7258
    z_lock = {
        _opaque = [ 0 ]
    }
    z_parent_lock = {
        _opaque = [ 0 ]
    }
    z_name_lock = {
        _opaque = [ 0 ]
    }
    z_dirlocks = 0
    z_range_lock = {
        _opaque = [ 0 ]
    }
    z_range_avl = {
        avl_root = 0
        avl_compar = zfs_range_compare
        avl_offset = 0x8
        avl_numnodes = 0
        avl_size = 0x40
    }
    z_unlinked = 0
    z_atime_dirty = 0
    z_zn_prefetch = 0xdd
    z_moved = 0
    z_blksz = 0x1c800
    z_seq = 0x7a473a
    z_mapcnt = 0
    z_gen = 0x162d
    z_size = 0x1c7f9
    z_atime = [ 0x5071c579, 0xb409b9 ]
    z_mtime = [ 0x507c2a88, 0x2dfebeea ]
    z_ctime = [ 0x507c2a88, 0x2dfebeea ]
    z_links = 0x1
    z_pflags = 0x40800000204
    z_uid = 0
    z_gid = 0
    z_mode = 0x81a4
    z_sync_cnt = 0
    z_acl_lock = {
        _opaque = [ 0 ]
    }
    z_acl_cached = 0xffffff01df7b85c0
    z_link_node = {
        list_next = 0xffffff01d0c22108
        list_prev = 0xffffff01dfb1aaf0
    }
    z_sa_hdl = 0xffffff01d11404d0
    z_is_sa = 0x1 (B_TRUE)
}
Read more ...

Sublim Text 2 導入

2012/10/14

Shift-JIS に対応させる

seanliang/ConvertToUTF8 からプラグインをダウンロードしてきて、Preferences > Browse Packages で開くフォルダに突っ込むだけ。EUC も対応している。

参考:Sublime Text 2をShift_JISに対応させるプラグインがあると聞いて

メニューを日本語化する

メニューバー(Main.sublime-menu)用と、コンテキストメニュー(Context.sublime-menu)用のカスタマイズファイルをダウンロードしてきて、"%APPDATA%\Sublime Text 2\Packages\Default" に突っ込む。

参考:Sublime Text 2 メニュー日本語化

フォントの変更

 Preference > Settings User で、Preferences.sublime_settings ファイルを開いてくれるので、"font_face": "Migu 1M Regular" のように指定する。フォントを変えると MacType のようなアンチエイリアスを行うツールを入れないと、見れたもんじゃなくなるので微妙なところではある。

参考:Sublime Text 2 で日本語等幅フォントを使う方法

Sublime Package Control を導入する

Shift+@で開くコンソールに、下記のコードを貼り付けて実行する。
import urllib2,os; pf='Package Control.sublime-package'; 
ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not 
os.path.exists(ipp) else None; 
urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); 
open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace('
 ','%20')).read()); print 'Please restart Sublime Text to finish 
installation'
参考:Sublime Package Control
Read more ...

mdb写経/資源管理

2012/10/11

dcmds

[ address ] ::rctl_dict

システム全体のデフォルト rctl の定義を表示します。

> ::rctl_dict ID NAME ADDR TYPE GLOBAL_FLAGS 12 process.max-port-events 0000030005cb6380 process 0x20100000 11 process.max-msg-messages 0000030005cb63d0 process 0x20100000 10 process.max-msg-qbytes 0000030005cb6420 process 0x20400000 9 process.max-sem-ops 0000030005cb6470 process 0x20100000 8 process.max-sem-nsems 0000030005cb64c0 process 0x20100000 7 process.max-address-space 0000030005cb6510 process 0x62400000 6 process.max-file-descriptor 0000030005cb6560 process 0x60100000 5 process.max-core-size 0000030005cb65b0 process 0x62400000 4 process.max-stack-size 0000030005cb6600 process 0x62400000 3 process.max-data-size 0000030005cb6650 process 0x62400000 2 process.max-file-size 0000030005cb66a0 process 0x68400000 1 process.max-cpu-time 0000030005cb66f0 process 0x55200000 39 task.max-cpu-time 00000300062b9aa8 task 0x15a00000 38 task.max-processes 00000300062b9af8 task 0x00100000 37 task.max-lwps 00000300062b9b48 task 0x00100000 36 project.max-contracts 00000300062b9b98 project 0xa0100000 35 project.max-locked-memory 00000300062b9be8 project 0xa0400000 34 project.max-port-ids 00000300062b9c38 project 0xa0100000 33 project.max-shm-memory 00000300062b9c88 project 0xa0400000 32 project.max-shm-ids 00000300062b9cd8 project 0xa0100000 31 project.max-msg-ids 00000300062b9d28 project 0xa0100000 30 project.max-sem-ids 00000300062b9d78 project 0xa0100000 29 project.max-crypto-memory 00000300062b9dc8 project 0xa0400000 28 project.max-tasks 00000300062b9e18 project 0x80100000 27 project.max-processes 00000300062b9e68 project 0x80100000 26 project.max-lwps 00000300062b9eb8 project 0x80100000 25 project.cpu-cap 00000300062b9f08 project 0xa3180000 24 project.cpu-shares 00000300062b9f58 project 0x92180000 23 zone.max-lofi 0000030005cb6010 zone 0xa0100000 22 zone.max-swap 0000030005cb6060 zone 0xa0400000 21 zone.max-locked-memory 0000030005cb60b0 zone 0xa0400000 20 zone.max-shm-memory 0000030005cb6100 zone 0xa0400000 19 zone.max-shm-ids 0000030005cb6150 zone 0xa0100000 18 zone.max-sem-ids 0000030005cb61a0 zone 0xa0100000 17 zone.max-msg-ids 0000030005cb61f0 zone 0xa0100000 16 zone.max-processes 0000030005cb6240 zone 0x80100000 15 zone.max-lwps 0000030005cb6290 zone 0x80100000 14 zone.cpu-cap 0000030005cb62e0 zone 0xa3180000 13 zone.cpu-shares 0000030005cb6330 zone 0x92180000

 

address ::rctl_list [handle]

指定したプロセス(proc_t アドレス)の rctl の定義を表示します。

> 00000000018a62c0::rctl_list 00000300062bfc88 8 : process.max-sem-nsems (cur) 0x200 privileged flags=<DENY> 0x7fff system flags=<DENY,MAX> 00000300062bfb38 1 : process.max-cpu-time (cur) 0xffffffffffffffff system flags=<MAX> 00000300062bfcb8 9 : process.max-sem-ops (cur) 0x200 privileged flags=<DENY> 0x7fffffff system flags=<DENY,MAX> 00000300062bfb68 2 : process.max-file-size (cur) 0x7fffffffffffffff system flags=<DENY,MAX> 00000300062bfce8 10 : process.max-msg-qbytes (cur) 0x10000 privileged flags=<DENY> 0xffffffffffffffff system flags=<DENY,MAX> 00000300062bfb98 3 : process.max-data-size (cur) 0xffffffffffffffff system flags=<DENY,MAX> : :

::zone

kernel zone を表示します。

> ::zone ADDR ID STATUS NAME PATH fffffffffbcfc3c0 0 running global /

address ::zsd [-v] [zsd_key]

選択した zone の zone-specific-data entries を表示します。

> ::zsd -v ZONE KEY VALUE FLAGS global 13 ffffff00db095fa8 0 Create CB: 0 Shutdown CB: autofs_zone_shutdown Destroy CB: autofs_zone_destructor 3 ffffff00c8a92778 4 Create CB: evch_zoneinit Shutdown CB: 0 Destroy CB: evch_zonefree 10 ffffff00c8e3f150 4 Create CB: core_init_zone Shutdown CB: 0 Destroy CB: core_free_zone 1 fffffffffbcfeb60 4 Create CB: log_zoneinit Shutdown CB: 0 Destroy CB: log_zonefree e ffffff00c923ec38 0 Create CB: 0 Shutdown CB: 0 Destroy CB: 0 2 ffffff00c77bbdc0 4 Create CB: netstack_zone_create Shutdown CB: netstack_zone_shutdown Destroy CB: netstack_zone_destroy 4 0000000000000000 0 : :

walker

rctl_cache

rctl_cache の全ての rctl_t 構造体に対して反復適用します。

> ::walk rctl_cache |::print rctl_t rc_dict_entry rc_dict_entry = 0x30005cb6650 rc_dict_entry = 0x30005cb6600 rc_dict_entry = 0x30005cb66a0 rc_dict_entry = 0x30005cb6650 rc_dict_entry = 0x30005cb6380 rc_dict_entry = 0x30005cb6470 : :

rctl_dict_list

rctl_lists の rctl_dict_entry_t 構造体に対して反復適用します。

> ::walk rctl_dict_list |::print rctl_dict_entry_t rcd_name rcd_name = 0x10dd5e8 "process.max-port-events" rcd_name = 0x10dd5b8 "process.max-msg-messages" rcd_name = 0x10dd588 "process.max-msg-qbytes" rcd_name = 0x10dd560 "process.max-sem-ops" rcd_name = 0x10dd530 "process.max-sem-nsems" rcd_name = 0x10dd510 "process.max-address-space" rcd_name = 0x10dd4f0 "process.max-file-descriptor" : :

rctl_val

指定した rctl_t の、rctl_val entries (rctl_val_t 構造体) に対して復適用します。

> ::walk rctl_cache |::walk rctl_val |::print rctl_val_t rcv_flagaction rcv_flagaction = 0x80000002 rcv_flagaction = 0x80000002 rcv_flagaction = 0x80000003 rcv_flagaction = 0x80000002 rcv_flagaction = 0x80000002 rcv_flagaction = 0x80000002 rcv_flagaction = 0x2 rcv_flagaction = 0x80000002 rcv_flagaction = 0x2 : :

rctl_val_cache

rctl_cache の全ての rctl_val_t 構造体に対して復適用します。

> ::walk rctl_val_cache |::print rctl_val_t rcv_flagaction rcv_flagaction = 0x80000002 rcv_flagaction = 0x2 rcv_flagaction = 0x80000002 rcv_flagaction = 0x80000000 rcv_flagaction = 0x2 rcv_flagaction = 0x2 rcv_flagaction = 0x80000002 : :

zone

kernel zones のリスト(zone_t 構造体)に対して反復適用します。

> ::walk zone |::print zone_t { zone_name = 0x12b88d0 "global" zone_nodename = utsname+0x101 "t2kh1ldom2" zone_domain = srpc_domain "" zone_hostid = 0xffffffff zone_lock = { _opaque = [ 0 ] } zone_linkage = { list_next = zone_active+0x10 list_prev = zone_active+0x10 } zone_id = 0 zone_ref = 0x3e zone_cred_ref = 0x5a zone_subsys_ref = [ 0, 0, 0, 0x1, 0x2c, 0, 0x1, 0x1 ] zone_ref_list = { list_size = 0x18 list_offset = 0x8 list_head = { list_next = 0x30017088968 list_prev = 0x300073cfea8 } } zone_rootvp = 0x30007095a40 zone_rootpath = 0x12b88d8 "/" zone_flags = 0 zone_status = 4 (ZONE_IS_RUNNING) : :

zsd

zone_t 構造体のアドレスを指定して、zsd_entry 構造体に対して反復適用します。

> 198e4d0::walk zsd |::print struct zsd_entry zsd_shutdown zsd_shutdown = autofs_zone_shutdown zsd_shutdown = 0 zsd_shutdown = svc_zoneshutdown zsd_shutdown = 0 zsd_shutdown = 0 zsd_shutdown = rfs_zone_shutdown zsd_shutdown = 0 : :
Read more ...