1eda14cbcSMatt Macy /* 2eda14cbcSMatt Macy * CDDL HEADER START 3eda14cbcSMatt Macy * 4eda14cbcSMatt Macy * The contents of this file are subject to the terms of the 5eda14cbcSMatt Macy * Common Development and Distribution License (the "License"). 6eda14cbcSMatt Macy * You may not use this file except in compliance with the License. 7eda14cbcSMatt Macy * 8eda14cbcSMatt Macy * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9271171e0SMartin Matuska * or https://opensource.org/licenses/CDDL-1.0. 10eda14cbcSMatt Macy * See the License for the specific language governing permissions 11eda14cbcSMatt Macy * and limitations under the License. 12eda14cbcSMatt Macy * 13eda14cbcSMatt Macy * When distributing Covered Code, include this CDDL HEADER in each 14eda14cbcSMatt Macy * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15eda14cbcSMatt Macy * If applicable, add the following below this CDDL HEADER, with the 16eda14cbcSMatt Macy * fields enclosed by brackets "[]" replaced with your own identifying 17eda14cbcSMatt Macy * information: Portions Copyright [yyyy] [name of copyright owner] 18eda14cbcSMatt Macy * 19eda14cbcSMatt Macy * CDDL HEADER END 20eda14cbcSMatt Macy */ 21eda14cbcSMatt Macy 22eda14cbcSMatt Macy #if defined(_KERNEL) 23eda14cbcSMatt Macy #if defined(HAVE_DECLARE_EVENT_CLASS) 24eda14cbcSMatt Macy 25eda14cbcSMatt Macy #undef TRACE_SYSTEM 26eda14cbcSMatt Macy #define TRACE_SYSTEM zfs 27eda14cbcSMatt Macy 28eda14cbcSMatt Macy #undef TRACE_SYSTEM_VAR 29eda14cbcSMatt Macy #define TRACE_SYSTEM_VAR zfs_dbuf 30eda14cbcSMatt Macy 31eda14cbcSMatt Macy #if !defined(_TRACE_DBUF_H) || defined(TRACE_HEADER_MULTI_READ) 32eda14cbcSMatt Macy #define _TRACE_DBUF_H 33eda14cbcSMatt Macy 34eda14cbcSMatt Macy #include <linux/tracepoint.h> 35eda14cbcSMatt Macy #include <sys/types.h> 36eda14cbcSMatt Macy 37eda14cbcSMatt Macy #ifndef TRACE_DBUF_MSG_MAX 38eda14cbcSMatt Macy #define TRACE_DBUF_MSG_MAX 512 39eda14cbcSMatt Macy #endif 40eda14cbcSMatt Macy 41eda14cbcSMatt Macy /* 42eda14cbcSMatt Macy * Generic support for two argument tracepoints of the form: 43eda14cbcSMatt Macy * 44eda14cbcSMatt Macy * DTRACE_PROBE2(..., 45eda14cbcSMatt Macy * dmu_buf_impl_t *, ..., 46eda14cbcSMatt Macy * zio_t *, ...); 47eda14cbcSMatt Macy */ 48eda14cbcSMatt Macy 49eda14cbcSMatt Macy #define DBUF_TP_STRUCT_ENTRY \ 50eda14cbcSMatt Macy __dynamic_array(char, os_spa, TRACE_DBUF_MSG_MAX) \ 51eda14cbcSMatt Macy __field(uint64_t, ds_object) \ 52eda14cbcSMatt Macy __field(uint64_t, db_object) \ 53eda14cbcSMatt Macy __field(uint64_t, db_level) \ 54eda14cbcSMatt Macy __field(uint64_t, db_blkid) \ 55eda14cbcSMatt Macy __field(uint64_t, db_offset) \ 56eda14cbcSMatt Macy __field(uint64_t, db_size) \ 57eda14cbcSMatt Macy __field(uint64_t, db_state) \ 58eda14cbcSMatt Macy __field(int64_t, db_holds) \ 59eda14cbcSMatt Macy __dynamic_array(char, msg, TRACE_DBUF_MSG_MAX) 60eda14cbcSMatt Macy 61eda14cbcSMatt Macy #define DBUF_TP_FAST_ASSIGN \ 62eda14cbcSMatt Macy if (db != NULL) { \ 63*f7f4bd06SMartin Matuska if (POINTER_IS_VALID(DB_DNODE(db)->dn_objset)) { \ 64eda14cbcSMatt Macy __assign_str(os_spa, \ 65eda14cbcSMatt Macy spa_name(DB_DNODE(db)->dn_objset->os_spa)); \ 66*f7f4bd06SMartin Matuska } else { \ 67*f7f4bd06SMartin Matuska __assign_str(os_spa, "NULL"); \ 68*f7f4bd06SMartin Matuska } \ 69eda14cbcSMatt Macy \ 70eda14cbcSMatt Macy __entry->ds_object = db->db_objset->os_dsl_dataset ? \ 71eda14cbcSMatt Macy db->db_objset->os_dsl_dataset->ds_object : 0; \ 72eda14cbcSMatt Macy \ 73eda14cbcSMatt Macy __entry->db_object = db->db.db_object; \ 74eda14cbcSMatt Macy __entry->db_level = db->db_level; \ 75eda14cbcSMatt Macy __entry->db_blkid = db->db_blkid; \ 76eda14cbcSMatt Macy __entry->db_offset = db->db.db_offset; \ 77eda14cbcSMatt Macy __entry->db_size = db->db.db_size; \ 78eda14cbcSMatt Macy __entry->db_state = db->db_state; \ 79eda14cbcSMatt Macy __entry->db_holds = zfs_refcount_count(&db->db_holds); \ 80eda14cbcSMatt Macy snprintf(__get_str(msg), TRACE_DBUF_MSG_MAX, \ 81eda14cbcSMatt Macy DBUF_TP_PRINTK_FMT, DBUF_TP_PRINTK_ARGS); \ 82eda14cbcSMatt Macy } else { \ 83eda14cbcSMatt Macy __assign_str(os_spa, "NULL") \ 84eda14cbcSMatt Macy __entry->ds_object = 0; \ 85eda14cbcSMatt Macy __entry->db_object = 0; \ 86eda14cbcSMatt Macy __entry->db_level = 0; \ 87eda14cbcSMatt Macy __entry->db_blkid = 0; \ 88eda14cbcSMatt Macy __entry->db_offset = 0; \ 89eda14cbcSMatt Macy __entry->db_size = 0; \ 90eda14cbcSMatt Macy __entry->db_state = 0; \ 91eda14cbcSMatt Macy __entry->db_holds = 0; \ 92eda14cbcSMatt Macy snprintf(__get_str(msg), TRACE_DBUF_MSG_MAX, \ 93eda14cbcSMatt Macy "dbuf { NULL }"); \ 94eda14cbcSMatt Macy } 95eda14cbcSMatt Macy 96eda14cbcSMatt Macy #define DBUF_TP_PRINTK_FMT \ 97eda14cbcSMatt Macy "dbuf { spa \"%s\" objset %llu object %llu level %llu " \ 98eda14cbcSMatt Macy "blkid %llu offset %llu size %llu state %llu holds %lld }" 99eda14cbcSMatt Macy 100eda14cbcSMatt Macy #define DBUF_TP_PRINTK_ARGS \ 101eda14cbcSMatt Macy __get_str(os_spa), __entry->ds_object, \ 102eda14cbcSMatt Macy __entry->db_object, __entry->db_level, \ 103eda14cbcSMatt Macy __entry->db_blkid, __entry->db_offset, \ 104eda14cbcSMatt Macy __entry->db_size, __entry->db_state, __entry->db_holds 105eda14cbcSMatt Macy 106eda14cbcSMatt Macy /* BEGIN CSTYLED */ 107eda14cbcSMatt Macy DECLARE_EVENT_CLASS(zfs_dbuf_class, 108eda14cbcSMatt Macy TP_PROTO(dmu_buf_impl_t *db, zio_t *zio), 109eda14cbcSMatt Macy TP_ARGS(db, zio), 110eda14cbcSMatt Macy TP_STRUCT__entry(DBUF_TP_STRUCT_ENTRY), 111eda14cbcSMatt Macy TP_fast_assign(DBUF_TP_FAST_ASSIGN), 112eda14cbcSMatt Macy TP_printk("%s", __get_str(msg)) 113eda14cbcSMatt Macy ); 114eda14cbcSMatt Macy 115eda14cbcSMatt Macy DECLARE_EVENT_CLASS(zfs_dbuf_state_class, 116eda14cbcSMatt Macy TP_PROTO(dmu_buf_impl_t *db, const char *why), 117eda14cbcSMatt Macy TP_ARGS(db, why), 118eda14cbcSMatt Macy TP_STRUCT__entry(DBUF_TP_STRUCT_ENTRY), 119eda14cbcSMatt Macy TP_fast_assign(DBUF_TP_FAST_ASSIGN), 120eda14cbcSMatt Macy TP_printk("%s", __get_str(msg)) 121eda14cbcSMatt Macy ); 122eda14cbcSMatt Macy /* END CSTYLED */ 123eda14cbcSMatt Macy 124eda14cbcSMatt Macy #define DEFINE_DBUF_EVENT(name) \ 125eda14cbcSMatt Macy DEFINE_EVENT(zfs_dbuf_class, name, \ 126eda14cbcSMatt Macy TP_PROTO(dmu_buf_impl_t *db, zio_t *zio), \ 127eda14cbcSMatt Macy TP_ARGS(db, zio)) 128eda14cbcSMatt Macy DEFINE_DBUF_EVENT(zfs_blocked__read); 129eda14cbcSMatt Macy 130eda14cbcSMatt Macy #define DEFINE_DBUF_STATE_EVENT(name) \ 131eda14cbcSMatt Macy DEFINE_EVENT(zfs_dbuf_state_class, name, \ 132eda14cbcSMatt Macy TP_PROTO(dmu_buf_impl_t *db, const char *why), \ 133eda14cbcSMatt Macy TP_ARGS(db, why)) 134eda14cbcSMatt Macy DEFINE_DBUF_STATE_EVENT(zfs_dbuf__state_change); 135eda14cbcSMatt Macy 136eda14cbcSMatt Macy /* BEGIN CSTYLED */ 137eda14cbcSMatt Macy DECLARE_EVENT_CLASS(zfs_dbuf_evict_one_class, 138eda14cbcSMatt Macy TP_PROTO(dmu_buf_impl_t *db, multilist_sublist_t *mls), 139eda14cbcSMatt Macy TP_ARGS(db, mls), 140eda14cbcSMatt Macy TP_STRUCT__entry(DBUF_TP_STRUCT_ENTRY), 141eda14cbcSMatt Macy TP_fast_assign(DBUF_TP_FAST_ASSIGN), 142eda14cbcSMatt Macy TP_printk("%s", __get_str(msg)) 143eda14cbcSMatt Macy ); 144eda14cbcSMatt Macy /* END CSTYLED */ 145eda14cbcSMatt Macy 146eda14cbcSMatt Macy #define DEFINE_DBUF_EVICT_ONE_EVENT(name) \ 147eda14cbcSMatt Macy DEFINE_EVENT(zfs_dbuf_evict_one_class, name, \ 148eda14cbcSMatt Macy TP_PROTO(dmu_buf_impl_t *db, multilist_sublist_t *mls), \ 149eda14cbcSMatt Macy TP_ARGS(db, mls)) 150eda14cbcSMatt Macy DEFINE_DBUF_EVICT_ONE_EVENT(zfs_dbuf__evict__one); 151eda14cbcSMatt Macy 152eda14cbcSMatt Macy #endif /* _TRACE_DBUF_H */ 153eda14cbcSMatt Macy 154eda14cbcSMatt Macy #undef TRACE_INCLUDE_PATH 155eda14cbcSMatt Macy #undef TRACE_INCLUDE_FILE 156eda14cbcSMatt Macy #define TRACE_INCLUDE_PATH sys 157eda14cbcSMatt Macy #define TRACE_INCLUDE_FILE trace_dbuf 158eda14cbcSMatt Macy #include <trace/define_trace.h> 159eda14cbcSMatt Macy 160eda14cbcSMatt Macy #else 161eda14cbcSMatt Macy 162eda14cbcSMatt Macy DEFINE_DTRACE_PROBE2(blocked__read); 163eda14cbcSMatt Macy DEFINE_DTRACE_PROBE2(dbuf__evict__one); 164eda14cbcSMatt Macy DEFINE_DTRACE_PROBE2(dbuf__state_change); 165eda14cbcSMatt Macy 166eda14cbcSMatt Macy #endif /* HAVE_DECLARE_EVENT_CLASS */ 167eda14cbcSMatt Macy #endif /* _KERNEL */ 168