From nobody Thu Nov 20 14:03:20 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass header.i=@intel.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1763621446; cv=none; d=zohomail.com; s=zohoarc; b=E1wueKp1OqQqcQr6OpVnwPy2+ef5IUQ6no7c4iiOMKov92aPT/oWSNdE8Im2hGFN1xCgiP6Ln6i7/O5lGraFWk/LBssFGMg6uHNYyMBvmvaxurwt4AEC9/775XZu8Y6zx9Sx1hNPoavNpDl4pzgGa6SNC83+A27oFAj24X4aLOo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1763621446; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=BrIr0qy2c6tpXcdp4tfjmh6iRyRjh1u3af1eefcvl+k=; b=GcdkKAHat/AJ2Y7S95xHU3g4yqyvIdi+k3WkVGX9KlNsNU0cPv4MIwAMxo9vv1O8fcTPzYBiusygRF1mcvrv7OmV4Qb8zhWfL9h94Tb+N6gUoB+pkcArnKIwRh5qWtuKHrqMH4DJ74vjh+M6toPYqXd35qHqdePLnd0P5chCFy0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=@intel.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1763621446363474.7933313116099; Wed, 19 Nov 2025 22:50:46 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vLyTA-0005Cn-EU; Thu, 20 Nov 2025 01:48:40 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vLyT6-000579-Ab for qemu-devel@nongnu.org; Thu, 20 Nov 2025 01:48:36 -0500 Received: from mgamail.intel.com ([192.198.163.17]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vLyT3-0005ql-Cx for qemu-devel@nongnu.org; Thu, 20 Nov 2025 01:48:34 -0500 Received: from orviesa007.jf.intel.com ([10.64.159.147]) by fmvoesa111.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Nov 2025 22:48:28 -0800 Received: from liuzhao-optiplex-7080.sh.intel.com ([10.239.160.39]) by orviesa007.jf.intel.com with ESMTP; 19 Nov 2025 22:48:27 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1763621313; x=1795157313; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=3EMUWkHSCA/tfmKappgbzqr0Ir4rokgyHvMpaedvWFs=; b=JrTI++X8HFePnrzUaoVk7MpwXuamt7/5fELTAe8vHLvEBwMuOzuh+J2K 7L5LDObS7fe7JmlAhJe7gqdVh+XnA72KVSrEFOxxl9d9wmuH7frtmh5pR 2DpdbvmbYgfBIQsZ9MM959QChwAbHKjw3kWKhTZmFnYGaiyL4oc009M8L xKvV48ZV8OG6LPFEiLZe1H2lnNH864vQgyJyIwBZmDY2QaaUua4utbUcB IapwVoBrugyXqDpnOkHQzRSEiDik0zBVg9yPwqtdf9SbbldPKX6Eoevoy UEtxpSnQAiBJneJHUMgLIJTN7nc12d30KGgSR7J6vQGWc95SifWXLX8KT A==; X-CSE-ConnectionGUID: ApjU5gZ9TyG8kv+r9c3VfQ== X-CSE-MsgGUID: 0qJsNSkzQduEcH3rwDux0w== X-IronPort-AV: E=McAfee;i="6800,10657,11618"; a="65572553" X-IronPort-AV: E=Sophos;i="6.19,317,1754982000"; d="scan'208";a="65572553" X-CSE-ConnectionGUID: Q59W+5vXQommWYSKxiUHnQ== X-CSE-MsgGUID: ToipA4PaTV2jIbPGbBDDjg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.19,317,1754982000"; d="scan'208";a="191296126" From: Zhao Liu To: Paolo Bonzini , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= Cc: qemu-devel@nongnu.org, Xudong Hao , Zhao Liu Subject: [PATCH 06/10] i386/cpu: Allow cache to be shared at thread level Date: Thu, 20 Nov 2025 15:10:26 +0800 Message-Id: <20251120071030.961230-7-zhao1.liu@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20251120071030.961230-1-zhao1.liu@intel.com> References: <20251120071030.961230-1-zhao1.liu@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=192.198.163.17; envelope-from=zhao1.liu@intel.com; helo=mgamail.intel.com X-Spam_score_int: -43 X-Spam_score: -4.4 X-Spam_bar: ---- X-Spam_report: (-4.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @intel.com) X-ZM-MESSAGEID: 1763621447584018900 Content-Type: text/plain; charset="utf-8" In CPUID 0x4 leaf, it's possible to make the cache privated at thread level when there's no HT within the core. In this case, while cache per thread and cache per core are essentially identical, their topology information differs in CPUID 0x4. Diamond Rapids assigns the L1 i/d cache at the thread level. To allow accurate emulation of DMR cache topology, remove the cache-per-thread restriction in max_thread_ids_for_cache(), which enables CPUID 0x4 to support cache per thread topology. Given that after adding thread-level support, the topology offset information required by max_thread_ids_for_cache() can be sufficiently provided by apicid_offset_by_topo_level(), so it's straightforward to re-implement max_thread_ids_for_cache() based on apicid_offset_by_topo_level() to reduce redundant duplicate codes. Tested-by: Xudong Hao Signed-off-by: Zhao Liu --- target/i386/cpu.c | 53 ++++++++++++++--------------------------------- 1 file changed, 15 insertions(+), 38 deletions(-) diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 118ce43e4267..c5f1f5d18d07 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -304,33 +304,30 @@ static void encode_cache_cpuid2(X86CPU *cpu, ((t) =3D=3D UNIFIED_CACHE) ? CACHE_TYPE_UNIFIED : \ 0 /* Invalid value */) =20 -static uint32_t max_thread_ids_for_cache(X86CPUTopoInfo *topo_info, - enum CpuTopologyLevel share_level) +static uint32_t apicid_offset_by_topo_level(X86CPUTopoInfo *topo_info, + enum CpuTopologyLevel topo_lev= el) { - uint32_t num_ids =3D 0; - - switch (share_level) { + switch (topo_level) { + case CPU_TOPOLOGY_LEVEL_THREAD: + return 0; case CPU_TOPOLOGY_LEVEL_CORE: - num_ids =3D 1 << apicid_core_offset(topo_info); - break; + return apicid_core_offset(topo_info); case CPU_TOPOLOGY_LEVEL_MODULE: - num_ids =3D 1 << apicid_module_offset(topo_info); - break; + return apicid_module_offset(topo_info); case CPU_TOPOLOGY_LEVEL_DIE: - num_ids =3D 1 << apicid_die_offset(topo_info); - break; + return apicid_die_offset(topo_info); case CPU_TOPOLOGY_LEVEL_SOCKET: - num_ids =3D 1 << apicid_pkg_offset(topo_info); - break; + return apicid_pkg_offset(topo_info); default: - /* - * Currently there is no use case for THREAD, so use - * assert directly to facilitate debugging. - */ g_assert_not_reached(); } + return 0; +} =20 - return num_ids - 1; +static uint32_t max_thread_ids_for_cache(X86CPUTopoInfo *topo_info, + enum CpuTopologyLevel share_level) +{ + return (1 << apicid_offset_by_topo_level(topo_info, share_level)) - 1; } =20 static uint32_t max_core_ids_in_package(X86CPUTopoInfo *topo_info) @@ -398,26 +395,6 @@ static uint32_t num_threads_by_topo_level(X86CPUTopoIn= fo *topo_info, return 0; } =20 -static uint32_t apicid_offset_by_topo_level(X86CPUTopoInfo *topo_info, - enum CpuTopologyLevel topo_lev= el) -{ - switch (topo_level) { - case CPU_TOPOLOGY_LEVEL_THREAD: - return 0; - case CPU_TOPOLOGY_LEVEL_CORE: - return apicid_core_offset(topo_info); - case CPU_TOPOLOGY_LEVEL_MODULE: - return apicid_module_offset(topo_info); - case CPU_TOPOLOGY_LEVEL_DIE: - return apicid_die_offset(topo_info); - case CPU_TOPOLOGY_LEVEL_SOCKET: - return apicid_pkg_offset(topo_info); - default: - g_assert_not_reached(); - } - return 0; -} - static uint32_t cpuid1f_topo_type(enum CpuTopologyLevel topo_level) { switch (topo_level) { --=20 2.34.1