From nobody Sun Dec 14 02:06:09 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.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 211FA26FA62 for ; Tue, 15 Jul 2025 07:15:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563706; cv=none; b=fLkcws8fiIYdjoXOkqWmJGXyF7b45nobHtyF2Yh9adCm0xEhxz5cbHnJtWurZkJtNHgkQtU9UUT+32Hw5MjSIALtlz6JffIBPzQIdriyypR1ee45Cw8oLNIaP/zFF4dOigF5paB03tQ0hSl857GlS/HnaNz56mRAtmql1n6k1vI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563706; c=relaxed/simple; bh=R4rMR1/LBoP5QyQkec+H91+Abp3jWUPV/y9CWuKvXw4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ltZTYCLOp5/q5Gl1o9VSTC4+P/Vayj+XcVFu2mUrHbShgZt24W96FfzXb0cfCisuvYcY8SKsJtq8Vk9gcsZRqr1XPmYt4tSzoa8p/VFx7vJMgs/KPZTQJ8tg41rknLsINxKyPP6eD7O6z0lPyFxTmPnP1BAyW/7jLNSgrSgoh58= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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=MuFLMb/8; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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="MuFLMb/8" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1752563702; 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=ugNoQXCbqoiLLEt6/qUSKF55w8XG71cY+EEtg+02qSs=; b=MuFLMb/8hJ1pcopRAw1OxJ5CmbBfyd8frMH33aQ5L60AH0lD0yqn45ylAuR+Qd/RwLWFC5 V8RMgwllUz9Z0xetTt+4d1icjY/4AiLXphrOt4dovRL4L3ZoJ4ZV6LGvhXrjVN4Cm1KPIs RtTR4q+QreRwoEBRmEt44NRG5Z4XMME= Received: from mx-prod-mc-06.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-121-wxGbJGZBMUO5gJLH2HDD6A-1; Tue, 15 Jul 2025 03:15:00 -0400 X-MC-Unique: wxGbJGZBMUO5gJLH2HDD6A-1 X-Mimecast-MFC-AGG-ID: wxGbJGZBMUO5gJLH2HDD6A_1752563699 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (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-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 127991800289; Tue, 15 Jul 2025 07:14:59 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.45.224.115]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 90855180045B; Tue, 15 Jul 2025 07:14:53 +0000 (UTC) From: Gabriele Monaco To: linux-kernel@vger.kernel.org, Steven Rostedt , linux-trace-kernel@vger.kernel.org Cc: Gabriele Monaco , Ingo Molnar , Peter Zijlstra , Nam Cao , Tomas Glozar , Juri Lelli , Clark Williams , John Kacur Subject: [PATCH v3 01/17] tools/rv: Do not skip idle in trace Date: Tue, 15 Jul 2025 09:14:18 +0200 Message-ID: <20250715071434.22508-2-gmonaco@redhat.com> In-Reply-To: <20250715071434.22508-1-gmonaco@redhat.com> References: <20250715071434.22508-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.4.1 on 10.30.177.111 Content-Type: text/plain; charset="utf-8" Currently, the userspace RV tool skips trace events triggered by the RV tool itself, this can be changed by passing the parameter -s, which sets the variable config_my_pid to 0 (instead of the tool's PID). The current condition for per-task monitors (config_has_id) does not check that config_my_pid isn't 0 to skip. In case we pass -s, we show events triggered by RV but don't show those triggered by idle (PID 0). Fix the condition to account this scenario. Fixes: 6d60f89691fc ("tools/rv: Add in-kernel monitor interface") Signed-off-by: Gabriele Monaco --- tools/verification/rv/src/in_kernel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/verification/rv/src/in_kernel.c b/tools/verification/rv/= src/in_kernel.c index c0dcee795c0de..72b03bae021cd 100644 --- a/tools/verification/rv/src/in_kernel.c +++ b/tools/verification/rv/src/in_kernel.c @@ -429,7 +429,7 @@ ikm_event_handler(struct trace_seq *s, struct tep_recor= d *record, =20 tep_get_common_field_val(s, trace_event, "common_pid", record, &pid, 1); =20 - if (config_has_id && (config_my_pid =3D=3D id)) + if (config_my_pid && config_has_id && (config_my_pid =3D=3D id)) return 0; else if (config_my_pid && (config_my_pid =3D=3D pid)) return 0; --=20 2.50.1 From nobody Sun Dec 14 02:06:09 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.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 8CC8226E6E6 for ; Tue, 15 Jul 2025 07:15:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563715; cv=none; b=pk4KNI9tix/WdqPKRGOqQA+L7ETFri0xzWd3zCPKEucmUj03y+jUX2utaa0r4IyCrAxoeZtBuwiOYo0Vz8xLMIh+j1N5kASh+jFc/vcx67CDi48a01oJ8ejVyIM7dQBjMMwulMeIimTqVPNIlK4PmQFnALrqeaTWb10gkJXGgX0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563715; c=relaxed/simple; bh=yWiUq8fghZDhX5ma9boL3BXbQhkeBz7R0cP557CB3fA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Iujg9MWxoKPIuK9SeNMxSfVplQ/0jkGtoA8n4UEqA6oWWvq0q3DOqmYicycepFe8kAi8L/OEDWdE8WW6aVYU5k89hXgoKJJJA/va6vmZggtXo8ahYFQnZSEUVV5By6YB8RApS2wJbXAP1wopJM7rc4ZQqxSKTXRNNPmwCBkTBVY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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=SQ1sKgzh; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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="SQ1sKgzh" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1752563712; 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=ltwOXqFjqgE+HbNtjGzELCnivw3kypC1AN2XcT9IjAE=; b=SQ1sKgzhZGWyoANo/EYaDsi8bohaKNKSOtnhrGUV7FiK98tTOvZHNgEWrgxOMG85YZCoek NNHZr++HQBR3KbQC0tW/p0Zx8qT06zCk9pGlMGqkfJyuuZDQntWbcyj3VrzsQwFkqQUR9S scc+NaLXV6H5iOCAj7oygAX/Q0yOqnY= 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-677-Aj74G9O4Nk-d2qmeGl_PSg-1; Tue, 15 Jul 2025 03:15:06 -0400 X-MC-Unique: Aj74G9O4Nk-d2qmeGl_PSg-1 X-Mimecast-MFC-AGG-ID: Aj74G9O4Nk-d2qmeGl_PSg_1752563705 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (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 E8950180034E; Tue, 15 Jul 2025 07:15:04 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.45.224.115]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 2CCF818046C3; Tue, 15 Jul 2025 07:14:59 +0000 (UTC) From: Gabriele Monaco To: linux-kernel@vger.kernel.org, Steven Rostedt , linux-trace-kernel@vger.kernel.org Cc: Gabriele Monaco , Ingo Molnar , Peter Zijlstra , Nam Cao , Tomas Glozar , Juri Lelli , Clark Williams , John Kacur Subject: [PATCH v3 02/17] tools/rv: Stop gracefully also on SIGTERM Date: Tue, 15 Jul 2025 09:14:19 +0200 Message-ID: <20250715071434.22508-3-gmonaco@redhat.com> In-Reply-To: <20250715071434.22508-1-gmonaco@redhat.com> References: <20250715071434.22508-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.4.1 on 10.30.177.111 Content-Type: text/plain; charset="utf-8" Currently the userspace RV tool starts a monitor and waits for the user to press Ctrl-C (SIGINT) to terminate and stop the monitor. This doesn't account for a scenario where a user starts RV in background and simply kills it (SIGTERM unless the user specifies differently). E.g.: # rv mon wip & # kill % Would terminate RV without stopping the monitor and next RV executions won't start correctly. Register the signal handler used for SIGINT also to SIGTERM. Signed-off-by: Gabriele Monaco --- tools/verification/rv/src/rv.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/verification/rv/src/rv.c b/tools/verification/rv/src/rv.c index 239de054d1e06..b8fe24a87d97c 100644 --- a/tools/verification/rv/src/rv.c +++ b/tools/verification/rv/src/rv.c @@ -191,6 +191,7 @@ int main(int argc, char **argv) * and exit. */ signal(SIGINT, stop_rv); + signal(SIGTERM, stop_rv); =20 rv_mon(argc - 1, &argv[1]); } --=20 2.50.1 From nobody Sun Dec 14 02:06:09 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 495964A11 for ; Tue, 15 Jul 2025 07:15:17 +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=1752563719; cv=none; b=nbW3TLd2vXHLpFkhZmL9VHWHvbCKz2br8gGxYMflQISojKkRtRRZv+6w3krDzI2B3opstflAiPr4x8WKfrm1/BUCa8RvwmZKIsHgie4xKm2wOSTCItWPHBRUfMeYWIhHKGClqaLlVCx9Nzx/39ZsSn0ICCVoviW3p3XUQ0DOES4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563719; c=relaxed/simple; bh=S8XSph4CGykRKWV6LO1+fNjRMKNd3X9hGx0nmuXeG/4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Gt7mfJgTw85xSLKBl7E7tYEW2UXOeo/on91xRUaYMKGUm3icCrOE9oI2ALLO8hHv53QR4yRSxfzGUf2/SuJGD+IK2oW6QBdmBR5djJLJxI+3JsSRo0jXvSHcSmNKzd+A7uAuT0KOTdEwflsQGs3vv8GhU4U1vgHncuU6pM/K2K0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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=hzfJuuyC; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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="hzfJuuyC" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1752563716; 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=zpmW1LQ0RcFZxBKVUzlR69nCzAqnrlY/23ap2mvVnY8=; b=hzfJuuyCFqy3+D+mkYk7SWunkOdw89Zz+x6yDOfpo4ZCOPbb5hSufk1gHLAjsEWFRHllC+ xzfF4sQNnOaAZrYTDvaR8w0WmGVhZBpc193aijD/KxX0gwx9MVX1fkoDAb4Bm1SVsISKiu 1uaUMz2WpxAj13gB5KK0vRKezhMGSPc= Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-282--cXZ_amyO32FpA67e3V7Rg-1; Tue, 15 Jul 2025 03:15:13 -0400 X-MC-Unique: -cXZ_amyO32FpA67e3V7Rg-1 X-Mimecast-MFC-AGG-ID: -cXZ_amyO32FpA67e3V7Rg_1752563711 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (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-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 8B12219560AA; Tue, 15 Jul 2025 07:15:11 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.45.224.115]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id D79F8180035E; Tue, 15 Jul 2025 07:15:05 +0000 (UTC) From: Gabriele Monaco To: linux-kernel@vger.kernel.org, Steven Rostedt , linux-trace-kernel@vger.kernel.org Cc: Gabriele Monaco , Nam Cao , Ingo Molnar , Peter Zijlstra , Tomas Glozar , Juri Lelli , Clark Williams , John Kacur Subject: [PATCH v3 03/17] rv: Add da_handle_start_run_event_ to per-task monitors Date: Tue, 15 Jul 2025 09:14:20 +0200 Message-ID: <20250715071434.22508-4-gmonaco@redhat.com> In-Reply-To: <20250715071434.22508-1-gmonaco@redhat.com> References: <20250715071434.22508-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.4.1 on 10.30.177.111 Content-Type: text/plain; charset="utf-8" The RV da_monitor API allows to start monitors in two ways: da_handle_start_event_NAME and da_handle_start_run_event_NAME. The former is used when the event is followed by the initial state of the module, so we ignore the event but we know the monitor is in the initial state and can start monitoring, the latter can be used if the event can only occur in the initial state, so we do handle the event as if the monitor was in the initial state. This latter API is defined for implicit monitors but not per-task ones. Define da_handle_start_run_event_NAME macro also for per-task monitors. Reviewed-by: Nam Cao Signed-off-by: Gabriele Monaco --- include/rv/da_monitor.h | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/include/rv/da_monitor.h b/include/rv/da_monitor.h index 15f9ed4e4bb69..ed3c34fe18d61 100644 --- a/include/rv/da_monitor.h +++ b/include/rv/da_monitor.h @@ -487,6 +487,30 @@ da_handle_start_event_##name(struct task_struct *tsk, = enum events_##name event) __da_handle_event_##name(da_mon, tsk, event); \ \ return 1; \ +} \ + \ +/* \ + * da_handle_start_run_event_##name - start monitoring and handle event = \ + * \ + * This function is used to notify the monitor that the system is in the = \ + * initial state, so the monitor can start monitoring and handling event. = \ + */ \ +static inline bool \ +da_handle_start_run_event_##name(struct task_struct *tsk, enum events_##na= me event) \ +{ \ + struct da_monitor *da_mon; \ + \ + if (!da_monitor_enabled_##name()) \ + return 0; \ + \ + da_mon =3D da_get_monitor_##name(tsk); \ + \ + if (unlikely(!da_monitoring_##name(da_mon))) \ + da_monitor_start_##name(da_mon); \ + \ + __da_handle_event_##name(da_mon, tsk, event); \ + \ + return 1; \ } =20 /* --=20 2.50.1 From nobody Sun Dec 14 02:06:09 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.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 42A2526F45D for ; Tue, 15 Jul 2025 07:15:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563724; cv=none; b=MqpBQtFFVYhpBSnHfp6K/AwCUy3dCvbctdlyDVu+z+edsA9MBcBPqw3qvvM5z3jTxgox6eA5R0url6geey363z+xNGd5DphjIA8af1Zc8ZI0bJmqZmlSjHAwyR3/uOzrF92I8W/rLeo83ZsqRxcFQn/yWYX2FIvBHlxZ30SzTR0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563724; c=relaxed/simple; bh=Ct2zo29AGQQ0cZ+MGXfRxxB80H8w/8b84QqJcZYh/f0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gyimcgKJ1L7H0P84hVLUm7/BkFRJQAaZt8JCw73aPNPjI3LGxCD77EG0lFCGfZCZrveBE4JrlM+rBTwh4CMZOy4RDxoJjiihT0lY0FLRhRpY0a7NiiPrJCFX7TEwLygdnRY4MYbJmEWP0qp7b9E8+rpm7ToNETO7zXgoX0Ud3ow= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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=Vbmunhsd; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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="Vbmunhsd" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1752563722; 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=GiBIPi6oljTwNx1ZK0eI6nNNT8PvIKNjPDsOzG64Tqk=; b=Vbmunhsd0nImhV6la28Au5OfqVrpVNyPWy+20n2UzyCDCRN4P9nxaLcHh/tiIdgj65PuXK vHXQSHCn1d6J0N7hhYmH0JrrXxE69DDJFmSYcVF9NxIfel0m2EBt4t2lmuqRsJEb0S7bPv o5/kocDrmmRic/uaRcyAzpuFojtLPLE= 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-249-PDFf0_tPOyap16zSZrEbwA-1; Tue, 15 Jul 2025 03:15:18 -0400 X-MC-Unique: PDFf0_tPOyap16zSZrEbwA-1 X-Mimecast-MFC-AGG-ID: PDFf0_tPOyap16zSZrEbwA_1752563717 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (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 AD81E1808993; Tue, 15 Jul 2025 07:15:17 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.45.224.115]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 7B92318046C9; Tue, 15 Jul 2025 07:15:12 +0000 (UTC) From: Gabriele Monaco To: linux-kernel@vger.kernel.org, Steven Rostedt , Masami Hiramatsu , linux-trace-kernel@vger.kernel.org Cc: Gabriele Monaco , Nam Cao , Ingo Molnar , Peter Zijlstra , Tomas Glozar , Juri Lelli , Clark Williams , John Kacur Subject: [PATCH v3 04/17] rv: Remove trailing whitespace from tracepoint string Date: Tue, 15 Jul 2025 09:14:21 +0200 Message-ID: <20250715071434.22508-5-gmonaco@redhat.com> In-Reply-To: <20250715071434.22508-1-gmonaco@redhat.com> References: <20250715071434.22508-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.4.1 on 10.30.177.111 Content-Type: text/plain; charset="utf-8" RV event tracepoints print a line with the format: "event_xyz: S0 x event -> S1 " "event_xyz: S1 x event -> S0 (final)" While printing an event leading to a non-final state, the line has a trailing white space (visible above before the closing "). Adapt the format string not to print the trailing whitespace if we are not printing "(final)". Reviewed-by: Nam Cao Signed-off-by: Gabriele Monaco --- kernel/trace/rv/rv_trace.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/kernel/trace/rv/rv_trace.h b/kernel/trace/rv/rv_trace.h index b6f3104984664..17ba07329b670 100644 --- a/kernel/trace/rv/rv_trace.h +++ b/kernel/trace/rv/rv_trace.h @@ -29,11 +29,11 @@ DECLARE_EVENT_CLASS(event_da_monitor, __entry->final_state =3D final_state; ), =20 - TP_printk("%s x %s -> %s %s", + TP_printk("%s x %s -> %s%s", __entry->state, __entry->event, __entry->next_state, - __entry->final_state ? "(final)" : "") + __entry->final_state ? " (final)" : "") ); =20 DECLARE_EVENT_CLASS(error_da_monitor, @@ -90,12 +90,12 @@ DECLARE_EVENT_CLASS(event_da_monitor_id, __entry->final_state =3D final_state; ), =20 - TP_printk("%d: %s x %s -> %s %s", + TP_printk("%d: %s x %s -> %s%s", __entry->id, __entry->state, __entry->event, __entry->next_state, - __entry->final_state ? "(final)" : "") + __entry->final_state ? " (final)" : "") ); =20 DECLARE_EVENT_CLASS(error_da_monitor_id, --=20 2.50.1 From nobody Sun Dec 14 02:06:09 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.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 5F41926F45D for ; Tue, 15 Jul 2025 07:15:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563732; cv=none; b=ZBdta7YqhKYmBSIvVw6l7U9q1fTXsA2HDxlLSXHxmhIuc8Z3SdoO2JE9YlfaQ5lZ59783oNBVgfO5LcrQHjbHqTvIlwClJOgl1r5Z0xRKdgcMpa0rd4WHE2NvqFTtmd2mlcwY4gZoX14S56k6h+hlBqopi2GBuOaGBL4rTr6LF0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563732; c=relaxed/simple; bh=RwlkD+tCr0Pi85Lu3wroUbdADaE/C2Fff3qQjm2XHJY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=k5T9POomvK5vQYH/IfikPcZZSDrTWtSneAC1XOJzaidlRX/8DXMim6Cb5XA++5/THxtNSWE0X4nLuwZuT6dIwiBGHh5UwXoGjRWOnpJ7Hpc5Jm6L/4cZfuGh3Jk5hFYhzFPOq7I+QOc7NyUWVM0ayDBuodTsmKI02oGGTTlay/M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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=EV+84lP7; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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="EV+84lP7" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1752563729; 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=HMxLsVrAcLLK8IOUnW/ApzI7FRvl178+1OyVLrr+mv0=; b=EV+84lP7zpT0NOKd8Gwl3PwzIUrSwhA//zNKpvts4Lx0v9/DLfifi1N3M4IHbfilyGVwKh aZySSAuwuGlTPm8opqqlR1Kk3cZG8GJfJWoWKRxnHcKq6ujaQ341+obKr5NxdCnCLI5FOw qaQxgYEoaTp7Rqxl75hjqv3bupXwDjE= Received: from mx-prod-mc-02.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-195-dBvogFN8P0uO-1bfoB1n8A-1; Tue, 15 Jul 2025 03:15:25 -0400 X-MC-Unique: dBvogFN8P0uO-1bfoB1n8A-1 X-Mimecast-MFC-AGG-ID: dBvogFN8P0uO-1bfoB1n8A_1752563724 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (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-02.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 42A2119560AA; Tue, 15 Jul 2025 07:15:24 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.45.224.115]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 60EA7180035E; Tue, 15 Jul 2025 07:15:19 +0000 (UTC) From: Gabriele Monaco To: linux-kernel@vger.kernel.org, Steven Rostedt , Masami Hiramatsu , linux-trace-kernel@vger.kernel.org Cc: Gabriele Monaco , Nam Cao , Ingo Molnar , Peter Zijlstra , Tomas Glozar , Juri Lelli , Clark Williams , John Kacur Subject: [PATCH v3 05/17] rv: Return init error when registering monitors Date: Tue, 15 Jul 2025 09:14:22 +0200 Message-ID: <20250715071434.22508-6-gmonaco@redhat.com> In-Reply-To: <20250715071434.22508-1-gmonaco@redhat.com> References: <20250715071434.22508-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.4.1 on 10.30.177.111 Content-Type: text/plain; charset="utf-8" Monitors generated with dot2k have their registration function (the one called during monitor initialisation) return always 0, even if the registration failed on RV side. This can hide potential errors. Return the value returned by the RV register function. Reviewed-by: Nam Cao Signed-off-by: Gabriele Monaco --- kernel/trace/rv/monitors/sched/sched.c | 3 +-- kernel/trace/rv/monitors/sco/sco.c | 3 +-- kernel/trace/rv/monitors/scpd/scpd.c | 3 +-- kernel/trace/rv/monitors/sncid/sncid.c | 3 +-- kernel/trace/rv/monitors/snep/snep.c | 3 +-- kernel/trace/rv/monitors/snroc/snroc.c | 3 +-- kernel/trace/rv/monitors/tss/tss.c | 3 +-- kernel/trace/rv/monitors/wip/wip.c | 3 +-- kernel/trace/rv/monitors/wwnr/wwnr.c | 3 +-- 9 files changed, 9 insertions(+), 18 deletions(-) diff --git a/kernel/trace/rv/monitors/sched/sched.c b/kernel/trace/rv/monit= ors/sched/sched.c index 905e03c3c934d..d04db4b543f96 100644 --- a/kernel/trace/rv/monitors/sched/sched.c +++ b/kernel/trace/rv/monitors/sched/sched.c @@ -21,8 +21,7 @@ struct rv_monitor rv_sched =3D { =20 static int __init register_sched(void) { - rv_register_monitor(&rv_sched, NULL); - return 0; + return rv_register_monitor(&rv_sched, NULL); } =20 static void __exit unregister_sched(void) diff --git a/kernel/trace/rv/monitors/sco/sco.c b/kernel/trace/rv/monitors/= sco/sco.c index 4cff59220bfc7..66f4639d46ac4 100644 --- a/kernel/trace/rv/monitors/sco/sco.c +++ b/kernel/trace/rv/monitors/sco/sco.c @@ -71,8 +71,7 @@ static struct rv_monitor rv_sco =3D { =20 static int __init register_sco(void) { - rv_register_monitor(&rv_sco, &rv_sched); - return 0; + return rv_register_monitor(&rv_sco, &rv_sched); } =20 static void __exit unregister_sco(void) diff --git a/kernel/trace/rv/monitors/scpd/scpd.c b/kernel/trace/rv/monitor= s/scpd/scpd.c index cbdd6a5f8d7fd..299703cd72b06 100644 --- a/kernel/trace/rv/monitors/scpd/scpd.c +++ b/kernel/trace/rv/monitors/scpd/scpd.c @@ -79,8 +79,7 @@ static struct rv_monitor rv_scpd =3D { =20 static int __init register_scpd(void) { - rv_register_monitor(&rv_scpd, &rv_sched); - return 0; + return rv_register_monitor(&rv_scpd, &rv_sched); } =20 static void __exit unregister_scpd(void) diff --git a/kernel/trace/rv/monitors/sncid/sncid.c b/kernel/trace/rv/monit= ors/sncid/sncid.c index f5037cd6214c2..3e1ee715a0fbf 100644 --- a/kernel/trace/rv/monitors/sncid/sncid.c +++ b/kernel/trace/rv/monitors/sncid/sncid.c @@ -79,8 +79,7 @@ static struct rv_monitor rv_sncid =3D { =20 static int __init register_sncid(void) { - rv_register_monitor(&rv_sncid, &rv_sched); - return 0; + return rv_register_monitor(&rv_sncid, &rv_sched); } =20 static void __exit unregister_sncid(void) diff --git a/kernel/trace/rv/monitors/snep/snep.c b/kernel/trace/rv/monitor= s/snep/snep.c index 0076ba6d7ea44..2adc3108d60c9 100644 --- a/kernel/trace/rv/monitors/snep/snep.c +++ b/kernel/trace/rv/monitors/snep/snep.c @@ -79,8 +79,7 @@ static struct rv_monitor rv_snep =3D { =20 static int __init register_snep(void) { - rv_register_monitor(&rv_snep, &rv_sched); - return 0; + return rv_register_monitor(&rv_snep, &rv_sched); } =20 static void __exit unregister_snep(void) diff --git a/kernel/trace/rv/monitors/snroc/snroc.c b/kernel/trace/rv/monit= ors/snroc/snroc.c index bb1f60d552960..540e686e699f4 100644 --- a/kernel/trace/rv/monitors/snroc/snroc.c +++ b/kernel/trace/rv/monitors/snroc/snroc.c @@ -68,8 +68,7 @@ static struct rv_monitor rv_snroc =3D { =20 static int __init register_snroc(void) { - rv_register_monitor(&rv_snroc, &rv_sched); - return 0; + return rv_register_monitor(&rv_snroc, &rv_sched); } =20 static void __exit unregister_snroc(void) diff --git a/kernel/trace/rv/monitors/tss/tss.c b/kernel/trace/rv/monitors/= tss/tss.c index 542787e6524fc..0452fcd9edcfe 100644 --- a/kernel/trace/rv/monitors/tss/tss.c +++ b/kernel/trace/rv/monitors/tss/tss.c @@ -74,8 +74,7 @@ static struct rv_monitor rv_tss =3D { =20 static int __init register_tss(void) { - rv_register_monitor(&rv_tss, &rv_sched); - return 0; + return rv_register_monitor(&rv_tss, &rv_sched); } =20 static void __exit unregister_tss(void) diff --git a/kernel/trace/rv/monitors/wip/wip.c b/kernel/trace/rv/monitors/= wip/wip.c index ed758fec8608f..4b4e99615a11f 100644 --- a/kernel/trace/rv/monitors/wip/wip.c +++ b/kernel/trace/rv/monitors/wip/wip.c @@ -71,8 +71,7 @@ static struct rv_monitor rv_wip =3D { =20 static int __init register_wip(void) { - rv_register_monitor(&rv_wip, NULL); - return 0; + return rv_register_monitor(&rv_wip, NULL); } =20 static void __exit unregister_wip(void) diff --git a/kernel/trace/rv/monitors/wwnr/wwnr.c b/kernel/trace/rv/monitor= s/wwnr/wwnr.c index 172f31c4b0f34..4145bea2729e1 100644 --- a/kernel/trace/rv/monitors/wwnr/wwnr.c +++ b/kernel/trace/rv/monitors/wwnr/wwnr.c @@ -70,8 +70,7 @@ static struct rv_monitor rv_wwnr =3D { =20 static int __init register_wwnr(void) { - rv_register_monitor(&rv_wwnr, NULL); - return 0; + return rv_register_monitor(&rv_wwnr, NULL); } =20 static void __exit unregister_wwnr(void) --=20 2.50.1 From nobody Sun Dec 14 02:06:09 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 889AD26F45D for ; Tue, 15 Jul 2025 07:15:35 +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=1752563739; cv=none; b=eQSO/Q3nEqF9mjqvuS46a6PP5yvKsfC6gYkcfK1Eg1lNQxAHB3p4+gijjEfPbIVhYnOOkxJ/0QIBsc4HZHNArT4L2iBFIf0EkN4a2iLvAmaUhMtRIKeCBTpbkZ4Im52pJw8jrLJPswzV8bz6WCuFvw/vl61r2Tqv4hT36zXIuJo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563739; c=relaxed/simple; bh=1l3dcDypyrKmoPQKwcK/DMrnBoa1g3lrcv7qEEb7ExI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=s+AGG6I1X3pWNfVpho23rfFL+NjL4mrD3MoyKfiFKzjbEWdWSiwGsJegH6/FB66pEs698Nnjtpc57WT0BcSMtFiuFPlk/CxXo0vNXFRw2yvQrO/Dz77g5I3SV6Ej2qdCDX3uq1xwF4J/g99owP+KHiLSQCpiBDHyUMaZZ0b/i5Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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=f4PJayDK; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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="f4PJayDK" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1752563734; 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=tq0iz6EsNc/eyxotjjQquHddgrQ4AnaAEv2Kj7c+I+I=; b=f4PJayDKX/yicWwK8EkGkRC2+yB2BJ/wrZ7pComS5DXb7DCDjSoot5s3OAQ3d9Fyz1VDq2 3x+kUZZ8EXgH17RHN1piKc1/oC4/iO9nqjnreUSASXfJkRKO4q7/VWLXR9qluEMW3aiXAo 8DmFLGLIrxv9PrRgjMto1dsYEbu35BY= Received: from mx-prod-mc-04.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-538-N-2bu82gOeaxVtoAO1BE7g-1; Tue, 15 Jul 2025 03:15:30 -0400 X-MC-Unique: N-2bu82gOeaxVtoAO1BE7g-1 X-Mimecast-MFC-AGG-ID: N-2bu82gOeaxVtoAO1BE7g_1752563729 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (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-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 9E1E819560A2; Tue, 15 Jul 2025 07:15:29 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.45.224.115]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 2EA32180035E; Tue, 15 Jul 2025 07:15:24 +0000 (UTC) From: Gabriele Monaco To: linux-kernel@vger.kernel.org, Steven Rostedt , Masami Hiramatsu , linux-trace-kernel@vger.kernel.org Cc: Gabriele Monaco , Ingo Molnar , Peter Zijlstra , Nam Cao , Tomas Glozar , Juri Lelli , Clark Williams , John Kacur Subject: [PATCH v3 06/17] rv: Use strings in da monitors tracepoints Date: Tue, 15 Jul 2025 09:14:23 +0200 Message-ID: <20250715071434.22508-7-gmonaco@redhat.com> In-Reply-To: <20250715071434.22508-1-gmonaco@redhat.com> References: <20250715071434.22508-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.4.1 on 10.30.177.111 Content-Type: text/plain; charset="utf-8" Using DA monitors tracepoints with KASAN enabled triggers the following warning: BUG: KASAN: global-out-of-bounds in do_trace_event_raw_event_event_da_moni= tor+0xd6/0x1a0 Read of size 32 at addr ffffffffaada8980 by task ... Call Trace: [...] do_trace_event_raw_event_event_da_monitor+0xd6/0x1a0 ? __pfx_do_trace_event_raw_event_event_da_monitor+0x10/0x10 ? trace_event_sncid+0x83/0x200 trace_event_sncid+0x163/0x200 [...] The buggy address belongs to the variable: automaton_snep+0x4e0/0x5e0 This is caused by the tracepoints reading 32 bits __array instead of __string from the automata definition. Such strings are literals and reading 32 bytes ends up in out of bound memory accesses (e.g. the next automaton's data in this case). The error is harmless as, while printing the string, we stop at the null terminator, but it should still be fixed. Use the __string facilities while defining the tracepoints to avoid reading out of bound memory. Fixes: 792575348ff7 ("rv/include: Add deterministic automata monitor defini= tion via C macros") Signed-off-by: Gabriele Monaco Reviewed-by: Nam Cao --- kernel/trace/rv/rv_trace.h | 76 +++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/kernel/trace/rv/rv_trace.h b/kernel/trace/rv/rv_trace.h index 17ba07329b670..d38e0d3abdfde 100644 --- a/kernel/trace/rv/rv_trace.h +++ b/kernel/trace/rv/rv_trace.h @@ -16,23 +16,23 @@ DECLARE_EVENT_CLASS(event_da_monitor, TP_ARGS(state, event, next_state, final_state), =20 TP_STRUCT__entry( - __array( char, state, MAX_DA_NAME_LEN ) - __array( char, event, MAX_DA_NAME_LEN ) - __array( char, next_state, MAX_DA_NAME_LEN ) - __field( bool, final_state ) + __string( state, state ) + __string( event, event ) + __string( next_state, next_state ) + __field( bool, final_state ) ), =20 TP_fast_assign( - memcpy(__entry->state, state, MAX_DA_NAME_LEN); - memcpy(__entry->event, event, MAX_DA_NAME_LEN); - memcpy(__entry->next_state, next_state, MAX_DA_NAME_LEN); - __entry->final_state =3D final_state; + __assign_str(state); + __assign_str(event); + __assign_str(next_state); + __entry->final_state =3D final_state; ), =20 TP_printk("%s x %s -> %s%s", - __entry->state, - __entry->event, - __entry->next_state, + __get_str(state), + __get_str(event), + __get_str(next_state), __entry->final_state ? " (final)" : "") ); =20 @@ -43,18 +43,18 @@ DECLARE_EVENT_CLASS(error_da_monitor, TP_ARGS(state, event), =20 TP_STRUCT__entry( - __array( char, state, MAX_DA_NAME_LEN ) - __array( char, event, MAX_DA_NAME_LEN ) + __string( state, state ) + __string( event, event ) ), =20 TP_fast_assign( - memcpy(__entry->state, state, MAX_DA_NAME_LEN); - memcpy(__entry->event, event, MAX_DA_NAME_LEN); + __assign_str(state); + __assign_str(event); ), =20 TP_printk("event %s not expected in the state %s", - __entry->event, - __entry->state) + __get_str(event), + __get_str(state)) ); =20 #include @@ -75,26 +75,26 @@ DECLARE_EVENT_CLASS(event_da_monitor_id, TP_ARGS(id, state, event, next_state, final_state), =20 TP_STRUCT__entry( - __field( int, id ) - __array( char, state, MAX_DA_NAME_LEN ) - __array( char, event, MAX_DA_NAME_LEN ) - __array( char, next_state, MAX_DA_NAME_LEN ) - __field( bool, final_state ) + __field( int, id ) + __string( state, state ) + __string( event, event ) + __string( next_state, next_state ) + __field( bool, final_state ) ), =20 TP_fast_assign( - memcpy(__entry->state, state, MAX_DA_NAME_LEN); - memcpy(__entry->event, event, MAX_DA_NAME_LEN); - memcpy(__entry->next_state, next_state, MAX_DA_NAME_LEN); - __entry->id =3D id; - __entry->final_state =3D final_state; + __assign_str(state); + __assign_str(event); + __assign_str(next_state); + __entry->id =3D id; + __entry->final_state =3D final_state; ), =20 TP_printk("%d: %s x %s -> %s%s", __entry->id, - __entry->state, - __entry->event, - __entry->next_state, + __get_str(state), + __get_str(event), + __get_str(next_state), __entry->final_state ? " (final)" : "") ); =20 @@ -105,21 +105,21 @@ DECLARE_EVENT_CLASS(error_da_monitor_id, TP_ARGS(id, state, event), =20 TP_STRUCT__entry( - __field( int, id ) - __array( char, state, MAX_DA_NAME_LEN ) - __array( char, event, MAX_DA_NAME_LEN ) + __field( int, id ) + __string( state, state ) + __string( event, event ) ), =20 TP_fast_assign( - memcpy(__entry->state, state, MAX_DA_NAME_LEN); - memcpy(__entry->event, event, MAX_DA_NAME_LEN); - __entry->id =3D id; + __assign_str(state); + __assign_str(event); + __entry->id =3D id; ), =20 TP_printk("%d: event %s not expected in the state %s", __entry->id, - __entry->event, - __entry->state) + __get_str(event), + __get_str(state)) ); =20 #include --=20 2.50.1 From nobody Sun Dec 14 02:06:09 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 7F0F4272800 for ; Tue, 15 Jul 2025 07:15:42 +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=1752563744; cv=none; b=LAg5TBTVK20q6TqZO24wYgQKqB1wQct89xA94EnqisszPO9JsqQRBkubUid6WhFXjTa0s+B/U2oQMBgwt+PzbkncIlEgv5kcil+//txCcemihfamHH9Y/TdDvWRpI8tWZLnN/Xsb0gXvqBG7PaiFpKt3KtxNxjeQXa1EeXDD6Wo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563744; c=relaxed/simple; bh=SUx2iyawF2HdWYKA/0JO4rOajNFucjnKE5aUN6ggh04=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gaQ4fx889ArnJKjMyrHCdRIMp7euGbbwiZWGB64Li6S030UR92OZf91vMW2bqVge1W5q1jlD/hXOXEPy3qRmyKpIW90oFWZdqywKoEBO3MUK0R6gWejAMFqSshtxTSEugl/tliN8vjjYVpt8Fvpvg9dn7l22gpJPcexsXmBKdLI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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=h6TbYrtT; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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="h6TbYrtT" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1752563741; 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=LKWt6w3VXsi30diFBv6tCLC7Y1FPhJZJvvi5v9FWQ5c=; b=h6TbYrtTjJRPQeO5WdjJGBiH3LDI8lldCFZptZyMO8CS68A9fIpiep+Gs42DQ4MKNB7MJB AdzcrlFAFxO34a16Lu1yWgm3Vn0rc0gjxfFFV9ZHPbOCbyDjFkIkdJcH6nrfCGNqRNQcdz rILSfmUjLx2XB8tt+7pIpOu6YOm8ZiU= Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-112-inW1JskwPt-ti5JcGtggDw-1; Tue, 15 Jul 2025 03:15:36 -0400 X-MC-Unique: inW1JskwPt-ti5JcGtggDw-1 X-Mimecast-MFC-AGG-ID: inW1JskwPt-ti5JcGtggDw_1752563735 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (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-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id AF093195608F; Tue, 15 Jul 2025 07:15:35 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.45.224.115]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 3B78218046C6; Tue, 15 Jul 2025 07:15:30 +0000 (UTC) From: Gabriele Monaco To: linux-kernel@vger.kernel.org, Steven Rostedt , Masami Hiramatsu , Gabriele Monaco , linux-trace-kernel@vger.kernel.org Cc: Ingo Molnar , Peter Zijlstra , Nam Cao , Tomas Glozar , Juri Lelli , Clark Williams , John Kacur Subject: [PATCH v3 07/17] rv: Adjust monitor dependencies Date: Tue, 15 Jul 2025 09:14:24 +0200 Message-ID: <20250715071434.22508-8-gmonaco@redhat.com> In-Reply-To: <20250715071434.22508-1-gmonaco@redhat.com> References: <20250715071434.22508-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.4.1 on 10.30.177.111 Content-Type: text/plain; charset="utf-8" RV monitors relying on the preemptirqs tracepoints are set as dependent on PREEMPT_TRACER and IRQSOFF_TRACER. In fact, those configurations do enable the tracepoints but are not the minimal configurations enabling them, which are TRACE_PREEMPT_TOGGLE and TRACE_IRQFLAGS (not selectable manually). Set TRACE_PREEMPT_TOGGLE and TRACE_IRQFLAGS as dependencies for monitors. Fixes: fbe6c09b7eb4 ("rv: Add scpd, snep and sncid per-cpu monitors") Signed-off-by: Gabriele Monaco Acked-by: Nam Cao --- kernel/trace/rv/monitors/scpd/Kconfig | 2 +- kernel/trace/rv/monitors/sncid/Kconfig | 2 +- kernel/trace/rv/monitors/snep/Kconfig | 2 +- kernel/trace/rv/monitors/wip/Kconfig | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/kernel/trace/rv/monitors/scpd/Kconfig b/kernel/trace/rv/monito= rs/scpd/Kconfig index b9114fbf680f9..682d0416188b3 100644 --- a/kernel/trace/rv/monitors/scpd/Kconfig +++ b/kernel/trace/rv/monitors/scpd/Kconfig @@ -2,7 +2,7 @@ # config RV_MON_SCPD depends on RV - depends on PREEMPT_TRACER + depends on TRACE_PREEMPT_TOGGLE depends on RV_MON_SCHED default y select DA_MON_EVENTS_IMPLICIT diff --git a/kernel/trace/rv/monitors/sncid/Kconfig b/kernel/trace/rv/monit= ors/sncid/Kconfig index 76bcfef4fd103..3a5639feaaaf6 100644 --- a/kernel/trace/rv/monitors/sncid/Kconfig +++ b/kernel/trace/rv/monitors/sncid/Kconfig @@ -2,7 +2,7 @@ # config RV_MON_SNCID depends on RV - depends on IRQSOFF_TRACER + depends on TRACE_IRQFLAGS depends on RV_MON_SCHED default y select DA_MON_EVENTS_IMPLICIT diff --git a/kernel/trace/rv/monitors/snep/Kconfig b/kernel/trace/rv/monito= rs/snep/Kconfig index 77527f9712325..7dd54f434ff75 100644 --- a/kernel/trace/rv/monitors/snep/Kconfig +++ b/kernel/trace/rv/monitors/snep/Kconfig @@ -2,7 +2,7 @@ # config RV_MON_SNEP depends on RV - depends on PREEMPT_TRACER + depends on TRACE_PREEMPT_TOGGLE depends on RV_MON_SCHED default y select DA_MON_EVENTS_IMPLICIT diff --git a/kernel/trace/rv/monitors/wip/Kconfig b/kernel/trace/rv/monitor= s/wip/Kconfig index e464b9294865b..87a26195792b4 100644 --- a/kernel/trace/rv/monitors/wip/Kconfig +++ b/kernel/trace/rv/monitors/wip/Kconfig @@ -2,7 +2,7 @@ # config RV_MON_WIP depends on RV - depends on PREEMPT_TRACER + depends on TRACE_PREEMPT_TOGGLE select DA_MON_EVENTS_IMPLICIT bool "wip monitor" help --=20 2.50.1 From nobody Sun Dec 14 02:06:09 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.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 E091226FA6A for ; Tue, 15 Jul 2025 07:15:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563751; cv=none; b=nj18lWS1hG3K5Ead1GAg/CoIRv/RUp1PWyKTEho9bbLi6KBOZJRRlzeesnix/XXH4WxGSctj8D117URdkMc6GkhWGgMunMq7Qjm82KmUxEZaIrwBrxThsBeea/ajBfOeSdr+UgyKyUvzzOztlHkGsatsYXr78kQoygK8BQK4Lmg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563751; c=relaxed/simple; bh=J2yEY9Nc8Fu2hSChIEPzOyAPv2+jUKzd7jotRyGXpm8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GUE3dYKdbpwfrtnD3PL1/YTFMZYT4WMVOUZMDrNk7Cv0U8/8c+iyySbtI52E+9cyTaPW9LhW/3UXghFHX6k3lWsbwDYkKsdK0xScTcKulilvsfVLgHK1Qt+ANefCR4gq7ZZjdfcsZWtl3CZPp+KN96Cp74DBF3Oqcq08tKq2ZcY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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=Cwz0bh4u; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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="Cwz0bh4u" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1752563747; 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=VZ6+HKyJlDZw/hLSrbNr0osMJhJyvawRkvD8/BLpv+c=; b=Cwz0bh4uASnMUPfQRq4TQSf7CB/GHghvA7xDJy2caV0vV+1L0oI3SHU2E0Ld7trynKAoXE y55vzKg1u6MHSqUGZMZy9EFFiRNfSskljP0z6Gz/dUPho2HHUnMoAZKccxTmukYj2rS3RS wWMXzKJh594jY2ksvdbE7SctSIdy26o= Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-675-HZEyLyZsPo2Adgs2zFd68Q-1; Tue, 15 Jul 2025 03:15:43 -0400 X-MC-Unique: HZEyLyZsPo2Adgs2zFd68Q-1 X-Mimecast-MFC-AGG-ID: HZEyLyZsPo2Adgs2zFd68Q_1752563742 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (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-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 6064C195608C; Tue, 15 Jul 2025 07:15:42 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.45.224.115]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id CF19D180035E; Tue, 15 Jul 2025 07:15:36 +0000 (UTC) From: Gabriele Monaco To: linux-kernel@vger.kernel.org, Steven Rostedt , Masami Hiramatsu , linux-trace-kernel@vger.kernel.org Cc: Gabriele Monaco , Ingo Molnar , Peter Zijlstra , Nam Cao , Tomas Glozar , Juri Lelli , Clark Williams , John Kacur Subject: [PATCH v3 08/17] verification/rvgen: Organise Kconfig entries for nested monitors Date: Tue, 15 Jul 2025 09:14:25 +0200 Message-ID: <20250715071434.22508-9-gmonaco@redhat.com> In-Reply-To: <20250715071434.22508-1-gmonaco@redhat.com> References: <20250715071434.22508-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.4.1 on 10.30.177.111 Content-Type: text/plain; charset="utf-8" The current behaviour of rvgen when running with the -a option is to append the necessary lines at the end of the configuration for Kconfig, Makefile and tracepoints. This is not always the desired behaviour in case of nested monitors: while tracepoints are not affected by nesting and the Makefile's only requirement is that the parent monitor is built before its children, in the Kconfig it is better to have children defined right after their parent, otherwise the result has wrong indentation: [*] foo_parent monitor [*] foo_child1 monitor [*] foo_child2 monitor [*] bar_parent monitor [*] bar_child1 monitor [*] bar_child2 monitor [*] foo_child3 monitor [*] foo_child4 monitor Adapt rvgen to look for a different marker for nested monitors in the Kconfig file and append the line right after the last sibling, instead of the last monitor. Also add the marker when creating a new parent monitor. Signed-off-by: Gabriele Monaco --- kernel/trace/rv/Kconfig | 5 +++++ tools/verification/rvgen/rvgen/container.py | 13 +++++++++++++ tools/verification/rvgen/rvgen/generator.py | 13 ++++++++----- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/kernel/trace/rv/Kconfig b/kernel/trace/rv/Kconfig index c11bf7e61ebf0..26017378f79b8 100644 --- a/kernel/trace/rv/Kconfig +++ b/kernel/trace/rv/Kconfig @@ -43,6 +43,7 @@ config RV_PER_TASK_MONITORS =20 source "kernel/trace/rv/monitors/wip/Kconfig" 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" @@ -50,9 +51,13 @@ source "kernel/trace/rv/monitors/snroc/Kconfig" source "kernel/trace/rv/monitors/scpd/Kconfig" source "kernel/trace/rv/monitors/snep/Kconfig" source "kernel/trace/rv/monitors/sncid/Kconfig" +# Add new sched monitors here + source "kernel/trace/rv/monitors/rtapp/Kconfig" source "kernel/trace/rv/monitors/pagefault/Kconfig" source "kernel/trace/rv/monitors/sleep/Kconfig" +# Add new rtapp monitors here + # Add new monitors here =20 config RV_REACTORS diff --git a/tools/verification/rvgen/rvgen/container.py b/tools/verificati= on/rvgen/rvgen/container.py index 47d8ab2ad3ec4..fee493f89fde6 100644 --- a/tools/verification/rvgen/rvgen/container.py +++ b/tools/verification/rvgen/rvgen/container.py @@ -20,3 +20,16 @@ class Container(generator.RVGenerator): main_h =3D self.main_h main_h =3D main_h.replace("%%MODEL_NAME%%", self.name) return main_h + + def fill_kconfig_tooltip(self): + """Override to produce a marker for this container in the Kconfig"= "" + container_marker =3D f"# Add new {self.name} monitors here\n" + if self.auto_patch: + self._patch_file("Kconfig", + "# Add new monitors here", "") + result =3D super().fill_kconfig_tooltip() + if self.auto_patch: + self._patch_file("Kconfig", + "# Add new monitors here", container_marker) + return result + return result + container_marker diff --git a/tools/verification/rvgen/rvgen/generator.py b/tools/verificati= on/rvgen/rvgen/generator.py index 19d0078a38032..ac97c4505ff00 100644 --- a/tools/verification/rvgen/rvgen/generator.py +++ b/tools/verification/rvgen/rvgen/generator.py @@ -137,7 +137,8 @@ class RVGenerator: kconfig =3D kconfig.replace("%%MONITOR_DEPS%%", monitor_deps) return kconfig =20 - def __patch_file(self, file, marker, line): + def _patch_file(self, file, marker, line): + assert(self.auto_patch) file_to_patch =3D os.path.join(self.rv_dir, file) content =3D self._read_file(file_to_patch) content =3D content.replace(marker, line + "\n" + marker) @@ -146,7 +147,7 @@ class RVGenerator: def fill_tracepoint_tooltip(self): monitor_class_type =3D self.fill_monitor_class_type() if self.auto_patch: - self.__patch_file("rv_trace.h", + self._patch_file("rv_trace.h", "// Add new monitors based on CONFIG_%s here" = % monitor_class_type, "#include " % (self.na= me, self.name)) return " - Patching %s/rv_trace.h, double check the result" %= self.rv_dir @@ -158,8 +159,10 @@ Add this line where other tracepoints are included and= %s is defined: =20 def fill_kconfig_tooltip(self): if self.auto_patch: - self.__patch_file("Kconfig", - "# Add new monitors here", + # monitors with a container should stay together in the Kconfig + self._patch_file("Kconfig", + "# Add new %smonitors here" % + (self.parent + " " if self.parent else ""), "source \"kernel/trace/rv/monitors/%s/Kconfig\= "" % (self.name)) return " - Patching %s/Kconfig, double check the result" % se= lf.rv_dir =20 @@ -172,7 +175,7 @@ source \"kernel/trace/rv/monitors/%s/Kconfig\" name =3D self.name name_up =3D name.upper() if self.auto_patch: - self.__patch_file("Makefile", + self._patch_file("Makefile", "# Add new monitors here", "obj-$(CONFIG_RV_MON_%s) +=3D monitors/%s/%s.o= " % (name_up, name, name)) return " - Patching %s/Makefile, double check the result" % s= elf.rv_dir --=20 2.50.1 From nobody Sun Dec 14 02:06:09 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.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 5BD57274B31 for ; Tue, 15 Jul 2025 07:15:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563755; cv=none; b=iTdQE7TJhZ88YQ5BCIj7WbeiZdTeR0GDEN0dDsRA8w6YgduHUxWbt+AaT/p9fv6YSrRrLl+dRiHcBozLmN+UD+ByPNoiolFwsfZPar4eIJayoJqLwPi+vSfFTc1y269Zm2YfnPmgyOpvJOknsdXO0kiOV7cO6DJoioRgeS2p8X8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563755; c=relaxed/simple; bh=EB6OavY8GOQrwmyL4t23FzAOwDBXpgnmSBqsL/ObkbU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kP4K5IFVf/isDrdUBYvBTpBCh0UfWcIKmdmRL/R6Z1n2rfNJ+B+T+gx3e7HF9kv1/Vb3ay9LKAGWdWLKzqalQ3uHmh8v0ZmNfdJLda9ycNH7bnXaU/RIIe24rrRhTcMBHaphKIhnq9/f98eco8Xy5dGIeq8RTGS0xNKDZnbBU7k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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=Kxqg9qSi; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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="Kxqg9qSi" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1752563753; 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=oyzwPIViG0moxxldrjogzJHEpjbWV9q0dAQxkvYlKNc=; b=Kxqg9qSiwjZYc+q3QtAAxua4yn1H900tG+R4HYx+bHvIkKFFcqTY7liAq2onYyuWAcz1zh kbqLS4aIzIYEObhqSOMQEgN3d48MOaHu5l9I4suan6XediuWbDRjY6Cwv+VMc+G/zvZVD+ Xo3vXsXjE6N/Dl0rjYylP4SIt2ULOfo= 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-35-6upA8k0AP_2QZhPO-ZIu8A-1; Tue, 15 Jul 2025 03:15:49 -0400 X-MC-Unique: 6upA8k0AP_2QZhPO-ZIu8A-1 X-Mimecast-MFC-AGG-ID: 6upA8k0AP_2QZhPO-ZIu8A_1752563748 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (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 50E9E1800366; Tue, 15 Jul 2025 07:15:48 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.45.224.115]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 5FA4D180045B; Tue, 15 Jul 2025 07:15:43 +0000 (UTC) From: Gabriele Monaco To: linux-kernel@vger.kernel.org, Steven Rostedt , linux-trace-kernel@vger.kernel.org Cc: Nam Cao , Gabriele Monaco , Ingo Molnar , Peter Zijlstra , Tomas Glozar , Juri Lelli , Clark Williams , John Kacur Subject: [PATCH v3 09/17] tools/dot2c: Fix generated files going over 100 column limit Date: Tue, 15 Jul 2025 09:14:26 +0200 Message-ID: <20250715071434.22508-10-gmonaco@redhat.com> In-Reply-To: <20250715071434.22508-1-gmonaco@redhat.com> References: <20250715071434.22508-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.4.1 on 10.30.177.111 Content-Type: text/plain; charset="utf-8" From: Nam Cao The dot2c.py script generates all states in a single line. This breaks the 100 column limit when the state machines are non-trivial. Change dot2c.py to generate the states in separate lines in case the generated line is going to be too long. Co-authored-by: Gabriele Monaco Signed-off-by: Nam Cao Signed-off-by: Gabriele Monaco --- tools/verification/rvgen/rvgen/dot2c.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/tools/verification/rvgen/rvgen/dot2c.py b/tools/verification/r= vgen/rvgen/dot2c.py index 6009caf568d92..5216d98ae21c8 100644 --- a/tools/verification/rvgen/rvgen/dot2c.py +++ b/tools/verification/rvgen/rvgen/dot2c.py @@ -152,28 +152,29 @@ class Dot2c(Automata): max_state_name =3D max(self.states, key =3D len).__len__() return max(max_state_name, self.invalid_state_str.__len__()) =20 - def __get_state_string_length(self): - maxlen =3D self.__get_max_strlen_of_states() + self.enum_suffix.__= len__() - return "%" + str(maxlen) + "s" - def get_aut_init_function(self): nr_states =3D self.states.__len__() nr_events =3D self.events.__len__() buff =3D [] =20 - strformat =3D self.__get_state_string_length() - + maxlen =3D self.__get_max_strlen_of_states() + len(self.enum_suffi= x) + # account for tabs and spaces/punctuation for each event + linetoolong =3D 16 + (maxlen + 3) * nr_events >=3D self.line_length for x in range(nr_states): - line =3D "\t\t{ " + line =3D "\t\t{\n" if linetoolong else "\t\t{ " for y in range(nr_events): next_state =3D self.function[x][y] if next_state !=3D self.invalid_state_str: next_state =3D self.function[x][y] + self.enum_suffix =20 + if linetoolong: + line +=3D "\t\t\t%s" % next_state + else: + line +=3D "%*s" % (maxlen, next_state) if y !=3D nr_events-1: - line =3D line + strformat % next_state + ", " + line +=3D ",\n" if linetoolong else ", " else: - line =3D line + strformat % next_state + " }," + line +=3D "\n\t\t}," if linetoolong else " }," buff.append(line) =20 return self.__buff_to_string(buff) --=20 2.50.1 From nobody Sun Dec 14 02:06:09 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.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 CDCE22550CF for ; Tue, 15 Jul 2025 07:15:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563761; cv=none; b=mpIIysDGxgzs4uzCc3jPq4LU+lUm6/n36RRsi7NkoVcNhhX+PrvWWONKxrpsm0zrZiOgV8WkushGi9Y/3/K1Tthz9caI5WVW/GtRDK3tN2RB1CsGpZd44LiAqWr0xpdn3erJgoCOeJCI++f0aOHZJ9QlApZzmPRMKyH5R9DVVZo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563761; c=relaxed/simple; bh=oxJC/T7bkz4/JCpLaCRHxfdvM7WuQxVIXdiukWYNGQU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rFKTCPtjuqtzoDPUZoT4Y12jg1nRADWWvCj9MKfzh1j2MyBGCxZcpwUyCxix1kROV84uZxVD1S/4mjyuQmMidq4t70MgU2+KnvgZOYw7i7ifmJOpU2d+pYrY8UXIP00YLjh3aFpg3d3gge6Knmu8FwMrzpu7YNt3VXiGbqwwhUE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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=Z0F2F+8z; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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="Z0F2F+8z" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1752563759; 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=FSD+jH23zaW3frerppDPrVwREbeKazWgfVwxtrGntKo=; b=Z0F2F+8zYScXm9nL+TQxTCuKQWfoXak0uMaqMolfc3y5GOyYd3bFI3VOu8FPkAUzHdfDqb V5gl323F9S9yDBxQTgpYfoe+CJ3HwNoGxZuNJ4sZrRFXM7W6GgNFwkgZSLLvSL9++6BiGs cpSmCR0KkCCiSvY8AUHnrdhvORxGD2A= Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-611-jVO5ahnsOGWc5SYmW-ER4Q-1; Tue, 15 Jul 2025 03:15:55 -0400 X-MC-Unique: jVO5ahnsOGWc5SYmW-ER4Q-1 X-Mimecast-MFC-AGG-ID: jVO5ahnsOGWc5SYmW-ER4Q_1752563754 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (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-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 570811956080; Tue, 15 Jul 2025 07:15:54 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.45.224.115]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 69E8E180035E; Tue, 15 Jul 2025 07:15:49 +0000 (UTC) From: Gabriele Monaco To: linux-kernel@vger.kernel.org, Steven Rostedt , Masami Hiramatsu , linux-trace-kernel@vger.kernel.org Cc: Gabriele Monaco , Ingo Molnar , Peter Zijlstra , Nam Cao , Tomas Glozar , Juri Lelli , Clark Williams , John Kacur Subject: [PATCH v3 10/17] rv: Fix generated files going over 100 column limit Date: Tue, 15 Jul 2025 09:14:27 +0200 Message-ID: <20250715071434.22508-11-gmonaco@redhat.com> In-Reply-To: <20250715071434.22508-1-gmonaco@redhat.com> References: <20250715071434.22508-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.4.1 on 10.30.177.111 Content-Type: text/plain; charset="utf-8" The dot2c.py script generates all states in a single line. This breaks the 100 column limit when the state machines are non-trivial. Recent changes allow it to print states over multiple lines if the resulting line would have been too long. Adapt existing monitors with line length over the limit. Signed-off-by: Gabriele Monaco --- kernel/trace/rv/monitors/sco/sco.h | 12 ++++++++++-- kernel/trace/rv/monitors/snep/snep.h | 14 ++++++++++++-- kernel/trace/rv/monitors/snroc/snroc.h | 12 ++++++++++-- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/kernel/trace/rv/monitors/sco/sco.h b/kernel/trace/rv/monitors/= sco/sco.h index 7a4c1f2d5ca1c..83ca9a03331af 100644 --- a/kernel/trace/rv/monitors/sco/sco.h +++ b/kernel/trace/rv/monitors/sco/sco.h @@ -39,8 +39,16 @@ static const struct automaton_sco automaton_sco =3D { "schedule_exit" }, .function =3D { - { thread_context_sco, scheduling_context_sco, INVALID_STATE= }, - { INVALID_STATE, INVALID_STATE, thread_context_sco= }, + { + thread_context_sco, + scheduling_context_sco, + INVALID_STATE + }, + { + INVALID_STATE, + INVALID_STATE, + thread_context_sco + }, }, .initial_state =3D thread_context_sco, .final_states =3D { 1, 0 }, diff --git a/kernel/trace/rv/monitors/snep/snep.h b/kernel/trace/rv/monitor= s/snep/snep.h index 6d16b9ad931e1..4cd9abb77b7b2 100644 --- a/kernel/trace/rv/monitors/snep/snep.h +++ b/kernel/trace/rv/monitors/snep/snep.h @@ -41,8 +41,18 @@ static const struct automaton_snep automaton_snep =3D { "schedule_exit" }, .function =3D { - { non_scheduling_context_snep, non_scheduling_context_snep, scheduling_c= ontex_snep, INVALID_STATE }, - { INVALID_STATE, INVALID_STATE, INV= ALID_STATE, non_scheduling_context_snep }, + { + non_scheduling_context_snep, + non_scheduling_context_snep, + scheduling_contex_snep, + INVALID_STATE + }, + { + INVALID_STATE, + INVALID_STATE, + INVALID_STATE, + non_scheduling_context_snep + }, }, .initial_state =3D non_scheduling_context_snep, .final_states =3D { 1, 0 }, diff --git a/kernel/trace/rv/monitors/snroc/snroc.h b/kernel/trace/rv/monit= ors/snroc/snroc.h index c3650a2b1b107..be46f7b9ebb87 100644 --- a/kernel/trace/rv/monitors/snroc/snroc.h +++ b/kernel/trace/rv/monitors/snroc/snroc.h @@ -39,8 +39,16 @@ static const struct automaton_snroc automaton_snroc =3D { "sched_switch_out" }, .function =3D { - { INVALID_STATE, own_context_snroc, INVALID_STATE }, - { own_context_snroc, INVALID_STATE, other_context_snroc }, + { + 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 }, --=20 2.50.1 From nobody Sun Dec 14 02:06:09 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.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 66F57275113 for ; Tue, 15 Jul 2025 07:16:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563767; cv=none; b=t57zDnL9ezN6oJ7c2Wd1vM5E7U/orxj2d1o7BV4IQcVPpbMR8EK8sZluZxf6X6u/dn5HxPlctTNc0ufXXfc8VqUgQolwAxCwZtv0PljF8mTKulGtcCZnhgI/BOC1C+QNybA9KK/nWOolv55/W8SOW3azThAUbP2+B2Rj70A9aTw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563767; c=relaxed/simple; bh=6eddJIGIkG6kl5t+zqjessEAIkSV8kX9BHdAZxTmHhc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WRH6JTt4jZlr/ZaOToiUaqNAH3R3Of1XHFK/RZLbgm0+PSy6cBw1HB/OUBysy+bt8XcjvpNvt+N5oIX9VVQ0opIOjWfsTkPXXg3mkppZMlmb5GfhTi+YehAUkcISjdA2xE6spZDqPW9uH0iB1/mS28CRZ5Q+HSpBr1Q7YdvVR00= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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=eW47MQVD; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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="eW47MQVD" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1752563764; 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=GxqbBNZ2eYKhjzALg6IaZYJYVYpWBPtCmkBv3LREctI=; b=eW47MQVDYKoIoE4kwdjwbKl6u1G61/1FNsGohres5RFFo7I/Qc73egtBooa4MDY4qNB81j aDN+FcHbCvINgX68GvIqDPQdQ2ozHq9aNnT4mMOroSzORg0VjDnKSxzAGHdWDDDmQrtPml JOiNt12hR2LSTln6kSuis7TtUBnysSU= 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-617-0ppDQvq9O8-iQTIu4Kjbuw-1; Tue, 15 Jul 2025 03:16:01 -0400 X-MC-Unique: 0ppDQvq9O8-iQTIu4Kjbuw-1 X-Mimecast-MFC-AGG-ID: 0ppDQvq9O8-iQTIu4Kjbuw_1752563760 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (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 DCDB418089B5; Tue, 15 Jul 2025 07:15:59 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.45.224.115]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 6C763180035E; Tue, 15 Jul 2025 07:15:55 +0000 (UTC) From: Gabriele Monaco To: linux-kernel@vger.kernel.org, Steven Rostedt , linux-trace-kernel@vger.kernel.org Cc: Gabriele Monaco , Ingo Molnar , Peter Zijlstra , Nam Cao , Tomas Glozar , Juri Lelli , Clark Williams , John Kacur Subject: [PATCH v3 11/17] rv: Retry when da monitor detects race conditions Date: Tue, 15 Jul 2025 09:14:28 +0200 Message-ID: <20250715071434.22508-12-gmonaco@redhat.com> In-Reply-To: <20250715071434.22508-1-gmonaco@redhat.com> References: <20250715071434.22508-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.4.1 on 10.30.177.111 Content-Type: text/plain; charset="utf-8" DA monitor can be accessed from multiple cores simultaneously, this is likely, for instance when dealing with per-task monitors reacting on events that do not always occur on the CPU where the task is running. This can cause race conditions where two events change the next state and we see inconsistent values. E.g.: [62] event_srs: 27: sleepable x sched_wakeup -> running (final) [63] event_srs: 27: sleepable x sched_set_state_sleepable -> sleepable [63] error_srs: 27: event sched_switch_suspend not expected in the state = running In this case the monitor fails because the event on CPU 62 wins against the one on CPU 63, although the correct state should have been sleepable, since the task get suspended. Detect if the current state was modified by using try_cmpxchg while storing the next value. If it was, try again reading the current state. After a maximum number of failed retries, react as if it was an error with invalid current state (we cannot determine it). Remove the functions da_monitor_curr_state() and da_monitor_set_state() as they only hide the underlying implementation in this case. Monitors where this type of condition can occur must be able to account for racing events in any possible order, as we cannot know the winner. Cc: Ingo Molnar Cc: Peter Zijlstra Signed-off-by: Gabriele Monaco --- include/linux/rv.h | 3 +- include/rv/da_monitor.h | 91 ++++++++++++++++++++++------------------- 2 files changed, 51 insertions(+), 43 deletions(-) diff --git a/include/linux/rv.h b/include/linux/rv.h index 97baf58d88b28..0250a04f4524c 100644 --- a/include/linux/rv.h +++ b/include/linux/rv.h @@ -7,7 +7,8 @@ #ifndef _LINUX_RV_H #define _LINUX_RV_H =20 -#define MAX_DA_NAME_LEN 32 +#define MAX_DA_NAME_LEN 32 +#define MAX_DA_RETRY_RACING_EVENTS 3 =20 #ifdef CONFIG_RV #include diff --git a/include/rv/da_monitor.h b/include/rv/da_monitor.h index ed3c34fe18d61..bd3096a3181f8 100644 --- a/include/rv/da_monitor.h +++ b/include/rv/da_monitor.h @@ -54,23 +54,6 @@ static inline void da_monitor_reset_##name(struct da_mon= itor *da_mon) \ da_mon->curr_state =3D model_get_initial_state_##name(); \ } \ \ -/* \ - * da_monitor_curr_state_##name - return the current state \ - */ \ -static inline type da_monitor_curr_state_##name(struct da_monitor *da_mon)= \ -{ \ - return da_mon->curr_state; \ -} \ - \ -/* \ - * da_monitor_set_state_##name - set the new current state \ - */ \ -static inline void \ -da_monitor_set_state_##name(struct da_monitor *da_mon, enum states_##name = state) \ -{ \ - da_mon->curr_state =3D state; \ -} \ - \ /* \ * da_monitor_start_##name - start monitoring \ * \ @@ -127,57 +110,72 @@ static inline bool da_monitor_handling_event_##name(s= truct da_monitor *da_mon) * Event handler for implicit monitors. Implicit monitor is the one which = the * handler does not need to specify which da_monitor to manipulate. Exampl= es * of implicit monitor are the per_cpu or the global ones. + * + * Retry, in case there is a race while getting and setting the next state + * return an invalid current state if we run out of retries. The monitor s= hould + * be able to handle various orders. */ #define DECLARE_DA_MON_MODEL_HANDLER_IMPLICIT(name, type) \ \ static inline bool \ da_event_##name(struct da_monitor *da_mon, enum events_##name event) \ { \ - type curr_state =3D da_monitor_curr_state_##name(da_mon); \ - type next_state =3D model_get_next_state_##name(curr_state, event); \ - \ - if (next_state !=3D INVALID_STATE) { \ - da_monitor_set_state_##name(da_mon, next_state); \ - \ - trace_event_##name(model_get_state_name_##name(curr_state), \ - model_get_event_name_##name(event), \ - model_get_state_name_##name(next_state), \ - model_is_final_state_##name(next_state)); \ - \ - return true; \ + enum states_##name curr_state, next_state; \ + \ + curr_state =3D READ_ONCE(da_mon->curr_state); \ + for (int i =3D 0; i < MAX_DA_RETRY_RACING_EVENTS; i++) { \ + next_state =3D model_get_next_state_##name(curr_state, event); \ + if (next_state =3D=3D INVALID_STATE) \ + goto out_react; \ + if (likely(try_cmpxchg(&da_mon->curr_state, &curr_state, next_state))) \ + goto out_success; \ } \ + /* Special invalid transition if we run out of retries. */ \ + curr_state =3D INVALID_STATE; \ \ +out_react: \ cond_react_##name(curr_state, event); \ \ trace_error_##name(model_get_state_name_##name(curr_state), \ model_get_event_name_##name(event)); \ \ return false; \ + \ +out_success: \ + trace_event_##name(model_get_state_name_##name(curr_state), \ + model_get_event_name_##name(event), \ + model_get_state_name_##name(next_state), \ + model_is_final_state_##name(next_state)); \ + \ + return true; \ } \ =20 /* * Event handler for per_task monitors. + * + * Retry, in case there is a race while getting and setting the next state + * return an invalid current state if we run out of retries. The monitor s= hould + * be able to handle various orders. */ #define DECLARE_DA_MON_MODEL_HANDLER_PER_TASK(name, type) \ \ static inline bool da_event_##name(struct da_monitor *da_mon, struct task_= struct *tsk, \ enum events_##name event) \ { \ - type curr_state =3D da_monitor_curr_state_##name(da_mon); \ - type next_state =3D model_get_next_state_##name(curr_state, event); \ - \ - if (next_state !=3D INVALID_STATE) { \ - da_monitor_set_state_##name(da_mon, next_state); \ - \ - trace_event_##name(tsk->pid, \ - model_get_state_name_##name(curr_state), \ - model_get_event_name_##name(event), \ - model_get_state_name_##name(next_state), \ - model_is_final_state_##name(next_state)); \ - \ - return true; \ + enum states_##name curr_state, next_state; \ + \ + curr_state =3D READ_ONCE(da_mon->curr_state); \ + for (int i =3D 0; i < MAX_DA_RETRY_RACING_EVENTS; i++) { \ + next_state =3D model_get_next_state_##name(curr_state, event); \ + if (next_state =3D=3D INVALID_STATE) \ + goto out_react; \ + if (likely(try_cmpxchg(&da_mon->curr_state, &curr_state, next_state))) \ + goto out_success; \ } \ + /* Special invalid transition if we run out of retries. */ \ + curr_state =3D INVALID_STATE; \ \ +out_react: \ cond_react_##name(curr_state, event); \ \ trace_error_##name(tsk->pid, \ @@ -185,6 +183,15 @@ static inline bool da_event_##name(struct da_monitor *= da_mon, struct task_struct model_get_event_name_##name(event)); \ \ return false; \ + \ +out_success: \ + trace_event_##name(tsk->pid, \ + model_get_state_name_##name(curr_state), \ + model_get_event_name_##name(event), \ + model_get_state_name_##name(next_state), \ + model_is_final_state_##name(next_state)); \ + \ + return true; \ } =20 /* --=20 2.50.1 From nobody Sun Dec 14 02:06:09 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.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 C425A27603A for ; Tue, 15 Jul 2025 07:16:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563772; cv=none; b=t+B1B7m6bH8MFrMcEe0ajDruwrVLt3HZavUvk5jTrMawFNNF+gq4WralHp3ExJLi3UJegLQo11RK4NyNTSGUV39ix1VE5QrbSybqOSsBjRtpXjzis47udRWjnuaebw7RBjQfN2epbRSjIo1eNHKIhL+3w1xAkPyl5knuRwZaEcE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563772; c=relaxed/simple; bh=wFdF7EpXBYFWK9Jbm8c0lN86C3/98hbYMMGEfzZbW9s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PoC84Ue35Wven58Fe4a1xCYN2aaxIcMoZNVU2xNC3IzFYgylS+ZYumY80D4oYk5o4he3bBOg3PbwOz/oSooK+e+bzuxxdSphk3FcSwcymS9ZyniX7xMSwoultClNijLCbmE84xcmjlWilUJ4g8BGi4n17J3k5pJzrehFf7QIE1w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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=fr0UuRKN; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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="fr0UuRKN" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1752563769; 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=PYlgmcKzwEhoS0a9BGFylsAetkBhqQKG1+nbvaKZxSA=; b=fr0UuRKNybfTGkUOYMjUnDXWZ1Bb6eoJkW6CYGhielbepk8a5TMfDooUAqo3ccTzffdR7E hMITZuPKrOZiz7bANg/3SB0Jqjy0Dv2aE59xy566dG3kKSWXx5MoW6W8AT9g6ZlY28Y3us xoVC/kkaT2MgvWwJE0p5E4xLssPtPo8= Received: from mx-prod-mc-06.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-641-MvhcTSVKNjKHJXiaq0bkJQ-1; Tue, 15 Jul 2025 03:16:08 -0400 X-MC-Unique: MvhcTSVKNjKHJXiaq0bkJQ-1 X-Mimecast-MFC-AGG-ID: MvhcTSVKNjKHJXiaq0bkJQ_1752563767 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (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-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id EA9C11801210; Tue, 15 Jul 2025 07:16:06 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.45.224.115]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id AF544180045B; Tue, 15 Jul 2025 07:16:01 +0000 (UTC) From: Gabriele Monaco To: linux-kernel@vger.kernel.org, Ingo Molnar , Peter Zijlstra , Steven Rostedt , Masami Hiramatsu , linux-trace-kernel@vger.kernel.org Cc: Gabriele Monaco , Nam Cao , Tomas Glozar , Juri Lelli , Clark Williams , John Kacur Subject: [PATCH v3 12/17] sched: Adapt sched tracepoints for RV task model Date: Tue, 15 Jul 2025 09:14:29 +0200 Message-ID: <20250715071434.22508-13-gmonaco@redhat.com> In-Reply-To: <20250715071434.22508-1-gmonaco@redhat.com> References: <20250715071434.22508-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.4.1 on 10.30.177.111 Content-Type: text/plain; charset="utf-8" Add the following tracepoints: * sched_set_need_resched(tsk, cpu, tif) Called when a task is set the need resched [lazy] flag * sched_switch_vain(preempt, tsk, tsk_state) Called when a task is selected again during __schedule i.e. prev =3D=3D next =3D=3D tsk : no real context switch Add new parameter to sched_set_state to identify whether the state change was due to an explicit call or a signal pending while scheduling. We now also trace from try_to_block_task in case a signal was pending and the task is set to runnable. Also adapt all monitors using sched_set_state to avoid breaking build. These tracepoints are useful to describe the Linux task model and are adapted from the patches by Daniel Bristot de Oliveira (https://bristot.me/linux-task-model/). Signed-off-by: Gabriele Monaco --- include/linux/sched.h | 7 ++++++- include/trace/events/sched.h | 17 +++++++++++++++-- kernel/sched/core.c | 10 +++++++++- kernel/trace/rv/monitors/sco/sco.c | 3 ++- kernel/trace/rv/monitors/sleep/sleep.c | 3 ++- kernel/trace/rv/monitors/snroc/snroc.c | 3 ++- 6 files changed, 36 insertions(+), 7 deletions(-) diff --git a/include/linux/sched.h b/include/linux/sched.h index 7bce4c7ae3b4f..19ab4597c97d3 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -339,9 +339,11 @@ extern void io_schedule_finish(int token); extern long io_schedule_timeout(long timeout); extern void io_schedule(void); =20 -/* wrapper function to trace from this header file */ +/* wrapper functions to trace from this header file */ DECLARE_TRACEPOINT(sched_set_state_tp); extern void __trace_set_current_state(int state_value); +DECLARE_TRACEPOINT(sched_set_need_resched_tp); +extern void __trace_set_need_resched(struct task_struct *curr, int tif); =20 /** * struct prev_cputime - snapshot of system and user cputime @@ -2059,6 +2061,9 @@ static inline int test_tsk_thread_flag(struct task_st= ruct *tsk, int flag) =20 static inline void set_tsk_need_resched(struct task_struct *tsk) { + if (tracepoint_enabled(sched_set_need_resched_tp) && + !test_tsk_thread_flag(tsk, TIF_NEED_RESCHED)) + __trace_set_need_resched(tsk, TIF_NEED_RESCHED); set_tsk_thread_flag(tsk,TIF_NEED_RESCHED); } =20 diff --git a/include/trace/events/sched.h b/include/trace/events/sched.h index 4e6b2910cec3f..c9dec6d38ad2d 100644 --- a/include/trace/events/sched.h +++ b/include/trace/events/sched.h @@ -889,11 +889,24 @@ DECLARE_TRACE(sched_exit, TP_PROTO(bool is_switch, unsigned long ip), TP_ARGS(is_switch, ip)); =20 +/* + * Tracepoint called when setting the state of a task; + * this tracepoint is guaranteed to be called from the waking context of t= he + * task setting the state. + */ DECLARE_TRACE_CONDITION(sched_set_state, - TP_PROTO(struct task_struct *tsk, int state), - TP_ARGS(tsk, state), + TP_PROTO(struct task_struct *tsk, int state, bool from_signal), + TP_ARGS(tsk, state, from_signal), TP_CONDITION(!!(tsk->__state) !=3D !!state)); =20 +DECLARE_TRACE(sched_set_need_resched, + TP_PROTO(struct task_struct *tsk, int cpu, int tif), + TP_ARGS(tsk, cpu, tif)); + +DECLARE_TRACE(sched_switch_vain, + TP_PROTO(bool preempt, struct task_struct *tsk, unsigned int prev_state), + TP_ARGS(preempt, tsk, prev_state)); + #endif /* _TRACE_SCHED_H */ =20 /* This part must be outside protection */ diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 81c6df746df17..6cb70e6f7fa17 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -495,7 +495,7 @@ EXPORT_TRACEPOINT_SYMBOL(sched_set_state_tp); /* Call via the helper macro trace_set_current_state. */ void __trace_set_current_state(int state_value) { - trace_sched_set_state_tp(current, state_value); + trace_sched_set_state_tp(current, state_value, false); } EXPORT_SYMBOL(__trace_set_current_state); =20 @@ -1110,6 +1110,7 @@ static void __resched_curr(struct rq *rq, int tif) =20 cpu =3D cpu_of(rq); =20 + trace_sched_set_need_resched_tp(curr, cpu, tif); if (cpu =3D=3D smp_processor_id()) { set_ti_thread_flag(cti, tif); if (tif =3D=3D TIF_NEED_RESCHED) @@ -1125,6 +1126,11 @@ static void __resched_curr(struct rq *rq, int tif) } } =20 +void __trace_set_need_resched(struct task_struct *curr, int tif) +{ + trace_sched_set_need_resched_tp(curr, smp_processor_id(), tif); +} + void resched_curr(struct rq *rq) { __resched_curr(rq, TIF_NEED_RESCHED); @@ -6592,6 +6598,7 @@ static bool try_to_block_task(struct rq *rq, struct t= ask_struct *p, int flags =3D DEQUEUE_NOCLOCK; =20 if (signal_pending_state(task_state, p)) { + trace_sched_set_state_tp(p, TASK_RUNNING, true); WRITE_ONCE(p->__state, TASK_RUNNING); *task_state_p =3D TASK_RUNNING; return false; @@ -6786,6 +6793,7 @@ static void __sched notrace __schedule(int sched_mode) rq =3D context_switch(rq, prev, next, &rf); } else { rq_unpin_lock(rq, &rf); + trace_sched_switch_vain_tp(preempt, prev, prev_state); __balance_callbacks(rq); raw_spin_rq_unlock_irq(rq); } diff --git a/kernel/trace/rv/monitors/sco/sco.c b/kernel/trace/rv/monitors/= sco/sco.c index 66f4639d46ac4..c9206aa12c319 100644 --- a/kernel/trace/rv/monitors/sco/sco.c +++ b/kernel/trace/rv/monitors/sco/sco.c @@ -19,7 +19,8 @@ static struct rv_monitor rv_sco; DECLARE_DA_MON_PER_CPU(sco, unsigned char); =20 -static void handle_sched_set_state(void *data, struct task_struct *tsk, in= t state) +static void handle_sched_set_state(void *data, struct task_struct *tsk, + int state, bool from_signal) { da_handle_start_event_sco(sched_set_state_sco); } diff --git a/kernel/trace/rv/monitors/sleep/sleep.c b/kernel/trace/rv/monit= ors/sleep/sleep.c index eea447b069071..5103a98818c53 100644 --- a/kernel/trace/rv/monitors/sleep/sleep.c +++ b/kernel/trace/rv/monitors/sleep/sleep.c @@ -82,7 +82,8 @@ static void ltl_atoms_init(struct task_struct *task, stru= ct ltl_monitor *mon, bo =20 } =20 -static void handle_sched_set_state(void *data, struct task_struct *task, i= nt state) +static void handle_sched_set_state(void *data, struct task_struct *task, + int state, bool from_signal) { if (state & TASK_INTERRUPTIBLE) ltl_atom_pulse(task, LTL_SLEEP, true); diff --git a/kernel/trace/rv/monitors/snroc/snroc.c b/kernel/trace/rv/monit= ors/snroc/snroc.c index 540e686e699f4..2651f589d1554 100644 --- a/kernel/trace/rv/monitors/snroc/snroc.c +++ b/kernel/trace/rv/monitors/snroc/snroc.c @@ -19,7 +19,8 @@ static struct rv_monitor rv_snroc; DECLARE_DA_MON_PER_TASK(snroc, unsigned char); =20 -static void handle_sched_set_state(void *data, struct task_struct *tsk, in= t state) +static void handle_sched_set_state(void *data, struct task_struct *tsk, + int state, bool from_signal) { da_handle_event_snroc(tsk, sched_set_state_snroc); } --=20 2.50.1 From nobody Sun Dec 14 02:06:09 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.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 880EE271444 for ; Tue, 15 Jul 2025 07:16:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563781; cv=none; b=Sf2O2fASJaWgiv9c1vmbGUSAVjYlzI5eWwibMPSZYguBBgLaQ1WX7lBlDz0841AqtKGQBvQozUzCcUjzC1YkzzzgKnSnkkn8eQA8JVfyrPF8Ok/7Jgg4dPHb3lsluGJ/sQPb4i7KNIlzcfgQ5S1QuWuhGvuTrYdEXm/OYu7fkak= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563781; c=relaxed/simple; bh=oKCxdtiHaXrLusltoZ/no3IOGFVOIaODLMIw1eJKc5k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CMYU2MWFfizhhH5/1Jo3C7sGZu+F3pufBC9j7Wm/Y6QqdsSCFggFZAn104Oz6NjDEWFBlk/e0uCkxIllwKiqVNeYynAGdbRZ9dSVgE2zHKgTEUPlA8KJNb0T6W2wnTyDfmcve9WJW2zqmGqWaEWgP4xDs3SMSB2qGMvVRXFphu8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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=b1nSJUWZ; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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="b1nSJUWZ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1752563778; 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=voQS/lp53ISUhbNDO53K37fCMrXCmD3XHPGgWIewhl0=; b=b1nSJUWZP64DQjKG3QtANz23m1co2rCMOKspvUvwYhxc/dom1pIq23V0LrbkqhFLdsA1GS ytFTWoCaMRV+0VzMPbrsPhxIPYadr60ZSzo+6Bf9DWRNFcZO0TfWIR++Fx4pzyPWIqKneY WeDSIY1whEp0HhcNfqIRB1mOh6c6wFM= Received: from mx-prod-mc-06.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-343-BLjZ0EkBMAWKpN_3HYsVig-1; Tue, 15 Jul 2025 03:16:16 -0400 X-MC-Unique: BLjZ0EkBMAWKpN_3HYsVig-1 X-Mimecast-MFC-AGG-ID: BLjZ0EkBMAWKpN_3HYsVig_1752563773 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (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-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 97C231800289; Tue, 15 Jul 2025 07:16:13 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.45.224.115]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 43CA8180035E; Tue, 15 Jul 2025 07:16:07 +0000 (UTC) From: Gabriele Monaco To: linux-kernel@vger.kernel.org, Steven Rostedt , Jonathan Corbet , Masami Hiramatsu , linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org Cc: Gabriele Monaco , Ingo Molnar , Peter Zijlstra , Nam Cao , Tomas Glozar , Juri Lelli , Clark Williams , John Kacur Subject: [PATCH v3 13/17] rv: Adapt the sco monitor to the new set_state Date: Tue, 15 Jul 2025 09:14:30 +0200 Message-ID: <20250715071434.22508-14-gmonaco@redhat.com> In-Reply-To: <20250715071434.22508-1-gmonaco@redhat.com> References: <20250715071434.22508-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.4.1 on 10.30.177.111 Content-Type: text/plain; charset="utf-8" The sched_set_state tracepoint changed prototype adding a new argument, this argument can differentiate between an explicit set_state called by a task and a set state to runnable by the scheduler due to a pending signal. Expand the model to handle the new set_state flavour, the monitor was making sure set state happens only outside of the scheduler, if the event occurs with the new argument (from_signal) set to true, we instead expect it to be inside the scheduler. Signed-off-by: Gabriele Monaco --- Documentation/trace/rv/monitor_sched.rst | 35 +++++++++++++----------- kernel/trace/rv/monitors/sco/sco.c | 5 +++- kernel/trace/rv/monitors/sco/sco.h | 4 +++ tools/verification/models/sched/sco.dot | 1 + 4 files changed, 28 insertions(+), 17 deletions(-) diff --git a/Documentation/trace/rv/monitor_sched.rst b/Documentation/trace= /rv/monitor_sched.rst index 24b2c62a3bc26..6f76bba94d9fb 100644 --- a/Documentation/trace/rv/monitor_sched.rst +++ b/Documentation/trace/rv/monitor_sched.rst @@ -64,22 +64,25 @@ Monitor sco ~~~~~~~~~~~ =20 The scheduling context operations (sco) monitor ensures changes in a task = state -happen only in thread context:: - - - | - | - v - sched_set_state +------------------+ - +------------------ | | - | | thread_context | - +-----------------> | | <+ - +------------------+ | - | | - | schedule_entry | schedule_exit - v | - | - scheduling_context -+ +happen only in thread context, the only exception is a special kind of set +state that occurs if a task about to sleep has a pending signal. This set = state +is not called by the thread but by the scheduler itself:: + + | + | + v + sched_set_state +------------------+ + +---------------------------------- | | + | | thread_context | + +---------------------------------> | | <+ + +------------------+ | + | | + | schedule_entry | schedule_exit + v | + sched_set_state_runnable_signal | + +---------------------------------- | + | scheduling_context | + +---------------------------------> -+ =20 Monitor snroc ~~~~~~~~~~~~~ diff --git a/kernel/trace/rv/monitors/sco/sco.c b/kernel/trace/rv/monitors/= sco/sco.c index c9206aa12c319..6457ff2469d08 100644 --- a/kernel/trace/rv/monitors/sco/sco.c +++ b/kernel/trace/rv/monitors/sco/sco.c @@ -22,7 +22,10 @@ DECLARE_DA_MON_PER_CPU(sco, unsigned char); static void handle_sched_set_state(void *data, struct task_struct *tsk, int state, bool from_signal) { - da_handle_start_event_sco(sched_set_state_sco); + if (from_signal) + da_handle_event_sco(sched_set_state_runnable_signal_sco); + else + da_handle_start_event_sco(sched_set_state_sco); } =20 static void handle_schedule_entry(void *data, bool preempt, unsigned long = ip) diff --git a/kernel/trace/rv/monitors/sco/sco.h b/kernel/trace/rv/monitors/= sco/sco.h index 83ca9a03331af..2d05ab882b2a6 100644 --- a/kernel/trace/rv/monitors/sco/sco.h +++ b/kernel/trace/rv/monitors/sco/sco.h @@ -15,6 +15,7 @@ enum states_sco { =20 enum events_sco { sched_set_state_sco =3D 0, + sched_set_state_runnable_signal_sco, schedule_entry_sco, schedule_exit_sco, event_max_sco @@ -35,17 +36,20 @@ static const struct automaton_sco automaton_sco =3D { }, .event_names =3D { "sched_set_state", + "sched_set_state_runnable_signal", "schedule_entry", "schedule_exit" }, .function =3D { { thread_context_sco, + INVALID_STATE, scheduling_context_sco, INVALID_STATE }, { INVALID_STATE, + scheduling_context_sco, INVALID_STATE, thread_context_sco }, diff --git a/tools/verification/models/sched/sco.dot b/tools/verification/m= odels/sched/sco.dot index 20b0e3b449a6b..4e44ed58c62a3 100644 --- a/tools/verification/models/sched/sco.dot +++ b/tools/verification/models/sched/sco.dot @@ -7,6 +7,7 @@ digraph state_automaton { {node [shape =3D plaintext] "thread_context"}; "__init_thread_context" -> "thread_context"; "scheduling_context" [label =3D "scheduling_context"]; + "scheduling_context" -> "scheduling_context" [ label =3D "sched_set_state= _runnable_signal" ]; "scheduling_context" -> "thread_context" [ label =3D "schedule_exit" ]; "thread_context" [label =3D "thread_context", color =3D green3]; "thread_context" -> "scheduling_context" [ label =3D "schedule_entry" ]; --=20 2.50.1 From nobody Sun Dec 14 02:06:09 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 6EE24271444 for ; Tue, 15 Jul 2025 07:16:28 +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=1752563790; cv=none; b=S4Dwgy0rZ5jTDxnTrBlZ6XDUl0Tcwkqt/VyFaeG6N5+GJA+qNmu7i0SF/oa2OFL6TpJWOk3D25oDngUWpDdfNz5l+GZ398ozNhzpo7GBIYVbm0gCR8Z4jpkkAlx6/1WjbrMIQtLg7WSky/AfpSQ7lGPw6DK9gtZ4FX7kariMu/I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563790; c=relaxed/simple; bh=BTgI+Wy5Ozi9V0326b7yhYZ4X5Ra5vXM3Agpg4yUc2U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=eJTlKKWk7XEwCwAki6Olp8geHcigy3gZNJG4/2mT1IxRVLZxzAfUHwSPnD2qxyr9Mr3sNjTC7KzBtqaw9qVQLA/e2Evnxz3sO3RPZXWB1mPdlFsUFePeUaHOtc4e3IyC/pGblX/4yvIxA12J+bk+TZ+/UGo3m0Y//p06AiX0DZw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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=jGGcB4bd; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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="jGGcB4bd" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1752563787; 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=nDb9L2a6bpB5aISgROYQAwEqouf8IV6Xr1GlNkbjo0I=; b=jGGcB4bd+nlezxlUpUSyc0RpFU06GbSM2E6jEVOmQZYnckQHtRkCRyYVTMkF7p8ZY/lQcg W1/bgZeepMaERVlRjR9Xc7MDRQ0Rcrrob4feBqaS+90zfwFXIq+fQiZavHqgodOTVJAxZ7 1EeS06dKBxkBS2HRJmhytjzAAXFyZIY= Received: from mx-prod-mc-02.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-594-tnAs1Y5rP6yfgWDw3bbPvw-1; Tue, 15 Jul 2025 03:16:23 -0400 X-MC-Unique: tnAs1Y5rP6yfgWDw3bbPvw-1 X-Mimecast-MFC-AGG-ID: tnAs1Y5rP6yfgWDw3bbPvw_1752563782 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (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-02.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 061551956089; Tue, 15 Jul 2025 07:16:22 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.45.224.115]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 00AF5180045B; Tue, 15 Jul 2025 07:16:14 +0000 (UTC) From: Gabriele Monaco To: linux-kernel@vger.kernel.org, Steven Rostedt , Jonathan Corbet , Masami Hiramatsu , linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org Cc: Gabriele Monaco , Ingo Molnar , Peter Zijlstra , Nam Cao , Tomas Glozar , Juri Lelli , Clark Williams , John Kacur Subject: [PATCH v3 14/17] rv: Extend snroc model Date: Tue, 15 Jul 2025 09:14:31 +0200 Message-ID: <20250715071434.22508-15-gmonaco@redhat.com> In-Reply-To: <20250715071434.22508-1-gmonaco@redhat.com> References: <20250715071434.22508-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.4.1 on 10.30.177.111 Content-Type: text/plain; charset="utf-8" The snroc monitor ensures changes in a task state happens only in the respective task's context. This is the only monitor enforcing a task is to be switched in after being switched out, and vice-versa. Although this is a trivial claim, it is useful to complete other claims on when scheduling is possible while keeping models simple. Add the sched_switch_vain event to the model, enforcing that a vain switch doesn't change the context but can only occur while a task is running (e.g. a call to schedule that re-selects the current task). Cc: Ingo Molnar Cc: Peter Zijlstra Signed-off-by: Gabriele Monaco --- Documentation/trace/rv/monitor_sched.rst | 32 ++++++++++++----------- kernel/trace/rv/monitors/snroc/snroc.c | 9 +++++++ kernel/trace/rv/monitors/snroc/snroc.h | 8 ++++-- tools/verification/models/sched/snroc.dot | 2 +- 4 files changed, 33 insertions(+), 18 deletions(-) diff --git a/Documentation/trace/rv/monitor_sched.rst b/Documentation/trace= /rv/monitor_sched.rst index 6f76bba94d9fb..5cb58ac441d83 100644 --- a/Documentation/trace/rv/monitor_sched.rst +++ b/Documentation/trace/rv/monitor_sched.rst @@ -89,21 +89,23 @@ Monitor snroc =20 The set non runnable on its own context (snroc) monitor ensures changes in= a task state happens only in the respective task's context. This is a per-ta= sk -monitor:: - - | - | - v - +------------------+ - | other_context | <+ - +------------------+ | - | | - | sched_switch_in | sched_switch_out - v | - sched_set_state | - +------------------ | - | own_context | - +-----------------> -+ +monitor. A task is in its own context after switching in and leaves the co= ntext +when switched out, a vain switch maintains the context:: + + | + | + v + +------------------+ + | other_context | <+ + +------------------+ | + | | + | sched_switch_in | sched_switch_out + v | + sched_set_state | + sched_switch_vain | + +-------------------- own_context | + | | + +-------------------> -+ =20 Monitor scpd ~~~~~~~~~~~~ diff --git a/kernel/trace/rv/monitors/snroc/snroc.c b/kernel/trace/rv/monit= ors/snroc/snroc.c index 2651f589d1554..11a56b58665e7 100644 --- a/kernel/trace/rv/monitors/snroc/snroc.c +++ b/kernel/trace/rv/monitors/snroc/snroc.c @@ -34,6 +34,13 @@ static void handle_sched_switch(void *data, bool preempt, da_handle_event_snroc(next, sched_switch_in_snroc); } =20 +static void handle_sched_switch_vain(void *data, bool preempt, + struct task_struct *tsk, + unsigned int tsk_state) +{ + da_handle_event_snroc(tsk, sched_switch_vain_snroc); +} + static int enable_snroc(void) { int retval; @@ -44,6 +51,7 @@ static int enable_snroc(void) =20 rv_attach_trace_probe("snroc", sched_set_state_tp, handle_sched_set_state= ); rv_attach_trace_probe("snroc", sched_switch, handle_sched_switch); + rv_attach_trace_probe("snroc", sched_switch_vain_tp, handle_sched_switch_= vain); =20 return 0; } @@ -54,6 +62,7 @@ static void disable_snroc(void) =20 rv_detach_trace_probe("snroc", sched_set_state_tp, handle_sched_set_state= ); rv_detach_trace_probe("snroc", sched_switch, handle_sched_switch); + rv_detach_trace_probe("snroc", sched_switch_vain_tp, handle_sched_switch_= vain); =20 da_monitor_destroy_snroc(); } diff --git a/kernel/trace/rv/monitors/snroc/snroc.h b/kernel/trace/rv/monit= ors/snroc/snroc.h index be46f7b9ebb87..064d98fb9796d 100644 --- a/kernel/trace/rv/monitors/snroc/snroc.h +++ b/kernel/trace/rv/monitors/snroc/snroc.h @@ -17,6 +17,7 @@ enum events_snroc { sched_set_state_snroc =3D 0, sched_switch_in_snroc, sched_switch_out_snroc, + sched_switch_vain_snroc, event_max_snroc }; =20 @@ -36,18 +37,21 @@ static const struct automaton_snroc automaton_snroc =3D= { .event_names =3D { "sched_set_state", "sched_switch_in", - "sched_switch_out" + "sched_switch_out", + "sched_switch_vain" }, .function =3D { { INVALID_STATE, own_context_snroc, + INVALID_STATE, INVALID_STATE }, { own_context_snroc, INVALID_STATE, - other_context_snroc + other_context_snroc, + own_context_snroc }, }, .initial_state =3D other_context_snroc, diff --git a/tools/verification/models/sched/snroc.dot b/tools/verification= /models/sched/snroc.dot index 8b71c32d4dca4..5b1a787d0350b 100644 --- a/tools/verification/models/sched/snroc.dot +++ b/tools/verification/models/sched/snroc.dot @@ -10,7 +10,7 @@ digraph state_automaton { "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" ]; + "own_context" -> "own_context" [ label =3D "sched_set_state\nsched_switch= _vain" ]; { rank =3D min ; "__init_other_context"; "other_context"; --=20 2.50.1 From nobody Sun Dec 14 02:06:09 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.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 97DD72727EC for ; Tue, 15 Jul 2025 07:16:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563799; cv=none; b=pBZaW/7PY0TH5ayHNE6iKhVFKocroYNZSceEWnTng/gOPo3nQoahQcgvlKQk4WXDJkV5CqpSC21YzegaRkto7Bov0uxdt2n0fLCf5AeMMxhyXSIrjfKims2C6N3zn+rgSwYkX+RboX75itlFvGT32pSr4wCaJMPX7T4rg6SFy20= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563799; c=relaxed/simple; bh=BiO/jWrGdhf1P4p9ap7NeVYW1O9pLIVSE9l248KWsbs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZflTpU5dR33fw78MQbe40inrlvA+2pLcM+GfS3WwET24T04G+o0WEXW3mBUPHz88L7nCaLNiAELpvoLUThWXUtbYSJPKsYNq5+G6wvQ+V5Z1ZxXUe9y/Co2Vwv1FO142tM8H5x9Gjt8g5wtr5PtRptvxrus1Lc73aqWt9U+hNIE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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=jOM94OeX; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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="jOM94OeX" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1752563795; 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=ey2nPZfRrk5n8Uc+KHjitc+9edgW/+AFGkfck3f7IIU=; b=jOM94OeXRTQ2WvcFpeixiBH7huq+0HrkDJAZy8JUPa77f6dbL7zLSXBy0lPu7FUBhofzvE P/yjOa5crj0NoocrDRkBkr5PRKwE6dCR1a9NOgPiOFw2T0nZyIawnjDJbf+Z7NS81YwvOk /Rudynx35DnUIAhi6Z9Z2o92tUh/e08= 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-653-hjJcTeByOsSCvMuRQgYtiw-1; Tue, 15 Jul 2025 03:16:31 -0400 X-MC-Unique: hjJcTeByOsSCvMuRQgYtiw-1 X-Mimecast-MFC-AGG-ID: hjJcTeByOsSCvMuRQgYtiw_1752563790 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (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 433F21808993; Tue, 15 Jul 2025 07:16:30 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.45.224.115]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 85DC118046C3; Tue, 15 Jul 2025 07:16:24 +0000 (UTC) From: Gabriele Monaco To: linux-kernel@vger.kernel.org, Steven Rostedt , Jonathan Corbet , Masami Hiramatsu , linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org Cc: Gabriele Monaco , Ingo Molnar , Peter Zijlstra , Nam Cao , Tomas Glozar , Juri Lelli , Clark Williams , John Kacur Subject: [PATCH v3 15/17] rv: Replace tss monitor with more complete sts Date: Tue, 15 Jul 2025 09:14:32 +0200 Message-ID: <20250715071434.22508-16-gmonaco@redhat.com> In-Reply-To: <20250715071434.22508-1-gmonaco@redhat.com> References: <20250715071434.22508-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.4.1 on 10.30.177.111 Content-Type: text/plain; charset="utf-8" The tss monitor currently guarantees context switches can happen only while scheduling, but it doesn't enforce that each scheduling call implies a task switch. This can be implied only if we rely on the newly introduced sched_switch_vain tracepoint, which represents a scheduler call where the previously running task is the same that is picked to run next, in fact no context is switched. Replace the monitor with a more comprehensive specification which implies tss but also ensures that: * each scheduler call switches context (or has a vain switch) * each context switch happens with interrupts disabled Cc: Ingo Molnar Cc: Peter Zijlstra Signed-off-by: Gabriele Monaco --- Documentation/trace/rv/monitor_sched.rst | 68 +++++++--- kernel/trace/rv/Kconfig | 2 +- kernel/trace/rv/Makefile | 2 +- kernel/trace/rv/monitors/sts/Kconfig | 18 +++ kernel/trace/rv/monitors/sts/sts.c | 117 ++++++++++++++++++ kernel/trace/rv/monitors/sts/sts.h | 97 +++++++++++++++ .../{tss/tss_trace.h =3D> sts/sts_trace.h} | 8 +- kernel/trace/rv/monitors/tss/Kconfig | 14 --- kernel/trace/rv/monitors/tss/tss.c | 90 -------------- kernel/trace/rv/monitors/tss/tss.h | 47 ------- kernel/trace/rv/rv_trace.h | 2 +- tools/verification/models/sched/sts.dot | 29 +++++ tools/verification/models/sched/tss.dot | 18 --- 13 files changed, 316 insertions(+), 196 deletions(-) create mode 100644 kernel/trace/rv/monitors/sts/Kconfig create mode 100644 kernel/trace/rv/monitors/sts/sts.c create mode 100644 kernel/trace/rv/monitors/sts/sts.h rename kernel/trace/rv/monitors/{tss/tss_trace.h =3D> sts/sts_trace.h} (67= %) delete mode 100644 kernel/trace/rv/monitors/tss/Kconfig delete mode 100644 kernel/trace/rv/monitors/tss/tss.c delete mode 100644 kernel/trace/rv/monitors/tss/tss.h create mode 100644 tools/verification/models/sched/sts.dot delete mode 100644 tools/verification/models/sched/tss.dot diff --git a/Documentation/trace/rv/monitor_sched.rst b/Documentation/trace= /rv/monitor_sched.rst index 5cb58ac441d83..e4171aadef1c2 100644 --- a/Documentation/trace/rv/monitor_sched.rst +++ b/Documentation/trace/rv/monitor_sched.rst @@ -40,26 +40,6 @@ defined in by Daniel Bristot in [1]. =20 Currently we included the following: =20 -Monitor tss -~~~~~~~~~~~ - -The task switch while scheduling (tss) monitor ensures a task switch happe= ns -only in scheduling context, that is inside a call to `__schedule`:: - - | - | - v - +-----------------+ - | thread | <+ - +-----------------+ | - | | - | schedule_entry | schedule_exit - v | - sched_switch | - +--------------- | - | sched | - +--------------> -+ - Monitor sco ~~~~~~~~~~~ =20 @@ -170,6 +150,54 @@ schedule is not called with interrupt disabled:: | cant_sched -+ =20 +Monitor sts +~~~~~~~~~~~ + +The schedule implies task switch (sts) monitor ensures a task switch happe= ns in +every scheduling context, that is inside a call to ``__schedule``, as well= as no +task switch can happen without scheduling and before interrupts are disabl= ed. +This require the special type of switch called vain, which occurs when the= next +task picked for execution is the same as the previously running one, in fa= ct no +real task switch occurs:: + + | + | + v + #=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D# irq_disable + H H irq_enable + H thread H --------------+ + H H | + +-------------> H H <-------------+ + | #=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D# + | | + | | schedule_entry + | v + | +--------------------+ + | | scheduling | <+ + | +--------------------+ | + | | | + | | irq_disable | irq_enable + | v | + | +--------------------+ | + | | disable_to_switch | -+ + | schedule_exit +--------------------+ + | | + | | sched_switch + | | sched_switch_vain + | v + | +--------------------+ + | | switching | + | +--------------------+ + | | + | | irq_enable + | v + | +--------------------+ irq_disable + | | | irq_enable + | | enable_to_exit | --------------+ + | | | | + +-------------- | | <-------------+ + +--------------------+ + References ---------- =20 diff --git a/kernel/trace/rv/Kconfig b/kernel/trace/rv/Kconfig index 26017378f79b8..da62d97d329aa 100644 --- a/kernel/trace/rv/Kconfig +++ b/kernel/trace/rv/Kconfig @@ -45,12 +45,12 @@ source "kernel/trace/rv/monitors/wip/Kconfig" source "kernel/trace/rv/monitors/wwnr/Kconfig" =20 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" source "kernel/trace/rv/monitors/scpd/Kconfig" source "kernel/trace/rv/monitors/snep/Kconfig" source "kernel/trace/rv/monitors/sncid/Kconfig" +source "kernel/trace/rv/monitors/sts/Kconfig" # Add new sched monitors here =20 source "kernel/trace/rv/monitors/rtapp/Kconfig" diff --git a/kernel/trace/rv/Makefile b/kernel/trace/rv/Makefile index 13ec2944c6650..db8653f7cedf3 100644 --- a/kernel/trace/rv/Makefile +++ b/kernel/trace/rv/Makefile @@ -6,7 +6,6 @@ obj-$(CONFIG_RV) +=3D rv.o obj-$(CONFIG_RV_MON_WIP) +=3D monitors/wip/wip.o 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 obj-$(CONFIG_RV_MON_SCPD) +=3D monitors/scpd/scpd.o @@ -15,6 +14,7 @@ obj-$(CONFIG_RV_MON_SNCID) +=3D monitors/sncid/sncid.o obj-$(CONFIG_RV_MON_RTAPP) +=3D monitors/rtapp/rtapp.o obj-$(CONFIG_RV_MON_PAGEFAULT) +=3D monitors/pagefault/pagefault.o obj-$(CONFIG_RV_MON_SLEEP) +=3D monitors/sleep/sleep.o +obj-$(CONFIG_RV_MON_STS) +=3D monitors/sts/sts.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/sts/Kconfig b/kernel/trace/rv/monitor= s/sts/Kconfig new file mode 100644 index 0000000000000..3fb1b5387566c --- /dev/null +++ b/kernel/trace/rv/monitors/sts/Kconfig @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +config RV_MON_STS + depends on RV + depends on TRACE_IRQFLAGS + depends on RV_MON_SCHED + default y + select DA_MON_EVENTS_IMPLICIT + bool "sts monitor" + help + Monitor to ensure relationships between scheduler and switches + * each call to the scheduler implies a switch + * switches only happen inside the scheduler + * switches happen with interrupt disabled + 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/sts/sts.c b/kernel/trace/rv/monitors/= sts/sts.c new file mode 100644 index 0000000000000..deb18a9d48f3b --- /dev/null +++ b/kernel/trace/rv/monitors/sts/sts.c @@ -0,0 +1,117 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include +#include +#include +#include +#include + +#define MODULE_NAME "sts" + +#include +#include +#include +#include + +#include "sts.h" + +static struct rv_monitor rv_sts; +DECLARE_DA_MON_PER_CPU(sts, unsigned char); + +static void handle_irq_disable(void *data, unsigned long ip, unsigned long= parent_ip) +{ + da_handle_event_sts(irq_disable_sts); +} + +static void handle_irq_enable(void *data, unsigned long ip, unsigned long = parent_ip) +{ + da_handle_event_sts(irq_enable_sts); +} + +static void handle_sched_switch(void *data, bool preempt, + struct task_struct *prev, + struct task_struct *next, + unsigned int prev_state) +{ + da_handle_event_sts(sched_switch_sts); +} + +static void handle_sched_switch_vain(void *data, bool preempt, + struct task_struct *tsk, + unsigned int tsk_state) +{ + da_handle_event_sts(sched_switch_vain_sts); +} + +static void handle_schedule_entry(void *data, bool preempt, unsigned long = ip) +{ + da_handle_event_sts(schedule_entry_sts); +} + +static void handle_schedule_exit(void *data, bool is_switch, unsigned long= ip) +{ + da_handle_start_event_sts(schedule_exit_sts); +} + +static int enable_sts(void) +{ + int retval; + + retval =3D da_monitor_init_sts(); + if (retval) + return retval; + + rv_attach_trace_probe("sts", irq_disable, handle_irq_disable); + rv_attach_trace_probe("sts", irq_enable, handle_irq_enable); + rv_attach_trace_probe("sts", sched_switch, handle_sched_switch); + rv_attach_trace_probe("sts", sched_switch_vain_tp, handle_sched_switch_va= in); + rv_attach_trace_probe("sts", sched_entry_tp, handle_schedule_entry); + rv_attach_trace_probe("sts", sched_exit_tp, handle_schedule_exit); + + return 0; +} + +static void disable_sts(void) +{ + rv_sts.enabled =3D 0; + + rv_detach_trace_probe("sts", irq_disable, handle_irq_disable); + rv_detach_trace_probe("sts", irq_enable, handle_irq_enable); + rv_detach_trace_probe("sts", sched_switch, handle_sched_switch); + rv_detach_trace_probe("sts", sched_switch_vain_tp, handle_sched_switch_va= in); + rv_detach_trace_probe("sts", sched_entry_tp, handle_schedule_entry); + rv_detach_trace_probe("sts", sched_exit_tp, handle_schedule_exit); + + da_monitor_destroy_sts(); +} + +/* + * This is the monitor register section. + */ +static struct rv_monitor rv_sts =3D { + .name =3D "sts", + .description =3D "schedule implies task switch.", + .enable =3D enable_sts, + .disable =3D disable_sts, + .reset =3D da_monitor_reset_all_sts, + .enabled =3D 0, +}; + +static int __init register_sts(void) +{ + return rv_register_monitor(&rv_sts, &rv_sched); +} + +static void __exit unregister_sts(void) +{ + rv_unregister_monitor(&rv_sts); +} + +module_init(register_sts); +module_exit(unregister_sts); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Gabriele Monaco "); +MODULE_DESCRIPTION("sts: schedule implies task switch."); diff --git a/kernel/trace/rv/monitors/sts/sts.h b/kernel/trace/rv/monitors/= sts/sts.h new file mode 100644 index 0000000000000..537ea1b2c023a --- /dev/null +++ b/kernel/trace/rv/monitors/sts/sts.h @@ -0,0 +1,97 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Automatically generated C representation of sts automaton + * For further information about this format, see kernel documentation: + * Documentation/trace/rv/deterministic_automata.rst + */ + +enum states_sts { + thread_sts =3D 0, + disable_to_switch_sts, + enable_to_exit_sts, + scheduling_sts, + switching_sts, + state_max_sts +}; + +#define INVALID_STATE state_max_sts + +enum events_sts { + irq_disable_sts =3D 0, + irq_enable_sts, + sched_switch_sts, + sched_switch_vain_sts, + schedule_entry_sts, + schedule_exit_sts, + event_max_sts +}; + +struct automaton_sts { + char *state_names[state_max_sts]; + char *event_names[event_max_sts]; + unsigned char function[state_max_sts][event_max_sts]; + unsigned char initial_state; + bool final_states[state_max_sts]; +}; + +static const struct automaton_sts automaton_sts =3D { + .state_names =3D { + "thread", + "disable_to_switch", + "enable_to_exit", + "scheduling", + "switching" + }, + .event_names =3D { + "irq_disable", + "irq_enable", + "sched_switch", + "sched_switch_vain", + "schedule_entry", + "schedule_exit" + }, + .function =3D { + { + thread_sts, + thread_sts, + INVALID_STATE, + INVALID_STATE, + scheduling_sts, + INVALID_STATE + }, + { + INVALID_STATE, + scheduling_sts, + switching_sts, + switching_sts, + INVALID_STATE, + INVALID_STATE + }, + { + enable_to_exit_sts, + enable_to_exit_sts, + INVALID_STATE, + INVALID_STATE, + INVALID_STATE, + thread_sts + }, + { + disable_to_switch_sts, + INVALID_STATE, + INVALID_STATE, + INVALID_STATE, + INVALID_STATE, + INVALID_STATE + }, + { + INVALID_STATE, + enable_to_exit_sts, + INVALID_STATE, + INVALID_STATE, + INVALID_STATE, + INVALID_STATE + }, + }, + .initial_state =3D thread_sts, + .final_states =3D { 1, 0, 0, 0, 0 }, +}; diff --git a/kernel/trace/rv/monitors/tss/tss_trace.h b/kernel/trace/rv/mon= itors/sts/sts_trace.h similarity index 67% rename from kernel/trace/rv/monitors/tss/tss_trace.h rename to kernel/trace/rv/monitors/sts/sts_trace.h index 4619dbb50cc06..d78beb58d5b3d 100644 --- a/kernel/trace/rv/monitors/tss/tss_trace.h +++ b/kernel/trace/rv/monitors/sts/sts_trace.h @@ -4,12 +4,12 @@ * Snippet to be included in rv_trace.h */ =20 -#ifdef CONFIG_RV_MON_TSS -DEFINE_EVENT(event_da_monitor, event_tss, +#ifdef CONFIG_RV_MON_STS +DEFINE_EVENT(event_da_monitor, event_sts, TP_PROTO(char *state, char *event, char *next_state, bool final_stat= e), TP_ARGS(state, event, next_state, final_state)); =20 -DEFINE_EVENT(error_da_monitor, error_tss, +DEFINE_EVENT(error_da_monitor, error_sts, TP_PROTO(char *state, char *event), TP_ARGS(state, event)); -#endif /* CONFIG_RV_MON_TSS */ +#endif /* CONFIG_RV_MON_STS */ diff --git a/kernel/trace/rv/monitors/tss/Kconfig b/kernel/trace/rv/monitor= s/tss/Kconfig deleted file mode 100644 index 479f86f52e60d..0000000000000 --- a/kernel/trace/rv/monitors/tss/Kconfig +++ /dev/null @@ -1,14 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-only -# -config RV_MON_TSS - depends on RV - depends on RV_MON_SCHED - default y - select DA_MON_EVENTS_IMPLICIT - bool "tss monitor" - help - Monitor to ensure sched_switch happens only in scheduling 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/tss/tss.c b/kernel/trace/rv/monitors/= tss/tss.c deleted file mode 100644 index 0452fcd9edcfe..0000000000000 --- a/kernel/trace/rv/monitors/tss/tss.c +++ /dev/null @@ -1,90 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -#include -#include -#include -#include -#include -#include -#include -#include - -#define MODULE_NAME "tss" - -#include -#include -#include - -#include "tss.h" - -static struct rv_monitor rv_tss; -DECLARE_DA_MON_PER_CPU(tss, unsigned char); - -static void handle_sched_switch(void *data, bool preempt, - struct task_struct *prev, - struct task_struct *next, - unsigned int prev_state) -{ - da_handle_event_tss(sched_switch_tss); -} - -static void handle_schedule_entry(void *data, bool preempt, unsigned long = ip) -{ - da_handle_event_tss(schedule_entry_tss); -} - -static void handle_schedule_exit(void *data, bool is_switch, unsigned long= ip) -{ - da_handle_start_event_tss(schedule_exit_tss); -} - -static int enable_tss(void) -{ - int retval; - - retval =3D da_monitor_init_tss(); - if (retval) - return retval; - - rv_attach_trace_probe("tss", sched_switch, handle_sched_switch); - rv_attach_trace_probe("tss", sched_entry_tp, handle_schedule_entry); - rv_attach_trace_probe("tss", sched_exit_tp, handle_schedule_exit); - - return 0; -} - -static void disable_tss(void) -{ - rv_tss.enabled =3D 0; - - rv_detach_trace_probe("tss", sched_switch, handle_sched_switch); - rv_detach_trace_probe("tss", sched_entry_tp, handle_schedule_entry); - rv_detach_trace_probe("tss", sched_exit_tp, handle_schedule_exit); - - da_monitor_destroy_tss(); -} - -static struct rv_monitor rv_tss =3D { - .name =3D "tss", - .description =3D "task switch while scheduling.", - .enable =3D enable_tss, - .disable =3D disable_tss, - .reset =3D da_monitor_reset_all_tss, - .enabled =3D 0, -}; - -static int __init register_tss(void) -{ - return rv_register_monitor(&rv_tss, &rv_sched); -} - -static void __exit unregister_tss(void) -{ - rv_unregister_monitor(&rv_tss); -} - -module_init(register_tss); -module_exit(unregister_tss); - -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Gabriele Monaco "); -MODULE_DESCRIPTION("tss: task switch while scheduling."); diff --git a/kernel/trace/rv/monitors/tss/tss.h b/kernel/trace/rv/monitors/= tss/tss.h deleted file mode 100644 index f0a36fda1b873..0000000000000 --- a/kernel/trace/rv/monitors/tss/tss.h +++ /dev/null @@ -1,47 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Automatically generated C representation of tss automaton - * For further information about this format, see kernel documentation: - * Documentation/trace/rv/deterministic_automata.rst - */ - -enum states_tss { - thread_tss =3D 0, - sched_tss, - state_max_tss -}; - -#define INVALID_STATE state_max_tss - -enum events_tss { - sched_switch_tss =3D 0, - schedule_entry_tss, - schedule_exit_tss, - event_max_tss -}; - -struct automaton_tss { - char *state_names[state_max_tss]; - char *event_names[event_max_tss]; - unsigned char function[state_max_tss][event_max_tss]; - unsigned char initial_state; - bool final_states[state_max_tss]; -}; - -static const struct automaton_tss automaton_tss =3D { - .state_names =3D { - "thread", - "sched" - }, - .event_names =3D { - "sched_switch", - "schedule_entry", - "schedule_exit" - }, - .function =3D { - { INVALID_STATE, sched_tss, INVALID_STATE }, - { sched_tss, INVALID_STATE, thread_tss }, - }, - .initial_state =3D thread_tss, - .final_states =3D { 1, 0 }, -}; diff --git a/kernel/trace/rv/rv_trace.h b/kernel/trace/rv/rv_trace.h index d38e0d3abdfde..dbd2f2ef513a7 100644 --- a/kernel/trace/rv/rv_trace.h +++ b/kernel/trace/rv/rv_trace.h @@ -58,11 +58,11 @@ DECLARE_EVENT_CLASS(error_da_monitor, ); =20 #include -#include #include #include #include #include +#include // Add new monitors based on CONFIG_DA_MON_EVENTS_IMPLICIT here =20 #endif /* CONFIG_DA_MON_EVENTS_IMPLICIT */ diff --git a/tools/verification/models/sched/sts.dot b/tools/verification/m= odels/sched/sts.dot new file mode 100644 index 0000000000000..8152675b4f528 --- /dev/null +++ b/tools/verification/models/sched/sts.dot @@ -0,0 +1,29 @@ +digraph state_automaton { + center =3D true; + size =3D "7,11"; + {node [shape =3D circle] "disable_to_switch"}; + {node [shape =3D circle] "enable_to_exit"}; + {node [shape =3D circle] "scheduling"}; + {node [shape =3D circle] "switching"}; + {node [shape =3D plaintext, style=3Dinvis, label=3D""] "__init_thread"}; + {node [shape =3D doublecircle] "thread"}; + {node [shape =3D circle] "thread"}; + "__init_thread" -> "thread"; + "disable_to_switch" [label =3D "disable_to_switch"]; + "disable_to_switch" -> "scheduling" [ label =3D "irq_enable" ]; + "disable_to_switch" -> "switching" [ label =3D "sched_switch\nsched_switc= h_vain" ]; + "enable_to_exit" [label =3D "enable_to_exit"]; + "enable_to_exit" -> "enable_to_exit" [ label =3D "irq_disable\nirq_enable= " ]; + "enable_to_exit" -> "thread" [ label =3D "schedule_exit" ]; + "scheduling" [label =3D "scheduling"]; + "scheduling" -> "disable_to_switch" [ label =3D "irq_disable" ]; + "switching" [label =3D "switching"]; + "switching" -> "enable_to_exit" [ label =3D "irq_enable" ]; + "thread" [label =3D "thread", color =3D green3]; + "thread" -> "scheduling" [ label =3D "schedule_entry" ]; + "thread" -> "thread" [ label =3D "irq_disable\nirq_enable" ]; + { rank =3D min ; + "__init_thread"; + "thread"; + } +} diff --git a/tools/verification/models/sched/tss.dot b/tools/verification/m= odels/sched/tss.dot deleted file mode 100644 index 7dfa1d9121bbd..0000000000000 --- a/tools/verification/models/sched/tss.dot +++ /dev/null @@ -1,18 +0,0 @@ -digraph state_automaton { - center =3D true; - size =3D "7,11"; - {node [shape =3D plaintext] "sched"}; - {node [shape =3D plaintext, style=3Dinvis, label=3D""] "__init_thread"}; - {node [shape =3D ellipse] "thread"}; - {node [shape =3D plaintext] "thread"}; - "__init_thread" -> "thread"; - "sched" [label =3D "sched"]; - "sched" -> "sched" [ label =3D "sched_switch" ]; - "sched" -> "thread" [ label =3D "schedule_exit" ]; - "thread" [label =3D "thread", color =3D green3]; - "thread" -> "sched" [ label =3D "schedule_entry" ]; - { rank =3D min ; - "__init_thread"; - "thread"; - } -} --=20 2.50.1 From nobody Sun Dec 14 02:06:09 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 BE55A2D3EC1 for ; Tue, 15 Jul 2025 07:16:44 +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=1752563807; cv=none; b=svrGGl8UOyy/+Z2lCOgSvQOpmtliHCKmkUQDw1NYyJsXvIxTs8Yue3+m/4I+VL69EBmTJjsc2mzSzAqoqdkBED3YIpbGfWlTZ53CrVT5W7FjF5TYt+0roEghER0KZm7yYkM0UClzgRCET/ysP5uTX0GNWpAOlPnhVkURlR58XoM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563807; c=relaxed/simple; bh=C9FpPt4mjAevzoQEGNWPfuiXNKmuUNYZl+Cm4CPw3zs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BT35Dy2bIm1fhi6A/pdDwEhjQ9ovb1FEV3GIEew6ZghTrIvQhPi9D6sCGy/wpzYzeoYRDmcVBENKWLsYvmXdKktZNtylHcYxzehM1WIsSV79GLxQhk9AHJGHK9Nlf6e/rFd/NljY9Dva+PG90Unkq655/YzjrIPHCWuSxhtwfY4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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=DQe0YnuN; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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="DQe0YnuN" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1752563804; 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=1jcjnNiYIWu2QI/9G/sQy3Mcv+k/bbHwqD/R9rcwbyQ=; b=DQe0YnuNQflzS5YyHbhdul9hUIinWhgszDpEESg38DGsUJUSy1A9FIegeThQSDBuBlS8zn nbmzrpJCgNuoVEQ1lddwsHv+k7cf1GHXDKqLUhwAIn4k7RTusQAeEuMDbzv1kvtaYP0XFn Z0TBmT7XFCdpR6XopI4lE5VGh6w/Voc= Received: from mx-prod-mc-06.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-554-GjawVHHjPW2inTwNqPUO1Q-1; Tue, 15 Jul 2025 03:16:40 -0400 X-MC-Unique: GjawVHHjPW2inTwNqPUO1Q-1 X-Mimecast-MFC-AGG-ID: GjawVHHjPW2inTwNqPUO1Q_1752563798 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (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-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id B1E3E180029F; Tue, 15 Jul 2025 07:16:38 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.45.224.115]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 9E3DE180045B; Tue, 15 Jul 2025 07:16:32 +0000 (UTC) From: Gabriele Monaco To: linux-kernel@vger.kernel.org, Steven Rostedt , Jonathan Corbet , Masami Hiramatsu , linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org Cc: Gabriele Monaco , Ingo Molnar , Peter Zijlstra , Nam Cao , Tomas Glozar , Juri Lelli , Clark Williams , John Kacur Subject: [PATCH v3 16/17] rv: Add nrp and sssw per-task monitors Date: Tue, 15 Jul 2025 09:14:33 +0200 Message-ID: <20250715071434.22508-17-gmonaco@redhat.com> In-Reply-To: <20250715071434.22508-1-gmonaco@redhat.com> References: <20250715071434.22508-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.4.1 on 10.30.177.111 Content-Type: text/plain; charset="utf-8" Add 2 per-task monitors as part of the sched model: * nrp: need-resched preempts Monitor to ensure preemption requires need resched. * sssw: set state sleep and wakeup Monitor to ensure sched_set_state to sleepable leads to sleeping and sleeping tasks require wakeup. Cc: Ingo Molnar Cc: Peter Zijlstra Signed-off-by: Gabriele Monaco --- Documentation/trace/rv/monitor_sched.rst | 168 +++++++++++++++++++++ kernel/trace/rv/Kconfig | 2 + kernel/trace/rv/Makefile | 2 + kernel/trace/rv/monitors/nrp/Kconfig | 14 ++ kernel/trace/rv/monitors/nrp/nrp.c | 146 ++++++++++++++++++ kernel/trace/rv/monitors/nrp/nrp.h | 87 +++++++++++ kernel/trace/rv/monitors/nrp/nrp_trace.h | 15 ++ kernel/trace/rv/monitors/sched/Kconfig | 1 + kernel/trace/rv/monitors/sssw/Kconfig | 15 ++ kernel/trace/rv/monitors/sssw/sssw.c | 115 ++++++++++++++ kernel/trace/rv/monitors/sssw/sssw.h | 97 ++++++++++++ kernel/trace/rv/monitors/sssw/sssw_trace.h | 15 ++ kernel/trace/rv/rv_trace.h | 2 + tools/verification/models/sched/nrp.dot | 29 ++++ tools/verification/models/sched/sssw.dot | 24 +++ 15 files changed, 732 insertions(+) create mode 100644 kernel/trace/rv/monitors/nrp/Kconfig create mode 100644 kernel/trace/rv/monitors/nrp/nrp.c create mode 100644 kernel/trace/rv/monitors/nrp/nrp.h create mode 100644 kernel/trace/rv/monitors/nrp/nrp_trace.h create mode 100644 kernel/trace/rv/monitors/sssw/Kconfig create mode 100644 kernel/trace/rv/monitors/sssw/sssw.c create mode 100644 kernel/trace/rv/monitors/sssw/sssw.h create mode 100644 kernel/trace/rv/monitors/sssw/sssw_trace.h create mode 100644 tools/verification/models/sched/nrp.dot create mode 100644 tools/verification/models/sched/sssw.dot diff --git a/Documentation/trace/rv/monitor_sched.rst b/Documentation/trace= /rv/monitor_sched.rst index e4171aadef1c2..4cb6590284786 100644 --- a/Documentation/trace/rv/monitor_sched.rst +++ b/Documentation/trace/rv/monitor_sched.rst @@ -198,6 +198,174 @@ real task switch occurs:: +-------------- | | <-------------+ +--------------------+ =20 +Monitor nrp +----------- + +The need resched preempts (nrp) monitor ensures preemption requires need +resched. Only kernel preemptions are considered, since preemptions while +returning to userspace, for this monitor, are indistinguishable from +``sched_switch_yield`` (described in the sssw monitor). +A preemption is any of the following types of ``sched_switch``: + +* ``sched_switch_preempt``: + a task is ``preempted``, this can happen after the need for ``rescheduli= ng`` + has been set. This is not valid for the *lazy* variant of the flag, which + causes only userspace preemptions. +* ``sched_switch_vain_preempt``: + a task goes through the scheduler from a preemption context but it is pi= cked + as the next task to run, hence no real task switch occurs. Since the + scheduler runs, this clears the need to reschedule. + +In theory, a preemption can only occur after the ``need_resched`` flag is = set. In +practice, however, it is possible to see a preemption where the flag is not +set. This can happen in one specific condition:: + + need_resched + preempt_schedule() + preempt_schedule_irq() + __schedule() + !need_resched + __schedule() + +In the situation above, standard preemption starts (e.g. from preempt_enab= le +when the flag is set), an interrupt occurs before scheduling and, on its e= xit +path, it schedules, which clears the ``need_resched`` flag. +When the preempted task runs again, the standard preemption started earlier +resumes, although the flag is no longer set. The monitor considers this a +``nested_preemption``, this allows another preemption without re-setting t= he +flag. This condition relaxes the monitor constraints and may catch false +negatives (i.e. no real ``nested_preemptions``) but makes the monitor more +robust and able to validate other scenarios. +For simplicity, the monitor starts in ``preempt_irq``, although no interru= pt +occurred, as the situation above is tricky to pinpoint. + +This monitor ignores when the task is switched in, as this complicates thi= ngs +when different types of ``sched_switch`` occur (e.g. sleeping or yielding,= here +marked as ``sched_switch_other`` or ``sched_switch_vain``). The snroc moni= tor +ensures a task is switched in before it can be switched out again. +For this reason, the ``any_thread_running`` state does not imply that the +monitored task is not running, simply it is not set for rescheduling:: + + sched_switch_other + sched_switch_vain + irq_entry #=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D# + +-------------------------- H H + | H H + +-------------------------> H any_thread_running H + H H + +-------------------------> H H + | #=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D# + | | ^ + | sched_switch_preempt | | sched_switch_pre= empt + | sched_switch_vain_preempt | sched_switch_vain_p= reempt + | sched_switch_other | sched_need_resched | sched_switch_oth= er + | sched_switch_vain | | sched_switch_vain + | v | + | +----------------------+ | + | +--- | | | + | sched_need_resched | | rescheduling | -+ + | +--> | | + | +----------------------+ + | | + | | irq_exit + | v + | +----------------------+ + | | | ---+ + | ---> | | | sched_need_res= ched + | | preempt_irq | | irq_exit + | | | <--+ + | | | <--+ + | +----------------------+ | + | | | + | | sched_switch_preempt | + | sched_switch_vain_preempt | + | | sched_switch_other | sched_need_res= ched + | | sched_switch_vain | + | v | + | +-----------------------+ | + +-------------------------- | nested_preempt | --+ + +-----------------------+ + ^ irq_entry | + +-------------------+ + +Due to how the ``need_resched`` flag on the preemption count works on arm6= 4, +this monitor is unstable on that architecture, as it often records preempt= ions +when the flag is not set, even in presence of the workaround above. +For the time being, the monitor is disabled by default on arm64. + +Monitor sssw +------------ + +The set state sleep and wakeup (sssw) monitor ensures ``sched_set_state`` = to +sleepable leads to sleeping and sleeping tasks require wakeup. +It includes the following types of ``sched_switch``: + +* ``switch_suspend``: + a task puts itself to sleep, this can happen only after explicitly setti= ng + the task to ``sleepable``. After a task is suspended, it needs to be wok= en up + (``waking`` state) before being switched in again. + Setting the task's state to ``sleepable`` can be reverted before switchi= ng if it + is woken up or set to ``runnable``. +* ``switch_blocked``: + a special case of a ``switch_suspend`` where the task is waiting on a + sleeping RT lock (``PREEMPT_RT`` only), it is common to see wakeup and s= et + state events racing with each other and this leads the model to perceive= this + type of switch when the task is not set to sleepable. This is a limitati= on of + the model in SMP system and workarounds may slow down the system. +* ``switch_yield``: + a task explicitly calls the scheduler, this looks like a preemption as t= he + task is still runnable but the ``need_resched`` flag is not set. It can + happen after a ``yield`` system call or from the idle task. By definitio= n, + a task cannot yield while ``sleepable`` as that would be a suspension. +* ``switch_vain``: + a task explicitly calls the scheduler but it is picked as the next task = to run, + hence no real task switch occurs. This can occur as a yield, which is not + valid when the task is sleepable. A special case of a yield is when a ta= sk in + ``TASK_INTERRUPTIBLE`` calls the scheduler while a signal is pending. The + task doesn't go through the usual blocking/waking and is set back to + runnable, the resulting switch looks like a yield. + +As for the nrp monitor, this monitor doesn't include a running state, +``sleepable`` and ``runnable`` are only referring to the task's desired +state, which could be scheduled out (e.g. due to preemption). However, it = does +include the event ``sched_switch_in`` to represent when a task is allowed = to +become running. This can be triggered also by preemption, but cannot occur +after the task got to ``sleeping`` until a ``wakeup``:: + + sched_set_state_runnable + sched_wakeup + sched_switch_vain_preempt | + sched_switch_preempt | + sched_switch_yield v + sched_switch_vain #=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D# + +-----------------> H H + | H H + +------------------ H runnable H + H H + +-----------------> H H + | #=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D# + sched_set_state_runnable | | ^ + sched_wakeup | sched_switch_blocking | + | sched_set_state_sleepable | | + | v | | + | +------------------------+ | sched_wake= up + +------------------ | | | | + | | | | + +-----------------> | sleepable | | | + | | | | | + +------------------ | | | | + sched_switch_in +------------------------+ | | + sched_switch_preempt | | | + sched_switch_vain_preempt sched_switch_suspend | | + sched_set_state_sleepable sched_switch_blocking | | + | | | + v | | + +------------------------+ | | + | sleeping | <-+ | + +------------------------+ | + | | + +----------------------------+ + References ---------- =20 diff --git a/kernel/trace/rv/Kconfig b/kernel/trace/rv/Kconfig index da62d97d329aa..2cce1f22892a0 100644 --- a/kernel/trace/rv/Kconfig +++ b/kernel/trace/rv/Kconfig @@ -51,6 +51,8 @@ source "kernel/trace/rv/monitors/scpd/Kconfig" source "kernel/trace/rv/monitors/snep/Kconfig" source "kernel/trace/rv/monitors/sncid/Kconfig" source "kernel/trace/rv/monitors/sts/Kconfig" +source "kernel/trace/rv/monitors/nrp/Kconfig" +source "kernel/trace/rv/monitors/sssw/Kconfig" # Add new sched monitors here =20 source "kernel/trace/rv/monitors/rtapp/Kconfig" diff --git a/kernel/trace/rv/Makefile b/kernel/trace/rv/Makefile index db8653f7cedf3..3f517fe639c5a 100644 --- a/kernel/trace/rv/Makefile +++ b/kernel/trace/rv/Makefile @@ -15,6 +15,8 @@ obj-$(CONFIG_RV_MON_RTAPP) +=3D monitors/rtapp/rtapp.o obj-$(CONFIG_RV_MON_PAGEFAULT) +=3D monitors/pagefault/pagefault.o obj-$(CONFIG_RV_MON_SLEEP) +=3D monitors/sleep/sleep.o obj-$(CONFIG_RV_MON_STS) +=3D monitors/sts/sts.o +obj-$(CONFIG_RV_MON_NRP) +=3D monitors/nrp/nrp.o +obj-$(CONFIG_RV_MON_SSSW) +=3D monitors/sssw/sssw.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/nrp/Kconfig b/kernel/trace/rv/monitor= s/nrp/Kconfig new file mode 100644 index 0000000000000..f37ff70e8d204 --- /dev/null +++ b/kernel/trace/rv/monitors/nrp/Kconfig @@ -0,0 +1,14 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +config RV_MON_NRP + depends on RV + depends on RV_MON_SCHED + default y if !ARCH_ARM64 + select DA_MON_EVENTS_ID + bool "nrp monitor" + help + Monitor to ensure preemption requires need resched. + 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/nrp/nrp.c b/kernel/trace/rv/monitors/= nrp/nrp.c new file mode 100644 index 0000000000000..90600497dc487 --- /dev/null +++ b/kernel/trace/rv/monitors/nrp/nrp.c @@ -0,0 +1,146 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include +#include +#include +#include +#include + +#define MODULE_NAME "nrp" + +#include +#include +#include +#include + +#include "nrp.h" + +static struct rv_monitor rv_nrp; +DECLARE_DA_MON_PER_TASK(nrp, unsigned char); +#ifdef CONFIG_X86_LOCAL_APIC +#include + +static void handle_vector_irq_entry(void *data, int vector) +{ + da_handle_event_nrp(current, irq_entry_nrp); +} + +static void attach_vector_irq(void) +{ + rv_attach_trace_probe("nrp", local_timer_entry, handle_vector_irq_entry); + if (IS_ENABLED(CONFIG_IRQ_WORK)) + rv_attach_trace_probe("nrp", irq_work_entry, handle_vector_irq_entry); + if (IS_ENABLED(CONFIG_SMP)) { + rv_attach_trace_probe("nrp", reschedule_entry, handle_vector_irq_entry); + rv_attach_trace_probe("nrp", call_function_entry, handle_vector_irq_entr= y); + rv_attach_trace_probe("nrp", call_function_single_entry, handle_vector_i= rq_entry); + } +} + +static void detach_vector_irq(void) +{ + rv_detach_trace_probe("nrp", local_timer_entry, handle_vector_irq_entry); + if (IS_ENABLED(CONFIG_IRQ_WORK)) + rv_detach_trace_probe("nrp", irq_work_entry, handle_vector_irq_entry); + if (IS_ENABLED(CONFIG_SMP)) { + rv_detach_trace_probe("nrp", reschedule_entry, handle_vector_irq_entry); + rv_detach_trace_probe("nrp", call_function_entry, handle_vector_irq_entr= y); + rv_detach_trace_probe("nrp", call_function_single_entry, handle_vector_i= rq_entry); + } +} + +#else +/* We assume irq_entry tracepoints are sufficient on other architectures */ +static void attach_vector_irq(void) { } +static void detach_vector_irq(void) { } +#endif +static void handle_irq_entry(void *data, int irq, struct irqaction *action) +{ + da_handle_event_nrp(current, irq_entry_nrp); +} + +static void handle_sched_need_resched(void *data, struct task_struct *tsk, + int cpu, int tif) +{ + if (tif =3D=3D TIF_NEED_RESCHED) + da_handle_start_event_nrp(tsk, sched_need_resched_nrp); +} + +static void handle_sched_switch(void *data, bool preempt, + struct task_struct *prev, + struct task_struct *next, + unsigned int prev_state) +{ + if (preempt) + da_handle_event_nrp(prev, sched_switch_preempt_nrp); + else + da_handle_event_nrp(prev, sched_switch_other_nrp); +} + +static void handle_sched_switch_vain(void *data, bool preempt, + struct task_struct *tsk, + unsigned int tsk_state) +{ + if (preempt) + da_handle_event_nrp(tsk, sched_switch_vain_preempt_nrp); + else + da_handle_event_nrp(tsk, sched_switch_vain_nrp); +} + +static int enable_nrp(void) +{ + int retval; + + retval =3D da_monitor_init_nrp(); + if (retval) + return retval; + + rv_attach_trace_probe("nrp", irq_handler_entry, handle_irq_entry); + rv_attach_trace_probe("nrp", sched_set_need_resched_tp, handle_sched_need= _resched); + rv_attach_trace_probe("nrp", sched_switch, handle_sched_switch); + rv_attach_trace_probe("nrp", sched_switch_vain_tp, handle_sched_switch_va= in); + attach_vector_irq(); + + return 0; +} + +static void disable_nrp(void) +{ + rv_nrp.enabled =3D 0; + + rv_detach_trace_probe("nrp", irq_handler_entry, handle_irq_entry); + rv_detach_trace_probe("nrp", sched_set_need_resched_tp, handle_sched_need= _resched); + rv_detach_trace_probe("nrp", sched_switch, handle_sched_switch); + rv_detach_trace_probe("nrp", sched_switch_vain_tp, handle_sched_switch_va= in); + detach_vector_irq(); + + da_monitor_destroy_nrp(); +} + +static struct rv_monitor rv_nrp =3D { + .name =3D "nrp", + .description =3D "need resched preempts.", + .enable =3D enable_nrp, + .disable =3D disable_nrp, + .reset =3D da_monitor_reset_all_nrp, + .enabled =3D 0, +}; + +static int __init register_nrp(void) +{ + return rv_register_monitor(&rv_nrp, &rv_sched); +} + +static void __exit unregister_nrp(void) +{ + rv_unregister_monitor(&rv_nrp); +} + +module_init(register_nrp); +module_exit(unregister_nrp); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Gabriele Monaco "); +MODULE_DESCRIPTION("nrp: need resched preempts."); diff --git a/kernel/trace/rv/monitors/nrp/nrp.h b/kernel/trace/rv/monitors/= nrp/nrp.h new file mode 100644 index 0000000000000..376c5a03dd2e9 --- /dev/null +++ b/kernel/trace/rv/monitors/nrp/nrp.h @@ -0,0 +1,87 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Automatically generated C representation of nrp automaton + * For further information about this format, see kernel documentation: + * Documentation/trace/rv/deterministic_automata.rst + */ + +enum states_nrp { + preempt_irq_nrp =3D 0, + any_thread_running_nrp, + nested_preempt_nrp, + rescheduling_nrp, + state_max_nrp +}; + +#define INVALID_STATE state_max_nrp + +enum events_nrp { + irq_entry_nrp =3D 0, + sched_need_resched_nrp, + sched_switch_other_nrp, + sched_switch_preempt_nrp, + sched_switch_vain_nrp, + sched_switch_vain_preempt_nrp, + event_max_nrp +}; + +struct automaton_nrp { + char *state_names[state_max_nrp]; + char *event_names[event_max_nrp]; + unsigned char function[state_max_nrp][event_max_nrp]; + unsigned char initial_state; + bool final_states[state_max_nrp]; +}; + +static const struct automaton_nrp automaton_nrp =3D { + .state_names =3D { + "preempt_irq", + "any_thread_running", + "nested_preempt", + "rescheduling" + }, + .event_names =3D { + "irq_entry", + "sched_need_resched", + "sched_switch_other", + "sched_switch_preempt", + "sched_switch_vain", + "sched_switch_vain_preempt" + }, + .function =3D { + { + preempt_irq_nrp, + preempt_irq_nrp, + nested_preempt_nrp, + nested_preempt_nrp, + nested_preempt_nrp, + nested_preempt_nrp + }, + { + any_thread_running_nrp, + rescheduling_nrp, + any_thread_running_nrp, + INVALID_STATE, + any_thread_running_nrp, + INVALID_STATE + }, + { + nested_preempt_nrp, + preempt_irq_nrp, + any_thread_running_nrp, + any_thread_running_nrp, + any_thread_running_nrp, + any_thread_running_nrp + }, + { + preempt_irq_nrp, + rescheduling_nrp, + any_thread_running_nrp, + any_thread_running_nrp, + any_thread_running_nrp, + any_thread_running_nrp + }, + }, + .initial_state =3D preempt_irq_nrp, + .final_states =3D { 0, 1, 0, 0 }, +}; diff --git a/kernel/trace/rv/monitors/nrp/nrp_trace.h b/kernel/trace/rv/mon= itors/nrp/nrp_trace.h new file mode 100644 index 0000000000000..2e13497de3b6f --- /dev/null +++ b/kernel/trace/rv/monitors/nrp/nrp_trace.h @@ -0,0 +1,15 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +/* + * Snippet to be included in rv_trace.h + */ + +#ifdef CONFIG_RV_MON_NRP +DEFINE_EVENT(event_da_monitor_id, event_nrp, + 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_nrp, + TP_PROTO(int id, char *state, char *event), + TP_ARGS(id, state, event)); +#endif /* CONFIG_RV_MON_NRP */ diff --git a/kernel/trace/rv/monitors/sched/Kconfig b/kernel/trace/rv/monit= ors/sched/Kconfig index ae3eb410abd78..aa16456da8647 100644 --- a/kernel/trace/rv/monitors/sched/Kconfig +++ b/kernel/trace/rv/monitors/sched/Kconfig @@ -2,6 +2,7 @@ # config RV_MON_SCHED depends on RV + depends on RV_PER_TASK_MONITORS >=3D 3 bool "sched monitor" help Collection of monitors to check the scheduler behaves according to spec= ifications. diff --git a/kernel/trace/rv/monitors/sssw/Kconfig b/kernel/trace/rv/monito= rs/sssw/Kconfig new file mode 100644 index 0000000000000..23b7eeb38bbfc --- /dev/null +++ b/kernel/trace/rv/monitors/sssw/Kconfig @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +config RV_MON_SSSW + depends on RV + depends on RV_MON_SCHED + default y + select DA_MON_EVENTS_ID + bool "sssw monitor" + help + Monitor to ensure sched_set_state to sleepable leads to sleeping and + sleeping tasks require wakeup. + 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/sssw/sssw.c b/kernel/trace/rv/monitor= s/sssw/sssw.c new file mode 100644 index 0000000000000..efa695dead36a --- /dev/null +++ b/kernel/trace/rv/monitors/sssw/sssw.c @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include +#include +#include +#include +#include + +#define MODULE_NAME "sssw" + +#include +#include +#include + +#include "sssw.h" + +static struct rv_monitor rv_sssw; +DECLARE_DA_MON_PER_TASK(sssw, unsigned char); + +static void handle_sched_set_state(void *data, struct task_struct *tsk, + int state, bool from_signal) +{ + if (state =3D=3D TASK_RUNNING) + da_handle_start_event_sssw(tsk, sched_set_state_runnable_sssw); + else + da_handle_event_sssw(tsk, sched_set_state_sleepable_sssw); +} + +static void handle_sched_switch(void *data, bool preempt, + struct task_struct *prev, + struct task_struct *next, + unsigned int prev_state) +{ + if (preempt) + da_handle_event_sssw(prev, sched_switch_preempt_sssw); + else if (prev_state =3D=3D TASK_RUNNING) + da_handle_start_event_sssw(prev, sched_switch_yield_sssw); + else if (prev_state =3D=3D TASK_RTLOCK_WAIT) + /* special case of sleeping task with racy conditions */ + da_handle_event_sssw(prev, sched_switch_blocking_sssw); + else + da_handle_event_sssw(prev, sched_switch_suspend_sssw); + da_handle_event_sssw(next, sched_switch_in_sssw); +} + +static void handle_sched_switch_vain(void *data, bool preempt, + struct task_struct *tsk, + unsigned int tsk_state) +{ + if (preempt) + da_handle_event_sssw(tsk, sched_switch_vain_preempt_sssw); + else + da_handle_start_event_sssw(tsk, sched_switch_vain_sssw); +} + +static void handle_sched_wakeup(void *data, struct task_struct *p) +{ + da_handle_start_event_sssw(p, sched_wakeup_sssw); +} + +static int enable_sssw(void) +{ + int retval; + + retval =3D da_monitor_init_sssw(); + if (retval) + return retval; + + rv_attach_trace_probe("sssw", sched_set_state_tp, handle_sched_set_state); + rv_attach_trace_probe("sssw", sched_switch, handle_sched_switch); + rv_attach_trace_probe("sssw", sched_switch_vain_tp, handle_sched_switch_v= ain); + rv_attach_trace_probe("sssw", sched_wakeup, handle_sched_wakeup); + + return 0; +} + +static void disable_sssw(void) +{ + rv_sssw.enabled =3D 0; + + rv_detach_trace_probe("sssw", sched_set_state_tp, handle_sched_set_state); + rv_detach_trace_probe("sssw", sched_switch, handle_sched_switch); + rv_detach_trace_probe("sssw", sched_switch_vain_tp, handle_sched_switch_v= ain); + rv_detach_trace_probe("sssw", sched_wakeup, handle_sched_wakeup); + + da_monitor_destroy_sssw(); +} + +static struct rv_monitor rv_sssw =3D { + .name =3D "sssw", + .description =3D "set state sleep and wakeup.", + .enable =3D enable_sssw, + .disable =3D disable_sssw, + .reset =3D da_monitor_reset_all_sssw, + .enabled =3D 0, +}; + +static int __init register_sssw(void) +{ + return rv_register_monitor(&rv_sssw, &rv_sched); +} + +static void __exit unregister_sssw(void) +{ + rv_unregister_monitor(&rv_sssw); +} + +module_init(register_sssw); +module_exit(unregister_sssw); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Gabriele Monaco "); +MODULE_DESCRIPTION("sssw: set state sleep and wakeup."); diff --git a/kernel/trace/rv/monitors/sssw/sssw.h b/kernel/trace/rv/monitor= s/sssw/sssw.h new file mode 100644 index 0000000000000..2b29230f29cff --- /dev/null +++ b/kernel/trace/rv/monitors/sssw/sssw.h @@ -0,0 +1,97 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Automatically generated C representation of sssw automaton + * For further information about this format, see kernel documentation: + * Documentation/trace/rv/deterministic_automata.rst + */ + +enum states_sssw { + runnanble_sssw =3D 0, + sleepable_sssw, + sleeping_sssw, + state_max_sssw +}; + +#define INVALID_STATE state_max_sssw + +enum events_sssw { + sched_set_state_runnable_sssw =3D 0, + sched_set_state_sleepable_sssw, + sched_switch_blocking_sssw, + sched_switch_in_sssw, + sched_switch_preempt_sssw, + sched_switch_suspend_sssw, + sched_switch_vain_sssw, + sched_switch_vain_preempt_sssw, + sched_switch_yield_sssw, + sched_wakeup_sssw, + event_max_sssw +}; + +struct automaton_sssw { + char *state_names[state_max_sssw]; + char *event_names[event_max_sssw]; + unsigned char function[state_max_sssw][event_max_sssw]; + unsigned char initial_state; + bool final_states[state_max_sssw]; +}; + +static const struct automaton_sssw automaton_sssw =3D { + .state_names =3D { + "runnanble", + "sleepable", + "sleeping" + }, + .event_names =3D { + "sched_set_state_runnable", + "sched_set_state_sleepable", + "sched_switch_blocking", + "sched_switch_in", + "sched_switch_preempt", + "sched_switch_suspend", + "sched_switch_vain", + "sched_switch_vain_preempt", + "sched_switch_yield", + "sched_wakeup" + }, + .function =3D { + { + runnanble_sssw, + sleepable_sssw, + sleeping_sssw, + runnanble_sssw, + runnanble_sssw, + INVALID_STATE, + runnanble_sssw, + runnanble_sssw, + runnanble_sssw, + runnanble_sssw + }, + { + runnanble_sssw, + sleepable_sssw, + sleeping_sssw, + sleepable_sssw, + sleepable_sssw, + sleeping_sssw, + INVALID_STATE, + sleepable_sssw, + INVALID_STATE, + runnanble_sssw + }, + { + INVALID_STATE, + INVALID_STATE, + INVALID_STATE, + INVALID_STATE, + INVALID_STATE, + INVALID_STATE, + INVALID_STATE, + INVALID_STATE, + INVALID_STATE, + runnanble_sssw + }, + }, + .initial_state =3D runnanble_sssw, + .final_states =3D { 1, 0, 0 }, +}; diff --git a/kernel/trace/rv/monitors/sssw/sssw_trace.h b/kernel/trace/rv/m= onitors/sssw/sssw_trace.h new file mode 100644 index 0000000000000..6c03cfc6960bf --- /dev/null +++ b/kernel/trace/rv/monitors/sssw/sssw_trace.h @@ -0,0 +1,15 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +/* + * Snippet to be included in rv_trace.h + */ + +#ifdef CONFIG_RV_MON_SSSW +DEFINE_EVENT(event_da_monitor_id, event_sssw, + 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_sssw, + TP_PROTO(int id, char *state, char *event), + TP_ARGS(id, state, event)); +#endif /* CONFIG_RV_MON_SSSW */ diff --git a/kernel/trace/rv/rv_trace.h b/kernel/trace/rv/rv_trace.h index dbd2f2ef513a7..b5cb1d1807fd2 100644 --- a/kernel/trace/rv/rv_trace.h +++ b/kernel/trace/rv/rv_trace.h @@ -124,6 +124,8 @@ DECLARE_EVENT_CLASS(error_da_monitor_id, =20 #include #include +#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/nrp.dot b/tools/verification/m= odels/sched/nrp.dot new file mode 100644 index 0000000000000..337ea310f7f8a --- /dev/null +++ b/tools/verification/models/sched/nrp.dot @@ -0,0 +1,29 @@ +digraph state_automaton { + center =3D true; + size =3D "7,11"; + {node [shape =3D doublecircle] "any_thread_running"}; + {node [shape =3D circle] "any_thread_running"}; + {node [shape =3D circle] "nested_preempt"}; + {node [shape =3D plaintext, style=3Dinvis, label=3D""] "__init_preempt_ir= q"}; + {node [shape =3D circle] "preempt_irq"}; + {node [shape =3D circle] "rescheduling"}; + "__init_preempt_irq" -> "preempt_irq"; + "any_thread_running" [label =3D "any_thread_running", color =3D green3]; + "any_thread_running" -> "any_thread_running" [ label =3D "sched_switch_ot= her\nsched_switch_vain\nirq_entry" ]; + "any_thread_running" -> "rescheduling" [ label =3D "sched_need_resched" ]; + "nested_preempt" [label =3D "nested_preempt"]; + "nested_preempt" -> "any_thread_running" [ label =3D "sched_switch_preemp= t\nsched_switch_vain_preempt\nsched_switch_other\nsched_switch_vain" ]; + "nested_preempt" -> "nested_preempt" [ label =3D "irq_entry" ]; + "nested_preempt" -> "preempt_irq" [ label =3D "sched_need_resched" ]; + "preempt_irq" [label =3D "preempt_irq"]; + "preempt_irq" -> "nested_preempt" [ label =3D "sched_switch_preempt\nsche= d_switch_vain_preempt\nsched_switch_other\nsched_switch_vain" ]; + "preempt_irq" -> "preempt_irq" [ label =3D "irq_entry\nsched_need_resched= " ]; + "rescheduling" [label =3D "rescheduling"]; + "rescheduling" -> "any_thread_running" [ label =3D "sched_switch_preempt\= nsched_switch_vain_preempt\nsched_switch_other\nsched_switch_vain" ]; + "rescheduling" -> "preempt_irq" [ label =3D "irq_entry" ]; + "rescheduling" -> "rescheduling" [ label =3D "sched_need_resched" ]; + { rank =3D min ; + "__init_preempt_irq"; + "preempt_irq"; + } +} diff --git a/tools/verification/models/sched/sssw.dot b/tools/verification/= models/sched/sssw.dot new file mode 100644 index 0000000000000..362e783f2bd58 --- /dev/null +++ b/tools/verification/models/sched/sssw.dot @@ -0,0 +1,24 @@ +digraph state_automaton { + center =3D true; + size =3D "7,11"; + {node [shape =3D plaintext, style=3Dinvis, label=3D""] "__init_runnanble"= }; + {node [shape =3D doublecircle] "runnanble"}; + {node [shape =3D circle] "runnanble"}; + {node [shape =3D circle] "sleepable"}; + {node [shape =3D circle] "sleeping"}; + "__init_runnanble" -> "runnanble"; + "runnanble" [label =3D "runnanble", color =3D green3]; + "runnanble" -> "runnanble" [ label =3D "sched_set_state_runnable\nsched_w= akeup\nsched_switch_in\nsched_switch_vain\nsched_switch_yield\nsched_switch= _preempt\nsched_switch_vain_preempt" ]; + "runnanble" -> "sleepable" [ label =3D "sched_set_state_sleepable" ]; + "runnanble" -> "sleeping" [ label =3D "sched_switch_blocking" ]; + "sleepable" [label =3D "sleepable"]; + "sleepable" -> "runnanble" [ label =3D "sched_set_state_runnable\nsched_w= akeup" ]; + "sleepable" -> "sleepable" [ label =3D "sched_set_state_sleepable\nsched_= switch_in\nsched_switch_preempt\nsched_switch_vain_preempt" ]; + "sleepable" -> "sleeping" [ label =3D "sched_switch_suspend\nsched_switch= _blocking" ]; + "sleeping" [label =3D "sleeping"]; + "sleeping" -> "runnanble" [ label =3D "sched_wakeup" ]; + { rank =3D min ; + "__init_runnanble"; + "runnanble"; + } +} --=20 2.50.1 From nobody Sun Dec 14 02:06:09 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.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 6D755273802 for ; Tue, 15 Jul 2025 07:16:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563815; cv=none; b=j+WPcTzQ4BWpaQEY3CMBs2MegxcxooH4u2uIvQQMS9c3VKJauqr8THQunDp0wRiLzgd+VbMINqGxfB0Uc2atto7hXz958dDe+jzz6LI9D7zLoY+Rc7fgruVbDCVzpwow5WiB2RyoCkgZvDlJurqPyOXs5fv5AKXZC5e0apxtk5U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752563815; c=relaxed/simple; bh=7rOw5GS9JFIFNo3cZbhnHt51HtSe3v+R7tN+QbmQKjU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iCC8gXbOtZtAbWGXbNMfUBsw04yyehaCmrlRFjG/DNs5b1p1woLdfyq21HtXyk7/BeIRTCbI3tWyivOE03x3dPw/iWTZDCrJAsGXVh4OBIVs9tNG5/DcIUdK291xAGy+8564vXB3XDvFBYzWe/1uqty/O03dr2D8YER1aoIM8MQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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=NT+1iiIO; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine 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="NT+1iiIO" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1752563812; 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=ngUVxyWDQpeH+GPsBgm7I5kODPozXel2LmxyIZWGc7M=; b=NT+1iiIOs+KQ3un+7/XSGD1ZWWbsb7UAwrNGaGHC1t4KfqjjSWAmn/JckCSzbpSvcrr0LX XjJlr6qf3VLqj/WUwObbLGLoOCCNgO5emPcZ4KlI6gmUdgWhpT6DcE6uHDRvyUma7FWEJT aTWjm/WL1PpeKXhj42dA6ypFPESaAc0= Received: from mx-prod-mc-06.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-529-N6MUzWxZMh6NYxVxnLKuJw-1; Tue, 15 Jul 2025 03:16:48 -0400 X-MC-Unique: N6MUzWxZMh6NYxVxnLKuJw-1 X-Mimecast-MFC-AGG-ID: N6MUzWxZMh6NYxVxnLKuJw_1752563806 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (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-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 948831800289; Tue, 15 Jul 2025 07:16:46 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.45.224.115]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 9C83D180035E; Tue, 15 Jul 2025 07:16:40 +0000 (UTC) From: Gabriele Monaco To: linux-kernel@vger.kernel.org, Steven Rostedt , Jonathan Corbet , Masami Hiramatsu , linux-trace-kernel@vger.kernel.org, linux-doc@vger.kernel.org Cc: Gabriele Monaco , Ingo Molnar , Peter Zijlstra , Nam Cao , Tomas Glozar , Juri Lelli , Clark Williams , John Kacur Subject: [PATCH v3 17/17] rv: Add opid per-cpu monitor Date: Tue, 15 Jul 2025 09:14:34 +0200 Message-ID: <20250715071434.22508-18-gmonaco@redhat.com> In-Reply-To: <20250715071434.22508-1-gmonaco@redhat.com> References: <20250715071434.22508-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.4.1 on 10.30.177.111 Content-Type: text/plain; charset="utf-8" Add a per-cpu monitor as part of the sched model: * opid: operations with preemption and irq disabled Monitor to ensure wakeup and need_resched occur with irq and preemption disabled or in irq handlers. Signed-off-by: Gabriele Monaco --- Documentation/trace/rv/monitor_sched.rst | 55 +++++++ kernel/trace/rv/Kconfig | 1 + kernel/trace/rv/Makefile | 1 + kernel/trace/rv/monitors/nrp/Kconfig | 2 +- kernel/trace/rv/monitors/opid/Kconfig | 17 +++ kernel/trace/rv/monitors/opid/opid.c | 169 +++++++++++++++++++++ kernel/trace/rv/monitors/opid/opid.h | 104 +++++++++++++ kernel/trace/rv/monitors/opid/opid_trace.h | 15 ++ kernel/trace/rv/rv_trace.h | 1 + tools/verification/models/sched/opid.dot | 35 +++++ 10 files changed, 399 insertions(+), 1 deletion(-) create mode 100644 kernel/trace/rv/monitors/opid/Kconfig create mode 100644 kernel/trace/rv/monitors/opid/opid.c create mode 100644 kernel/trace/rv/monitors/opid/opid.h create mode 100644 kernel/trace/rv/monitors/opid/opid_trace.h create mode 100644 tools/verification/models/sched/opid.dot diff --git a/Documentation/trace/rv/monitor_sched.rst b/Documentation/trace= /rv/monitor_sched.rst index 4cb6590284786..6f796e22dbab6 100644 --- a/Documentation/trace/rv/monitor_sched.rst +++ b/Documentation/trace/rv/monitor_sched.rst @@ -366,6 +366,61 @@ after the task got to ``sleeping`` until a ``wakeup``:: | | +----------------------------+ =20 +Monitor opid +------------ + +The operations with preemption and irq disabled (opid) monitor ensures +operations like ``wakeup`` and ``need_resched`` occur with interrupts and +preemption disabled or during interrupt context, in such case preemption m= ay +not be disabled explicitly. +``need_resched`` can be set by some RCU internals functions, in which case= it +doesn't match a task wakeup and might occur with only interrupts disabled:: + + | sched_need_resched + | sched_waking + | irq_entry + | +--------------------+ + v v | + +------------------------------------------------------+ + +----------- | disabled | <+ + | +------------------------------------------------------+ | + | | ^ | + | | preempt_disable sched_need_resched | + | preempt_enable | +--------------------+ | + | v | v | | + | +------------------------------------------------------+ | + | | irq_disabled | | + | +------------------------------------------------------+ | + | | | ^ | + | irq_entry | | | + | sched_need_resched v | irq_disable | + | sched_waking +--------------+ | | | + | +----- | | irq_enable | | + | | | in_irq | | | | + | +----> | | | | | + | +--------------+ | | irq_dis= able + | | | | | + | irq_enable | irq_enable | | | + | v v | | + | #=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D# | + | H enabled H | + | #=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D# | + | | ^ ^ preempt_enable | | + | preempt_disable preempt_enable +--------------------+ | + | v | | + | +------------------+ | | + +----------> | preempt_disabled | -+ | + +------------------+ | + | | + +-------------------------------------------------------+ + +This monitor is designed to work on ``PREEMPT_RT`` kernels, the special ca= se of +events occurring in interrupt context is a shortcut to identify valid scen= arios +where the preemption tracepoints might not be visible, during interrupts +preemption is always disabled. On non- ``PREEMPT_RT`` kernels, the interru= pts +might invoke a softirq to set ``need_resched`` and wake up a task. This is +another special case that is currently not supported by the monitor. + References ---------- =20 diff --git a/kernel/trace/rv/Kconfig b/kernel/trace/rv/Kconfig index 2cce1f22892a0..86d4c59ca4966 100644 --- a/kernel/trace/rv/Kconfig +++ b/kernel/trace/rv/Kconfig @@ -53,6 +53,7 @@ source "kernel/trace/rv/monitors/sncid/Kconfig" source "kernel/trace/rv/monitors/sts/Kconfig" source "kernel/trace/rv/monitors/nrp/Kconfig" source "kernel/trace/rv/monitors/sssw/Kconfig" +source "kernel/trace/rv/monitors/opid/Kconfig" # Add new sched monitors here =20 source "kernel/trace/rv/monitors/rtapp/Kconfig" diff --git a/kernel/trace/rv/Makefile b/kernel/trace/rv/Makefile index 3f517fe639c5a..955d0947122ce 100644 --- a/kernel/trace/rv/Makefile +++ b/kernel/trace/rv/Makefile @@ -17,6 +17,7 @@ obj-$(CONFIG_RV_MON_SLEEP) +=3D monitors/sleep/sleep.o obj-$(CONFIG_RV_MON_STS) +=3D monitors/sts/sts.o obj-$(CONFIG_RV_MON_NRP) +=3D monitors/nrp/nrp.o obj-$(CONFIG_RV_MON_SSSW) +=3D monitors/sssw/sssw.o +obj-$(CONFIG_RV_MON_OPID) +=3D monitors/opid/opid.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/nrp/Kconfig b/kernel/trace/rv/monitor= s/nrp/Kconfig index f37ff70e8d204..a175c430d351f 100644 --- a/kernel/trace/rv/monitors/nrp/Kconfig +++ b/kernel/trace/rv/monitors/nrp/Kconfig @@ -3,7 +3,7 @@ config RV_MON_NRP depends on RV depends on RV_MON_SCHED - default y if !ARCH_ARM64 + default y if !ARM64 select DA_MON_EVENTS_ID bool "nrp monitor" help diff --git a/kernel/trace/rv/monitors/opid/Kconfig b/kernel/trace/rv/monito= rs/opid/Kconfig new file mode 100644 index 0000000000000..23b43d2704153 --- /dev/null +++ b/kernel/trace/rv/monitors/opid/Kconfig @@ -0,0 +1,17 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +config RV_MON_OPID + depends on RV + depends on TRACE_IRQFLAGS + depends on TRACE_PREEMPT_TOGGLE + depends on RV_MON_SCHED + default y if PREEMPT_RT + select DA_MON_EVENTS_IMPLICIT + bool "opid monitor" + help + Monitor to ensure operations like wakeup and need resched occur with + interrupts and preemption disabled or during IRQs, where preemption + may not be disabled explicitly. + + For further information, see: + Documentation/trace/rv/monitor_sched.rst diff --git a/kernel/trace/rv/monitors/opid/opid.c b/kernel/trace/rv/monitor= s/opid/opid.c new file mode 100644 index 0000000000000..4f1902f24805c --- /dev/null +++ b/kernel/trace/rv/monitors/opid/opid.c @@ -0,0 +1,169 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include +#include +#include +#include +#include + +#define MODULE_NAME "opid" + +#include +#include +#include +#include +#include + +#include "opid.h" + +static struct rv_monitor rv_opid; +DECLARE_DA_MON_PER_CPU(opid, unsigned char); + +#ifdef CONFIG_X86_LOCAL_APIC +#include + +static void handle_vector_irq_entry(void *data, int vector) +{ + da_handle_event_opid(irq_entry_opid); +} + +static void attach_vector_irq(void) +{ + rv_attach_trace_probe("opid", local_timer_entry, handle_vector_irq_entry); + if (IS_ENABLED(CONFIG_IRQ_WORK)) + rv_attach_trace_probe("opid", irq_work_entry, handle_vector_irq_entry); + if (IS_ENABLED(CONFIG_SMP)) { + rv_attach_trace_probe("opid", reschedule_entry, handle_vector_irq_entry); + rv_attach_trace_probe("opid", call_function_entry, handle_vector_irq_ent= ry); + rv_attach_trace_probe("opid", call_function_single_entry, handle_vector_= irq_entry); + } +} + +static void detach_vector_irq(void) +{ + rv_detach_trace_probe("opid", local_timer_entry, handle_vector_irq_entry); + if (IS_ENABLED(CONFIG_IRQ_WORK)) + rv_detach_trace_probe("opid", irq_work_entry, handle_vector_irq_entry); + if (IS_ENABLED(CONFIG_SMP)) { + rv_detach_trace_probe("opid", reschedule_entry, handle_vector_irq_entry); + rv_detach_trace_probe("opid", call_function_entry, handle_vector_irq_ent= ry); + rv_detach_trace_probe("opid", call_function_single_entry, handle_vector_= irq_entry); + } +} + +#else +/* We assume irq_entry tracepoints are sufficient on other architectures */ +static void attach_vector_irq(void) { } +static void detach_vector_irq(void) { } +#endif + +static void handle_irq_disable(void *data, unsigned long ip, unsigned long= parent_ip) +{ + da_handle_event_opid(irq_disable_opid); +} + +static void handle_irq_enable(void *data, unsigned long ip, unsigned long = parent_ip) +{ + da_handle_event_opid(irq_enable_opid); +} + +static void handle_irq_entry(void *data, int irq, struct irqaction *action) +{ + da_handle_event_opid(irq_entry_opid); +} + +static void handle_preempt_disable(void *data, unsigned long ip, unsigned = long parent_ip) +{ + da_handle_event_opid(preempt_disable_opid); +} + +static void handle_preempt_enable(void *data, unsigned long ip, unsigned l= ong parent_ip) +{ + da_handle_event_opid(preempt_enable_opid); +} + +static void handle_sched_need_resched(void *data, struct task_struct *tsk,= int cpu, int tif) +{ + /* The monitor's intitial state is not in_irq */ + if (this_cpu_read(hardirq_context)) + da_handle_event_opid(sched_need_resched_opid); + else + da_handle_start_event_opid(sched_need_resched_opid); +} + +static void handle_sched_waking(void *data, struct task_struct *p) +{ + /* The monitor's intitial state is not in_irq */ + if (this_cpu_read(hardirq_context)) + da_handle_event_opid(sched_waking_opid); + else + da_handle_start_event_opid(sched_waking_opid); +} + +static int enable_opid(void) +{ + int retval; + + retval =3D da_monitor_init_opid(); + if (retval) + return retval; + + rv_attach_trace_probe("opid", irq_disable, handle_irq_disable); + rv_attach_trace_probe("opid", irq_enable, handle_irq_enable); + rv_attach_trace_probe("opid", irq_handler_entry, handle_irq_entry); + rv_attach_trace_probe("opid", preempt_disable, handle_preempt_disable); + rv_attach_trace_probe("opid", preempt_enable, handle_preempt_enable); + rv_attach_trace_probe("opid", sched_set_need_resched_tp, handle_sched_nee= d_resched); + rv_attach_trace_probe("opid", sched_waking, handle_sched_waking); + attach_vector_irq(); + + return 0; +} + +static void disable_opid(void) +{ + rv_opid.enabled =3D 0; + + rv_detach_trace_probe("opid", irq_disable, handle_irq_disable); + rv_detach_trace_probe("opid", irq_enable, handle_irq_enable); + rv_detach_trace_probe("opid", irq_handler_entry, handle_irq_entry); + rv_detach_trace_probe("opid", preempt_disable, handle_preempt_disable); + rv_detach_trace_probe("opid", preempt_enable, handle_preempt_enable); + rv_detach_trace_probe("opid", sched_set_need_resched_tp, handle_sched_nee= d_resched); + rv_detach_trace_probe("opid", sched_waking, handle_sched_waking); + detach_vector_irq(); + + da_monitor_destroy_opid(); +} + +/* + * This is the monitor register section. + */ +static struct rv_monitor rv_opid =3D { + .name =3D "opid", + .description =3D "operations with preemption and irq disabled.", + .enable =3D enable_opid, + .disable =3D disable_opid, + .reset =3D da_monitor_reset_all_opid, + .enabled =3D 0, +}; + +static int __init register_opid(void) +{ + rv_register_monitor(&rv_opid, &rv_sched); + return 0; +} + +static void __exit unregister_opid(void) +{ + rv_unregister_monitor(&rv_opid); +} + +module_init(register_opid); +module_exit(unregister_opid); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Gabriele Monaco "); +MODULE_DESCRIPTION("opid: operations with preemption and irq disabled."); diff --git a/kernel/trace/rv/monitors/opid/opid.h b/kernel/trace/rv/monitor= s/opid/opid.h new file mode 100644 index 0000000000000..efdbcda8fff30 --- /dev/null +++ b/kernel/trace/rv/monitors/opid/opid.h @@ -0,0 +1,104 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Automatically generated C representation of opid automaton + * For further information about this format, see kernel documentation: + * Documentation/trace/rv/deterministic_automata.rst + */ + +enum states_opid { + disabled_opid =3D 0, + enabled_opid, + in_irq_opid, + irq_disabled_opid, + preempt_disabled_opid, + state_max_opid +}; + +#define INVALID_STATE state_max_opid + +enum events_opid { + irq_disable_opid =3D 0, + irq_enable_opid, + irq_entry_opid, + preempt_disable_opid, + preempt_enable_opid, + sched_need_resched_opid, + sched_waking_opid, + event_max_opid +}; + +struct automaton_opid { + char *state_names[state_max_opid]; + char *event_names[event_max_opid]; + unsigned char function[state_max_opid][event_max_opid]; + unsigned char initial_state; + bool final_states[state_max_opid]; +}; + +static const struct automaton_opid automaton_opid =3D { + .state_names =3D { + "disabled", + "enabled", + "in_irq", + "irq_disabled", + "preempt_disabled" + }, + .event_names =3D { + "irq_disable", + "irq_enable", + "irq_entry", + "preempt_disable", + "preempt_enable", + "sched_need_resched", + "sched_waking" + }, + .function =3D { + { + INVALID_STATE, + preempt_disabled_opid, + disabled_opid, + INVALID_STATE, + irq_disabled_opid, + disabled_opid, + disabled_opid + }, + { + irq_disabled_opid, + INVALID_STATE, + INVALID_STATE, + preempt_disabled_opid, + enabled_opid, + INVALID_STATE, + INVALID_STATE + }, + { + INVALID_STATE, + enabled_opid, + INVALID_STATE, + INVALID_STATE, + INVALID_STATE, + in_irq_opid, + in_irq_opid + }, + { + INVALID_STATE, + enabled_opid, + in_irq_opid, + disabled_opid, + INVALID_STATE, + irq_disabled_opid, + INVALID_STATE + }, + { + disabled_opid, + INVALID_STATE, + INVALID_STATE, + INVALID_STATE, + enabled_opid, + INVALID_STATE, + INVALID_STATE + }, + }, + .initial_state =3D disabled_opid, + .final_states =3D { 0, 1, 0, 0, 0 }, +}; diff --git a/kernel/trace/rv/monitors/opid/opid_trace.h b/kernel/trace/rv/m= onitors/opid/opid_trace.h new file mode 100644 index 0000000000000..3df6ff955c300 --- /dev/null +++ b/kernel/trace/rv/monitors/opid/opid_trace.h @@ -0,0 +1,15 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +/* + * Snippet to be included in rv_trace.h + */ + +#ifdef CONFIG_RV_MON_OPID +DEFINE_EVENT(event_da_monitor, event_opid, + TP_PROTO(char *state, char *event, char *next_state, bool final_stat= e), + TP_ARGS(state, event, next_state, final_state)); + +DEFINE_EVENT(error_da_monitor, error_opid, + TP_PROTO(char *state, char *event), + TP_ARGS(state, event)); +#endif /* CONFIG_RV_MON_OPID */ diff --git a/kernel/trace/rv/rv_trace.h b/kernel/trace/rv/rv_trace.h index b5cb1d1807fd2..c2e841a080df6 100644 --- a/kernel/trace/rv/rv_trace.h +++ b/kernel/trace/rv/rv_trace.h @@ -63,6 +63,7 @@ DECLARE_EVENT_CLASS(error_da_monitor, #include #include #include +#include // Add new monitors based on CONFIG_DA_MON_EVENTS_IMPLICIT here =20 #endif /* CONFIG_DA_MON_EVENTS_IMPLICIT */ diff --git a/tools/verification/models/sched/opid.dot b/tools/verification/= models/sched/opid.dot new file mode 100644 index 0000000000000..2d5e1df3405f2 --- /dev/null +++ b/tools/verification/models/sched/opid.dot @@ -0,0 +1,35 @@ +digraph state_automaton { + center =3D true; + size =3D "7,11"; + {node [shape =3D plaintext, style=3Dinvis, label=3D""] "__init_disabled"}; + {node [shape =3D circle] "disabled"}; + {node [shape =3D doublecircle] "enabled"}; + {node [shape =3D circle] "enabled"}; + {node [shape =3D circle] "in_irq"}; + {node [shape =3D circle] "irq_disabled"}; + {node [shape =3D circle] "preempt_disabled"}; + "__init_disabled" -> "disabled"; + "disabled" [label =3D "disabled"]; + "disabled" -> "disabled" [ label =3D "sched_need_resched\nsched_waking\ni= rq_entry" ]; + "disabled" -> "irq_disabled" [ label =3D "preempt_enable" ]; + "disabled" -> "preempt_disabled" [ label =3D "irq_enable" ]; + "enabled" [label =3D "enabled", color =3D green3]; + "enabled" -> "enabled" [ label =3D "preempt_enable" ]; + "enabled" -> "irq_disabled" [ label =3D "irq_disable" ]; + "enabled" -> "preempt_disabled" [ label =3D "preempt_disable" ]; + "in_irq" [label =3D "in_irq"]; + "in_irq" -> "enabled" [ label =3D "irq_enable" ]; + "in_irq" -> "in_irq" [ label =3D "sched_need_resched\nsched_waking" ]; + "irq_disabled" [label =3D "irq_disabled"]; + "irq_disabled" -> "disabled" [ label =3D "preempt_disable" ]; + "irq_disabled" -> "enabled" [ label =3D "irq_enable" ]; + "irq_disabled" -> "in_irq" [ label =3D "irq_entry" ]; + "irq_disabled" -> "irq_disabled" [ label =3D "sched_need_resched" ]; + "preempt_disabled" [label =3D "preempt_disabled"]; + "preempt_disabled" -> "disabled" [ label =3D "irq_disable" ]; + "preempt_disabled" -> "enabled" [ label =3D "preempt_enable" ]; + { rank =3D min ; + "__init_disabled"; + "disabled"; + } +} --=20 2.50.1