From patchwork Thu Apr 25 15:51:13 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Emil Velikov X-Patchwork-Id: 10917409 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D1C711575 for ; Thu, 25 Apr 2019 15:51:51 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C2A1528D0A for ; Thu, 25 Apr 2019 15:51:51 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B596128D0E; Thu, 25 Apr 2019 15:51:51 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 3CCE528BB3 for ; Thu, 25 Apr 2019 15:51:51 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 2D01C891CB; Thu, 25 Apr 2019 15:51:50 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-wr1-x443.google.com (mail-wr1-x443.google.com [IPv6:2a00:1450:4864:20::443]) by gabe.freedesktop.org (Postfix) with ESMTPS id 5A5A4891CB; Thu, 25 Apr 2019 15:51:49 +0000 (UTC) Received: by mail-wr1-x443.google.com with SMTP id s15so66407wra.12; Thu, 25 Apr 2019 08:51:49 -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:mime-version :content-transfer-encoding; bh=B6SM9aX5iQydmzpc1DfeT9pGUIPYW+uh4vO6EJ3QDVE=; b=hH0ezTtlPwRLxkaE0Vslak5aW2XaPdtLprCodOXS2CzuJI8WJ9qsgkip76umHEq5US AgDhwTvP5ioVTn7mtvdgEafJsMqOw8Ki6SXYnVWnD6i+HI/1+/rUs2bBlO7Fi2m1pkzj vBBzLiTObMatQUw0REa7QXWD3yQ85Qfq/oF81pyq4jZFiLqp6c+jrXmoZ7TyjnB1sT6V GaSpF7SzkOwGICRcv/7l3mUr/SI1N1g1QasJZZ5v/91+OMlCYO4bNY0gMj17DhJ+i3Xp NXWE4HwQKoDWp9zmL6s0jHWYq0PKg/rCNebFTDUYtiTOXxSiRwPL6uL1DJzEDjVMFjgh 809g== X-Gm-Message-State: APjAAAV58/tuBh1NRcQ+x2rndA/4Lhn4O2RGeNfo6Vigkn6wqiRguzWK aOkfb7ft2wzWlT0qNMoQ3VhUA/E6 X-Google-Smtp-Source: APXvYqw/NhGOSVDkEykY37qIOaNeo4gk5ExjvBY6FWnPRNzZnZyQ5AYEOFVxZCfkeSrQOtQ59Oj9Ug== X-Received: by 2002:a5d:620e:: with SMTP id y14mr2149260wru.303.1556207507747; Thu, 25 Apr 2019 08:51:47 -0700 (PDT) Received: from arch-x1c3.cbg.collabora.co.uk ([2a00:5f00:102:0:9665:9cff:feee:aa4d]) by smtp.gmail.com with ESMTPSA id v17sm17268575wmc.30.2019.04.25.08.51.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 25 Apr 2019 08:51:46 -0700 (PDT) From: Emil Velikov To: dri-devel@lists.freedesktop.org Subject: [PATCH 1/2] drm/prime: split drm_gem_prime_fd_to_handle() Date: Thu, 25 Apr 2019 16:51:13 +0100 Message-Id: <20190425155114.533-1-emil.l.velikov@gmail.com> X-Mailer: git-send-email 2.21.0 MIME-Version: 1.0 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:mime-version :content-transfer-encoding; bh=B6SM9aX5iQydmzpc1DfeT9pGUIPYW+uh4vO6EJ3QDVE=; b=SZcMqaN20bS/MGm+/I/oGz85ywirhjyVPNI0hqrAnuwgREQumRofKdmgkQbCPxrwiN YQrEhDG6QZT/MtSyMQ5k8f36QjqsVWl/i9y3JMGwIah/tbjzYj+1DWUFWg/3L3mt8kU6 kB5veBhjHF1T4NHhTj1BLi0AhvLZRMEB77GGH7dO1AJKD3C2t1uQKw89++FbUj/JrwWS Ot8rDd6NhFp6uyyCQK9qE1pdRhNZn6nahuAZRCtcX9tUsK39Oji4SmDu6AUVixySRmwx 741cB4gOvnQgzTb3OrjutO8sMzMbcWZGnNwLR+Qx3ZVCi65fv84FKfoyWxM/Jwa4NTlt OGgQ== 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: intel-gfx-trybot@lists.freedesktop.org Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Emil Velikov Currently drm_gem_prime_fd_to_handle() consists of illegible amount of goto labels, for no obvious reason. Split it in two (as below) making the code far simpler and obvious. drm_gem_prime_fd_to_handle() - prime mtx handling - fd/dmabuf refcounting - hash table lookup import_buf_to_handle() - drm_gem_object import and locking - creating a handle for the gem object - adding the handle/fd to the hash table Cc: Daniel Vetter Signed-off-by: Emil Velikov --- drivers/gpu/drm/drm_prime.c | 86 ++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 45 deletions(-) diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c index dc079efb3b0f..0d83b9bbf793 100644 --- a/drivers/gpu/drm/drm_prime.c +++ b/drivers/gpu/drm/drm_prime.c @@ -777,37 +777,14 @@ struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev, } EXPORT_SYMBOL(drm_gem_prime_import); -/** - * drm_gem_prime_fd_to_handle - PRIME import function for GEM drivers - * @dev: dev to export the buffer from - * @file_priv: drm file-private structure - * @prime_fd: fd id of the dma-buf which should be imported - * @handle: pointer to storage for the handle of the imported buffer object - * - * This is the PRIME import function which must be used mandatorily by GEM - * drivers to ensure correct lifetime management of the underlying GEM object. - * The actual importing of GEM object from the dma-buf is done through the - * gem_import_export driver callback. - */ -int drm_gem_prime_fd_to_handle(struct drm_device *dev, - struct drm_file *file_priv, int prime_fd, - uint32_t *handle) +static int import_buf_to_handle(struct drm_device *dev, + struct drm_file *file_priv, + struct dma_buf *dma_buf, + uint32_t *handle) { - struct dma_buf *dma_buf; struct drm_gem_object *obj; int ret; - dma_buf = dma_buf_get(prime_fd); - if (IS_ERR(dma_buf)) - return PTR_ERR(dma_buf); - - mutex_lock(&file_priv->prime.lock); - - ret = drm_prime_lookup_buf_handle(&file_priv->prime, - dma_buf, handle); - if (ret == 0) - goto out_put; - /* never seen this one, need to import */ mutex_lock(&dev->object_name_lock); if (dev->driver->gem_prime_import) @@ -816,7 +793,8 @@ int drm_gem_prime_fd_to_handle(struct drm_device *dev, obj = drm_gem_prime_import(dev, dma_buf); if (IS_ERR(obj)) { ret = PTR_ERR(obj); - goto out_unlock; + mutex_unlock(&dev->object_name_lock); + return ret; } if (obj->dma_buf) { @@ -830,29 +808,47 @@ int drm_gem_prime_fd_to_handle(struct drm_device *dev, ret = drm_gem_handle_create_tail(file_priv, obj, handle); drm_gem_object_put_unlocked(obj); if (ret) - goto out_put; + return ret; - ret = drm_prime_add_buf_handle(&file_priv->prime, - dma_buf, *handle); - mutex_unlock(&file_priv->prime.lock); + ret = drm_prime_add_buf_handle(&file_priv->prime, dma_buf, *handle); if (ret) - goto fail; + /* hmm, if driver attached, we are relying on the free-object + * path to detach.. which seems ok.. + */ + drm_gem_handle_delete(file_priv, *handle); - dma_buf_put(dma_buf); + return ret; +} - return 0; +/** + * drm_gem_prime_fd_to_handle - PRIME import function for GEM drivers + * @dev: dev to export the buffer from + * @file_priv: drm file-private structure + * @prime_fd: fd id of the dma-buf which should be imported + * @handle: pointer to storage for the handle of the imported buffer object + * + * This is the PRIME import function which must be used mandatorily by GEM + * drivers to ensure correct lifetime management of the underlying GEM object. + * The actual importing of GEM object from the dma-buf is done through the + * gem_import_export driver callback. + */ +int drm_gem_prime_fd_to_handle(struct drm_device *dev, + struct drm_file *file_priv, int prime_fd, + uint32_t *handle) +{ + struct dma_buf *dma_buf; + int ret; -fail: - /* hmm, if driver attached, we are relying on the free-object path - * to detach.. which seems ok.. - */ - drm_gem_handle_delete(file_priv, *handle); - dma_buf_put(dma_buf); - return ret; + dma_buf = dma_buf_get(prime_fd); + if (IS_ERR(dma_buf)) + return PTR_ERR(dma_buf); + + mutex_lock(&file_priv->prime.lock); + + ret = drm_prime_lookup_buf_handle(&file_priv->prime, dma_buf, handle); + if (ret) + ret = import_buf_to_handle(dev, file_priv, dma_buf, handle); -out_unlock: - mutex_unlock(&dev->object_name_lock); -out_put: mutex_unlock(&file_priv->prime.lock); dma_buf_put(dma_buf); return ret;