From patchwork Thu Jun 27 20:44:42 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pawan Gupta X-Patchwork-Id: 13715021 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.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 4FD2C1A0729; Thu, 27 Jun 2024 20:44:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.17 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719521085; cv=none; b=OnwGiC9SnpUdHwsT0eN0RwZNwrSaO8W4/RcZsLNZLbCY1qkVKcTXeFFIz5i7c7+s7dqig69je7sKLBw1J7nwAe+6vfxwcnxoXjewnMFHUB/DclBOo0hKvusjBUoOYa2TZ6tt57E+36IGRCVzKeGYn7KFxXGLlnEKXk0FszHm1nk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719521085; c=relaxed/simple; bh=OEfQqdYgE2tBKPCJz5LhDneI5bGCQKBVyCZ/vbzQ2HI=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=VabCmDDkfWDM4bAbeut4DJhoTIU05gCU8cPJXjwcE/YV26DgSRsGseC9H5e/npx9+N+qNMZ3KS2p3HuG+OFSU9wlfkaKoFYRWZ0Mz+U0ZuMebJOm3XemnfYXkAU8C9EwNsOOvYHfcLowNVh+JBnH/PmXFQtLjwhu4btkwbDRPRA= 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=a5R7rCs3; arc=none smtp.client-ip=192.198.163.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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="a5R7rCs3" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1719521084; x=1751057084; h=date:from:to:cc:subject:message-id:references: mime-version:in-reply-to; bh=OEfQqdYgE2tBKPCJz5LhDneI5bGCQKBVyCZ/vbzQ2HI=; b=a5R7rCs3hk0hY/96kuvT2Mhibo4GUYCGBOb82r0rFJyJA60cPI/HI7JI ZAJvyxQYLfFNeNct3PWN1zPPjY9ai99t987r6vbloAP3v2gcWclXXPbUg X8Y7MEALFJMYkkkW/CkBNdT6HIyPK2ao8vMqZ/QwFyXyzCXhvWowTSsLR Cqq+GS1hv73eoNPyQThPc4bBoIcL67GtL+6u7xY2gfZokKUaJdxSStIbu BK5JhqJql2j7r47Zs3pyLLIuPq8Oq9keFK5gOtbybwQsDNewF8crE8X1t W0eLXoIIDqDbh7eyRkdiFKwF3XVSk2S/LdjFp3WNgrZvhU4lWcgTFbb7s g==; X-CSE-ConnectionGUID: 1hd+rOotR3KMh9GTSPB0qQ== X-CSE-MsgGUID: cng/CrTvTlyg+mb74/JiZw== X-IronPort-AV: E=McAfee;i="6700,10204,11116"; a="16563610" X-IronPort-AV: E=Sophos;i="6.09,167,1716274800"; d="scan'208";a="16563610" Received: from fmviesa002.fm.intel.com ([10.60.135.142]) by fmvoesa111.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jun 2024 13:44:44 -0700 X-CSE-ConnectionGUID: OAi7GxMSS8+IqGidXt9Jpw== X-CSE-MsgGUID: gOQGXh4ySCuRwLVThLfr/A== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.09,167,1716274800"; d="scan'208";a="67703792" Received: from gbpfeiff-mobl.amr.corp.intel.com (HELO desk) ([10.255.229.132]) by fmviesa002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jun 2024 13:44:43 -0700 Date: Thu, 27 Jun 2024 13:44:42 -0700 From: Pawan Gupta To: Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org Cc: daniel.sneddon@linux.intel.com, tony.luck@intel.com, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, linux-perf-users@vger.kernel.org, Josh Poimboeuf , Srinivas Pandruvada , "Rafael J. Wysocki" , Ricardo Neri , "Liang, Kan" , Andrew Cooper , Brice Goglin , Mario Limonciello , Perry Yuan , Dapeng Mi Subject: [PATCH PATCH v2 7/9] x86/cpu: Update x86_match_cpu() to also use cpu-type Message-ID: <20240627-add-cpu-type-v2-7-f927bde83ad0@linux.intel.com> X-Mailer: b4 0.12.3 References: <20240627-add-cpu-type-v2-0-f927bde83ad0@linux.intel.com> Precedence: bulk X-Mailing-List: linux-pm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20240627-add-cpu-type-v2-0-f927bde83ad0@linux.intel.com> Non-hybrid CPU variants that share the same Family/Model could be differentiated by their cpu-type. x86_match_cpu() currently does not use cpu-type for CPU matching. Dave Hansen suggested to use below conditions to match CPU-type: 1. If CPU_TYPE_ANY (the wildcard), then matched 2. If hybrid, then matched 3. If !hybrid, look at the boot CPU and compare the cpu-type to determine if it is a match. This special case for hybrid systems allows more compact vulnerability list. Imagine that "Haswell" CPUs might or might not be hybrid and that only Atom cores are vulnerable to Meltdown. That means there are three possibilities: 1. P-core only 2. Atom only 3. Atom + P-core (aka. hybrid) One might be tempted to code up the vulnerability list like this: MATCH( HASWELL, X86_FEATURE_HYBRID, MELTDOWN) MATCH_TYPE(HASWELL, ATOM, MELTDOWN) Logically, this matches #2 and #3. But that's a little silly. You would only ask for the "ATOM" match in cases where there *WERE* hybrid cores in play. You shouldn't have to _also_ ask for hybrid cores explicitly. In short, assume that processors that enumerate Hybrid==1 have a vulnerable core type. Update x86_match_cpu() to also match cpu-type. Also treat hybrid systems as special, and match them to any cpu-type. Suggested-by: Dave Hansen Signed-off-by: Pawan Gupta --- arch/x86/kernel/cpu/match.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/arch/x86/kernel/cpu/match.c b/arch/x86/kernel/cpu/match.c index 8e7de733320a..85ef17325c06 100644 --- a/arch/x86/kernel/cpu/match.c +++ b/arch/x86/kernel/cpu/match.c @@ -5,6 +5,26 @@ #include #include +/** + * x86_match_hw_cpu_type - helper function to match the hardware defined + * cpu-type for a single entry in the x86_cpu_id table. + * @c: Pointer to the cpuinfo_x86 structure of the CPU to match. + * @m: Pointer to the x86_cpu_id entry to match against. + * + * Return: true if the cpu-type matches, false otherwise. + */ +static bool x86_match_hw_cpu_type(struct cpuinfo_x86 *c, const struct x86_cpu_id *m) +{ + if (m->cpu_type == X86_CPU_TYPE_ANY) + return true; + + /* Hybrid CPUs are special, they are assumed to match all cpu-types */ + if (boot_cpu_has(X86_FEATURE_HYBRID_CPU)) + return true; + + return c->topo.hw_cpu_type == m->cpu_type; +} + /** * x86_match_cpu - match current CPU again an array of x86_cpu_ids * @match: Pointer to array of x86_cpu_ids. Last entry terminated with @@ -50,6 +70,8 @@ const struct x86_cpu_id *x86_match_cpu(const struct x86_cpu_id *match) continue; if (m->feature != X86_FEATURE_ANY && !cpu_has(c, m->feature)) continue; + if (!x86_match_hw_cpu_type(c, m)) + continue; return m; } return NULL;