Commit 7f7c39ccb6045cf1fd5e7684a484c445291b44d4

Authored by Christoph Hellwig
Committed by Lachlan McIlroy
1 parent 3cc7524c84

[XFS] make btree tracing generic

Make the existing bmap btree tracing generic so that it applies to all
btree types.

Some fragments lifted from a patch by Dave Chinner.

This adds two files that were missed from the previous btree tracing
checkin.

SGI-PV: 985583

SGI-Modid: xfs-linux-melb:xfs-kern:32210a

Signed-off-by: Christoph Hellwig <hch@infradead.org>
Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
Signed-off-by: Bill O'Donnell <billodo@sgi.com>
Signed-off-by: David Chinner <david@fromorbit.com>

Showing 2 changed files with 365 additions and 0 deletions Side-by-side Diff

fs/xfs/xfs_btree_trace.c
  1 +/*
  2 + * Copyright (c) 2008 Silicon Graphics, Inc.
  3 + * All Rights Reserved.
  4 + *
  5 + * This program is free software; you can redistribute it and/or
  6 + * modify it under the terms of the GNU General Public License as
  7 + * published by the Free Software Foundation.
  8 + *
  9 + * This program is distributed in the hope that it would be useful,
  10 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12 + * GNU General Public License for more details.
  13 + *
  14 + * You should have received a copy of the GNU General Public License
  15 + * along with this program; if not, write the Free Software Foundation,
  16 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  17 + */
  18 +#include "xfs.h"
  19 +#include "xfs_types.h"
  20 +#include "xfs_inum.h"
  21 +#include "xfs_bmap_btree.h"
  22 +#include "xfs_alloc_btree.h"
  23 +#include "xfs_ialloc_btree.h"
  24 +#include "xfs_inode.h"
  25 +#include "xfs_btree.h"
  26 +#include "xfs_btree_trace.h"
  27 +
  28 +STATIC void
  29 +xfs_btree_trace_ptr(
  30 + struct xfs_btree_cur *cur,
  31 + union xfs_btree_ptr ptr,
  32 + __psunsigned_t *high,
  33 + __psunsigned_t *low)
  34 +{
  35 + if (cur->bc_flags & XFS_BTREE_LONG_PTRS) {
  36 + __u64 val = be64_to_cpu(ptr.l);
  37 + *high = val >> 32;
  38 + *low = (int)val;
  39 + } else {
  40 + *high = 0;
  41 + *low = be32_to_cpu(ptr.s);
  42 + }
  43 +}
  44 +
  45 +/*
  46 + * Add a trace buffer entry for arguments, for a buffer & 1 integer arg.
  47 + */
  48 +void
  49 +xfs_btree_trace_argbi(
  50 + const char *func,
  51 + struct xfs_btree_cur *cur,
  52 + struct xfs_buf *b,
  53 + int i,
  54 + int line)
  55 +{
  56 + cur->bc_ops->trace_enter(cur, func, XBT_ARGS, XFS_BTREE_KTRACE_ARGBI,
  57 + line, (__psunsigned_t)b, i, 0, 0, 0, 0, 0,
  58 + 0, 0, 0, 0);
  59 +}
  60 +
  61 +/*
  62 + * Add a trace buffer entry for arguments, for a buffer & 2 integer args.
  63 + */
  64 +void
  65 +xfs_btree_trace_argbii(
  66 + const char *func,
  67 + struct xfs_btree_cur *cur,
  68 + struct xfs_buf *b,
  69 + int i0,
  70 + int i1,
  71 + int line)
  72 +{
  73 + cur->bc_ops->trace_enter(cur, func, XBT_ARGS, XFS_BTREE_KTRACE_ARGBII,
  74 + line, (__psunsigned_t)b, i0, i1, 0, 0, 0, 0,
  75 + 0, 0, 0, 0);
  76 +}
  77 +
  78 +/*
  79 + * Add a trace buffer entry for arguments, for 3 block-length args
  80 + * and an integer arg.
  81 + */
  82 +void
  83 +xfs_btree_trace_argfffi(
  84 + const char *func,
  85 + struct xfs_btree_cur *cur,
  86 + xfs_dfiloff_t o,
  87 + xfs_dfsbno_t b,
  88 + xfs_dfilblks_t i,
  89 + int j,
  90 + int line)
  91 +{
  92 + cur->bc_ops->trace_enter(cur, func, XBT_ARGS, XFS_BTREE_KTRACE_ARGFFFI,
  93 + line,
  94 + o >> 32, (int)o,
  95 + b >> 32, (int)b,
  96 + i >> 32, (int)i,
  97 + (int)j, 0, 0, 0, 0);
  98 +}
  99 +
  100 +/*
  101 + * Add a trace buffer entry for arguments, for one integer arg.
  102 + */
  103 +void
  104 +xfs_btree_trace_argi(
  105 + const char *func,
  106 + struct xfs_btree_cur *cur,
  107 + int i,
  108 + int line)
  109 +{
  110 + cur->bc_ops->trace_enter(cur, func, XBT_ARGS, XFS_BTREE_KTRACE_ARGI,
  111 + line, i, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
  112 +}
  113 +
  114 +/*
  115 + * Add a trace buffer entry for arguments, for int, fsblock, key.
  116 + */
  117 +void
  118 +xfs_btree_trace_argipk(
  119 + const char *func,
  120 + struct xfs_btree_cur *cur,
  121 + int i,
  122 + union xfs_btree_ptr ptr,
  123 + union xfs_btree_key *key,
  124 + int line)
  125 +{
  126 + __psunsigned_t high, low;
  127 + __uint64_t l0, l1;
  128 +
  129 + xfs_btree_trace_ptr(cur, ptr, &high, &low);
  130 + cur->bc_ops->trace_key(cur, key, &l0, &l1);
  131 + cur->bc_ops->trace_enter(cur, func, XBT_ARGS, XFS_BTREE_KTRACE_ARGIPK,
  132 + line, i, high, low,
  133 + l0 >> 32, (int)l0,
  134 + l1 >> 32, (int)l1,
  135 + 0, 0, 0, 0);
  136 +}
  137 +
  138 +/*
  139 + * Add a trace buffer entry for arguments, for int, fsblock, rec.
  140 + */
  141 +void
  142 +xfs_btree_trace_argipr(
  143 + const char *func,
  144 + struct xfs_btree_cur *cur,
  145 + int i,
  146 + union xfs_btree_ptr ptr,
  147 + union xfs_btree_rec *rec,
  148 + int line)
  149 +{
  150 + __psunsigned_t high, low;
  151 + __uint64_t l0, l1, l2;
  152 +
  153 + xfs_btree_trace_ptr(cur, ptr, &high, &low);
  154 + cur->bc_ops->trace_record(cur, rec, &l0, &l1, &l2);
  155 + cur->bc_ops->trace_enter(cur, func, XBT_ARGS, XFS_BTREE_KTRACE_ARGIPR,
  156 + line, i,
  157 + high, low,
  158 + l0 >> 32, (int)l0,
  159 + l1 >> 32, (int)l1,
  160 + l2 >> 32, (int)l2,
  161 + 0, 0);
  162 +}
  163 +
  164 +/*
  165 + * Add a trace buffer entry for arguments, for int, key.
  166 + */
  167 +void
  168 +xfs_btree_trace_argik(
  169 + const char *func,
  170 + struct xfs_btree_cur *cur,
  171 + int i,
  172 + union xfs_btree_key *key,
  173 + int line)
  174 +{
  175 + __uint64_t l0, l1;
  176 +
  177 + cur->bc_ops->trace_key(cur, key, &l0, &l1);
  178 + cur->bc_ops->trace_enter(cur, func, XBT_ARGS, XFS_BTREE_KTRACE_ARGIK,
  179 + line, i,
  180 + l0 >> 32, (int)l0,
  181 + l1 >> 32, (int)l1,
  182 + 0, 0, 0, 0, 0, 0);
  183 +}
  184 +
  185 +/*
  186 + * Add a trace buffer entry for arguments, for record.
  187 + */
  188 +void
  189 +xfs_btree_trace_argr(
  190 + const char *func,
  191 + struct xfs_btree_cur *cur,
  192 + union xfs_btree_rec *rec,
  193 + int line)
  194 +{
  195 + __uint64_t l0, l1, l2;
  196 +
  197 + cur->bc_ops->trace_record(cur, rec, &l0, &l1, &l2);
  198 + cur->bc_ops->trace_enter(cur, func, XBT_ARGS, XFS_BTREE_KTRACE_ARGR,
  199 + line,
  200 + l0 >> 32, (int)l0,
  201 + l1 >> 32, (int)l1,
  202 + l2 >> 32, (int)l2,
  203 + 0, 0, 0, 0, 0);
  204 +}
  205 +
  206 +/*
  207 + * Add a trace buffer entry for the cursor/operation.
  208 + */
  209 +void
  210 +xfs_btree_trace_cursor(
  211 + const char *func,
  212 + struct xfs_btree_cur *cur,
  213 + int type,
  214 + int line)
  215 +{
  216 + __uint32_t s0;
  217 + __uint64_t l0, l1;
  218 + char *s;
  219 +
  220 + switch (type) {
  221 + case XBT_ARGS:
  222 + s = "args";
  223 + break;
  224 + case XBT_ENTRY:
  225 + s = "entry";
  226 + break;
  227 + case XBT_ERROR:
  228 + s = "error";
  229 + break;
  230 + case XBT_EXIT:
  231 + s = "exit";
  232 + break;
  233 + default:
  234 + s = "unknown";
  235 + break;
  236 + }
  237 +
  238 + cur->bc_ops->trace_cursor(cur, &s0, &l0, &l1);
  239 + cur->bc_ops->trace_enter(cur, func, s, XFS_BTREE_KTRACE_CUR, line,
  240 + s0,
  241 + l0 >> 32, (int)l0,
  242 + l1 >> 32, (int)l1,
  243 + (__psunsigned_t)cur->bc_bufs[0],
  244 + (__psunsigned_t)cur->bc_bufs[1],
  245 + (__psunsigned_t)cur->bc_bufs[2],
  246 + (__psunsigned_t)cur->bc_bufs[3],
  247 + (cur->bc_ptrs[0] << 16) | cur->bc_ptrs[1],
  248 + (cur->bc_ptrs[2] << 16) | cur->bc_ptrs[3]);
  249 +}
fs/xfs/xfs_btree_trace.h
  1 +/*
  2 + * Copyright (c) 2008 Silicon Graphics, Inc.
  3 + * All Rights Reserved.
  4 + *
  5 + * This program is free software; you can redistribute it and/or
  6 + * modify it under the terms of the GNU General Public License as
  7 + * published by the Free Software Foundation.
  8 + *
  9 + * This program is distributed in the hope that it would be useful,
  10 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12 + * GNU General Public License for more details.
  13 + *
  14 + * You should have received a copy of the GNU General Public License
  15 + * along with this program; if not, write the Free Software Foundation,
  16 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  17 + */
  18 +#ifndef __XFS_BTREE_TRACE_H__
  19 +#define __XFS_BTREE_TRACE_H__
  20 +
  21 +struct xfs_btree_cur;
  22 +struct xfs_buf;
  23 +
  24 +
  25 +/*
  26 + * Trace hooks.
  27 + * i,j = integer (32 bit)
  28 + * b = btree block buffer (xfs_buf_t)
  29 + * p = btree ptr
  30 + * r = btree record
  31 + * k = btree key
  32 + */
  33 +
  34 +#ifdef XFS_BTREE_TRACE
  35 +
  36 +/*
  37 + * Trace buffer entry types.
  38 + */
  39 +#define XFS_BTREE_KTRACE_ARGBI 1
  40 +#define XFS_BTREE_KTRACE_ARGBII 2
  41 +#define XFS_BTREE_KTRACE_ARGFFFI 3
  42 +#define XFS_BTREE_KTRACE_ARGI 4
  43 +#define XFS_BTREE_KTRACE_ARGIPK 5
  44 +#define XFS_BTREE_KTRACE_ARGIPR 6
  45 +#define XFS_BTREE_KTRACE_ARGIK 7
  46 +#define XFS_BTREE_KTRACE_ARGR 8
  47 +#define XFS_BTREE_KTRACE_CUR 9
  48 +
  49 +/*
  50 + * Sub-types for cursor traces.
  51 + */
  52 +#define XBT_ARGS 0
  53 +#define XBT_ENTRY 1
  54 +#define XBT_ERROR 2
  55 +#define XBT_EXIT 3
  56 +
  57 +void xfs_btree_trace_argbi(const char *, struct xfs_btree_cur *,
  58 + struct xfs_buf *, int, int);
  59 +void xfs_btree_trace_argbii(const char *, struct xfs_btree_cur *,
  60 + struct xfs_buf *, int, int, int);
  61 +void xfs_btree_trace_argfffi(const char *, struct xfs_btree_cur *,
  62 + xfs_dfiloff_t, xfs_dfsbno_t, xfs_dfilblks_t, int, int);
  63 +void xfs_btree_trace_argi(const char *, struct xfs_btree_cur *, int, int);
  64 +void xfs_btree_trace_argipk(const char *, struct xfs_btree_cur *, int,
  65 + union xfs_btree_ptr, union xfs_btree_key *, int);
  66 +void xfs_btree_trace_argipr(const char *, struct xfs_btree_cur *, int,
  67 + union xfs_btree_ptr, union xfs_btree_rec *, int);
  68 +void xfs_btree_trace_argik(const char *, struct xfs_btree_cur *, int,
  69 + union xfs_btree_key *, int);
  70 +void xfs_btree_trace_argr(const char *, struct xfs_btree_cur *,
  71 + union xfs_btree_rec *, int);
  72 +void xfs_btree_trace_cursor(const char *, struct xfs_btree_cur *, int, int);
  73 +
  74 +
  75 +#define XFS_ALLOCBT_TRACE_SIZE 4096 /* size of global trace buffer */
  76 +extern ktrace_t *xfs_allocbt_trace_buf;
  77 +
  78 +#define XFS_INOBT_TRACE_SIZE 4096 /* size of global trace buffer */
  79 +extern ktrace_t *xfs_inobt_trace_buf;
  80 +
  81 +#define XFS_BMBT_TRACE_SIZE 4096 /* size of global trace buffer */
  82 +#define XFS_BMBT_KTRACE_SIZE 32 /* size of per-inode trace buffer */
  83 +extern ktrace_t *xfs_bmbt_trace_buf;
  84 +
  85 +
  86 +#define XFS_BTREE_TRACE_ARGBI(c, b, i) \
  87 + xfs_btree_trace_argbi(__func__, c, b, i, __LINE__)
  88 +#define XFS_BTREE_TRACE_ARGBII(c, b, i, j) \
  89 + xfs_btree_trace_argbii(__func__, c, b, i, j, __LINE__)
  90 +#define XFS_BTREE_TRACE_ARGFFFI(c, o, b, i, j) \
  91 + xfs_btree_trace_argfffi(__func__, c, o, b, i, j, __LINE__)
  92 +#define XFS_BTREE_TRACE_ARGI(c, i) \
  93 + xfs_btree_trace_argi(__func__, c, i, __LINE__)
  94 +#define XFS_BTREE_TRACE_ARGIPK(c, i, p, k) \
  95 + xfs_btree_trace_argipk(__func__, c, i, p, k, __LINE__)
  96 +#define XFS_BTREE_TRACE_ARGIPR(c, i, p, r) \
  97 + xfs_btree_trace_argipr(__func__, c, i, p, r, __LINE__)
  98 +#define XFS_BTREE_TRACE_ARGIK(c, i, k) \
  99 + xfs_btree_trace_argik(__func__, c, i, k, __LINE__)
  100 +#define XFS_BTREE_TRACE_ARGR(c, r) \
  101 + xfs_btree_trace_argr(__func__, c, r, __LINE__)
  102 +#define XFS_BTREE_TRACE_CURSOR(c, t) \
  103 + xfs_btree_trace_cursor(__func__, c, t, __LINE__)
  104 +#else
  105 +#define XFS_BTREE_TRACE_ARGBI(c, b, i)
  106 +#define XFS_BTREE_TRACE_ARGBII(c, b, i, j)
  107 +#define XFS_BTREE_TRACE_ARGFFFI(c, o, b, i, j)
  108 +#define XFS_BTREE_TRACE_ARGI(c, i)
  109 +#define XFS_BTREE_TRACE_ARGIPK(c, i, p, s)
  110 +#define XFS_BTREE_TRACE_ARGIPR(c, i, p, r)
  111 +#define XFS_BTREE_TRACE_ARGIK(c, i, k)
  112 +#define XFS_BTREE_TRACE_ARGR(c, r)
  113 +#define XFS_BTREE_TRACE_CURSOR(c, t)
  114 +#endif /* XFS_BTREE_TRACE */
  115 +
  116 +#endif /* __XFS_BTREE_TRACE_H__ */