From nobody Tue Apr 14 15:39:39 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 91927C19F28 for ; Wed, 3 Aug 2022 04:55:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235568AbiHCEzq (ORCPT ); Wed, 3 Aug 2022 00:55:46 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42866 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233271AbiHCEzl (ORCPT ); Wed, 3 Aug 2022 00:55:41 -0400 Received: from mail-pg1-x536.google.com (mail-pg1-x536.google.com [IPv6:2607:f8b0:4864:20::536]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 82F631EACE for ; Tue, 2 Aug 2022 21:55:40 -0700 (PDT) Received: by mail-pg1-x536.google.com with SMTP id q16so14142478pgq.6 for ; Tue, 02 Aug 2022 21:55:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance-com.20210112.gappssmtp.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc; bh=aQz/M8tT4ITIWP7n8va8EqELXMwHkMTimrkWQzSleco=; b=SVlgNrg4/kGKXTGYEOKuXp5TC1Hw/P8yfw2ljqCMY9bXi3pSwX+NjDKBmji/1BEsov Tb5lISKewmwcd4R8Ld4cAOh2P+bL+Bt6k4cG+HRV6UtHEMrN6z4vfNsRcsXgHCrszmUI 9KeMm/4elOXpaP4YW29ITN6emt1ov47lKa05DrgyjQLMB+yJnahjoDsSCl/rMQtwkOgr HjDXfki4blDdEVBSltMo6gPiG04M7RtzK5cYBMAa/PvqoQUJHSXA/Rgvt1Ch8Mc95w8z aKK/SJQqjJlBTfn59N+JBf0wNTvR/vKuD9T/bA/IO5IJQ8sJtbQ6hEIHxEttUT6NDQ0z Ncdg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc; bh=aQz/M8tT4ITIWP7n8va8EqELXMwHkMTimrkWQzSleco=; b=KVhJVGmEG4Ust2MWBjcPEnHPitLTuBPezJ640ltZHjtRoJlrCu1US/MhUFtzgqrrOz 5oaQRHcrZ3Zuc7MgvEbk/Ueckkm5HcnSuYta+nI3CzMvvM+KDcYUYI4poSChZYKLasd+ hu4hAqBEk49KnL7viv/XwqOtsuw8jyWTkgwhutXltIz9B77igovkkRYdGOC0ZdEqooZA Xk0+41Nf2GPK1GPT0CKjNivl1XopQKxHmMCrm8ReeL398Hkwce1BMVF/5oz2N5f+A470 ARl2I57GgqlBkrJRuAizDXZuk9AQ/eelcQt7GxzYCLhF9x5pc66T+NvJRr5832htMSfQ V1KQ== X-Gm-Message-State: AJIora/VgSC9uC/hYmxr0i/5fNEzj/goKt9DG/B2sva8aIiiEVsSPXPU AZuFpNsE1xrVCcqI7w1ozRFI X-Google-Smtp-Source: AGRyM1sm1hZhHEOKhFmN2Owzi4pmQxn18t30at/hyqEvfS7Uof0a0m6qTR5t5WgDU5kLFPT6AL0qvw== X-Received: by 2002:a63:c5:0:b0:40d:d290:24ef with SMTP id 188-20020a6300c5000000b0040dd29024efmr19901354pga.141.1659502540046; Tue, 02 Aug 2022 21:55:40 -0700 (PDT) Received: from localhost ([139.177.225.247]) by smtp.gmail.com with ESMTPSA id h11-20020a170902680b00b0016d10267927sm636091plk.203.2022.08.02.21.55.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 02 Aug 2022 21:55:38 -0700 (PDT) From: Xie Yongji To: jasowang@redhat.com, mst@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, Xie Yongji Subject: [PATCH v5 1/5] vduse: Remove unnecessary spin lock protection Date: Wed, 3 Aug 2022 12:55:19 +0800 Message-Id: <20220803045523.23851-2-xieyongji@bytedance.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220803045523.23851-1-xieyongji@bytedance.com> References: <20220803045523.23851-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 Tue Apr 14 15:39:39 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 D7AF9C19F28 for ; Wed, 3 Aug 2022 04:55:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235767AbiHCEz5 (ORCPT ); Wed, 3 Aug 2022 00:55:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42938 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235564AbiHCEzp (ORCPT ); Wed, 3 Aug 2022 00:55:45 -0400 Received: from mail-pf1-x42a.google.com (mail-pf1-x42a.google.com [IPv6:2607:f8b0:4864:20::42a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 94A531F2D9 for ; Tue, 2 Aug 2022 21:55:44 -0700 (PDT) Received: by mail-pf1-x42a.google.com with SMTP id d20so8043243pfq.5 for ; Tue, 02 Aug 2022 21:55:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance-com.20210112.gappssmtp.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc; bh=IpMgub05osj0GdqKxseckZ4i/mup5zTuM2yqAVP/SCY=; b=ryxzzJDFc8FZmx+iWid826j6f5ymx07YzpvCDQ2SsSgUBOUhHryHq2dZh0M5i8Z+FO Bj4+ezexAk49d6HhUQgD96hQvVvJoaKKzfu4+m6cy7u5LiP4o0RwRpVa7OQscKFXYVLc fpN6VA5f9Y9ni0PiTNK5U6v41rcvGBocyYb8+dVvgWiklfoiF7MR2MMEZnYv31dgZCiw 2lBARNpMTmyJnnttuJzzEOkn+PY2aV3gIO76OEKygrVFgR0hvbWKIpwqzVoPpO1t+6VQ zNQXZU1gUqEqwB5j9XB8HOTEURfgp16OxtveVkmhWf7X/v7sc6qEsKLAuLmhH37U699v S0UA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc; bh=IpMgub05osj0GdqKxseckZ4i/mup5zTuM2yqAVP/SCY=; b=oIxJwYDvSTQWmAMvghmZpJUKphKtB0rgfrwllAB0awEvocLK6eXcm1kGo+oF35wFJn uf9KTQXG4bKuZIeJGH4RmTHK+DV0ZAm45qBqgtcSyNPrilfq+I78zKLC5HrKD9ImNTrH vjxjAMxjnPaqMmvkSPsKmhIizO1J4T5hCnQ70s6PTw8M7zkMu+QtgeZUCkynWc3SIsYT z/F2S++ORIi4Fa/FIm7nMmGb3aDV1ol5snkZgWhIJ0T/0/owPlGbja82aae+unTiHX7B Fb3aV3lJBs2+LA8j6hYjSDjEz3Ext8wWfyrHWKsxprlWTFNs5uqVohU2pCu5c6YUUmOZ Wmqg== X-Gm-Message-State: AJIora8ghMkn0SVsTRBDOlrXJyCglqHnPiK9pnzd9jF63Or2IYU74jUi 6DS5HeJjKRtKMKhUhtNYoYdlu8KHQfaY X-Google-Smtp-Source: AGRyM1tAiLEpaPiDEehOTNJTIIDy4dCIvK4evOb8c6IM2UKkGw6rOE+Rz0dhO4XnkzgkW0jxDCd+0Q== X-Received: by 2002:a63:d614:0:b0:411:acdb:5c55 with SMTP id q20-20020a63d614000000b00411acdb5c55mr19288702pgg.245.1659502544103; Tue, 02 Aug 2022 21:55:44 -0700 (PDT) Received: from localhost ([139.177.225.247]) by smtp.gmail.com with ESMTPSA id p17-20020a170902e75100b0016dc78d0153sm634099plf.296.2022.08.02.21.55.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 02 Aug 2022 21:55:43 -0700 (PDT) From: Xie Yongji To: jasowang@redhat.com, mst@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, Xie Yongji Subject: [PATCH v5 2/5] vduse: Use memcpy_{to,from}_page() in do_bounce() Date: Wed, 3 Aug 2022 12:55:20 +0800 Message-Id: <20220803045523.23851-3-xieyongji@bytedance.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220803045523.23851-1-xieyongji@bytedance.com> References: <20220803045523.23851-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 Reviewed-by: Muchun Song --- 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 Tue Apr 14 15:39:39 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 6621FC19F28 for ; Wed, 3 Aug 2022 04:56:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236063AbiHCE4A (ORCPT ); Wed, 3 Aug 2022 00:56:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43158 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235744AbiHCEzx (ORCPT ); Wed, 3 Aug 2022 00:55:53 -0400 Received: from mail-pl1-x631.google.com (mail-pl1-x631.google.com [IPv6:2607:f8b0:4864:20::631]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F182F1EEF9 for ; Tue, 2 Aug 2022 21:55:48 -0700 (PDT) Received: by mail-pl1-x631.google.com with SMTP id t2so15365080ply.2 for ; Tue, 02 Aug 2022 21:55:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance-com.20210112.gappssmtp.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc; bh=+Bg0/hzsBzeEaLnlFG2eVMC0fwiochhIwopQzSHlnF0=; b=eXDLsAVi/qU1zwxx8B+F0X+D+uS8Icx3KGjuoQGmVeTuQrrZAqrbiPuhXsopeqNeVm j/tYZjbvtabwAsrunXdo3L4/fXm6LKx+LPQhy7ZqgO9wvD2ZwRfF3AAsCJo8euubmLVR A3iEtpZWGBPylaGUwwi/f2PovMqqnanUiMVua4RcphStKfEE0OCdTmts7IvhcA2bA9wS HaQbPBmBgI73+3EPN1AZlUKU31qAeHpMVjCNLYzyDhQpj8aU5zkFjg32LgHl2+y76xNN tLK71zhkvBXQawus6FuQUTLgrTena8AgJKoDCKhEJq60DLc4TiOJfFOqcaA+dsaCwzmV XCow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc; bh=+Bg0/hzsBzeEaLnlFG2eVMC0fwiochhIwopQzSHlnF0=; b=LupabcbbCAAQKNN+MSxOrURJcxAakGVgGZ1F1R3doJX0GdDwVVUvsa+QiZYCz3vMoq Otn1TMsH76Z7VgtnbufJhu/9yA6n4DZczNerAGkEKjjwoHSWIvzphnLVPTMr95E+b5Hu S18+n5vZ/G+ha5cWNk/xNhfAymY9taOfaTASwwPiCDOoqnyG3XEejLVy6sBdz5QXUXQo xyS2hpHMKyRU/i+7fG8nJbhoikUVFIT6DR9k4aHbkpGoFj2ETqRx22OjNVSvmqsQCYqP Wtn88yDs/uxeUcrpWCDbCycisXMOgT1uOwHrf8/0O/VFlk/EdbviOpOW0b1b36bx0SmR wFHw== X-Gm-Message-State: ACgBeo3sk0x80wqywPXKr8atNRXTZsW2FHPA/P/AnGQf30qPPxywtMkb B0HpwxlxrKdZmJYDtX92ehd4kWtyDgAB X-Google-Smtp-Source: AA6agR5fktHznQTjXzLBMcM42kVafR5wFMM1GP/zbZInJn3lE/bJYQe8cUiuKFOcJ3KpnwZkYFUEDQ== X-Received: by 2002:a17:902:7d89:b0:16e:f604:31b8 with SMTP id a9-20020a1709027d8900b0016ef60431b8mr10547529plm.0.1659502548236; Tue, 02 Aug 2022 21:55:48 -0700 (PDT) Received: from localhost ([139.177.225.247]) by smtp.gmail.com with ESMTPSA id n6-20020a1709026a8600b0015e8d4eb1f7sm657499plk.65.2022.08.02.21.55.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 02 Aug 2022 21:55:47 -0700 (PDT) From: Xie Yongji To: jasowang@redhat.com, mst@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, Xie Yongji Subject: [PATCH v5 3/5] vduse: Support using userspace pages as bounce buffer Date: Wed, 3 Aug 2022 12:55:21 +0800 Message-Id: <20220803045523.23851-4-xieyongji@bytedance.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220803045523.23851-1-xieyongji@bytedance.com> References: <20220803045523.23851-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 Tue Apr 14 15:39:39 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 78BD4C19F28 for ; Wed, 3 Aug 2022 04:56:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236237AbiHCE4C (ORCPT ); Wed, 3 Aug 2022 00:56:02 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43104 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235740AbiHCEz4 (ORCPT ); Wed, 3 Aug 2022 00:55:56 -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 7A18C57259 for ; Tue, 2 Aug 2022 21:55:53 -0700 (PDT) Received: by mail-pj1-x1031.google.com with SMTP id x2-20020a17090ab00200b001f4da5cdc9cso881858pjq.0 for ; Tue, 02 Aug 2022 21:55:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance-com.20210112.gappssmtp.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc; bh=hgUcsbLKZ4Rgt07k54SbElcPFQpmm3f7G8+RpU13SUg=; b=fpeJ7xTUvH9wLJZ4t2Yz/9i9se4FdQLsMDBZMhuL1w4DIvd5ciycFiMC/HYrVAoj3q 0dmuB3MjVS1v8gAyD0Ur4QVZnWLO3ZH6NjHOjqNXxxLgC5iCKlKm0gtyZQ/NofRD2qX2 s7iP2adJXRV+jhYbX9eT9MeBW14Z5ncN4ZR6X/my2dTaeArGVDj1zoa0X7C1TETyhgPv ETU3GJzCOvlnU7tjHAiLpmqlClcNFBK0rjdwTWy/oyjDh+9Ix0jtwv4QX9+MrAygK06m gzpn9mgCMq6Fsa9xBwXCuEmERAMZ/DEyOPLDAsDEGJnmucwdGa1YmkKga2mbvbSbTwoi Nurw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc; bh=hgUcsbLKZ4Rgt07k54SbElcPFQpmm3f7G8+RpU13SUg=; b=R4g0AGC0jevrXyVjPrelvNXrbNM7OPvaD73ORCwgXV2oqheVfTlV13VKE6YuL74ufu GqRg/hFcnrBxqpUuTCG5OGyP75DHvq+gEq4SG+u0PYC/CcJ/hDUA1mpmbDzeiAm/7yI7 xxCPszEDYy/ThOZvlhm9EPvhso+jWm6GiogZLdQ5gwSub9wzhfWkMH8kJOvyU9i0j2KX W6LGH+aRK0pIjWTrYcpCVIqaLX8eXQgLXrN+foPg58iqb1WELRY3/UcUSUpIzB3sVIGX mxuCA6gwhMFJGSvnFtlZpR6IyCGc2kKOq5aj4G2LSmIwNG2yQfq5jbUWczpBU9BBqn7A jDjA== X-Gm-Message-State: ACgBeo15COz5dTNs1SCN9UJaHo8L7fyB7JHbNuB80z9APO6RUk1TsppW x/7x4aB4k/E7QYKBpYdctUrI X-Google-Smtp-Source: AA6agR7UHS0TD8AwQSy0YC7IYcCatsXZxMGsIVZOBCSXZTOKVixgcy9b+wEopxtk1FDVDX1U1r1PzA== X-Received: by 2002:a17:902:e744:b0:16e:f6c2:3731 with SMTP id p4-20020a170902e74400b0016ef6c23731mr10504617plf.104.1659502552707; Tue, 02 Aug 2022 21:55:52 -0700 (PDT) Received: from localhost ([139.177.225.247]) by smtp.gmail.com with ESMTPSA id e16-20020a170902ef5000b0016ccbc9db0fsm659550plx.5.2022.08.02.21.55.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 02 Aug 2022 21:55:51 -0700 (PDT) From: Xie Yongji To: jasowang@redhat.com, mst@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, Xie Yongji Subject: [PATCH v5 4/5] vduse: Support registering userspace memory for IOVA regions Date: Wed, 3 Aug 2022 12:55:22 +0800 Message-Id: <20220803045523.23851-5-xieyongji@bytedance.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220803045523.23851-1-xieyongji@bytedance.com> References: <20220803045523.23851-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 Tue Apr 14 15:39:39 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 44E25C19F28 for ; Wed, 3 Aug 2022 04:56:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236752AbiHCE4O (ORCPT ); Wed, 3 Aug 2022 00:56:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43164 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235737AbiHCEz6 (ORCPT ); Wed, 3 Aug 2022 00:55:58 -0400 Received: from mail-pl1-x62e.google.com (mail-pl1-x62e.google.com [IPv6:2607:f8b0:4864:20::62e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1E4C057262 for ; Tue, 2 Aug 2022 21:55:57 -0700 (PDT) Received: by mail-pl1-x62e.google.com with SMTP id p8so15317386plq.13 for ; Tue, 02 Aug 2022 21:55:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance-com.20210112.gappssmtp.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc; bh=D9BaynpFeg1cissmMMk3El8bdcStQPJmmpGe2Ac/WHE=; b=3YHUqLWcTCVwi8y0GoB9CUMxob38hovVKdCk8RDJlCEhrGym82MQ1U0Wd3Djz+WTKb Gyj98u4RhOfMAuF/3d8zx/RD8TBOojzfbwYqLESwtXq7DKUqRS0oOv8xL8BWL17fuK5o Yic9MlsWBF/2P46wDRcKTutjCYTnrsfE6BNtgn33mCczYswJHZRqX8pWudeHasx934LK LKGrTe0IL2dJvLF9WlG0C+2mc3QMiZF8VOXZXh2MjGCLcGWsghvGQtc3FVvrW5uI34U3 TX8agESvP3ZT68jma4F50LYMxEumtCXEKPbE/aXtpyxWo+AkKCGC+qrg1K0t41oIYwGr nuTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc; bh=D9BaynpFeg1cissmMMk3El8bdcStQPJmmpGe2Ac/WHE=; b=NitnOeC5ecPqWl8/RLQQiNnhyDy5KBY1uqQx7IajlxSIh4dyZRJ8RiS+0sLndrgE/x tdIYejDAFWuepUQksxZcsIUTJE45hf03uTsYX7lTXzi3cdAfW3eP7Bgd2CRY4mK6fHJY Hso5f8TQ6uqcj5E5ET1eiWvoEiVtmzX9tm5k+R4rxZW+APTJR1d2sRtqV94OhkY8lZnW cYtiNvyIwkiFh3DTYE2gzCtd1yKXbDjtY+Ox+zllos8s6uyf5pu8pSFLVq6cH7H8hoMz sE/eHRepBwT+Fv3z6rzatSxmyDLf6EyHnqj/QNNQjeg05sEllqLiprPhMlOsJHpeLm+f XIuA== X-Gm-Message-State: ACgBeo0qNSU0rOiE0nFK0aB9N5QS3S9bD7Kfv34Y/bTOjhiQ9DJJ2V7l V+0LSwsbzJnbM74Z4310yq1R X-Google-Smtp-Source: AA6agR5rQtknt4UQzv/fLAdhF0xPgp51E6QNM96gyKsvHZ/gngRXcYr2ya12Nqs3Xq0n60l83/WJKQ== X-Received: by 2002:a17:90b:4d84:b0:1f5:3aee:7999 with SMTP id oj4-20020a17090b4d8400b001f53aee7999mr3091144pjb.75.1659502556486; Tue, 02 Aug 2022 21:55:56 -0700 (PDT) Received: from localhost ([139.177.225.247]) by smtp.gmail.com with ESMTPSA id w8-20020a1709026f0800b0016dd667d511sm631968plk.252.2022.08.02.21.55.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 02 Aug 2022 21:55:55 -0700 (PDT) From: Xie Yongji To: jasowang@redhat.com, mst@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, Xie Yongji Subject: [PATCH v5 5/5] vduse: Support querying information of IOVA regions Date: Wed, 3 Aug 2022 12:55:23 +0800 Message-Id: <20220803045523.23851-6-xieyongji@bytedance.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220803045523.23851-1-xieyongji@bytedance.com> References: <20220803045523.23851-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 | 24 ++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/drivers/vdpa/vdpa_user/vduse_dev.c b/drivers/vdpa/vdpa_user/vd= use_dev.c index eedff0a3885a..41c0b29739f1 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=3D 0 && + map->last =3D=3D domain->bounce_size - 1) + info.capability |=3D VDUSE_IOVA_CAP_UMEM; + } + 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..11bd48c72c6c 100644 --- a/include/uapi/linux/vduse.h +++ b/include/uapi/linux/vduse.h @@ -233,6 +233,30 @@ 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 (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 _IOWR(VDUSE_BASE, 0x1a, struct vduse_iova_inf= o) + /* The control messages definition for read(2)/write(2) on /dev/vduse/$NAM= E */ =20 /** --=20 2.20.1