Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp17561ybt; Tue, 30 Jun 2020 13:54:25 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzDvLZKsdF6Sx+MVfV4FRPctRJyn4E7HMie6OyseTztJ7lGRuf8Km6biQ3yu47V1mWIZZU1 X-Received: by 2002:a17:906:8401:: with SMTP id n1mr19607469ejx.479.1593550138548; Tue, 30 Jun 2020 13:48:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1593550138; cv=none; d=google.com; s=arc-20160816; b=tewkK/nwTBgQERE2k5f8g0eLL/wJWa0+ljCELoaTahSod5YfV1zboeqPR/SZZUzDhD gURj8CikQYiwdeOkingxT+tCruDtFMHVrTH3gbnQ3P3+ik1G3fxrgxVyNjERjWyVrYwb yhnaYdc8Pc8Lfp9EcliRUMAI9bI+18qJwmiy0TFGjfv/J0toE0hcaLRZ3QEiMGvNayj/ Biig/TPzv3RTpx8r9YE5OXDozY3wNEVxuEz2iiEYgI6NBQZNp4Yxzs0vefIepEQt1R0G +17TOv5VQLYte5JchKDbIHSFUKwlQkgwTKqBf1pdQdu7VSesYseKNfDcYeFSiEyl+ceV M1Bw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=6mvVREkDVIeNCrD7qi8PMtAVT+USyRgLji8dDcK1MZI=; b=xr5e+aaMC1nq23DbUKKnVfEMLbu07Dx8o2X+eqGeHhHArELMhEjFuBlmfl1K2pHzqy L3Us36iOePb4XKlDSqFogf8ShpLuUwrBZH6PSVbZwutG7zWUBVhfp27SYD6bPKuz79T3 BdkriedxPMQdPdMtvkMpDDmQBLRYEa+stJtY1pXiTuw+Iik7vQNJO80lu5XDYr/fqrbc l/UC7JsOJYvBtHrr2JdWW2scvQAqwoK8jnoFtxMhFo0ZdOwresGsVcWksPbD2+CbQVbP lR8hzIzUplarkZ8VQ+UJF0EN69lC7w9kFtrWPXZowOx4/dGZ8oy4zciJMIQmLcTA/WQv ZH5A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel-dk.20150623.gappssmtp.com header.s=20150623 header.b=tM+dHm+G; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id f14si2343885edm.269.2020.06.30.13.48.35; Tue, 30 Jun 2020 13:48:58 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel-dk.20150623.gappssmtp.com header.s=20150623 header.b=tM+dHm+G; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726473AbgF3Spi (ORCPT + 99 others); Tue, 30 Jun 2020 14:45:38 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36616 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726213AbgF3Sp1 (ORCPT ); Tue, 30 Jun 2020 14:45:27 -0400 Received: from mail-pj1-x1041.google.com (mail-pj1-x1041.google.com [IPv6:2607:f8b0:4864:20::1041]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 861CCC03E97A for ; Tue, 30 Jun 2020 11:45:26 -0700 (PDT) Received: by mail-pj1-x1041.google.com with SMTP id b92so9860295pjc.4 for ; Tue, 30 Jun 2020 11:45:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel-dk.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=6mvVREkDVIeNCrD7qi8PMtAVT+USyRgLji8dDcK1MZI=; b=tM+dHm+GPgciq6qnWfKbJo4Kq5Tayh8q0IFFz6A7wCZjuzwVo/FSrLEbDCu/fnQyBQ jqsvcSJWViFdBp1grNeoyvO7uDBJqWq551Ws9xRJ4INAtpeDu14PXZD4DTga/5DppuZ/ JGneIRzbaZq5NBpkuP4eRsx52aJsUUWyO3n0AFdbCyM4AFTjnYBY8SpWrfh6R8G7P8s5 zLO6a0RrsmwbyZ7b4KwKEQhXLgFxo9rfv/nod+0In7WVqCKZj5EzcL7UkqwEmFU8/bHH Ct2lJoZQXQvMzl/3hHA4JdyGPr8pudetykENgjEM3wfLX5z9C24aUMVSzFVD70zO47wi 1Rzg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=6mvVREkDVIeNCrD7qi8PMtAVT+USyRgLji8dDcK1MZI=; b=go+QdAXm6a3Cl+8UIClPl9hmjAtQzVRT3PLYrdsncSFALi8gHHnTeVP2Acnzh2RleZ oCQfolWCAiGZ+Cp9bim18AyTVgIdP6deJSWT8g930XMLLaWbmk+WbsHVa/unUdwE1S6x AAqmYc6lULmqpkbomli5I2GntbJJ/2EgU72U0KqaZa5u26iAa1fhe+sil5DSp3U+XsmU Aby9Znf7rf1wLa2kIY477EJ6EfHGrESSYF7Cwou9dwEvIzxhhbi2KRXT6yVlVO9PZ1L8 HeL7LGMLUGFWsuJ1obm7d8J05k75ZPg+iwX11G4aWHy9GuPBnkuqlhsVyenMT2tE2qlP 6dFA== X-Gm-Message-State: AOAM533eKGVcV6+Qo9cJQFVzY7Ohgm2ZARLLLVq/lE4BuhiiXPff8NAm lFs1oqUpOz9SR7wa+eZGv0HX4A== X-Received: by 2002:a17:90a:1ac3:: with SMTP id p61mr24724332pjp.23.1593542726013; Tue, 30 Jun 2020 11:45:26 -0700 (PDT) Received: from localhost.localdomain ([2605:e000:100e:8c61:4113:50ea:3eb3:a39b]) by smtp.gmail.com with ESMTPSA id n7sm2898108pjq.22.2020.06.30.11.45.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 Jun 2020 11:45:25 -0700 (PDT) From: Jens Axboe To: io-uring@vger.kernel.org Cc: oleg@redhat.com, peterz@infradead.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org, Jens Axboe Subject: [PATCH 1/2] task_work: teach task_work_add() to do signal_wake_up() Date: Tue, 30 Jun 2020 12:45:17 -0600 Message-Id: <20200630184518.696101-2-axboe@kernel.dk> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200630184518.696101-1-axboe@kernel.dk> References: <20200630184518.696101-1-axboe@kernel.dk> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Oleg Nesterov So that the target task will exit the wait_event_interruptible-like loop and call task_work_run() asap. The patch turns "bool notify" into 0,TWA_RESUME,TWA_SIGNAL enum, the new TWA_SIGNAL flag implies signal_wake_up(). However, it needs to avoid the race with recalc_sigpending(), so the patch also adds the new JOBCTL_TASK_WORK bit included in JOBCTL_PENDING_MASK. TODO: once this patch is merged we need to change all current users of task_work_add(notify = true) to use TWA_RESUME. Cc: stable@vger.kernel.org # v5.7 Acked-by: Peter Zijlstra (Intel) Signed-off-by: Oleg Nesterov Signed-off-by: Jens Axboe --- include/linux/sched/jobctl.h | 4 +++- include/linux/task_work.h | 5 ++++- kernel/signal.c | 10 +++++++--- kernel/task_work.c | 16 ++++++++++++++-- 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/include/linux/sched/jobctl.h b/include/linux/sched/jobctl.h index fa067de9f1a9..d2b4204ba4d3 100644 --- a/include/linux/sched/jobctl.h +++ b/include/linux/sched/jobctl.h @@ -19,6 +19,7 @@ struct task_struct; #define JOBCTL_TRAPPING_BIT 21 /* switching to TRACED */ #define JOBCTL_LISTENING_BIT 22 /* ptracer is listening for events */ #define JOBCTL_TRAP_FREEZE_BIT 23 /* trap for cgroup freezer */ +#define JOBCTL_TASK_WORK_BIT 24 /* set by TWA_SIGNAL */ #define JOBCTL_STOP_DEQUEUED (1UL << JOBCTL_STOP_DEQUEUED_BIT) #define JOBCTL_STOP_PENDING (1UL << JOBCTL_STOP_PENDING_BIT) @@ -28,9 +29,10 @@ struct task_struct; #define JOBCTL_TRAPPING (1UL << JOBCTL_TRAPPING_BIT) #define JOBCTL_LISTENING (1UL << JOBCTL_LISTENING_BIT) #define JOBCTL_TRAP_FREEZE (1UL << JOBCTL_TRAP_FREEZE_BIT) +#define JOBCTL_TASK_WORK (1UL << JOBCTL_TASK_WORK_BIT) #define JOBCTL_TRAP_MASK (JOBCTL_TRAP_STOP | JOBCTL_TRAP_NOTIFY) -#define JOBCTL_PENDING_MASK (JOBCTL_STOP_PENDING | JOBCTL_TRAP_MASK) +#define JOBCTL_PENDING_MASK (JOBCTL_STOP_PENDING | JOBCTL_TRAP_MASK | JOBCTL_TASK_WORK) extern bool task_set_jobctl_pending(struct task_struct *task, unsigned long mask); extern void task_clear_jobctl_trapping(struct task_struct *task); diff --git a/include/linux/task_work.h b/include/linux/task_work.h index bd9a6a91c097..0fb93aafa478 100644 --- a/include/linux/task_work.h +++ b/include/linux/task_work.h @@ -13,7 +13,10 @@ init_task_work(struct callback_head *twork, task_work_func_t func) twork->func = func; } -int task_work_add(struct task_struct *task, struct callback_head *twork, bool); +#define TWA_RESUME 1 +#define TWA_SIGNAL 2 +int task_work_add(struct task_struct *task, struct callback_head *twork, int); + struct callback_head *task_work_cancel(struct task_struct *, task_work_func_t); void task_work_run(void); diff --git a/kernel/signal.c b/kernel/signal.c index 5ca48cc5da76..ee22ec78fd6d 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -2529,9 +2529,6 @@ bool get_signal(struct ksignal *ksig) struct signal_struct *signal = current->signal; int signr; - if (unlikely(current->task_works)) - task_work_run(); - if (unlikely(uprobe_deny_signal())) return false; @@ -2544,6 +2541,13 @@ bool get_signal(struct ksignal *ksig) relock: spin_lock_irq(&sighand->siglock); + current->jobctl &= ~JOBCTL_TASK_WORK; + if (unlikely(current->task_works)) { + spin_unlock_irq(&sighand->siglock); + task_work_run(); + goto relock; + } + /* * Every stopped thread goes here after wakeup. Check to see if * we should notify the parent, prepare_signal(SIGCONT) encodes diff --git a/kernel/task_work.c b/kernel/task_work.c index 825f28259a19..5c0848ca1287 100644 --- a/kernel/task_work.c +++ b/kernel/task_work.c @@ -25,9 +25,10 @@ static struct callback_head work_exited; /* all we need is ->next == NULL */ * 0 if succeeds or -ESRCH. */ int -task_work_add(struct task_struct *task, struct callback_head *work, bool notify) +task_work_add(struct task_struct *task, struct callback_head *work, int notify) { struct callback_head *head; + unsigned long flags; do { head = READ_ONCE(task->task_works); @@ -36,8 +37,19 @@ task_work_add(struct task_struct *task, struct callback_head *work, bool notify) work->next = head; } while (cmpxchg(&task->task_works, head, work) != head); - if (notify) + switch (notify) { + case TWA_RESUME: set_notify_resume(task); + break; + case TWA_SIGNAL: + if (lock_task_sighand(task, &flags)) { + task->jobctl |= JOBCTL_TASK_WORK; + signal_wake_up(task, 0); + unlock_task_sighand(task, &flags); + } + break; + } + return 0; } -- 2.27.0