Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp1296388imu; Wed, 16 Jan 2019 16:38:25 -0800 (PST) X-Google-Smtp-Source: ALg8bN7HeiZPq90noB3zBquAa2RnOmLlF3rLVnVuf2qRwh/GmXXtC7UlKedkREPapB2Mf9YbGP3+ X-Received: by 2002:a62:b24a:: with SMTP id x71mr12995215pfe.148.1547685505689; Wed, 16 Jan 2019 16:38:25 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1547685505; cv=none; d=google.com; s=arc-20160816; b=REcBou4/gjCUIX/l35qMJeQ+5B5tVo9kvHNGI2NKuamJVOJQyJ4Gd8J6qwm0i3G5LR G8kpsSIBvPNdF6Yks/Vnn+KRdjcLB2MnFezxYog8QvFy4AGJcTnsF4wG8QyChkpzd28G /os2acRFi8Ok4EXjE0g8uq9Ef8hSSChm4rax9dZcwnxnBdbOeph+FYKKtd5KKnRGFBbF jrNWnognU5F68nNUMRXwAIFvLrOm6pLYOAaiUAcrpVeNC3nr3sKKsrNiXumbLnAYJGA5 k9pw8/m/oGRJDRtumBOxseJ/J6/MaRJmdwJmmbgawr/mth2TL0VjTJbMV8jEdPwx5ktR Z8RA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=dss5QL+RRg6SOfDvA7mMbqZF+GS9Ej+1gmlPfRw4xqs=; b=B0fKqr5n95tX7yiT9TewcM7liCBne53YWiPzdnIUiiFeAwuuRgfFzYdLv7WD5937Ma 7479iGOao6v9oB53tetaAZIUSa0/GVInC49kp7X/n4Xd1swSyqXOs+4Gdzqa1cBRNvGM TzxwpUciWUACiyqZ2Tw2agyI6NpqPx3wxiYpd+WpJPRHDBUOiPpEIu7P91pwndmABgWt ST2xDao8cLL3wgzT3CSccXI7DlOu1Oepf52QWIzlUfmbfB89t0c+jgArkHk6t8A84FG2 TgaVMQoF4hZHb3qekq54vaiiE1aQqrLC7S+4rY1gJs1/yVXpVyvrjAB9vg93hYqWtD/h 3KDg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 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. [209.132.180.67]) by mx.google.com with ESMTP id 36si8155917plc.300.2019.01.16.16.38.07; Wed, 16 Jan 2019 16:38:25 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 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 S1729844AbfAPVY7 (ORCPT + 99 others); Wed, 16 Jan 2019 16:24:59 -0500 Received: from mga11.intel.com ([192.55.52.93]:32309 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729534AbfAPVYg (ORCPT ); Wed, 16 Jan 2019 16:24:36 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 16 Jan 2019 13:24:35 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,487,1539673200"; d="scan'208";a="117269604" Received: from romley-ivt3.sc.intel.com ([172.25.110.60]) by fmsmga008.fm.intel.com with ESMTP; 16 Jan 2019 13:24:34 -0800 From: Fenghua Yu To: "Thomas Gleixner" , "Borislav Petkov" , "Ingo Molnar" , "H Peter Anvin" , "Andy Lutomirski" , "Andrew Cooper" , "Ashok Raj" , "Ravi V Shankar" Cc: "linux-kernel" , "x86" , Fenghua Yu Subject: [PATCH v2 3/3] x86/umwait: Control umwait maximum time Date: Wed, 16 Jan 2019 13:18:42 -0800 Message-Id: <1547673522-226408-8-git-send-email-fenghua.yu@intel.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1547673522-226408-1-git-send-email-fenghua.yu@intel.com> References: <1547673522-226408-1-git-send-email-fenghua.yu@intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org IA32_UMWAIT_CONTROL[31:2] determines the maximum time in TSC-quanta that processor can stay in C0.1 or C0.2. The maximum time value in IA32_UMWAIT_CONTROL[31-2] is set as zero which means there is no global time limit for UMWAIT and TPAUSE instructions. Each process sets its own umwait maximum time as the instructions operand. User can specify global umwait maximum time through interface: /sys/devices/system/cpu/umwait_control/umwait_max_time The value in the interface is in decimal in TSC-quanta. Bits[1:0] are cleared when the value is stored. Signed-off-by: Fenghua Yu --- arch/x86/include/asm/msr-index.h | 2 ++ arch/x86/power/umwait.c | 42 +++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h index b56bfecae0de..42b9104fc15b 100644 --- a/arch/x86/include/asm/msr-index.h +++ b/arch/x86/include/asm/msr-index.h @@ -62,6 +62,8 @@ #define MSR_IA32_UMWAIT_CONTROL 0xe1 #define UMWAIT_CONTROL_C02_BIT 0x0 #define UMWAIT_CONTROL_C02_MASK 0x00000001 +#define UMWAIT_CONTROL_MAX_TIME_BIT 0x2 +#define UMWAIT_CONTROL_MAX_TIME_MASK 0xfffffffc #define MSR_PKG_CST_CONFIG_CONTROL 0x000000e2 #define NHM_C3_AUTO_DEMOTE (1UL << 25) diff --git a/arch/x86/power/umwait.c b/arch/x86/power/umwait.c index 95b3867aac1e..4a1a507d3bb7 100644 --- a/arch/x86/power/umwait.c +++ b/arch/x86/power/umwait.c @@ -10,6 +10,7 @@ #include static int umwait_enable_c0_2 = 1; /* 0: disable C0.2. 1: enable C0.2. */ +static u32 umwait_max_time; /* In TSC-quanta. Only bits [31:2] are used. */ static DEFINE_MUTEX(umwait_lock); /* Return value that will be used to set umwait control MSR */ @@ -20,7 +21,8 @@ static inline u32 umwait_control_val(void) * When bit 0 is 1, C0.2 is disabled. Otherwise, C0.2 is enabled. * So value in bit 0 is opposite of umwait_enable_c0_2. */ - return ~umwait_enable_c0_2 & UMWAIT_CONTROL_C02_MASK; + return (~umwait_enable_c0_2 & UMWAIT_CONTROL_C02_MASK) | + umwait_max_time; } static ssize_t umwait_enable_c0_2_show(struct device *dev, @@ -61,8 +63,46 @@ static ssize_t umwait_enable_c0_2_store(struct device *dev, static DEVICE_ATTR_RW(umwait_enable_c0_2); +static ssize_t umwait_max_time_show(struct device *kobj, + struct device_attribute *attr, char *buf) +{ + return sprintf(buf, "%u\n", umwait_max_time); +} + +static ssize_t umwait_max_time_store(struct device *kobj, + struct device_attribute *attr, + const char *buf, size_t count) +{ + u32 msr_val, max_time; + int cpu, ret; + + ret = kstrtou32(buf, 10, &max_time); + if (ret) + return ret; + + mutex_lock(&umwait_lock); + + /* Only get max time value from bits [31:2] */ + max_time &= UMWAIT_CONTROL_MAX_TIME_MASK; + /* Update the max time value in memory */ + umwait_max_time = max_time; + msr_val = umwait_control_val(); + get_online_cpus(); + /* All CPUs have same umwait max time */ + for_each_online_cpu(cpu) + wrmsr_on_cpu(cpu, MSR_IA32_UMWAIT_CONTROL, msr_val, 0); + put_online_cpus(); + + mutex_unlock(&umwait_lock); + + return count; +} + +static DEVICE_ATTR_RW(umwait_max_time); + static struct attribute *umwait_attrs[] = { &dev_attr_umwait_enable_c0_2.attr, + &dev_attr_umwait_max_time.attr, NULL }; -- 2.19.1