From patchwork Tue Sep 26 06:09:03 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Huang, Ying" X-Patchwork-Id: 144753 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:cae8:0:b0:403:3b70:6f57 with SMTP id r8csp1727416vqu; Tue, 26 Sep 2023 00:14:52 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHI3U5mxN+aVvUiK6h/R70gC2hCqMM1WrjYw25hDwIsJmEC4dDr9JXMScSjd5HxNDkKyZix X-Received: by 2002:a05:6358:919c:b0:132:d32d:d929 with SMTP id j28-20020a056358919c00b00132d32dd929mr10767309rwa.20.1695712492100; Tue, 26 Sep 2023 00:14:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695712492; cv=none; d=google.com; s=arc-20160816; b=r7OqLm10mJJP2vOJMGHGkUP8m02iJFyMl144NgMb9GnabOhgjtDZGfRtf8RPGU4Plg R3yXXcNPAyh675jK8h7VwLjtMtER7QVKcB9V5qiz7fn2xmoXnZgk51Lf1jSSjFiAjwEx 6bjowX1B30amP+5mjODNQzoIgf9z5yNHXGEjcvhIquagI6uba4LNSZ0EYD+OlE9X7x5c DoqJ4+dYxVpkg1RNvIr4gAH7xTwiQXMdqGSILHGAfhCKb4ia6VEhr4jqvLSRX7YwLgQv rpS28krFAiNdzU/inp04nRvnRy83IbgTd+7A6cfQl1wj5Fdmu1/xHHWBc/TGtAZI/weo FVGQ== 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=36opLWR6CJOCDKHWsDafiwu7OGcLAly4+3YEuY6IXMM=; fh=TC2mSwauKvOF0gvkfwAYwW78suwyftye1fXSna9h0HU=; b=hlq2ihLMLtsi8DKuj8sST07FG64AiI30gb8sBY5LhOsVeHM7Gr6ozu4blkOI35Xy7N tx3Ca0+LgniS104OZSCcUI/avtbQTluXLwSxLu9AlfE53oTqrliz1+ahT/tgQC51PkGd PZRnxQtQg3hBm/eaPSO9L4waCkzXgexOIa9zWcapYZJAUVX8F/e6GZodZKvxeBJxHnrN Nk3WLyftGH+L05rZ4nPhfCClP35pSMma0oL8V1ixMpM28sTsAxDiRVZUUtORrW+2Oz+9 8hSlnfuZV5lzCdmVlJRu76gCHeuiHk5X/k/x5pdD34AoRPYtBM3fvAwkZot2Vyw1wZ+G Fhlg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="RDOmTF/4"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.34 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 howler.vger.email (howler.vger.email. [23.128.96.34]) by mx.google.com with ESMTPS id e20-20020a656794000000b00565218f25c4si11516458pgr.858.2023.09.26.00.14.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Sep 2023 00:14:52 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.34 as permitted sender) client-ip=23.128.96.34; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="RDOmTF/4"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.34 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 (depot.vger.email [IPv6:2620:137:e000::3:0]) by howler.vger.email (Postfix) with ESMTP id A10FB834D74E; Mon, 25 Sep 2023 23:34:37 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at howler.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232781AbjIZGe3 (ORCPT + 27 others); Tue, 26 Sep 2023 02:34:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45152 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233756AbjIZGJm (ORCPT ); Tue, 26 Sep 2023 02:09:42 -0400 Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.100]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DF168116 for ; Mon, 25 Sep 2023 23:09:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1695708574; x=1727244574; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=lVKcfu7RB9vKN2Hm50wym0zo99YnMLypq+qR+yt7FI8=; b=RDOmTF/413hbwfcVAseKSF2G+ufErzgXGGnnjc5sfB7Al2zmCMIQEAjC EkHfi0xst6DQ1/flr0Unr30PGwcjZUnB/y54XqKimHedS+IBFft4o3zq/ Lq8AjfWWxev44okHY9a6pUfk3FNmsRvwxJ/tX+r6OEwKW9r4szP1x3kG1 7ntBUj06LLY048aUPBVREkocJDJ4YD3lh15k9wueyBvK/pHL4qv2LkSF3 HVpdjXcOn6sFyCVPC5H+cy85sb8V7CF0T1xJcxnLrrI2eJsC5Zx4Jao2d +gISwA6TRe0zt9Shj/qa/pDvOnvBOspQLiB81xENt3QbIOK8wZR4Ib/f+ w==; X-IronPort-AV: E=McAfee;i="6600,9927,10843"; a="447991288" X-IronPort-AV: E=Sophos;i="6.03,177,1694761200"; d="scan'208";a="447991288" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Sep 2023 23:09:34 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10843"; a="892075860" X-IronPort-AV: E=Sophos;i="6.03,177,1694761200"; d="scan'208";a="892075860" Received: from aozhu-mobl.ccr.corp.intel.com (HELO yhuang6-mobl2.ccr.corp.intel.com) ([10.255.31.94]) by fmsmga001-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Sep 2023 23:08:27 -0700 From: Huang Ying To: Andrew Morton Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Arjan Van De Ven , Huang Ying , Sudeep Holla , Mel Gorman , Vlastimil Babka , David Hildenbrand , Johannes Weiner , Dave Hansen , Michal Hocko , Pavel Tatashin , Matthew Wilcox , Christoph Lameter Subject: [PATCH -V2 02/10] cacheinfo: calculate per-CPU data cache size Date: Tue, 26 Sep 2023 14:09:03 +0800 Message-Id: <20230926060911.266511-3-ying.huang@intel.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230926060911.266511-1-ying.huang@intel.com> References: <20230926060911.266511-1-ying.huang@intel.com> MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_NONE 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-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (howler.vger.email [0.0.0.0]); Mon, 25 Sep 2023 23:34:37 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1778083422429658695 X-GMAIL-MSGID: 1778083422429658695 Per-CPU data cache size is useful information. For example, it can be used to determine per-CPU cache size. So, in this patch, the data cache size for each CPU is calculated via data_cache_size / shared_cpu_weight. A brute-force algorithm to iterate all online CPUs is used to avoid to allocate an extra cpumask, especially in offline callback. Signed-off-by: "Huang, Ying" Cc: Sudeep Holla Cc: Andrew Morton Cc: Mel Gorman Cc: Vlastimil Babka Cc: David Hildenbrand Cc: Johannes Weiner Cc: Dave Hansen Cc: Michal Hocko Cc: Pavel Tatashin Cc: Matthew Wilcox Cc: Christoph Lameter --- drivers/base/cacheinfo.c | 42 ++++++++++++++++++++++++++++++++++++++- include/linux/cacheinfo.h | 1 + 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/drivers/base/cacheinfo.c b/drivers/base/cacheinfo.c index cbae8be1fe52..3e8951a3fbab 100644 --- a/drivers/base/cacheinfo.c +++ b/drivers/base/cacheinfo.c @@ -898,6 +898,41 @@ static int cache_add_dev(unsigned int cpu) return rc; } +static void update_data_cache_size_cpu(unsigned int cpu) +{ + struct cpu_cacheinfo *ci; + struct cacheinfo *leaf; + unsigned int i, nr_shared; + unsigned int size_data = 0; + + if (!per_cpu_cacheinfo(cpu)) + return; + + ci = ci_cacheinfo(cpu); + for (i = 0; i < cache_leaves(cpu); i++) { + leaf = per_cpu_cacheinfo_idx(cpu, i); + if (leaf->type != CACHE_TYPE_DATA && + leaf->type != CACHE_TYPE_UNIFIED) + continue; + nr_shared = cpumask_weight(&leaf->shared_cpu_map); + if (!nr_shared) + continue; + size_data += leaf->size / nr_shared; + } + ci->size_data = size_data; +} + +static void update_data_cache_size(bool cpu_online, unsigned int cpu) +{ + unsigned int icpu; + + for_each_online_cpu(icpu) { + if (!cpu_online && icpu == cpu) + continue; + update_data_cache_size_cpu(icpu); + } +} + static int cacheinfo_cpu_online(unsigned int cpu) { int rc = detect_cache_attributes(cpu); @@ -906,7 +941,11 @@ static int cacheinfo_cpu_online(unsigned int cpu) return rc; rc = cache_add_dev(cpu); if (rc) - free_cache_attributes(cpu); + goto err; + update_data_cache_size(true, cpu); + return 0; +err: + free_cache_attributes(cpu); return rc; } @@ -916,6 +955,7 @@ static int cacheinfo_cpu_pre_down(unsigned int cpu) cpu_cache_sysfs_exit(cpu); free_cache_attributes(cpu); + update_data_cache_size(false, cpu); return 0; } diff --git a/include/linux/cacheinfo.h b/include/linux/cacheinfo.h index a5cfd44fab45..4e7ccfa0c36d 100644 --- a/include/linux/cacheinfo.h +++ b/include/linux/cacheinfo.h @@ -73,6 +73,7 @@ struct cacheinfo { struct cpu_cacheinfo { struct cacheinfo *info_list; + unsigned int size_data; unsigned int num_levels; unsigned int num_leaves; bool cpu_map_populated;