From patchwork Fri Apr 4 08:45:14 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gabriele Monaco X-Patchwork-Id: 14038222 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 314CC19E804 for ; Fri, 4 Apr 2025 08:46:01 +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=1743756364; cv=none; b=P7DA/E0kz+Ik/L1r3GxJkD+Oicmq/2dMT1iICPIRVYZSV/KnpIGQQmAoiqK+YmNzuRtaRmSv1xFhEXpp36UDM5a0ISsIbrHNFTZuKA3iA3nBch5DZ0TZNJ0NlcE+uodjfMyWNUB3ei8rmp8PUTuYsnyj9Rxmlb4dlCDq22tQMd0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743756364; c=relaxed/simple; bh=55w/VlvPRY6e7SnqUOleIYymHuuR1CoCZShX5ta66N0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=m9KALyPEm+rXy5yxBGFqUwNt3vNnwq008JRk8unUWtWllf+vUtQFbqJiJnk+bjl2DDSRB0IQgvq99f1pXydKA1z2HKQOMuMTrTzaqMBkYSchRJRkFmz4+vkFkXWz+OxWBIlPPOn5eQVFH8IQlmV0FcpYzj7OPN+za+0if+TR9gw= 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=KlrqP44F; 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="KlrqP44F" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1743756360; 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=Uzpx/ks+8dU83bQ2k/Wg2tkl4O8ewZUp90aomwDKfgQ=; b=KlrqP44FunuBOFsV0sOKO4T2JJL+9GY+IGQFOPb/XpAP3QE4ETG3VOIhp1J7LqUHI4dcvi qvCD+L0NESkyd2MFO2aQINKgrt5tMy61ioTkXN623J7RTdI5dH/s5FwBCMbZ4NNzmw47UN WI2i49Bj4+Wiyz8C1wCUhbuRAqRfE6E= 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-472-6ulgx4waO4Ct2kLNXvwf3A-1; Fri, 04 Apr 2025 04:45:59 -0400 X-MC-Unique: 6ulgx4waO4Ct2kLNXvwf3A-1 X-Mimecast-MFC-AGG-ID: 6ulgx4waO4Ct2kLNXvwf3A_1743756358 Received: from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.93]) (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 3FDFD180AB19; Fri, 4 Apr 2025 08:45:58 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.44.32.143]) by mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id C86E3180B487; Fri, 4 Apr 2025 08:45:55 +0000 (UTC) From: Gabriele Monaco To: linux-kernel@vger.kernel.org, Steven Rostedt , linux-trace-kernel@vger.kernel.org Cc: Gabriele Monaco , Tomas Glozar , Juri Lelli Subject: [RFC PATCH 1/9] tools/rv: Do not skip idle in trace Date: Fri, 4 Apr 2025 10:45:14 +0200 Message-ID: <20250404084512.98552-12-gmonaco@redhat.com> In-Reply-To: <20250404084512.98552-11-gmonaco@redhat.com> References: <20250404084512.98552-11-gmonaco@redhat.com> Precedence: bulk X-Mailing-List: linux-trace-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.93 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_record *record, tep_get_common_field_val(s, trace_event, "common_pid", record, &pid, 1); - if (config_has_id && (config_my_pid == id)) + if (config_my_pid && config_has_id && (config_my_pid == id)) return 0; else if (config_my_pid && (config_my_pid == pid)) return 0; From patchwork Fri Apr 4 08:45:15 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gabriele Monaco X-Patchwork-Id: 14038223 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 CE5DD19F464 for ; Fri, 4 Apr 2025 08:46: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=1743756367; cv=none; b=qRSo78fwuclbNqKUE7OeOSinRkZ3LIorqtMxVrCnJxMtJtLJbVywiT6A1jBSrGqBcuds7OJO7fBLjHu2Qo/rNXvbsHzE8Smv/j5vBa/9lNA2VnwBSiBmS5asrYffSurK+Jmyp8bk85SGDCYJXLEtjMjurRL10NyIGjpLf6Tei3E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743756367; c=relaxed/simple; bh=kDPQ5ZDtDO3s2YDtV9Oer5kcdg1iqODZq/oZfrkiBvo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=eGQEShzs8Jg+7PW/h5drvJuXMekTycebPJqHhCMJx8TaWi5xhJJPIQK36fZ69FEagpHb2xL2b1l743MInYdR7T0prQrYtqsrt4JAqM+otXFmIH29y5RENLu0GF4EkYAeXlMmWYre3qZqqmqDpEbKV9qxQW4ikgiQqTQQOih2ik0= 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=R5+NcFnd; 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="R5+NcFnd" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1743756364; 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=CLCel9iAjZZG4s7xBpR+zx1yulVRAzFpunjZDLHlfjs=; b=R5+NcFnd5YHDW+vD04r8HAlHrNi6OYuJURYpwzbddJRR14SIpfOZByF4mkk0k/LYcvayeV y+8QemjgL5B978/anOYfnvYmHkOFU9rAtnBpTwL7PDyVn7V9NQ7+ja9BOrDpwmmpTVrYX3 C50t40eHWB6tKd+D9GbClJnttQ26XvQ= 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-223-DSNHYRumPearTfZjvfsRYg-1; Fri, 04 Apr 2025 04:46:03 -0400 X-MC-Unique: DSNHYRumPearTfZjvfsRYg-1 X-Mimecast-MFC-AGG-ID: DSNHYRumPearTfZjvfsRYg_1743756362 Received: from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.93]) (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 3C4171800A3C; Fri, 4 Apr 2025 08:46:02 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.44.32.143]) by mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 22717180A803; Fri, 4 Apr 2025 08:45:58 +0000 (UTC) From: Gabriele Monaco To: linux-kernel@vger.kernel.org, Steven Rostedt , linux-trace-kernel@vger.kernel.org Cc: Gabriele Monaco , Tomas Glozar , Juri Lelli Subject: [RFC PATCH 2/9] tools/rv: Stop gracefully also on SIGTERM Date: Fri, 4 Apr 2025 10:45:15 +0200 Message-ID: <20250404084512.98552-13-gmonaco@redhat.com> In-Reply-To: <20250404084512.98552-11-gmonaco@redhat.com> References: <20250404084512.98552-11-gmonaco@redhat.com> Precedence: bulk X-Mailing-List: linux-trace-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.93 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); rv_mon(argc - 1, &argv[1]); } From patchwork Fri Apr 4 08:45:16 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gabriele Monaco X-Patchwork-Id: 14038224 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 1C7601A316A for ; Fri, 4 Apr 2025 08:46: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=1743756373; cv=none; b=E9n+qBEjsTnaS+2iNY9YDF5KSsX2LY09XZfIHZGkwim9j130T+1hXey0ccuI5/4OH/8ZjfhqSU69aUz0VNUtK6HvRPD+t+08BVW+LpWCztMoWMM5hkDmuDXfwwM2m6cTDQyZparkVpKnpRkr4vrOMuV7eXfHI91nML2nv3cbp1A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743756373; c=relaxed/simple; bh=eJnl1IDXPMHE4BFMxSE9HokWMN2YU1QZDL/2eg5jclo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ilHM7bkC//kWqAK6WQ60NZF50jcMikbCoBMiTFjBwNE7FTYitp7ls4bpX27Ewu79mthJuldUmUkeNVg+jILq7f2FSmytGjYuf0JPfkKjXN3cu/j/E9xwJOgndu4fmyCvsz+QGjzEdrTU7QECMJH4NzOJApO9S4bk80hSDC3pI3c= 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=GWdlwUCm; 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="GWdlwUCm" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1743756369; 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=QBMs/wyhUSkjsE/bwHu1RCObYE8GV6mTJWFwAwDI6HQ=; b=GWdlwUCmMbTqo0uhxrNLGYOx5z6DstG4My1Z6l6n4WkYEhAmw0FRbHJGKNGKU0C3A54qMq OKlvyqQdBi34f7YbNwfwF8mi4ID9I1tM1zel8eYi4OlTIMPiJEkRz+PxH5wblUCdsF6xuG xD4jjwA+6z9GTg2j6HfFEhaWgC1a3gE= 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-527-yhMd20nnOtOOoQOSTQAiaQ-1; Fri, 04 Apr 2025 04:46:06 -0400 X-MC-Unique: yhMd20nnOtOOoQOSTQAiaQ-1 X-Mimecast-MFC-AGG-ID: yhMd20nnOtOOoQOSTQAiaQ_1743756365 Received: from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.93]) (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 9DB5B1956080; Fri, 4 Apr 2025 08:46:05 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.44.32.143]) by mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 24BA6180A803; Fri, 4 Apr 2025 08:46:02 +0000 (UTC) From: Gabriele Monaco To: linux-kernel@vger.kernel.org, Steven Rostedt , linux-trace-kernel@vger.kernel.org Cc: Gabriele Monaco , Tomas Glozar , Juri Lelli Subject: [RFC PATCH 3/9] rv: Add da_handle_start_run_event_ to per-task monitors Date: Fri, 4 Apr 2025 10:45:16 +0200 Message-ID: <20250404084512.98552-14-gmonaco@redhat.com> In-Reply-To: <20250404084512.98552-11-gmonaco@redhat.com> References: <20250404084512.98552-11-gmonaco@redhat.com> Precedence: bulk X-Mailing-List: linux-trace-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.93 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. 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 510c88bfabd43..215c3eb770ccc 100644 --- a/include/rv/da_monitor.h +++ b/include/rv/da_monitor.h @@ -512,6 +512,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_##name event) \ +{ \ + struct da_monitor *da_mon; \ + \ + if (!da_monitor_enabled_##name()) \ + return 0; \ + \ + da_mon = 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; \ } /* From patchwork Fri Apr 4 08:45:17 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gabriele Monaco X-Patchwork-Id: 14038225 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 1AFEE1A3A80 for ; Fri, 4 Apr 2025 08:46:12 +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=1743756374; cv=none; b=Cm+moGcQsPcGI/oYuZ3swVj9XSVZqLD4jBXonamFtF3mYVvoC4jxdCzEvcmOiw6mmMKBgIzZsZ4J4rV2dUO14RR8QOr3Bjq7UagB5i33IXlHkVmh1tWvJcDgrcufO7SrxLkxuw2Wey+xDw1/8vwVLha0AmoTK5wHvmkyxTf7q7c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743756374; c=relaxed/simple; bh=JjchyDx9ZDuNSkR7gg0EQJ1XnonzrcsHfZUIM0eKyAs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qAZiHx3mRxVilyAY7BDY6IXbCMschHOs340AAGvTYHxPi5fUv6hXfp+nfnGcDb4D6ebjmBhwWLQX6NtRPTrdYWTcuMlrKCv7WhX2RThqcFhFzAQqXZz4ThrbTmahsPNny7wymCIagKgdyJCY1OzWMG3KP2TcDsvpALIe0IYTqEU= 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=HnJZfSgQ; 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="HnJZfSgQ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1743756371; 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=DBkQV5qy9pCoK2ZfSIURClvOop1gu95J9WdLQljvT3w=; b=HnJZfSgQmfJHwSQc2yxv6Vzo1UJKtu75IHzdiAzWlE6OJg8fmOhFX+/oCDBJmrwkwAaxa2 +jaVo0rDFQyRjuV42deBVEYpqIqMQJdt+NTpXDBb7rTvOF/CS1wabCP8WYx0wntm9Binkl 3dXT6+PR1K8PBxlh0qHV1ZkxIs+0VcY= 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-601-z62EZGUmMdyGk66058dG1A-1; Fri, 04 Apr 2025 04:46:10 -0400 X-MC-Unique: z62EZGUmMdyGk66058dG1A-1 X-Mimecast-MFC-AGG-ID: z62EZGUmMdyGk66058dG1A_1743756369 Received: from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.93]) (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 6FB1D1800361; Fri, 4 Apr 2025 08:46:09 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.44.32.143]) by mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 8514C180B487; Fri, 4 Apr 2025 08:46:06 +0000 (UTC) From: Gabriele Monaco To: linux-kernel@vger.kernel.org, Steven Rostedt , Masami Hiramatsu , linux-trace-kernel@vger.kernel.org Cc: Gabriele Monaco , Tomas Glozar , Juri Lelli Subject: [RFC PATCH 4/9] rv: Remove trailing whitespace from tracepoint string Date: Fri, 4 Apr 2025 10:45:17 +0200 Message-ID: <20250404084512.98552-15-gmonaco@redhat.com> In-Reply-To: <20250404084512.98552-11-gmonaco@redhat.com> References: <20250404084512.98552-11-gmonaco@redhat.com> Precedence: bulk X-Mailing-List: linux-trace-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.93 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)". 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 422b75f58891e..18fa0e358a30e 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 = final_state; ), - 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)" : "") ); DECLARE_EVENT_CLASS(error_da_monitor, @@ -90,12 +90,12 @@ DECLARE_EVENT_CLASS(event_da_monitor_id, __entry->final_state = final_state; ), - 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)" : "") ); DECLARE_EVENT_CLASS(error_da_monitor_id, From patchwork Fri Apr 4 08:45:18 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gabriele Monaco X-Patchwork-Id: 14038226 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 C4A441A9B58 for ; Fri, 4 Apr 2025 08:46:19 +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=1743756381; cv=none; b=fFvbYypfbjHY5uBMovtM2QlJfjmvNeTKHWnmfNg1ULfbjKZy5AaG1WogjcOV5BICVsPaxKuJfZB3Y20B2rTIGsgFfo/qSt6FWW7p44oAde6do+5SRDhODr2pQrX7ID4FpOfncqcT/hw2IdGOBdzB/xXUE05YLlIGExyNkNy0r1w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743756381; c=relaxed/simple; bh=wFfzs2yz6m4G+u1pOhU0+RQw8E1fFOBql4bI6XTMHCk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DBBsrifsLl896sddkAQNEh8VYhrIgHlIZtgPh8PwemlPrJDauVxSohQRLb2/+/3HGwx1pbapWTBXw5oeJvvtSzt4W3aO51RM+CvIdgCykf6smelvR4ZrYEIN2i3WLW6CmPsAhvf6NB0gXdxe0XselWgDsWhOLQVObT+CuzBzlWs= 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=Hn2Q0JpV; 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="Hn2Q0JpV" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1743756378; 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=l5M4AS5XQF4x0P7R9xaeq2+nOQNy0WXpZT4o++PKUQQ=; b=Hn2Q0JpVGEhl38+DDVI4Pwy6BmlLmeOXZskg0Nsz4owaOP+poNWGHLEwmTUhWggsnwT/PJ r4hphupUn/r0ZohugSFsrzqi5L+d4w+Uhy/TzspQxJBordBQ4aprRul2CBSURZwI2Yhtbo kCxexjbU4Hs14HSLUI0UrCjSN6Jdbmg= 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-498--qczUiBfML605vV7WJiKIw-1; Fri, 04 Apr 2025 04:46:15 -0400 X-MC-Unique: -qczUiBfML605vV7WJiKIw-1 X-Mimecast-MFC-AGG-ID: -qczUiBfML605vV7WJiKIw_1743756374 Received: from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.93]) (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 177FA1955DCD; Fri, 4 Apr 2025 08:46:14 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.44.32.143]) by mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 88109180B487; Fri, 4 Apr 2025 08:46:10 +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 , Tomas Glozar , Juri Lelli Subject: [RFC PATCH 5/9] sched: Add sched tracepoints for RV task model Date: Fri, 4 Apr 2025 10:45:18 +0200 Message-ID: <20250404084512.98552-16-gmonaco@redhat.com> In-Reply-To: <20250404084512.98552-11-gmonaco@redhat.com> References: <20250404084512.98552-11-gmonaco@redhat.com> Precedence: bulk X-Mailing-List: linux-trace-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.93 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 == next == tsk : no real context switch 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 | 8 ++++++++ kernel/sched/core.c | 9 +++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/include/linux/sched.h b/include/linux/sched.h index f96ac19828934..7bcd37493ab07 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -340,9 +340,11 @@ extern void io_schedule_finish(int token); extern long io_schedule_timeout(long timeout); extern void io_schedule(void); -/* 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); /** * struct prev_cputime - snapshot of system and user cputime @@ -2064,6 +2066,9 @@ static inline int test_tsk_thread_flag(struct task_struct *tsk, int flag) 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); } diff --git a/include/trace/events/sched.h b/include/trace/events/sched.h index 8994e97d86c13..77bbcce407cb4 100644 --- a/include/trace/events/sched.h +++ b/include/trace/events/sched.h @@ -835,6 +835,14 @@ DECLARE_TRACE_CONDITION(sched_set_state_tp, TP_ARGS(tsk, state), TP_CONDITION(!!(tsk->__state) != !!state)); +DECLARE_TRACE(sched_set_need_resched_tp, + TP_PROTO(struct task_struct *tsk, int cpu, int tif), + TP_ARGS(tsk, cpu, tif)); + +DECLARE_TRACE(sched_switch_vain_tp, + TP_PROTO(bool preempt, struct task_struct *tsk, unsigned int prev_state), + TP_ARGS(preempt, tsk, prev_state)); + #endif /* _TRACE_SCHED_H */ /* This part must be outside protection */ diff --git a/kernel/sched/core.c b/kernel/sched/core.c index cfaca3040b2f8..f2f79236d5811 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -1109,6 +1109,7 @@ static void __resched_curr(struct rq *rq, int tif) cpu = cpu_of(rq); + trace_sched_set_need_resched_tp(curr, cpu, tif); if (cpu == smp_processor_id()) { set_ti_thread_flag(cti, tif); if (tif == TIF_NEED_RESCHED) @@ -1124,6 +1125,13 @@ static void __resched_curr(struct rq *rq, int tif) } } +#ifdef CONFIG_SMP +void __trace_set_need_resched(struct task_struct *curr, int tif) +{ + trace_sched_set_need_resched_tp(curr, smp_processor_id(), tif); +} +#endif + void resched_curr(struct rq *rq) { __resched_curr(rq, TIF_NEED_RESCHED); @@ -6767,6 +6775,7 @@ static void __sched notrace __schedule(int sched_mode) rq = 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); } From patchwork Fri Apr 4 08:45:20 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gabriele Monaco X-Patchwork-Id: 14038227 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 E095A1A2642 for ; Fri, 4 Apr 2025 08:46: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=1743756390; cv=none; b=aynsYmlZlM+WC6Wsqa0YeLe+9v8VkJNg2IdPnRu41w1zg/R5nydTspeFfL0wqty4ogF/M6foekGX9wbOTuUIBPAXTpUnOQw+ru8/vi8PVxDIq6f2wQpfzMIgYG44jgWjMwPEbBFrpzCWHnIbYAFdH904mmP+FTNvbWoewcuDzb0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743756390; c=relaxed/simple; bh=SZvU7egjXghoL/RnbsoU/nT/gb88ljFNL/ngEWopfKM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cz86+n0yl6xReG5fB6JhDQjuVEwgWksK0UleGBCX+oJar6DMFstBn5gp9W7yrqLNJzq/jGLOOyy/jxE5oa+pnHZqO6m7iGD+MdgmYYgI+1Yon8GW0Qb17q75+VNjlsQnNOCsubGpTJ4FGJD7ZomFivRHY42un0DsHQ2ICWYLzbs= 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=PXY9Hg3r; 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="PXY9Hg3r" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1743756387; 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=+X+wvHGgRr0/6hdLnM/iH2SYIDCu1Kzb4GvWEHzuUBc=; b=PXY9Hg3r9LNWdJxhnaLDhLFV7UInanqkHvmCtpUigJokCWQa3eepB//jfPMt3lIVl7DyFY Z27hvcbAQPgVF1txN6TtBY8hHcwC+nI/6mC7UxO7wMLl8LlmPonISJqGwS0+P1NTLCwOtS e99YPrI5cGkr7MCYji+yN3WFlvHd+gg= Received: from mx-prod-mc-03.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-90-CUE0qfPQPRWaLOPa5xyOwg-1; Fri, 04 Apr 2025 04:46:24 -0400 X-MC-Unique: CUE0qfPQPRWaLOPa5xyOwg-1 X-Mimecast-MFC-AGG-ID: CUE0qfPQPRWaLOPa5xyOwg_1743756383 Received: from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.93]) (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-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 98B3F19560BC; Fri, 4 Apr 2025 08:46:23 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.44.32.143]) by mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id C2E671828A9F; Fri, 4 Apr 2025 08:46:19 +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 , Tomas Glozar , Juri Lelli Subject: [RFC PATCH 7/9] rv: Retry when da monitor detects race conditions Date: Fri, 4 Apr 2025 10:45:20 +0200 Message-ID: <20250404084512.98552-18-gmonaco@redhat.com> In-Reply-To: <20250404084512.98552-11-gmonaco@redhat.com> References: <20250404084512.98552-11-gmonaco@redhat.com> Precedence: bulk X-Mailing-List: linux-trace-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.93 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). 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 | 53 +++++++++++++++++++++++++++++++---------- 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/include/linux/rv.h b/include/linux/rv.h index 3452b5e4b29e7..a83a81ac6e466 100644 --- a/include/linux/rv.h +++ b/include/linux/rv.h @@ -7,7 +7,8 @@ #ifndef _LINUX_RV_H #define _LINUX_RV_H -#define MAX_DA_NAME_LEN 32 +#define MAX_DA_NAME_LEN 32 +#define MAX_DA_RETRY_RACING_EVENTS 3 #ifdef CONFIG_RV /* diff --git a/include/rv/da_monitor.h b/include/rv/da_monitor.h index 215c3eb770ccc..8b714e3085a55 100644 --- a/include/rv/da_monitor.h +++ b/include/rv/da_monitor.h @@ -82,16 +82,19 @@ static inline void da_monitor_reset_##name(struct da_monitor *da_mon) \ */ \ static inline type da_monitor_curr_state_##name(struct da_monitor *da_mon) \ { \ - return da_mon->curr_state; \ + return READ_ONCE(da_mon->curr_state); \ } \ \ /* \ * da_monitor_set_state_##name - set the new current state \ + * \ + * return false without the change in case the state was modified elsewhere \ */ \ -static inline void \ -da_monitor_set_state_##name(struct da_monitor *da_mon, enum states_##name state) \ +static inline bool \ +da_monitor_set_state_##name(struct da_monitor *da_mon, enum states_##name prev_state, \ + enum states_##name state) \ { \ - da_mon->curr_state = state; \ + return try_cmpxchg(&da_mon->curr_state, &prev_state, state); \ } \ \ /* \ @@ -150,17 +153,29 @@ static inline bool da_monitor_handling_event_##name(struct 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. Examples * 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 should + * 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 = da_monitor_curr_state_##name(da_mon); \ - type next_state = model_get_next_state_##name(curr_state, event); \ + bool changed; \ + type curr_state, next_state; \ \ - if (next_state != INVALID_STATE) { \ - da_monitor_set_state_##name(da_mon, next_state); \ + for (int i = 0; i < MAX_DA_RETRY_RACING_EVENTS; i++) { \ + curr_state = da_monitor_curr_state_##name(da_mon); \ + next_state = model_get_next_state_##name(curr_state, event); \ + if (next_state == INVALID_STATE) \ + break; \ + changed = da_monitor_set_state_##name(da_mon, curr_state, next_state); \ + if (unlikely(!changed)) { \ + curr_state = -1; \ + continue; \ + } \ \ trace_event_##name(model_get_state_name_##name(curr_state), \ model_get_event_name_##name(event), \ @@ -181,17 +196,29 @@ da_event_##name(struct da_monitor *da_mon, enum events_##name event) \ /* * 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 should + * 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 = da_monitor_curr_state_##name(da_mon); \ - type next_state = model_get_next_state_##name(curr_state, event); \ - \ - if (next_state != INVALID_STATE) { \ - da_monitor_set_state_##name(da_mon, next_state); \ + bool changed; \ + type curr_state, next_state; \ + \ + for (int i = 0; i < MAX_DA_RETRY_RACING_EVENTS; i++) { \ + curr_state = da_monitor_curr_state_##name(da_mon); \ + next_state = model_get_next_state_##name(curr_state, event); \ + if (next_state == INVALID_STATE) \ + break; \ + changed = da_monitor_set_state_##name(da_mon, curr_state, next_state); \ + if (unlikely(!changed)) { \ + curr_state = -1; \ + continue; \ + } \ \ trace_event_##name(tsk->pid, \ model_get_state_name_##name(curr_state), \ From patchwork Fri Apr 4 08:45:21 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gabriele Monaco X-Patchwork-Id: 14038228 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 786101AF0A7 for ; Fri, 4 Apr 2025 08:46: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=1743756399; cv=none; b=gCL8/MwJebHbxlZ2/xejtelbMz/pOc0L1I6GUUYoQRB3yypPtzTLCGJsOlYspHhVDklDuXr2rtmhqQZ87bS1d1Ts0AOMxtonb84Chezek4kjMtCoG4oQRW2uThwGPXXafd4fRip9D/A17gBb5W7ZRhOCY3bWA30zCc8G9Bpg4tQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743756399; c=relaxed/simple; bh=EC2qLD3yAqT9hmPSQkMhT0qXr1pMBO6vYWsBJYi/6Kk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=liRtJi7imyU75ywVepEDBnvXY7OyDpETtlJfBjnTMlTw0hCcTdp06qAYJ12liR1GgqD3B+Zp61FikMtz2Een2dlTpTC4+wis0YQZ0DLBB/giFozGraePyrfHSeCmhCLuA1jDLlCxhBzQoBTpt8Srqo9akiDXT247ozSAOVl8f1o= 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=Vm99kKUk; 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="Vm99kKUk" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1743756395; 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=7VgUHqvVbcZ3hwyo97/1UdgAimaq/eLN4hqPXuIKJcs=; b=Vm99kKUkvyc4Ry2o/eIbUW4RuPypQXHt0XmCwuWMts0J6fbNKR0CFRwBLBLUJ0Yew+Z6ko CAmKapXBkM1yHjlYEYfEGSPr9CorzIUoRxWT8WbRNz/Ry4EpAXTaRqfCWsI8qIbxezuucL 1wkYovO/jzMogi9IYdRBrBaTKf5PJso= 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-653-A223c62CM-CR7PhUmAmBUw-1; Fri, 04 Apr 2025 04:46:32 -0400 X-MC-Unique: A223c62CM-CR7PhUmAmBUw-1 X-Mimecast-MFC-AGG-ID: A223c62CM-CR7PhUmAmBUw_1743756391 Received: from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.93]) (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 DE83B195608B; Fri, 4 Apr 2025 08:46:30 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.44.32.143]) by mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id D43D0180B487; Fri, 4 Apr 2025 08:46:25 +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 , Tomas Glozar , Juri Lelli Subject: [RFC PATCH 8/9] rv: Replace tss monitor with more complete sts Date: Fri, 4 Apr 2025 10:45:21 +0200 Message-ID: <20250404084512.98552-19-gmonaco@redhat.com> In-Reply-To: <20250404084512.98552-11-gmonaco@redhat.com> References: <20250404084512.98552-11-gmonaco@redhat.com> Precedence: bulk X-Mailing-List: linux-trace-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.93 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 | 118 ++++++++++++++++++ kernel/trace/rv/monitors/sts/sts.h | 62 +++++++++ .../{tss/tss_trace.h => sts/sts_trace.h} | 8 +- kernel/trace/rv/monitors/tss/Kconfig | 14 --- kernel/trace/rv/monitors/tss/tss.c | 91 -------------- 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, 282 insertions(+), 197 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 => 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 24b2c62a3bc26..641e70e359aaa 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]. Currently we included the following: -Monitor tss -~~~~~~~~~~~ - -The task switch while scheduling (tss) monitor ensures a task switch happens -only in scheduling context, that is inside a call to `__schedule`:: - - | - | - v - +-----------------+ - | thread | <+ - +-----------------+ | - | | - | schedule_entry | schedule_exit - v | - sched_switch | - +--------------- | - | sched | - +--------------> -+ - Monitor sco ~~~~~~~~~~~ @@ -165,6 +145,54 @@ schedule is not called with interrupt disabled:: | cant_sched -+ +Monitor sts +~~~~~~~~~~~ + +The schedule implies task switch (sts) monitor ensures a task switch happens 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 disabled. +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 fact no +real task switch occurs:: + + | + | + v + #====================# irq_disable + H H irq_enable + H thread H --------------+ + H H | + +-------------> H H <-------------+ + | #====================# + | | + | | 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 ---------- diff --git a/kernel/trace/rv/Kconfig b/kernel/trace/rv/Kconfig index b39f36013ef23..a53a3eca9616d 100644 --- a/kernel/trace/rv/Kconfig +++ b/kernel/trace/rv/Kconfig @@ -28,12 +28,12 @@ menuconfig RV 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" 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 monitors here config RV_REACTORS diff --git a/kernel/trace/rv/Makefile b/kernel/trace/rv/Makefile index f9b2cd0483c3c..c609b72275cb8 100644 --- a/kernel/trace/rv/Makefile +++ b/kernel/trace/rv/Makefile @@ -6,12 +6,12 @@ obj-$(CONFIG_RV) += rv.o obj-$(CONFIG_RV_MON_WIP) += monitors/wip/wip.o obj-$(CONFIG_RV_MON_WWNR) += monitors/wwnr/wwnr.o obj-$(CONFIG_RV_MON_SCHED) += monitors/sched/sched.o -obj-$(CONFIG_RV_MON_TSS) += monitors/tss/tss.o obj-$(CONFIG_RV_MON_SCO) += monitors/sco/sco.o obj-$(CONFIG_RV_MON_SNROC) += monitors/snroc/snroc.o obj-$(CONFIG_RV_MON_SCPD) += monitors/scpd/scpd.o obj-$(CONFIG_RV_MON_SNEP) += monitors/snep/snep.o obj-$(CONFIG_RV_MON_SNCID) += monitors/sncid/sncid.o +obj-$(CONFIG_RV_MON_STS) += monitors/sts/sts.o # Add new monitors here obj-$(CONFIG_RV_REACTORS) += rv_reactors.o obj-$(CONFIG_RV_REACT_PRINTK) += reactor_printk.o diff --git a/kernel/trace/rv/monitors/sts/Kconfig b/kernel/trace/rv/monitors/sts/Kconfig new file mode 100644 index 0000000000000..5b486dac3f10f --- /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 IRQSOFF_TRACER + 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..0a3ed35bfe894 --- /dev/null +++ b/kernel/trace/rv/monitors/sts/sts.c @@ -0,0 +1,118 @@ +// 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 = 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_vain); + 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 = 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_vain); + 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 = { + .name = "sts", + .description = "schedule implies task switch.", + .enable = enable_sts, + .disable = disable_sts, + .reset = da_monitor_reset_all_sts, + .enabled = 0, +}; + +static int __init register_sts(void) +{ + rv_register_monitor(&rv_sts, &rv_sched); + return 0; +} + +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..6921c00422930 --- /dev/null +++ b/kernel/trace/rv/monitors/sts/sts.h @@ -0,0 +1,62 @@ +/* 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 = 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 = 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 = { + .state_names = { + "thread", + "disable_to_switch", + "enable_to_exit", + "scheduling", + "switching" + }, + .event_names = { + "irq_disable", + "irq_enable", + "sched_switch", + "sched_switch_vain", + "schedule_entry", + "schedule_exit" + }, + .function = { + { 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 = thread_sts, + .final_states = { 1, 0, 0, 0, 0 }, +}; diff --git a/kernel/trace/rv/monitors/tss/tss_trace.h b/kernel/trace/rv/monitors/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 */ -#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_state), TP_ARGS(state, event, next_state, final_state)); -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/monitors/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 542787e6524fc..0000000000000 --- a/kernel/trace/rv/monitors/tss/tss.c +++ /dev/null @@ -1,91 +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 = 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 = 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 = { - .name = "tss", - .description = "task switch while scheduling.", - .enable = enable_tss, - .disable = disable_tss, - .reset = da_monitor_reset_all_tss, - .enabled = 0, -}; - -static int __init register_tss(void) -{ - rv_register_monitor(&rv_tss, &rv_sched); - return 0; -} - -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 = 0, - sched_tss, - state_max_tss -}; - -#define INVALID_STATE state_max_tss - -enum events_tss { - sched_switch_tss = 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 = { - .state_names = { - "thread", - "sched" - }, - .event_names = { - "sched_switch", - "schedule_entry", - "schedule_exit" - }, - .function = { - { INVALID_STATE, sched_tss, INVALID_STATE }, - { sched_tss, INVALID_STATE, thread_tss }, - }, - .initial_state = thread_tss, - .final_states = { 1, 0 }, -}; diff --git a/kernel/trace/rv/rv_trace.h b/kernel/trace/rv/rv_trace.h index 18fa0e358a30e..a5e1c52e29926 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, ); #include -#include #include #include #include #include +#include // Add new monitors based on CONFIG_DA_MON_EVENTS_IMPLICIT here #endif /* CONFIG_DA_MON_EVENTS_IMPLICIT */ diff --git a/tools/verification/models/sched/sts.dot b/tools/verification/models/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 = true; + size = "7,11"; + {node [shape = circle] "disable_to_switch"}; + {node [shape = circle] "enable_to_exit"}; + {node [shape = circle] "scheduling"}; + {node [shape = circle] "switching"}; + {node [shape = plaintext, style=invis, label=""] "__init_thread"}; + {node [shape = doublecircle] "thread"}; + {node [shape = circle] "thread"}; + "__init_thread" -> "thread"; + "disable_to_switch" [label = "disable_to_switch"]; + "disable_to_switch" -> "scheduling" [ label = "irq_enable" ]; + "disable_to_switch" -> "switching" [ label = "sched_switch\nsched_switch_vain" ]; + "enable_to_exit" [label = "enable_to_exit"]; + "enable_to_exit" -> "enable_to_exit" [ label = "irq_disable\nirq_enable" ]; + "enable_to_exit" -> "thread" [ label = "schedule_exit" ]; + "scheduling" [label = "scheduling"]; + "scheduling" -> "disable_to_switch" [ label = "irq_disable" ]; + "switching" [label = "switching"]; + "switching" -> "enable_to_exit" [ label = "irq_enable" ]; + "thread" [label = "thread", color = green3]; + "thread" -> "scheduling" [ label = "schedule_entry" ]; + "thread" -> "thread" [ label = "irq_disable\nirq_enable" ]; + { rank = min ; + "__init_thread"; + "thread"; + } +} diff --git a/tools/verification/models/sched/tss.dot b/tools/verification/models/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 = true; - size = "7,11"; - {node [shape = plaintext] "sched"}; - {node [shape = plaintext, style=invis, label=""] "__init_thread"}; - {node [shape = ellipse] "thread"}; - {node [shape = plaintext] "thread"}; - "__init_thread" -> "thread"; - "sched" [label = "sched"]; - "sched" -> "sched" [ label = "sched_switch" ]; - "sched" -> "thread" [ label = "schedule_exit" ]; - "thread" [label = "thread", color = green3]; - "thread" -> "sched" [ label = "schedule_entry" ]; - { rank = min ; - "__init_thread"; - "thread"; - } -} From patchwork Fri Apr 4 08:45:22 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gabriele Monaco X-Patchwork-Id: 14038229 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 629671A2381 for ; Fri, 4 Apr 2025 08:46:42 +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=1743756406; cv=none; b=rXSkzlfBH5wz8rJYBUfhdaV9cl9V1BfBu4tg3ETO4lvNxQ1n3CQ9SnSSCzvE1nP0AUjaarF0MiOXeyrVDcWUOO//Ti9LvIoiSqe0smderaNkJtAa1eRzqIKXWwdiaiLfuMSRa8/LjdTmJRv87/KP1U3zfm6QwohZzUuMKnexryI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743756406; c=relaxed/simple; bh=i50gM4tT7IX3sEifqfq8pGEWMGHVZQ+2c+EUAQaVzsY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AKeijZXsjzdbFy33UPSjiiUgU8TYCMPraFNXV5wR94zWzWyrqAyfe0+aKivUWQX5iyG4peEaViW6isnu2wF1w1AGSKQxQ1B4wpkm0RzJJ7vAfZQhchimRiDNhexHAMuK9ezyi3ZYafWx9hFbLXNPdynnD3usXQkUS851SUlUUHM= 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=Kzgalc2w; 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="Kzgalc2w" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1743756401; 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=RHoXIcEPqV4uyZhMjS0Q0v//R28OV1XzZQ86XVfDjxo=; b=Kzgalc2wFC9OAq1AJrrotfrZ7zpmOk2Ze5b+5l+w9ATNif/HfwDISSLKb9X2Q6tvXAfGGA D3r7OFdLpOqJVhqlpGrgCxByP9DzUCN2Im6zFHTQWGLoq2wpOIsyvKot1I+rVLfUSNX0m3 YsQLenDZkpOr5bULKln0fjThurcTd+Y= Received: from mx-prod-mc-03.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-19-gcht6rFmNHGeeDtYtC7HNQ-1; Fri, 04 Apr 2025 04:46:39 -0400 X-MC-Unique: gcht6rFmNHGeeDtYtC7HNQ-1 X-Mimecast-MFC-AGG-ID: gcht6rFmNHGeeDtYtC7HNQ_1743756398 Received: from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.93]) (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-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 0F6BD1954B33; Fri, 4 Apr 2025 08:46:38 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.44.32.143]) by mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 23B9A180A803; Fri, 4 Apr 2025 08:46: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 , Tomas Glozar , Juri Lelli Subject: [RFC PATCH 9/9] rv: Add srs per-task monitor Date: Fri, 4 Apr 2025 10:45:22 +0200 Message-ID: <20250404084512.98552-20-gmonaco@redhat.com> In-Reply-To: <20250404084512.98552-11-gmonaco@redhat.com> References: <20250404084512.98552-11-gmonaco@redhat.com> Precedence: bulk X-Mailing-List: linux-trace-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.93 Add a per-task monitor for task switches as part of the sched model: * srs: Monitor to describe conditions for different types of task switch. This monitor enforces rules such as preempt after setting need for reschedule and suspend after setting a task to sleepable. This new monitor implies the previously introduced snroc (set non runnable on its own context), so replace that monitor with srs. Cc: Ingo Molnar Cc: Peter Zijlstra Signed-off-by: Gabriele Monaco --- Documentation/trace/rv/monitor_sched.rst | 169 +++++++++++++++--- kernel/trace/rv/Kconfig | 2 +- kernel/trace/rv/Makefile | 2 +- kernel/trace/rv/monitors/snroc/snroc.c | 85 --------- kernel/trace/rv/monitors/snroc/snroc.h | 47 ----- .../trace/rv/monitors/{snroc => srs}/Kconfig | 8 +- kernel/trace/rv/monitors/srs/srs.c | 135 ++++++++++++++ kernel/trace/rv/monitors/srs/srs.h | 87 +++++++++ .../{snroc/snroc_trace.h => srs/srs_trace.h} | 8 +- kernel/trace/rv/rv_trace.h | 2 +- tools/verification/models/sched/snroc.dot | 18 -- tools/verification/models/sched/srs.dot | 61 +++++++ 12 files changed, 443 insertions(+), 181 deletions(-) delete mode 100644 kernel/trace/rv/monitors/snroc/snroc.c delete mode 100644 kernel/trace/rv/monitors/snroc/snroc.h rename kernel/trace/rv/monitors/{snroc => srs}/Kconfig (52%) create mode 100644 kernel/trace/rv/monitors/srs/srs.c create mode 100644 kernel/trace/rv/monitors/srs/srs.h rename kernel/trace/rv/monitors/{snroc/snroc_trace.h => srs/srs_trace.h} (67%) delete mode 100644 tools/verification/models/sched/snroc.dot create mode 100644 tools/verification/models/sched/srs.dot diff --git a/Documentation/trace/rv/monitor_sched.rst b/Documentation/trace/rv/monitor_sched.rst index 641e70e359aaa..c1516b71b8e73 100644 --- a/Documentation/trace/rv/monitor_sched.rst +++ b/Documentation/trace/rv/monitor_sched.rst @@ -61,27 +61,6 @@ happen only in thread context:: | scheduling_context -+ -Monitor snroc -~~~~~~~~~~~~~ - -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-task -monitor:: - - | - | - v - +------------------+ - | other_context | <+ - +------------------+ | - | | - | sched_switch_in | sched_switch_out - v | - sched_set_state | - +------------------ | - | own_context | - +-----------------> -+ - Monitor scpd ~~~~~~~~~~~~ @@ -193,6 +172,154 @@ real task switch occurs:: +-------------- | | <-------------+ +--------------------+ +Monitor srs +----------- + +The switch after resched or sleep (srs) monitor describes conditions for +different types of task switch. This is a complex model, below we are going to +explain it step by step. Unfortunately splitting this into smaller monitor is +not trivial due to some shared events such as ``switch_in``:: + + set_runnable + | wakeup +---+ + | switch_vain | | + v | v wakeup + #================================================# set_runnable + switch_in H H <----------+ + +------------------> H running H | + | H H -----+ | + | #================================================# | | + | | | | ^ ^ | | + | | switch_yield need_resched | | | | + | | | need_resched_lazy | | | | + | set_sleepable v | | | | | + | | +-------------+ | | | | | + | +--------+----> | preempted | ---+- switch_in | | | + | | | +-------------+ | | | | + | switch_preempt | | | | | | + | switch_yield | need_resched | +- switch_vain | | + | | | v | | | | + | | | +-------------+ | | | | + | need_resched -+--------+----> | resched_out | | | | | + | | | | +-------------+ | | | | + | | | | | | | need_resched | | + | | | | switch_in | | wakeup | | + | | | | v v | set_runnable | | + | | | | +--------------------------+ -------+ | | + | | | | | | | | | + | | +--------+----- | rescheduling | <------+ | | + | | | | | | | + | | | +--------------------------+ -----------+ | | + | | | | ^ wakeup | | | + | | | set_sleepable set_runnable | | | + | | | v | | | | + | | +------------------+----- +---------------------------+ | | | + | | | | | | | | | + +--+--+---+------------------+----> | resched_sleepable | ---+ | | | + | | | | | | | | | | | + | | | | +-------------+----> +---------------------------+ | | | | + | | | | | | | ^ | | | | | + | | | | | | switch_preempt | need_resched | | | | + | | | | | | | | set_sleepable | | | | + | | | | | | v +------+ | | | | + | | | | | | +---------------------------+ --+------+---+-----+--+ + | | | | | | | preempted_sleepable | | | | | | + | | | | | | +---------------------------+ --+------+---+--+ | | + | | | | | | | ^ | | | | | | + | | | | | | switch_in switch_preempt | | | | | | + | | | | | | v | switch_vain | | | | | + | | | | | | +-------------------------+ | | | | | | + | | | | | +------> | | <--+ | | | | | + | | | | | | sleepable | | | | | | + | | | | +- need_resched------- | | ----------+---+--+--+ | + | | | | need_resched_lazy +-------------------------+ | | | | + | | | | | ^ | switch_block | | | + | | | | | | set_sleepable | | | | + | | | | switch_block | switch_vain +----------+ | | | + | | | | switch_suspend +------+ | | | | + | | | | v v | | | + | | | | switch_block +-----------------------------+ switch_block | | + | | | +-switch_suspend--------> | sleeping | <-----------+ | | + | | | +-----------------------------+ | | + | | | | wakeup | | + | | | v | | + | | +- need_resched ------------- +-------------+ wakeup | | + | | | waking | <------------------------------+ | + | +------------------------------- +-------------+ | + | | + | +-----------------------+ | + +----- switch_in -------- | resched_out_sleepable | <-- sched_need_resched --------------+ + +-----------------------+ + +Types of switches: + +* ``switch_in``: + a non running task is scheduled in, this leads to ``running`` if the task is + runnable and ``sleepable`` if the task was preempted before sleeping. +* ``switch_suspend``: + a task puts itself to sleep, this can happen only after explicitly setting + the task to ``sleepable``. After a task is suspended, it needs to be woken up + (``waking`` state) before being switched in again. The task can be set to + ``resched_sleepable`` via a ``need_resched`` but not preempted, in which case it + is equivalent to ``sleepable``. + Setting the task's state to ``sleepable`` can be reverted before switching 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 set + 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 limitation of + the model in SMP system and workarounds may require to slow down the + scheduler. +* ``switch_yield``: + a task explicitly calls the scheduler, this looks like a preemption as the + 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. +* ``switch_preempt``: + a task is ``preempted``, this can happen after the need for ``rescheduling`` + has been set, also in its ``lazy`` flavour. ``need_resched`` can be set as a + flag to the task or in the per-core preemption count, either of them can + trigger a preemption. + The task was previously running and can be switched in directly, but it is + possible that a task is preempted after it sets itself as ``sleepable`` + (``preempted_sleepable``), in this condition, once the task is switched back + in, it will not be ``running`` but continue its sleeping process in + ``sleepable``. +* ``switch_vain``: + a task goes through the scheduler but it is picked as the next task to run, + hence no real task switch occurs. Since we run the scheduler, this clears the + need to reschedule. + +The ``resched_out`` state (``resched_out_sleepable`` if the task is sleepable) +is a special case reached if the ``need_resched`` is set after picking the next +task but before switching. In this case, the previous task is switched out +normally but once it switches in, it can be preempted in ``rescheduling``. This +can happen, for instance, when a task disables migration and we do a +dequeue/enqueue before actually switching out. + +This monitor has several events that can race with each other, for instance if +running from multiple CPUs (e.g. ``need_resched`` and ``wakeup`` can occur from +a remote CPU), we need to account for them in any possible order. + +This monitor allows set state (runnable or sleepable) only in states +``running``, ``rescheduling``, ``resched_sleepable``, and ``sleepable``, and +not for states where the task is ``sleeping`` or ``preempted``. This implies +the set state event occurs only in the task's context:: + + | + | + v + +------------------+ + | other_context | <+ + +------------------+ | + | | + | switch_in | switch_out + v | + sched_set_state | + +------------------ | + | own_context | + +-----------------> -+ + References ---------- diff --git a/kernel/trace/rv/Kconfig b/kernel/trace/rv/Kconfig index a53a3eca9616d..f296095f1df28 100644 --- a/kernel/trace/rv/Kconfig +++ b/kernel/trace/rv/Kconfig @@ -29,11 +29,11 @@ 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/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" +source "kernel/trace/rv/monitors/srs/Kconfig" # Add new monitors here config RV_REACTORS diff --git a/kernel/trace/rv/Makefile b/kernel/trace/rv/Makefile index c609b72275cb8..5aba1d85ad662 100644 --- a/kernel/trace/rv/Makefile +++ b/kernel/trace/rv/Makefile @@ -7,11 +7,11 @@ obj-$(CONFIG_RV_MON_WIP) += monitors/wip/wip.o obj-$(CONFIG_RV_MON_WWNR) += monitors/wwnr/wwnr.o obj-$(CONFIG_RV_MON_SCHED) += monitors/sched/sched.o obj-$(CONFIG_RV_MON_SCO) += monitors/sco/sco.o -obj-$(CONFIG_RV_MON_SNROC) += monitors/snroc/snroc.o obj-$(CONFIG_RV_MON_SCPD) += monitors/scpd/scpd.o obj-$(CONFIG_RV_MON_SNEP) += monitors/snep/snep.o obj-$(CONFIG_RV_MON_SNCID) += monitors/sncid/sncid.o obj-$(CONFIG_RV_MON_STS) += monitors/sts/sts.o +obj-$(CONFIG_RV_MON_SRS) += monitors/srs/srs.o # Add new monitors here obj-$(CONFIG_RV_REACTORS) += rv_reactors.o obj-$(CONFIG_RV_REACT_PRINTK) += reactor_printk.o diff --git a/kernel/trace/rv/monitors/snroc/snroc.c b/kernel/trace/rv/monitors/snroc/snroc.c deleted file mode 100644 index bb1f60d552960..0000000000000 --- a/kernel/trace/rv/monitors/snroc/snroc.c +++ /dev/null @@ -1,85 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -#include -#include -#include -#include -#include -#include -#include -#include - -#define MODULE_NAME "snroc" - -#include -#include -#include - -#include "snroc.h" - -static struct rv_monitor rv_snroc; -DECLARE_DA_MON_PER_TASK(snroc, unsigned char); - -static void handle_sched_set_state(void *data, struct task_struct *tsk, int state) -{ - da_handle_event_snroc(tsk, sched_set_state_snroc); -} - -static void handle_sched_switch(void *data, bool preempt, - struct task_struct *prev, - struct task_struct *next, - unsigned int prev_state) -{ - da_handle_start_event_snroc(prev, sched_switch_out_snroc); - da_handle_event_snroc(next, sched_switch_in_snroc); -} - -static int enable_snroc(void) -{ - int retval; - - retval = da_monitor_init_snroc(); - if (retval) - return retval; - - rv_attach_trace_probe("snroc", sched_set_state_tp, handle_sched_set_state); - rv_attach_trace_probe("snroc", sched_switch, handle_sched_switch); - - return 0; -} - -static void disable_snroc(void) -{ - rv_snroc.enabled = 0; - - rv_detach_trace_probe("snroc", sched_set_state_tp, handle_sched_set_state); - rv_detach_trace_probe("snroc", sched_switch, handle_sched_switch); - - da_monitor_destroy_snroc(); -} - -static struct rv_monitor rv_snroc = { - .name = "snroc", - .description = "set non runnable on its own context.", - .enable = enable_snroc, - .disable = disable_snroc, - .reset = da_monitor_reset_all_snroc, - .enabled = 0, -}; - -static int __init register_snroc(void) -{ - rv_register_monitor(&rv_snroc, &rv_sched); - return 0; -} - -static void __exit unregister_snroc(void) -{ - rv_unregister_monitor(&rv_snroc); -} - -module_init(register_snroc); -module_exit(unregister_snroc); - -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Gabriele Monaco "); -MODULE_DESCRIPTION("snroc: set non runnable on its own context."); diff --git a/kernel/trace/rv/monitors/snroc/snroc.h b/kernel/trace/rv/monitors/snroc/snroc.h deleted file mode 100644 index c3650a2b1b107..0000000000000 --- a/kernel/trace/rv/monitors/snroc/snroc.h +++ /dev/null @@ -1,47 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Automatically generated C representation of snroc automaton - * For further information about this format, see kernel documentation: - * Documentation/trace/rv/deterministic_automata.rst - */ - -enum states_snroc { - other_context_snroc = 0, - own_context_snroc, - state_max_snroc -}; - -#define INVALID_STATE state_max_snroc - -enum events_snroc { - sched_set_state_snroc = 0, - sched_switch_in_snroc, - sched_switch_out_snroc, - event_max_snroc -}; - -struct automaton_snroc { - char *state_names[state_max_snroc]; - char *event_names[event_max_snroc]; - unsigned char function[state_max_snroc][event_max_snroc]; - unsigned char initial_state; - bool final_states[state_max_snroc]; -}; - -static const struct automaton_snroc automaton_snroc = { - .state_names = { - "other_context", - "own_context" - }, - .event_names = { - "sched_set_state", - "sched_switch_in", - "sched_switch_out" - }, - .function = { - { INVALID_STATE, own_context_snroc, INVALID_STATE }, - { own_context_snroc, INVALID_STATE, other_context_snroc }, - }, - .initial_state = other_context_snroc, - .final_states = { 1, 0 }, -}; diff --git a/kernel/trace/rv/monitors/snroc/Kconfig b/kernel/trace/rv/monitors/srs/Kconfig similarity index 52% rename from kernel/trace/rv/monitors/snroc/Kconfig rename to kernel/trace/rv/monitors/srs/Kconfig index 6e4365a2fea3b..a5b3998b32328 100644 --- a/kernel/trace/rv/monitors/snroc/Kconfig +++ b/kernel/trace/rv/monitors/srs/Kconfig @@ -1,13 +1,15 @@ # SPDX-License-Identifier: GPL-2.0-only # -config RV_MON_SNROC +config RV_MON_SRS depends on RV depends on RV_MON_SCHED default y select DA_MON_EVENTS_ID - bool "snroc monitor" + bool "srs monitor" help - Monitor to ensure sched_set_state happens only in the respective task's context. + Monitor to describe conditions for different types of task switch. + This monitor enforces rules such as preempt after setting need + for reschedule and suspend after setting a task to sleepable. This monitor is part of the sched monitors collection. For further information, see: diff --git a/kernel/trace/rv/monitors/srs/srs.c b/kernel/trace/rv/monitors/srs/srs.c new file mode 100644 index 0000000000000..3ea7419581e06 --- /dev/null +++ b/kernel/trace/rv/monitors/srs/srs.c @@ -0,0 +1,135 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include +#include +#include +#include +#include + +#define MODULE_NAME "srs" + +#include +#include +#include + +#include "srs.h" + +static struct rv_monitor rv_srs; +DECLARE_DA_MON_PER_TASK(srs, unsigned char); + +static void handle_sched_need_resched(void *data, struct task_struct *tsk, int cpu, int tif) +{ + if (tif == TIF_NEED_RESCHED) + da_handle_event_srs(tsk, sched_need_resched_srs); + else + da_handle_event_srs(tsk, sched_need_resched_lazy_srs); +} + +static void handle_schedule_entry(void *data, bool preempt, unsigned long ip) +{ + /* special case from preempt_enable */ + if (preempt && unlikely(!tif_need_resched() && test_preempt_need_resched())) + da_handle_event_srs(current, sched_need_resched_srs); +} + +static void handle_sched_set_state(void *data, struct task_struct *tsk, int state) +{ + if (state == TASK_RUNNING) + da_handle_event_srs(tsk, sched_set_state_runnable_srs); + else + da_handle_event_srs(tsk, sched_set_state_sleepable_srs); +} + +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_srs(prev, sched_switch_preempt_srs); + else if (prev_state == TASK_RUNNING) + da_handle_start_run_event_srs(prev, sched_switch_yield_srs); + else if (prev_state == TASK_RTLOCK_WAIT) + /* special case of sleeping task with racy conditions */ + da_handle_event_srs(prev, sched_switch_blocking_srs); + else + da_handle_event_srs(prev, sched_switch_suspend_srs); + /* switch in also leads to sleepable or rescheduling */ + if (task_is_running(next) && !test_tsk_thread_flag(next, TIF_NEED_RESCHED)) + da_handle_start_event_srs(next, sched_switch_in_srs); + else + da_handle_event_srs(next, sched_switch_in_srs); +} + +static void handle_sched_switch_vain(void *data, bool preempt, + struct task_struct *tsk, + unsigned int tsk_state) +{ + da_handle_event_srs(tsk, sched_switch_vain_srs); +} + +static void handle_sched_wakeup(void *data, struct task_struct *p) +{ + da_handle_event_srs(p, sched_wakeup_srs); +} + +static int enable_srs(void) +{ + int retval; + + retval = da_monitor_init_srs(); + if (retval) + return retval; + + rv_attach_trace_probe("srs", sched_set_need_resched_tp, handle_sched_need_resched); + rv_attach_trace_probe("srs", sched_set_state_tp, handle_sched_set_state); + rv_attach_trace_probe("srs", sched_switch, handle_sched_switch); + rv_attach_trace_probe("srs", sched_switch_vain_tp, handle_sched_switch_vain); + rv_attach_trace_probe("srs", sched_wakeup, handle_sched_wakeup); + rv_attach_trace_probe("srs", sched_entry_tp, handle_schedule_entry); + + return 0; +} + +static void disable_srs(void) +{ + rv_srs.enabled = 0; + + rv_detach_trace_probe("srs", sched_set_need_resched_tp, handle_sched_need_resched); + rv_detach_trace_probe("srs", sched_set_state_tp, handle_sched_set_state); + rv_detach_trace_probe("srs", sched_switch, handle_sched_switch); + rv_detach_trace_probe("srs", sched_switch_vain_tp, handle_sched_switch_vain); + rv_detach_trace_probe("srs", sched_wakeup, handle_sched_wakeup); + rv_detach_trace_probe("srs", sched_entry_tp, handle_schedule_entry); + + da_monitor_destroy_srs(); +} + +static struct rv_monitor rv_srs = { + .name = "srs", + .description = "switch after resched or sleep.", + .enable = enable_srs, + .disable = disable_srs, + .reset = da_monitor_reset_all_srs, + .enabled = 0, +}; + +static int __init register_srs(void) +{ + rv_register_monitor(&rv_srs, &rv_sched); + return 0; +} + +static void __exit unregister_srs(void) +{ + rv_unregister_monitor(&rv_srs); +} + +module_init(register_srs); +module_exit(unregister_srs); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Gabriele Monaco "); +MODULE_DESCRIPTION("srs: switch after resched or sleep."); diff --git a/kernel/trace/rv/monitors/srs/srs.h b/kernel/trace/rv/monitors/srs/srs.h new file mode 100644 index 0000000000000..ce2005880a105 --- /dev/null +++ b/kernel/trace/rv/monitors/srs/srs.h @@ -0,0 +1,87 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Automatically generated C representation of srs automaton + * For further information about this format, see kernel documentation: + * Documentation/trace/rv/deterministic_automata.rst + */ + +enum states_srs { + running_srs = 0, + preempted_srs, + preempted_sleepable_srs, + resched_out_srs, + resched_out_sleepable_srs, + resched_sleepable_srs, + rescheduling_srs, + sleepable_srs, + sleeping_srs, + waking_srs, + state_max_srs +}; + +#define INVALID_STATE state_max_srs + +enum events_srs { + sched_need_resched_srs = 0, + sched_need_resched_lazy_srs, + sched_set_state_runnable_srs, + sched_set_state_sleepable_srs, + sched_switch_blocking_srs, + sched_switch_in_srs, + sched_switch_preempt_srs, + sched_switch_suspend_srs, + sched_switch_vain_srs, + sched_switch_yield_srs, + sched_wakeup_srs, + event_max_srs +}; + +struct automaton_srs { + char *state_names[state_max_srs]; + char *event_names[event_max_srs]; + unsigned char function[state_max_srs][event_max_srs]; + unsigned char initial_state; + bool final_states[state_max_srs]; +}; + +static const struct automaton_srs automaton_srs = { + .state_names = { + "running", + "preempted", + "preempted_sleepable", + "resched_out", + "resched_out_sleepable", + "resched_sleepable", + "rescheduling", + "sleepable", + "sleeping", + "waking" + }, + .event_names = { + "sched_need_resched", + "sched_need_resched_lazy", + "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_yield", + "sched_wakeup" + }, + .function = { + { rescheduling_srs, rescheduling_srs, running_srs, sleepable_srs, sleeping_srs, INVALID_STATE, INVALID_STATE, INVALID_STATE, running_srs, preempted_srs, running_srs }, + { resched_out_srs, INVALID_STATE, INVALID_STATE, INVALID_STATE, INVALID_STATE, running_srs, INVALID_STATE, INVALID_STATE, INVALID_STATE, INVALID_STATE, INVALID_STATE }, + { resched_out_sleepable_srs, INVALID_STATE, INVALID_STATE, INVALID_STATE, INVALID_STATE, sleepable_srs, INVALID_STATE, INVALID_STATE, INVALID_STATE, INVALID_STATE, waking_srs }, + { INVALID_STATE, INVALID_STATE, INVALID_STATE, INVALID_STATE, INVALID_STATE, rescheduling_srs, INVALID_STATE, INVALID_STATE, INVALID_STATE, INVALID_STATE, INVALID_STATE }, + { INVALID_STATE, INVALID_STATE, INVALID_STATE, INVALID_STATE, INVALID_STATE, resched_sleepable_srs, INVALID_STATE, INVALID_STATE, INVALID_STATE, INVALID_STATE, INVALID_STATE }, + { resched_sleepable_srs, INVALID_STATE, rescheduling_srs, resched_sleepable_srs, sleeping_srs, INVALID_STATE, preempted_sleepable_srs, sleeping_srs, sleepable_srs, INVALID_STATE, rescheduling_srs }, + { rescheduling_srs, INVALID_STATE, rescheduling_srs, resched_sleepable_srs, sleeping_srs, INVALID_STATE, preempted_srs, INVALID_STATE, running_srs, preempted_srs, rescheduling_srs }, + { resched_sleepable_srs, resched_sleepable_srs, running_srs, sleepable_srs, sleeping_srs, INVALID_STATE, preempted_sleepable_srs, sleeping_srs, sleepable_srs, INVALID_STATE, running_srs }, + { INVALID_STATE, INVALID_STATE, INVALID_STATE, INVALID_STATE, INVALID_STATE, INVALID_STATE, INVALID_STATE, INVALID_STATE, INVALID_STATE, INVALID_STATE, waking_srs }, + { resched_out_srs, INVALID_STATE, INVALID_STATE, INVALID_STATE, INVALID_STATE, running_srs, INVALID_STATE, INVALID_STATE, INVALID_STATE, INVALID_STATE, INVALID_STATE }, + }, + .initial_state = running_srs, + .final_states = { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, +}; diff --git a/kernel/trace/rv/monitors/snroc/snroc_trace.h b/kernel/trace/rv/monitors/srs/srs_trace.h similarity index 67% rename from kernel/trace/rv/monitors/snroc/snroc_trace.h rename to kernel/trace/rv/monitors/srs/srs_trace.h index 50114cef51229..fd033de926542 100644 --- a/kernel/trace/rv/monitors/snroc/snroc_trace.h +++ b/kernel/trace/rv/monitors/srs/srs_trace.h @@ -4,12 +4,12 @@ * Snippet to be included in rv_trace.h */ -#ifdef CONFIG_RV_MON_SNROC -DEFINE_EVENT(event_da_monitor_id, event_snroc, +#ifdef CONFIG_RV_MON_SRS +DEFINE_EVENT(event_da_monitor_id, event_srs, TP_PROTO(int id, char *state, char *event, char *next_state, bool final_state), TP_ARGS(id, state, event, next_state, final_state)); -DEFINE_EVENT(error_da_monitor_id, error_snroc, +DEFINE_EVENT(error_da_monitor_id, error_srs, TP_PROTO(int id, char *state, char *event), TP_ARGS(id, state, event)); -#endif /* CONFIG_RV_MON_SNROC */ +#endif /* CONFIG_RV_MON_SRS */ diff --git a/kernel/trace/rv/rv_trace.h b/kernel/trace/rv/rv_trace.h index a5e1c52e29926..f6ead55484751 100644 --- a/kernel/trace/rv/rv_trace.h +++ b/kernel/trace/rv/rv_trace.h @@ -123,7 +123,7 @@ DECLARE_EVENT_CLASS(error_da_monitor_id, ); #include -#include +#include // Add new monitors based on CONFIG_DA_MON_EVENTS_ID here #endif /* CONFIG_DA_MON_EVENTS_ID */ diff --git a/tools/verification/models/sched/snroc.dot b/tools/verification/models/sched/snroc.dot deleted file mode 100644 index 8b71c32d4dca4..0000000000000 --- a/tools/verification/models/sched/snroc.dot +++ /dev/null @@ -1,18 +0,0 @@ -digraph state_automaton { - center = true; - size = "7,11"; - {node [shape = plaintext, style=invis, label=""] "__init_other_context"}; - {node [shape = ellipse] "other_context"}; - {node [shape = plaintext] "other_context"}; - {node [shape = plaintext] "own_context"}; - "__init_other_context" -> "other_context"; - "other_context" [label = "other_context", color = green3]; - "other_context" -> "own_context" [ label = "sched_switch_in" ]; - "own_context" [label = "own_context"]; - "own_context" -> "other_context" [ label = "sched_switch_out" ]; - "own_context" -> "own_context" [ label = "sched_set_state" ]; - { rank = min ; - "__init_other_context"; - "other_context"; - } -} diff --git a/tools/verification/models/sched/srs.dot b/tools/verification/models/sched/srs.dot new file mode 100644 index 0000000000000..8926e1ab59d98 --- /dev/null +++ b/tools/verification/models/sched/srs.dot @@ -0,0 +1,61 @@ +digraph state_automaton { + center = true; + size = "7,11"; + {node [shape = plaintext, style=invis, label=""] "__init_running"}; + {node [shape = doublecircle] "running"}; + {node [shape = circle] "preempted"}; + {node [shape = circle] "preempted_sleepable"}; + {node [shape = circle] "resched_out"}; + {node [shape = circle] "resched_out_sleepable"}; + {node [shape = circle] "resched_sleepable"}; + {node [shape = circle] "rescheduling"}; + {node [shape = circle] "running"}; + {node [shape = circle] "sleepable"}; + {node [shape = circle] "sleeping"}; + {node [shape = circle] "waking"}; + "__init_running" -> "running"; + "preempted" [label = "preempted"]; + "preempted" -> "resched_out" [ label = "sched_need_resched" ]; + "preempted" -> "running" [ label = "sched_switch_in" ]; + "preempted_sleepable" [label = "preempted_sleepable"]; + "preempted_sleepable" -> "resched_out_sleepable" [ label = "sched_need_resched" ]; + "preempted_sleepable" -> "sleepable" [ label = "sched_switch_in" ]; + "preempted_sleepable" -> "waking" [ label = "sched_wakeup" ]; + "resched_out" [label = "resched_out"]; + "resched_out" -> "rescheduling" [ label = "sched_switch_in" ]; + "resched_out_sleepable" [label = "resched_out_sleepable"]; + "resched_out_sleepable" -> "resched_sleepable" [ label = "sched_switch_in" ]; + "resched_sleepable" [label = "resched_sleepable"]; + "resched_sleepable" -> "preempted_sleepable" [ label = "sched_switch_preempt" ]; + "resched_sleepable" -> "resched_sleepable" [ label = "sched_need_resched\nsched_set_state_sleepable" ]; + "resched_sleepable" -> "rescheduling" [ label = "sched_wakeup\nsched_set_state_runnable" ]; + "resched_sleepable" -> "sleepable" [ label = "sched_switch_vain" ]; + "resched_sleepable" -> "sleeping" [ label = "sched_switch_suspend\nsched_switch_blocking" ]; + "rescheduling" [label = "rescheduling"]; + "rescheduling" -> "preempted" [ label = "sched_switch_preempt\nsched_switch_yield" ]; + "rescheduling" -> "resched_sleepable" [ label = "sched_set_state_sleepable" ]; + "rescheduling" -> "rescheduling" [ label = "sched_need_resched\nsched_wakeup\nsched_set_state_runnable" ]; + "rescheduling" -> "running" [ label = "sched_switch_vain" ]; + "rescheduling" -> "sleeping" [ label = "sched_switch_blocking" ]; + "running" [label = "running", color = green3]; + "running" -> "preempted" [ label = "sched_switch_yield" ]; + "running" -> "rescheduling" [ label = "sched_need_resched\nsched_need_resched_lazy" ]; + "running" -> "running" [ label = "sched_set_state_runnable\nsched_wakeup\nsched_switch_vain" ]; + "running" -> "sleepable" [ label = "sched_set_state_sleepable" ]; + "running" -> "sleeping" [ label = "sched_switch_blocking" ]; + "sleepable" [label = "sleepable"]; + "sleepable" -> "preempted_sleepable" [ label = "sched_switch_preempt" ]; + "sleepable" -> "resched_sleepable" [ label = "sched_need_resched\nsched_need_resched_lazy" ]; + "sleepable" -> "running" [ label = "sched_set_state_runnable\nsched_wakeup" ]; + "sleepable" -> "sleepable" [ label = "sched_set_state_sleepable\nsched_switch_vain" ]; + "sleepable" -> "sleeping" [ label = "sched_switch_suspend\nsched_switch_blocking" ]; + "sleeping" [label = "sleeping"]; + "sleeping" -> "waking" [ label = "sched_wakeup" ]; + "waking" [label = "waking"]; + "waking" -> "resched_out" [ label = "sched_need_resched" ]; + "waking" -> "running" [ label = "sched_switch_in" ]; + { rank = min ; + "__init_running"; + "running"; + } +}