From patchwork Wed Feb 8 08:16:04 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yi Sun X-Patchwork-Id: 9561931 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 85B6060236 for ; Wed, 8 Feb 2017 08:21:57 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7983728441 for ; Wed, 8 Feb 2017 08:21:57 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6E6C428488; Wed, 8 Feb 2017 08:21:57 +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 93C5128446 for ; Wed, 8 Feb 2017 08:21:55 +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 1cbNTW-00063O-Bc; Wed, 08 Feb 2017 08:19:38 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cbNTV-000621-6o for xen-devel@lists.xenproject.org; Wed, 08 Feb 2017 08:19:37 +0000 Received: from [85.158.139.211] by server-16.bemta-5.messagelabs.com id EC/25-01683-894DA985; Wed, 08 Feb 2017 08:19:36 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrHLMWRWlGSWpSXmKPExsXS1tbhqDv9yqw Ig03XpS2+b5nM5MDocfjDFZYAxijWzLyk/IoE1oxXj/sZCybLVPzeuY+9gbFftIuRk0NIoFJi 77qXjCC2hACvxJFlM1ghbD+Jl5smM3UxcgHVNDBKbHwzFyzBJqAu8fhrDxOILSKgJHFvFUQRs 8AiJokVk76zgSSEBQIlXra2sYPYLAKqEj2LtjOD2LwCHhJ9s3cwQ2yQkzh5bDLQUA4OTqD4mg VyEAe5S1w/OYNlAiPvAkaGVYwaxalFZalFuoaGeklFmekZJbmJmTm6hgamermpxcWJ6ak5iUn Fesn5uZsYgeHAAAQ7GFe2Ox9ilORgUhLlZTw1K0KILyk/pTIjsTgjvqg0J7X4EKMMB4eSBC8b MLyEBItS01Mr0jJzgIEJk5bg4FES4T18GSjNW1yQmFucmQ6ROsWoKCUOkRAASWSU5sG1waLhE qOslDAvI9AhQjwFqUW5mSWo8q8YxTkYlYR5w0Gm8GTmlcBNfwW0mAlo8fXTYItLEhFSUg2M2n b7/treUPrCbz+//UEwy/nVrPW2ajuSnJWPKpf9nHOcbbm2/ax7L+38ZsY0Zpvd+fLBNuGPjsR bqVj+BqfuVw0/T8x89NrISY7TdM/t3KhUIzebCbtT/7OVn535Im5PbEFW0Lnsh3V/WyVYePt9 n63kzvl74KLiBbPph+73HprpOTP3HlO9EktxRqKhFnNRcSIANZ9VVYECAAA= X-Env-Sender: yi.y.sun@linux.intel.com X-Msg-Ref: server-6.tower-206.messagelabs.com!1486541945!83610550!13 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.1.1; banners=-,-,- X-VirusChecked: Checked Received: (qmail 63856 invoked from network); 8 Feb 2017 08:19:35 -0000 Received: from mga03.intel.com (HELO mga03.intel.com) (134.134.136.65) by server-6.tower-206.messagelabs.com with DHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 8 Feb 2017 08:19:35 -0000 Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga103.jf.intel.com with ESMTP; 08 Feb 2017 00:19:34 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.33,346,1477983600"; d="scan'208";a="63203521" Received: from vmmmba-s2600wft.bj.intel.com ([10.240.193.63]) by fmsmga006.fm.intel.com with ESMTP; 08 Feb 2017 00:19:32 -0800 From: Yi Sun To: xen-devel@lists.xenproject.org Date: Wed, 8 Feb 2017 16:16:04 +0800 Message-Id: <1486541776-8406-13-git-send-email-yi.y.sun@linux.intel.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1486541776-8406-1-git-send-email-yi.y.sun@linux.intel.com> References: <1486541776-8406-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 v6 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 8f06d60..23bf8d8 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,