From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.5 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 12F7CC433DB for ; Sun, 28 Feb 2021 15:04:20 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id A6D6064E6B for ; Sun, 28 Feb 2021 15:04:19 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A6D6064E6B Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 44F438D0023; Sun, 28 Feb 2021 10:04:19 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 420E98D0019; Sun, 28 Feb 2021 10:04:19 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 278C68D0023; Sun, 28 Feb 2021 10:04:19 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0217.hostedemail.com [216.40.44.217]) by kanga.kvack.org (Postfix) with ESMTP id 04B458D0019 for ; Sun, 28 Feb 2021 10:04:19 -0500 (EST) Received: from smtpin25.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id BB63C5DE5 for ; Sun, 28 Feb 2021 15:04:18 +0000 (UTC) X-FDA: 77867997396.25.10CB409 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) by imf11.hostedemail.com (Postfix) with ESMTP id 7C04D2000277 for ; Sun, 28 Feb 2021 15:04:06 +0000 (UTC) Received: by mail-pl1-f171.google.com with SMTP id g20so8259484plo.2 for ; Sun, 28 Feb 2021 07:04:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=6RWzHKuFvbODTj5jRC+lQmgTrcJKsaKdR6QlCjl9uo0=; b=Zm0G1Bh7M355CQ0CnlRcOnUtrs7GJlk7wSeOS+Z/1woubrOge8hWZfiNFctJ6skhc9 PIOGfy8QO/OkPLS7fxrZ9vMNX2Qzq/00talYDrEncYWmi5HNhKcqbMW8z+iwkfC/Q5dz 3gBOAcwRJp6RkUYS+BXnXgs5WBpAT04loH1FZF8C1p+/rXcgiupYQh8Dqr/XCjCc/HDT efozduLzA+IN+3SPyP0mCifLAwaAPIX0C5gQ/Ln1REb2rB7im1lidZG3ibnVypuR5zzr ooKLzWvP4HsqRpJanShD+iq3+s9+N52U1xyN0qd8MbEzdSltNlyFPdX+FyGHbl2FH34G ATwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=6RWzHKuFvbODTj5jRC+lQmgTrcJKsaKdR6QlCjl9uo0=; b=HT7BHgYabswO2EM4geviYoHavOWTSeJfQxJo02teySClrpMIDfilis/+XtI6jEk2bl VnyahCrLec568tyO43rU2vF0yInSDbY0IUbGB43tVRjT2h5BqQYQd8ZuDMmyFPR3kJdW c9E6RIUFV18xg2OhQK3/XPWEG0O/ougUFDbp2aZK20QY+c4kAnplARqEgEeGOG0O8qa0 M2ZF4Hcl1+noNonKfsO0yGBQ17XYnrAE4raiie6SRugHyNb7bvnptIwcIamWHoNY1VJP eDutk/VA6zc38r4mkOobizk4cyI7YFba0OtBOHXLp8/GDjBgFnOwMi7PthOUj6ASE0Ut lozg== X-Gm-Message-State: AOAM532lPaXGB6kJxyQhYRVwhyYwramznWBFUjgnJ6JDmGlBwalOyYj2 O0HBSQRmjN3rEhhWLpyy9Gk= X-Google-Smtp-Source: ABdhPJxpYkxlSq8PKfC5naubY2Zm+VoIHoI1m79tpFzJHkL4PgBOeHWtBMc9GoRPrg7uh0LU4ChwvA== X-Received: by 2002:a17:902:c94f:b029:e4:59a3:2915 with SMTP id i15-20020a170902c94fb02900e459a32915mr11421687pla.9.1614524657383; Sun, 28 Feb 2021 07:04:17 -0800 (PST) Received: from ubuntu-Virtual-Machine.corp.microsoft.com ([2001:4898:80e8:0:561f:afde:af07:8820]) by smtp.gmail.com with ESMTPSA id 142sm8391331pfz.196.2021.02.28.07.04.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 28 Feb 2021 07:04:17 -0800 (PST) From: Tianyu Lan To: kys@microsoft.com, haiyangz@microsoft.com, sthemmin@microsoft.com, wei.liu@kernel.org, akpm@linux-foundation.org Cc: Tianyu Lan , linux-hyperv@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, vkuznets@redhat.com, thomas.lendacky@amd.com, brijesh.singh@amd.com, sunilmut@microsoft.com Subject: [RFC PATCH 7/12] hv/vmbus: Initialize VMbus ring buffer for Isolation VM Date: Sun, 28 Feb 2021 10:03:10 -0500 Message-Id: <20210228150315.2552437-8-ltykernel@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210228150315.2552437-1-ltykernel@gmail.com> References: <20210228150315.2552437-1-ltykernel@gmail.com> MIME-Version: 1.0 X-Stat-Signature: mfic7zbdarwoesw68i1yo917epb5q3cs X-Rspamd-Server: rspam02 X-Rspamd-Queue-Id: 7C04D2000277 Received-SPF: none (gmail.com>: No applicable sender policy available) receiver=imf11; identity=mailfrom; envelope-from=""; helo=mail-pl1-f171.google.com; client-ip=209.85.214.171 X-HE-DKIM-Result: pass/pass X-HE-Tag: 1614524646-120453 Content-Transfer-Encoding: quoted-printable X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: From: Tianyu Lan VMbus ring buffer are shared with host and it's need to be accessed via extra address space of Isolation VM with SNP support. This patch is to map the ring buffer address in extra address space via ioremap(). HV host visibility hvcall smears data in the ring buffer and so reset the ring buffer memory to zero after calling visibility hvcall. Signed-off-by: Sunil Muthuswamy Co-Developed-by: Sunil Muthuswamy Signed-off-by: Tianyu Lan --- drivers/hv/channel.c | 10 +++++ drivers/hv/hyperv_vmbus.h | 2 + drivers/hv/ring_buffer.c | 83 +++++++++++++++++++++++++++++---------- mm/ioremap.c | 1 + mm/vmalloc.c | 1 + 5 files changed, 76 insertions(+), 21 deletions(-) diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c index f31b669a1ddf..4c05b1488649 100644 --- a/drivers/hv/channel.c +++ b/drivers/hv/channel.c @@ -657,6 +657,16 @@ static int __vmbus_open(struct vmbus_channel *newcha= nnel, if (err) goto error_clean_ring; =20 + err =3D hv_ringbuffer_post_init(&newchannel->outbound, + page, send_pages); + if (err) + goto error_free_gpadl; + + err =3D hv_ringbuffer_post_init(&newchannel->inbound, + &page[send_pages], recv_pages); + if (err) + goto error_free_gpadl; + /* Create and init the channel open message */ open_info =3D kzalloc(sizeof(*open_info) + sizeof(struct vmbus_channel_open_channel), diff --git a/drivers/hv/hyperv_vmbus.h b/drivers/hv/hyperv_vmbus.h index 0778add21a9c..d78a04ad5490 100644 --- a/drivers/hv/hyperv_vmbus.h +++ b/drivers/hv/hyperv_vmbus.h @@ -172,6 +172,8 @@ extern int hv_synic_cleanup(unsigned int cpu); /* Interface */ =20 void hv_ringbuffer_pre_init(struct vmbus_channel *channel); +int hv_ringbuffer_post_init(struct hv_ring_buffer_info *ring_info, + struct page *pages, u32 page_cnt); =20 int hv_ringbuffer_init(struct hv_ring_buffer_info *ring_info, struct page *pages, u32 pagecnt); diff --git a/drivers/hv/ring_buffer.c b/drivers/hv/ring_buffer.c index 35833d4d1a1d..c8b0f7b45158 100644 --- a/drivers/hv/ring_buffer.c +++ b/drivers/hv/ring_buffer.c @@ -17,6 +17,8 @@ #include #include #include +#include +#include =20 #include "hyperv_vmbus.h" =20 @@ -188,6 +190,44 @@ void hv_ringbuffer_pre_init(struct vmbus_channel *ch= annel) mutex_init(&channel->outbound.ring_buffer_mutex); } =20 +int hv_ringbuffer_post_init(struct hv_ring_buffer_info *ring_info, + struct page *pages, u32 page_cnt) +{ + struct vm_struct *area; + u64 physic_addr =3D page_to_pfn(pages) << PAGE_SHIFT; + unsigned long vaddr; + int err =3D 0; + + if (!hv_isolation_type_snp()) + return 0; + + physic_addr +=3D ms_hyperv.shared_gpa_boundary; + area =3D get_vm_area((2 * page_cnt - 1) * PAGE_SIZE, VM_IOREMAP); + if (!area || !area->addr) + return -EFAULT; + + vaddr =3D (unsigned long)area->addr; + err =3D ioremap_page_range(vaddr, vaddr + page_cnt * PAGE_SIZE, + physic_addr, PAGE_KERNEL_IO); + err |=3D ioremap_page_range(vaddr + page_cnt * PAGE_SIZE, + vaddr + (2 * page_cnt - 1) * PAGE_SIZE, + physic_addr + PAGE_SIZE, PAGE_KERNEL_IO); + if (err) { + vunmap((void *)vaddr); + return -EFAULT; + } + + /* Clean memory after setting host visibility. */ + memset((void *)vaddr, 0x00, page_cnt * PAGE_SIZE); + + ring_info->ring_buffer =3D (struct hv_ring_buffer *)vaddr; + ring_info->ring_buffer->read_index =3D 0; + ring_info->ring_buffer->write_index =3D 0; + ring_info->ring_buffer->feature_bits.value =3D 1; + + return 0; +} + /* Initialize the ring buffer. */ int hv_ringbuffer_init(struct hv_ring_buffer_info *ring_info, struct page *pages, u32 page_cnt) @@ -197,33 +237,34 @@ int hv_ringbuffer_init(struct hv_ring_buffer_info *= ring_info, =20 BUILD_BUG_ON((sizeof(struct hv_ring_buffer) !=3D PAGE_SIZE)); =20 - /* - * First page holds struct hv_ring_buffer, do wraparound mapping for - * the rest. - */ - pages_wraparound =3D kcalloc(page_cnt * 2 - 1, sizeof(struct page *), - GFP_KERNEL); - if (!pages_wraparound) - return -ENOMEM; - - pages_wraparound[0] =3D pages; - for (i =3D 0; i < 2 * (page_cnt - 1); i++) - pages_wraparound[i + 1] =3D &pages[i % (page_cnt - 1) + 1]; + if (!hv_isolation_type_snp()) { + /* + * First page holds struct hv_ring_buffer, do wraparound mapping for + * the rest. + */ + pages_wraparound =3D kcalloc(page_cnt * 2 - 1, sizeof(struct page *), + GFP_KERNEL); + if (!pages_wraparound) + return -ENOMEM; =20 - ring_info->ring_buffer =3D (struct hv_ring_buffer *) - vmap(pages_wraparound, page_cnt * 2 - 1, VM_MAP, PAGE_KERNEL); + pages_wraparound[0] =3D pages; + for (i =3D 0; i < 2 * (page_cnt - 1); i++) + pages_wraparound[i + 1] =3D &pages[i % (page_cnt - 1) + 1]; =20 - kfree(pages_wraparound); + ring_info->ring_buffer =3D (struct hv_ring_buffer *) + vmap(pages_wraparound, page_cnt * 2 - 1, VM_MAP, PAGE_KERNEL); =20 + kfree(pages_wraparound); =20 - if (!ring_info->ring_buffer) - return -ENOMEM; + if (!ring_info->ring_buffer) + return -ENOMEM; =20 - ring_info->ring_buffer->read_index =3D - ring_info->ring_buffer->write_index =3D 0; + ring_info->ring_buffer->read_index =3D + ring_info->ring_buffer->write_index =3D 0; =20 - /* Set the feature bit for enabling flow control. */ - ring_info->ring_buffer->feature_bits.value =3D 1; + /* Set the feature bit for enabling flow control. */ + ring_info->ring_buffer->feature_bits.value =3D 1; + } =20 ring_info->ring_size =3D page_cnt << PAGE_SHIFT; ring_info->ring_size_div10_reciprocal =3D diff --git a/mm/ioremap.c b/mm/ioremap.c index 5fa1ab41d152..d63c4ba067f9 100644 --- a/mm/ioremap.c +++ b/mm/ioremap.c @@ -248,6 +248,7 @@ int ioremap_page_range(unsigned long addr, =20 return err; } +EXPORT_SYMBOL_GPL(ioremap_page_range); =20 #ifdef CONFIG_GENERIC_IOREMAP void __iomem *ioremap_prot(phys_addr_t addr, size_t size, unsigned long = prot) diff --git a/mm/vmalloc.c b/mm/vmalloc.c index e6f352bf0498..19724a8ebcb7 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -2131,6 +2131,7 @@ struct vm_struct *get_vm_area(unsigned long size, u= nsigned long flags) NUMA_NO_NODE, GFP_KERNEL, __builtin_return_address(0)); } +EXPORT_SYMBOL_GPL(get_vm_area); =20 struct vm_struct *get_vm_area_caller(unsigned long size, unsigned long f= lags, const void *caller) --=20 2.25.1