From nobody Sun Apr 19 15:22:21 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 D5034C433EF for ; Wed, 29 Jun 2022 08:26:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232719AbiF2I0j (ORCPT ); Wed, 29 Jun 2022 04:26:39 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40872 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232600AbiF2I0f (ORCPT ); Wed, 29 Jun 2022 04:26:35 -0400 Received: from mail-pj1-x102d.google.com (mail-pj1-x102d.google.com [IPv6:2607:f8b0:4864:20::102d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D4C663C719 for ; Wed, 29 Jun 2022 01:26:34 -0700 (PDT) Received: by mail-pj1-x102d.google.com with SMTP id n16-20020a17090ade9000b001ed15b37424so15287410pjv.3 for ; Wed, 29 Jun 2022 01:26:34 -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=o6/JsOlJwlIJxWGuLjrTTVjd1qaroq7QICLqgjCEkQg=; b=BQxZAPEsUTOsevnZ2qtQ/POkvQe13iwMNPWicBBi7Sc+xjoJgu03cP4ZULbZPh+cSw utjeGZbDhsHNYonMe7DE7v/tOGQgdApejCUzT2lqlmL7bUnBqqGBgK9K0eBtBgKO4IkQ JDqwozlaN38PQAmxtjwSqmdoTnu7tRQHZR4m+GR4dOm25fh3mG5knrHKkYJq/m0DHhBy wvTsRpkuDo8v9trgFq1312fRS24fSoHxUQJEPkWNW4+grEt8fkd96uGl1mDpkdnmx+qH J2l2B5gyl2ynAQuXvsywKcLK7LAk/B5/MJYIVceLmF2HsdTvmXK8MOCvUBlzD2KkWg2X 6H2g== 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=o6/JsOlJwlIJxWGuLjrTTVjd1qaroq7QICLqgjCEkQg=; b=p1lHrKYL1h3JHtbk00/whooGzzwgXJDzofDTPxxJnKKIngI6msQgHO/pQtHs9aRHyq fBi1BnK6eXfcwzHsK4B5o3SFniXTeG86JkdmG8iatZbEQie8ukJmku8o7aGacjLDaKmD A+d3lnHfBeo2p5nI8O0lsTHx6YJYP0thaj2dFS2EKGzMoBKPC9HZdSmTbNpcnbJTWc5+ iFfGKOAxmByWqfQgejBJLjOhC12mBnQ781MvfsrHkCo5XVBUTvSm57fgzk75xnwd1v5I WmAjIzKWXODCHXDI1Z8HemUr4dbjucdSQby97Sm4MAebkpDzNaRMYLtQ9FYGR6daNRHH 6KAw== X-Gm-Message-State: AJIora9AOUx/JqdsLblwhAB3QGW/z0HtPdb8bGnVhFtTbFqZpHoxzmmF rkVBTnxldrLeMYBWpKXkv8k1 X-Google-Smtp-Source: AGRyM1t4B4SJDtI0aOEnpUHZ8Q3cRDCYM+PZRdrptvDzUinyX5e0PB+CSUQBz0k5seC5OIP6mck+Ww== X-Received: by 2002:a17:902:ab12:b0:16b:97b5:bb19 with SMTP id ik18-20020a170902ab1200b0016b97b5bb19mr5313871plb.107.1656491194407; Wed, 29 Jun 2022 01:26:34 -0700 (PDT) Received: from localhost ([139.177.225.240]) by smtp.gmail.com with ESMTPSA id ne20-20020a17090b375400b001e2f892b352sm1388907pjb.45.2022.06.29.01.26.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Jun 2022 01:26:33 -0700 (PDT) From: Xie Yongji To: mst@redhat.com, jasowang@redhat.com, xiaodong.liu@intel.com, maxime.coquelin@redhat.com, stefanha@redhat.com Cc: virtualization@lists.linux-foundation.org, linux-kernel@vger.kernel.org Subject: [PATCH 1/6] vduse: Remove unnecessary spin lock protection Date: Wed, 29 Jun 2022 16:25:36 +0800 Message-Id: <20220629082541.118-2-xieyongji@bytedance.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220629082541.118-1-xieyongji@bytedance.com> References: <20220629082541.118-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" Taking iotlb lock to access bounce page in page fault handler is meaningless since vduse_domain_free_bounce_pages() would only be called during file release. Signed-off-by: Xie Yongji --- 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 Sun Apr 19 15:22:21 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 BE27AC433EF for ; Wed, 29 Jun 2022 08:26:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232763AbiF2I0u (ORCPT ); Wed, 29 Jun 2022 04:26:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40954 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232717AbiF2I0i (ORCPT ); Wed, 29 Jun 2022 04:26:38 -0400 Received: from mail-pf1-x429.google.com (mail-pf1-x429.google.com [IPv6:2607:f8b0:4864:20::429]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6E0303C72B for ; Wed, 29 Jun 2022 01:26:38 -0700 (PDT) Received: by mail-pf1-x429.google.com with SMTP id d17so14382342pfq.9 for ; Wed, 29 Jun 2022 01:26:38 -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=z1U879wVoKQgC+VVp5dSPlJ1DI5JNILGgmGyf1KCySs=; b=BvkRFh8bBV3U6dHqDi6jrAEoT/PTZq1y7LfDUzbpqj5zY2sD/ZXrg4Y5hysICNVTMz eTmLu1zcUsewGjZ3A/E8QQlHbVPB29UKdzfr+130zsytTooPxh31QMjV29EYdtjXNCNB 9H1sEF34KaNV0KXHfLkAJJmRUniuE5khGAvIIDDSOsk4y42d1xdeyUtc2iXv1gj1LxzC H3lfbWSWy+SL5+scFrIGotyhEbWd/Ypnm6jPyqkQWLpxmg3pSdFik6Xf6d0wZ0Y2CpMH m+QFsy2k47t0Zixb5P46r2gWQLJBcQbbu3QuSph6xVBNMcVPcoNcCUnXN82deeabdXKu +IZw== 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=z1U879wVoKQgC+VVp5dSPlJ1DI5JNILGgmGyf1KCySs=; b=qCLxR50GbVp5O1nVZYdAlZLhTWeyksPCATGF+aueVXG6YcUynUqnhDB8/iGWxJ+I4H eQ45oAZjRyduWF/ayTxWGamPajnxeV1wrNs6icw+EEWwwdKRKMFDPGwvRwKBIiTLrX+J QXsElijoQ3NC5Osk1IyWOVZ6M2L3wD0dlIZ2RM9/ZkXJYI8j4trH5w/NvdjJN9xAxTix OPObwAMR5BxofYTtzWEUH7+9UDHuKejIbDlZuqNoFZM/qL+wwtZmnGTFsi/MbHB9qHzJ pFtLdeVlOXszpXw4V1VlH0kcpCQScJ1ml1pCio/uNefMMfT9mnIKPWmx7RpOQKKhf/2b 63CA== X-Gm-Message-State: AJIora8PnVKKKSFQG/kbytOSyyOEI/EBAbfIhf9HZINcJdfkGVESxpD9 ZGmUf+HeOcs0PNig+c8aYmWXytjRANIgazQ= X-Google-Smtp-Source: AGRyM1tUnlVAKVZbFfPgsmGxaJVo+O+4kI41DIEqnXqUFqKH/A0+mo7ATWQL26QEL2Qtu2cifot7jg== X-Received: by 2002:a63:af1c:0:b0:40c:f9fb:deca with SMTP id w28-20020a63af1c000000b0040cf9fbdecamr1980782pge.479.1656491198022; Wed, 29 Jun 2022 01:26:38 -0700 (PDT) Received: from localhost ([139.177.225.240]) by smtp.gmail.com with ESMTPSA id c19-20020a62e813000000b005252adb89b3sm10859382pfi.32.2022.06.29.01.26.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Jun 2022 01:26:37 -0700 (PDT) From: Xie Yongji To: mst@redhat.com, jasowang@redhat.com, xiaodong.liu@intel.com, maxime.coquelin@redhat.com, stefanha@redhat.com Cc: virtualization@lists.linux-foundation.org, linux-kernel@vger.kernel.org Subject: [PATCH 2/6] vduse: Use memcpy_{to,from}_page() in do_bounce() Date: Wed, 29 Jun 2022 16:25:37 +0800 Message-Id: <20220629082541.118-3-xieyongji@bytedance.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220629082541.118-1-xieyongji@bytedance.com> References: <20220629082541.118-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 --- 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 Sun Apr 19 15:22:21 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 79875C433EF for ; Wed, 29 Jun 2022 08:26:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232845AbiF2I0y (ORCPT ); Wed, 29 Jun 2022 04:26:54 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41176 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232762AbiF2I0p (ORCPT ); Wed, 29 Jun 2022 04:26:45 -0400 Received: from mail-pl1-x62c.google.com (mail-pl1-x62c.google.com [IPv6:2607:f8b0:4864:20::62c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2BB4B3CA53 for ; Wed, 29 Jun 2022 01:26:42 -0700 (PDT) Received: by mail-pl1-x62c.google.com with SMTP id x20so7815437plx.6 for ; Wed, 29 Jun 2022 01:26:42 -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=QhASuSf86HbeQ+sQa6ckHpYaDHR8uGVnKtFMqMlSbWE=; b=ijVNYIep5SiF0mPLPhtKMC8BtZGfnHwrMHTwGw6rvniNAq3EA0x3la2HJ1EINSlXPg W5MtgwXuB+lywZklO8gK+VZ1HbHYUK/hmwGN4WajG5VFLHZhLuNB8gRPwORGNnk/Hvuj zcKiimI6UsZpzfJ3PR1qtb6BRjkIcqbzmxrruNtCezSRytAsD6POio1R1csCpRAsRuHr uPxH9wlXUaoX3TTkssq75UhiH3EQr6wdJj1amsmtijd2z6SSd2p2v8Viyr2Y6d1orScV f3qdtE1nqBRVY2cemDuXZ9vc8xgZCWs6gJBAhWqysBxWcaoARYbQFEbPB9YE81cRuX2k 5RVA== 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=QhASuSf86HbeQ+sQa6ckHpYaDHR8uGVnKtFMqMlSbWE=; b=jo/01WhZ01gaeNZFZZb8FymDktW+vo4AF3sPeyX1+P3rhJgDcc5tcJu86RLp5/ZZvu HjKeG2Ps6OdZ9M7mnRKLinVM1l9BNKweWa317xBGKGz/u7NVtiuhlM4WWpswUDyAOTl6 iSTToPpopllvKimQWY+U4f6mK0sCy05rbF56xPQwJ7tsWeYqww4XA+H9zjQ6hhhrEeAv jhm7nktpFX2jesRgvNDsVAheRWkL9N4uzjXw+yZQsDoYrlXCsF2ntDYnPOp2tlF9iMSM WZ9q/1aqiXbsuc9fH8YY/Dx74+l07L3VXQ9qayZpTmz9XVRnwW3LvCVZtI4SNZeqlVro BxyA== X-Gm-Message-State: AJIora/BqVqI02inAVj4omiq2GZoX4BVTPiXNjRvGnLRVZaC+Ry+g4yB oVhF8F83fRmMoWnR1RZMMvz0 X-Google-Smtp-Source: AGRyM1tIfs3D5R4ysJgznj49WD5wzW8aF0KYh76TiHlwByEtbHIbouE0AjYIZ6eUhmWYXoTNlt3iRQ== X-Received: by 2002:a17:902:f543:b0:16a:54c6:78d0 with SMTP id h3-20020a170902f54300b0016a54c678d0mr8055604plf.28.1656491201679; Wed, 29 Jun 2022 01:26:41 -0700 (PDT) Received: from localhost ([139.177.225.240]) by smtp.gmail.com with ESMTPSA id x9-20020a170902820900b0016a11e839fcsm10727725pln.208.2022.06.29.01.26.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Jun 2022 01:26:41 -0700 (PDT) From: Xie Yongji To: mst@redhat.com, jasowang@redhat.com, xiaodong.liu@intel.com, maxime.coquelin@redhat.com, stefanha@redhat.com Cc: virtualization@lists.linux-foundation.org, linux-kernel@vger.kernel.org Subject: [PATCH 3/6] vduse: Support using userspace pages as bounce buffer Date: Wed, 29 Jun 2022 16:25:38 +0800 Message-Id: <20220629082541.118-4-xieyongji@bytedance.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220629082541.118-1-xieyongji@bytedance.com> References: <20220629082541.118-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 --- drivers/vdpa/vdpa_user/iova_domain.c | 128 +++++++++++++++++++++++++-- drivers/vdpa/vdpa_user/iova_domain.h | 9 ++ 2 files changed, 129 insertions(+), 8 deletions(-) diff --git a/drivers/vdpa/vdpa_user/iova_domain.c b/drivers/vdpa/vdpa_user/= iova_domain.c index 50d7c08d5450..2ae29341228e 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,81 @@ 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; + + ret =3D -EBUSY; + /* + * Make sure nobody maps the kernel bounce pages, + * then we can free them. + */ + if (domain->mapped) + 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 +397,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 +420,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 @@ -404,6 +490,24 @@ void vduse_domain_free_coherent(struct vduse_iova_doma= in *domain, size_t size, free_pages_exact(phys_to_virt(pa), size); } =20 +static void vduse_domain_mmap_open(struct vm_area_struct *vma) +{ + struct vduse_iova_domain *domain =3D vma->vm_private_data; + + write_lock(&domain->bounce_lock); + domain->mapped++; + write_unlock(&domain->bounce_lock); +} + +static void vduse_domain_mmap_close(struct vm_area_struct *vma) +{ + struct vduse_iova_domain *domain =3D vma->vm_private_data; + + write_lock(&domain->bounce_lock); + domain->mapped--; + write_unlock(&domain->bounce_lock); +} + static vm_fault_t vduse_domain_mmap_fault(struct vm_fault *vmf) { struct vduse_iova_domain *domain =3D vmf->vma->vm_private_data; @@ -427,6 +531,8 @@ static vm_fault_t vduse_domain_mmap_fault(struct vm_fau= lt *vmf) } =20 static const struct vm_operations_struct vduse_domain_mmap_ops =3D { + .open =3D vduse_domain_mmap_open, + .close =3D vduse_domain_mmap_close, .fault =3D vduse_domain_mmap_fault, }; =20 @@ -438,6 +544,10 @@ static int vduse_domain_mmap(struct file *file, struct= vm_area_struct *vma) vma->vm_private_data =3D domain; vma->vm_ops =3D &vduse_domain_mmap_ops; =20 + write_lock(&domain->bounce_lock); + domain->mapped++; + write_unlock(&domain->bounce_lock); + return 0; } =20 @@ -447,7 +557,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 +618,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..4a47615346ac 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,9 @@ struct vduse_iova_domain { struct vhost_iotlb *iotlb; spinlock_t iotlb_lock; struct file *file; + int mapped; + bool user_bounce_pages; + rwlock_t bounce_lock; }; =20 int vduse_domain_set_map(struct vduse_iova_domain *domain, @@ -61,6 +65,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 Sun Apr 19 15:22:21 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 AE593C433EF for ; Wed, 29 Jun 2022 08:27:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232895AbiF2I1B (ORCPT ); Wed, 29 Jun 2022 04:27:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41194 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232805AbiF2I0t (ORCPT ); Wed, 29 Jun 2022 04:26:49 -0400 Received: from mail-pj1-x1029.google.com (mail-pj1-x1029.google.com [IPv6:2607:f8b0:4864:20::1029]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 100E43C735 for ; Wed, 29 Jun 2022 01:26:46 -0700 (PDT) Received: by mail-pj1-x1029.google.com with SMTP id i8-20020a17090aee8800b001ecc929d14dso792111pjz.0 for ; Wed, 29 Jun 2022 01:26:45 -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=G3nmW2W5f1Ags3bIprl9TznXZAGwoHC4aKKQYqLLiCg=; b=o8Kmf8Xd02DdhVt1ctE4MA/5ssQp+IuiM2ha/VbaglCobl8zDjOSqxeeKc+x6sJyoM 8Vdqo+JCPCWzrF0Zby2l4aD9KgVH0z7CDR8eB/a1723c6UWYkSAgwXH+NO8pedHB/abs /IlGcj9HPuH+MEoVBFBdM/qjHX1UOMLEpC5C8IvCqmL0PdI4P1iV23rW8DQL2d/LVN9u FHxW69BwT3wf1olLOJ0goLn7jUSrLLqLqx133BlrA+Hyn3T+4CF18i42BA2Pa2d1SB8g 11nVynPxQL4SUfReYxsX+ViCM6t1udm01kZg0vAW5Vony3cK4CZQhXYMuFesBHxM7b62 L1Fg== 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=G3nmW2W5f1Ags3bIprl9TznXZAGwoHC4aKKQYqLLiCg=; b=huQ+iyZS/Rsofa4yYuCy5LMt+UynbejpmJ74dUDRk5vHDEdHiLc4sJwoP5ow2Z582z urx3uFAfSre0USWQOPWlL6JoiPBV/9JY2Wmx6vnZpCXKnIYjtElBQzxVmb/cGMC347yR mrYr2CycdzqauJPW8M5TNR11aS/7eVy6k5wzwT2BkbVSzEu98J3X5CIl/wH4BL8KNtkt zCjt9nBgsRORa29gdkCfFJc0c4zvR0XsAf0Z/CwnBPBvB8/bYROHzf7l1m5eBJ2Qx7Av MRrvqERWHqXGWa4naBNQt+sqel/QzhWRdjDgFi07iFGr3qQM10c13FsphxrPiGkKxm+i cEVw== X-Gm-Message-State: AJIora8LUtcQXN94lyrmNtRm4zlY9qXU4TTVV9KKd8tBMuiATPxybISo Q5fgOMHUsLjZATk9XZShftzL X-Google-Smtp-Source: AGRyM1u7e1+pr2JcYff6aR+DVYfeHtUsTX/ipRso2Je67hgXKKfOyk0M7qPDU7Ll09Sc9f6qBiZRMQ== X-Received: by 2002:a17:903:1208:b0:16b:81f6:e992 with SMTP id l8-20020a170903120800b0016b81f6e992mr9287932plh.55.1656491205377; Wed, 29 Jun 2022 01:26:45 -0700 (PDT) Received: from localhost ([139.177.225.240]) by smtp.gmail.com with ESMTPSA id 2-20020a631442000000b003f24d67d226sm10584442pgu.92.2022.06.29.01.26.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Jun 2022 01:26:44 -0700 (PDT) From: Xie Yongji To: mst@redhat.com, jasowang@redhat.com, xiaodong.liu@intel.com, maxime.coquelin@redhat.com, stefanha@redhat.com Cc: virtualization@lists.linux-foundation.org, linux-kernel@vger.kernel.org Subject: [PATCH 4/6] vduse: Support querying IOLTB information Date: Wed, 29 Jun 2022 16:25:39 +0800 Message-Id: <20220629082541.118-5-xieyongji@bytedance.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220629082541.118-1-xieyongji@bytedance.com> References: <20220629082541.118-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 IOLTB information such as bounce buffer size. Signed-off-by: Xie Yongji --- drivers/vdpa/vdpa_user/vduse_dev.c | 13 +++++++++++++ include/uapi/linux/vduse.h | 17 +++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/drivers/vdpa/vdpa_user/vduse_dev.c b/drivers/vdpa/vdpa_user/vd= use_dev.c index 3bc27de58f46..c47a5d9765cf 100644 --- a/drivers/vdpa/vdpa_user/vduse_dev.c +++ b/drivers/vdpa/vdpa_user/vduse_dev.c @@ -1089,6 +1089,19 @@ 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_GET_INFO: { + struct vduse_iotlb_info iotlb; + + iotlb.bounce_iova =3D 0; + iotlb.bounce_size =3D dev->domain->bounce_size; + + ret =3D -EFAULT; + if (copy_to_user(argp, &iotlb, sizeof(iotlb))) + 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 7cfe1c1280c0..c201b7a77c2c 100644 --- a/include/uapi/linux/vduse.h +++ b/include/uapi/linux/vduse.h @@ -210,6 +210,23 @@ struct vduse_vq_eventfd { */ #define VDUSE_VQ_INJECT_IRQ _IOW(VDUSE_BASE, 0x17, __u32) =20 +/** + * struct vduse_iotlb_info - IOTLB information + * @bounce_iova: start IOVA of bounce buffer + * @bounce_size: bounce buffer size + * @reserved: for future use, needs to be initialized to zero + * + * Structure used by VDUSE_IOTLB_GET_INFO ioctl to get IOTLB information. + */ +struct vduse_iotlb_info { + __u64 bounce_iova; + __u64 bounce_size; + __u64 reserved[2]; +}; + +/* Get IOTLB information, e.g. bounce buffer size */ +#define VDUSE_IOTLB_GET_INFO _IOR(VDUSE_BASE, 0x18, struct vduse_iotlb_= info) + /* The control messages definition for read(2)/write(2) on /dev/vduse/$NAM= E */ =20 /** --=20 2.20.1 From nobody Sun Apr 19 15:22:21 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 46627C433EF for ; Wed, 29 Jun 2022 08:27:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232859AbiF2I1M (ORCPT ); Wed, 29 Jun 2022 04:27:12 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41560 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232793AbiF2I0x (ORCPT ); Wed, 29 Jun 2022 04:26:53 -0400 Received: from mail-pg1-x533.google.com (mail-pg1-x533.google.com [IPv6:2607:f8b0:4864:20::533]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F40F63CA5A for ; Wed, 29 Jun 2022 01:26:49 -0700 (PDT) Received: by mail-pg1-x533.google.com with SMTP id r66so14656112pgr.2 for ; Wed, 29 Jun 2022 01:26:49 -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=qdDNWS0N1qvnJfQ25v/RS+rQCZCKGnoXDZPV02ahj18=; b=Mn3g51LpoEJRQO+JVIvfJwcLpl2x0rEq2y7ZZi6Amc6vX8mqvg+cGS+qBDY4Qug+rU QAn2fpJFVWxqdcZgnu+sL3+vEAq6wnr5AVBsTtixjuWK7T/OxgvmJqow7QbOihZlaU6Q jfla/b+CZ86YgB9IzK9X89RlyuGRtMR9tRpIPinUGNzEuh30HERF5V+/qFP9ShLwNP8P m18ZtGetwTkFB525tdAvW60Ao90xBvDoJb+HzNXcT+m6pnnqtVK2X8CIoR9lP1/cQp+u px3gmiy4GRRff02ci7baSAnx8K9kO0lviSI+s9NOL433v4l2Ltb2idNp9oPf15uvRicp Qy6A== 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=qdDNWS0N1qvnJfQ25v/RS+rQCZCKGnoXDZPV02ahj18=; b=XcEpnvJcrJIv+shtPcFEwXfhdQS0s3z52LYL2S+SYVf7UqUKPgeAt8A7YGo3Ut8ao7 Zie6CjtvE+NgNGTPDGCdYgbEaV4CaErFaRfVhCmLD7W13XzC+HzjSjH7FNbDzKy+8Cdw wEiYDyrUtlfHlsGVZfUS6diW2CM+ucycElZLChRHB0YZ9vyiCkXGfsvOCvPzckHnImdS NSp2NaQ2Vl1LixZprAkLxfvRGdsCu9RHgl7SqWbOrzrnZvP82s06gf2psFPmxQxiN7fQ jrc0xtY13XYPcxQG5Ak+rYQUeOMO68Em0w4otJLyjdSODD/AxOCGnvhU5tXKk6CraYbp QraQ== X-Gm-Message-State: AJIora+emVINgDRrTmWws+Y9EgLeuMwsJDQgP/tOEZRVvIIXJD/lMsQX SXaPk1ezkE2zeRULuD56Ay9U X-Google-Smtp-Source: AGRyM1sKjsilg6UCqmTF5QCwG1b8qKaQ0ysMyn8lKBlgt++PtByGTSsHrQeb4DtGTH+pB3e3bJn9Mw== X-Received: by 2002:a63:2483:0:b0:40d:7d66:a86e with SMTP id k125-20020a632483000000b0040d7d66a86emr1981063pgk.161.1656491209317; Wed, 29 Jun 2022 01:26:49 -0700 (PDT) Received: from localhost ([139.177.225.240]) by smtp.gmail.com with ESMTPSA id a20-20020a170903101400b001641670d1adsm10668680plb.131.2022.06.29.01.26.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Jun 2022 01:26:48 -0700 (PDT) From: Xie Yongji To: mst@redhat.com, jasowang@redhat.com, xiaodong.liu@intel.com, maxime.coquelin@redhat.com, stefanha@redhat.com Cc: virtualization@lists.linux-foundation.org, linux-kernel@vger.kernel.org Subject: [PATCH 5/6] vduse: Support registering userspace memory for IOTLB Date: Wed, 29 Jun 2022 16:25:40 +0800 Message-Id: <20220629082541.118-6-xieyongji@bytedance.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220629082541.118-1-xieyongji@bytedance.com> References: <20220629082541.118-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 IOTLB in virtio-vdpa case. Now it only supports registering userspace memory for IOTLB as bounce buffer. Signed-off-by: Xie Yongji --- drivers/vdpa/vdpa_user/vduse_dev.c | 138 +++++++++++++++++++++++++++++ include/uapi/linux/vduse.h | 28 ++++++ 2 files changed, 166 insertions(+) diff --git a/drivers/vdpa/vdpa_user/vduse_dev.c b/drivers/vdpa/vdpa_user/vd= use_dev.c index c47a5d9765cf..7b2ea7612da9 100644 --- a/drivers/vdpa/vdpa_user/vduse_dev.c +++ b/drivers/vdpa/vdpa_user/vduse_dev.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -64,6 +65,13 @@ struct vduse_vdpa { struct vduse_dev *dev; }; =20 +struct vduse_iotlb_mem { + 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 +103,8 @@ struct vduse_dev { u8 status; u32 vq_num; u32 vq_align; + struct vduse_iotlb_mem *iotlb_mem; + struct mutex mem_lock; }; =20 struct vduse_dev_msg { @@ -917,6 +927,100 @@ static int vduse_dev_queue_irq_work(struct vduse_dev = *dev, return ret; } =20 +static int vduse_dev_dereg_iotlb_mem(struct vduse_dev *dev, + u64 iova, u64 size) +{ + int ret; + + mutex_lock(&dev->mem_lock); + ret =3D -ENOENT; + if (!dev->iotlb_mem) + goto unlock; + + ret =3D -EINVAL; + if (dev->iotlb_mem->iova !=3D iova || size !=3D dev->domain->bounce_size) + goto unlock; + + vduse_domain_remove_user_bounce_pages(dev->domain); + unpin_user_pages(dev->iotlb_mem->pages, dev->iotlb_mem->npages); + atomic64_sub(dev->iotlb_mem->npages, &dev->iotlb_mem->mm->pinned_vm); + mmdrop(dev->iotlb_mem->mm); + vfree(dev->iotlb_mem->pages); + kfree(dev->iotlb_mem); + dev->iotlb_mem =3D NULL; + ret =3D 0; +unlock: + mutex_unlock(&dev->mem_lock); + return ret; +} + +static int vduse_dev_reg_iotlb_mem(struct vduse_dev *dev, + u64 iova, u64 uaddr, u64 size) +{ + struct page **page_list =3D NULL; + struct vduse_iotlb_mem *mem =3D NULL; + long pinned =3D 0; + unsigned long npages, lock_limit; + int ret; + + if (size !=3D dev->domain->bounce_size || + iova !=3D 0 || uaddr & ~PAGE_MASK) + return -EINVAL; + + mutex_lock(&dev->mem_lock); + ret =3D -EEXIST; + if (dev->iotlb_mem) + goto unlock; + + ret =3D -ENOMEM; + npages =3D size >> PAGE_SHIFT; + page_list =3D vmalloc(array_size(npages, + sizeof(struct page *))); + mem =3D kzalloc(sizeof(*mem), GFP_KERNEL); + if (!page_list || !mem) + 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); + + mem->pages =3D page_list; + mem->npages =3D pinned; + mem->iova =3D iova; + mem->mm =3D current->mm; + mmgrab(current->mm); + + dev->iotlb_mem =3D mem; +out: + if (ret && pinned > 0) + unpin_user_pages(page_list, pinned); + + mmap_read_unlock(current->mm); +unlock: + if (ret) { + vfree(page_list); + kfree(mem); + } + mutex_unlock(&dev->mem_lock); + return ret; +} + static long vduse_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { @@ -943,6 +1047,16 @@ static long vduse_dev_ioctl(struct file *file, unsign= ed int cmd, if (entry.start > entry.last) break; =20 + if (domain->bounce_map && dev->iotlb_mem) { + ret =3D -EEXIST; + if (entry.start >=3D 0 && + entry.last < domain->bounce_size) + break; + + if (entry.start < domain->bounce_size) + entry.start =3D domain->bounce_size; + } + spin_lock(&domain->iotlb_lock); map =3D vhost_iotlb_itree_first(domain->iotlb, entry.start, entry.last); @@ -1102,6 +1216,28 @@ static long vduse_dev_ioctl(struct file *file, unsig= ned int cmd, ret =3D 0; break; } + case VDUSE_IOTLB_REG_UMEM: { + struct vduse_iotlb_umem umem; + + ret =3D -EFAULT; + if (copy_from_user(&umem, argp, sizeof(umem))) + break; + + ret =3D vduse_dev_reg_iotlb_mem(dev, umem.iova, + umem.uaddr, umem.size); + break; + } + case VDUSE_IOTLB_DEREG_UMEM: { + struct vduse_iotlb_umem umem; + + ret =3D -EFAULT; + if (copy_from_user(&umem, argp, sizeof(umem))) + break; + + ret =3D vduse_dev_dereg_iotlb_mem(dev, umem.iova, + umem.size); + break; + } default: ret =3D -ENOIOCTLCMD; break; @@ -1114,6 +1250,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_iotlb_mem(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); @@ -1176,6 +1313,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 c201b7a77c2c..1b17391e228f 100644 --- a/include/uapi/linux/vduse.h +++ b/include/uapi/linux/vduse.h @@ -227,6 +227,34 @@ struct vduse_iotlb_info { /* Get IOTLB information, e.g. bounce buffer size */ #define VDUSE_IOTLB_GET_INFO _IOR(VDUSE_BASE, 0x18, struct vduse_iotlb_= info) =20 +/** + * struct vduse_iotlb_umem - userspace memory configuration + * @uaddr: start address of userspace memory, it must be aligned to page s= ize + * @iova: IOVA of userspace memory, it must be equal to bounce iova return= ed + * by VDUSE_IOTLB_GET_INFO now + * @size: size of userspace memory, it must be equal to bounce size return= ed + * by VDUSE_IOTLB_GET_INFO now + * @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 IOTLB. + */ +struct vduse_iotlb_umem { + __u64 uaddr; + __u64 iova; + __u64 size; + __u64 reserved[3]; +}; + +/* + * Register userspace memory for IOTLB. Now we only support registering + * userspace memory as bounce buffer. + */ +#define VDUSE_IOTLB_REG_UMEM _IOW(VDUSE_BASE, 0x19, struct vduse_iotlb_ume= m) + +/* De-register the userspace memory. Caller should set iova and size field= . */ +#define VDUSE_IOTLB_DEREG_UMEM _IOW(VDUSE_BASE, 0x1a, struct vduse_iotlb_u= mem) + /* The control messages definition for read(2)/write(2) on /dev/vduse/$NAM= E */ =20 /** --=20 2.20.1 From nobody Sun Apr 19 15:22:21 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 70DF1C433EF for ; Wed, 29 Jun 2022 08:27:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232871AbiF2I1R (ORCPT ); Wed, 29 Jun 2022 04:27:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41094 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232868AbiF2I1A (ORCPT ); Wed, 29 Jun 2022 04:27:00 -0400 Received: from mail-pl1-x62c.google.com (mail-pl1-x62c.google.com [IPv6:2607:f8b0:4864:20::62c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 843213C719 for ; Wed, 29 Jun 2022 01:26:53 -0700 (PDT) Received: by mail-pl1-x62c.google.com with SMTP id x20so7815437plx.6 for ; Wed, 29 Jun 2022 01:26:53 -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=+hv2nO2fwtPMmF677sjLMD65FxmARA/7K2+94HQf5T4=; b=t7B3pzL62UzySws37XyUzkEb8EAQqLlKP1pza0Y0wI/ODhS5gGAmLxr4ktiv045Dcf l4i+WZ6yvBv+gOuV/sHYlb2MYqPhJonoXds36dCjIaiA1MQGtEFJLZxoVf+jWuyd6oOD INUsjkXUKKgm+8leY5pedkZkkB3W6wdGT0BsolQwqNb6NcUzhMPZH+Nchn0nePBbxJ76 z51CGkDdjaOB8VKOAU6/007Gt5GGQ+vihUxTfsa9DiHKBQYXvN7neG3F+UhDoFTM9LFd QeH/adERI6jRneskmLoZq4wuAgwl+9tswRwbK5NV53xGHiqRDYLt6r2YHcx3MdQqg4I8 dV2A== 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=+hv2nO2fwtPMmF677sjLMD65FxmARA/7K2+94HQf5T4=; b=3gGaftRIL2wf+Kh4SLTaXNzWyG+pZdtY5Pb5jedX8BvLif6lKmc8AtpBeIfxw42haw 7DosWkLA48RK9U/dFrc0K2BwXJRgKWhkvJOjNi+ru8yxOPn0oFa8b72ZgYxFrAdgZZI+ 5NmWVGnoogAVHoiXlxaeVvjxwP8WsXS+aIG+t8wFIv2glYAp+aEQss6N7F8OhNZJYOe9 ItnHqWW0q6G4etQb3SJJSH3N7kz3cgP8vEbUQo9MyIaFXPGdSptMMfwhOb6cOTGSKEvD pwOqnHQerPjMR4652qoMTpqI3m4l8/ZmoD7mgKtpniq7TBaRAMjEiz+u9rMx8mYr5N6o hz0w== X-Gm-Message-State: AJIora9l8GYolWs/kVfRS0zoeB4hfCUgSdHTQ1IWZjAO712W2ahlqss9 ZLMqY2Jla0xzyNz5n4kDXR9Q X-Google-Smtp-Source: AGRyM1tlfjlmKgAZQ2DJFBJe6ldvGsUFDTww8AE9GL44qhynLK2PEHBvRZR/SAmPa6KWzmfkH4xh9Q== X-Received: by 2002:a17:90a:6809:b0:1ec:c213:56c8 with SMTP id p9-20020a17090a680900b001ecc21356c8mr4464266pjj.82.1656491213144; Wed, 29 Jun 2022 01:26:53 -0700 (PDT) Received: from localhost ([139.177.225.240]) by smtp.gmail.com with ESMTPSA id i1-20020a625401000000b00527dba9e37bsm1517039pfb.73.2022.06.29.01.26.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Jun 2022 01:26:52 -0700 (PDT) From: Xie Yongji To: mst@redhat.com, jasowang@redhat.com, xiaodong.liu@intel.com, maxime.coquelin@redhat.com, stefanha@redhat.com Cc: virtualization@lists.linux-foundation.org, linux-kernel@vger.kernel.org Subject: [PATCH 6/6] vduse: Update api version to 1 Date: Wed, 29 Jun 2022 16:25:41 +0800 Message-Id: <20220629082541.118-7-xieyongji@bytedance.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220629082541.118-1-xieyongji@bytedance.com> References: <20220629082541.118-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" Let's update api version to 1 since we introduced some new ioctls to support registering userspace memory for IOTLB. Signed-off-by: Xie Yongji --- drivers/vdpa/vdpa_user/vduse_dev.c | 12 ++++++++++++ include/uapi/linux/vduse.h | 8 +++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/drivers/vdpa/vdpa_user/vduse_dev.c b/drivers/vdpa/vdpa_user/vd= use_dev.c index 7b2ea7612da9..2795785ca6a2 100644 --- a/drivers/vdpa/vdpa_user/vduse_dev.c +++ b/drivers/vdpa/vdpa_user/vduse_dev.c @@ -1206,6 +1206,10 @@ static long vduse_dev_ioctl(struct file *file, unsig= ned int cmd, case VDUSE_IOTLB_GET_INFO: { struct vduse_iotlb_info iotlb; =20 + ret =3D -EPERM; + if (dev->api_version < 1) + break; + iotlb.bounce_iova =3D 0; iotlb.bounce_size =3D dev->domain->bounce_size; =20 @@ -1219,6 +1223,10 @@ static long vduse_dev_ioctl(struct file *file, unsig= ned int cmd, case VDUSE_IOTLB_REG_UMEM: { struct vduse_iotlb_umem umem; =20 + ret =3D -EPERM; + if (dev->api_version < 1) + break; + ret =3D -EFAULT; if (copy_from_user(&umem, argp, sizeof(umem))) break; @@ -1230,6 +1238,10 @@ static long vduse_dev_ioctl(struct file *file, unsig= ned int cmd, case VDUSE_IOTLB_DEREG_UMEM: { struct vduse_iotlb_umem umem; =20 + ret =3D -EPERM; + if (dev->api_version < 1) + break; + ret =3D -EFAULT; if (copy_from_user(&umem, argp, sizeof(umem))) break; diff --git a/include/uapi/linux/vduse.h b/include/uapi/linux/vduse.h index 1b17391e228f..902ea19cd9e0 100644 --- a/include/uapi/linux/vduse.h +++ b/include/uapi/linux/vduse.h @@ -8,7 +8,13 @@ =20 /* The ioctls for control device (/dev/vduse/control) */ =20 -#define VDUSE_API_VERSION 0 +/* + * v0 -> v1: + * - Introduce VDUSE_IOTLB_GET_INFO ioctl + * - Introduce VDUSE_VDUSE_IOTLB_REG_UMEM ioctl + * - Introduce VDUSE_IOTLB_DEREG_UMEM ioctl + */ +#define VDUSE_API_VERSION 1 =20 /* * Get the version of VDUSE API that kernel supported (VDUSE_API_VERSION). --=20 2.20.1