From patchwork Mon Jul 24 13:34:39 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Gleixner X-Patchwork-Id: 124995 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:9010:0:b0:3e4:2afc:c1 with SMTP id l16csp1813730vqg; Mon, 24 Jul 2023 06:52:13 -0700 (PDT) X-Google-Smtp-Source: APBJJlFAgJc505KNvEqBG1WI9ZC+XzOZb7AE1ojA2A/7NP2+HB43/mP5C6jTFzJbKg4LsmPk7pXQ X-Received: by 2002:a17:906:cc:b0:992:9005:5ed5 with SMTP id 12-20020a17090600cc00b0099290055ed5mr9635863eji.32.1690206733674; Mon, 24 Jul 2023 06:52:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1690206733; cv=none; d=google.com; s=arc-20160816; b=C4g/Y9WH1QUKkj8XHsabCpsIKZPMcUcaq5V+FvkQjztB4Iy9QGWuW43gJ44Xu+Oyb8 TnFfzDhx7nXLSRGraQ/NDfawZkirghL/u7cRnPgjen6hfLhrUm5gkb4n/K3PRWkSHJ1J 37lAkyekclsGy/xGyiBS+8Cigh/kIBIKWIBsNor6FPJScQy7shlaYaBpxPO7ofPT1VMl i6xVJhuUlVc6+bYowTk6+L1d3Wg6RRfNV8XxZgbDLM+rOhVzOhwxomtH6rhxQYaIZZ6J WEvdZ3Hg2WGJxUBkvMOASl80Bdf0gfXGjBX9Ihj1s/jFk2OIq1Q1xlZnCiCQJms8j+rB c8Ww== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:date:mime-version:references:subject:cc:to:from :dkim-signature:dkim-signature:message-id; bh=gTGbbDL5HBuwEB2u+LxYM2ki0P05Jj6Bwt/DqClxZRM=; fh=mE3iieUIZLcDfOLIULj9X6/p0bMDPZGFSVRsnyRUnTc=; b=iysi/y1EwcQ1vT3LfMbR9a6KyZ6i2ugPE8xitEaBeaiyuJr90ec1y232eYYT1VHVfq Ej60OwDHWXAc5hSM1vam3tOyLn+oTJ/E4FxaE5vbPNI87xv4dhB+saAOZW9ICcyTtJWO ByMbdV2Ac9Ji31nz2wVjmVVp5FIIxs8EsxDWtkRYbCQuPCfzK21dULSSOMHDHzc7crJ/ +37zz+M+Zy1ul+Uc5DPn00oiEp51XqH9aruTcQPlXHgw0mpk2aTlBkFxxZW6BmtG68tN 6DYgD8X24hSTVqHQOvbTtfHowqSVVIs9uxd2FUgj8i62bUxLhOjwFkIh+dItuR7Nbfxy 5xKg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=ME3iUUqO; dkim=neutral (no key) header.i=@linutronix.de; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id c11-20020a170906154b00b0098dea0a1eb4si5808260ejd.700.2023.07.24.06.51.49; Mon, 24 Jul 2023 06:52:13 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=ME3iUUqO; dkim=neutral (no key) header.i=@linutronix.de; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231727AbjGXNhT (ORCPT + 99 others); Mon, 24 Jul 2023 09:37:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37366 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230214AbjGXNgf (ORCPT ); Mon, 24 Jul 2023 09:36:35 -0400 Received: from galois.linutronix.de (Galois.linutronix.de [IPv6:2a0a:51c0:0:12e:550::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 36318E4F for ; Mon, 24 Jul 2023 06:35:39 -0700 (PDT) Message-ID: <20230724132046.507775279@linutronix.de> DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1690205680; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: references:references; bh=gTGbbDL5HBuwEB2u+LxYM2ki0P05Jj6Bwt/DqClxZRM=; b=ME3iUUqOwvRAPOdEBpEKJ88hcN/yxKmM/gI2Rj0npJLQuFr9oBqpUhbXzTR7BZKc8E04HS zqWbgxcoYqD1QyJUqYySobCup0Q8QZOXEVHpknlETiqs/TccgAQLRyqOSQI6tJdHmQSDt1 YzL4/3S9uytCLDFkn+6OCGHeuS1F+/X7k7XAieBtoJFvYiNyhJpD6y/bXD9Guod2CCEJ4i WeKOd9OIUb1IdlLRmlIFi94HlIXuTnia+boF8nVNvGIHIz6Ds+sCotJuhmXDYtcpJfFDQ9 ka24KbfEcFgzEVeFzRhaSCwTNsF9ztjL7wpXJ0XXzjNSl/GPnMLEQ0dwGx5GYw== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1690205680; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: references:references; bh=gTGbbDL5HBuwEB2u+LxYM2ki0P05Jj6Bwt/DqClxZRM=; b=qHP0QiyZiejLd2dp5RSbp+pLHTW+/3oDCD+K64/p+jwChMIaAjg2f8FLboYAtPBgQUjuAV QixjDK6VIZ9cK1BQ== From: Thomas Gleixner To: LKML Cc: x86@kernel.org, Andrew Cooper , Tom Lendacky , Paolo Bonzini , Wei Liu , Arjan van de Ven , Juergen Gross , Michael Kelley , Peter Keresztes Schmidt , "Peter Zijlstra (Intel)" Subject: [patch V2 32/58] x86/apic/ipi: Tidy up the code and fixup comments References: <20230724131206.500814398@linutronix.de> MIME-Version: 1.0 Date: Mon, 24 Jul 2023 15:34:39 +0200 (CEST) X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1772310215727967878 X-GMAIL-MSGID: 1772310215727967878 Replace the undecodable comment on top of the function, replace the space consuming zero content comments with useful ones and tidy up the implementation to prevent further eye bleed. Make __default_send_IPI_shortcut() static as it has no other users. Signed-off-by: Thomas Gleixner Acked-by: Peter Zijlstra (Intel) --- arch/x86/kernel/apic/ipi.c | 74 ++++++++++++++++++------------------------- arch/x86/kernel/apic/local.h | 2 - 2 files changed, 32 insertions(+), 44 deletions(-) --- a/arch/x86/kernel/apic/ipi.c +++ b/arch/x86/kernel/apic/ipi.c @@ -108,68 +108,58 @@ static inline void __xapic_wait_icr_idle cpu_relax(); } -void __default_send_IPI_shortcut(unsigned int shortcut, int vector) +/* + * This is safe against interruption because it only writes the lower 32 + * bits of the APIC_ICR register. The destination field is ignored for + * short hand IPIs. + * + * wait_icr_idle() + * write(ICR2, dest) + * NMI + * wait_icr_idle() + * write(ICR) + * wait_icr_idle() + * write(ICR) + * + * This function does not need to disable interrupts as there is no ICR2 + * interaction. The memory write is direct except when the machine is + * affected by the 11AP Pentium erratum, which turns the plain write into + * an XCHG operation. + */ +static void __default_send_IPI_shortcut(unsigned int shortcut, int vector) { /* - * Subtle. In the case of the 'never do double writes' workaround - * we have to lock out interrupts to be safe. As we don't care - * of the value read we use an atomic rmw access to avoid costly - * cli/sti. Otherwise we use an even cheaper single atomic write - * to the APIC. - */ - unsigned int cfg; - - /* - * Wait for idle. + * Wait for the previous ICR command to complete. Use + * safe_apic_wait_icr_idle() for the NMI vector as there have been + * issues where otherwise the system hangs when the panic CPU tries + * to stop the others before launching the kdump kernel. */ if (unlikely(vector == NMI_VECTOR)) safe_apic_wait_icr_idle(); else __xapic_wait_icr_idle(); - /* - * No need to touch the target chip field. Also the destination - * mode is ignored when a shorthand is used. - */ - cfg = __prepare_ICR(shortcut, vector, 0); - - /* - * Send the IPI. The write to APIC_ICR fires this off. - */ - native_apic_mem_write(APIC_ICR, cfg); + /* Destination field (ICR2) and the destination mode are ignored */ + native_apic_mem_write(APIC_ICR, __prepare_ICR(shortcut, vector, 0)); } /* * This is used to send an IPI with no shorthand notation (the destination is * specified in bits 56 to 63 of the ICR). */ -void __default_send_IPI_dest_field(unsigned int mask, int vector, unsigned int dest) +void __default_send_IPI_dest_field(unsigned int dest_mask, int vector, + unsigned int dest_mode) { - unsigned long cfg; - - /* - * Wait for idle. - */ + /* See comment in __default_send_IPI_shortcut() */ if (unlikely(vector == NMI_VECTOR)) safe_apic_wait_icr_idle(); else __xapic_wait_icr_idle(); - /* - * prepare target chip field - */ - cfg = __prepare_ICR2(mask); - native_apic_mem_write(APIC_ICR2, cfg); - - /* - * program the ICR - */ - cfg = __prepare_ICR(0, vector, dest); - - /* - * Send the IPI. The write to APIC_ICR fires this off. - */ - native_apic_mem_write(APIC_ICR, cfg); + /* Set the IPI destination field in the ICR */ + native_apic_mem_write(APIC_ICR2, __prepare_ICR2(dest_mask)); + /* Send it with the proper destination mode */ + native_apic_mem_write(APIC_ICR, __prepare_ICR(0, vector, dest_mode)); } void default_send_IPI_single_phys(int cpu, int vector) --- a/arch/x86/kernel/apic/local.h +++ b/arch/x86/kernel/apic/local.h @@ -44,8 +44,6 @@ static inline unsigned int __prepare_ICR void default_init_apic_ldr(void); -void __default_send_IPI_shortcut(unsigned int shortcut, int vector); - /* * This is used to send an IPI with no shorthand notation (the destination is * specified in bits 56 to 63 of the ICR).