From nobody Wed Dec 17 06:30:54 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B4D941EE7B9 for ; Tue, 11 Feb 2025 07:47:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739260026; cv=none; b=iDg5ufyb+v6Zj/FzeEw20kSh0sLflouzAP+kh3MerrNEYMMH60n9R6lyo65f6hUo8ZFX8yMwfM3WV4NFrJrCDLhDMz5lEqHfDi1c7urUC8+7p/32vHebGIYbjilSyoaPiR8dkBSuc2uTz4ZNmAgs+stfKpzvMgRhJPabtGsdtBs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739260026; c=relaxed/simple; bh=j2DIEPJn234b25zWy2ollwEvyS7l9DLI9kE9Xxv/KPE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iE1NfqcKZpju70Ppl0tj5E/eQPF7Zh0J6JgqALp7ccZcB30Ftp9e11PmIMPTFl9++p+sM3+ZnIguVxWUpBlISdBKH45vov991MxoHKenQ+Trp+1KAQsu27jmLcWZovoX7c2B/vlSfcOsDBH4GRmneYrdHvvPqAAF5MMMDkq6RxU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=AxZcZJEh; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="AxZcZJEh" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1739260023; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ncfRznIDJ0C7V6n5PD+CDnDY5iuvbJ9L9cieyHdRpfI=; b=AxZcZJEhw4Q5QF6Jck7UB5R9bXBslPLQ2JBpJ9OZbHWVvphGA5fQz87myUzfWpVClXtJfm 9HF74i2wTohfuo7yHS1Dv1kECN2E+VUYvAFf3DgDcJgPMAlO6C+YduQtAXYvkJ+71q1byb 7gOPovNZ9iiRCPH4Vg71qyw0kpXHp4Y= Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-550-jT8ErFm8OAOOKCPxUSW27Q-1; Tue, 11 Feb 2025 02:47:00 -0500 X-MC-Unique: jT8ErFm8OAOOKCPxUSW27Q-1 X-Mimecast-MFC-AGG-ID: jT8ErFm8OAOOKCPxUSW27Q Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id C43831800872; Tue, 11 Feb 2025 07:46:58 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.45.224.45]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 48F7E195608D; Tue, 11 Feb 2025 07:46:55 +0000 (UTC) From: Gabriele Monaco To: linux-kernel@vger.kernel.org, Ingo Molnar , Peter Zijlstra , Steven Rostedt , linux-trace-kernel@vger.kernel.org Cc: Gabriele Monaco , Juri Lelli , John Kacur , Clark Williams Subject: [PATCH v1 06/11] rv: Add snroc per-task monitor Date: Tue, 11 Feb 2025 08:46:13 +0100 Message-ID: <20250211074622.58590-7-gmonaco@redhat.com> In-Reply-To: <20250211074622.58590-1-gmonaco@redhat.com> References: <20250211074622.58590-1-gmonaco@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 Content-Type: text/plain; charset="utf-8" Add a per-task monitor as part of the sched model: * snroc: set non runnable on its own context Monitor to ensure set_state happens only in the respective task's conte= xt To: Ingo Molnar To: Peter Zijlstra Cc: Juri Lelli Cc: John Kacur Cc: Clark Williams Signed-off-by: Gabriele Monaco --- kernel/trace/rv/Kconfig | 1 + kernel/trace/rv/Makefile | 1 + kernel/trace/rv/monitors/snroc/Kconfig | 14 ++++ kernel/trace/rv/monitors/snroc/snroc.c | 87 ++++++++++++++++++++ kernel/trace/rv/monitors/snroc/snroc.h | 47 +++++++++++ kernel/trace/rv/monitors/snroc/snroc_trace.h | 15 ++++ kernel/trace/rv/rv_trace.h | 1 + tools/verification/models/sched/snroc.dot | 18 ++++ 8 files changed, 184 insertions(+) create mode 100644 kernel/trace/rv/monitors/snroc/Kconfig create mode 100644 kernel/trace/rv/monitors/snroc/snroc.c create mode 100644 kernel/trace/rv/monitors/snroc/snroc.h create mode 100644 kernel/trace/rv/monitors/snroc/snroc_trace.h create mode 100644 tools/verification/models/sched/snroc.dot diff --git a/kernel/trace/rv/Kconfig b/kernel/trace/rv/Kconfig index 961ac1e487df1..c4f1c0fc3abc6 100644 --- a/kernel/trace/rv/Kconfig +++ b/kernel/trace/rv/Kconfig @@ -30,6 +30,7 @@ source "kernel/trace/rv/monitors/wwnr/Kconfig" source "kernel/trace/rv/monitors/sched/Kconfig" source "kernel/trace/rv/monitors/tss/Kconfig" source "kernel/trace/rv/monitors/sco/Kconfig" +source "kernel/trace/rv/monitors/snroc/Kconfig" # Add new monitors here =20 config RV_REACTORS diff --git a/kernel/trace/rv/Makefile b/kernel/trace/rv/Makefile index ef2a084ff3102..6d11d6400ddd0 100644 --- a/kernel/trace/rv/Makefile +++ b/kernel/trace/rv/Makefile @@ -8,6 +8,7 @@ obj-$(CONFIG_RV_MON_WWNR) +=3D monitors/wwnr/wwnr.o obj-$(CONFIG_RV_MON_SCHED) +=3D monitors/sched/sched.o obj-$(CONFIG_RV_MON_TSS) +=3D monitors/tss/tss.o obj-$(CONFIG_RV_MON_SCO) +=3D monitors/sco/sco.o +obj-$(CONFIG_RV_MON_SNROC) +=3D monitors/snroc/snroc.o # Add new monitors here obj-$(CONFIG_RV_REACTORS) +=3D rv_reactors.o obj-$(CONFIG_RV_REACT_PRINTK) +=3D reactor_printk.o diff --git a/kernel/trace/rv/monitors/snroc/Kconfig b/kernel/trace/rv/monit= ors/snroc/Kconfig new file mode 100644 index 0000000000000..6e4365a2fea3b --- /dev/null +++ b/kernel/trace/rv/monitors/snroc/Kconfig @@ -0,0 +1,14 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +config RV_MON_SNROC + depends on RV + depends on RV_MON_SCHED + default y + select DA_MON_EVENTS_ID + bool "snroc monitor" + help + Monitor to ensure sched_set_state happens only in the respective task's= context. + This monitor is part of the sched monitors collection. + + For further information, see: + Documentation/trace/rv/monitor_sched.rst diff --git a/kernel/trace/rv/monitors/snroc/snroc.c b/kernel/trace/rv/monit= ors/snroc/snroc.c new file mode 100644 index 0000000000000..14c8eca3d5c8e --- /dev/null +++ b/kernel/trace/rv/monitors/snroc/snroc.c @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include +#include +#include +#include +#include + +#define MODULE_NAME "snroc" + +#include +#include +#include + +#include "snroc.h" + +static struct rv_monitor rv_snroc; +DECLARE_DA_MON_PER_TASK(snroc, unsigned char); + +static void handle_sched_set_state(void *data, struct task_struct *tsk, in= t curr_state, int state) +{ + struct task_struct *p =3D tsk; + + da_handle_event_snroc(p, sched_set_state_snroc); +} + +static void handle_sched_switch(void *data, bool preempt, + struct task_struct *prev, + struct task_struct *next, + unsigned int prev_state) +{ + da_handle_start_event_snroc(prev, sched_switch_out_snroc); + da_handle_event_snroc(next, sched_switch_in_snroc); +} + +static int enable_snroc(void) +{ + int retval; + + retval =3D da_monitor_init_snroc(); + if (retval) + return retval; + + rv_attach_trace_probe("snroc", sched_set_state_tp, handle_sched_set_state= ); + rv_attach_trace_probe("snroc", sched_switch, handle_sched_switch); + + return 0; +} + +static void disable_snroc(void) +{ + rv_snroc.enabled =3D 0; + + rv_detach_trace_probe("snroc", sched_set_state_tp, handle_sched_set_state= ); + rv_detach_trace_probe("snroc", sched_switch, handle_sched_switch); + + da_monitor_destroy_snroc(); +} + +static struct rv_monitor rv_snroc =3D { + .name =3D "snroc", + .description =3D "set non runnable on its own context.", + .enable =3D enable_snroc, + .disable =3D disable_snroc, + .reset =3D da_monitor_reset_all_snroc, + .enabled =3D 0, +}; + +static int __init register_snroc(void) +{ + rv_register_monitor(&rv_snroc, &rv_sched); + return 0; +} + +static void __exit unregister_snroc(void) +{ + rv_unregister_monitor(&rv_snroc); +} + +module_init(register_snroc); +module_exit(unregister_snroc); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Gabriele Monaco "); +MODULE_DESCRIPTION("snroc: set non runnable on its own context."); diff --git a/kernel/trace/rv/monitors/snroc/snroc.h b/kernel/trace/rv/monit= ors/snroc/snroc.h new file mode 100644 index 0000000000000..c3650a2b1b107 --- /dev/null +++ b/kernel/trace/rv/monitors/snroc/snroc.h @@ -0,0 +1,47 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Automatically generated C representation of snroc automaton + * For further information about this format, see kernel documentation: + * Documentation/trace/rv/deterministic_automata.rst + */ + +enum states_snroc { + other_context_snroc =3D 0, + own_context_snroc, + state_max_snroc +}; + +#define INVALID_STATE state_max_snroc + +enum events_snroc { + sched_set_state_snroc =3D 0, + sched_switch_in_snroc, + sched_switch_out_snroc, + event_max_snroc +}; + +struct automaton_snroc { + char *state_names[state_max_snroc]; + char *event_names[event_max_snroc]; + unsigned char function[state_max_snroc][event_max_snroc]; + unsigned char initial_state; + bool final_states[state_max_snroc]; +}; + +static const struct automaton_snroc automaton_snroc =3D { + .state_names =3D { + "other_context", + "own_context" + }, + .event_names =3D { + "sched_set_state", + "sched_switch_in", + "sched_switch_out" + }, + .function =3D { + { INVALID_STATE, own_context_snroc, INVALID_STATE }, + { own_context_snroc, INVALID_STATE, other_context_snroc }, + }, + .initial_state =3D other_context_snroc, + .final_states =3D { 1, 0 }, +}; diff --git a/kernel/trace/rv/monitors/snroc/snroc_trace.h b/kernel/trace/rv= /monitors/snroc/snroc_trace.h new file mode 100644 index 0000000000000..50114cef51229 --- /dev/null +++ b/kernel/trace/rv/monitors/snroc/snroc_trace.h @@ -0,0 +1,15 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +/* + * Snippet to be included in rv_trace.h + */ + +#ifdef CONFIG_RV_MON_SNROC +DEFINE_EVENT(event_da_monitor_id, event_snroc, + TP_PROTO(int id, char *state, char *event, char *next_state, bool fi= nal_state), + TP_ARGS(id, state, event, next_state, final_state)); + +DEFINE_EVENT(error_da_monitor_id, error_snroc, + TP_PROTO(int id, char *state, char *event), + TP_ARGS(id, state, event)); +#endif /* CONFIG_RV_MON_SNROC */ diff --git a/kernel/trace/rv/rv_trace.h b/kernel/trace/rv/rv_trace.h index f49e85ca97a1f..a533bc29cfddf 100644 --- a/kernel/trace/rv/rv_trace.h +++ b/kernel/trace/rv/rv_trace.h @@ -120,6 +120,7 @@ DECLARE_EVENT_CLASS(error_da_monitor_id, ); =20 #include +#include // Add new monitors based on CONFIG_DA_MON_EVENTS_ID here =20 #endif /* CONFIG_DA_MON_EVENTS_ID */ diff --git a/tools/verification/models/sched/snroc.dot b/tools/verification= /models/sched/snroc.dot new file mode 100644 index 0000000000000..8b71c32d4dca4 --- /dev/null +++ b/tools/verification/models/sched/snroc.dot @@ -0,0 +1,18 @@ +digraph state_automaton { + center =3D true; + size =3D "7,11"; + {node [shape =3D plaintext, style=3Dinvis, label=3D""] "__init_other_cont= ext"}; + {node [shape =3D ellipse] "other_context"}; + {node [shape =3D plaintext] "other_context"}; + {node [shape =3D plaintext] "own_context"}; + "__init_other_context" -> "other_context"; + "other_context" [label =3D "other_context", color =3D green3]; + "other_context" -> "own_context" [ label =3D "sched_switch_in" ]; + "own_context" [label =3D "own_context"]; + "own_context" -> "other_context" [ label =3D "sched_switch_out" ]; + "own_context" -> "own_context" [ label =3D "sched_set_state" ]; + { rank =3D min ; + "__init_other_context"; + "other_context"; + } +} --=20 2.48.1