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 E718FECAAA1 for ; Fri, 9 Sep 2022 11:16:47 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 3BBCB8D0003; Fri, 9 Sep 2022 07:16:47 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 35FB28D0005; Fri, 9 Sep 2022 07:16:47 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 1FF818D0003; Fri, 9 Sep 2022 07:16:47 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 107648D0002 for ; Fri, 9 Sep 2022 07:16:47 -0400 (EDT) Received: from smtpin03.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id DE852ABBBB for ; Fri, 9 Sep 2022 11:16:46 +0000 (UTC) X-FDA: 79892294412.03.9F43E27 Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [85.220.165.71]) by imf28.hostedemail.com (Postfix) with ESMTP id 83363C00AB for ; Fri, 9 Sep 2022 11:16:46 +0000 (UTC) Received: from dude02.red.stw.pengutronix.de ([2a0a:edc0:0:1101:1d::28]) by metis.ext.pengutronix.de with esmtp (Exim 4.92) (envelope-from ) id 1oWc05-0002dP-2O; Fri, 09 Sep 2022 13:16:45 +0200 From: Lucas Stach To: linux-mm@kvack.org, dri-devel@lists.freedesktop.org Cc: Daniel Vetter , David Airlie , Andrew Morton , Michal Hocko , =?UTF-8?q?Christian=20K=C3=B6nig?= , linux-fsdevel@vger.kernel.org, kernel@pengutronix.de Subject: [RFC PATCH 3/5] drm/gem: add functions to account GEM object memory usage Date: Fri, 9 Sep 2022 13:16:38 +0200 Message-Id: <20220909111640.3789791-4-l.stach@pengutronix.de> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220909111640.3789791-1-l.stach@pengutronix.de> References: <20220909111640.3789791-1-l.stach@pengutronix.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SA-Exim-Connect-IP: 2a0a:edc0:0:1101:1d::28 X-SA-Exim-Mail-From: l.stach@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-mm@kvack.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1662722206; a=rsa-sha256; cv=none; b=d5mB4o43yia6V7ZB+XUflw5aRqbUPVSv40zplZ627+eYW00OH1ECE3WuYm/Mwu2crhqvLN BxOVSisBqoI10ZljC04S6P9/cAgkrqEb/KcrOS4EYTA2w8qCJxuPKmpQGA+gJB00O2RGL8 PxXOyCScZrK3pGZgntTJtn4jvjdfwYw= ARC-Authentication-Results: i=1; imf28.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf28.hostedemail.com: domain of l.stach@pengutronix.de designates 85.220.165.71 as permitted sender) smtp.mailfrom=l.stach@pengutronix.de ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1662722206; 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-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=gAz3JIKMoJT6m7Xnf6bEU72XdJE+Pv5UXas8WvXrcmI=; b=Z+J3WqucOTAVn/SBgdemwxnNZHXcnGfsSfVvdkIM2j3FwRICZIqNXV9Vgcm7GDyVGYrapI hpP04801/a7Rr7ypmsYTWKljy2NaZzKpjjj/PPNFUkYT71C+Cy2Qq1HWJ6m++DJ6ob+iad asSO29a4+jddntviGAYgUuv5RVK7exk= X-Rspam-User: X-Rspamd-Server: rspam05 Authentication-Results: imf28.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf28.hostedemail.com: domain of l.stach@pengutronix.de designates 85.220.165.71 as permitted sender) smtp.mailfrom=l.stach@pengutronix.de X-Stat-Signature: m1ankf9dbp1dpu6wwfsf7okm88qe4x4y X-Rspamd-Queue-Id: 83363C00AB X-HE-Tag: 1662722206-50803 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: This adds some functions which driver can call to make the MM aware of the resident memory used by the GEM object. As drivers will have different points where memory is made resident/pinned into system memory, this just adds the helper functions and drivers need to make sure to call them at the right points. Signed-off-by: Lucas Stach --- drivers/gpu/drm/drm_gem.c | 37 +++++++++++++++++++++++++++++++++++++ include/drm/drm_gem.h | 3 +++ 2 files changed, 40 insertions(+) diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index b882f935cd4b..efccd0a1dde7 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c @@ -1279,3 +1279,40 @@ drm_gem_unlock_reservations(struct drm_gem_object **objs, int count, ww_acquire_fini(acquire_ctx); } EXPORT_SYMBOL(drm_gem_unlock_reservations); + +/** + * drm_gem_add_resident - Account memory used by GEM object to the + * task which called drm_gem_object_init(). Call when the pages are + * made resident in system memory, i.e. pinned for GPU usage. + * + * @obj: GEM buffer object + */ +void drm_gem_add_resident(struct drm_gem_object *obj) +{ + if (!mmget_not_zero(obj->mm)) + return; + + add_mm_counter(obj->mm, MM_DRIVERPAGES, obj->size / PAGE_SIZE); + + mmput(obj->mm); +} +EXPORT_SYMBOL(drm_gem_add_resident) + +/** + * drm_gem_dec_resident - Remove memory used by GEM object accounted + * to the task which called drm_gem_object_init(). Call this when the + * pages backing the GEM object are no longer resident in system memory, + * i.e. when freeing or unpinning the pages. + * + * @obj: GEM buffer object + */ +void drm_gem_dec_resident(struct drm_gem_object *obj) +{ + if (!mmget_not_zero(obj->mm)) + return; + + add_mm_counter(obj->mm, MM_DRIVERPAGES, -(obj->size / PAGE_SIZE)); + + mmput(obj->mm); +} +EXPORT_SYMBOL(drm_gem_dec_resident) diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h index d021a083c282..5951963a2f1a 100644 --- a/include/drm/drm_gem.h +++ b/include/drm/drm_gem.h @@ -374,6 +374,9 @@ int drm_gem_mmap_obj(struct drm_gem_object *obj, unsigned long obj_size, struct vm_area_struct *vma); int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma); +void drm_gem_add_resident(struct drm_gem_object *obj); +void drm_gem_dec_resident(struct drm_gem_object *obj); + /** * drm_gem_object_get - acquire a GEM buffer object reference * @obj: GEM buffer object -- 2.30.2