From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from out01.mta.xmission.com (out01.mta.xmission.com [166.70.13.231]) (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 BCD4331DD97 for ; Fri, 3 Jul 2026 21:38:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=166.70.13.231 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783114730; cv=none; b=A1cCFhaWVcxSIm49mOWZw1rl1RvCyTkGV9qzl1dJSgi74EZGsVZoqbOVCE1RaUjfDdMfLjBXgPcHFc/0H6v/VPXBkthlKY6t7JQ8wFOgViTTRUddIpLjK02gC4fWNx4WFrcklTo/upW8MgsVwFfvnvKK6w8qhLyVHXCOXP18cIw= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783114730; c=relaxed/simple; bh=NsD45HOyuPr+AEzq9H6pj8IThEzcINB9r5G0KoL8w3Y=; h=From:To:Cc:In-Reply-To:References:Date:Message-ID:MIME-Version: Content-Type:Subject; b=XqB3rcLhPz6LoNNKQxqJiUfCTQECAXaV2GArfq/eDERWk2zDnrH/4qzFK7nW8TEcYzYerisFPtw6hxPVmxV62Bdn2zcdVlSwcf7x8wrH+y3dN0H7b0awrmWdJyGczmJNvvlOue2eHpMjUKMJJ0HQAU7hgDmreAmez5UI50mGCjY= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=xmission.com; spf=pass smtp.mailfrom=xmission.com; dkim=pass (1024-bit key) header.d=xmission.com header.i=@xmission.com header.b=BXKi91i0; arc=none smtp.client-ip=166.70.13.231 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=xmission.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=xmission.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=xmission.com header.i=@xmission.com header.b="BXKi91i0" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=simple/simple; d=xmission.com; s=xmission; h=Subject:Content-Type:MIME-Version:Message-ID:Date:References: In-Reply-To:Cc:To:From:Sender:Reply-To:Content-Transfer-Encoding:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=NsD45HOyuPr+AEzq9H6pj8IThEzcINB9r5G0KoL8w3Y=; b=BXKi91i0E9DxWVRcI8fBRUL/6z dWFqtl8pmjrgLSH3Cx1aS3fFqCAboW0knOw3uJg2y9ofopznY2uYCShZv6F9IwvKftihxtGIunH1e sJhAvKVGI9c+Jp9zY1cSUq50TWTsLNe50JLLvslNGn/VcI5B9hBxvmG924ZoakPaxEwM=; Received: from in01.mta.xmission.com ([166.70.13.51]:53974) by out01.mta.xmission.com with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.93) (envelope-from ) id 1wflay-00HEBp-30; Fri, 03 Jul 2026 15:38:48 -0600 Received: from ip72-198-198-28.om.om.cox.net ([72.198.198.28]:42372 helo=email.froward.int.ebiederm.org.xmission.com) by in01.mta.xmission.com with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.93) (envelope-from ) id 1wflaw-00DmBL-7w; Fri, 03 Jul 2026 15:38:47 -0600 From: "Eric W. Biederman" To: Oleg Nesterov Cc: Andrew Morton , Andy Lutomirski , Kees Cook , Kusaram Devineni , Peter Zijlstra , Thomas Gleixner , Will Drewry , linux-kernel@vger.kernel.org, Linus Torvalds , Christian Brauner In-Reply-To: <877bnb4uyw.fsf_-_@email.froward.int.ebiederm.org> (Eric W. Biederman's message of "Fri, 03 Jul 2026 16:35:51 -0500") References: <87o6gx9rc4.fsf@email.froward.int.ebiederm.org> <877bnh7tnf.fsf@email.froward.int.ebiederm.org> <877bnb4uyw.fsf_-_@email.froward.int.ebiederm.org> Date: Fri, 03 Jul 2026 16:38:39 -0500 Message-ID: <87jyrb3g9s.fsf_-_@email.froward.int.ebiederm.org> User-Agent: Gnus/5.13 (Gnus v5.13) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain X-XM-SPF: eid=1wflaw-00DmBL-7w;;;mid=<87jyrb3g9s.fsf_-_@email.froward.int.ebiederm.org>;;;hst=in01.mta.xmission.com;;;ip=72.198.198.28;;;frm=ebiederm@xmission.com;;;sPfnum=0;;;sPf=pass X-XM-AID: U2FsdGVkX1+Od3BzoCdIybbelweXpgEWPyuc1h6TzGY= X-Spam-Level: ** X-Spam-Report: * -1.0 ALL_TRUSTED Passed through trusted hosts only via SMTP * 0.1 BAYES_50 BODY: Bayes spam probability is 40 to 60% * [score: 0.5000] * 0.7 XMSubLong Long Subject * 1.5 XMNoVowels Alpha-numberic number with no vowels * 0.5 XMGappySubj_01 Very gappy subject * -0.0 DCC_CHECK_NEGATIVE Not listed in DCC * [sa08 1397; Body=1 Fuz1=1 Fuz2=1] * 1.0 XM_B_SpammyTLD Contains uncommon/spammy TLD * 0.0 T_TooManySym_01 4+ unique symbols in subject X-Spam-DCC: XMission; sa08 1397; Body=1 Fuz1=1 Fuz2=1 X-Spam-Combo: **;Oleg Nesterov X-Spam-Relay-Country: X-Spam-Timing: total 1385 ms - load_scoreonly_sql: 0.06 (0.0%), signal_user_changed: 11 (0.8%), b_tie_ro: 10 (0.7%), parse: 1.03 (0.1%), extract_message_metadata: 13 (0.9%), get_uri_detail_list: 1.64 (0.1%), tests_pri_-2000: 13 (0.9%), tests_pri_-1000: 2.2 (0.2%), tests_pri_-950: 1.10 (0.1%), tests_pri_-900: 0.77 (0.1%), tests_pri_-90: 168 (12.1%), check_bayes: 163 (11.8%), b_tokenize: 8 (0.5%), b_tok_get_all: 8 (0.6%), b_comp_prob: 1.70 (0.1%), b_tok_touch_all: 142 (10.2%), b_finish: 1.33 (0.1%), tests_pri_0: 285 (20.6%), check_dkim_signature: 0.58 (0.0%), check_dkim_adsp: 2.6 (0.2%), poll_dns_idle: 868 (62.7%), tests_pri_10: 1.77 (0.1%), tests_pri_500: 885 (63.9%), rewrite_mail: 0.00 (0.0%) Subject: [PATCH 04/14] signal: Use sig_can_short_circuit to improve fatal signal delivery X-SA-Exim-Connect-IP: 166.70.13.51 X-SA-Exim-Rcpt-To: brauner@kernel.org, torvalds@linux-foundation.org, linux-kernel@vger.kernel.org, wad@chromium.org, tglx@kernel.org, peterz@infradead.org, kusaram@devineni.in, kees@kernel.org, luto@kernel.org, akpm@linux-foundation.org, oleg@redhat.com X-SA-Exim-Mail-From: ebiederm@xmission.com X-SA-Exim-Scanned: No (on out01.mta.xmission.com); SAEximRunCond expanded to false Today send_signal does not discover all of the fatal signals that qualify for short circuit delivery. In general this is not a problem as get_signal will handle any signals that reach it properly. Recognizing fatal signals in send_signal is necessary for the kernel's fatal_signal_pending test to work. Now that sig_can_short_circuit exists stop using a half-assed version of sig_can_short_circuit in complete_signal based on wants_signal. Instead use sig_can_short_circuit to implement fatal signal short circuit handling in enqueue_signal. Reported-by: Al Viro Signed-off-by: "Eric W. Biederman" --- kernel/signal.c | 58 +++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 31 deletions(-) diff --git a/kernel/signal.c b/kernel/signal.c index 4429d3ec6776..b54669ac8e77 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -1045,36 +1045,8 @@ static void complete_signal(int sig, struct task_struct *p, enum pid_type type) } /* - * Found a killable thread. If the signal will be fatal, - * then start taking the whole group down immediately. - */ - if (sig_fatal(p, sig) && !sigismember(&t->real_blocked, sig) && - (sig == SIGKILL || !p->ptrace)) { - /* - * This signal will be fatal to the whole group. - */ - if (!sig_kernel_coredump(sig)) { - /* - * Start a group exit and wake everybody up. - * This way we don't have other threads - * running and doing things after a slower - * thread has the fatal signal pending. - */ - signal->flags = SIGNAL_GROUP_EXIT; - signal->group_exit_code = sig; - signal->group_stop_count = 0; - __for_each_thread(signal, t) { - task_clear_jobctl_pending(t, JOBCTL_PENDING_MASK); - sigaddset(&t->pending.signal, SIGKILL); - signal_wake_up(t, 1); - } - return; - } - } - - /* - * The signal is already in the shared-pending queue. - * Tell the chosen thread to wake up and dequeue it. + * Found a killable thread. The signal is already in the + * queue. Tell the chosen thread to wake up and dequeue it. */ signal_wake_up(t, sig == SIGKILL); return; @@ -1086,13 +1058,37 @@ static void enqueue_signal(struct task_struct *t, enum pid_type type, struct signal_struct *signal = t->signal; struct sigpending *pending = (type != PIDTYPE_PID) ? &signal->shared_pending : &t->pending; + bool need_signal_wake_up = true; + + if (sig_fatal(t, sig) && !sig_kernel_coredump(sig) && + sig_can_short_circuit(t, type, sig)) { + struct task_struct *thread; + /* + * This signal will be fatal to the whole group. + * + * Start a group exit and wake everybody up. + * This way we don't have other threads + * running and doing things after a slower + * thread has the fatal signal pending. + */ + signal->flags = SIGNAL_GROUP_EXIT; + signal->group_exit_code = sig; + signal->group_stop_count = 0; + __for_each_thread(signal, thread) { + task_clear_jobctl_pending(thread, JOBCTL_PENDING_MASK); + sigaddset(&thread->pending.signal, SIGKILL); + signal_wake_up(thread, 1); + } + need_signal_wake_up = false; + } signalfd_notify(t, sig); if (q) { list_add_tail(&q->list, &pending->list); } sigaddset(&pending->signal, sig); - complete_signal(sig, t, type); + if (need_signal_wake_up) + complete_signal(sig, t, type); } static inline bool legacy_queue(struct sigpending *signals, int sig) -- 2.41.0