From patchwork Wed Jan 18 02:02:35 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yi Sun X-Patchwork-Id: 9522479 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 82AF46043D for ; Wed, 18 Jan 2017 02:06:46 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 74E3228544 for ; Wed, 18 Jan 2017 02:06:46 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6829328557; Wed, 18 Jan 2017 02:06:46 +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 0881B28544 for ; Wed, 18 Jan 2017 02:06: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 1cTfby-0005nj-WD; Wed, 18 Jan 2017 02:04:30 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cTfbx-0005le-9R for xen-devel@lists.xenproject.org; Wed, 18 Jan 2017 02:04:29 +0000 Received: from [85.158.137.68] by server-4.bemta-3.messagelabs.com id 6F/1F-01392-C2DCE785; Wed, 18 Jan 2017 02:04:28 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrHLMWRWlGSWpSXmKPExsVywNykQlf7bF2 EwZFWK4vvWyYzOTB6HP5whSWAMYo1My8pvyKBNWPbT52CyTIVi2fuZ2tg7BftYuTkEBKolNj5 fhkjiC0hwCtxZNkMVgjbT2LSm81ANhdQTQOjxMuHi1hAEmwC6hKPv/YwgdgiAkoS91ZNZgIpY hboZpJY+XArWJGwQKBE74YFzCA2i4CqxKk9M8EaeAU8JK5tmMoEsUFO4uSxyWDbOIHivedns0 Jc5C5x6fRatgmMvAsYGVYxahSnFpWlFukaGeklFWWmZ5TkJmbm6BoaGOvlphYXJ6an5iQmFes l5+duYgSGQz0DA+MOxqkn/A4xSnIwKYnydjyujRDiS8pPqcxILM6ILyrNSS0+xCjDwaEkwXvv dF2EkGBRanpqRVpmDjAwYdISHDxKIrwXQNK8xQWJucWZ6RCpU4yKUuK8x0ASAiCJjNI8uDZYN FxilJUS5mVkYGAQ4ilILcrNLEGVf8UozsGoJMwreQZoCk9mXgnc9FdAi5mAFl/XqQZZXJKIkJ JqYGzftOROg6LGquwlBeLym7OtrVPiDZfrCU+w633WduObkA/3sZPNMVNZv+l33/b2NypR7Jn wvLlbLqf65HuFX/eF3zqyhC/Q2/DqKvepd+fkatwPdueYrxD/o26WIFuj9El/V1zVjRizOK3S xN9/1vuZKV3/W7Hlq0SxzJT7LqsiGaqeZ1akKrEUZyQaajEXFScCAKkGy8iBAgAA X-Env-Sender: yi.y.sun@linux.intel.com X-Msg-Ref: server-8.tower-31.messagelabs.com!1484705037!81141171!13 X-Originating-IP: [192.55.52.120] 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 16037 invoked from network); 18 Jan 2017 02:04:27 -0000 Received: from mga04.intel.com (HELO mga04.intel.com) (192.55.52.120) by server-8.tower-31.messagelabs.com with DHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 18 Jan 2017 02:04:27 -0000 Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga104.fm.intel.com with ESMTP; 17 Jan 2017 18:04:26 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.33,247,1477983600"; d="scan'208";a="54503365" Received: from vmmmba-s2600wft.bj.intel.com ([10.240.193.63]) by fmsmga005.fm.intel.com with ESMTP; 17 Jan 2017 18:04:24 -0800 From: Yi Sun To: xen-devel@lists.xenproject.org Date: Wed, 18 Jan 2017 10:02:35 +0800 Message-Id: <1484704967-5609-13-git-send-email-yi.y.sun@linux.intel.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1484704967-5609-1-git-send-email-yi.y.sun@linux.intel.com> References: <1484704967-5609-1-git-send-email-yi.y.sun@linux.intel.com> Cc: wei.liu2@citrix.com, konrad.wilk@oracle.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 v5 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 c3e25bf..b8d3c82 100644 --- a/xen/arch/x86/psr.c +++ b/xen/arch/x86/psr.c @@ -165,6 +165,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); }; /* @@ -418,6 +421,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, @@ -427,6 +445,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, @@ -909,10 +928,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,