Received: by 2002:a05:6a10:d5a5:0:0:0:0 with SMTP id gn37csp72256pxb; Tue, 5 Oct 2021 23:40:30 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzySpvYWXxACdPmVeE5GK2nIhE2U4nwIJo9H01E8FTucNLOVQXfZ/T10uHqBNVqxbncybeH X-Received: by 2002:a17:902:7103:b0:13d:c2d4:f0ef with SMTP id a3-20020a170902710300b0013dc2d4f0efmr9330408pll.32.1633502429950; Tue, 05 Oct 2021 23:40:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1633502429; cv=none; d=google.com; s=arc-20160816; b=ZNQR0NvAo5D8MOtnkNPjMEYi9of99R/QKlvHOzBrSeYabbhxz15H2UQEsWoLcT+jF4 R0csvZdMizw3glU3yM/y9MVK4QsiqTgBxl+x/2Pm5a1Y+Nb9SYGkNc3HwLbHdJJHr7sm 3k79H2h8whwYST9aG7xtOva2lL6+/YvXWA7uqwMxGxemj+oAtr+KeDILuFxUNZ5e/iG/ RG0mOiXXhfi+znEp9mY8zYyPicboOnkmQIcK1m0Vkv7PoWQPxj0lOUzCG0RBUtUg3geV ANHDpdSLgphuW0sX8fIgWSPiMfZSbKyw2R5D+m48KPUo7y2CKKYMFxyZcKrKqtg/JGjU FiWA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=cUs+nJBemKyqHW1/+tBNnIBzfXId6r+3EciJyXUHzJs=; b=j7vCiz6Rht+gYn6fqvWvCOV2v7m8EgC7n42XPm7De8fy422G6197zE2py6+JXNNnPl 7WZ4edy7194aFsp0vn64USxU7BJ/ZI0tjNRPQj5fHTr0V66Ft+KzIvVqH5C8vRgv0vV/ DIjrIF6NQ2VwAtQD6cEt8ux3CSjPjG234PclkLUoShQe5tTq4/yNylWHWs8eLBsbloVV W5/8DOdwxySE4tD5W0+/YCqeMoQ4Tl7vX+Uek5VnK1Ku2bLcDuTW+DL56zU3fIVWmhvK qfGQ+xNnl93Pf099hCyGKzLxBLdjALBzpDRDpLkfEri+8gJQP1QKHm2URkZRtMAZ2iNn BbUg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=deTC7Rn0; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id c84si24863018pfb.156.2021.10.05.23.40.17; Tue, 05 Oct 2021 23:40:29 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=deTC7Rn0; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237604AbhJFGjt (ORCPT + 99 others); Wed, 6 Oct 2021 02:39:49 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40700 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237443AbhJFGjP (ORCPT ); Wed, 6 Oct 2021 02:39:15 -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 AF081C06178C; Tue, 5 Oct 2021 23:37:08 -0700 (PDT) Received: by mail-pl1-x62e.google.com with SMTP id y5so1041612pll.3; Tue, 05 Oct 2021 23:37:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=cUs+nJBemKyqHW1/+tBNnIBzfXId6r+3EciJyXUHzJs=; b=deTC7Rn0DcsjYYoiRTspqzgwi6qRvMUyQ7vSXGCFfsa5xOad3Gdn8ljNTkYggYUB9M Wh54qfIM5W1Y8TsctnlhmnbtFhrNYJ2+ZTro+t6KMkIvD8O85+Rdwpnvlo5kwHeXVcu5 NizfNtc56ygl73gOCxTLx9/P+KRIjVluMvecfcdL/zXZsCORSKluiRe8eSvs8tVVfdeW g2T1xPemJDMJ3eUNAjHKR7YTRbm7UjH1UISQ5DcUn449tkIhamOtMwdvtYgyAxCVen12 VCt1M1thqP1DgyxyVwTvGfYaadDjgRppBbD2GrkbPMC6YYTAtAJhM10QLs2lO8ZY+/ap 7aGA== 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=cUs+nJBemKyqHW1/+tBNnIBzfXId6r+3EciJyXUHzJs=; b=3XBszEZpxjFKPcVQqISU+5BnvtNSYVCFZuL0SmzwazC2PMqdv1TXhXz1u3TZRY559p O9KWg9of7M9MLKaG/NfXxt1edF8YZBov4E5oH6tNFiP8HraEjYpQzto31ftJR3YdXZZ9 2JyMagpSVhgNpeKiKfnp09R3ZM6eRwgD272p1kT5SAuG6p8c073SPE2g8OLYJ24rlrdS dXIhilLFuOsmCxrY2K5FamWTLmoHvIAy9sn1XR5UTSlAqpzRNYkcu5AoPM9s1u0YOyra zOdSbfPBCM/NjRjLzUwprdBDY4DN6WHbzJW1ew7FiEUcUj0ZscR16a2FS910n6sMKWls lKEg== X-Gm-Message-State: AOAM531p8mKZU+h94gvlAtVOIojJFDWmnfB0QA/b125MwBCEnWZ70jRz RI9NhHPM26f3mIRbVYbFSAE= X-Received: by 2002:a17:902:6b01:b0:13e:50bb:790f with SMTP id o1-20020a1709026b0100b0013e50bb790fmr9298533plk.42.1633502228179; Tue, 05 Oct 2021 23:37:08 -0700 (PDT) Received: from ubuntu-Virtual-Machine.corp.microsoft.com ([2001:4898:80e8:37:357b:c418:cfef:30b1]) by smtp.gmail.com with ESMTPSA id l185sm19886413pfd.29.2021.10.05.23.37.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 Oct 2021 23:37:07 -0700 (PDT) From: Tianyu Lan To: kys@microsoft.com, haiyangz@microsoft.com, sthemmin@microsoft.com, wei.liu@kernel.org, decui@microsoft.com, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, x86@kernel.org, hpa@zytor.com, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, davem@davemloft.net, kuba@kernel.org, gregkh@linuxfoundation.org, arnd@arndb.de, jroedel@suse.de, brijesh.singh@amd.com, Tianyu.Lan@microsoft.com, thomas.lendacky@amd.com, pgonda@google.com, akpm@linux-foundation.org, kirill.shutemov@linux.intel.com, rppt@kernel.org, tj@kernel.org, aneesh.kumar@linux.ibm.com, saravanand@fb.com, hannes@cmpxchg.org, rientjes@google.com, michael.h.kelley@microsoft.com Cc: linux-arch@vger.kernel.org, linux-hyperv@vger.kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, vkuznets@redhat.com, konrad.wilk@oracle.com, hch@lst.de, robin.murphy@arm.com, joro@8bytes.org, parri.andrea@gmail.com, dave.hansen@intel.com Subject: [PATCH V7 9/9] Drivers: hv : vmbus: Initialize VMbus ring buffer for Isolation VM Date: Wed, 6 Oct 2021 02:36:49 -0400 Message-Id: <20211006063651.1124737-10-ltykernel@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211006063651.1124737-1-ltykernel@gmail.com> References: <20211006063651.1124737-1-ltykernel@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 AMD SNP support. This patch is to map the ring buffer address in extra address space via vmap_pfn(). Hyperv set memory host visibility hvcall smears data in the ring buffer and so reset the ring buffer memory to zero after mapping. Signed-off-by: Tianyu Lan --- Change since v4: * Use PFN_DOWN instead of HVPFN_DOWN in the hv_ringbuffer_init() Change since v3: * Remove hv_ringbuffer_post_init(), merge map operation for Isolation VM into hv_ringbuffer_init() * Call hv_ringbuffer_init() after __vmbus_establish_gpadl(). --- drivers/hv/Kconfig | 1 + drivers/hv/channel.c | 19 +++++++------- drivers/hv/ring_buffer.c | 55 ++++++++++++++++++++++++++++++---------- 3 files changed, 53 insertions(+), 22 deletions(-) diff --git a/drivers/hv/Kconfig b/drivers/hv/Kconfig index d1123ceb38f3..dd12af20e467 100644 --- a/drivers/hv/Kconfig +++ b/drivers/hv/Kconfig @@ -8,6 +8,7 @@ config HYPERV || (ARM64 && !CPU_BIG_ENDIAN)) select PARAVIRT select X86_HV_CALLBACK_VECTOR if X86 + select VMAP_PFN help Select this option to run Linux as a Hyper-V client operating system. diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c index b37ff4a39224..dc5c35210c16 100644 --- a/drivers/hv/channel.c +++ b/drivers/hv/channel.c @@ -683,15 +683,6 @@ static int __vmbus_open(struct vmbus_channel *newchannel, if (!newchannel->max_pkt_size) newchannel->max_pkt_size = VMBUS_DEFAULT_MAX_PKT_SIZE; - err = hv_ringbuffer_init(&newchannel->outbound, page, send_pages, 0); - if (err) - goto error_clean_ring; - - err = hv_ringbuffer_init(&newchannel->inbound, &page[send_pages], - recv_pages, newchannel->max_pkt_size); - if (err) - goto error_clean_ring; - /* Establish the gpadl for the ring buffer */ newchannel->ringbuffer_gpadlhandle.gpadl_handle = 0; @@ -703,6 +694,16 @@ static int __vmbus_open(struct vmbus_channel *newchannel, if (err) goto error_clean_ring; + err = hv_ringbuffer_init(&newchannel->outbound, + page, send_pages, 0); + if (err) + goto error_free_gpadl; + + err = hv_ringbuffer_init(&newchannel->inbound, &page[send_pages], + recv_pages, newchannel->max_pkt_size); + if (err) + goto error_free_gpadl; + /* Create and init the channel open message */ open_info = kzalloc(sizeof(*open_info) + sizeof(struct vmbus_channel_open_channel), diff --git a/drivers/hv/ring_buffer.c b/drivers/hv/ring_buffer.c index 314015d9e912..931802ae985c 100644 --- a/drivers/hv/ring_buffer.c +++ b/drivers/hv/ring_buffer.c @@ -17,6 +17,8 @@ #include #include #include +#include +#include #include "hyperv_vmbus.h" @@ -183,8 +185,10 @@ void hv_ringbuffer_pre_init(struct vmbus_channel *channel) int hv_ringbuffer_init(struct hv_ring_buffer_info *ring_info, struct page *pages, u32 page_cnt, u32 max_pkt_size) { - int i; struct page **pages_wraparound; + unsigned long *pfns_wraparound; + u64 pfn; + int i; BUILD_BUG_ON((sizeof(struct hv_ring_buffer) != PAGE_SIZE)); @@ -192,23 +196,48 @@ int hv_ringbuffer_init(struct hv_ring_buffer_info *ring_info, * First page holds struct hv_ring_buffer, do wraparound mapping for * the rest. */ - pages_wraparound = kcalloc(page_cnt * 2 - 1, sizeof(struct page *), - GFP_KERNEL); - if (!pages_wraparound) - return -ENOMEM; + if (hv_isolation_type_snp()) { + pfn = page_to_pfn(pages) + + PFN_DOWN(ms_hyperv.shared_gpa_boundary); + + pfns_wraparound = kcalloc(page_cnt * 2 - 1, + sizeof(unsigned long), GFP_KERNEL); + if (!pfns_wraparound) + return -ENOMEM; + + pfns_wraparound[0] = pfn; + for (i = 0; i < 2 * (page_cnt - 1); i++) + pfns_wraparound[i + 1] = pfn + i % (page_cnt - 1) + 1; - pages_wraparound[0] = pages; - for (i = 0; i < 2 * (page_cnt - 1); i++) - pages_wraparound[i + 1] = &pages[i % (page_cnt - 1) + 1]; + ring_info->ring_buffer = (struct hv_ring_buffer *) + vmap_pfn(pfns_wraparound, page_cnt * 2 - 1, + PAGE_KERNEL); + kfree(pfns_wraparound); - ring_info->ring_buffer = (struct hv_ring_buffer *) - vmap(pages_wraparound, page_cnt * 2 - 1, VM_MAP, PAGE_KERNEL); + if (!ring_info->ring_buffer) + return -ENOMEM; + + /* Zero ring buffer after setting memory host visibility. */ + memset(ring_info->ring_buffer, 0x00, PAGE_SIZE * page_cnt); + } else { + pages_wraparound = kcalloc(page_cnt * 2 - 1, + sizeof(struct page *), + GFP_KERNEL); + + pages_wraparound[0] = pages; + for (i = 0; i < 2 * (page_cnt - 1); i++) + pages_wraparound[i + 1] = + &pages[i % (page_cnt - 1) + 1]; - kfree(pages_wraparound); + ring_info->ring_buffer = (struct hv_ring_buffer *) + vmap(pages_wraparound, page_cnt * 2 - 1, VM_MAP, + PAGE_KERNEL); + kfree(pages_wraparound); + if (!ring_info->ring_buffer) + return -ENOMEM; + } - if (!ring_info->ring_buffer) - return -ENOMEM; ring_info->ring_buffer->read_index = ring_info->ring_buffer->write_index = 0; -- 2.25.1