From patchwork Mon Oct 7 01:54:25 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qiang Yu X-Patchwork-Id: 11176703 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C0A6317EE for ; Mon, 7 Oct 2019 01:57:26 +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 A8C022080F for ; Mon, 7 Oct 2019 01:57:26 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A8C022080F Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.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 C2B386E443; Mon, 7 Oct 2019 01:57:25 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-pg1-x542.google.com (mail-pg1-x542.google.com [IPv6:2607:f8b0:4864:20::542]) by gabe.freedesktop.org (Postfix) with ESMTPS id 9B1066E442; Mon, 7 Oct 2019 01:57:24 +0000 (UTC) Received: by mail-pg1-x542.google.com with SMTP id p1so5442051pgi.4; Sun, 06 Oct 2019 18:57:24 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=dNm/7mewWpLjZU/+CTtHFe/1es29jZY16+A8GAg9LHU=; b=AeD5kJiqGYtIdBPtxudk/Swk1IPLoEzhqeWEjjpMEr9Zx4Ha7+Xihd2NTQ4dWTpWrc dQuxDAm5Nd0Ct6rvWtUJSxYAf8EVXRk3frcHYIufNOJXzljMJM0+p0RgRJbKDfQzM6gf arwtVTvDr0A9O3LgCDwZ//CsYE68kaAR5MYOwHRXo2UVAmGk7wuukNZw1yUpmeiAz0zE CPYTV4n4/+Zd3ezZ0XwUtAn4/VYYoCkb6YGkUdEGpImRc2vqYcDcKPdOS+o7+IcMmjwK Hbv934Ys0kU6lsaN7bPBbGYFx9NY+8N00R8PrdfA4voSgz+TcOftv+HTankZ3/JFR1m7 2oyQ== X-Gm-Message-State: APjAAAXpemlWK2z2u1h6+5vR4HNGxjPLy46tYpvQvnoDCeNdlJ0ueyVi 8NseBQuHUArd/QFpRlsFMPz1hXuD/BWIaw== X-Google-Smtp-Source: APXvYqyxERvEFhb7Q8Q77nbpeSf/sTH2wpog9N9HLLdsg99k8ryQtlcdFSH4sgSyHeNb53Ppc9+HFw== X-Received: by 2002:a65:6285:: with SMTP id f5mr14674217pgv.238.1570413443969; Sun, 06 Oct 2019 18:57:23 -0700 (PDT) Received: from yuq-Aspire-4738G.lan (ah.ptr230.ptrcloud.net. [153.122.161.8]) by smtp.gmail.com with ESMTPSA id b123sm18328536pgc.72.2019.10.06.18.57.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 06 Oct 2019 18:57:23 -0700 (PDT) From: Qiang Yu To: dri-devel@lists.freedesktop.org Subject: [PATCH v3 1/6] drm/gem: refine drm_gem_objects_lookup Date: Mon, 7 Oct 2019 09:54:25 +0800 Message-Id: <20191007015430.20829-2-yuq825@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191007015430.20829-1-yuq825@gmail.com> References: <20191007015430.20829-1-yuq825@gmail.com> X-Mailman-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=dNm/7mewWpLjZU/+CTtHFe/1es29jZY16+A8GAg9LHU=; b=WaQqgEgRD91ulkU/jp/BaEubq/bV7Ziwt5n7ikSkK5htllLm/pq5J12mGMKp9o/9mn rQ0WpOJkxA5J2nHGluLwLyyTGM5usnuhkqSoby+uhbnDiaBIeLj0Ui6CxGIKr8rpADSo Y+W9lr6RnOu3ayd0sm7UnP7GFYllJM2bgP5v0xOG48t5Gf1EhTW96EtyvsDM6HgMCDY4 zsvqw/OFnoPIANN2aGvHOLXnnvoA6XLxv3LtnNC2VXj1Csv7unwcRvAOQ9YfAREhPltn n+9+5Gc/ThoFdEIN7qVUzWI6EihRmcRc1CpgTd4al995Snm4TZ817UHuYSt+VyjdV03H 7rrA== X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Tomeu Vizoso , lima@lists.freedesktop.org, David Airlie , Maxime Ripard , Qiang Yu , Sean Paul , Alyssa Rosenzweig MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Change drm_gem_objects_lookup() to not use user space bo handles directly and add a new interface drm_gem_objects_lookup_user() for doing the original work. This is for driver like lima which does not pass gem bo handles continously in an array in ioctl argument. v2: 1. add drm_gem_objects_lookup_user 2. remove none-zero check as all caller will check before calling this function v3: improve commit comment. Cc: Tomeu Vizoso Cc: Alyssa Rosenzweig Suggested-by: Rob Herring Reviewed-by: Steven Price Signed-off-by: Qiang Yu --- drivers/gpu/drm/drm_gem.c | 57 +++++++++++++++++++------ drivers/gpu/drm/panfrost/panfrost_drv.c | 6 +-- include/drm/drm_gem.h | 4 +- 3 files changed, 49 insertions(+), 18 deletions(-) diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index 6854f5867d51..a5e88c3e6d25 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c @@ -679,11 +679,11 @@ static int objects_lookup(struct drm_file *filp, u32 *handle, int count, /** * drm_gem_objects_lookup - look up GEM objects from an array of handles * @filp: DRM file private date - * @bo_handles: user pointer to array of userspace handle + * @bo_handles: array of GEM object handles * @count: size of handle array * @objs_out: returned pointer to array of drm_gem_object pointers * - * Takes an array of userspace handles and returns a newly allocated array of + * Takes an array of GEM object handles and returns a newly allocated array of * GEM objects. * * For a single handle lookup, use drm_gem_object_lookup(). @@ -695,26 +695,56 @@ static int objects_lookup(struct drm_file *filp, u32 *handle, int count, * failure. 0 is returned on success. * */ -int drm_gem_objects_lookup(struct drm_file *filp, void __user *bo_handles, +int drm_gem_objects_lookup(struct drm_file *filp, u32 *bo_handles, int count, struct drm_gem_object ***objs_out) { int ret; - u32 *handles; struct drm_gem_object **objs; - if (!count) - return 0; - objs = kvmalloc_array(count, sizeof(struct drm_gem_object *), GFP_KERNEL | __GFP_ZERO); if (!objs) return -ENOMEM; + ret = objects_lookup(filp, bo_handles, count, objs); + if (ret) + kvfree(objs); + else + *objs_out = objs; + + return ret; + +} +EXPORT_SYMBOL(drm_gem_objects_lookup); + +/** + * drm_gem_objects_lookup_user - look up GEM objects from an array of handles + * @filp: DRM file private date + * @bo_handles: user pointer to array of userspace handle + * @count: size of handle array + * @objs_out: returned pointer to array of drm_gem_object pointers + * + * Takes an array of userspace handles and returns a newly allocated array of + * GEM objects. + * + * For a single handle lookup, use drm_gem_object_lookup(). + * + * Returns: + * + * @objs filled in with GEM object pointers. Returned GEM objects need to be + * released with drm_gem_object_put(). -ENOENT is returned on a lookup + * failure. 0 is returned on success. + * + */ +int drm_gem_objects_lookup_user(struct drm_file *filp, void __user *bo_handles, + int count, struct drm_gem_object ***objs_out) +{ + int ret; + u32 *handles; + handles = kvmalloc_array(count, sizeof(u32), GFP_KERNEL); - if (!handles) { - ret = -ENOMEM; - goto out; - } + if (!handles) + return -ENOMEM; if (copy_from_user(handles, bo_handles, count * sizeof(u32))) { ret = -EFAULT; @@ -722,15 +752,14 @@ int drm_gem_objects_lookup(struct drm_file *filp, void __user *bo_handles, goto out; } - ret = objects_lookup(filp, handles, count, objs); - *objs_out = objs; + ret = drm_gem_objects_lookup(filp, handles, count, objs_out); out: kvfree(handles); return ret; } -EXPORT_SYMBOL(drm_gem_objects_lookup); +EXPORT_SYMBOL(drm_gem_objects_lookup_user); /** * drm_gem_object_lookup - look up a GEM object from its handle diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c index d74442d71048..486ca51d5662 100644 --- a/drivers/gpu/drm/panfrost/panfrost_drv.c +++ b/drivers/gpu/drm/panfrost/panfrost_drv.c @@ -130,9 +130,9 @@ panfrost_lookup_bos(struct drm_device *dev, if (!job->implicit_fences) return -ENOMEM; - return drm_gem_objects_lookup(file_priv, - (void __user *)(uintptr_t)args->bo_handles, - job->bo_count, &job->bos); + return drm_gem_objects_lookup_user(file_priv, + (void __user *)(uintptr_t)args->bo_handles, + job->bo_count, &job->bos); } /** diff --git a/include/drm/drm_gem.h b/include/drm/drm_gem.h index 6aaba14f5972..354fc8d240e4 100644 --- a/include/drm/drm_gem.h +++ b/include/drm/drm_gem.h @@ -387,8 +387,10 @@ struct page **drm_gem_get_pages(struct drm_gem_object *obj); void drm_gem_put_pages(struct drm_gem_object *obj, struct page **pages, bool dirty, bool accessed); -int drm_gem_objects_lookup(struct drm_file *filp, void __user *bo_handles, +int drm_gem_objects_lookup(struct drm_file *filp, u32 *bo_handles, int count, struct drm_gem_object ***objs_out); +int drm_gem_objects_lookup_user(struct drm_file *filp, void __user *bo_handles, + int count, struct drm_gem_object ***objs_out); struct drm_gem_object *drm_gem_object_lookup(struct drm_file *filp, u32 handle); long drm_gem_dma_resv_wait(struct drm_file *filep, u32 handle, bool wait_all, unsigned long timeout);