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 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2F468C001B0 for ; Mon, 24 Jul 2023 11:17:51 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 4559C6B0071; Mon, 24 Jul 2023 07:17:51 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 405DB8E0001; Mon, 24 Jul 2023 07:17:51 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2F4546B0075; Mon, 24 Jul 2023 07:17:51 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 235076B0071 for ; Mon, 24 Jul 2023 07:17:51 -0400 (EDT) Received: from smtpin21.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id D4354C0A1E for ; Mon, 24 Jul 2023 11:17:50 +0000 (UTC) X-FDA: 81046255500.21.623A183 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by imf15.hostedemail.com (Postfix) with ESMTP id 0AE17A0010 for ; Mon, 24 Jul 2023 11:17:47 +0000 (UTC) Authentication-Results: imf15.hostedemail.com; dkim=none; dmarc=pass (policy=none) header.from=arm.com; spf=pass (imf15.hostedemail.com: domain of steven.price@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=steven.price@arm.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1690197468; h=from:from:sender: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=fRq9dwwGFiUYnhelgiMFCqaFSvyn1Iy7L8f3oV4pu3I=; b=VTe7zIiGuXDVIXpEZ8sv5PTmwygF5WbcF1L+sCNS/r5eYE1Z9hGbMc5hKpJN7M4Zu+CYk9 B5pwLJsvj7GOtuis0L7R/L6z38zN6q0Gkmf2E3Zo84F2QurAFZnPI6UaiIoTYFzSwkhNtE vYAmnl0Z8dwgIRR+KLOw8WfUDZ5WaYM= ARC-Authentication-Results: i=1; imf15.hostedemail.com; dkim=none; dmarc=pass (policy=none) header.from=arm.com; spf=pass (imf15.hostedemail.com: domain of steven.price@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=steven.price@arm.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1690197468; a=rsa-sha256; cv=none; b=bThO+HKEHW1xMr4GyELEQu668YulSVpHmWiVxNewU2eu4Fhwb+Zbt77B+Omx+HKjgSMoC3 GFr4OzSc7cEh1QV6wpPkCxLj3BtMN75Ekv213hbDdo5OIXgqR+zIlVpuelzGHC5hfnMIAt 8QnhV4fB9FDKHzklquvAZNzhLE09vSs= Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id B206CDE0; Mon, 24 Jul 2023 04:18:29 -0700 (PDT) Received: from [10.57.34.62] (unknown [10.57.34.62]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id C518B3F5A1; Mon, 24 Jul 2023 04:17:39 -0700 (PDT) Message-ID: Date: Mon, 24 Jul 2023 12:17:40 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.13.0 Subject: Re: [PATCH v2 24/47] drm/panfrost: dynamically allocate the drm-panfrost shrinker To: Qi Zheng , akpm@linux-foundation.org, david@fromorbit.com, tkhai@ya.ru, vbabka@suse.cz, roman.gushchin@linux.dev, djwong@kernel.org, brauner@kernel.org, paulmck@kernel.org, tytso@mit.edu, cel@kernel.org, senozhatsky@chromium.org, yujie.liu@intel.com, gregkh@linuxfoundation.org, muchun.song@linux.dev Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, x86@kernel.org, kvm@vger.kernel.org, xen-devel@lists.xenproject.org, linux-erofs@lists.ozlabs.org, linux-f2fs-devel@lists.sourceforge.net, cluster-devel@redhat.com, linux-nfs@vger.kernel.org, linux-mtd@lists.infradead.org, rcu@vger.kernel.org, netdev@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, dm-devel@redhat.com, linux-raid@vger.kernel.org, linux-bcache@vger.kernel.org, virtualization@lists.linux-foundation.org, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, linux-xfs@vger.kernel.org, linux-btrfs@vger.kernel.org References: <20230724094354.90817-1-zhengqi.arch@bytedance.com> <20230724094354.90817-25-zhengqi.arch@bytedance.com> Content-Language: en-GB From: Steven Price In-Reply-To: <20230724094354.90817-25-zhengqi.arch@bytedance.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Rspamd-Queue-Id: 0AE17A0010 X-Rspam-User: X-Rspamd-Server: rspam02 X-Stat-Signature: hsfii1wpezi979sszyxgw8bwh68zoiqm X-HE-Tag: 1690197467-969291 X-HE-Meta: U2FsdGVkX185v6JfziVxa8F8qqEdwVKCVW7PPDXLqdRZ+DtcAjqLgMo226Bxd54q3Ujy/oXPOBS7wKFR7HIF2kk93St9AyZ825tsvjUWPAMhWjgpY7SdjNlYv/kVtHIeBE9/6IOwbrvDcd+HkGaOJmONa5FfS8Ajgd9tpJdrVjoBQAShTxYknFoxZFUUD0uWsH95mbW93Hb7KqI7xtOvxvCRi9oiqzHGXGO4pOLZPJMnoVs22yBDpuerpLUnOFAG7f0cFs/5+KL9zke/Fim0l5RmxLybMh30lF/ovZxn5uGrgmTb7UP44EsKUJsEOmjOrmEh/TGLzR8Fc2BYB9dvYJ2hIdvH7Gr/VRldAdUkwiOvE+JChsbd0M8me6Jd8tFifUSVShFPSuYZy+gDNE+Wl9X8FlHbxbaZ3ZvH9DSwq+uSZ0PgdPxr866k9ftggIuCEhjGbt43RAB1gkT1XJ+YggAN/jcjzFG2RW/sLKzr+rT3W4jmGZvMnhxy7a+94Nd1tMz8qwr6Frp+5bHu3WKERw1YT5fq0ZVeryEAJ5zARM+A96QsbbfUOizV8/gk3Ks9T7XaM6BsOHW4toQybbkSKdHc6K4d7ThzPW9buPgycZkOI19AfiwKhmcGV7asQRzGCJMTy/LytM/1p0fKdQTiKeNdtybBLgbOblp0ge6vspAVjgBZWbjOvMyEmEtlVlAGz8OCEeucVWS15Olo5gacec1JXOf9FcHiPsT82ILU3d4E7IgXNWXQm9gNQISft3oL2Ju6IoDE1Ae/LXAhi3EKbxWdltj8VZ+TjPvqz+pOS0YmaweUfmJv4H1qYBRVJZ572MpGwZL15CkPgVLRiYCdI70YIeLnXxTBab80pOXyAcabBpytbeI3NZWeOuEuEYyQlDOh+EeptjOcsPd5crp3LwsF90Pe+m5qDMrJ04RbH0i3KfVEtvAc5RI+G1wG9+2qGm2q3T5AfdWRM50/kYf WnFua7w+ BV55ILdy82lqqJyONKJPe5k120Gg8YQ3e6MfTImFhb3HjnnxEIkcLgKMEMAJlNdtxztEGm4+EvMp71E0W+9o2YgdQiMT6OzuTDIHJyXE0PoW8osuJdeZLtKprf4cpsbydbelP08R92P8H6SJrAYthcVTKKtzW/q1T/A3Q/rWWGtM7QycAo2fEniDo7YBJzIao7/K4oaObmFDAUVH8a4Ql+xVGZOLlEzIxuLVa X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On 24/07/2023 10:43, Qi Zheng wrote: > In preparation for implementing lockless slab shrink, use new APIs to > dynamically allocate the drm-panfrost shrinker, so that it can be freed > asynchronously using kfree_rcu(). Then it doesn't need to wait for RCU > read-side critical section when releasing the struct panfrost_device. > > Signed-off-by: Qi Zheng One nit below, but otherwise: Reviewed-by: Steven Price > --- > drivers/gpu/drm/panfrost/panfrost_device.h | 2 +- > drivers/gpu/drm/panfrost/panfrost_drv.c | 6 +++- > drivers/gpu/drm/panfrost/panfrost_gem.h | 2 +- > .../gpu/drm/panfrost/panfrost_gem_shrinker.c | 32 ++++++++++++------- > 4 files changed, 27 insertions(+), 15 deletions(-) > > diff --git a/drivers/gpu/drm/panfrost/panfrost_device.h b/drivers/gpu/drm/panfrost/panfrost_device.h > index b0126b9fbadc..e667e5689353 100644 > --- a/drivers/gpu/drm/panfrost/panfrost_device.h > +++ b/drivers/gpu/drm/panfrost/panfrost_device.h > @@ -118,7 +118,7 @@ struct panfrost_device { > > struct mutex shrinker_lock; > struct list_head shrinker_list; > - struct shrinker shrinker; > + struct shrinker *shrinker; > > struct panfrost_devfreq pfdevfreq; > }; > diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c > index bbada731bbbd..f705bbdea360 100644 > --- a/drivers/gpu/drm/panfrost/panfrost_drv.c > +++ b/drivers/gpu/drm/panfrost/panfrost_drv.c > @@ -598,10 +598,14 @@ static int panfrost_probe(struct platform_device *pdev) > if (err < 0) > goto err_out1; > > - panfrost_gem_shrinker_init(ddev); > + err = panfrost_gem_shrinker_init(ddev); > + if (err) > + goto err_out2; > > return 0; > > +err_out2: > + drm_dev_unregister(ddev); > err_out1: > pm_runtime_disable(pfdev->dev); > panfrost_device_fini(pfdev); > diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.h b/drivers/gpu/drm/panfrost/panfrost_gem.h > index ad2877eeeccd..863d2ec8d4f0 100644 > --- a/drivers/gpu/drm/panfrost/panfrost_gem.h > +++ b/drivers/gpu/drm/panfrost/panfrost_gem.h > @@ -81,7 +81,7 @@ panfrost_gem_mapping_get(struct panfrost_gem_object *bo, > void panfrost_gem_mapping_put(struct panfrost_gem_mapping *mapping); > void panfrost_gem_teardown_mappings_locked(struct panfrost_gem_object *bo); > > -void panfrost_gem_shrinker_init(struct drm_device *dev); > +int panfrost_gem_shrinker_init(struct drm_device *dev); > void panfrost_gem_shrinker_cleanup(struct drm_device *dev); > > #endif /* __PANFROST_GEM_H__ */ > diff --git a/drivers/gpu/drm/panfrost/panfrost_gem_shrinker.c b/drivers/gpu/drm/panfrost/panfrost_gem_shrinker.c > index bf0170782f25..9a90dfb5301f 100644 > --- a/drivers/gpu/drm/panfrost/panfrost_gem_shrinker.c > +++ b/drivers/gpu/drm/panfrost/panfrost_gem_shrinker.c > @@ -18,8 +18,7 @@ > static unsigned long > panfrost_gem_shrinker_count(struct shrinker *shrinker, struct shrink_control *sc) > { > - struct panfrost_device *pfdev = > - container_of(shrinker, struct panfrost_device, shrinker); > + struct panfrost_device *pfdev = shrinker->private_data; > struct drm_gem_shmem_object *shmem; > unsigned long count = 0; > > @@ -65,8 +64,7 @@ static bool panfrost_gem_purge(struct drm_gem_object *obj) > static unsigned long > panfrost_gem_shrinker_scan(struct shrinker *shrinker, struct shrink_control *sc) > { > - struct panfrost_device *pfdev = > - container_of(shrinker, struct panfrost_device, shrinker); > + struct panfrost_device *pfdev = shrinker->private_data; > struct drm_gem_shmem_object *shmem, *tmp; > unsigned long freed = 0; > > @@ -97,13 +95,24 @@ panfrost_gem_shrinker_scan(struct shrinker *shrinker, struct shrink_control *sc) > * > * This function registers and sets up the panfrost shrinker. > */ > -void panfrost_gem_shrinker_init(struct drm_device *dev) > +int panfrost_gem_shrinker_init(struct drm_device *dev) > { > struct panfrost_device *pfdev = dev->dev_private; > - pfdev->shrinker.count_objects = panfrost_gem_shrinker_count; > - pfdev->shrinker.scan_objects = panfrost_gem_shrinker_scan; > - pfdev->shrinker.seeks = DEFAULT_SEEKS; > - WARN_ON(register_shrinker(&pfdev->shrinker, "drm-panfrost")); > + > + pfdev->shrinker = shrinker_alloc(0, "drm-panfrost"); > + if (!pfdev->shrinker) { > + WARN_ON(1); I don't think this WARN_ON is particularly useful - if there's a failed memory allocation we should see output from the kernel anyway. And we're changing the semantics from "continue just without a shrinker" (which argueably justifies the warning) to "probe fails, device doesn't work" which will be obvious to the user so I don't feel we need the additional warn. > + return -ENOMEM; > + } > + > + pfdev->shrinker->count_objects = panfrost_gem_shrinker_count; > + pfdev->shrinker->scan_objects = panfrost_gem_shrinker_scan; > + pfdev->shrinker->seeks = DEFAULT_SEEKS; > + pfdev->shrinker->private_data = pfdev; > + > + shrinker_register(pfdev->shrinker); > + > + return 0; > } > > /** > @@ -116,7 +125,6 @@ void panfrost_gem_shrinker_cleanup(struct drm_device *dev) > { > struct panfrost_device *pfdev = dev->dev_private; > > - if (pfdev->shrinker.nr_deferred) { > - unregister_shrinker(&pfdev->shrinker); > - } > + if (pfdev->shrinker) > + shrinker_unregister(pfdev->shrinker); > }