Message ID | 20230410081438.1750-6-xin3.li@intel.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp1757097vqo; Mon, 10 Apr 2023 01:42:00 -0700 (PDT) X-Google-Smtp-Source: AKy350b7c6LgRJPAQKoPJ7XmXbmwvNrkK/LXiQuPjIrDLNaZX4xgIFfAEg8GVC3CScSR+jqVJFMp X-Received: by 2002:a17:902:e892:b0:199:4be8:be48 with SMTP id w18-20020a170902e89200b001994be8be48mr11420392plg.19.1681116120350; Mon, 10 Apr 2023 01:42:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1681116120; cv=none; d=google.com; s=arc-20160816; b=Pj641efvS6DSlzXwRji1/QI97FP7deBlsyURDyRkg0r0y62p8CqYwIo+p1JeEcCmEZ GxrBUj745zq00+AlZiS+VyNs7TtMQRa7xRNIUdRYQQWTsHhri4AXNlREqGh5AfJFZVWG XI/cP68ZV6RyxGqE/4sD7dFCj47Z8iJ9tG5jIqMyL/z+dPHYIHz3T6bIFAhshOw45E+U NzUP1beb/kOMORJFas5t5RyhIUzK6+J0K+/o4elnWhDpb05KI+h1+QIgF/y6NKzUE2Tr vode6Mg1b44Pz7FdLtqXk1jA+pX0Q+MQOEX00lmqC/+9gzjjT2xjmRLBqlXtN8tANj6+ L/xA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=+bKyrAJ4Sg6BfMRQkBUGYsVA8R9oXuG/B40jl5jzfJ0=; b=nRJSyARg+NWtGshdcAaxKh9I4GaOXp6RxmbYmla2OKGhkO0hdpJMMosZsH6rfUgNQU PCoEOFFoVM2RYAQ60ZLmu8p7kI67nIbDgPily4jWg9UFiXWYX46MT/BIhrmLwL8H1Unh YD5E3ipCCdXiEQkdphhpqml7YkPJd+RQyHdbitxbgmNXh/ox+cGz0+Tc5KdAzHP8SCxk miNBusfKNtS+U4zBMQpnlmT/8JBhnNi/bUD/Nn3O0Gg4zdSN1YaXSFeHxEzfhLPsEMye CAQXV8+K4xtSnMM+QAF3cEXfTC9kjrF/4pknHclARGYqYY7thjbjmmvf9UMw8jUwgnLZ grLg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=GLi1NB3H; 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=NONE dis=NONE) header.from=intel.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id h18-20020a170902f55200b0019ceb9491d2si11128248plf.391.2023.04.10.01.41.48; Mon, 10 Apr 2023 01:42:00 -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=@intel.com header.s=Intel header.b=GLi1NB3H; 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=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229754AbjDJIlP (ORCPT <rfc822;a1648639935@gmail.com> + 99 others); Mon, 10 Apr 2023 04:41:15 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49342 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229694AbjDJIlF (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Mon, 10 Apr 2023 04:41:05 -0400 Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8C5733AAD; Mon, 10 Apr 2023 01:41:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1681116064; x=1712652064; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=BCbf0Vj9ZyZPtbZTSgD/ohjbP2Y9NHqyEC0o1Sj/JgM=; b=GLi1NB3HM7JxG3th5VQR+LrMVv+XTvpezi97IdF+STW+5oIarJ+0Ete5 mESESepyiE9n4UpY614rl7mrAtAMyhx/X+Qi1RNMm4KKuI4vuAaZ80iCs mpXPP34sWvQSUDqE+VvVNEkg33K4ouEzUiyUeMqrSONZPr7o36mI7m74o ulqjqYIqtM5g/LEre5/cAmETYN3CSIHv4LKWj9/08iOXG21IH0tbhpRub /eqSayLY57IiSBF26+Gj5PYG33SfuQWcUT1kbmKHqS623/5mI4G4XuQra BBDjgwju1B/OY+7nyCZGp0R5mjSS7qwyYpYj3yKnkqud69XDSyLZ7AQiA w==; X-IronPort-AV: E=McAfee;i="6600,9927,10675"; a="342077913" X-IronPort-AV: E=Sophos;i="5.98,333,1673942400"; d="scan'208";a="342077913" Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Apr 2023 01:41:02 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10675"; a="799436254" X-IronPort-AV: E=Sophos;i="5.98,333,1673942400"; d="scan'208";a="799436254" Received: from unknown (HELO fred..) ([172.25.112.68]) by fmsmga002.fm.intel.com with ESMTP; 10 Apr 2023 01:41:02 -0700 From: Xin Li <xin3.li@intel.com> To: linux-kernel@vger.kernel.org, x86@kernel.org, kvm@vger.kernel.org Cc: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, hpa@zytor.com, peterz@infradead.org, andrew.cooper3@citrix.com, seanjc@google.com, pbonzini@redhat.com, ravi.v.shankar@intel.com, jiangshanlai@gmail.com, shan.kang@intel.com Subject: [PATCH v8 05/33] x86/traps: add external_interrupt() to dispatch external interrupts Date: Mon, 10 Apr 2023 01:14:10 -0700 Message-Id: <20230410081438.1750-6-xin3.li@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230410081438.1750-1-xin3.li@intel.com> References: <20230410081438.1750-1-xin3.li@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.5 required=5.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,SPF_HELO_NONE, SPF_NONE autolearn=unavailable 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: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1762778017070468635?= X-GMAIL-MSGID: =?utf-8?q?1762778017070468635?= |
Series |
x86: enable FRED for x86-64
|
|
Commit Message
Li, Xin3
April 10, 2023, 8:14 a.m. UTC
From: "H. Peter Anvin (Intel)" <hpa@zytor.com> Add external_interrupt() to dispatch external interrupts to their handlers. If an external interrupt is a system interrupt, dipatch it through system_interrupt_handlers table, otherwise to dispatch_common_interrupt(). Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com> Co-developed-by: Xin Li <xin3.li@intel.com> Tested-by: Shan Kang <shan.kang@intel.com> Signed-off-by: Xin Li <xin3.li@intel.com> --- Changes since v5: * Initialize system_interrupt_handlers with dispatch_table_spurious_interrupt() instead of NULL to get rid of a branch (Peter Zijlstra). --- arch/x86/kernel/traps.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+)
Comments
On Mon, Apr 10 2023 at 01:14, Xin Li wrote: > Add external_interrupt() to dispatch external interrupts to their handlers. > > If an external interrupt is a system interrupt, dipatch it through > system_interrupt_handlers table, otherwise to > dispatch_common_interrupt(). This naming convention sucks. external interrupts which can be system interrupts. Come on. > +/* > + * External interrupt dispatch function. > + * > + * Until/unless dispatch_common_interrupt() can be taught to deal with the > + * special system vectors, split the dispatch. More gibberish. It's not useful to add your sloppy personal notes which are not understandable for anyone else. That comment might eventually make some sense right in the code where the condition is. > + * Note: dispatch_common_interrupt() already deals with IRQ_MOVE_CLEANUP_VECTOR. > + */ > +int external_interrupt(struct pt_regs *regs) > +{ > + unsigned int vector = regs->vector; > + unsigned int sysvec = vector - FIRST_SYSTEM_VECTOR; > + > + if (vector < FIRST_EXTERNAL_VECTOR) { unlikely(...) > + pr_err("invalid external interrupt vector %d\n", vector); > + return -EINVAL; > + } > + > + if (sysvec < NR_SYSTEM_VECTORS) > + system_interrupt_handlers[sysvec](regs); > + else > + dispatch_common_interrupt(regs, vector); How is this supposed to work once the vector space gets extended in a later version of FRED? Can we please think about this _now_ and not rewrite all of this two years down the road? Even if that's not fully specified yet, here is the obvious question: What are we going to do with the system vectors. Are they going to stay just in the middle of the expanded vector space? That would be completely non-sensical as we'd end up with yet another segmentation of the vector space. So the obvious solution is to segment the vector space in the following way: 0 - 31 Exceptions/traps - Cannot be moved 32 IRQ_MOVE_CLEANUP_VECTOR 33 - X System vectors including APIC_SPURIOUS X+1 - MAX External interrupts This spares the IRQ_MOVE_CLEANUP_VECTOR hackery. It requires to move the ISA vectors, but that's not rocket science. That makes the external interrupt vector space trivially expandable, no? Coming back to that comment: > + * Until/unless dispatch_common_interrupt() can be taught to deal with the > + * special system vectors, split the dispatch. That's simply wishful thinking. Because all what this would achieve is moving the condition and table lookup into dispatch_common_interrupt(). What's the win aside of convoluted code? There are only two options to deal with that: 1) Have the condition in external_interrupt() if (unlikely(vector < LEGACY_MAX_EXCEPTION_VECTORS)) yell_and_bail(); if (vector < FIRST_DEVICE_VECTOR) sysvec_handler[vector](regs) else fred_common_interrupt(regs, vector); 2) Make the sysvec_handler[] fred wrapper functions take the vector argument and allocate the sysvec_handler[] array dynamically sized based on the maximum number of supported vectors in a particular [FRED]APIC implementation. Not sure whether that's worth it as FRED allows up to 64k vectors if I understand the reserved space layout in the spec correctly and that would cost 512k memory just for the table. Why has all of the above not been thought through and addressed _before_ posting this pile? <Kernel development educational template #11> 1) Implementing a Prove of Concept for early validation is perfectly fine. 2) Trying to sell that PoC upstream by polishing it a bit is doomed. 3) The proper tools for upstream development are brain and taste, not duct tape and stapler. </Kernel development educational template #11> Thanks, tglx
On Mon, Jun 05 2023 at 13:56, Thomas Gleixner wrote: > On Mon, Apr 10 2023 at 01:14, Xin Li wrote: > How is this supposed to work once the vector space gets extended in a > later version of FRED? > > Can we please think about this _now_ and not rewrite all of this two > years down the road? > > Even if that's not fully specified yet, here is the obvious question: > > What are we going to do with the system vectors. Are they going to > stay just in the middle of the expanded vector space? > > That would be completely non-sensical as we'd end up with yet another > segmentation of the vector space. > > So the obvious solution is to segment the vector space in the following > way: > > 0 - 31 Exceptions/traps - Cannot be moved > 32 IRQ_MOVE_CLEANUP_VECTOR > 33 - X System vectors including APIC_SPURIOUS > X+1 - MAX External interrupts > > This spares the IRQ_MOVE_CLEANUP_VECTOR hackery. It requires to move the > ISA vectors, but that's not rocket science. Which we just discussed completely away. :) > That makes the external interrupt vector space trivially expandable, no? So there is a theoretical problem here that device interrupts could starve system vectors due to the priority scheme. Needs some thought. That whole APIC priority muck is pretty useless as long as CR8 writes are slower than sti/cli. When I tested that last (Broadwell) they were significantly slower. Also it's unclear how that expansion vector space is handled vs. priorities. Ideally event delivery would be FIFO because that's the only guarantee for preventing starvation without having to configure priorities (which is mostly a wrong guess anyway). Thanks, tglx
> > Add external_interrupt() to dispatch external interrupts to their handlers. > > > > If an external interrupt is a system interrupt, dipatch it through > > system_interrupt_handlers table, otherwise to > > dispatch_common_interrupt(). > > This naming convention sucks. external interrupts which can be system > interrupts. Come on. This name dispatch_common_interrupt() comes from arch/x86/kernel/irq.c: /* * common_interrupt() handles all normal device IRQ's (the special SMP * cross-CPU interrupts have their own entry points). */ DEFINE_IDTENTRY_IRQ(common_interrupt) Should we rename it to device_intertupt()? Thanks! Xin
On Mon, Jun 19 2023 at 19:16, Li, Xin3 wrote: >> > Add external_interrupt() to dispatch external interrupts to their handlers. >> > >> > If an external interrupt is a system interrupt, dipatch it through >> > system_interrupt_handlers table, otherwise to >> > dispatch_common_interrupt(). >> >> This naming convention sucks. external interrupts which can be system >> interrupts. Come on. > > This name dispatch_common_interrupt() comes from arch/x86/kernel/irq.c: That's not the point. Your changelog says: If an external interrupt is a system interrupt... It's either an external interrupt which goes through common_interrupt() or it is a system interrupt which goes through it's very own handler, no? Thanks, tglx
> That's not the point. Your changelog says: > > If an external interrupt is a system interrupt... > > It's either an external interrupt which goes through common_interrupt() > or it is a system interrupt which goes through it's very own handler, > no? Ah, then it looks more of a problem in the way how I described it. What I wanted to describe is the dispatch logic _inside_ the new function external_interrupt(), what about: external_interrupt() dispatches all external interrupts: it checks if an external interrupt is a system interrupt, if yes it dipatches it through the system_interrupt_handlers table, otherwise to dispatch_common_interrupt(). Thanks! Xin
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index 12072e2af4a6..f86cd233b00b 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c @@ -1511,6 +1511,32 @@ static system_interrupt_handler system_interrupt_handlers[NR_SYSTEM_VECTORS] = { #undef SYSV +/* + * External interrupt dispatch function. + * + * Until/unless dispatch_common_interrupt() can be taught to deal with the + * special system vectors, split the dispatch. + * + * Note: dispatch_common_interrupt() already deals with IRQ_MOVE_CLEANUP_VECTOR. + */ +int external_interrupt(struct pt_regs *regs) +{ + unsigned int vector = regs->vector; + unsigned int sysvec = vector - FIRST_SYSTEM_VECTOR; + + if (vector < FIRST_EXTERNAL_VECTOR) { + pr_err("invalid external interrupt vector %d\n", vector); + return -EINVAL; + } + + if (sysvec < NR_SYSTEM_VECTORS) + system_interrupt_handlers[sysvec](regs); + else + dispatch_common_interrupt(regs, vector); + + return 0; +} + #endif /* CONFIG_X86_64 */ void __init install_system_interrupt_handler(unsigned int n, const void *asm_addr, const void *addr)