All of lore.kernel.org
 help / color / mirror / Atom feed
From: syzbot <syzbot+c4c6c3dc10cc96bcf723@syzkaller.appspotmail.com>
To: linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com
Subject: Re: [syzbot] Test
Date: Wed, 03 Jul 2024 00:26:31 -0700	[thread overview]
Message-ID: <000000000000cdb895061c52bf0e@google.com> (raw)
In-Reply-To: <00000000000089427c0614c18cf4@google.com>

For archival purposes, forwarding an incoming command email to
linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com.

***

Subject: Test
Author: radoslaw.zielonek@gmail.com

#syz test https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git fe46a7dd189e25604716c03576d05ac8a5209743

---
 include/linux/sched.h |  7 +++++++
 kernel/sched/core.c   |  1 +
 kernel/sched/rt.c     | 26 +++++++++++++++++++++++---
 kernel/signal.c       |  9 +++++++++
 4 files changed, 40 insertions(+), 3 deletions(-)

diff --git a/include/linux/sched.h b/include/linux/sched.h
index 17cb0761ff65..123bc16ad3d0 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1121,6 +1121,13 @@ struct task_struct {
 	size_t				sas_ss_size;
 	unsigned int			sas_ss_flags;
 
+	/*
+	 * Number of signals received by an RT task between scheduling ticks.
+	 * This counter is used to throttle RT tasks when too many signals
+	 * (e.g., POSIX timers) are sent to the task, which can cause an RCU stall.
+	 */
+	atomic_t rt_signals_recv_count; /* used outside of the rq lock */
+
 	struct callback_head		*task_works;
 
 #ifdef CONFIG_AUDIT
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index d44efa0d0611..9def826bd35f 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -4779,6 +4779,7 @@ int sched_fork(unsigned long clone_flags, struct task_struct *p)
 			p->policy = SCHED_NORMAL;
 			p->static_prio = NICE_TO_PRIO(0);
 			p->rt_priority = 0;
+			atomic_set(&p->rt_signals_recv_count, 0);
 		} else if (PRIO_TO_NICE(p->static_prio) < 0)
 			p->static_prio = NICE_TO_PRIO(0);
 
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c
index 3261b067b67e..9b22d67d1746 100644
--- a/kernel/sched/rt.c
+++ b/kernel/sched/rt.c
@@ -24,6 +24,15 @@ int sysctl_sched_rt_period = 1000000;
  */
 int sysctl_sched_rt_runtime = 950000;
 
+/*
+ * To avoid an RCU stall due to a large number of signals received by RT tasks
+ * (e.g., POSIX timers), the RT task needs to be throttled.
+ * When the number of signals received by an RT task during a scheduling
+ * tick period exceeds the threshold, the RT task will be throttled.
+ * The value of 100 has not been thoroughly tested and may need adjustment.
+ */
+#define RT_RECV_SGINAL_THROTTLE_THRESHOLD 100
+
 #ifdef CONFIG_SYSCTL
 static int sysctl_sched_rr_timeslice = (MSEC_PER_SEC * RR_TIMESLICE) / HZ;
 static int sched_rt_handler(struct ctl_table *table, int write, void *buffer,
@@ -951,7 +960,7 @@ static inline int rt_se_prio(struct sched_rt_entity *rt_se)
 	return rt_task_of(rt_se)->prio;
 }
 
-static int sched_rt_runtime_exceeded(struct rt_rq *rt_rq)
+static int sched_rt_runtime_exceeded(struct rt_rq *rt_rq, int rt_signal_recv)
 {
 	u64 runtime = sched_rt_runtime(rt_rq);
 
@@ -966,7 +975,15 @@ static int sched_rt_runtime_exceeded(struct rt_rq *rt_rq)
 	if (runtime == RUNTIME_INF)
 		return 0;
 
-	if (rt_rq->rt_time > runtime) {
+	/*
+	 * When a large number of signals are sent to this task (e.g., POSIX timers)
+	 * the delta time deviates significantly from real time due to the overhead
+	 * of handling signals. For RT tasks, this can cause an RCU stall.
+	 * To avoid this, throttle the task when the number of signals received
+	 * exceeds a certain threshold.
+	 */
+	if (rt_rq->rt_time > runtime ||
+		rt_signal_recv >= RT_RECV_SGINAL_THROTTLE_THRESHOLD) {
 		struct rt_bandwidth *rt_b = sched_rt_bandwidth(rt_rq);
 
 		/*
@@ -1021,7 +1038,9 @@ static void update_curr_rt(struct rq *rq)
 		if (sched_rt_runtime(rt_rq) != RUNTIME_INF) {
 			raw_spin_lock(&rt_rq->rt_runtime_lock);
 			rt_rq->rt_time += delta_exec;
-			exceeded = sched_rt_runtime_exceeded(rt_rq);
+			exceeded = sched_rt_runtime_exceeded(
+						rt_rq,
+						atomic_read(&curr->rt_signals_recv_count));
 			if (exceeded)
 				resched_curr(rq);
 			raw_spin_unlock(&rt_rq->rt_runtime_lock);
@@ -1029,6 +1048,7 @@ static void update_curr_rt(struct rq *rq)
 				do_start_rt_bandwidth(sched_rt_bandwidth(rt_rq));
 		}
 	}
+	atomic_set(&curr->rt_signals_recv_count, 0);
 }
 
 static void
diff --git a/kernel/signal.c b/kernel/signal.c
index bdca529f0f7b..d58e0ba9336c 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -629,6 +629,15 @@ int dequeue_signal(struct task_struct *tsk, sigset_t *mask,
 	bool resched_timer = false;
 	int signr;
 
+	/*
+	 * To prevent an RCU stall due to receiving too many signals by RT tasks,
+	 * count all signals regardless of their type.
+	 * Based on this counter, the RT scheduler will decide whether the task
+	 * should be throttled or not.
+	 */
+	if (tsk->policy == SCHED_FIFO || tsk->policy == SCHED_RR)
+		atomic_inc(&tsk->rt_signals_recv_count);
+
 	/* We only dequeue private signals from ourselves, we don't let
 	 * signalfd steal them
 	 */
-- 
2.43.0


  parent reply	other threads:[~2024-07-03  7:26 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-29  0:16 [syzbot] [mm?] INFO: rcu detected stall in sys_clone (8) syzbot
2024-05-27 12:29 ` [syzbot] Test syzbot
2024-07-03  7:26 ` syzbot [this message]
  -- strict thread matches above, loose matches on Subject: below --
2024-09-23 15:46 [syzbot] [net?] possible deadlock in gtp_encap_enable_socket syzbot
2024-10-01  0:57 ` [syzbot] test syzbot
2024-09-22 17:46 [syzbot] [net?] KMSAN: kernel-infoleak in move_addr_to_user (7) syzbot
2024-11-03 19:27 ` [syzbot] test syzbot
2024-05-14 16:19 [syzbot] [ntfs3?] UBSAN: array-index-out-of-bounds in decompress_lznt syzbot
2024-07-01 21:55 ` [syzbot] test syzbot
2024-05-12  9:19 [syzbot] [mm?] INFO: rcu detected stall in validate_mm (3) syzbot
2024-07-03  7:32 ` [syzbot] Test syzbot
2024-07-03  8:24 ` syzbot
2024-04-15  1:54 [syzbot] [input?] WARNING in bcm5974_start_traffic/usb_submit_urb (2) syzbot
2024-04-15 10:18 ` [syzbot] test syzbot
2024-04-14  6:05 [syzbot] [bluetooth?] WARNING in hci_conn_set_handle syzbot
2024-04-15  9:33 ` [syzbot] test syzbot
2024-04-09 22:42 [syzbot] [ntfs3?] WARNING in do_open_execat (2) syzbot
2024-04-15  5:22 ` [syzbot] Test syzbot
2023-11-19 12:31 syzbot
2023-11-17  5:01 [syzbot] [kvm?] WARNING in kvm_mmu_notifier_invalidate_range_start (3) syzbot
2023-11-17 10:55 ` [syzbot] Test syzbot
2023-11-16 11:09 [syzbot] [kernel?] inconsistent lock state in ptrace_attach syzbot
2023-11-17 13:51 ` [syzbot] Test syzbot
2023-11-16 11:08 [syzbot] [cgroups?] possible deadlock in cgroup_free syzbot
2023-11-17 10:58 ` [syzbot] Test syzbot
2023-11-08 12:38 [syzbot] [wireless?] [net?] WARNING in ieee80211_rfkill_poll syzbot
2023-11-15  6:33 ` [syzbot] Test syzbot
2023-11-03 23:11 [syzbot] [bpf?] [net?] BUG: unable to handle kernel NULL pointer dereference in sk_psock_verdict_data_ready syzbot
2023-11-13 11:16 ` [syzbot] test syzbot
2023-10-26 18:32 [syzbot] [bpf?] [net?] BUG: unable to handle kernel NULL pointer dereference in sk_msg_recvmsg syzbot
2023-11-06 13:35 ` [syzbot] Test syzbot
2023-10-16 17:01 [syzbot] [usb?] UBSAN: array-index-out-of-bounds in usbhid_parse syzbot
2023-11-17 14:23 ` [syzbot] Test syzbot
2023-10-05 19:47 [syzbot] [ntfs3?] WARNING in attr_data_get_block (3) syzbot
2023-11-19 11:27 ` [syzbot] test syzbot
2023-09-25  5:15 [syzbot] [bluetooth?] possible deadlock in hci_dev_do_close syzbot
2023-11-15  5:18 ` [syzbot] test syzbot
2023-09-24  7:49 [syzbot] [mm?] [hfs?] KASAN: slab-out-of-bounds Read in generic_perform_write syzbot
2023-11-17 14:24 ` [syzbot] Test syzbot
2023-09-16  1:22 [syzbot] [dri?] WARNING in drm_gem_object_handle_put_unlocked syzbot
2023-11-15  6:33 ` [syzbot] Test syzbot
2023-09-11 13:35 [syzbot] [ext4?] WARNING in ext4_discard_allocated_blocks syzbot
2023-11-17 14:17 ` [syzbot] Test syzbot
2023-08-19 10:47 [syzbot] [ntfs3?] WARNING in do_symlinkat (2) syzbot
2023-11-28 17:38 ` [syzbot] Test syzbot
2023-07-11  1:53 [syzbot] [bpf?] [reiserfs?] WARNING: locking bug in corrupted (2) syzbot
2023-11-17 14:27 ` [syzbot] Test syzbot
2022-10-21  4:45 [syzbot] UBSAN: array-index-out-of-bounds in diWrite syzbot
2023-11-02 15:02 ` [syzbot] test syzbot
2023-11-03  3:12 ` syzbot
2023-11-03  7:18 ` syzbot
2023-11-03  7:29 ` syzbot
2022-02-10 18:27 [syzbot] general protection fault in l2cap_chan_timeout (3) syzbot
2023-11-06 13:01 ` [syzbot] Test syzbot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=000000000000cdb895061c52bf0e@google.com \
    --to=syzbot+c4c6c3dc10cc96bcf723@syzkaller.appspotmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=syzkaller-bugs@googlegroups.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.