Received: by 2002:a05:6500:1b8f:b0:1fa:5c73:8e2d with SMTP id df15csp881697lqb; Wed, 29 May 2024 13:29:22 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCWh9BCOlve2R8pQHfmERyVvHG+AKyfckbKp13N2ZFd7Hmc8OP9O3oQiJdLEriTxp8KtdzfboGXFo1PwwSkRxcm7FnzAQYb2MGqnxPlG5A== X-Google-Smtp-Source: AGHT+IFRTyZaZRmPk69X5f+vw3pAFTgBTXHhd9miPhl68RWcO9U6ZkTsDr9GGDLEFlfZzPpR9r4E X-Received: by 2002:a17:906:d195:b0:a5a:84f9:df73 with SMTP id a640c23a62f3a-a65e8f762b4mr15745166b.38.1717014562336; Wed, 29 May 2024 13:29:22 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1717014562; cv=pass; d=google.com; s=arc-20160816; b=esokJB0/9jjHZVhJA5fBQUrH4knCbzGe7TvqbzcwA2YB4uxWTh2F6foeempouo86QN FRvv6mYXgAx5E5U06M+zblNNu0oDHsGtQvlkIjC7zD65bD24ln84m7Kn/YWCC42WaZ5X 2aLSwQpVIhsL/HXNBIXS5BXyo8sA0f60XEe+YUomLQx5RMKamacZIAFXhT1keC47wYPL f96XCxIUGt6HJnvRqexLyfcoUKoJQT7b33htGxAuU7aeNHhSVks3ec2F4VuJR2A1mqVl nb337p5ZGOL5g/6ZDsLzJ4eyQytTqkGVXycZKAdReBuY2U6ALJ8ufWeg9X2NvPs9w6VD 0T/w== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=zTluOcOx/U5uvY+hBNME4YU/jcLwc1gw0qDwDHFGqcw=; fh=fZepo/0slYBt9k/m8d9e8DJ82HBaU39Epa4sDwEDWNU=; b=u1OVrYUR3G9FApq/E9ldHu52Y9jZDYlU51K+iLFhsyUKlbpd/ckp17b+Q05uTpwHjF ZmCBGts97LAGIL4wdj/D8UavgbtumwxWP7iglo9RIUK/4wQ8aIn+wabKvXy8p1q4imdn CoHHO6q653sslWC6mC0WGmIIrqYbcQAOc3X+o9MHGmXyNcXdWdhVBJ+QqUyVCPJ0zWlf 5WbFTuBUIdDNGl5Vhqi9NPAkZdDg3YKtjLODhfbeouL6Cs/lMn7WJLYOAtcJguzsQjOE LS2S6saSxSuC91hEaJAsRUhjphjPsA8FwOZ0r9iiM1mxrN9lJcIJzXDQyjGiQNTTKIQP wnxA==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=ZqDmzgsG; arc=pass (i=1 dkim=pass dkdomain=intel.com dmarc=pass fromdomain=linux.intel.com); spf=pass (google.com: domain of linux-kernel+bounces-194657-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-194657-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [147.75.80.249]) by mx.google.com with ESMTPS id a640c23a62f3a-a6287bce393si637916766b.886.2024.05.29.13.29.22 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 May 2024 13:29:22 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-194657-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) client-ip=147.75.80.249; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=ZqDmzgsG; arc=pass (i=1 dkim=pass dkdomain=intel.com dmarc=pass fromdomain=linux.intel.com); spf=pass (google.com: domain of linux-kernel+bounces-194657-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-194657-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by am.mirrors.kernel.org (Postfix) with ESMTPS id 0AA5E1F23B4A for ; Wed, 29 May 2024 20:29:22 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id A05F21C9ED6; Wed, 29 May 2024 20:28:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="ZqDmzgsG" Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5A7031C8FBC; Wed, 29 May 2024 20:28:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.17 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717014518; cv=none; b=KhsfS7BPfisu6jaKWdpWt2aYsvSzA+lkwEbpcM+A9ydTRZJBE/dUmuycTJtPpXIfs1bJZtgzibHWSsZaPOSuhbXlDomjVyNcRbccdgjCxaVfecfMtf98RuJhyiO6KvFqC2VCPH/BQNyOPWVLdC2MmTEA4e43rtbO3v4rtSJgsPQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717014518; c=relaxed/simple; bh=TSM1haBCr0WSs8yC/z+/tCZvjsQB/xQTffI8AknEb/o=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=D+wX5Y15TwI3kvejGZWNNxojJYwG+RT0S4rCo+WkP/XzR+IF6lMwjyUPALhq/zSWzX6Fr/egL1kLwzz6XlKYR68EZlTpzkWjF3Wbf3Mjd0Kdzwl1fOS4n44FDhq9Z9waiNw9MpjwnsBB3ugBFZqfNVIJ1BFGexA6cjBeHmluPao= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=none smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=ZqDmzgsG; arc=none smtp.client-ip=198.175.65.17 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1717014517; x=1748550517; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=TSM1haBCr0WSs8yC/z+/tCZvjsQB/xQTffI8AknEb/o=; b=ZqDmzgsG3tUOTiyRHIP6Ce/dla8LiEKyRSrGUVrSmGjkg27v7o0uSSkd kJc3B8wlMQu/+qnKyiRdWJ/s5Lz/gwVGQkFC6LraC1B5pZiYeFFaPri7u BYzARMq0Z+vSo1k2xQUsuamFSgJ7Ay/tquk3xwQIr0JIUVs0VdAUrFRDa YO1YoKQDo80xRqI4uEX+Z6IbQrWpYeqfOLGz1YReyDGily0eYQL97j4Lt 3Mm+8oN+Pc24rTzsTjmuwCxzG0HNFApHAONVlE5nUqfCwKiVkotQOpUlX Q/ptYo5pnMqb+sc63FcXS25lpdTq57T8fNjy6nFmmng9WslTdD+zgFBaA Q==; X-CSE-ConnectionGUID: 5sktuyZMQ6meP3vn84A3Cg== X-CSE-MsgGUID: KJQ1xXqqSzadOichZXvkIQ== X-IronPort-AV: E=McAfee;i="6600,9927,11087"; a="13574554" X-IronPort-AV: E=Sophos;i="6.08,199,1712646000"; d="scan'208";a="13574554" Received: from fmviesa007.fm.intel.com ([10.60.135.147]) by orvoesa109.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 May 2024 13:28:35 -0700 X-CSE-ConnectionGUID: OsUWBup4TiazNZmPXxdMvw== X-CSE-MsgGUID: XkoolWFiR/q4uGx6lFpkYA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.08,199,1712646000"; d="scan'208";a="35491284" Received: from jacob-builder.jf.intel.com ([10.54.39.125]) by fmviesa007.fm.intel.com with ESMTP; 29 May 2024 13:28:34 -0700 From: Jacob Pan To: X86 Kernel , LKML , Thomas Gleixner , Dave Hansen , "H. Peter Anvin" , "Ingo Molnar" , "Borislav Petkov" , linux-perf-users@vger.kernel.org, Peter Zijlstra Cc: Andi Kleen , "Xin Li" , Jacob Pan Subject: [PATCH 4/6] x86/irq: Process nmi sources in NMI handler Date: Wed, 29 May 2024 13:33:23 -0700 Message-Id: <20240529203325.3039243-5-jacob.jun.pan@linux.intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240529203325.3039243-1-jacob.jun.pan@linux.intel.com> References: <20240529203325.3039243-1-jacob.jun.pan@linux.intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit With NMI source reporting enabled, NMI handler can prioritize the handling of sources reported explicitly. If the source is unknown, then resume the existing processing flow. i.e. invoke all NMI handlers. Signed-off-by: Jacob Pan --- arch/x86/kernel/nmi.c | 48 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/arch/x86/kernel/nmi.c b/arch/x86/kernel/nmi.c index e2122ec9313c..32c285722734 100644 --- a/arch/x86/kernel/nmi.c +++ b/arch/x86/kernel/nmi.c @@ -149,12 +149,60 @@ static inline int do_handle_nmi(struct nmiaction *a, struct pt_regs *regs, unsig return thishandled; } +static inline int nmi_handle_src(unsigned int type, struct pt_regs *regs) +{ + unsigned long source_bitmask; + struct nmiaction *a; + int handled = 0; + int vec = 1; + + if (!cpu_feature_enabled(X86_FEATURE_NMI_SOURCE) || type != NMI_LOCAL) + return 0; + + source_bitmask = fred_event_data(regs); + if (!source_bitmask) { + pr_warn_ratelimited("NMI received without source information!\n"); + return 0; + } + + /* + * Per NMI source specification, there is no guarantee that a valid + * NMI vector is always delivered, even when the source specified + * one. It is software's responsibility to check all available NMI + * sources when bit 0 is set in the NMI source bitmap. i.e. we have + * to call every handler as if we have no NMI source. + * On the other hand, if we do get non-zero vectors, we know exactly + * what the sources are. So we only call the handlers with the bit set. + */ + if (source_bitmask & BIT(NMI_SOURCE_VEC_UNKNOWN)) { + pr_warn_ratelimited("NMI received with unknown source\n"); + return 0; + } + + rcu_read_lock(); + /* Bit 0 is for unknown NMI sources, skip it. */ + for_each_set_bit_from(vec, &source_bitmask, NR_NMI_SOURCE_VECTORS) { + a = rcu_dereference(nmiaction_src_table[vec]); + if (!a) { + pr_warn_ratelimited("NMI received %d no handler", vec); + continue; + } + handled += do_handle_nmi(a, regs, type); + } + rcu_read_unlock(); + return handled; +} + static int nmi_handle(unsigned int type, struct pt_regs *regs) { struct nmi_desc *desc = nmi_to_desc(type); struct nmiaction *a; int handled=0; + handled = nmi_handle_src(type, regs); + if (handled) + return handled; + rcu_read_lock(); /* -- 2.25.1