From patchwork Fri Jan 15 16:23:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jinoh Kang X-Patchwork-Id: 12024823 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.5 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A8615C433E6 for ; Sat, 16 Jan 2021 10:45:20 +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 75625205CB for ; Sat, 16 Jan 2021 10:45:20 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 75625205CB 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 3EDBD6E5B9; Sat, 16 Jan 2021 10:44:46 +0000 (UTC) Received: from mail-pj1-x102b.google.com (mail-pj1-x102b.google.com [IPv6:2607:f8b0:4864:20::102b]) by gabe.freedesktop.org (Postfix) with ESMTPS id 1392B8996F; Fri, 15 Jan 2021 16:23:56 +0000 (UTC) Received: by mail-pj1-x102b.google.com with SMTP id md11so5346238pjb.0; Fri, 15 Jan 2021 08:23:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:subject:to:cc:autocrypt:message-id:date:user-agent :mime-version:content-language:content-transfer-encoding; bh=0bWLsMzRrkvBTIGz2qcs1q3qe/AihEtVALbGuZhphZQ=; b=Uahn2aILaF+kfuhg1e3jaEezXEZxAqy3IQJHTMJcv+dpWdO3H6ZkZgkgpAdDGEps53 w4b2SUnUVeRhxgDVYCqAEPNyFxJnzylyw4dLV2Rlg/3+eVDsCts6Mkjh6sK58ogR7zVm DUstZa/eUdtYgFnC2Td9n+Ao1fghTX6QAOdP3vU6bHZ/OlpfcrssEIAcg1BWq8jc4pei ZYZHRlqgzCZPk2+fo79v7QAMH7zdAd1aqHImuUh8QhadV3nxiofgLTfUK7IKhEey4B+9 5SsKrUjwIqp030tmTEHn4mYnMPoFeVRmccu8tEOmBoshRHe6w5Wah67QOQZFs782qSt7 9a9A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:subject:to:cc:autocrypt:message-id:date :user-agent:mime-version:content-language:content-transfer-encoding; bh=0bWLsMzRrkvBTIGz2qcs1q3qe/AihEtVALbGuZhphZQ=; b=bXYDO6CKBaWHZEQgdMb5EIXiWzzYPBqKNGoFSHgPKBBoHZ+f5bH7Ge7V1zTSu4qVG+ kSApissxZQCkbQvD8MtkpR79EiSzRQYxtlpzfbBZIBPjkXWfRnwSKUbtk6VcHzAnATU+ EVt5PQRC0c0MlfteOcQzMk9H9PgPyL0wSKzOTBB6yVVvKtd/2+RqQaQ3c8bt0S7DCDV6 rHGSeW4v5AZ7w0xK6MklnpHdBMvpAK4s+zE8avTwRZlOfjBcD1J1R7TrRabtPBfNVAmj cuOpSuJDvubID0t3guSO8iiYigvB2gxcGXe26QhKxIq6B+pLhYJdNn7WFYX4JDxVBHKz 1F2A== X-Gm-Message-State: AOAM5335JevB5juSoXNWOf6hznFB8Za+n5Nj2vPz42C0yuaLYY6ryYsm t2AMeFZvrb0yukXiSCxCRqA= X-Google-Smtp-Source: ABdhPJyR9jUdD0f5T0RcVxpMXHdIVprpMgj01Ne22eCwIcE74dzujRUMYWw3xAL6AuuQbgVPi/7NsQ== X-Received: by 2002:a17:902:8b8b:b029:de:3a7f:299d with SMTP id ay11-20020a1709028b8bb02900de3a7f299dmr11839024plb.16.1610727835637; Fri, 15 Jan 2021 08:23:55 -0800 (PST) Received: from [127.0.0.1] ([14.33.99.107]) by smtp.gmail.com with ESMTPSA id x1sm8521064pfc.112.2021.01.15.08.23.50 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 15 Jan 2021 08:23:54 -0800 (PST) From: Jinoh Kang Subject: [PATCH] drm/i915/userptr: detect un-GUP-able pages early To: =?utf-8?q?Marek_Marczykowski-G=C3=B3recki?= Autocrypt: addr=jinoh.kang.kr@gmail.com; keydata= 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 Nv8WeK9sQ0q6RmWqnT1HwyCBsVRR18k6XBM= Message-ID: Date: Fri, 15 Jan 2021 16:23:31 +0000 User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0 MIME-Version: 1.0 Content-Language: en-US X-Mailman-Approved-At: Sat, 16 Jan 2021 10:44:40 +0000 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: dri-devel@lists.freedesktop.org, David Airlie , intel-gfx@lists.freedesktop.org, linux-kernel@vger.kernel.org, Chris Wilson , Matthew Auld , Rodrigo Vivi Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" If GUP-ineligible pages are passed to a GEM userptr object, -EFAULT is returned only when the object is actually bound. The xf86-video-intel userspace driver cannot differentiate this condition, and marks the GPU as wedged. This not only disables graphics acceleration but may also cripple other functions such as VT switch. Solve this by "prefaulting" user pages on GEM object creation, testing whether all pages are eligible for get_user_pages() in the process. On failure, return -EFAULT so that userspace can fallback to software blitting. This behavior can be enabled via a new modparam "gem_userptr_prefault", which is false by default. Known use cases: - As a debugging aid, invalid pointers and/or wrong pages passed to userptr could be caught much earlier. - Qubes OS R4.0 uses VM_PFNMAP pages from drivers/xen/privcmd.c, in order to map framebuffers from Xen guest to dom0. These pages are not GUP-able, but they cannot be exposed via DMA-BUF either. Previously this issue had gone somehow undetected, until some patch between v4.14 and v4.19 triggered it. Signed-off-by: Jinoh Kang Cc: Marek Marczykowski-Górecki Cc: Jani Nikula Cc: Joonas Lahtinen Cc: Rodrigo Vivi Cc: David Airlie Cc: Daniel Vetter Cc: Chris Wilson Cc: Matthew Auld --- drivers/gpu/drm/i915/gem/i915_gem_userptr.c | 35 +++++++++++++++++++++ drivers/gpu/drm/i915/i915_params.c | 3 ++ drivers/gpu/drm/i915/i915_params.h | 1 + 3 files changed, 39 insertions(+) diff --git a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c index f2eaed6aca3d..5d653df2f759 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c @@ -712,6 +712,33 @@ static const struct drm_i915_gem_object_ops i915_gem_userptr_ops = { .release = i915_gem_userptr_release, }; +static int i915_gem_userptr_prefault(unsigned long start, + unsigned long nr_pages, + bool readonly) +{ + unsigned int gup_flags = (readonly ? 0 : FOLL_WRITE) | FOLL_NOWAIT; + int err = 0; + + mmap_read_lock(current->mm); + while (nr_pages) { + long ret; + + ret = get_user_pages(start, nr_pages, gup_flags, NULL, NULL); + if (ret < 0) { + err = (int)ret; + break; + } + if (ret == 0) + ret = 1; /* skip this page */ + + start += ret << PAGE_SHIFT; + nr_pages -= ret; + } + mmap_read_unlock(current->mm); + + return err; +} + /* * Creates a new mm object that wraps some normal memory from the process * context - user memory. @@ -796,6 +823,14 @@ i915_gem_userptr_ioctl(struct drm_device *dev, if (!access_ok((char __user *)(unsigned long)args->user_ptr, args->user_size)) return -EFAULT; + if (i915_modparams.gem_userptr_prefault) { + ret = i915_gem_userptr_prefault((unsigned long)args->user_ptr, + args->user_size >> PAGE_SHIFT, + args->flags & I915_USERPTR_READ_ONLY); + if (ret) + return ret; + } + if (args->flags & I915_USERPTR_READ_ONLY) { /* * On almost all of the older hw, we cannot tell the GPU that diff --git a/drivers/gpu/drm/i915/i915_params.c b/drivers/gpu/drm/i915/i915_params.c index 7f139ea4a90b..b5e0a88c059f 100644 --- a/drivers/gpu/drm/i915/i915_params.c +++ b/drivers/gpu/drm/i915/i915_params.c @@ -197,6 +197,9 @@ i915_param_named_unsafe(fake_lmem_start, ulong, 0400, "Fake LMEM start offset (default: 0)"); #endif +i915_param_named(gem_userptr_prefault, bool, 0600, + "Prefault pages when userptr GEM object is created (default: false)"); + static __always_inline void _print_param(struct drm_printer *p, const char *name, const char *type, diff --git a/drivers/gpu/drm/i915/i915_params.h b/drivers/gpu/drm/i915/i915_params.h index 330c03e2b4f7..323f60298b05 100644 --- a/drivers/gpu/drm/i915/i915_params.h +++ b/drivers/gpu/drm/i915/i915_params.h @@ -79,6 +79,7 @@ struct drm_printer; param(bool, disable_display, false, 0400) \ param(bool, verbose_state_checks, true, 0) \ param(bool, nuclear_pageflip, false, 0400) \ + param(bool, gem_userptr_prefault, false, 0600) \ param(bool, enable_dp_mst, true, 0600) \ param(bool, enable_gvt, false, 0400)