Received: by 2002:a05:6a10:6744:0:0:0:0 with SMTP id w4csp3076356pxu; Mon, 19 Oct 2020 03:22:31 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwEghjCXYu2c4yYbrpBNns3Fw9wYg6a01P/KsGrV4k52WoVDGAN6PNPlBIcO+wKM+lu6CYB X-Received: by 2002:a17:907:94cb:: with SMTP id dn11mr16764973ejc.326.1603102950829; Mon, 19 Oct 2020 03:22:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1603102950; cv=none; d=google.com; s=arc-20160816; b=oia/gk5CqFl9O4K/n2sE931O0k/RY8VVjuE3mR3PowiDuyrklcvgHmeyMXRe88dpuU lhFJSj8xTJrkVa15LF0NbDjz4mtk6rYa6RNN6+0Aiugn6Pb/Wyc7ws6QJ8y3QmDKcf9D hekdP7vAv+rWmf1TaR2rkkCK74VOVkAHsq3/3T6ZKVGoLlT+TnlFAYHh/zZtwnZNyqmh O2t0zq3Etb8I0w4zO++Xud322wggql5tnshAwD9MfrrMh6GddR4Qvh4ZWLsXDhj3b/ZR cCU9Rqxy1M6yMoffEmrjjVptdXZtyYCjqdDMyY9eYZBILq28zLv5Aa5salhzUsySNLhl LQoQ== 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 :ironport-sdr:ironport-sdr; bh=jr1qluORLCRKk+D49H6BDhbYIFAfFMyB1P4eYxH7aOk=; b=BfapdHe9vVIiDlpcFlgQChqlwl2aEiLc7CckY73v2iBTIBT3opHElTkvh8hYKgAvxh l1lfWldlobbabVdzVQgVGTzlxvghrG+aIyPE2NPhQ+UHDwLjro55r7fR1YZJoXE70FBm WYsmmlbCtZjhSNx3EhDKe7RkinMa4dRfwmwhizcbSDnb1O/U8cJMfRYUZE7d8BbFqtXh CjTFMC2Uw1EMR3vGAeiqd5pzKxnMisr9XQHbUt3tWVlkXEKhnbnVn8vUM0qu2SCT+g9i 7uVzjDTOxWc6u7O3UgK5M0f7ZZcV027ks6IH8Kfpd8yyM7snozOjqhRXSYvnsa7/yk0G BQhQ== 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 d12si7373771eds.287.2020.10.19.03.22.08; Mon, 19 Oct 2020 03:22:30 -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 S1727055AbgJSGUX (ORCPT + 99 others); Mon, 19 Oct 2020 02:20:23 -0400 Received: from mga07.intel.com ([134.134.136.100]:40284 "EHLO mga07.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727025AbgJSGUX (ORCPT ); Mon, 19 Oct 2020 02:20:23 -0400 IronPort-SDR: RjuSa1CNE4qYm90ylCfPTgVjH4OvgldsW2M0b2prbdeP9f3tTLohDZyP0o5RLdkacjj66wnYgV yKMcGioivxqw== X-IronPort-AV: E=McAfee;i="6000,8403,9778"; a="231167715" X-IronPort-AV: E=Sophos;i="5.77,393,1596524400"; d="scan'208";a="231167715" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Oct 2020 23:20:21 -0700 IronPort-SDR: cBHapaXe6PgmMvqa10V2B2nvmk9mjUa+CCCsgK5bdzhXyx7KbUua0Kn6u+4zuaq8SKf67YBGhn HM64irF0PpPg== X-IronPort-AV: E=Sophos;i="5.77,393,1596524400"; d="scan'208";a="331794950" Received: from shsi6026.sh.intel.com (HELO localhost) ([10.239.147.88]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Oct 2020 23:20:16 -0700 From: shuo.a.liu@intel.com To: linux-kernel@vger.kernel.org, x86@kernel.org Cc: Greg Kroah-Hartman , "H . Peter Anvin" , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Sean Christopherson , Yu Wang , Reinette Chatre , Shuo Liu , Zhi Wang , Zhenyu Wang Subject: [PATCH v5 17/17] virt: acrn: Introduce an interface for Service VM to control vCPU Date: Mon, 19 Oct 2020 14:18:03 +0800 Message-Id: <20201019061803.13298-18-shuo.a.liu@intel.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201019061803.13298-1-shuo.a.liu@intel.com> References: <20201019061803.13298-1-shuo.a.liu@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Shuo Liu ACRN supports partition mode to achieve real-time requirements. In partition mode, a CPU core can be dedicated to a vCPU of User VM. The local APIC of the dedicated CPU core can be passthrough to the User VM. The Service VM controls the assignment of the CPU cores. Introduce an interface for the Service VM to remove the control of CPU core from hypervisor perspective so that the CPU core can be a dedicated CPU core of User VM. Signed-off-by: Shuo Liu Reviewed-by: Zhi Wang Reviewed-by: Reinette Chatre Cc: Zhi Wang Cc: Zhenyu Wang Cc: Yu Wang Cc: Reinette Chatre Cc: Greg Kroah-Hartman --- drivers/virt/acrn/hsm.c | 48 +++++++++++++++++++++++++++++++++++ drivers/virt/acrn/hypercall.h | 14 ++++++++++ 2 files changed, 62 insertions(+) diff --git a/drivers/virt/acrn/hsm.c b/drivers/virt/acrn/hsm.c index c7290e177b1e..8c3799cc0313 100644 --- a/drivers/virt/acrn/hsm.c +++ b/drivers/virt/acrn/hsm.c @@ -9,6 +9,7 @@ * Yakui Zhao */ +#include #include #include #include @@ -341,6 +342,52 @@ static int acrn_dev_release(struct inode *inode, struct file *filp) return 0; } +static ssize_t remove_cpu_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + u64 cpu, lapicid; + int ret; + + if (kstrtoull(buf, 0, &cpu) < 0) + return -EINVAL; + + if (cpu >= num_possible_cpus() || cpu == 0 || !cpu_is_hotpluggable(cpu)) + return -EINVAL; + + if (cpu_online(cpu)) + remove_cpu(cpu); + + lapicid = cpu_data(cpu).apicid; + dev_dbg(dev, "Try to remove cpu %lld with lapicid %lld\n", cpu, lapicid); + ret = hcall_sos_remove_cpu(lapicid); + if (ret < 0) { + dev_err(dev, "Failed to remove cpu %lld!\n", cpu); + goto fail_remove; + } + + return count; + +fail_remove: + add_cpu(cpu); + return ret; +} +static DEVICE_ATTR_WO(remove_cpu); + +static struct attribute *acrn_attrs[] = { + &dev_attr_remove_cpu.attr, + NULL +}; + +static struct attribute_group acrn_attr_group = { + .attrs = acrn_attrs, +}; + +static const struct attribute_group *acrn_attr_groups[] = { + &acrn_attr_group, + NULL +}; + static const struct file_operations acrn_fops = { .owner = THIS_MODULE, .open = acrn_dev_open, @@ -352,6 +399,7 @@ struct miscdevice acrn_dev = { .minor = MISC_DYNAMIC_MINOR, .name = "acrn_hsm", .fops = &acrn_fops, + .groups = acrn_attr_groups, }; static int __init hsm_init(void) diff --git a/drivers/virt/acrn/hypercall.h b/drivers/virt/acrn/hypercall.h index e640632366f0..0cfad05bd1a9 100644 --- a/drivers/virt/acrn/hypercall.h +++ b/drivers/virt/acrn/hypercall.h @@ -13,6 +13,9 @@ #define HC_ID 0x80UL +#define HC_ID_GEN_BASE 0x0UL +#define HC_SOS_REMOVE_CPU _HC_ID(HC_ID, HC_ID_GEN_BASE + 0x01) + #define HC_ID_VM_BASE 0x10UL #define HC_CREATE_VM _HC_ID(HC_ID, HC_ID_VM_BASE + 0x00) #define HC_DESTROY_VM _HC_ID(HC_ID, HC_ID_VM_BASE + 0x01) @@ -42,6 +45,17 @@ #define HC_ID_PM_BASE 0x80UL #define HC_PM_GET_CPU_STATE _HC_ID(HC_ID, HC_ID_PM_BASE + 0x00) +/** + * hcall_sos_remove_cpu() - Remove a vCPU of Service VM + * @cpu: The vCPU to be removed + * + * Return: 0 on success, <0 on failure + */ +static inline long hcall_sos_remove_cpu(u64 cpu) +{ + return acrn_hypercall1(HC_SOS_REMOVE_CPU, cpu); +} + /** * hcall_create_vm() - Create a User VM * @vminfo: Service VM GPA of info of User VM creation -- 2.28.0