From patchwork Sun Dec 25 07:47:15 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Deepak R Varma X-Patchwork-Id: 36459 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp434366wrt; Sat, 24 Dec 2022 23:48:38 -0800 (PST) X-Google-Smtp-Source: AMrXdXvSf3nuqFPr8YFGf5djhMdwoWA+T18zvP+PS34aEnLabGcakf0rJLT3+n1ofbT7kZseyUvI X-Received: by 2002:aa7:8bc8:0:b0:581:1542:217b with SMTP id s8-20020aa78bc8000000b005811542217bmr675270pfd.12.1671954517909; Sat, 24 Dec 2022 23:48:37 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1671954517; cv=none; d=google.com; s=arc-20160816; b=Jm01CHnYzCNvxInKEXJS7IiSL3HkS7f3WNij/akBRjXSXOONCCBSPJfxti611YsshR G4ghNF+NdfW8TEWajbO+GWT4EB2aWtV8nhkZtyyeDbGP+uUvjQEWbR857jEpCZuYzrbZ UfeQZCMwXpwopEBlwqoB5goK4Aazwy0j3LBXYhCMKAgirzJV6Mxiy3auWtZmNjkOj+jk oOLJmwOrA0CzuqxFMrtXWs3p8SiANbMQEStnsEj2+EOjHr0O91tt0RH2Cnf4HPlKkd2Z 89Jpb/QAG6Ykhwed59T5KDgtY56OPXx2giXXhPTC9ONtd0WTTjnKLV5ZinH5oH18jpC3 pn8A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date:dkim-signature; bh=gpMQe2Qto8T1C2lebHhK5UETQRmDRUtJhCi4RdfN3a4=; b=tf9MxosbvN3nG0o5x0z260YsuXvfdrLHLFOYnGI/usfYilE80PIGAwEsx8CTG6p+LI v4mn0p4wbgcJnq7AzsTj3X5e80Vg3f+3k+XBSv6imz2wqN3dbJ8ndj/Ma7eDyGTD7bFm OLzIrIC7FBUK4wuV23NyaAWAPRUdolVLMVwGsaPmZAuCeZE4T4DY07nXTsQU/l0y/bGG 3DrKvLakOSTgURY6JF6KE2f5YYIKMM97P3/Nfton10wTG+/Z8IXc/u3JtLqI+IfrGmRT O41wetNgG2qnOJDQ8NEu9D7MztYt/dIAslp9znLTws1Zg4YVxfUqYS7glRPAcTAs3Vzc 3FOQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@mailo.com header.s=mailo header.b=WoKWM9Vv; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mailo.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id u11-20020a6540cb000000b0047860cd6de3si8430301pgp.641.2022.12.24.23.48.25; Sat, 24 Dec 2022 23:48:37 -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; dkim=fail header.i=@mailo.com header.s=mailo header.b=WoKWM9Vv; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mailo.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229671AbiLYHrf (ORCPT + 99 others); Sun, 25 Dec 2022 02:47:35 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53160 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229441AbiLYHrc (ORCPT ); Sun, 25 Dec 2022 02:47:32 -0500 Received: from msg-4.mailo.com (msg-4.mailo.com [213.182.54.15]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CB45F389 for ; Sat, 24 Dec 2022 23:47:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=mailo.com; s=mailo; t=1671954441; bh=bMU9mUk6Hw98H87DEnX7EHpdpzuEKQ/x1ECaFF4/Tjs=; h=X-EA-Auth:Date:From:To:Cc:Subject:Message-ID:References: MIME-Version:Content-Type:In-Reply-To; b=WoKWM9VvSJNpSWwSlYreTc9B1hYNk1x3PboZuTaB1HhSe6SWVn/eicjg78bZIOy/W eTDiRPhAqEJMdNcqg15+KFVqfJj8WUd/eAXKSoQaBQl/F9rIjESa97M/TSHn9M2h/R IGRQu6SybExcB1yNLx1US6dnbdiz3bpfi5FeVIZk= Received: by b-6.in.mailobj.net [192.168.90.16] with ESMTP via ip-206.mailobj.net [213.182.55.206] Sun, 25 Dec 2022 08:47:20 +0100 (CET) X-EA-Auth: AfL6MqEJGDGV6JwNRF6Xqw+evEf5XMzyYLv3rVlGa1tumfShUReZEyAisWYF+hg9A2xGSkVbcOSB4UUd+Q+csLUK2zJ/IhsQ Date: Sun, 25 Dec 2022 13:17:15 +0530 From: Deepak R Varma To: Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Tvrtko Ursulin , David Airlie , Daniel Vetter , intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Cc: Saurabh Singh Sengar , Praveen Kumar , Deepak R Varma Subject: [PATCH v2 1/2] drm/i915: convert i915_active.count from atomic_t to refcount_t Message-ID: References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE,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 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1753171380147779447?= X-GMAIL-MSGID: =?utf-8?q?1753171380147779447?= The refcount_* APIs are designed to address known issues with the atomic_t APIs for reference counting. They provide following distinct advantages: - protect the reference counters from overflow/underflow - avoid use-after-free errors - provide improved memory ordering guarantee schemes - neater and safer. Hence, convert the atomic_t count member variable and associated atomic_*() API calls to equivalent refcount_t type and refcount_*() API calls. This patch proposal address the following warnings generated by the atomic_as_refcounter.cocci coccinelle script atomic_add_unless Signed-off-by: Deepak R Varma --- Please note: 1. Proposed changes are compile tested only. 2. This patch 1/2 is required to be applied before patch 2/2 due to interdependency. Changes in v2: 1. Patch added to the patch series. 2. Handle build issues Reported-by: kernel test robot Earlier a standalone patch was sent for the i915 base driver only. The Kernel Test Robot reported build failure for additional atomic_*() calls specific to i915 debugging support when enabled. This version now includes those changes as well. drivers/gpu/drm/i915/i915_active.c | 28 +++++++++++++----------- drivers/gpu/drm/i915/i915_active.h | 6 ++--- drivers/gpu/drm/i915/i915_active_types.h | 4 ++-- 3 files changed, 20 insertions(+), 18 deletions(-) -- 2.34.1 diff --git a/drivers/gpu/drm/i915/i915_active.c b/drivers/gpu/drm/i915/i915_active.c index 7412abf166a8..5e58d8b1e947 100644 --- a/drivers/gpu/drm/i915/i915_active.c +++ b/drivers/gpu/drm/i915/i915_active.c @@ -92,14 +92,14 @@ static void debug_active_init(struct i915_active *ref) static void debug_active_activate(struct i915_active *ref) { lockdep_assert_held(&ref->tree_lock); - if (!atomic_read(&ref->count)) /* before the first inc */ + if (!refcount_read(&ref->count)) /* before the first inc */ debug_object_activate(ref, &active_debug_desc); } static void debug_active_deactivate(struct i915_active *ref) { lockdep_assert_held(&ref->tree_lock); - if (!atomic_read(&ref->count)) /* after the last dec */ + if (!refcount_read(&ref->count)) /* after the last dec */ debug_object_deactivate(ref, &active_debug_desc); } @@ -133,7 +133,7 @@ __active_retire(struct i915_active *ref) GEM_BUG_ON(i915_active_is_idle(ref)); /* return the unused nodes to our slabcache -- flushing the allocator */ - if (!atomic_dec_and_lock_irqsave(&ref->count, &ref->tree_lock, flags)) + if (!refcount_dec_and_lock_irqsave(&ref->count, &ref->tree_lock, &flags)) return; GEM_BUG_ON(rcu_access_pointer(ref->excl.fence)); @@ -179,8 +179,8 @@ active_work(struct work_struct *wrk) { struct i915_active *ref = container_of(wrk, typeof(*ref), work); - GEM_BUG_ON(!atomic_read(&ref->count)); - if (atomic_add_unless(&ref->count, -1, 1)) + GEM_BUG_ON(!refcount_read(&ref->count)); + if (refcount_dec_not_one(&ref->count)) return; __active_retire(ref); @@ -189,8 +189,8 @@ active_work(struct work_struct *wrk) static void active_retire(struct i915_active *ref) { - GEM_BUG_ON(!atomic_read(&ref->count)); - if (atomic_add_unless(&ref->count, -1, 1)) + GEM_BUG_ON(!refcount_read(&ref->count)); + if (refcount_dec_not_one(&ref->count)) return; if (ref->flags & I915_ACTIVE_RETIRE_SLEEPS) { @@ -354,7 +354,7 @@ void __i915_active_init(struct i915_active *ref, ref->cache = NULL; init_llist_head(&ref->preallocated_barriers); - atomic_set(&ref->count, 0); + refcount_set(&ref->count, 0); __mutex_init(&ref->mutex, "i915_active", mkey); __i915_active_fence_init(&ref->excl, NULL, excl_retire); INIT_WORK(&ref->work, active_work); @@ -445,7 +445,7 @@ int i915_active_add_request(struct i915_active *ref, struct i915_request *rq) if (replace_barrier(ref, active)) { RCU_INIT_POINTER(active->fence, NULL); - atomic_dec(&ref->count); + refcount_dec(&ref->count); } if (!__i915_active_fence_set(active, fence)) __i915_active_acquire(ref); @@ -488,14 +488,16 @@ i915_active_set_exclusive(struct i915_active *ref, struct dma_fence *f) bool i915_active_acquire_if_busy(struct i915_active *ref) { debug_active_assert(ref); - return atomic_add_unless(&ref->count, 1, 0); + return refcount_add_not_zero(1, &ref->count); } static void __i915_active_activate(struct i915_active *ref) { spin_lock_irq(&ref->tree_lock); /* __active_retire() */ - if (!atomic_fetch_inc(&ref->count)) + if (!refcount_inc_not_zero(&ref->count)) { + refcount_inc(&ref->count); debug_active_activate(ref); + } spin_unlock_irq(&ref->tree_lock); } @@ -757,7 +759,7 @@ int i915_sw_fence_await_active(struct i915_sw_fence *fence, void i915_active_fini(struct i915_active *ref) { debug_active_fini(ref); - GEM_BUG_ON(atomic_read(&ref->count)); + GEM_BUG_ON(refcount_read(&ref->count)); GEM_BUG_ON(work_pending(&ref->work)); mutex_destroy(&ref->mutex); @@ -927,7 +929,7 @@ int i915_active_acquire_preallocate_barrier(struct i915_active *ref, first = first->next; - atomic_dec(&ref->count); + refcount_dec(&ref->count); intel_engine_pm_put(barrier_to_engine(node)); kmem_cache_free(slab_cache, node); diff --git a/drivers/gpu/drm/i915/i915_active.h b/drivers/gpu/drm/i915/i915_active.h index 7eb44132183a..116c7c28466a 100644 --- a/drivers/gpu/drm/i915/i915_active.h +++ b/drivers/gpu/drm/i915/i915_active.h @@ -193,14 +193,14 @@ void i915_active_release(struct i915_active *ref); static inline void __i915_active_acquire(struct i915_active *ref) { - GEM_BUG_ON(!atomic_read(&ref->count)); - atomic_inc(&ref->count); + GEM_BUG_ON(!refcount_read(&ref->count)); + refcount_inc(&ref->count); } static inline bool i915_active_is_idle(const struct i915_active *ref) { - return !atomic_read(&ref->count); + return !refcount_read(&ref->count); } void i915_active_fini(struct i915_active *ref); diff --git a/drivers/gpu/drm/i915/i915_active_types.h b/drivers/gpu/drm/i915/i915_active_types.h index b02a78ac87db..152a3a25d9f7 100644 --- a/drivers/gpu/drm/i915/i915_active_types.h +++ b/drivers/gpu/drm/i915/i915_active_types.h @@ -7,7 +7,7 @@ #ifndef _I915_ACTIVE_TYPES_H_ #define _I915_ACTIVE_TYPES_H_ -#include +#include #include #include #include @@ -23,7 +23,7 @@ struct i915_active_fence { struct active_node; struct i915_active { - atomic_t count; + refcount_t count; struct mutex mutex; spinlock_t tree_lock;