Files
2026-10-19 08:35:59 +08:00

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