Received: by 2002:a05:6358:16cc:b0:ea:6187:17c9 with SMTP id r12csp7973247rwl; Tue, 10 Jan 2023 07:35:11 -0800 (PST) X-Google-Smtp-Source: AMrXdXsn+7IlopM7zBR24ZX6bvnJvV9TL6OvaDEddHtLfvsVlWEnYBQVTTFvKru3NfapU+CFgsO+ X-Received: by 2002:a05:6a21:e384:b0:b0:25ba:1769 with SMTP id cc4-20020a056a21e38400b000b025ba1769mr93878858pzc.58.1673364910981; Tue, 10 Jan 2023 07:35:10 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1673364910; cv=none; d=google.com; s=arc-20160816; b=er19YmKkhfGZaC2fIVWZVzXiDng8RrDA6L/6VKV2EZgreYLyAAZTLVkTlidd7dvCes A2LUHqfv4W31K4whTyQbz+52A00AZc4/y9GGyr7vSzWXZewVfJhmlIRLy9hi97ldGfJA kKb3tj4Iis8Z8H9m1ltWbSrjWeM1CFdwRv16scCh4FlEm8F6pdfZDt8whbeoOwuUYTU5 FsG2hhp7Ss7+x4xqQPQH/fxYM91gII2HJIG1Uk0vxkIkg1hYchobwQh4tojRiE3OL4iX m4CmElxrKeArHLyZK1d8ElM1QK/omxXKO9BO6GBrF7+1Wap9oUm268t7ibuOJ5r5RIhO dsew== 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 :message-id:date:subject:cc:to:from; bh=oI+qOQ4/Xa2wzMmIV50+Xru+smvc0KKdnduScfn0bO8=; b=CjCHwlBXGAGwhNH6OTCfSTwydZ3efeDCuG2Nfam1/BiYkT+TkwasIRgeyE5gnH5B++ dwLNc5LnncRvD3oBkVRhSY6HOaisD8g/DyBzcBk9W+MKuZ3hFD2jm2xUGONFmHhGGQMu ndB4YuYusCJwkPjtTLzyc/uPEBxAFrM9qCvJVmJwwaXWaVzrxqZEbszOd5TtgRMzchVg f6JK+TnEhz6C3G/MIYxjsIGot3TJpFmxOQrHUU+Zcnrg3aaElcdcQt2t8Tmg8Up7qLPH rV1mHE4fPLnZKsWvtiHpoNSGNwbGRAWXtGKVnxoGwBtTKfGI3dh2v8NRgqZsTDtCZcOm GXDw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id f1-20020a63f741000000b0045d1aa2a589si12794578pgk.840.2023.01.10.07.35.03; Tue, 10 Jan 2023 07:35:10 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238873AbjAJPZv (ORCPT + 53 others); Tue, 10 Jan 2023 10:25:51 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60536 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238915AbjAJPZI (ORCPT ); Tue, 10 Jan 2023 10:25:08 -0500 Received: from cstnet.cn (smtp25.cstnet.cn [159.226.251.25]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id DAD147CBF0 for ; Tue, 10 Jan 2023 07:25:06 -0800 (PST) Received: from localhost.localdomain (unknown [124.16.138.125]) by APP-05 (Coremail) with SMTP id zQCowADHzu5Ag71jnJENDA--.30343S2; Tue, 10 Jan 2023 23:24:49 +0800 (CST) From: Jiasheng Jiang To: maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, daniel@ffwll.ch Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Jiasheng Jiang Subject: [PATCH 1/2] drm: Add DRM-managed alloc_workqueue() and alloc_ordered_workqueue() Date: Tue, 10 Jan 2023 23:24:47 +0800 Message-Id: <20230110152447.5611-1-jiasheng@iscas.ac.cn> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CM-TRANSID: zQCowADHzu5Ag71jnJENDA--.30343S2 X-Coremail-Antispam: 1UD129KBjvJXoWxAr1fWw18ArWkGFW8JF13Arb_yoW5trWUpF s5AFW5CrZ5trZFgrWayw1DuFy3Gan2gF1Iyw1Ivw1a9a15t34DZ3ZYyFyjv343GrWkJF4Y yFZxtFWkuF1jyr7anT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUym14x267AKxVW8JVW5JwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK02 1l84ACjcxK6xIIjxv20xvE14v26r1I6r4UM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26r4j 6F4UM28EF7xvwVC2z280aVAFwI0_Cr1j6rxdM28EF7xvwVC2z280aVCY1x0267AKxVW0oV Cq3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0 I7IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Gr0_Cr1lOx8S6xCaFVCjc4AY6r1j6r 4UM4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwCF04k20xvY0x0EwIxG rwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4 vE14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IY x2IY67AKxVWUJVWUCwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Jr0_Gr1lIxAIcVCF04k26c xKx2IYs7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26r1j6r4UMIIF0xvEx4A2jsIEc7CjxVAF wI0_Gr0_Gr1UYxBIdaVFxhVjvjDU0xZFpf9x0JUq38nUUUUU= X-Originating-IP: [124.16.138.125] X-CM-SenderInfo: pmld2xxhqjqxpvfd2hldfou0/ X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_MED, SPF_HELO_PASS,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add drmm_alloc_workqueue() and drmm_alloc_ordered_workqueue(), the helpers that provide managed workqueue cleanup. The workqueue will be destroyed with the final reference of the DRM device. Signed-off-by: Jiasheng Jiang --- drivers/gpu/drm/drm_managed.c | 66 +++++++++++++++++++++++++++++++++++ include/drm/drm_managed.h | 8 +++++ 2 files changed, 74 insertions(+) diff --git a/drivers/gpu/drm/drm_managed.c b/drivers/gpu/drm/drm_managed.c index 4cf214de50c4..d3bd6247eec9 100644 --- a/drivers/gpu/drm/drm_managed.c +++ b/drivers/gpu/drm/drm_managed.c @@ -271,6 +271,13 @@ static void drmm_mutex_release(struct drm_device *dev, void *res) mutex_destroy(lock); } +static void drmm_destroy_workqueue(struct drm_device *dev, void *res) +{ + struct workqueue_struct *wq = res; + + destroy_workqueue(wq); +} + /** * drmm_mutex_init - &drm_device-managed mutex_init() * @dev: DRM device @@ -289,3 +296,62 @@ int drmm_mutex_init(struct drm_device *dev, struct mutex *lock) return drmm_add_action_or_reset(dev, drmm_mutex_release, lock); } EXPORT_SYMBOL(drmm_mutex_init); + +/** + * drmm_alloc_workqueue - &drm_device-managed alloc_workqueue() + * @dev: DRM device + * @wq: workqueue to be allocated + * + * Returns: + * 0 on success, or a negative errno code otherwise. + * + * This is a &drm_device-managed version of alloc_workqueue(). + * The initialized lock is automatically destroyed on the final + * drm_dev_put(). + */ +int drmm_alloc_workqueue(struct drm_device *dev, + struct workqueue_struct *wq, const char *fmt, + unsigned int flags, int max_active, ...) +{ + va_list args; + + va_start(args, max_active); + wq = alloc_workqueue(fmt, flags, max_active, args); + va_end(args); + + if (!wq) + return -ENOMEM; + + return drmm_add_action_or_reset(dev, drmm_destroy_workqueue, wq); +} +EXPORT_SYMBOL(drmm_alloc_workqueue); + +/** + * drmm_alloc_ordered_workqueue - &drm_device-managed + * alloc_ordered_workqueue() + * @dev: DRM device + * @wq: workqueue to be allocated + * + * Returns: + * 0 on success, or a negative errno code otherwise. + * + * This is a &drm_device-managed version of alloc_ordered_workqueue(). + * The initialized lock is automatically destroyed on the final + * drm_dev_put(). + */ +int drmm_alloc_ordered_workqueue(struct drm_device *dev, + struct workqueue_struct *wq, + const char *fmt, unsigned int flags, ...) +{ + va_list args; + + va_start(args, flags); + wq = alloc_ordered_workqueue(fmt, flags, args); + va_end(args); + + if (!wq) + return -ENOMEM; + + return drmm_add_action_or_reset(dev, drmm_destroy_workqueue, wq); +} +EXPORT_SYMBOL(drmm_alloc_ordered_workqueue); diff --git a/include/drm/drm_managed.h b/include/drm/drm_managed.h index 359883942612..68cecc14e1af 100644 --- a/include/drm/drm_managed.h +++ b/include/drm/drm_managed.h @@ -107,4 +107,12 @@ void drmm_kfree(struct drm_device *dev, void *data); int drmm_mutex_init(struct drm_device *dev, struct mutex *lock); +int drmm_alloc_workqueue(struct drm_device *dev, + struct workqueue_struct *wq, const char *fmt, + unsigned int flags, int max_active, ...); + +int drmm_alloc_ordered_workqueue(struct drm_device *dev, + struct workqueue_struct *wq, + const char *fmt, unsigned int flags, ...); + #endif -- 2.25.1