From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lyude Paul Subject: [RFC v4 02/12] kthread: Add kthread_(un)block_work_queuing() and kthread_work_queuable() Date: Fri, 8 May 2020 16:46:52 -0400 Message-ID: <20200508204751.155488-3-lyude@redhat.com> References: <20200508204751.155488-1-lyude@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Return-path: In-Reply-To: <20200508204751.155488-1-lyude@redhat.com> Sender: linux-kernel-owner@vger.kernel.org To: nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Cc: Daniel Vetter , Tejun Heo , =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= , Andrew Morton , Petr Mladek , Suren Baghdasaryan , Johannes Weiner , Greg Kroah-Hartman , Liang Chen , Ben Dooks , Thomas Gleixner List-Id: nouveau.vger.kernel.org Add some simple wrappers around incrementing/decrementing kthread_work.cancelling under lock, along with checking whether queuing is currently allowed on a given kthread_work, which we'll use want to implement work cancelling with DRM's vblank work helpers. Cc: Daniel Vetter Cc: Tejun Heo Cc: Ville Syrjälä Cc: dri-devel@lists.freedesktop.org Cc: nouveau@lists.freedesktop.org Signed-off-by: Lyude Paul --- include/linux/kthread.h | 19 +++++++++++++++++ kernel/kthread.c | 46 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/include/linux/kthread.h b/include/linux/kthread.h index 0006540ce7f9..c6fee200fced 100644 --- a/include/linux/kthread.h +++ b/include/linux/kthread.h @@ -211,9 +211,28 @@ void kthread_flush_worker(struct kthread_worker *worker); bool kthread_cancel_work_sync(struct kthread_work *work); bool kthread_cancel_delayed_work_sync(struct kthread_delayed_work *work); +void kthread_block_work_queuing(struct kthread_worker *worker, + struct kthread_work *work); +void kthread_unblock_work_queuing(struct kthread_worker *worker, + struct kthread_work *work); void kthread_destroy_worker(struct kthread_worker *worker); +/** + * kthread_work_queuable - whether or not a kthread work can be queued + * @work: The kthread work to check + * + * Checks whether or not queuing @work is currently blocked from queuing, + * either by kthread_cancel_work_sync() and friends or + * kthread_block_work_queuing(). + * + * Returns: whether or not the @work may be queued. + */ +static inline bool kthread_work_queuable(struct kthread_work *work) +{ + return READ_ONCE(work->canceling) == 0; +} + struct cgroup_subsys_state; #ifdef CONFIG_BLK_CGROUP diff --git a/kernel/kthread.c b/kernel/kthread.c index c1f8ec9d5836..f8a5c5a87cc6 100644 --- a/kernel/kthread.c +++ b/kernel/kthread.c @@ -1187,6 +1187,52 @@ bool kthread_cancel_delayed_work_sync(struct kthread_delayed_work *dwork) } EXPORT_SYMBOL_GPL(kthread_cancel_delayed_work_sync); +/** + * kthread_block_work_queuing - prevent a kthread_work from being queued + * without actually cancelling it + * @worker: kthread worker to use + * @work: work to block queuing on + * + * Prevents @work from being queued using kthread_queue_work() and friends, + * but doesn't attempt to cancel any previous queuing. The caller must unblock + * queuing later by calling kthread_unblock_work_queuing(). This call can be + * called multiple times. + * + * See also: kthread_work_queuable() + */ +void kthread_block_work_queuing(struct kthread_worker *worker, + struct kthread_work *work) +{ + unsigned long flags; + + raw_spin_lock_irqsave(&worker->lock, flags); + work->canceling++; + raw_spin_unlock_irqrestore(&worker->lock, flags); +} +EXPORT_SYMBOL_GPL(kthread_block_work_queuing); + +/** + * kthread_unblock_work_queuing - unblock queuing on a kthread_work + * @worker: kthread worker to use + * @work: work to unblock queuing on + * + * Removes a request to prevent @work from being queued with + * kthread_queue_work() and friends, so that it may potentially be queued + * again. + * + * See also: kthread_work_queuable() + */ +void kthread_unblock_work_queuing(struct kthread_worker *worker, + struct kthread_work *work) +{ + unsigned long flags; + + raw_spin_lock_irqsave(&worker->lock, flags); + WARN_ON_ONCE(--work->canceling < 0); + raw_spin_unlock_irqrestore(&worker->lock, flags); +} +EXPORT_SYMBOL_GPL(kthread_unblock_work_queuing); + /** * kthread_flush_worker - flush all current works on a kthread_worker * @worker: worker to flush -- 2.25.4 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.5 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DAFFFC47257 for ; Fri, 8 May 2020 20:48:47 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id B0BF220725 for ; Fri, 8 May 2020 20:48:47 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="MjomNuJo" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B0BF220725 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 74D9F6EB67; Fri, 8 May 2020 20:48:41 +0000 (UTC) Received: from us-smtp-delivery-1.mimecast.com (us-smtp-1.mimecast.com [207.211.31.81]) by gabe.freedesktop.org (Postfix) with ESMTPS id C357D6EB64 for ; Fri, 8 May 2020 20:48:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1588970918; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=QheNznjVPmakQiU+O7e0zvxyU/NmorAuqat6FWMl4Ds=; b=MjomNuJoMONOBtQj71veoAbb2fhXdAZZDIMR2gD1ejRJPevLyPuU8vWnBQshq35NOkcdLe vbTcsRHVEYmZRO9bBjolXQ8KknS0CWY0VPMTur0dnhNKhDCLPKN1QIAvSvjhoKnz35a2BN znb4wLhv9hpyEJG1JbomrN2qKTY2CEI= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-155-u4tyqxqjM3mP7LzECjmJAg-1; Fri, 08 May 2020 16:48:36 -0400 X-MC-Unique: u4tyqxqjM3mP7LzECjmJAg-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 20B871005510; Fri, 8 May 2020 20:48:34 +0000 (UTC) Received: from Ruby.redhat.com (ovpn-118-29.rdu2.redhat.com [10.10.118.29]) by smtp.corp.redhat.com (Postfix) with ESMTP id B942E5D9CA; Fri, 8 May 2020 20:48:32 +0000 (UTC) From: Lyude Paul To: nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: [RFC v4 02/12] kthread: Add kthread_(un)block_work_queuing() and kthread_work_queuable() Date: Fri, 8 May 2020 16:46:52 -0400 Message-Id: <20200508204751.155488-3-lyude@redhat.com> In-Reply-To: <20200508204751.155488-1-lyude@redhat.com> References: <20200508204751.155488-1-lyude@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Petr Mladek , Greg Kroah-Hartman , Ben Dooks , Liang Chen , Johannes Weiner , Tejun Heo , Andrew Morton , Suren Baghdasaryan , Thomas Gleixner Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" QWRkIHNvbWUgc2ltcGxlIHdyYXBwZXJzIGFyb3VuZCBpbmNyZW1lbnRpbmcvZGVjcmVtZW50aW5n Cmt0aHJlYWRfd29yay5jYW5jZWxsaW5nIHVuZGVyIGxvY2ssIGFsb25nIHdpdGggY2hlY2tpbmcg d2hldGhlciBxdWV1aW5nCmlzIGN1cnJlbnRseSBhbGxvd2VkIG9uIGEgZ2l2ZW4ga3RocmVhZF93 b3JrLCB3aGljaCB3ZSdsbCB1c2Ugd2FudCB0bwppbXBsZW1lbnQgd29yayBjYW5jZWxsaW5nIHdp dGggRFJNJ3MgdmJsYW5rIHdvcmsgaGVscGVycy4KCkNjOiBEYW5pZWwgVmV0dGVyIDxkYW5pZWxA ZmZ3bGwuY2g+CkNjOiBUZWp1biBIZW8gPHRqQGtlcm5lbC5vcmc+CkNjOiBWaWxsZSBTeXJqw6Rs w6QgPHZpbGxlLnN5cmphbGFAbGludXguaW50ZWwuY29tPgpDYzogZHJpLWRldmVsQGxpc3RzLmZy ZWVkZXNrdG9wLm9yZwpDYzogbm91dmVhdUBsaXN0cy5mcmVlZGVza3RvcC5vcmcKU2lnbmVkLW9m Zi1ieTogTHl1ZGUgUGF1bCA8bHl1ZGVAcmVkaGF0LmNvbT4KLS0tCiBpbmNsdWRlL2xpbnV4L2t0 aHJlYWQuaCB8IDE5ICsrKysrKysrKysrKysrKysrCiBrZXJuZWwva3RocmVhZC5jICAgICAgICB8 IDQ2ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAyIGZpbGVzIGNo YW5nZWQsIDY1IGluc2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2t0aHJl YWQuaCBiL2luY2x1ZGUvbGludXgva3RocmVhZC5oCmluZGV4IDAwMDY1NDBjZTdmOS4uYzZmZWUy MDBmY2VkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2t0aHJlYWQuaAorKysgYi9pbmNsdWRl L2xpbnV4L2t0aHJlYWQuaApAQCAtMjExLDkgKzIxMSwyOCBAQCB2b2lkIGt0aHJlYWRfZmx1c2hf d29ya2VyKHN0cnVjdCBrdGhyZWFkX3dvcmtlciAqd29ya2VyKTsKIAogYm9vbCBrdGhyZWFkX2Nh bmNlbF93b3JrX3N5bmMoc3RydWN0IGt0aHJlYWRfd29yayAqd29yayk7CiBib29sIGt0aHJlYWRf Y2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKHN0cnVjdCBrdGhyZWFkX2RlbGF5ZWRfd29yayAqd29y ayk7Cit2b2lkIGt0aHJlYWRfYmxvY2tfd29ya19xdWV1aW5nKHN0cnVjdCBrdGhyZWFkX3dvcmtl ciAqd29ya2VyLAorCQkJCXN0cnVjdCBrdGhyZWFkX3dvcmsgKndvcmspOwordm9pZCBrdGhyZWFk X3VuYmxvY2tfd29ya19xdWV1aW5nKHN0cnVjdCBrdGhyZWFkX3dvcmtlciAqd29ya2VyLAorCQkJ CSAgc3RydWN0IGt0aHJlYWRfd29yayAqd29yayk7CiAKIHZvaWQga3RocmVhZF9kZXN0cm95X3dv cmtlcihzdHJ1Y3Qga3RocmVhZF93b3JrZXIgKndvcmtlcik7CiAKKy8qKgorICoga3RocmVhZF93 b3JrX3F1ZXVhYmxlIC0gd2hldGhlciBvciBub3QgYSBrdGhyZWFkIHdvcmsgY2FuIGJlIHF1ZXVl ZAorICogQHdvcms6IFRoZSBrdGhyZWFkIHdvcmsgdG8gY2hlY2sKKyAqCisgKiBDaGVja3Mgd2hl dGhlciBvciBub3QgcXVldWluZyBAd29yayBpcyBjdXJyZW50bHkgYmxvY2tlZCBmcm9tIHF1ZXVp bmcsCisgKiBlaXRoZXIgYnkga3RocmVhZF9jYW5jZWxfd29ya19zeW5jKCkgYW5kIGZyaWVuZHMg b3IKKyAqIGt0aHJlYWRfYmxvY2tfd29ya19xdWV1aW5nKCkuCisgKgorICogUmV0dXJuczogd2hl dGhlciBvciBub3QgdGhlIEB3b3JrIG1heSBiZSBxdWV1ZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUg Ym9vbCBrdGhyZWFkX3dvcmtfcXVldWFibGUoc3RydWN0IGt0aHJlYWRfd29yayAqd29yaykKK3sK KwlyZXR1cm4gUkVBRF9PTkNFKHdvcmstPmNhbmNlbGluZykgPT0gMDsKK30KKwogc3RydWN0IGNn cm91cF9zdWJzeXNfc3RhdGU7CiAKICNpZmRlZiBDT05GSUdfQkxLX0NHUk9VUApkaWZmIC0tZ2l0 IGEva2VybmVsL2t0aHJlYWQuYyBiL2tlcm5lbC9rdGhyZWFkLmMKaW5kZXggYzFmOGVjOWQ1ODM2 Li5mOGE1YzVhODdjYzYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9rdGhyZWFkLmMKKysrIGIva2VybmVs L2t0aHJlYWQuYwpAQCAtMTE4Nyw2ICsxMTg3LDUyIEBAIGJvb2wga3RocmVhZF9jYW5jZWxfZGVs YXllZF93b3JrX3N5bmMoc3RydWN0IGt0aHJlYWRfZGVsYXllZF93b3JrICpkd29yaykKIH0KIEVY UE9SVF9TWU1CT0xfR1BMKGt0aHJlYWRfY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKTsKIAorLyoq CisgKiBrdGhyZWFkX2Jsb2NrX3dvcmtfcXVldWluZyAtIHByZXZlbnQgYSBrdGhyZWFkX3dvcmsg ZnJvbSBiZWluZyBxdWV1ZWQKKyAqIHdpdGhvdXQgYWN0dWFsbHkgY2FuY2VsbGluZyBpdAorICog QHdvcmtlcjoga3RocmVhZCB3b3JrZXIgdG8gdXNlCisgKiBAd29yazogd29yayB0byBibG9jayBx dWV1aW5nIG9uCisgKgorICogUHJldmVudHMgQHdvcmsgZnJvbSBiZWluZyBxdWV1ZWQgdXNpbmcg a3RocmVhZF9xdWV1ZV93b3JrKCkgYW5kIGZyaWVuZHMsCisgKiBidXQgZG9lc24ndCBhdHRlbXB0 IHRvIGNhbmNlbCBhbnkgcHJldmlvdXMgcXVldWluZy4gVGhlIGNhbGxlciBtdXN0IHVuYmxvY2sK KyAqIHF1ZXVpbmcgbGF0ZXIgYnkgY2FsbGluZyBrdGhyZWFkX3VuYmxvY2tfd29ya19xdWV1aW5n KCkuIFRoaXMgY2FsbCBjYW4gYmUKKyAqIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KKyAqCisgKiBT ZWUgYWxzbzoga3RocmVhZF93b3JrX3F1ZXVhYmxlKCkKKyAqLwordm9pZCBrdGhyZWFkX2Jsb2Nr X3dvcmtfcXVldWluZyhzdHJ1Y3Qga3RocmVhZF93b3JrZXIgKndvcmtlciwKKwkJCQlzdHJ1Y3Qg a3RocmVhZF93b3JrICp3b3JrKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlyYXdfc3Bp bl9sb2NrX2lycXNhdmUoJndvcmtlci0+bG9jaywgZmxhZ3MpOworCXdvcmstPmNhbmNlbGluZysr OworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b3JrZXItPmxvY2ssIGZsYWdzKTsKK30K K0VYUE9SVF9TWU1CT0xfR1BMKGt0aHJlYWRfYmxvY2tfd29ya19xdWV1aW5nKTsKKworLyoqCisg KiBrdGhyZWFkX3VuYmxvY2tfd29ya19xdWV1aW5nIC0gdW5ibG9jayBxdWV1aW5nIG9uIGEga3Ro cmVhZF93b3JrCisgKiBAd29ya2VyOiBrdGhyZWFkIHdvcmtlciB0byB1c2UKKyAqIEB3b3JrOiB3 b3JrIHRvIHVuYmxvY2sgcXVldWluZyBvbgorICoKKyAqIFJlbW92ZXMgYSByZXF1ZXN0IHRvIHBy ZXZlbnQgQHdvcmsgZnJvbSBiZWluZyBxdWV1ZWQgd2l0aAorICoga3RocmVhZF9xdWV1ZV93b3Jr KCkgYW5kIGZyaWVuZHMsIHNvIHRoYXQgaXQgbWF5IHBvdGVudGlhbGx5IGJlIHF1ZXVlZAorICog YWdhaW4uCisgKgorICogU2VlIGFsc286IGt0aHJlYWRfd29ya19xdWV1YWJsZSgpCisgKi8KK3Zv aWQga3RocmVhZF91bmJsb2NrX3dvcmtfcXVldWluZyhzdHJ1Y3Qga3RocmVhZF93b3JrZXIgKndv cmtlciwKKwkJCQkgIHN0cnVjdCBrdGhyZWFkX3dvcmsgKndvcmspCit7CisJdW5zaWduZWQgbG9u ZyBmbGFnczsKKworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmd29ya2VyLT5sb2NrLCBmbGFncyk7 CisJV0FSTl9PTl9PTkNFKC0td29yay0+Y2FuY2VsaW5nIDwgMCk7CisJcmF3X3NwaW5fdW5sb2Nr X2lycXJlc3RvcmUoJndvcmtlci0+bG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTF9HUEwo a3RocmVhZF91bmJsb2NrX3dvcmtfcXVldWluZyk7CisKIC8qKgogICoga3RocmVhZF9mbHVzaF93 b3JrZXIgLSBmbHVzaCBhbGwgY3VycmVudCB3b3JrcyBvbiBhIGt0aHJlYWRfd29ya2VyCiAgKiBA d29ya2VyOiB3b3JrZXIgdG8gZmx1c2gKLS0gCjIuMjUuNAoKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2 ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21h aWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==