Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix tracepoints definitions for Linux 6.10 #16515

Merged
merged 2 commits into from
Sep 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions config/kernel-assign_str.m4
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
dnl #
dnl # 6.10 kernel, check number of args of __assign_str() for trace:
dnl
dnl # 6.10+: one arg
dnl # 6.9 and older: two args
dnl #
dnl # More specifically, this will test to see if __assign_str() takes one
dnl # arg. If __assign_str() takes two args, or is not defined, then
dnl # HAVE_1ARG_ASSIGN_STR will not be set.
dnl #
AC_DEFUN([ZFS_AC_KERNEL_1ARG_ASSIGN_STR], [
AC_MSG_CHECKING([whether __assign_str() has one arg])
ZFS_LINUX_TRY_COMPILE_HEADER([
#include <linux/module.h>
MODULE_LICENSE("$ZFS_META_LICENSE");

#define CREATE_TRACE_POINTS
#include "conftest.h"
],[
trace_zfs_autoconf_event_one("1");
trace_zfs_autoconf_event_two("2");
],[
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_1ARG_ASSIGN_STR, 1,
[__assign_str() has one arg])
],[
AC_MSG_RESULT(no)
],[
#if !defined(_CONFTEST_H) || defined(TRACE_HEADER_MULTI_READ)
#define _CONFTEST_H

#undef TRACE_SYSTEM
#define TRACE_SYSTEM zfs
#include <linux/tracepoint.h>

DECLARE_EVENT_CLASS(zfs_autoconf_event_class,
TP_PROTO(char *string),
TP_ARGS(string),
TP_STRUCT__entry(
__string(str, string)
),
TP_fast_assign(
__assign_str(str);
),
TP_printk("str = %s", __get_str(str))
);

#define DEFINE_AUTOCONF_EVENT(name) \
DEFINE_EVENT(zfs_autoconf_event_class, name, \
TP_PROTO(char * str), \
TP_ARGS(str))
DEFINE_AUTOCONF_EVENT(zfs_autoconf_event_one);
DEFINE_AUTOCONF_EVENT(zfs_autoconf_event_two);

#endif /* _CONFTEST_H */

#undef TRACE_INCLUDE_PATH
#define TRACE_INCLUDE_PATH .
#define TRACE_INCLUDE_FILE conftest
#include <trace/define_trace.h>
])
])
1 change: 1 addition & 0 deletions config/kernel.m4
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
ZFS_AC_KERNEL_SYNC_BDEV
ZFS_AC_KERNEL_MM_PAGE_SIZE
ZFS_AC_KERNEL_MM_PAGE_MAPPING
ZFS_AC_KERNEL_1ARG_ASSIGN_STR
case "$host_cpu" in
powerpc*)
ZFS_AC_KERNEL_CPU_HAS_FEATURE
Expand Down
6 changes: 6 additions & 0 deletions include/os/linux/spl/sys/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,4 +83,10 @@ typedef struct user_namespace zidmap_t;

extern zidmap_t *zfs_init_idmap;

#ifdef HAVE_1ARG_ASSIGN_STR
#define __assign_str_impl(a, b) __assign_str(a)
#else
#define __assign_str_impl(a, b) __assign_str(a, b)
#endif

#endif /* _SPL_TYPES_H */
3 changes: 2 additions & 1 deletion include/os/linux/zfs/sys/trace_dbgmsg.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
#define _TRACE_DBGMSG_H

#include <linux/tracepoint.h>
#include <sys/types.h>

/*
* This file defines tracepoint events for use by the dbgmsg(),
Expand Down Expand Up @@ -59,7 +60,7 @@ DECLARE_EVENT_CLASS(zfs_dprintf_class,
__string(msg, msg)
),
TP_fast_assign(
__assign_str(msg, msg);
__assign_str_impl(msg, msg);
),
TP_printk("%s", __get_str(msg))
);
Expand Down
29 changes: 11 additions & 18 deletions include/os/linux/zfs/sys/trace_dbuf.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,28 +45,25 @@
* dmu_buf_impl_t *, ...,
* zio_t *, ...);
*/
#define DBUF_TP_STRUCT_ENTRY_OS_SPA \
(db != NULL && \
POINTER_IS_VALID(DB_DNODE(db)->dn_objset)) \
? spa_name(DB_DNODE(db)->dn_objset->os_spa) : "NULL"

#define DBUF_TP_STRUCT_ENTRY \
__dynamic_array(char, os_spa, TRACE_DBUF_MSG_MAX) \
__string(os_spa, DBUF_TP_STRUCT_ENTRY_OS_SPA) \
__field(uint64_t, ds_object) \
__field(uint64_t, db_object) \
__field(uint64_t, db_level) \
__field(uint64_t, db_blkid) \
__field(uint64_t, db_offset) \
__field(uint64_t, db_size) \
__field(uint64_t, db_state) \
__field(int64_t, db_holds) \
__dynamic_array(char, msg, TRACE_DBUF_MSG_MAX)
__field(int64_t, db_holds)

#define DBUF_TP_FAST_ASSIGN \
if (db != NULL) { \
if (POINTER_IS_VALID(DB_DNODE(db)->dn_objset)) { \
__assign_str(os_spa, \
spa_name(DB_DNODE(db)->dn_objset->os_spa)); \
} else { \
__assign_str(os_spa, "NULL"); \
} \
\
__assign_str_impl(os_spa, DBUF_TP_STRUCT_ENTRY_OS_SPA); \
__entry->ds_object = db->db_objset->os_dsl_dataset ? \
db->db_objset->os_dsl_dataset->ds_object : 0; \
\
Expand All @@ -77,10 +74,8 @@
__entry->db_size = db->db.db_size; \
__entry->db_state = db->db_state; \
__entry->db_holds = zfs_refcount_count(&db->db_holds); \
snprintf(__get_str(msg), TRACE_DBUF_MSG_MAX, \
DBUF_TP_PRINTK_FMT, DBUF_TP_PRINTK_ARGS); \
} else { \
__assign_str(os_spa, "NULL"); \
__assign_str_impl(os_spa, DBUF_TP_STRUCT_ENTRY_OS_SPA); \
__entry->ds_object = 0; \
__entry->db_object = 0; \
__entry->db_level = 0; \
Expand All @@ -89,8 +84,6 @@
__entry->db_size = 0; \
__entry->db_state = 0; \
__entry->db_holds = 0; \
snprintf(__get_str(msg), TRACE_DBUF_MSG_MAX, \
"dbuf { NULL }"); \
}

#define DBUF_TP_PRINTK_FMT \
Expand All @@ -109,15 +102,15 @@ DECLARE_EVENT_CLASS(zfs_dbuf_class,
TP_ARGS(db, zio),
TP_STRUCT__entry(DBUF_TP_STRUCT_ENTRY),
TP_fast_assign(DBUF_TP_FAST_ASSIGN),
TP_printk("%s", __get_str(msg))
TP_printk(DBUF_TP_PRINTK_FMT, DBUF_TP_PRINTK_ARGS)
);

DECLARE_EVENT_CLASS(zfs_dbuf_state_class,
TP_PROTO(dmu_buf_impl_t *db, const char *why),
TP_ARGS(db, why),
TP_STRUCT__entry(DBUF_TP_STRUCT_ENTRY),
TP_fast_assign(DBUF_TP_FAST_ASSIGN),
TP_printk("%s", __get_str(msg))
TP_printk(DBUF_TP_PRINTK_FMT, DBUF_TP_PRINTK_ARGS)
);
/* END CSTYLED */

Expand All @@ -139,7 +132,7 @@ DECLARE_EVENT_CLASS(zfs_dbuf_evict_one_class,
TP_ARGS(db, mls),
TP_STRUCT__entry(DBUF_TP_STRUCT_ENTRY),
TP_fast_assign(DBUF_TP_FAST_ASSIGN),
TP_printk("%s", __get_str(msg))
TP_printk(DBUF_TP_PRINTK_FMT, DBUF_TP_PRINTK_ARGS)
);
/* END CSTYLED */

Expand Down
Loading