Now that there are 2 monitors for real-time applications, users may want to
enable both of them simultaneously. Make the number of per-task monitor
configurable. Default it to 2 for now.

Reviewed-by: Gabriele Monaco <gmon...@redhat.com>
Signed-off-by: Nam Cao <nam...@linutronix.de>
---
 include/linux/rv.h                     | 9 +--------
 include/linux/sched.h                  | 8 +++-----
 kernel/trace/rv/Kconfig                | 9 +++++++++
 kernel/trace/rv/monitors/rtapp/Kconfig | 1 +
 kernel/trace/rv/rv.c                   | 8 ++++----
 5 files changed, 18 insertions(+), 17 deletions(-)

diff --git a/include/linux/rv.h b/include/linux/rv.h
index 2897aad16883..099b23c14e54 100644
--- a/include/linux/rv.h
+++ b/include/linux/rv.h
@@ -74,14 +74,7 @@ struct ltl_monitor {};
 
 #endif /* CONFIG_RV_LTL_MONITOR */
 
-/*
- * Per-task RV monitors count. Nowadays fixed in RV_PER_TASK_MONITORS.
- * If we find justification for more monitors, we can think about
- * adding more or developing a dynamic method. So far, none of
- * these are justified.
- */
-#define RV_PER_TASK_MONITORS           1
-#define RV_PER_TASK_MONITOR_INIT       (RV_PER_TASK_MONITORS)
+#define RV_PER_TASK_MONITOR_INIT       (CONFIG_RV_PER_TASK_MONITORS)
 
 union rv_task_monitor {
        struct da_monitor       da_mon;
diff --git a/include/linux/sched.h b/include/linux/sched.h
index f96ac1982893..55fb32ce9657 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1634,12 +1634,10 @@ struct task_struct {
 
 #ifdef CONFIG_RV
        /*
-        * Per-task RV monitor. Nowadays fixed in RV_PER_TASK_MONITORS.
-        * If we find justification for more monitors, we can think
-        * about adding more or developing a dynamic method. So far,
-        * none of these are justified.
+        * Per-task RV monitor, fixed in CONFIG_RV_PER_TASK_MONITORS.
+        * If memory becomes a concern, we can think about a dynamic method.
         */
-       union rv_task_monitor           rv[RV_PER_TASK_MONITORS];
+       union rv_task_monitor           rv[CONFIG_RV_PER_TASK_MONITORS];
 #endif
 
 #ifdef CONFIG_USER_EVENTS
diff --git a/kernel/trace/rv/Kconfig b/kernel/trace/rv/Kconfig
index 942d57575e67..c11bf7e61ebf 100644
--- a/kernel/trace/rv/Kconfig
+++ b/kernel/trace/rv/Kconfig
@@ -32,6 +32,15 @@ menuconfig RV
          For further information, see:
            Documentation/trace/rv/runtime-verification.rst
 
+config RV_PER_TASK_MONITORS
+       int "Maximum number of per-task monitor"
+       depends on RV
+       range 1 8
+       default 2
+       help
+         This option configures the maximum number of per-task RV monitors 
that can run
+         simultaneously.
+
 source "kernel/trace/rv/monitors/wip/Kconfig"
 source "kernel/trace/rv/monitors/wwnr/Kconfig"
 source "kernel/trace/rv/monitors/sched/Kconfig"
diff --git a/kernel/trace/rv/monitors/rtapp/Kconfig 
b/kernel/trace/rv/monitors/rtapp/Kconfig
index 94689d66a79c..6a521c95a03f 100644
--- a/kernel/trace/rv/monitors/rtapp/Kconfig
+++ b/kernel/trace/rv/monitors/rtapp/Kconfig
@@ -1,5 +1,6 @@
 config RV_MON_RTAPP
        depends on RV
+       depends on RV_PER_TASK_MONITORS >= 2
        bool "rtapp monitor"
        help
          Collection of monitors to check for common problems with real-time 
application that cause
diff --git a/kernel/trace/rv/rv.c b/kernel/trace/rv/rv.c
index e25d65fe432a..108429d16ec1 100644
--- a/kernel/trace/rv/rv.c
+++ b/kernel/trace/rv/rv.c
@@ -165,7 +165,7 @@ struct dentry *get_monitors_root(void)
 LIST_HEAD(rv_monitors_list);
 
 static int task_monitor_count;
-static bool task_monitor_slots[RV_PER_TASK_MONITORS];
+static bool task_monitor_slots[CONFIG_RV_PER_TASK_MONITORS];
 
 int rv_get_task_monitor_slot(void)
 {
@@ -173,12 +173,12 @@ int rv_get_task_monitor_slot(void)
 
        lockdep_assert_held(&rv_interface_lock);
 
-       if (task_monitor_count == RV_PER_TASK_MONITORS)
+       if (task_monitor_count == CONFIG_RV_PER_TASK_MONITORS)
                return -EBUSY;
 
        task_monitor_count++;
 
-       for (i = 0; i < RV_PER_TASK_MONITORS; i++) {
+       for (i = 0; i < CONFIG_RV_PER_TASK_MONITORS; i++) {
                if (task_monitor_slots[i] == false) {
                        task_monitor_slots[i] = true;
                        return i;
@@ -194,7 +194,7 @@ void rv_put_task_monitor_slot(int slot)
 {
        lockdep_assert_held(&rv_interface_lock);
 
-       if (slot < 0 || slot >= RV_PER_TASK_MONITORS) {
+       if (slot < 0 || slot >= CONFIG_RV_PER_TASK_MONITORS) {
                WARN_ONCE(1, "RV releasing an invalid slot!: %d\n", slot);
                return;
        }
-- 
2.39.5


Reply via email to