From patchwork Sat Nov 5 00:20:03 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 9486195 X-Mozilla-Keys: nonjunk Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on sandeen.net X-Spam-Level: X-Spam-Status: No, score=-7.0 required=5.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.0 X-Spam-HP: BAYES_00=-1.9,HEADER_FROM_DIFFERENT_DOMAINS=0.001, RCVD_IN_DNSWL_HI=-5,RP_MATCHES_RCVD=-0.1,UNPARSEABLE_RELAY=0.001 X-Original-To: sandeen@sandeen.net Delivered-To: sandeen@sandeen.net Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by sandeen.net (Postfix) with ESMTP id 2B04411651 for ; Fri, 4 Nov 2016 19:19:52 -0500 (CDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753137AbcKEAUH (ORCPT ); Fri, 4 Nov 2016 20:20:07 -0400 Received: from aserp1040.oracle.com ([141.146.126.69]:38502 "EHLO aserp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753021AbcKEAUH (ORCPT ); Fri, 4 Nov 2016 20:20:07 -0400 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id uA50K4VU015125 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sat, 5 Nov 2016 00:20:05 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.14.4/8.14.4) with ESMTP id uA50K4pc017319 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sat, 5 Nov 2016 00:20:04 GMT Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by userv0121.oracle.com (8.14.4/8.13.8) with ESMTP id uA50K44Z004728; Sat, 5 Nov 2016 00:20:04 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 04 Nov 2016 17:20:03 -0700 Subject: [PATCH 09/41] xfs: add scrub tracepoints From: "Darrick J. Wong" To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org Date: Fri, 04 Nov 2016 17:20:03 -0700 Message-ID: <147830520307.2155.17458796827205767963.stgit@birch.djwong.org> In-Reply-To: <147830514302.2155.3920703176812208304.stgit@birch.djwong.org> References: <147830514302.2155.3920703176812208304.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Source-IP: userv0021.oracle.com [156.151.31.71] Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_types.h | 5 + fs/xfs/xfs_trace.h | 352 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 357 insertions(+) -- To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/fs/xfs/libxfs/xfs_types.h b/fs/xfs/libxfs/xfs_types.h index cf044c0..442b223 100644 --- a/fs/xfs/libxfs/xfs_types.h +++ b/fs/xfs/libxfs/xfs_types.h @@ -95,6 +95,11 @@ typedef __int64_t xfs_sfiloff_t; /* signed block number in a file */ #define XFS_ATTR_FORK 1 #define XFS_COW_FORK 2 +#define XFS_FORK_DESC \ + { XFS_DATA_FORK, "data" }, \ + { XFS_ATTR_FORK, "attr" }, \ + { XFS_COW_FORK, "CoW" } + /* * Min numbers of data/attr fork btree root pointers. */ diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 71778d0..ba61ca6 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -3460,6 +3460,358 @@ DEFINE_GETFSMAP_EVENT(xfs_getfsmap_low_key); DEFINE_GETFSMAP_EVENT(xfs_getfsmap_high_key); DEFINE_GETFSMAP_EVENT(xfs_getfsmap_mapping); +/* scrub */ +#define XFS_SCRUB_TYPE_DESC \ + { 0, NULL } +DECLARE_EVENT_CLASS(xfs_scrub_class, + TP_PROTO(struct xfs_inode *ip, int type, xfs_agnumber_t agno, + xfs_ino_t inum, unsigned int gen, unsigned int flags, + int error), + TP_ARGS(ip, type, agno, inum, gen, flags, error), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_ino_t, ino) + __field(int, type) + __field(xfs_agnumber_t, agno) + __field(xfs_ino_t, inum) + __field(unsigned int, gen) + __field(unsigned int, flags) + __field(int, error) + ), + TP_fast_assign( + __entry->dev = ip->i_mount->m_super->s_dev; + __entry->ino = ip->i_ino; + __entry->type = type; + __entry->agno = agno; + __entry->inum = inum; + __entry->gen = gen; + __entry->flags = flags; + __entry->error = error; + ), + TP_printk("dev %d:%d ino %llu type %s agno %u inum %llu gen %u flags 0x%x error %d\n", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->ino, + __print_symbolic(__entry->type, XFS_SCRUB_TYPE_DESC), + __entry->agno, + __entry->inum, + __entry->gen, + __entry->flags, + __entry->error) +) +#define DEFINE_SCRUB_EVENT(name) \ +DEFINE_EVENT(xfs_scrub_class, name, \ + TP_PROTO(struct xfs_inode *ip, int type, xfs_agnumber_t agno, \ + xfs_ino_t inum, unsigned int gen, unsigned int flags, \ + int error), \ + TP_ARGS(ip, type, agno, inum, gen, flags, error)) + +DECLARE_EVENT_CLASS(xfs_scrub_sbtree_class, + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t bno, + xfs_btnum_t btnum, int level, int nlevels, int ptr), + TP_ARGS(mp, agno, bno, btnum, level, nlevels, ptr), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_btnum_t, btnum) + __field(xfs_agnumber_t, agno) + __field(xfs_agblock_t, bno) + __field(int, level) + __field(int, nlevels) + __field(int, ptr) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->agno = agno; + __entry->btnum = btnum; + __entry->bno = bno; + __entry->level = level; + __entry->nlevels = nlevels; + __entry->ptr = ptr; + ), + TP_printk("dev %d:%d agno %u agbno %u btnum %d level %d nlevels %d ptr %d\n", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->agno, + __entry->bno, + __entry->btnum, + __entry->level, + __entry->nlevels, + __entry->ptr) +) +#define DEFINE_SCRUB_SBTREE_EVENT(name) \ +DEFINE_EVENT(xfs_scrub_sbtree_class, name, \ + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t bno, \ + xfs_btnum_t btnum, int level, int nlevels, int ptr), \ + TP_ARGS(mp, agno, bno, btnum, level, nlevels, ptr)) + +DEFINE_SCRUB_EVENT(xfs_scrub); +DEFINE_SCRUB_EVENT(xfs_scrub_done); +DEFINE_SCRUB_SBTREE_EVENT(xfs_scrub_btree_rec); +DEFINE_SCRUB_SBTREE_EVENT(xfs_scrub_btree_key); + +TRACE_EVENT(xfs_scrub_op_error, + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t bno, + const char *type, int error, const char *func, + int line), + TP_ARGS(mp, agno, bno, type, error, func, line), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(xfs_agblock_t, bno) + __string(type, type) + __field(int, error) + __string(func, func) + __field(int, line) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->agno = agno; + __entry->bno = bno; + __assign_str(type, type); + __entry->error = error; + __assign_str(func, func); + __entry->line = line; + ), + TP_printk("dev %d:%d agno %u agbno %u type '%s' error %d fn %s:%d\n", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->agno, + __entry->bno, + __get_str(type), + __entry->error, + __get_str(func), + __entry->line) +); + +TRACE_EVENT(xfs_scrub_file_op_error, + TP_PROTO(struct xfs_inode *ip, int whichfork, xfs_fileoff_t offset, + const char *type, int error, const char *func, + int line), + TP_ARGS(ip, whichfork, offset, type, error, func, line), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_ino_t, ino) + __field(int, whichfork) + __field(xfs_fileoff_t, offset) + __string(type, type) + __field(int, error) + __string(func, func) + __field(int, line) + ), + TP_fast_assign( + __entry->dev = ip->i_mount->m_super->s_dev; + __entry->ino = ip->i_ino; + __entry->whichfork = whichfork; + __entry->offset = offset; + __assign_str(type, type); + __entry->error = error; + __assign_str(func, func); + __entry->line = line; + ), + TP_printk("dev %d:%d ino %llu %s offset %llu type '%s' error %d fn %s:%d\n", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->ino, + __print_symbolic(__entry->whichfork, XFS_FORK_DESC), + __entry->offset, + __get_str(type), + __entry->error, + __get_str(func), + __entry->line) +); + +TRACE_EVENT(xfs_scrub_block_error, + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t bno, + const char *type, const char *check, const char *func, + int line), + TP_ARGS(mp, agno, bno, type, check, func, line), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(xfs_agblock_t, bno) + __string(type, type) + __string(check, check) + __string(func, func) + __field(int, line) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->agno = agno; + __entry->bno = bno; + __assign_str(type, type); + __assign_str(check, check); + __assign_str(func, func); + __entry->line = line; + ), + TP_printk("dev %d:%d agno %u agbno %u type '%s' check '%s' fn %s:%d\n", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->agno, + __entry->bno, + __get_str(type), + __get_str(check), + __get_str(func), + __entry->line) +); + +TRACE_EVENT(xfs_scrub_ino_error, + TP_PROTO(struct xfs_inode *ip, xfs_agnumber_t agno, xfs_agblock_t bno, + const char *type, const char *check, const char *func, + int line), + TP_ARGS(ip, agno, bno, type, check, func, line), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_ino_t, ino) + __field(xfs_agnumber_t, agno) + __field(xfs_agblock_t, bno) + __string(type, type) + __string(check, check) + __string(func, func) + __field(int, line) + ), + TP_fast_assign( + __entry->dev = ip->i_mount->m_super->s_dev; + __entry->ino = ip->i_ino; + __entry->agno = agno; + __entry->bno = bno; + __assign_str(type, type); + __assign_str(check, check); + __assign_str(func, func); + __entry->line = line; + ), + TP_printk("dev %d:%d ino %llu agno %u agbno %u type '%s' check '%s' fn %s:%d\n", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->ino, + __entry->agno, + __entry->bno, + __get_str(type), + __get_str(check), + __get_str(func), + __entry->line) +); + +TRACE_EVENT(xfs_scrub_data_error, + TP_PROTO(struct xfs_inode *ip, int whichfork, xfs_fileoff_t offset, + const char *type, const char *check, const char *func, + int line), + TP_ARGS(ip, whichfork, offset, type, check, func, line), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_ino_t, ino) + __field(int, whichfork) + __field(xfs_fileoff_t, offset) + __string(type, type) + __string(check, check) + __string(func, func) + __field(int, line) + ), + TP_fast_assign( + __entry->dev = ip->i_mount->m_super->s_dev; + __entry->ino = ip->i_ino; + __entry->whichfork = whichfork; + __entry->offset = offset; + __assign_str(type, type); + __assign_str(check, check); + __assign_str(func, func); + __entry->line = line; + ), + TP_printk("dev %d:%d ino %llu %s fork offset %llu type '%s' check '%s' fn %s:%d\n", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->ino, + __print_symbolic(__entry->whichfork, XFS_FORK_DESC), + __entry->offset, + __get_str(type), + __get_str(check), + __get_str(func), + __entry->line) +); + +TRACE_EVENT(xfs_scrub_xref_error, + TP_PROTO(struct xfs_mount *mp, const char *type, int error, + const char *func, int line), + TP_ARGS(mp, type, error, func, line), + TP_STRUCT__entry( + __field(dev_t, dev) + __string(type, type) + __field(int, error) + __string(func, func) + __field(int, line) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __assign_str(type, type); + __entry->error = error; + __assign_str(func, func); + __entry->line = line; + ), + TP_printk("dev %d:%d btree %s xref error %d fn %s:%d\n", + MAJOR(__entry->dev), MINOR(__entry->dev), + __get_str(type), + __entry->error, + __get_str(func), + __entry->line) +); + +TRACE_EVENT(xfs_scrub_btree_error, + TP_PROTO(struct xfs_mount *mp, const char *bt_type, const char *bt_ptr, + xfs_agnumber_t agno, xfs_agblock_t bno, const char *check, + const char *func, int line), + TP_ARGS(mp, bt_type, bt_ptr, agno, bno, check, func, line), + TP_STRUCT__entry( + __field(dev_t, dev) + __string(bt_type, bt_type) + __string(bt_ptr, bt_ptr) + __field(xfs_agnumber_t, agno) + __field(xfs_agblock_t, bno) + __string(check, check) + __string(func, func) + __field(int, line) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __assign_str(bt_type, bt_type); + __assign_str(bt_ptr, bt_ptr); + __entry->agno = agno; + __entry->bno = bno; + __assign_str(check, check); + __assign_str(func, func); + __entry->line = line; + ), + TP_printk("dev %d:%d %s %s agno %u agbno %u check '%s' fn %s:%d\n", + MAJOR(__entry->dev), MINOR(__entry->dev), + __get_str(bt_type), + __get_str(bt_ptr), + __entry->agno, + __entry->bno, + __get_str(check), + __get_str(func), + __entry->line) +); + +DECLARE_EVENT_CLASS(xfs_scrub_ag_lock_class, + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t max_ag, + xfs_agnumber_t agno), + TP_ARGS(mp, max_ag, agno), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, max_ag) + __field(xfs_agnumber_t, agno) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->max_ag = max_ag; + __entry->agno = agno; + ), + TP_printk("dev %d:%d max_ag %u agno %u\n", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->max_ag, + __entry->agno) +) +#define DEFINE_SCRUB_AG_LOCK_EVENT(name) \ +DEFINE_EVENT(xfs_scrub_ag_lock_class, name, \ + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t max_ag, \ + xfs_agnumber_t agno), \ + TP_ARGS(mp, max_ag, agno)) + +DEFINE_SCRUB_AG_LOCK_EVENT(xfs_scrub_ag_can_lock); +DEFINE_SCRUB_AG_LOCK_EVENT(xfs_scrub_ag_may_deadlock); +DEFINE_SCRUB_AG_LOCK_EVENT(xfs_scrub_ag_lock_all); + #endif /* _TRACE_XFS_H */ #undef TRACE_INCLUDE_PATH