From nobody Sat Apr 18 01:28:23 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 34363C433EF for ; Wed, 20 Jul 2022 04:42:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238594AbiGTEmR (ORCPT ); Wed, 20 Jul 2022 00:42:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47728 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235726AbiGTEmK (ORCPT ); Wed, 20 Jul 2022 00:42:10 -0400 Received: from mail-pj1-x102b.google.com (mail-pj1-x102b.google.com [IPv6:2607:f8b0:4864:20::102b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9A8BA4D826 for ; Tue, 19 Jul 2022 21:42:08 -0700 (PDT) Received: by mail-pj1-x102b.google.com with SMTP id s18-20020a17090aa11200b001f1e9e2438cso923416pjp.2 for ; Tue, 19 Jul 2022 21:42:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=z6PUXTFpSe4hiCUpV3CY8funZOBFDw7H3e5Gt/0oRi8=; b=IiA+Q3w7zcBZOjHNflXfuaDtcS0ofGYGJgJWsq4Cf7CP0tR6FSimksTaqsZ9RVrCvo hVQl0Sxm4Qmk/1Wh+8uoKT2FQfORQnp3GvzPZL4n4zE6VpagMTb7V5Wh0Qouy9+dsKRb pdIqK2s6JusvHaXj6WCdei7BHZbhFbNhZcdZV4BgLbv8rkJwTaBgmKqfL8ati8gMD/hz 0fwQghDnWZbUKuL6JStZQEaPokRjdWQI/PXd+/aCan+fkymViXTxaCvTjO57CcU5HkuS OvRcoq6NbtIvCJD3fSA967WLAIYtbsHHkAI2Z8OgBhg5X0oaw5jQS0xkU5ruzaZLWIT2 zvnA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=z6PUXTFpSe4hiCUpV3CY8funZOBFDw7H3e5Gt/0oRi8=; b=ti+O8qcsBUHfcLqGG+X4ukakL0xNPJRRFIiXysD+s6WIaRENcizB7oHS5MsVO9v81y yYyZOSjh7IKJQaazyikTfu57VuH7o4xAuTcH56+FaLJ87KZ3aEKmGnVMV6QYYwCqW5CR LmtOLtl9ikiKBEsGgF+O0KKtkWTvVDaeI92DCJe/eAI6v/MK3PCtWz1mBmKKpbLyc7yM RvE0siJcRi8ta7BkAHxhknfgkVNlHgdxh4z1EA2NwMhRSvrBJH1rebkLHbepTiGwAwLr t+TsRYUJLY2l/2nluXiXEorl1IcGx7s+NeVElTXcDdt2CE3J8Z2ovybzaMYR0xAXrh1U 5JCg== X-Gm-Message-State: AJIora/CjAUBbRuteOo+XC7f9HUG9UgpUuOi3eZf7ThvZUoeGXv/XFbW Ynue+ZBB0flPjBv+2TGOKMQA X-Google-Smtp-Source: AGRyM1tt91KBDyuERAEmvcgNVxEzq6JDq55QvVpRznWDCgI3BajGSlbzGAniss0JVswRpX8Scw0Pmg== X-Received: by 2002:a17:90b:3c0c:b0:1ef:e647:ff48 with SMTP id pb12-20020a17090b3c0c00b001efe647ff48mr3189743pjb.173.1658292128063; Tue, 19 Jul 2022 21:42:08 -0700 (PDT) Received: from localhost ([139.177.225.253]) by smtp.gmail.com with ESMTPSA id r16-20020aa79890000000b005254e44b748sm12303495pfl.84.2022.07.19.21.42.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Jul 2022 21:42:07 -0700 (PDT) From: Xie Yongji To: mst@redhat.com, jasowang@redhat.com, xiaodong.liu@intel.com, maxime.coquelin@redhat.com, stefanha@redhat.com Cc: songmuchun@bytedance.com, virtualization@lists.linux-foundation.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 1/5] vduse: Remove unnecessary spin lock protection Date: Wed, 20 Jul 2022 12:41:40 +0800 Message-Id: <20220720044144.90-2-xieyongji@bytedance.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220720044144.90-1-xieyongji@bytedance.com> References: <20220720044144.90-1-xieyongji@bytedance.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Now we use domain->iotlb_lock to protect two different variables: domain->bounce_maps->bounce_page and domain->iotlb. But for domain->bounce_maps->bounce_page, we actually don't need any synchronization between vduse_domain_get_bounce_page() and vduse_domain_free_bounce_pages() since vduse_domain_get_bounce_page() will only be called in page fault handler and vduse_domain_free_bounce_pages() will be called during file release. So let's remove the unnecessary spin lock protection in vduse_domain_get_bounce_page(). Then the usage of domain->iotlb_lock could be more clear: the lock will be only used to protect the domain->iotlb. Signed-off-by: Xie Yongji Acked-by: Jason Wang --- drivers/vdpa/vdpa_user/iova_domain.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/drivers/vdpa/vdpa_user/iova_domain.c b/drivers/vdpa/vdpa_user/= iova_domain.c index 6daa3978d290..bca1f0b8850c 100644 --- a/drivers/vdpa/vdpa_user/iova_domain.c +++ b/drivers/vdpa/vdpa_user/iova_domain.c @@ -211,17 +211,14 @@ static struct page * vduse_domain_get_bounce_page(struct vduse_iova_domain *domain, u64 iova) { struct vduse_bounce_map *map; - struct page *page =3D NULL; + struct page *page; =20 - spin_lock(&domain->iotlb_lock); map =3D &domain->bounce_maps[iova >> PAGE_SHIFT]; if (!map->bounce_page) - goto out; + return NULL; =20 page =3D map->bounce_page; get_page(page); -out: - spin_unlock(&domain->iotlb_lock); =20 return page; } --=20 2.20.1 From nobody Sat Apr 18 01:28:23 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5F0E4C433EF for ; Wed, 20 Jul 2022 04:42:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238890AbiGTEmU (ORCPT ); Wed, 20 Jul 2022 00:42:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47834 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238484AbiGTEmP (ORCPT ); Wed, 20 Jul 2022 00:42:15 -0400 Received: from mail-pf1-x42f.google.com (mail-pf1-x42f.google.com [IPv6:2607:f8b0:4864:20::42f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CCD7B4D81A for ; Tue, 19 Jul 2022 21:42:11 -0700 (PDT) Received: by mail-pf1-x42f.google.com with SMTP id 17so5163874pfy.0 for ; Tue, 19 Jul 2022 21:42:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=s+4wXLhCqMOnatfAou0qtELmUB5gm3L0a/ZVBnly/jQ=; b=t2MZ1IsaQ3n2EXNUQ1JyEG6zysWpWMMHguIetrtJeT2xEzyMtSjWzlSeZYxmXsa9B2 aGIK+V9RGAG33dmV6r0YF4C8o3WTieruPmCHkjps9nYquVJr/+3F/SY2M11yiPFTrYI6 CvOhUclItF4qhzVTJGLNC/9OIJMH4ZRM9QDxU5Rmvqr90b9EJ5aqAKCj+t04FUhgRI3C afp9cTGmkl8dzOlEbcMyLjReT8vmkOIBq0ZXRI6njNKESJSk6oiyWDatAYMkX/Roy0cl ZVMrBp12q1KVdJv8Q0U2goQj3gM1OPYlcEYdu/AF2YkSCKqU5dTnzhJcm+uNKx7ixXTI lr9A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=s+4wXLhCqMOnatfAou0qtELmUB5gm3L0a/ZVBnly/jQ=; b=0PADzvlFgzKeAU+fgdhV9jWi//ihTsmfAcWCg9XIT3Kou2OQTdLBQZI+NdTAMRCO+k dT/Wf402taRfIt0wRolSD5LmVTbF9/MuERDV+cGSaWezL1ch8V+hXYB8a3jJSXhX3l6o 64awznE9FUpQ+tWl49M9jkRRnxH3fk2qHVZA/3rSs/tSJI8TduMb3MP6LmjV5DwZhNIk ToZNBctLKeHpzbO+2WDnwELEETu/xgzACuxUareDmdbUKbaSVyQnnjCeXZmJCO9OjIOk rp4FTjxyCm6niplQ4zSzmFUG+auLx224yiv+ReFsj1p2C1Y2hJZoZSh59g8+im9WgoUU oJaw== X-Gm-Message-State: AJIora8rZYMq/jACmwrBBDQLzz56sQlodF9kIE07YR3dR0y5QfV0xEWk vcwow+p2ZXh/M4aZG025tlKb X-Google-Smtp-Source: AGRyM1u0zHPbglOpZK7eHiym3Ks0QoaMZC09LG/TNQRAdzM+DXT6fspLpPRd4YGGyBsi8pfcPBAUtA== X-Received: by 2002:a63:4546:0:b0:41a:5e8f:508a with SMTP id u6-20020a634546000000b0041a5e8f508amr2630148pgk.419.1658292131380; Tue, 19 Jul 2022 21:42:11 -0700 (PDT) Received: from localhost ([139.177.225.253]) by smtp.gmail.com with ESMTPSA id v26-20020aa799da000000b0052b11fdb353sm11966201pfi.125.2022.07.19.21.42.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Jul 2022 21:42:11 -0700 (PDT) From: Xie Yongji To: mst@redhat.com, jasowang@redhat.com, xiaodong.liu@intel.com, maxime.coquelin@redhat.com, stefanha@redhat.com Cc: songmuchun@bytedance.com, virtualization@lists.linux-foundation.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 2/5] vduse: Use memcpy_{to,from}_page() in do_bounce() Date: Wed, 20 Jul 2022 12:41:41 +0800 Message-Id: <20220720044144.90-3-xieyongji@bytedance.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220720044144.90-1-xieyongji@bytedance.com> References: <20220720044144.90-1-xieyongji@bytedance.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" kmap_atomic() is being deprecated in favor of kmap_local_page(). The use of kmap_atomic() in do_bounce() is all thread local therefore kmap_local_page() is a sufficient replacement. Convert to kmap_local_page() but, instead of open coding it, use the helpers memcpy_to_page() and memcpy_from_page(). Signed-off-by: Xie Yongji Acked-by: Jason Wang --- drivers/vdpa/vdpa_user/iova_domain.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/drivers/vdpa/vdpa_user/iova_domain.c b/drivers/vdpa/vdpa_user/= iova_domain.c index bca1f0b8850c..50d7c08d5450 100644 --- a/drivers/vdpa/vdpa_user/iova_domain.c +++ b/drivers/vdpa/vdpa_user/iova_domain.c @@ -138,18 +138,17 @@ static void do_bounce(phys_addr_t orig, void *addr, s= ize_t size, { unsigned long pfn =3D PFN_DOWN(orig); unsigned int offset =3D offset_in_page(orig); - char *buffer; + struct page *page; unsigned int sz =3D 0; =20 while (size) { sz =3D min_t(size_t, PAGE_SIZE - offset, size); =20 - buffer =3D kmap_atomic(pfn_to_page(pfn)); + page =3D pfn_to_page(pfn); if (dir =3D=3D DMA_TO_DEVICE) - memcpy(addr, buffer + offset, sz); + memcpy_from_page(addr, page, offset, sz); else - memcpy(buffer + offset, addr, sz); - kunmap_atomic(buffer); + memcpy_to_page(page, offset, addr, sz); =20 size -=3D sz; pfn++; --=20 2.20.1 From nobody Sat Apr 18 01:28:23 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D2C61C43334 for ; Wed, 20 Jul 2022 04:42:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239055AbiGTEmY (ORCPT ); Wed, 20 Jul 2022 00:42:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47834 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237581AbiGTEmQ (ORCPT ); Wed, 20 Jul 2022 00:42:16 -0400 Received: from mail-pl1-x635.google.com (mail-pl1-x635.google.com [IPv6:2607:f8b0:4864:20::635]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4FD20691C5 for ; Tue, 19 Jul 2022 21:42:15 -0700 (PDT) Received: by mail-pl1-x635.google.com with SMTP id j12so13899129plj.8 for ; Tue, 19 Jul 2022 21:42:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=IeWgvHDRHWZn+DoRaxWOIjRe7JEa4Bj9/yuG68KCgS0=; b=Bdwy4IdoCQI1l+5CqJbESqz0Tmo3v/4ux/jcvzj+eiCUlka2MC2zeeAydN4bRz32S3 09s1n7dg3WXU9uGDITjEaoiobD5BJJSvKHNjkDBgBwD+UcbREGZmzpRJq7Lg+arqTLZC NKAvxoDof5f1CdgPUIilEjNPanqLu6q2Koe6xzb4BnEvDeP75vDipVmJ3xL//wM0/+Fb 5QIrzSAeZfna7Y60jsC8c3fji1ffAX4dUHLdOXjDgAdyhxjR3WxhpSbfcUSGYdUqOVQ3 DKqL3MI2ufKUD07psKJL0DqJsGRy+2TFju4maETpCcG0O7V3RkbKAi9w+CU5QSFEtqP9 mYyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=IeWgvHDRHWZn+DoRaxWOIjRe7JEa4Bj9/yuG68KCgS0=; b=1W8fDrmktgHncOFM0Bj1l27tiQJAzpO6T5y/hoKHWETl1xtsnKu0Y9+ZkT1/ZsLo+7 cTSUn8zmDK90rVNp9cI1ezQ/exZob9YdqSNRjNkikSzUDFv0IXrtWECs8F2j5b9tUeS1 HqJGD6otyWwrqXGEgontjGtFQ6OqC4mraZepxmX7AjLFM8GKmvVkxqYeZK2L7851ktLz ny4fdRSY4dRDlgObHaDnHP3xhsW6EFQkKdsZ91EYQeqPhI4+YCux4JKvm/5tSBNVX5ti ouKH9nsjOAJY4BrbEnYUli6gLY4g1v8r6TaeBMeMyQXSX0JUYT3zivNxtQvqD4nPRrPC b5Cg== X-Gm-Message-State: AJIora9TlQByE5dS9pmePXsAqKz9KCjNouQBJVlLoTssVpIrubOPLetJ PMVdNOxlfhDU8rV4/j8hANtK X-Google-Smtp-Source: AGRyM1tPfnqbVqOQ4Rfd/JdhNMcY5p7IuErHd9seobSWd/lMrJty//OtMqcFKBMLKKH79eHTgzQqwA== X-Received: by 2002:a17:903:18b:b0:16c:4026:610 with SMTP id z11-20020a170903018b00b0016c40260610mr37226332plg.122.1658292134774; Tue, 19 Jul 2022 21:42:14 -0700 (PDT) Received: from localhost ([139.177.225.253]) by smtp.gmail.com with ESMTPSA id r5-20020aa79885000000b00525442ac579sm12373748pfl.212.2022.07.19.21.42.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Jul 2022 21:42:14 -0700 (PDT) From: Xie Yongji To: mst@redhat.com, jasowang@redhat.com, xiaodong.liu@intel.com, maxime.coquelin@redhat.com, stefanha@redhat.com Cc: songmuchun@bytedance.com, virtualization@lists.linux-foundation.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 3/5] vduse: Support using userspace pages as bounce buffer Date: Wed, 20 Jul 2022 12:41:42 +0800 Message-Id: <20220720044144.90-4-xieyongji@bytedance.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220720044144.90-1-xieyongji@bytedance.com> References: <20220720044144.90-1-xieyongji@bytedance.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Introduce two APIs: vduse_domain_add_user_bounce_pages() and vduse_domain_remove_user_bounce_pages() to support adding and removing userspace pages for bounce buffers. During adding and removing, the DMA data would be copied from the kernel bounce pages to the userspace bounce pages and back. Signed-off-by: Xie Yongji Acked-by: Jason Wang --- drivers/vdpa/vdpa_user/iova_domain.c | 96 +++++++++++++++++++++++++--- drivers/vdpa/vdpa_user/iova_domain.h | 8 +++ 2 files changed, 96 insertions(+), 8 deletions(-) diff --git a/drivers/vdpa/vdpa_user/iova_domain.c b/drivers/vdpa/vdpa_user/= iova_domain.c index 50d7c08d5450..e682bc7ee6c9 100644 --- a/drivers/vdpa/vdpa_user/iova_domain.c +++ b/drivers/vdpa/vdpa_user/iova_domain.c @@ -178,8 +178,9 @@ static void vduse_domain_bounce(struct vduse_iova_domai= n *domain, map->orig_phys =3D=3D INVALID_PHYS_ADDR)) return; =20 - addr =3D page_address(map->bounce_page) + offset; - do_bounce(map->orig_phys + offset, addr, sz, dir); + addr =3D kmap_local_page(map->bounce_page); + do_bounce(map->orig_phys + offset, addr + offset, sz, dir); + kunmap_local(addr); size -=3D sz; iova +=3D sz; } @@ -210,20 +211,23 @@ static struct page * vduse_domain_get_bounce_page(struct vduse_iova_domain *domain, u64 iova) { struct vduse_bounce_map *map; - struct page *page; + struct page *page =3D NULL; =20 + read_lock(&domain->bounce_lock); map =3D &domain->bounce_maps[iova >> PAGE_SHIFT]; - if (!map->bounce_page) - return NULL; + if (domain->user_bounce_pages || !map->bounce_page) + goto out; =20 page =3D map->bounce_page; get_page(page); +out: + read_unlock(&domain->bounce_lock); =20 return page; } =20 static void -vduse_domain_free_bounce_pages(struct vduse_iova_domain *domain) +vduse_domain_free_kernel_bounce_pages(struct vduse_iova_domain *domain) { struct vduse_bounce_map *map; unsigned long pfn, bounce_pfns; @@ -243,6 +247,73 @@ vduse_domain_free_bounce_pages(struct vduse_iova_domai= n *domain) } } =20 +int vduse_domain_add_user_bounce_pages(struct vduse_iova_domain *domain, + struct page **pages, int count) +{ + struct vduse_bounce_map *map; + int i, ret; + + /* Now we don't support partial mapping */ + if (count !=3D (domain->bounce_size >> PAGE_SHIFT)) + return -EINVAL; + + write_lock(&domain->bounce_lock); + ret =3D -EEXIST; + if (domain->user_bounce_pages) + goto out; + + for (i =3D 0; i < count; i++) { + map =3D &domain->bounce_maps[i]; + if (map->bounce_page) { + /* Copy kernel page to user page if it's in use */ + if (map->orig_phys !=3D INVALID_PHYS_ADDR) + memcpy_to_page(pages[i], 0, + page_address(map->bounce_page), + PAGE_SIZE); + __free_page(map->bounce_page); + } + map->bounce_page =3D pages[i]; + get_page(pages[i]); + } + domain->user_bounce_pages =3D true; + ret =3D 0; +out: + write_unlock(&domain->bounce_lock); + + return ret; +} + +void vduse_domain_remove_user_bounce_pages(struct vduse_iova_domain *domai= n) +{ + struct vduse_bounce_map *map; + unsigned long i, count; + + write_lock(&domain->bounce_lock); + if (!domain->user_bounce_pages) + goto out; + + count =3D domain->bounce_size >> PAGE_SHIFT; + for (i =3D 0; i < count; i++) { + struct page *page =3D NULL; + + map =3D &domain->bounce_maps[i]; + if (WARN_ON(!map->bounce_page)) + continue; + + /* Copy user page to kernel page if it's in use */ + if (map->orig_phys !=3D INVALID_PHYS_ADDR) { + page =3D alloc_page(GFP_ATOMIC | __GFP_NOFAIL); + memcpy_from_page(page_address(page), + map->bounce_page, 0, PAGE_SIZE); + } + put_page(map->bounce_page); + map->bounce_page =3D page; + } + domain->user_bounce_pages =3D false; +out: + write_unlock(&domain->bounce_lock); +} + void vduse_domain_reset_bounce_map(struct vduse_iova_domain *domain) { if (!domain->bounce_map) @@ -318,13 +389,18 @@ dma_addr_t vduse_domain_map_page(struct vduse_iova_do= main *domain, if (vduse_domain_init_bounce_map(domain)) goto err; =20 + read_lock(&domain->bounce_lock); if (vduse_domain_map_bounce_page(domain, (u64)iova, (u64)size, pa)) - goto err; + goto err_unlock; =20 if (dir =3D=3D DMA_TO_DEVICE || dir =3D=3D DMA_BIDIRECTIONAL) vduse_domain_bounce(domain, iova, size, DMA_TO_DEVICE); =20 + read_unlock(&domain->bounce_lock); + return iova; +err_unlock: + read_unlock(&domain->bounce_lock); err: vduse_domain_free_iova(iovad, iova, size); return DMA_MAPPING_ERROR; @@ -336,10 +412,12 @@ void vduse_domain_unmap_page(struct vduse_iova_domain= *domain, { struct iova_domain *iovad =3D &domain->stream_iovad; =20 + read_lock(&domain->bounce_lock); if (dir =3D=3D DMA_FROM_DEVICE || dir =3D=3D DMA_BIDIRECTIONAL) vduse_domain_bounce(domain, dma_addr, size, DMA_FROM_DEVICE); =20 vduse_domain_unmap_bounce_page(domain, (u64)dma_addr, (u64)size); + read_unlock(&domain->bounce_lock); vduse_domain_free_iova(iovad, dma_addr, size); } =20 @@ -447,7 +525,8 @@ static int vduse_domain_release(struct inode *inode, st= ruct file *file) =20 spin_lock(&domain->iotlb_lock); vduse_iotlb_del_range(domain, 0, ULLONG_MAX); - vduse_domain_free_bounce_pages(domain); + vduse_domain_remove_user_bounce_pages(domain); + vduse_domain_free_kernel_bounce_pages(domain); spin_unlock(&domain->iotlb_lock); put_iova_domain(&domain->stream_iovad); put_iova_domain(&domain->consistent_iovad); @@ -507,6 +586,7 @@ vduse_domain_create(unsigned long iova_limit, size_t bo= unce_size) goto err_file; =20 domain->file =3D file; + rwlock_init(&domain->bounce_lock); spin_lock_init(&domain->iotlb_lock); init_iova_domain(&domain->stream_iovad, PAGE_SIZE, IOVA_START_PFN); diff --git a/drivers/vdpa/vdpa_user/iova_domain.h b/drivers/vdpa/vdpa_user/= iova_domain.h index 2722d9b8e21a..4e0e50e7ac15 100644 --- a/drivers/vdpa/vdpa_user/iova_domain.h +++ b/drivers/vdpa/vdpa_user/iova_domain.h @@ -14,6 +14,7 @@ #include #include #include +#include =20 #define IOVA_START_PFN 1 =20 @@ -34,6 +35,8 @@ struct vduse_iova_domain { struct vhost_iotlb *iotlb; spinlock_t iotlb_lock; struct file *file; + bool user_bounce_pages; + rwlock_t bounce_lock; }; =20 int vduse_domain_set_map(struct vduse_iova_domain *domain, @@ -61,6 +64,11 @@ void vduse_domain_free_coherent(struct vduse_iova_domain= *domain, size_t size, =20 void vduse_domain_reset_bounce_map(struct vduse_iova_domain *domain); =20 +int vduse_domain_add_user_bounce_pages(struct vduse_iova_domain *domain, + struct page **pages, int count); + +void vduse_domain_remove_user_bounce_pages(struct vduse_iova_domain *domai= n); + void vduse_domain_destroy(struct vduse_iova_domain *domain); =20 struct vduse_iova_domain *vduse_domain_create(unsigned long iova_limit, --=20 2.20.1 From nobody Sat Apr 18 01:28:23 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 27AEBC43334 for ; Wed, 20 Jul 2022 04:42:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239191AbiGTEm2 (ORCPT ); Wed, 20 Jul 2022 00:42:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47980 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238975AbiGTEmU (ORCPT ); Wed, 20 Jul 2022 00:42:20 -0400 Received: from mail-pj1-x1032.google.com (mail-pj1-x1032.google.com [IPv6:2607:f8b0:4864:20::1032]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E5F5E5E839 for ; Tue, 19 Jul 2022 21:42:18 -0700 (PDT) Received: by mail-pj1-x1032.google.com with SMTP id t2-20020a17090a4e4200b001f21572f3a4so1048576pjl.0 for ; Tue, 19 Jul 2022 21:42:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ui5VsOiqPlbFzgNja1ZpVg2rMEp2u3D+47XZRqpxdBk=; b=HtS3acIFgPtsTtHcSZM18KMc+EB1mh85pgY4A5BzMJcDqB+ddeWXtr+VPK2D1y0lWi 4GgU0sr+nkLg/uA+Wi/b9Ir11MG+lXrvIK5dapRBY07X1ATi/EQ5oeMfaG5s/JizZ+T0 ANIEEwTqDsbookSPhh6ORNdDAlLN/dnOi3cyD/tUmMseKRYiun+BxcjO5mLneurocD+1 mhpDxphFqr5eyt0G+OcaQNPLux/NAMfsOD8SPbMpgY8WAp07HT7zVBR2MRCys+k7lxUI 3HYKWDKn5/YJQw73DK/BCgXToae4ykwOqcYQKslLl59SHL9i0AkNFBCPmLC3Ssqtlb87 ArFw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ui5VsOiqPlbFzgNja1ZpVg2rMEp2u3D+47XZRqpxdBk=; b=5cjHDOlwjtcu0g6tDhLkKWHZDOxnZwtoyOenGvmPt3HoEy4W+O+rZ9xEQtQak1ucPW v900zdF89ffh0GWaCDHQFZBNZzeySk/ldRbEDynhtGWeEiI0Oi2aebZXrZa5iZg4WccG h9Uocb+tfC0QgR0jLgHscY9F7Bm8MgTuErROawVsO6a98SmFt8+djsUjkfuxyldCyvnq u/7YqtRFUrFEOTJBaqqzVsdE22x2p9pKQ2L5SIfqlh0ouee0hXzCwxAdZUpZyxdNZ+6F Fdrk/AgthYT2euAviYw+jW4gQzjAvzdHmfkDg+IINsoxNhThFpX+PEQ800eZbkkSkFnx uSeg== X-Gm-Message-State: AJIora9GlzgyRj/qE/kZuNSZpAiYJFsdIvpHgWEqISp7uAMpDgrsyMz0 sQBs/tyeYntf9SYsYxkjSzc5 X-Google-Smtp-Source: AGRyM1vzEZqDHVIKRxonl+LPdfdfLPeNpP+6+5j5JzZuZsUP5RFXh6Ra5RubPg6oqIe8JK21q8MY3g== X-Received: by 2002:a17:903:22d2:b0:16c:5575:d510 with SMTP id y18-20020a17090322d200b0016c5575d510mr37376183plg.123.1658292138347; Tue, 19 Jul 2022 21:42:18 -0700 (PDT) Received: from localhost ([139.177.225.253]) by smtp.gmail.com with ESMTPSA id f16-20020a170902ce9000b0016bec529f77sm632920plg.272.2022.07.19.21.42.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Jul 2022 21:42:17 -0700 (PDT) From: Xie Yongji To: mst@redhat.com, jasowang@redhat.com, xiaodong.liu@intel.com, maxime.coquelin@redhat.com, stefanha@redhat.com Cc: songmuchun@bytedance.com, virtualization@lists.linux-foundation.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 4/5] vduse: Support registering userspace memory for IOVA regions Date: Wed, 20 Jul 2022 12:41:43 +0800 Message-Id: <20220720044144.90-5-xieyongji@bytedance.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220720044144.90-1-xieyongji@bytedance.com> References: <20220720044144.90-1-xieyongji@bytedance.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Introduce two ioctls: VDUSE_IOTLB_REG_UMEM and VDUSE_IOTLB_DEREG_UMEM to support registering and de-registering userspace memory for IOVA regions. Now it only supports registering userspace memory for bounce buffer region in virtio-vdpa case. Signed-off-by: Xie Yongji Acked-by: Jason Wang --- drivers/vdpa/vdpa_user/vduse_dev.c | 141 +++++++++++++++++++++++++++++ include/uapi/linux/vduse.h | 23 +++++ 2 files changed, 164 insertions(+) diff --git a/drivers/vdpa/vdpa_user/vduse_dev.c b/drivers/vdpa/vdpa_user/vd= use_dev.c index 3bc27de58f46..eedff0a3885a 100644 --- a/drivers/vdpa/vdpa_user/vduse_dev.c +++ b/drivers/vdpa/vdpa_user/vduse_dev.c @@ -21,6 +21,8 @@ #include #include #include +#include +#include #include #include #include @@ -64,6 +66,13 @@ struct vduse_vdpa { struct vduse_dev *dev; }; =20 +struct vduse_umem { + unsigned long iova; + unsigned long npages; + struct page **pages; + struct mm_struct *mm; +}; + struct vduse_dev { struct vduse_vdpa *vdev; struct device *dev; @@ -95,6 +104,8 @@ struct vduse_dev { u8 status; u32 vq_num; u32 vq_align; + struct vduse_umem *umem; + struct mutex mem_lock; }; =20 struct vduse_dev_msg { @@ -917,6 +928,102 @@ static int vduse_dev_queue_irq_work(struct vduse_dev = *dev, return ret; } =20 +static int vduse_dev_dereg_umem(struct vduse_dev *dev, + u64 iova, u64 size) +{ + int ret; + + mutex_lock(&dev->mem_lock); + ret =3D -ENOENT; + if (!dev->umem) + goto unlock; + + ret =3D -EINVAL; + if (dev->umem->iova !=3D iova || size !=3D dev->domain->bounce_size) + goto unlock; + + vduse_domain_remove_user_bounce_pages(dev->domain); + unpin_user_pages_dirty_lock(dev->umem->pages, + dev->umem->npages, true); + atomic64_sub(dev->umem->npages, &dev->umem->mm->pinned_vm); + mmdrop(dev->umem->mm); + vfree(dev->umem->pages); + kfree(dev->umem); + dev->umem =3D NULL; + ret =3D 0; +unlock: + mutex_unlock(&dev->mem_lock); + return ret; +} + +static int vduse_dev_reg_umem(struct vduse_dev *dev, + u64 iova, u64 uaddr, u64 size) +{ + struct page **page_list =3D NULL; + struct vduse_umem *umem =3D NULL; + long pinned =3D 0; + unsigned long npages, lock_limit; + int ret; + + if (!dev->domain->bounce_map || + size !=3D dev->domain->bounce_size || + iova !=3D 0 || uaddr & ~PAGE_MASK) + return -EINVAL; + + mutex_lock(&dev->mem_lock); + ret =3D -EEXIST; + if (dev->umem) + goto unlock; + + ret =3D -ENOMEM; + npages =3D size >> PAGE_SHIFT; + page_list =3D __vmalloc(array_size(npages, sizeof(struct page *)), + GFP_KERNEL_ACCOUNT); + umem =3D kzalloc(sizeof(*umem), GFP_KERNEL); + if (!page_list || !umem) + goto unlock; + + mmap_read_lock(current->mm); + + lock_limit =3D PFN_DOWN(rlimit(RLIMIT_MEMLOCK)); + if (npages + atomic64_read(¤t->mm->pinned_vm) > lock_limit) + goto out; + + pinned =3D pin_user_pages(uaddr, npages, FOLL_LONGTERM | FOLL_WRITE, + page_list, NULL); + if (pinned !=3D npages) { + ret =3D pinned < 0 ? pinned : -ENOMEM; + goto out; + } + + ret =3D vduse_domain_add_user_bounce_pages(dev->domain, + page_list, pinned); + if (ret) + goto out; + + atomic64_add(npages, ¤t->mm->pinned_vm); + + umem->pages =3D page_list; + umem->npages =3D pinned; + umem->iova =3D iova; + umem->mm =3D current->mm; + mmgrab(current->mm); + + dev->umem =3D umem; +out: + if (ret && pinned > 0) + unpin_user_pages(page_list, pinned); + + mmap_read_unlock(current->mm); +unlock: + if (ret) { + vfree(page_list); + kfree(umem); + } + mutex_unlock(&dev->mem_lock); + return ret; +} + static long vduse_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { @@ -1089,6 +1196,38 @@ static long vduse_dev_ioctl(struct file *file, unsig= ned int cmd, ret =3D vduse_dev_queue_irq_work(dev, &dev->vqs[index].inject); break; } + case VDUSE_IOTLB_REG_UMEM: { + struct vduse_iova_umem umem; + + ret =3D -EFAULT; + if (copy_from_user(&umem, argp, sizeof(umem))) + break; + + ret =3D -EINVAL; + if (!is_mem_zero((const char *)umem.reserved, + sizeof(umem.reserved))) + break; + + ret =3D vduse_dev_reg_umem(dev, umem.iova, + umem.uaddr, umem.size); + break; + } + case VDUSE_IOTLB_DEREG_UMEM: { + struct vduse_iova_umem umem; + + ret =3D -EFAULT; + if (copy_from_user(&umem, argp, sizeof(umem))) + break; + + ret =3D -EINVAL; + if (!is_mem_zero((const char *)umem.reserved, + sizeof(umem.reserved))) + break; + + ret =3D vduse_dev_dereg_umem(dev, umem.iova, + umem.size); + break; + } default: ret =3D -ENOIOCTLCMD; break; @@ -1101,6 +1240,7 @@ static int vduse_dev_release(struct inode *inode, str= uct file *file) { struct vduse_dev *dev =3D file->private_data; =20 + vduse_dev_dereg_umem(dev, 0, dev->domain->bounce_size); spin_lock(&dev->msg_lock); /* Make sure the inflight messages can processed after reconncection */ list_splice_init(&dev->recv_list, &dev->send_list); @@ -1163,6 +1303,7 @@ static struct vduse_dev *vduse_dev_create(void) return NULL; =20 mutex_init(&dev->lock); + mutex_init(&dev->mem_lock); spin_lock_init(&dev->msg_lock); INIT_LIST_HEAD(&dev->send_list); INIT_LIST_HEAD(&dev->recv_list); diff --git a/include/uapi/linux/vduse.h b/include/uapi/linux/vduse.h index 7cfe1c1280c0..9885e0571f09 100644 --- a/include/uapi/linux/vduse.h +++ b/include/uapi/linux/vduse.h @@ -210,6 +210,29 @@ struct vduse_vq_eventfd { */ #define VDUSE_VQ_INJECT_IRQ _IOW(VDUSE_BASE, 0x17, __u32) =20 +/** + * struct vduse_iova_umem - userspace memory configuration for one IOVA re= gion + * @uaddr: start address of userspace memory, it must be aligned to page s= ize + * @iova: start of the IOVA region + * @size: size of the IOVA region + * @reserved: for future use, needs to be initialized to zero + * + * Structure used by VDUSE_IOTLB_REG_UMEM and VDUSE_IOTLB_DEREG_UMEM + * ioctls to register/de-register userspace memory for IOVA regions + */ +struct vduse_iova_umem { + __u64 uaddr; + __u64 iova; + __u64 size; + __u64 reserved[3]; +}; + +/* Register userspace memory for IOVA regions */ +#define VDUSE_IOTLB_REG_UMEM _IOW(VDUSE_BASE, 0x18, struct vduse_iova_umem) + +/* De-register the userspace memory. Caller should set iova and size field= . */ +#define VDUSE_IOTLB_DEREG_UMEM _IOW(VDUSE_BASE, 0x19, struct vduse_iova_um= em) + /* The control messages definition for read(2)/write(2) on /dev/vduse/$NAM= E */ =20 /** --=20 2.20.1 From nobody Sat Apr 18 01:28:23 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 901E1C433EF for ; Wed, 20 Jul 2022 04:42:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239166AbiGTEmb (ORCPT ); Wed, 20 Jul 2022 00:42:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47988 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238536AbiGTEmW (ORCPT ); Wed, 20 Jul 2022 00:42:22 -0400 Received: from mail-pj1-x1031.google.com (mail-pj1-x1031.google.com [IPv6:2607:f8b0:4864:20::1031]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0A5964D81A for ; Tue, 19 Jul 2022 21:42:22 -0700 (PDT) Received: by mail-pj1-x1031.google.com with SMTP id o18so2497052pjs.2 for ; Tue, 19 Jul 2022 21:42:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=4m2weMM8YDI1AY1uHJfVhQZtY/uy0KHLS609X7iYawY=; b=0L65C5AQK0NkEUvGAXW28Z/fq9HRbWlWPLagjsxFoYtj7t5bk6rkaM323htOQU4pDx HgIg6Pauj8G4m+x8S7qjq8xpjpeiNqTew4+z/0bmRr58Ned7VfjJXqMH5MEEN4aUon1y r+eKPsUhNjUoH8bIJksZWPVCL4C6Wbz+X9ow1k3sCyBbmelZW5GDRxl4gFLXMqQESM5H uPGSjqnjpfs5JaDOZSJ0VGVARUFP/wWMUYjacEQTd/57Zxao8QnSGCrxF4uud5dSk6qV V+pO1NYx+Y/aHeagPAC31hfnfVH76Jm11M+7Pfcu6Ddf8eIQNfH7R2tmG1RPqLS9HDUx twig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=4m2weMM8YDI1AY1uHJfVhQZtY/uy0KHLS609X7iYawY=; b=L33Eiv8o3r2ZNPWPT1sYogcInkxj500r7AIim/tWAqKgq3xnoRH5qTvsHWrrb3JygW CxgO2jaxrzkcHGaUxfutQM9HRDmGb4KduHKxPio7xZg3hVpjksiRBmIhBRRRjPu8W9EE Ctbx08xvFFV6Troxs/Lt2KInYg09Ss9/cmU5wG0KKYFsz2K0cjlDQ6W6uSufD/Ux/wmK x6D4+d2ba9UGRkwe5dcJbURJAgdslcF7Ty2fnGO1yYmHZLvZ2PsI9l4DoNrnPzXxi6ia RpG82tGpS6dLN8IVF+b2rLBYw7ucyX6IGb8UJ3tb2RMW2SUKECk7oxY0NDPNjpl6uyxM HK5A== X-Gm-Message-State: AJIora+xqvZqlSbbDcPDPvLnz9HDVnUUvJ1R/pVa2N5mSpzzn9jHgrdY 3HVnbEc3Glu/EUUrNG1OUJLn X-Google-Smtp-Source: AGRyM1tmqPnWXZ8d2pOEhG0jDiN/4F7QPQ20CS4xB+n9O0oKl13nGyzNFHoyRSOZ9iuvKZO10vLGcA== X-Received: by 2002:a17:902:e80a:b0:16c:3340:aba5 with SMTP id u10-20020a170902e80a00b0016c3340aba5mr37802433plg.102.1658292141755; Tue, 19 Jul 2022 21:42:21 -0700 (PDT) Received: from localhost ([139.177.225.253]) by smtp.gmail.com with ESMTPSA id j7-20020a170903024700b0016c454598b5sm12790879plh.167.2022.07.19.21.42.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Jul 2022 21:42:21 -0700 (PDT) From: Xie Yongji To: mst@redhat.com, jasowang@redhat.com, xiaodong.liu@intel.com, maxime.coquelin@redhat.com, stefanha@redhat.com Cc: songmuchun@bytedance.com, virtualization@lists.linux-foundation.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 5/5] vduse: Support querying information of IOVA regions Date: Wed, 20 Jul 2022 12:41:44 +0800 Message-Id: <20220720044144.90-6-xieyongji@bytedance.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220720044144.90-1-xieyongji@bytedance.com> References: <20220720044144.90-1-xieyongji@bytedance.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" This introduces a new ioctl: VDUSE_IOTLB_GET_INFO to support querying some information of IOVA regions. Now it can be used to query whether the IOVA region supports userspace memory registration. Signed-off-by: Xie Yongji --- drivers/vdpa/vdpa_user/vduse_dev.c | 39 ++++++++++++++++++++++++++++++ include/uapi/linux/vduse.h | 25 +++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/drivers/vdpa/vdpa_user/vduse_dev.c b/drivers/vdpa/vdpa_user/vd= use_dev.c index eedff0a3885a..cc4a9a700c24 100644 --- a/drivers/vdpa/vdpa_user/vduse_dev.c +++ b/drivers/vdpa/vdpa_user/vduse_dev.c @@ -1228,6 +1228,45 @@ static long vduse_dev_ioctl(struct file *file, unsig= ned int cmd, umem.size); break; } + case VDUSE_IOTLB_GET_INFO: { + struct vduse_iova_info info; + struct vhost_iotlb_map *map; + struct vduse_iova_domain *domain =3D dev->domain; + + ret =3D -EFAULT; + if (copy_from_user(&info, argp, sizeof(info))) + break; + + ret =3D -EINVAL; + if (info.start > info.last) + break; + + if (!is_mem_zero((const char *)info.reserved, + sizeof(info.reserved))) + break; + + spin_lock(&domain->iotlb_lock); + map =3D vhost_iotlb_itree_first(domain->iotlb, + info.start, info.last); + if (map) { + info.start =3D map->start; + info.last =3D map->last; + info.capability =3D 0; + if (domain->bounce_map && map->start >=3D 0 && + map->last < domain->bounce_size) + info.capability |=3D VDUSE_IOVA_CAP_UMEM_SUPPORT; + } + spin_unlock(&domain->iotlb_lock); + if (!map) + break; + + ret =3D -EFAULT; + if (copy_to_user(argp, &info, sizeof(info))) + break; + + ret =3D 0; + break; + } default: ret =3D -ENOIOCTLCMD; break; diff --git a/include/uapi/linux/vduse.h b/include/uapi/linux/vduse.h index 9885e0571f09..720fb0b6d8ff 100644 --- a/include/uapi/linux/vduse.h +++ b/include/uapi/linux/vduse.h @@ -233,6 +233,31 @@ struct vduse_iova_umem { /* De-register the userspace memory. Caller should set iova and size field= . */ #define VDUSE_IOTLB_DEREG_UMEM _IOW(VDUSE_BASE, 0x19, struct vduse_iova_um= em) =20 +/** + * struct vduse_iova_info - information of one IOVA region + * @start: start of the IOVA region + * @last: last of the IOVA region + * @capability: capability of the IOVA regsion + * @reserved: for future use, needs to be initialized to zero + * + * Structure used by VDUSE_IOTLB_GET_INFO ioctl to get information of + * one IOVA region. + */ +struct vduse_iova_info { + __u64 start; + __u64 last; +#define VDUSE_IOVA_CAP_UMEM_SUPPORT (1 << 0) + __u64 capability; + __u64 reserved[3]; +}; + +/* + * Find the first IOVA region that overlaps with the range [start, last] + * and return some information on it. Caller should set start and last fie= lds. + */ +#define VDUSE_IOTLB_GET_INFO _IOW(VDUSE_BASE, 0x1a, struct vduse_iova_info) + + /* The control messages definition for read(2)/write(2) on /dev/vduse/$NAM= E */ =20 /** --=20 2.20.1