You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2023/03/01 14:09:49 UTC
[nuttx] branch master updated: note: support note filtering at runtime
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 67461175fe note: support note filtering at runtime
67461175fe is described below
commit 67461175fedbde2b49c7db01b5909ad80780c6bc
Author: yinshengkai <yi...@xiaomi.com>
AuthorDate: Tue Feb 28 16:16:55 2023 +0800
note: support note filtering at runtime
Signed-off-by: yinshengkai <yi...@xiaomi.com>
---
drivers/note/note_driver.c | 102 +++++++++++++++++++-------
include/nuttx/sched_note.h | 173 +++++++++++++++++++++++++++++----------------
2 files changed, 187 insertions(+), 88 deletions(-)
diff --git a/drivers/note/note_driver.c b/drivers/note/note_driver.c
index ec35d72653..bb9b06b08b 100644
--- a/drivers/note/note_driver.c
+++ b/drivers/note/note_driver.c
@@ -99,12 +99,15 @@
struct note_filter_s
{
struct note_filter_mode_s mode;
-#ifdef CONFIG_SCHED_INSTRUMENTATION_IRQHANDLER
+# ifdef CONFIG_SCHED_INSTRUMENTATION_DUMP
+ struct note_filter_tag_s tag_mask;
+# endif
+# ifdef CONFIG_SCHED_INSTRUMENTATION_IRQHANDLER
struct note_filter_irq_s irq_mask;
-#endif
-#ifdef CONFIG_SCHED_INSTRUMENTATION_SYSCALL
+# endif
+# ifdef CONFIG_SCHED_INSTRUMENTATION_SYSCALL
struct note_filter_syscall_s syscall_mask;
-#endif
+# endif
};
#endif
@@ -445,7 +448,7 @@ static inline int note_isenabled_irq(int irq, bool enter)
* Check whether the dump instrumentation is enabled.
*
* Input Parameters:
- * None
+ * tag: The dump instrumentation tag
*
* Returned Value:
* True is returned if the instrumentation is enabled.
@@ -453,9 +456,9 @@ static inline int note_isenabled_irq(int irq, bool enter)
****************************************************************************/
#ifdef CONFIG_SCHED_INSTRUMENTATION_DUMP
-static inline int note_isenabled_dump(void)
+static inline int note_isenabled_dump(uint32_t tag)
{
-#ifdef CONFIG_SCHED_INSTRUMENTATION_FILTER
+# ifdef CONFIG_SCHED_INSTRUMENTATION_FILTER
if (!note_isenabled())
{
return false;
@@ -463,11 +466,12 @@ static inline int note_isenabled_dump(void)
/* If the dump trace is disabled, do nothing. */
- if ((g_note_filter.mode.flag & NOTE_FILTER_MODE_FLAG_DUMP) == 0)
+ if (!(g_note_filter.mode.flag & NOTE_FILTER_MODE_FLAG_DUMP) ||
+ NOTE_FILTER_DUMPMASK_ISSET(tag, &g_note_filter.tag_mask))
{
return false;
}
-#endif
+# endif
return true;
}
@@ -1340,7 +1344,7 @@ void sched_note_irqhandler(int irq, FAR void *handler, bool enter)
#endif
#ifdef CONFIG_SCHED_INSTRUMENTATION_DUMP
-void sched_note_string(uintptr_t ip, FAR const char *buf)
+void sched_note_string_ip(uint32_t tag, uintptr_t ip, FAR const char *buf)
{
FAR struct note_string_s *note;
uint8_t data[255];
@@ -1349,7 +1353,7 @@ void sched_note_string(uintptr_t ip, FAR const char *buf)
bool formatted = false;
FAR struct tcb_s *tcb = this_task();
- if (!note_isenabled_dump())
+ if (!note_isenabled_dump(tag))
{
return;
}
@@ -1390,8 +1394,8 @@ void sched_note_string(uintptr_t ip, FAR const char *buf)
}
}
-void sched_note_dump(uintptr_t ip, uint8_t event,
- FAR const void *buf, size_t len)
+void sched_note_dump_ip(uint32_t tag, uintptr_t ip, uint8_t event,
+ FAR const void *buf, size_t len)
{
FAR struct note_binary_s *note;
FAR struct note_driver_s **driver;
@@ -1400,7 +1404,7 @@ void sched_note_dump(uintptr_t ip, uint8_t event,
unsigned int length;
FAR struct tcb_s *tcb = this_task();
- if (!note_isenabled_dump())
+ if (!note_isenabled_dump(tag))
{
return;
}
@@ -1442,8 +1446,8 @@ void sched_note_dump(uintptr_t ip, uint8_t event,
}
}
-void sched_note_vprintf(uintptr_t ip,
- FAR const char *fmt, va_list va)
+void sched_note_vprintf_ip(uint32_t tag, uintptr_t ip,
+ FAR const char *fmt, va_list va)
{
FAR struct note_string_s *note;
uint8_t data[255];
@@ -1452,7 +1456,7 @@ void sched_note_vprintf(uintptr_t ip,
bool formatted = false;
FAR struct tcb_s *tcb = this_task();
- if (!note_isenabled_dump())
+ if (!note_isenabled_dump(tag))
{
return;
}
@@ -1496,8 +1500,8 @@ void sched_note_vprintf(uintptr_t ip,
}
}
-void sched_note_vbprintf(uintptr_t ip, uint8_t event,
- FAR const char *fmt, va_list va)
+void sched_note_vbprintf_ip(uint32_t tag, uintptr_t ip, uint8_t event,
+ FAR const char *fmt, va_list va)
{
FAR struct note_binary_s *note;
FAR struct note_driver_s **driver;
@@ -1534,7 +1538,7 @@ void sched_note_vbprintf(uintptr_t ip, uint8_t event,
int next = 0;
FAR struct tcb_s *tcb = this_task();
- if (!note_isenabled_dump())
+ if (!note_isenabled_dump(tag))
{
return;
}
@@ -1715,21 +1719,21 @@ void sched_note_vbprintf(uintptr_t ip, uint8_t event,
}
}
-void sched_note_printf(uintptr_t ip,
- FAR const char *fmt, ...)
+void sched_note_printf_ip(uint32_t tag, uintptr_t ip,
+ FAR const char *fmt, ...)
{
va_list va;
va_start(va, fmt);
- sched_note_vprintf(ip, fmt, va);
+ sched_note_vprintf_ip(tag, ip, fmt, va);
va_end(va);
}
-void sched_note_bprintf(uintptr_t ip, uint8_t event,
- FAR const char *fmt, ...)
+void sched_note_bprintf_ip(uint32_t tag, uintptr_t ip, uint8_t event,
+ FAR const char *fmt, ...)
{
va_list va;
va_start(va, fmt);
- sched_note_vbprintf(ip, event, fmt, va);
+ sched_note_vbprintf_ip(tag, ip, event, fmt, va);
va_end(va);
}
#endif /* CONFIG_SCHED_INSTRUMENTATION_DUMP */
@@ -1868,6 +1872,52 @@ void sched_note_filter_irq(FAR struct note_filter_irq_s *oldf,
}
#endif
+/****************************************************************************
+ * Name: sched_note_filter_tag
+ *
+ * Description:
+ * Set and get tsg filter setting
+ * (Same as NOTECTL_GETDUMPFILTER / NOTECTL_SETDUMPFILTER ioctls)
+ *
+ * Input Parameters:
+ * oldf - A writable pointer to struct note_filter_tag_s to get
+ * current dump filter setting
+ * If 0, no data is written.
+ * newf - A read-only pointer to struct note_filter_tag_s of the
+ * new dump filter setting
+ * If 0, the setting is not updated.
+ *
+ * Returned Value:
+ * None
+ *
+ ****************************************************************************/
+
+# ifdef CONFIG_SCHED_INSTRUMENTATION_DUMP
+void sched_note_filter_dump(FAR struct note_filter_tag_s *oldf,
+ FAR struct note_filter_tag_s *newf)
+{
+ irqstate_t falgs;
+
+ falgs = spin_lock_irqsave_wo_note(&g_note_lock);
+
+ if (oldf != NULL)
+ {
+ /* Return the current filter setting */
+
+ *oldf = g_note_filter.tag_mask;
+ }
+
+ if (newf != NULL)
+ {
+ /* Replace the dump filter mask by the provided setting */
+
+ g_note_filter.tag_mask = *newf;
+ }
+
+ spin_unlock_irqrestore_wo_note(&g_note_lock, falgs);
+}
+# endif
+
#endif /* CONFIG_SCHED_INSTRUMENTATION_FILTER */
#if CONFIG_DRIVERS_NOTE_TASKNAME_BUFSIZE > 0
diff --git a/include/nuttx/sched_note.h b/include/nuttx/sched_note.h
index 9be8a950ba..946a70f728 100644
--- a/include/nuttx/sched_note.h
+++ b/include/nuttx/sched_note.h
@@ -106,6 +106,19 @@
memset((s), 0, sizeof(struct note_filter_irq_s))
#endif
+/* Helper macros for dump instrumentation filter */
+
+#ifdef CONFIG_SCHED_INSTRUMENTATION_DUMP
+# define NOTE_FILTER_DUMPMASK_SET(tag, s) \
+ ((s)->tag_mask[(tag) / 8] |= (1 << ((tag) % 8)))
+# define NOTE_FILTER_DUMPMASK_CLR(tag, s) \
+ ((s)->tag_mask[(tag) / 8] &= ~(1 << ((tag) % 8)))
+# define NOTE_FILTER_DUMPMASK_ISSET(tag, s) \
+ ((s)->tag_mask[(tag) / 8] & (1 << ((tag) % 8)))
+# define NOTE_FILTER_DUMPMASK_ZERO(s) \
+ memset((s), 0, sizeof(struct note_filter_tag_s));
+#endif
+
#ifdef CONFIG_SCHED_INSTRUMENTATION_DUMP
# define SCHED_NOTE_LABEL__(x, y) x ## y
# define SCHED_NOTE_LABEL_(x, y) SCHED_NOTE_LABEL__(x, y)
@@ -113,35 +126,36 @@
SCHED_NOTE_LABEL_(sched_note_here, __LINE__)
# define SCHED_NOTE_IP \
({SCHED_NOTE_LABEL: (uintptr_t)&&SCHED_NOTE_LABEL;})
-# define SCHED_NOTE_STRING(buf) \
- sched_note_string(SCHED_NOTE_IP, buf)
-# define SCHED_NOTE_DUMP(event, buf, len) \
- sched_note_dump(SCHED_NOTE_IP, event, buf, len)
-# define SCHED_NOTE_VPRINTF(fmt, va) \
- sched_note_vprintf(SCHED_NOTE_IP, fmt, va)
-# define SCHED_NOTE_VBPRINTF(event, fmt, va) \
- sched_note_vbprintf(SCHED_NOTE_IP, event, fmt, va)
-# define SCHED_NOTE_PRINTF(fmt, ...) \
- sched_note_printf(SCHED_NOTE_IP, fmt, ##__VA_ARGS__)
-# define SCHED_NOTE_BPRINTF(event, fmt, ...) \
- sched_note_bprintf(SCHED_NOTE_IP, event, fmt, ##__VA_ARGS__)
-# define SCHED_NOTE_BEGINEX(str) \
- sched_note_printf(SCHED_NOTE_IP, "B|%d|%s", gettid(), str)
-# define SCHED_NOTE_ENDEX(str) \
- sched_note_printf(SCHED_NOTE_IP, "E|%d|%s", gettid(), str)
-# define SCHED_NOTE_BEGIN() \
- sched_note_begin(SCHED_NOTE_IP)
-# define SCHED_NOTE_END() \
- sched_note_end(SCHED_NOTE_IP)
+# define sched_note_string(tag, buf) \
+ sched_note_string_ip(tag, SCHED_NOTE_IP, buf)
+# define sched_note_dump(tag, event, buf, len) \
+ sched_note_dump_ip(tag, SCHED_NOTE_IP, event, buf, len)
+# define sched_note_vprintf(tag, fmt, va) \
+ sched_note_vprintf_ip(tag, SCHED_NOTE_IP, fmt, va)
+# define sched_note_vbprintf(event, fmt, va) \
+ sched_note_vbprintf_ip(tag, SCHED_NOTE_IP, event, fmt, va)
+# define sched_note_printf(tag, fmt, ...) \
+ sched_note_printf_ip(tag, SCHED_NOTE_IP, fmt, ##__VA_ARGS__)
+# define sched_note_bprintf(tag, event, fmt, ...) \
+ sched_note_bprintf_ip(tag, SCHED_NOTE_IP, event, \
+ fmt, ##__VA_ARGS__)
+# define sched_note_beginex(tag, str) \
+ sched_note_printf_ip(tag, SCHED_NOTE_IP, "B|%d|%s", gettid(), str)
+# define sched_note_endex(tag, str) \
+ sched_note_printf_ip(tag, SCHED_NOTE_IP, "E|%d|%s", gettid(), str)
+# define sched_note_begin(tag, ip) \
+ sched_note_string_ip(tag, SCHED_NOTE_IP, "B")
+# define sched_note_end(tag, ip) \
+ sched_note_string_ip(tag, SCHED_NOTE_IP, "E")
#else
-# define SCHED_NOTE_STRING(buf)
-# define SCHED_NOTE_DUMP(event, buf, len)
-# define SCHED_NOTE_VPRINTF(fmt, va)
-# define SCHED_NOTE_VBPRINTF(event, fmt, va)
-# define SCHED_NOTE_PRINTF(fmt, ...)
-# define SCHED_NOTE_BPRINTF(event, fmt, ...)
-# define SCHED_NOTE_BEGIN()
-# define SCHED_NOTE_END()
+# define sched_note_string(tag, buf)
+# define sched_note_dump(tag, event, buf, len)
+# define sched_note_vprintf(tag, fmt, va)
+# define sched_note_vbprintf(tag, event, fmt, va)
+# define sched_note_printf(tag, fmt, ...)
+# define sched_note_bprintf(tag, event, fmt, ...)
+# define sched_note_begin(tag)
+# define sched_note_end(tag)
#endif
/****************************************************************************
@@ -205,6 +219,30 @@ enum note_type_e
#endif
};
+enum note_tag_e
+{
+ NOTE_TAG_ALWAYS = 0,
+ NOTE_TAG_APP,
+ NOTE_TAG_ARCH,
+ NOTE_TAG_AUDIO,
+ NOTE_TAG_BOARD,
+ NOTE_TAG_CRYPTO,
+ NOTE_TAG_DRIVERS,
+ NOTE_TAG_FS,
+ NOTE_TAG_GRAPHICS,
+ NOTE_TAG_INPUT,
+ NOTE_TAG_MM,
+ NOTE_TAG_NET,
+ NOTE_TAG_SCHED,
+ NOTE_TAG_VIDEO,
+ NOTE_TAG_WIRLESS,
+
+ /* Always last */
+
+ NOTE_TAG_LAST,
+ NOTE_TAG_MAX = NOTE_TAG_LAST + 16
+};
+
/* This structure provides the common header of each note */
struct note_common_s
@@ -439,6 +477,13 @@ struct note_filter_irq_s
};
#endif
+#ifdef CONFIG_SCHED_INSTRUMENTATION_DUMP
+struct note_filter_tag_s
+{
+ uint8_t tag_mask[(NOTE_TAG_MAX + 7) / 8];
+};
+#endif
+
#endif /* CONFIG_SCHED_INSTRUMENTATION_FILTER */
/****************************************************************************
@@ -540,24 +585,25 @@ void sched_note_irqhandler(int irq, FAR void *handler, bool enter);
#ifdef CONFIG_SCHED_INSTRUMENTATION_DUMP
-void sched_note_string(uintptr_t ip, FAR const char *buf);
-void sched_note_dump(uintptr_t ip, uint8_t event,
- FAR const void *buf, size_t len);
-void sched_note_vprintf(uintptr_t ip, FAR const char *fmt,
- va_list va) printf_like(2, 0);
-void sched_note_vbprintf(uintptr_t ip, uint8_t event,
- FAR const char *fmt, va_list va) printf_like(3, 0);
-void sched_note_printf(uintptr_t ip,
- FAR const char *fmt, ...) printf_like(2, 3);
-void sched_note_bprintf(uintptr_t ip, uint8_t event,
- FAR const char *fmt, ...) printf_like(3, 4);
+void sched_note_string_ip(uint32_t tag, uintptr_t ip, FAR const char *buf);
+void sched_note_dump_ip(uint32_t tag, uintptr_t ip, uint8_t event,
+ FAR const void *buf, size_t len);
+void sched_note_vprintf_ip(uint32_t tag, uintptr_t ip, FAR const char *fmt,
+ va_list va) printf_like(3, 0);
+void sched_note_vbprintf_ip(uint32_t tag, uintptr_t ip, uint8_t event,
+ FAR const char *fmt,
+ va_list va) printf_like(4, 0);
+void sched_note_printf_ip(uint32_t tag, uintptr_t ip,
+ FAR const char *fmt, ...) printf_like(3, 4);
+void sched_note_bprintf_ip(uint32_t tag, uintptr_t ip, uint8_t event,
+ FAR const char *fmt, ...) printf_like(4, 5);
#else
-# define sched_note_string(ip,b)
-# define sched_note_dump(ip,e,b,l)
-# define sched_note_vprintf(ip,f,v)
-# define sched_note_vbprintf(ip,e,f,v)
-# define sched_note_printf(ip,f,...)
-# define sched_note_bprintf(ip,e,f,...)
+# define sched_note_string_ip(t,ip,b)
+# define sched_note_dump_ip(t,ip,e,b,l)
+# define sched_note_vprintf_ip(t,ip,f,v)
+# define sched_note_vbprintf_ip(t,ip,e,f,v)
+# define sched_note_printf_ip(t,ip,f,...)
+# define sched_note_bprintf_ip(t,ip,e,f,...)
#endif /* CONFIG_SCHED_INSTRUMENTATION_DUMP */
#if defined(__KERNEL__) || defined(CONFIG_BUILD_FLAT)
@@ -639,6 +685,12 @@ void sched_note_filter_irq(FAR struct note_filter_irq_s *oldf,
FAR struct note_filter_irq_s *newf);
#endif
+#if defined(CONFIG_SCHED_INSTRUMENTATION_FILTER) && \
+ defined(CONFIG_SCHED_INSTRUMENTATION_IRQHANDLER)
+void sched_note_filter_tag(FAR struct note_filter_tag_s *oldf,
+ FAR struct note_filter_tag_s *newf);
+#endif
+
#endif /* defined(__KERNEL__) || defined(CONFIG_BUILD_FLAT) */
#undef EXTERN
@@ -648,14 +700,14 @@ void sched_note_filter_irq(FAR struct note_filter_irq_s *oldf,
#else /* CONFIG_SCHED_INSTRUMENTATION */
-# define SCHED_NOTE_STRING(buf)
-# define SCHED_NOTE_DUMP(event, buf, len)
-# define SCHED_NOTE_VPRINTF(fmt, va)
-# define SCHED_NOTE_VBPRINTF(event, fmt, va)
-# define SCHED_NOTE_PRINTF(fmt, ...)
-# define SCHED_NOTE_BPRINTF(event, fmt, ...)
-# define SCHED_NOTE_BEGIN()
-# define SCHED_NOTE_END()
+# define sched_note_string(buf)
+# define sched_note_dump(event, buf, len)
+# define sched_note_vprintf(fmt, va)
+# define sched_note_vbprintf(event, fmt, va)
+# define sched_note_printf(fmt, ...)
+# define sched_note_bprintf(event, fmt, ...)
+# define sched_note_begin()
+# define sched_note_end()
# define sched_note_start(t)
# define sched_note_stop(t)
@@ -673,16 +725,13 @@ void sched_note_filter_irq(FAR struct note_filter_irq_s *oldf,
# define sched_note_syscall_enter(n,a,...)
# define sched_note_syscall_leave(n,r)
# define sched_note_irqhandler(i,h,e)
-# define sched_note_string(ip,b)
-# define sched_note_dump(ip,e,b,l)
-# define sched_note_vprintf(ip,f,v)
-# define sched_note_vbprintf(ip,e,f,v)
-# define sched_note_printf(ip,f,...)
-# define sched_note_bprintf(ip,e,f,...)
+# define sched_note_string_ip(t,ip,b)
+# define sched_note_dump_ip(t,ip,e,b,l)
+# define sched_note_vprintf_ip(t,ip,f,v)
+# define sched_note_vbprintf_ip(t,ip,e,f,v)
+# define sched_note_printf_ip(t,ip,f,...)
+# define sched_note_bprintf_ip(t,ip,e,f,...)
#endif /* CONFIG_SCHED_INSTRUMENTATION */
-#define sched_note_begin(ip) sched_note_string(ip, "B")
-#define sched_note_end(ip) sched_note_string(ip, "E")
-
#endif /* __INCLUDE_NUTTX_SCHED_NOTE_H */