88 lines
2.4 KiB
C
88 lines
2.4 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
|
|
#ifndef _FS_EROFS_TRACE_H_
|
|
#define _FS_EROFS_TRACE_H_
|
|
|
|
#include <sys/sdt.h>
|
|
|
|
#include "internal.h"
|
|
|
|
SDT_PROVIDER_DECLARE(erofs);
|
|
|
|
SDT_PROBE_DECLARE(erofs, data, map_blocks, enter);
|
|
SDT_PROBE_DECLARE(erofs, data, map_blocks, exit);
|
|
SDT_PROBE_DECLARE(erofs, data, read_folio, entry);
|
|
SDT_PROBE_DECLARE(erofs, data, readahead, entry);
|
|
SDT_PROBE_DECLARE(erofs, inode, fill_inode, entry);
|
|
SDT_PROBE_DECLARE(erofs, namei, lookup, entry);
|
|
SDT_PROBE_DECLARE(erofs, , , corrupt);
|
|
|
|
#if WITH_EROFS_SDT
|
|
#define EROFS_TRACE_CORRUPT(nid, line, error) \
|
|
SDT_PROBE3(erofs, , , corrupt, (nid), (line), (error))
|
|
#else
|
|
#define EROFS_TRACE_CORRUPT(nid, line, error) do { } while (0)
|
|
#endif
|
|
|
|
#define EROFS_TRACE_MAP_BLOCKS_ENTER(vi, map, flags) \
|
|
SDT_PROBE4(erofs, data, map_blocks, enter, \
|
|
(vi)->nid, (map)->m_la, (map)->m_llen, (flags))
|
|
|
|
#ifdef KDTRACE_HOOKS
|
|
#define EROFS_TRACE_MAP_BLOCKS_EXIT(vi, map, error) do { \
|
|
uint64_t erofs_trace_status; \
|
|
if (SDT_PROBES_ENABLED()) { \
|
|
erofs_trace_status = ((uint64_t)(uint32_t)(error) << 32) | \
|
|
(uint64_t)(uint32_t)(map)->m_flags; \
|
|
SDT_PROBE6(erofs, data, map_blocks, exit, (vi)->nid, \
|
|
(map)->m_la, (map)->m_pa, (map)->m_llen, (map)->m_plen, \
|
|
erofs_trace_status); \
|
|
} \
|
|
} while (0)
|
|
#else
|
|
#define EROFS_TRACE_MAP_BLOCKS_EXIT(vi, map, error) do { \
|
|
(void)(vi); \
|
|
(void)(map); \
|
|
(void)(error); \
|
|
} while (0)
|
|
#endif
|
|
|
|
#define EROFS_TRACE_READ_FOLIO(vi, offset, length, raw) \
|
|
SDT_PROBE5(erofs, data, read_folio, entry, (vi)->nid, \
|
|
(uint64_t)(offset), (uint64_t)(length), (vi)->vtype == VDIR, (raw))
|
|
|
|
#define EROFS_TRACE_READAHEAD(vi, start, nrpages, raw) \
|
|
SDT_PROBE4(erofs, data, readahead, entry, (vi)->nid, \
|
|
(uint64_t)(start), (uint64_t)(nrpages), (raw))
|
|
|
|
#define EROFS_TRACE_FILL_INODE(nid, blkaddr, offset) \
|
|
SDT_PROBE3(erofs, inode, fill_inode, entry, (nid), \
|
|
(uint64_t)(blkaddr), (uint32_t)(offset))
|
|
|
|
static __inline void
|
|
erofs_trace_lookup(const struct erofs_inode *dir, const char *name,
|
|
size_t length, uint32_t flags)
|
|
{
|
|
#ifdef KDTRACE_HOOKS
|
|
uint32_t hash;
|
|
size_t i;
|
|
|
|
if (!SDT_PROBES_ENABLED())
|
|
return;
|
|
hash = UINT32_C(2166136261);
|
|
for (i = 0; i < length; ++i) {
|
|
hash ^= (uint8_t)name[i];
|
|
hash *= UINT32_C(16777619);
|
|
}
|
|
SDT_PROBE4(erofs, namei, lookup, entry, dir->nid, hash,
|
|
(uint64_t)length, flags);
|
|
#else
|
|
(void)dir;
|
|
(void)name;
|
|
(void)length;
|
|
(void)flags;
|
|
#endif
|
|
}
|
|
|
|
#endif
|