Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp744016pxk; Thu, 1 Oct 2020 12:43:50 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwroT0yrePnXmY+9xpd8KUw/qImoJ/Rw40rY+mVnrJEWWzBZ+m1Ld6OMNkNcfKZctkN64bO X-Received: by 2002:a17:906:16c8:: with SMTP id t8mr10098715ejd.272.1601581430373; Thu, 01 Oct 2020 12:43:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1601581430; cv=none; d=google.com; s=arc-20160816; b=0u7O7qBHhmUyuTfvS5e/dnzT8gyoPqlAFfo2ONacoLWmW6QAc3SHfpQrirAlAKbwz+ ikwhfH7MtD0jB+xC1Dx0odBcvefYdD9OtC3/BOtiFGsbuHM85JsGJKdbAeJK4FsZuA/R 2mDrcFMjhf483Lj+6kC7zTOcuArIb/Un1CpjBXunZQPJkVCkPGGnSFgiiZMf96WfpEpF dApIrby3EhuAek5I0QKZQ5mKD/7xdjckz1CoEuU8GpFY3UaYdw4PILc9s3NE+fvaaw0e L97Cg09fdH05eqbq1pqVWbLfvVaUI+TRTxSkJ0MgROCvCSIcMltrZjMW66pnzfy8xbPi IB8w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=5MvAG2bGo2OYmDhLgwmA8/KdhDPmTxQa7GH82/DXFGo=; b=DwwnMX0RPD+MfDjoDFOTa0+ES+kkRNxgUkvmxEpdc3ILcSnCZEhdrfTvh/LDmasg+O yq+76GPkY4r6ZzyOquQWGS1zwFRgvSQ5C46bk7mdo0wwinLurxD8psSWEfpXnvhCAs1a wH7WLGSHjSnYyYzr6uTXZwqXU2l0HhK+391FOU235yE9Tx39M6QsfI58GK5fe4qQIz3b S7rafnCVIkmfCqszPiN77SfUlb48Xyef5ffWl63YBP8XM+NNL4GmSRoNihfRhjRXQr5I jByMdbSz4OGI2KRorIMsSIseCO7mlOrJJZGueRPNoa0l2UrZ/j5Z6ToA+i5PkrXkRVKM LZ8Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel-dk.20150623.gappssmtp.com header.s=20150623 header.b=FCBCHa6z; 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 f6si4086907edc.423.2020.10.01.12.43.27; Thu, 01 Oct 2020 12:43:50 -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=FCBCHa6z; 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 S1732933AbgJATmR (ORCPT + 99 others); Thu, 1 Oct 2020 15:42:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49748 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730093AbgJATmQ (ORCPT ); Thu, 1 Oct 2020 15:42:16 -0400 Received: from mail-il1-x144.google.com (mail-il1-x144.google.com [IPv6:2607:f8b0:4864:20::144]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1F198C0613E3 for ; Thu, 1 Oct 2020 12:42:16 -0700 (PDT) Received: by mail-il1-x144.google.com with SMTP id q1so7458154ilt.6 for ; Thu, 01 Oct 2020 12:42:16 -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=5MvAG2bGo2OYmDhLgwmA8/KdhDPmTxQa7GH82/DXFGo=; b=FCBCHa6zb+XSVqZgRBzdXNboyTbwleBmPdMQhO1iuPieijEtVdOT9UEFyOn1F2HCM3 WMTPd+EZfmi2AplObbg9j6QmhUeTBiphrU08KjAKlUZ35AugG1EhIxiV97uG5V0Jjm4d PVjdTQZR9m7Lk5tcu43SKTTQE8PH7a1p5/XqYvOdwQI9IbZYaqn+2EZ3zvOCPl0iD37t +4dcBOPvYj8EQLWqSqfZuNPWOs6On/i/boUYeE503bU86+7BrOllY++RxMpAdr0z/PVE j1mL7zqS7JsBPXnsjOdwhMU/SzlKKsxZGVYwDxVPThMFZUy4MhDYjC5LF/GuVRu1IY1U igGQ== 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=5MvAG2bGo2OYmDhLgwmA8/KdhDPmTxQa7GH82/DXFGo=; b=gn1M6s6eP5AuUp2skszhTJ0bs+XBLcUWEOxvYYXOJLbszh3tpxbkPwIiXIaWeEEkNM 4hzGietj2swn5E20hO/zX+8mqpgCbyYyy0JkYhDdt1YuWe56Ao8MrykQXQ31ifsPYq+c i7VrC0J+BTwfRvtZLTyJsH1WdeGsULDpApFMMamz6wBXK0Ko+gog+uGfRW1HzC9VQf82 oGvBxkQ7AlliMSP+XXsLmGBLmxyfhSLqfZTDGUAe7OT0siBA0+PR8YOke4u7Ly3Tujto hm8b1raGLC7JmGbIskXMJb+N8BoAI6JqykIvsi5UaEGtERUJmhWssrAQoCP34k9KU/NJ uSKA== X-Gm-Message-State: AOAM531WukbjeAH5huFfs704Jdj/jf4r7WoXZmVsItD1inf7DPmFsgf+ MDdwjd3uXK2vEGHTADEpOGzo5lEhNVuuTA== X-Received: by 2002:a92:905:: with SMTP id y5mr3776970ilg.210.1601581335138; Thu, 01 Oct 2020 12:42:15 -0700 (PDT) Received: from p1.localdomain ([65.144.74.34]) by smtp.gmail.com with ESMTPSA id t11sm739609ill.61.2020.10.01.12.42.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 Oct 2020 12:42:14 -0700 (PDT) From: Jens Axboe To: linux-kernel@vger.kernel.org, io-uring@vger.kernel.org Cc: peterz@infradead.org, oleg@redhat.com, tglx@linutronix.de, Jens Axboe Subject: [PATCH 3/3] task_work: use TIF_TASKWORK if available Date: Thu, 1 Oct 2020 13:42:08 -0600 Message-Id: <20201001194208.1153522-4-axboe@kernel.dk> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201001194208.1153522-1-axboe@kernel.dk> References: <20201001194208.1153522-1-axboe@kernel.dk> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If the arch supports TIF_TASKWORK, then use that for TWA_SIGNAL as it's more efficient than using the signal delivery method. This is especially true on threaded applications, where ->sighand is shared across threads. Signed-off-by: Jens Axboe --- kernel/task_work.c | 48 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/kernel/task_work.c b/kernel/task_work.c index 613b2d634af8..ae317cfe86b8 100644 --- a/kernel/task_work.c +++ b/kernel/task_work.c @@ -5,6 +5,39 @@ static struct callback_head work_exited; /* all we need is ->next == NULL */ +/* + * TWA_SIGNAL signaling - use TIF_TASKWORK, if available. + */ +static void task_work_signal(struct task_struct *task) +{ +#ifndef TIF_TASKWORK + unsigned long flags; + + /* + * Only grab the sighand lock if we don't already have some + * task_work pending. This pairs with the smp_store_mb() + * in get_signal(), see comment there. + */ + if (!(READ_ONCE(task->jobctl) & JOBCTL_TASK_WORK) && + lock_task_sighand(task, &flags)) { + task->jobctl |= JOBCTL_TASK_WORK; + signal_wake_up(task, 0); + unlock_task_sighand(task, &flags); + } +#else + set_tsk_thread_flag(task, TIF_TASKWORK); + set_notify_resume(task); +#endif +} + +static inline void clear_tsk_taskwork(struct task_struct *task) +{ +#ifdef TIF_TASKWORK + if (test_tsk_thread_flag(task, TIF_TASKWORK)) + clear_tsk_thread_flag(task, TIF_TASKWORK); +#endif +} + /** * task_work_add - ask the @task to execute @work->func() * @task: the task which should run the callback @@ -28,7 +61,6 @@ int 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); @@ -42,17 +74,7 @@ task_work_add(struct task_struct *task, struct callback_head *work, int notify) set_notify_resume(task); break; case TWA_SIGNAL: - /* - * Only grab the sighand lock if we don't already have some - * task_work pending. This pairs with the smp_store_mb() - * in get_signal(), see comment there. - */ - if (!(READ_ONCE(task->jobctl) & JOBCTL_TASK_WORK) && - lock_task_sighand(task, &flags)) { - task->jobctl |= JOBCTL_TASK_WORK; - signal_wake_up(task, 0); - unlock_task_sighand(task, &flags); - } + task_work_signal(task); break; } @@ -110,6 +132,8 @@ void task_work_run(void) struct task_struct *task = current; struct callback_head *work, *head, *next; + clear_tsk_taskwork(task); + for (;;) { /* * work->func() can do task_work_add(), do not set -- 2.28.0