Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp3073633pxb; Sat, 6 Feb 2021 19:17:27 -0800 (PST) X-Google-Smtp-Source: ABdhPJyt4MUCIxz5K5+ENhVfy5N+W3ENJ0arPr8TW6G8NJUgPlerAEda1UyObu2M/RrgbQrDJPI0 X-Received: by 2002:a50:e186:: with SMTP id k6mr5510260edl.215.1612667847516; Sat, 06 Feb 2021 19:17:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1612667847; cv=none; d=google.com; s=arc-20160816; b=eBXWG4xEf0DrLr+MQEcETGuPpB/pfwshrcTneODlg5eg4lrQjGUJ1OuhR/D5MqzvrJ 49cdzsYly0nYgNrPwtKH0GzFOm23XUpC6uIjX29/OjB5wrwBsXLQu/wTZCCheAaEyssP GhFBeNsXHPhLga1lIP8Pv4WpryFfbeGq+EJk5R9fasPBQzSrWAV8kr6k1b7BxbxluzpC 1AWXot4zwh9X7qvAxnCqNBotVISW0Iv7r9Y3pzXw1gIQo45e8yVwaI3Otwd/lXM92qxq TCSFXhKyR8M3SFeBlD1ZrjsFYb/c0VdA5I+OtGujP3aNhGR15g1YZ3ufUtU8gdwqE17Z I2DQ== 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=PrsL7LyDa825HXtegX5dDY4f25Q8pfF/BdDthaeJz/Q=; b=tM6CxHmM4C3rbaXMRc6TKbGPGxtV1s878V5v4UPkRYio5ZE+fyNvM661nekiwLEesJ y66FvPX4mFae0acznsunIcWP33e6OTBarZHGrvHYe2bCqE/DrNEee8kfjEP4+tW3ogh2 RmeogD14+E7C0UtsfmnvcO1JsMaPaF3YBVJmV5zH73Xvpcvw0EcNoSe7CTWfiM9FuK+7 cm+DNRFvVc4BSc6KRz0Lz2edl2Fyxxmu6fkCrphH5MP4gVFRQpu5lgLypinvNkdn6X7J D7h2sD7F5y1G4qf9n04Jls2oK6oKpAg3YuJDL22hbJC42bcfVsjvCxZ7cPWLqZdLDNaZ Eb/Q== 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 o9si9364523ejr.160.2021.02.06.19.17.04; Sat, 06 Feb 2021 19:17:27 -0800 (PST) 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 S229843AbhBGDP2 (ORCPT + 99 others); Sat, 6 Feb 2021 22:15:28 -0500 Received: from mga06.intel.com ([134.134.136.31]:2501 "EHLO mga06.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229849AbhBGDMy (ORCPT ); Sat, 6 Feb 2021 22:12:54 -0500 IronPort-SDR: ZTLa0Pvy6w/nZzepNRoxQpNZSIdiq5fFs0A3rdy8VlQ2m6VxTOrdr6gHyKkhTe5o3Db7RXMFAI QEWnp/QFRbpA== X-IronPort-AV: E=McAfee;i="6000,8403,9887"; a="243079736" X-IronPort-AV: E=Sophos;i="5.81,158,1610438400"; d="scan'208";a="243079736" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Feb 2021 19:12:29 -0800 IronPort-SDR: YBAxUxAHoCtMBlG8IOWqLbzZVQKMbhIj8Alrmq32cD5zTNYhLEHnYzxB3gZgYGEOO9aywQ4YVR SxVjB33U/fbQ== X-IronPort-AV: E=Sophos;i="5.81,158,1610438400"; d="scan'208";a="584618240" Received: from shsi6026.sh.intel.com (HELO localhost) ([10.239.147.88]) by fmsmga005-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Feb 2021 19:12:27 -0800 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 , Yu Wang , Reinette Chatre , Shuo Liu , Zhi Wang , Zhenyu Wang Subject: [PATCH v9 17/18] virt: acrn: Introduce an interface for Service VM to control vCPU Date: Sun, 7 Feb 2021 11:10:39 +0800 Message-Id: <20210207031040.49576-18-shuo.a.liu@intel.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20210207031040.49576-1-shuo.a.liu@intel.com> References: <20210207031040.49576-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 93f6abe10fa6..1f6b7c54a1a4 100644 --- a/drivers/virt/acrn/hsm.c +++ b/drivers/virt/acrn/hsm.c @@ -9,6 +9,7 @@ * Yakui Zhao */ +#include #include #include #include @@ -371,6 +372,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, @@ -382,6 +429,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