Wrapped the base APIs for easier annotation on wait and event. Start
with supporting waiters on each single event. More general support for
multiple events is a future work. Do more when the need arises.

How to annotate (the simplest way):

1. Initaialize a map for the interesting wait.

   /*
    * Recommand to place along with the wait instance.
    */
   struct dept_map my_wait;

   /*
    * Recommand to place in the initialization code.
    */
   sdt_map_init(&my_wait);

2. Place the following at the wait code.

   sdt_wait(&my_wait);

3. Place the following at the event code.

   sdt_event(&my_wait);

That's it!

Signed-off-by: Byungchul Park <byungc...@sk.com>
---
 include/linux/dept_sdt.h | 62 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 62 insertions(+)
 create mode 100644 include/linux/dept_sdt.h

diff --git a/include/linux/dept_sdt.h b/include/linux/dept_sdt.h
new file mode 100644
index 000000000000..12a793b90c7e
--- /dev/null
+++ b/include/linux/dept_sdt.h
@@ -0,0 +1,62 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Single-event Dependency Tracker
+ *
+ * Started by Byungchul Park <max.byungchul.p...@gmail.com>:
+ *
+ *  Copyright (c) 2020 LG Electronics, Inc., Byungchul Park
+ */
+
+#ifndef __LINUX_DEPT_SDT_H
+#define __LINUX_DEPT_SDT_H
+
+#include <linux/kernel.h>
+#include <linux/dept.h>
+
+#ifdef CONFIG_DEPT
+#define sdt_map_init(m)                                                        
\
+       do {                                                            \
+               static struct dept_key __key;                           \
+               dept_map_init(m, &__key, 0, #m);                        \
+       } while (0)
+
+#define sdt_map_init_key(m, k)         dept_map_init(m, k, 0, #m)
+
+#define sdt_wait(m)                                                    \
+       do {                                                            \
+               dept_request_event(m);                                  \
+               dept_wait(m, 1UL, _THIS_IP_, __func__, 0);              \
+       } while (0)
+
+/*
+ * sdt_might_sleep() and its family will be committed in __schedule()
+ * when it actually gets to __schedule(). Both dept_request_event() and
+ * dept_wait() will be performed on the commit.
+ */
+
+/*
+ * Use the code location as the class key if an explicit map is not used.
+ */
+#define sdt_might_sleep_start(m)                                       \
+       do {                                                            \
+               struct dept_map *__m = m;                               \
+               static struct dept_key __key;                           \
+               dept_stage_wait(__m, __m ? NULL : &__key, _THIS_IP_, __func__);\
+       } while (0)
+
+#define sdt_might_sleep_end()          dept_clean_stage()
+
+#define sdt_ecxt_enter(m)              dept_ecxt_enter(m, 1UL, _THIS_IP_, 
"start", "event", 0)
+#define sdt_event(m)                   dept_event(m, 1UL, _THIS_IP_, __func__)
+#define sdt_ecxt_exit(m)               dept_ecxt_exit(m, 1UL, _THIS_IP_)
+#else /* !CONFIG_DEPT */
+#define sdt_map_init(m)                        do { } while (0)
+#define sdt_map_init_key(m, k)         do { (void)(k); } while (0)
+#define sdt_wait(m)                    do { } while (0)
+#define sdt_might_sleep_start(m)       do { } while (0)
+#define sdt_might_sleep_end()          do { } while (0)
+#define sdt_ecxt_enter(m)              do { } while (0)
+#define sdt_event(m)                   do { } while (0)
+#define sdt_ecxt_exit(m)               do { } while (0)
+#endif
+#endif /* __LINUX_DEPT_SDT_H */
-- 
2.17.1

Reply via email to