Received: by 2002:a05:6a10:1d13:0:0:0:0 with SMTP id pp19csp1182613pxb; Thu, 19 Aug 2021 23:07:01 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxStsrUnNHnMw+QLmFArxarWA4+MCr6bRHtywsHiomhVfG+FCSkjO6Jm3Jr+mJoLZolNP2D X-Received: by 2002:a17:906:53d3:: with SMTP id p19mr19930320ejo.509.1629439621653; Thu, 19 Aug 2021 23:07:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1629439621; cv=none; d=google.com; s=arc-20160816; b=Lyv5KlLwTly4YRGqFNcBSD+cjlh1QW40Q69c0v10cnh1XqKML7p4iXX2muBvXGKBVT v8YfkL9LVvRFMF2EO+zON43CSSDMUdF159IgWgSTl2WLitlh8Vy3J9HTx40MSY1InQjo bDZYiQ3IuMJQEUvCMya76Rm7aRFgA7GWc3Jc8Fm/EcRKFV9n4Lkjo3kOKm2pLk5AXRQs O+Fz9czXlPNyU4xTs6AJbdvxB/1XKhQi+YZJJPqt9wWC7Aa4mo+Qv+PzYfYhsh8KZ1P0 Yv/gjpO+CJknqRy+hzAl/D95Q7iWP/ANsXlkhw8cPd3ogPUoLRT+/9bGhG7lGLql42Gg zuKA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from; bh=fHwYe4skINBdSuYC/wlcdpU0ikUSYLsl3A+iak5uDTo=; b=GE2iaS8z+kbazoiMfYZsN2QkoGe4Ip/eQ80OMMc9tpqvjcNIVHewbEWLaiL4/8HQNz p4UEl5Xql2jx5xHr2qbJCQSW2Sou3KFpt77aeJ9p1O842keQbMnMvSA0OYp/v7SVQ/49 aru+ZD5Jy8qDT/UphY6pKUahhXK7/uGwZyrjj6vs0rQ6c7bDJS7cqOQFRMji08mJbaEk tCg0xGKENL++yzRTq2fNeIJYfzz3m5BPa7ChpqYmcJRIQ+FKuAgvyEeaxqGjwWq2PfDJ 1YrylMwGj7Vg30ZueA25g/f7ITn+I9vU7LP86S0tx7vYlAwTQQQylmalIavJ7fbnKrSU gY/g== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id b24si5556955edy.86.2021.08.19.23.06.34; Thu, 19 Aug 2021 23:07:01 -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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238433AbhHTGDM (ORCPT + 99 others); Fri, 20 Aug 2021 02:03:12 -0400 Received: from mga09.intel.com ([134.134.136.24]:54982 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238343AbhHTGDJ (ORCPT ); Fri, 20 Aug 2021 02:03:09 -0400 X-IronPort-AV: E=McAfee;i="6200,9189,10081"; a="216715464" X-IronPort-AV: E=Sophos;i="5.84,336,1620716400"; d="scan'208";a="216715464" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Aug 2021 23:02:32 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.84,336,1620716400"; d="scan'208";a="490213817" Received: from louislifei-optiplex-7050.sh.intel.com ([10.239.154.151]) by fmsmga008.fm.intel.com with ESMTP; 19 Aug 2021 23:02:30 -0700 From: Fei Li To: gregkh@linuxfoundation.org Cc: linux-kernel@vger.kernel.org, stable@vger.kernel.org, fei1.li@intel.com, yu1.wang@intel.com, shuox.liu@gmail.com Subject: [PATCH 3/3] virt: acrn: Introduce interface to fetch platform info from the hypervisor Date: Fri, 20 Aug 2021 14:03:06 +0800 Message-Id: <20210820060306.10682-4-fei1.li@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210820060306.10682-1-fei1.li@intel.com> References: <20210820060306.10682-1-fei1.li@intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Shuo Liu The ACRN hypervisor configures the guest VMs information statically and builds guest VM configurations within the hypervisor. There are also some hardware information are stored in the hypervisor in boot stage. The ACRN userspace needs platform information to do the orchestration. The HSM provides the following interface for the ACRN userspace to fetch platform info: - ACRN_IOCTL_GET_PLATFORM_INFO Exchange the basic information by a struct acrn_platform_info. If the ACRN userspace provides a userspace buffer (whose vma filled in vm_configs_addr), the HSM creates a bounce buffer (kmalloced for continuous memory region) to fetch VM configurations data from the hypervisor. Signed-off-by: Shuo Liu Signed-off-by: Fei Li --- drivers/virt/acrn/hsm.c | 53 +++++++++++++++++++++++++++++++++++ drivers/virt/acrn/hypercall.h | 12 ++++++++ include/uapi/linux/acrn.h | 44 +++++++++++++++++++++++++++++ 3 files changed, 109 insertions(+) diff --git a/drivers/virt/acrn/hsm.c b/drivers/virt/acrn/hsm.c index 5419794fccf1..eb824a1a86a0 100644 --- a/drivers/virt/acrn/hsm.c +++ b/drivers/virt/acrn/hsm.c @@ -108,6 +108,7 @@ static long acrn_dev_ioctl(struct file *filp, unsigned int cmd, unsigned long ioctl_param) { struct acrn_vm *vm = filp->private_data; + struct acrn_platform_info *plat_info; struct acrn_vm_creation *vm_param; struct acrn_vcpu_regs *cpu_regs; struct acrn_ioreq_notify notify; @@ -115,9 +116,12 @@ static long acrn_dev_ioctl(struct file *filp, unsigned int cmd, struct acrn_ioeventfd ioeventfd; struct acrn_vm_memmap memmap; struct acrn_mmiodev *mmiodev; + void __user *vm_configs_user; struct acrn_msi_entry *msi; struct acrn_pcidev *pcidev; struct acrn_irqfd irqfd; + void *vm_configs = NULL; + size_t vm_configs_size; struct acrn_vdev *vdev; struct page *page; u64 cstate_cmd; @@ -130,6 +134,55 @@ static long acrn_dev_ioctl(struct file *filp, unsigned int cmd, } switch (cmd) { + case ACRN_IOCTL_GET_PLATFORM_INFO: + plat_info = memdup_user((void __user *)ioctl_param, + sizeof(struct acrn_platform_info)); + if (IS_ERR(plat_info)) + return PTR_ERR(plat_info); + + for (i = 0; i < ARRAY_SIZE(plat_info->sw.reserved); i++) + if (plat_info->sw.reserved[i]) + return -EINVAL; + + for (i = 0; i < ARRAY_SIZE(plat_info->hw.reserved); i++) + if (plat_info->hw.reserved[i]) + return -EINVAL; + + vm_configs_size = plat_info->sw.vm_config_size * + plat_info->sw.max_vms; + if (plat_info->sw.vm_configs_addr && vm_configs_size) { + vm_configs_user = plat_info->sw.vm_configs_addr; + vm_configs = kzalloc(vm_configs_size, GFP_KERNEL); + if (IS_ERR(vm_configs)) { + kfree(plat_info); + return PTR_ERR(vm_configs); + } + plat_info->sw.vm_configs_addr = + (void __user *)virt_to_phys(vm_configs); + } + + ret = hcall_get_platform_info(virt_to_phys(plat_info)); + if (ret < 0) { + kfree(vm_configs); + kfree(plat_info); + dev_dbg(acrn_dev.this_device, + "Failed to get info of VM %u!\n", vm->vmid); + break; + } + + if (vm_configs) { + if (copy_to_user(vm_configs_user, vm_configs, + vm_configs_size)) + ret = -EFAULT; + plat_info->sw.vm_configs_addr = vm_configs_user; + } + if (!ret && copy_to_user((void __user *)ioctl_param, plat_info, + sizeof(*plat_info))) + ret = -EFAULT; + + kfree(vm_configs); + kfree(plat_info); + break; case ACRN_IOCTL_CREATE_VM: vm_param = memdup_user((void __user *)ioctl_param, sizeof(struct acrn_vm_creation)); diff --git a/drivers/virt/acrn/hypercall.h b/drivers/virt/acrn/hypercall.h index 71d300821a18..440e204d731a 100644 --- a/drivers/virt/acrn/hypercall.h +++ b/drivers/virt/acrn/hypercall.h @@ -15,6 +15,7 @@ #define HC_ID_GEN_BASE 0x0UL #define HC_SOS_REMOVE_CPU _HC_ID(HC_ID, HC_ID_GEN_BASE + 0x01) +#define HC_GET_PLATFORM_INFO _HC_ID(HC_ID, HC_ID_GEN_BASE + 0x03) #define HC_ID_VM_BASE 0x10UL #define HC_CREATE_VM _HC_ID(HC_ID, HC_ID_VM_BASE + 0x00) @@ -60,6 +61,17 @@ static inline long hcall_sos_remove_cpu(u64 cpu) return acrn_hypercall1(HC_SOS_REMOVE_CPU, cpu); } +/** + * hcall_get_platform_info() - Get platform information from the hypervisor + * @platform_info: Service VM GPA of the &struct acrn_platform_info + * + * Return: 0 on success, <0 on failure + */ +static inline long hcall_get_platform_info(u64 platform_info) +{ + return acrn_hypercall1(HC_GET_PLATFORM_INFO, platform_info); +} + /** * hcall_create_vm() - Create a User VM * @vminfo: Service VM GPA of info of User VM creation diff --git a/include/uapi/linux/acrn.h b/include/uapi/linux/acrn.h index 1408d1063339..2675d17bc803 100644 --- a/include/uapi/linux/acrn.h +++ b/include/uapi/linux/acrn.h @@ -580,12 +580,56 @@ struct acrn_irqfd { struct acrn_msi_entry msi; }; +#define ACRN_PLATFORM_LAPIC_IDS_MAX 64 +/** + * struct acrn_platform_info - Information of a platform from hypervisor + * @hw.cpu_num: Physical CPU number of the platform + * @hw.version: Version of this structure + * @hw.l2_cat_shift: Order of the number of threads sharing L2 cache + * @hw.l3_cat_shift: Order of the number of threads sharing L3 cache + * @hw.lapic_ids: IDs of LAPICs of all threads + * @hw.reserved: Reserved for alignment and should be 0 + * @sw.max_vcpus_per_vm: Maximum number of vCPU of a VM + * @sw.max_vms: Maximum number of VM + * @sw.vm_config_size: Size of configuration of a VM + * @sw.vm_configss_addr: Memory address which user space provided to + * store the VM configurations + * @sw.max_kata_containers: Maximum number of VM for Kata containers + * @sw.reserved: Reserved for alignment and should be 0 + * + * If vm_configs_addr is provided, the driver uses a bounce buffer (kmalloced + * for continuous memory region) to fetch VM configurations data from the + * hypervisor. + */ +struct acrn_platform_info { + struct { + __u16 cpu_num; + __u16 version; + __u32 l2_cat_shift; + __u32 l3_cat_shift; + __u8 lapic_ids[ACRN_PLATFORM_LAPIC_IDS_MAX]; + __u8 reserved[52]; + } hw; + + struct { + __u16 max_vcpus_per_vm; + __u16 max_vms; + __u32 vm_config_size; + void __user *vm_configs_addr; + __u64 max_kata_containers; + __u8 reserved[104]; + } sw; +}; + /* The ioctl type, documented in ioctl-number.rst */ #define ACRN_IOCTL_TYPE 0xA2 /* * Common IOCTL IDs definition for ACRN userspace */ +#define ACRN_IOCTL_GET_PLATFORM_INFO \ + _IOR(ACRN_IOCTL_TYPE, 0x03, struct acrn_platform_info) + #define ACRN_IOCTL_CREATE_VM \ _IOWR(ACRN_IOCTL_TYPE, 0x10, struct acrn_vm_creation) #define ACRN_IOCTL_DESTROY_VM \ -- 2.25.1