Received: by 2002:a25:6193:0:0:0:0:0 with SMTP id v141csp1066350ybb; Fri, 10 Apr 2020 16:32:24 -0700 (PDT) X-Google-Smtp-Source: APiQypLIqiKIQZS6nqNChE6T9IUMn+ztqU9gznO4DQl2JQzcvRDyE0XOYRQYm2UQ3wRD1JK6JURM X-Received: by 2002:a05:6214:12af:: with SMTP id w15mr7535430qvu.89.1586561543845; Fri, 10 Apr 2020 16:32:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1586561543; cv=none; d=google.com; s=arc-20160816; b=bv1l52j0lLi7OlEN5CKCGxQnhjGNsfIsOzPQko3SETqOyOANAuyEBQ9wnvELp6p7GR 3DfzTRf2858vUTYoj/tBFjolpKPbQAfmiNefHCL+e7TbWbaBpDaThbNVbnsxp9oR1j6r VzYK3csEfPNRWVU53Ils2eWyoFGsQ6U6PC0Pb55AuhNZHLTB6o95VSG82+jJ8tBPys1t C0qj9RNRL86Gz/LMxw5pK4jzx5eVt0tZIxA/QvAx5kBZjw2L0p3g8u6SngNKmLiEA4aM znnEvIYbz52GfXu+VVRBmJSC/CL8RnpRzpFEPedPd857E7IjAcVWe2D9sz0poFo9e341 tk0A== 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:ironport-sdr:ironport-sdr; bh=CLD8/j5nvEyWx1XWb7hfVW10zpsW8oSeethmfuWytJA=; b=A6IaA47TTPKFyllYhgwt7c6oMGynJz8tw9RmJJofMlqHBLiupTinHS/3+4Qd5AXsQh PUN70c++66b1pgUmeHw89PvnoTgvc//leq5cIiPwGOFI7sIGUPL/JfQOEg5QUA4818EC 3R2M3o/6vfJRdoTgfXL+w3LSO4kHlkxWp9GcpU+6SGSAUvYoqDyd2WrsYTp2YhsqHieL XGv0n+lne0Hy1yhHzH9nI+UxERN4cGie1pGjXoDGCz7qe7R4bkVggONEMPywdu1p7jdE +s8QSZUDLA1UwjIgVyC9NbPOJEVbDGZWKhvd0eZi/7P0VAGqjbkMxrLgO7ozDYyNigWT 6XNw== 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 s17si2107640qkg.301.2020.04.10.16.32.09; Fri, 10 Apr 2020 16:32:23 -0700 (PDT) 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 S1726767AbgDJX3m (ORCPT + 99 others); Fri, 10 Apr 2020 19:29:42 -0400 Received: from mga18.intel.com ([134.134.136.126]:5049 "EHLO mga18.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726671AbgDJX3k (ORCPT ); Fri, 10 Apr 2020 19:29:40 -0400 IronPort-SDR: xkOLq+xJ7mLvY9KTICw7+3Qv9oQh+RvlZP0p/AdwrZYjDktXeLDKwhVmtpM8zeQA5bOpFy7JUE 6EwzJ1vheliQ== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Apr 2020 16:29:40 -0700 IronPort-SDR: iQFS37sNJKrcu0WptRPhy6/oieHO6wkYqGQBxnPT1MzhaOq5XXopDjvqDrAUbldx+nfL9c+FfO kmMpYFAei8MQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,368,1580803200"; d="scan'208";a="399057320" Received: from kmp-skylake-client-platform.sc.intel.com ([172.25.112.108]) by orsmga004.jf.intel.com with ESMTP; 10 Apr 2020 16:29:40 -0700 From: Kyung Min Park To: x86@kernel.org, linux-kernel@vger.kernel.org Cc: tglx@linutronix.de, mingo@redhat.com, hpa@zytor.com, gregkh@linuxfoundation.org, ak@linux.intel.com, tony.luck@intel.com, ashok.raj@intel.com, ravi.v.shankar@intel.com, fenghua.yu@intel.com, kyung.min.park@intel.com Subject: [PATCH v3 2/3] x86/delay: Refactor delay_mwaitx() for TPAUSE support Date: Fri, 10 Apr 2020 16:29:54 -0700 Message-Id: <1586561395-50914-3-git-send-email-kyung.min.park@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1586561395-50914-1-git-send-email-kyung.min.park@intel.com> References: <1586561395-50914-1-git-send-email-kyung.min.park@intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Refactor code to make it easier to add a new model specific function to delay for a number of cycles. No functional change. Reviewed-by: Tony Luck Co-developed-by: Fenghua Yu Signed-off-by: Fenghua Yu Signed-off-by: Kyung Min Park --- arch/x86/lib/delay.c | 48 ++++++++++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/arch/x86/lib/delay.c b/arch/x86/lib/delay.c index 887d52d..fe91dc1 100644 --- a/arch/x86/lib/delay.c +++ b/arch/x86/lib/delay.c @@ -34,6 +34,7 @@ static void delay_loop(u64 __loops); * during boot. */ static void (*delay_fn)(u64) __ro_after_init = delay_loop; +static void (*delay_halt_fn)(u64 start, u64 cycles) __ro_after_init; /* simple loop based delay: */ static void delay_loop(u64 __loops) @@ -100,9 +101,33 @@ static void delay_tsc(u64 cycles) * counts with TSC frequency. The input value is the number of TSC cycles * to wait. MWAITX will also exit when the timer expires. */ -static void delay_mwaitx(u64 cycles) +static void delay_halt_mwaitx(u64 unused, u64 cycles) { - u64 start, end, delay; + u64 delay; + + delay = min_t(u64, MWAITX_MAX_WAIT_CYCLES, cycles); + /* + * Use cpu_tss_rw as a cacheline-aligned, seldomly accessed per-cpu + * variable as the monitor target. + */ + __monitorx(raw_cpu_ptr(&cpu_tss_rw), 0, 0); + + /* + * AMD, like Intel, supports the EAX hint and EAX=0xf means, do not + * enter any deep C-state and we use it here in delay() to minimize + * wakeup latency. + */ + __mwaitx(MWAITX_DISABLE_CSTATES, delay, MWAITX_ECX_TIMER_ENABLE); +} + +/* + * Call a vendor specific function to delay for a given amount of time. Because + * these functions may return earlier than requested, check for actual elapsed + * time and call again until done. + */ +static void delay_halt(u64 __cycles) +{ + u64 start, end, cycles = __cycles; /* * Timer value of 0 causes MWAITX to wait indefinitely, unless there @@ -114,21 +139,7 @@ static void delay_mwaitx(u64 cycles) start = rdtsc_ordered(); for (;;) { - delay = min_t(u64, MWAITX_MAX_WAIT_CYCLES, cycles); - - /* - * Use cpu_tss_rw as a cacheline-aligned, seldomly - * accessed per-cpu variable as the monitor target. - */ - __monitorx(raw_cpu_ptr(&cpu_tss_rw), 0, 0); - - /* - * AMD, like Intel's MWAIT version, supports the EAX hint and - * EAX=0xf0 means, do not enter any deep C-state and we use it - * here in delay() to minimize wakeup latency. - */ - __mwaitx(MWAITX_DISABLE_CSTATES, delay, MWAITX_ECX_TIMER_ENABLE); - + delay_halt_fn(start, cycles); end = rdtsc_ordered(); if (cycles <= end - start) @@ -147,7 +158,8 @@ void __init use_tsc_delay(void) void use_mwaitx_delay(void) { - delay_fn = delay_mwaitx; + delay_halt_fn = delay_halt_mwaitx; + delay_fn = delay_halt; } int read_current_timer(unsigned long *timer_val) -- 2.7.4