From patchwork Mon Feb 13 06:32:24 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yi Sun X-Patchwork-Id: 9568907 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 6FDC6601E7 for ; Mon, 13 Feb 2017 06:38:47 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5E6C82818E for ; Mon, 13 Feb 2017 06:38:47 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 51D4E281DB; Mon, 13 Feb 2017 06:38:47 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id F352C2818E for ; Mon, 13 Feb 2017 06:38:46 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cdAFJ-0006Jg-Lk; Mon, 13 Feb 2017 06:36:21 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cdAFI-0006Hg-0g for xen-devel@lists.xenproject.org; Mon, 13 Feb 2017 06:36:20 +0000 Received: from [85.158.139.211] by server-10.bemta-5.messagelabs.com id 99/64-01703-3E351A85; Mon, 13 Feb 2017 06:36:19 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrPLMWRWlGSWpSXmKPExsXS1tbhqPsoeGG EwdurGhbft0xmcmD0OPzhCksAYxRrZl5SfkUCa8a5I23MBZNlKk7s3MzcwNgv2sXIxSEkMJ1R Ys+nNvYuRk4OCQFeiSPLZrBC2P4S907tZ4MoamCUmPbmAlgRm4C6xOOvPUwgtoiAksS9VZOZQ IqYBRYxSayY9J0NJCEsECixovcFC4jNIqAqcfjDNKCpHBy8Ah4Sa59LQyyQkzh5bDLYMk6g8J FD7xlBbCEBd4n+XZtYJjDyLmBkWMWoUZxaVJZapGtopJdUlJmeUZKbmJmja2hgqpebWlycmJ6 ak5hUrJecn7uJERgQDECwg7FvlvMhRkkOJiVR3mr7hRFCfEn5KZUZicUZ8UWlOanFhxhlODiU JHjdgoBygkWp6akVaZk5wNCESUtw8CiJ8KaApHmLCxJzizPTIVKnGBWlxHnVQBICIImM0jy4N lg8XGKUlRLmZQQ6RIinILUoN7MEVf4VozgHo5Iw759AoCk8mXklcNNfAS1mAlrs+mAuyOKSRI SUVAOjpejmff/dXHOnCu5/tyi6d1f0rL0lEZ/K7raqXZM2NJX755GuNGGleVzWvYSqqHz+mBj r+IT3kw0fS2nZKn3bWzLPTClAfLLw9qc/b/oxfjUIZ74e0ZX1IimYx0d2jpbEv4zI6WGzpA5k c07duvrdBLHtKRwTZ+z8ICD4687Jsn2hK9pO2rspsRRnJBpqMRcVJwIA5hZgJoICAAA= X-Env-Sender: yi.y.sun@linux.intel.com X-Msg-Ref: server-5.tower-206.messagelabs.com!1486967776!82924391!1 X-Originating-IP: [134.134.136.65] X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG X-StarScan-Received: X-StarScan-Version: 9.2.3; banners=-,-,- X-VirusChecked: Checked Received: (qmail 65171 invoked from network); 13 Feb 2017 06:36:18 -0000 Received: from mga03.intel.com (HELO mga03.intel.com) (134.134.136.65) by server-5.tower-206.messagelabs.com with DHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 13 Feb 2017 06:36:18 -0000 Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 12 Feb 2017 22:36:11 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.35,155,1484035200"; d="scan'208";a="224551698" Received: from vmmmba-s2600wft.bj.intel.com ([10.240.193.63]) by fmsmga004.fm.intel.com with ESMTP; 12 Feb 2017 22:36:08 -0800 From: Yi Sun To: xen-devel@lists.xenproject.org Date: Mon, 13 Feb 2017 14:32:24 +0800 Message-Id: <1486967556-3702-13-git-send-email-yi.y.sun@linux.intel.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1486967556-3702-1-git-send-email-yi.y.sun@linux.intel.com> References: <1486967556-3702-1-git-send-email-yi.y.sun@linux.intel.com> Cc: kevin.tian@intel.com, wei.liu2@citrix.com, andrew.cooper3@citrix.com, dario.faggioli@citrix.com, he.chen@linux.intel.com, ian.jackson@eu.citrix.com, Yi Sun , mengxu@cis.upenn.edu, jbeulich@suse.com, chao.p.peng@linux.intel.com Subject: [Xen-devel] [PATCH v7 12/24] x86: refactor psr: set value: implement write msr flow. X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP Continue with previous patch: 'x86: refactor psr: set value: implement cos id picking flow.' We have got all features values and COS ID to set. Then, we write MSRs of all features except the setting value is same as original value. Till now, set value process is completed. Signed-off-by: Yi Sun --- xen/arch/x86/psr.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 77 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/psr.c b/xen/arch/x86/psr.c index 9fe71db..172823a 100644 --- a/xen/arch/x86/psr.c +++ b/xen/arch/x86/psr.c @@ -169,6 +169,9 @@ struct feat_ops { bool (*fits_cos_max)(const uint64_t val[], const struct feat_node *feat, unsigned int cos); + /* write_msr is used to write out feature MSR register. */ + int (*write_msr)(unsigned int cos, const uint64_t val[], + struct feat_node *feat); }; /* @@ -424,6 +427,21 @@ static bool l3_cat_fits_cos_max(const uint64_t val[], return true; } +static int l3_cat_write_msr(unsigned int cos, const uint64_t val[], + struct feat_node *feat) +{ + if ( cos > feat->info.l3_cat_info.cos_max ) + return -EINVAL; + + if ( feat->cos_reg_val[cos] != val[0] ) + { + feat->cos_reg_val[cos] = val[0]; + wrmsrl(MSR_IA32_PSR_L3_MASK(cos), val[0]); + } + + return 0; +} + static const struct feat_ops l3_cat_ops = { .get_cos_max = l3_cat_get_cos_max, .get_feat_info = l3_cat_get_feat_info, @@ -433,6 +451,7 @@ static const struct feat_ops l3_cat_ops = { .set_new_val = l3_cat_set_new_val, .compare_val = l3_cat_compare_val, .fits_cos_max = l3_cat_fits_cos_max, + .write_msr = l3_cat_write_msr, }; static void __init parse_psr_bool(char *s, char *value, char *feature, @@ -915,10 +934,67 @@ static int pick_avail_cos(const struct psr_socket_info *info, return -ENOENT; } +static unsigned int get_socket_cpu(unsigned int socket) +{ + if ( likely(socket < nr_sockets) ) + return cpumask_any(socket_cpumask[socket]); + + return nr_cpu_ids; +} + +struct cos_write_info +{ + unsigned int cos; + struct list_head *feat_list; + const uint64_t *val; +}; + +static void do_write_psr_msr(void *data) +{ + struct cos_write_info *info = (struct cos_write_info *)data; + unsigned int cos = info->cos; + struct list_head *feat_list= info->feat_list; + const uint64_t *val = info->val; + struct feat_node *feat; + int ret; + + if ( !feat_list ) + return; + + /* We need set all features values into MSRs. */ + list_for_each_entry(feat, feat_list, list) + { + ret = feat->ops.write_msr(cos, val, feat); + if ( ret < 0 ) + return; + + val += feat->ops.get_cos_num(feat); + } +} + static int write_psr_msr(unsigned int socket, unsigned int cos, const uint64_t *val) { - return -ENOENT; + struct psr_socket_info *info = get_socket_info(socket); + struct cos_write_info data = + { + .cos = cos, + .feat_list = &info->feat_list, + .val = val, + }; + + if ( socket == cpu_to_socket(smp_processor_id()) ) + do_write_psr_msr(&data); + else + { + unsigned int cpu = get_socket_cpu(socket); + + if ( cpu >= nr_cpu_ids ) + return -ENOTSOCK; + on_selected_cpus(cpumask_of(cpu), do_write_psr_msr, &data, 1); + } + + return 0; } int psr_set_val(struct domain *d, unsigned int socket,