Fix mm_vmscan_lru_isolate tracepoint for RHEL 9.4 kernel master
authorMartin Hicks <martin@sr-research.com>
Fri, 17 May 2024 15:07:26 +0000 (11:07 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Wed, 22 May 2024 20:08:16 +0000 (16:08 -0400)
Redhat has moved to using the format first found in the 6.7 kernel
for the mm_vmscan_lru_isolate tracepoint.

Change-Id: I2aa84769c0070458d902e9a0305488d6d8a380e1
Signed-off-by: Martin Hicks <martin@sr-research.com>
Signed-off-by: Kienan Stewart <kstewart@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
include/instrumentation/events/mm_vmscan.h
include/instrumentation/syscalls/syscalls_pointers_override.h
src/wrapper/page_alloc.c

index 90addbf3cc04f14f025d5f953789293719120307..66eb490cc5288217f1a597fdf0f8648c3ddb42c4 100644 (file)
@@ -334,7 +334,8 @@ LTTNG_TRACEPOINT_EVENT_MAP(mm_shrink_slab_end,
        )
 )
 
-#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(6,7,0))
+#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(6,7,0) || \
+     LTTNG_RHEL_KERNEL_RANGE(5,14,0,427,16,1, 5,15,0,0,0,0))
 LTTNG_TRACEPOINT_EVENT(mm_vmscan_lru_isolate,
 
        TP_PROTO(int classzone_idx,
index 00e5990c18873377a4a9c20b5af9780d2c294eb0..924677491b12b343c096eeaa486c4c6228162f42 100644 (file)
@@ -390,6 +390,11 @@ end:       ; /* Label at end of compound statement. */                                     \
        lttng_tp_mempool_free(tp_locvar->fds_ex);
 
 #if defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM)
+/*
+ * Instead of extracting the user-space pointers of the 3 fd_set,
+ * extract the bitmask of the FDs in the sets (in, out, ex) in the form
+ * of an array of uint8_t (1024 FDs is the limit in the kernel).
+ */
 #define OVERRIDE_32_select
 #define OVERRIDE_64_select
 SC_LTTNG_TRACEPOINT_EVENT_CODE(select,
@@ -427,6 +432,11 @@ SC_LTTNG_TRACEPOINT_EVENT_CODE(select,
 #endif /* defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM) */
 
 #if defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM64) || defined(CONFIG_ARM)
+/*
+ * Instead of extracting the user-space pointers of the 3 fd_set,
+ * extract the bitmask of the FDs in the sets (in, out, ex) in the form
+ * of an array of uint8_t (1024 FDs is the limit in the kernel).
+ */
 #define OVERRIDE_32_pselect6
 #define OVERRIDE_64_pselect6
 SC_LTTNG_TRACEPOINT_EVENT_CODE(pselect6,
@@ -464,6 +474,48 @@ SC_LTTNG_TRACEPOINT_EVENT_CODE(pselect6,
 )
 #endif /* defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM64) || defined(CONFIG_ARM) */
 
+#if defined(CONFIG_X86_32) || defined(CONFIG_ARM)
+/*
+ * Instead of extracting the user-space pointers of the 3 fd_set,
+ * extract the bitmask of the FDs in the sets (in, out, ex) in the form
+ * of an array of uint8_t (1024 FDs is the limit in the kernel).
+ */
+#define OVERRIDE_32_pselect6_time32
+SC_LTTNG_TRACEPOINT_EVENT_CODE(pselect6_time32,
+       TP_PROTO(sc_exit(long ret,) int n, fd_set __user * inp, fd_set __user * outp,
+               fd_set __user * exp, struct old_timespec32 __user * tvp, void __user * sig),
+       TP_ARGS(sc_exit(ret,) n, inp, outp, exp, tvp, sig),
+       TP_locvar(
+               LTTNG_SYSCALL_SELECT_locvar
+       ),
+       TP_code_pre(
+               LTTNG_SYSCALL_SELECT_code_pre
+       ),
+       TP_FIELDS(
+               sc_exit(ctf_integer(long, ret, ret))
+               sc_in(ctf_integer(int, n, n))
+               sc_inout(ctf_integer(uint8_t, overflow, tp_locvar->overflow))
+               sc_inout(ctf_integer(struct old_timespec32 *, tvp, tvp))
+               sc_in(ctf_integer_hex(void *, sig, sig))
+
+               sc_inout(
+#if (__BYTE_ORDER == __LITTLE_ENDIAN)
+                       LTTNG_SYSCALL_SELECT_fds_field_LE(readfds, inp)
+                       LTTNG_SYSCALL_SELECT_fds_field_LE(writefds, outp)
+                       LTTNG_SYSCALL_SELECT_fds_field_LE(exceptfds, exp)
+#else
+                       LTTNG_SYSCALL_SELECT_fds_field_BE(readfds, inp)
+                       LTTNG_SYSCALL_SELECT_fds_field_BE(writefds, outp)
+                       LTTNG_SYSCALL_SELECT_fds_field_BE(exceptfds, exp)
+#endif
+               )
+       ),
+       TP_code_post(
+               LTTNG_SYSCALL_SELECT_code_post
+       )
+)
+#endif /* defined(CONFIG_X86_32) || defined(CONFIG_ARM) */
+
 #ifdef LTTNG_CREATE_FIELD_METADATA
 #ifndef ONCE_LTTNG_TRACE_POLL_H
 #define ONCE_LTTNG_TRACE_POLL_H
@@ -652,6 +704,13 @@ end:                                                                                       \
        lttng_tp_mempool_free(tp_locvar->fds);
 
 #if defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM)
+/*
+ * Instead of printing the pointer address of the poll set, extract all the FDs
+ * and flags from the poll set. For now, only output the standardized
+ * set of events to limit the verbosity of the output, and also extract
+ * the raw value. In the future, moving to CTF2 will allow hiding unset
+ * fields and then allow extracting all the fields.
+ */
 #define OVERRIDE_32_poll
 #define OVERRIDE_64_poll
 SC_LTTNG_TRACEPOINT_EVENT_CODE(poll,
@@ -679,6 +738,13 @@ SC_LTTNG_TRACEPOINT_EVENT_CODE(poll,
 #endif /* defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM) */
 
 #if defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM64) || defined(CONFIG_ARM)
+/*
+ * Instead of printing the pointer address of the poll set, extract all the FDs
+ * and flags from the poll set. For now, only output the standardized
+ * set of events to limit the verbosity of the output, and also extract
+ * the raw value. In the future, moving to CTF2 will allow hiding unset
+ * fields and then allow extracting all the fields.
+ */
 #define OVERRIDE_32_ppoll
 #define OVERRIDE_64_ppoll
 SC_LTTNG_TRACEPOINT_EVENT_CODE(ppoll,
@@ -707,6 +773,41 @@ SC_LTTNG_TRACEPOINT_EVENT_CODE(ppoll,
 )
 #endif /* defined(CONFIG_X86_32) || defined(CONFIG_X86_64) || defined(CONFIG_ARM64) || defined(CONFIG_ARM) */
 
+#if defined(CONFIG_X86_32) || defined(CONFIG_ARM)
+/*
+ * Instead of printing the pointer address of the poll set, extract all the FDs
+ * and flags from the poll set. For now, only output the standardized
+ * set of events to limit the verbosity of the output, and also extract
+ * the raw value. In the future, moving to CTF2 will allow hiding unset
+ * fields and then allow extracting all the fields.
+ */
+#define OVERRIDE_32_ppoll_time32
+SC_LTTNG_TRACEPOINT_EVENT_CODE(ppoll_time32,
+       TP_PROTO(sc_exit(long ret,) struct pollfd __user * ufds,
+               unsigned int nfds, struct old_timespec32 * tsp, const sigset_t * sigmask, size_t sigsetsize),
+       TP_ARGS(sc_exit(ret,) ufds, nfds, tsp, sigmask, sigsetsize),
+       TP_locvar(
+               LTTNG_SYSCALL_POLL_locvar
+       ),
+       TP_code_pre(
+               LTTNG_SYSCALL_POLL_code_pre
+       ),
+       TP_FIELDS(
+               sc_exit(ctf_integer(long, ret, ret))
+               sc_in(ctf_integer(struct old_timespec32 *, tsp, tsp))
+               sc_in(ctf_integer(const sigset_t *, sigmask, sigmask))
+               sc_in(ctf_integer(size_t, sigsetsize, sigsetsize))
+               sc_inout(ctf_integer(unsigned int, nfds, nfds))
+               sc_inout(ctf_integer(unsigned int, fds_length, tp_locvar->fds_length))
+               sc_inout(ctf_integer(uint8_t, overflow, tp_locvar->overflow))
+               LTTNG_SYSCALL_POLL_fds_field
+       ),
+       TP_code_post(
+               LTTNG_SYSCALL_POLL_code_post
+       )
+)
+#endif /* defined(CONFIG_X86_32) || defined(CONFIG_ARM) */
+
 #include <linux/eventpoll.h>
 
 SC_LTTNG_TRACEPOINT_ENUM(lttng_epoll_op,
index 5e19d7b5c786accd74e0a9697ceb3af588dfc3ef..69988e664bb467e4dca373816da3c47901e2a972 100644 (file)
 
 #ifdef CONFIG_KALLSYMS
 
+/* Include page_alloc wrapper before pageblock-flags.h. */
+#include <wrapper/page_alloc.h>
+
+#include <linux/pageblock-flags.h>
 #include <linux/kallsyms.h>
 #include <linux/mm_types.h>
 #include <linux/module.h>
 #include <wrapper/kallsyms.h>
-#include <wrapper/page_alloc.h>
+#include <lttng/kernel-version.h>
+
+#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,14,0))
+static
+unsigned long (*get_pfnblock_flags_mask_sym)(const struct page *page,
+               unsigned long pfn,
+               unsigned long mask);
+
+unsigned long wrapper_get_pfnblock_flags_mask(const struct page *page,
+               unsigned long pfn,
+               unsigned long mask)
+{
+       WARN_ON_ONCE(!get_pfnblock_flags_mask_sym);
+       if (get_pfnblock_flags_mask_sym) {
+               struct irq_ibt_state irq_ibt_state;
+               unsigned long ret;
 
+               irq_ibt_state = wrapper_irq_ibt_save();
+               ret = get_pfnblock_flags_mask_sym(page, pfn, mask);
+               wrapper_irq_ibt_restore(irq_ibt_state);
+               return ret;
+       } else {
+               return -ENOSYS;
+       }
+}
+#elif (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,9,0))
+static
+unsigned long (*get_pfnblock_flags_mask_sym)(struct page *page,
+               unsigned long pfn,
+               unsigned long mask);
+
+unsigned long wrapper_get_pfnblock_flags_mask(struct page *page,
+               unsigned long pfn,
+               unsigned long mask)
+{
+       WARN_ON_ONCE(!get_pfnblock_flags_mask_sym);
+       if (get_pfnblock_flags_mask_sym) {
+               struct irq_ibt_state irq_ibt_state;
+               unsigned long ret;
+
+               irq_ibt_state = wrapper_irq_ibt_save();
+               ret = get_pfnblock_flags_mask_sym(page, pfn, mask);
+               wrapper_irq_ibt_restore(irq_ibt_state);
+               return ret;
+       } else {
+               return -ENOSYS;
+       }
+}
+#else  /* #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,9,0)) */
 static
 unsigned long (*get_pfnblock_flags_mask_sym)(struct page *page,
                unsigned long pfn,
@@ -41,6 +92,8 @@ unsigned long wrapper_get_pfnblock_flags_mask(struct page *page,
                return -ENOSYS;
        }
 }
+#endif /* #else #if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,9,0)) */
+
 EXPORT_SYMBOL_GPL(wrapper_get_pfnblock_flags_mask);
 
 int wrapper_get_pfnblock_flags_mask_init(void)
@@ -53,25 +106,6 @@ int wrapper_get_pfnblock_flags_mask_init(void)
 }
 EXPORT_SYMBOL_GPL(wrapper_get_pfnblock_flags_mask_init);
 
-/*
- * Canary function to check for 'get_pfnblock_flags_mask()' at compile time.
- *
- * From 'include/linux/pageblock-flags.h':
- *
- *   unsigned long get_pfnblock_flags_mask(struct page *page,
- *                                         unsigned long pfn,
- *                                         unsigned long end_bitidx,
- *                                         unsigned long mask);
- */
-__attribute__((unused)) static
-unsigned long __canary__get_pfnblock_flags_mask(struct page *page,
-                                               unsigned long pfn,
-                                               unsigned long end_bitidx,
-                                               unsigned long mask)
-{
-       return get_pfnblock_flags_mask(page, pfn, end_bitidx, mask);
-}
-
 #else
 
 #include <linux/pageblock-flags.h>
This page took 0.029929 seconds and 4 git commands to generate.