From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.8]) (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 DA7BD3C13E0 for ; Wed, 27 May 2026 09:37:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.8 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779874629; cv=none; b=jj/QIhFxYZFEMJhi931Xm2QPhvAdt8K7IMttk/2OXzYoGbnGu0lkCUA4zW+8shZXE8E5H7Z9bdzQF/uZtdb94EmKd+KCUcDJ2HFsr07zFCYZ1qIqs5ohiKedlc2R2QDL2LQtCvy6H6VUHNurrKUWVZ80wySmytllipcOEsbxwf8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779874629; c=relaxed/simple; bh=/HumKetlzkB9HHj961ARwdPZRob+ggQZ3vBdy9m1LWI=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=m0COPe8hOy+xuujphqXbG4X5uPJVtUUewjXhwUYEeF21WDuMZY4Die7Qbnh9tf7tXym5xw6TS5iYBKQA4D13GJAK/bK6YxB5Qugkp3FZ7Mk/T0B5OB3Du485IqpAVcBjoazD24rjskuB2SwvZHH2425SD0uNOXO53lHCjsgW778= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=jM/dnDYZ; arc=none smtp.client-ip=192.198.163.8 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="jM/dnDYZ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1779874626; x=1811410626; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=/HumKetlzkB9HHj961ARwdPZRob+ggQZ3vBdy9m1LWI=; b=jM/dnDYZ4uojtkEZpm3IEmi0oA3UBhavJ68boxPcp6rMs5bIN+7to2iD Zi729RrQSVHD3E7xOh4Mzsaoeqy6ZvJ38eD3iGk7tj2MfbAaVU582NK5r DP4B42WRw4MNknq9FMeH11y+XpUkd4xbJqP+pRlTtdMI+kxb6gXdzRRq/ aysVmiIGmU9LmAOBn1hxkYXjKg1RUMJ1GnZ2+QuuicxCiQJJxZj0DhugU i0tTOlEk1vBrHGZm+rO7PGmFNudDBpBNgFXRqkkE5aEyrBqjJu+9t3Etn gtjWp/Bdc6Ot8g9m6K77uK/KZVMtJfQboDad86BvijltIlYnsH0g9027c w==; X-CSE-ConnectionGUID: rY7dsx84Ry+9m0GTWqdh2w== X-CSE-MsgGUID: 8AKFbq5tTjuQ7ySLFqGLQw== X-IronPort-AV: E=McAfee;i="6800,10657,11798"; a="98275089" X-IronPort-AV: E=Sophos;i="6.24,171,1774335600"; d="scan'208";a="98275089" Received: from fmviesa008.fm.intel.com ([10.60.135.148]) by fmvoesa102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 May 2026 02:37:05 -0700 X-CSE-ConnectionGUID: O+inV5raSBGacA1U237Spw== X-CSE-MsgGUID: Kc0wBcypSEO+JpLKSvdBiA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.24,171,1774335600"; d="scan'208";a="239582123" Received: from chenyu-dev.sh.intel.com ([10.239.62.107]) by fmviesa008.fm.intel.com with ESMTP; 27 May 2026 02:37:02 -0700 From: Chen Yu To: tony.luck@intel.com, reinette.chatre@intel.com Cc: x86@kernel.org, linux-kernel@vger.kernel.org, tglx@kernel.org, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, hpa@zytor.com, Dave.Martin@arm.com, james.morse@arm.com, babu.moger@amd.com, fenghuay@nvidia.com, Chen Yu Subject: [RFC PATCH 5/6] fs/resctrl: Do not invoke smp_processor_id() in preemptible context Date: Wed, 27 May 2026 17:28:02 +0800 Message-Id: <56b3dc7b06861029b1555d7f638a6ea22281fe6a.1779872016.git.yu.c.chen@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Tony Luck __l3_mon_event_count() and __l3_mon_event_count_sum() call smp_processor_id() to obtain the current CPU. However, some monitor events can be read from any CPU in task context via mon_event_count(); in that case the calling context is preemptible and smp_processor_id() triggers a debug warning. Fix this by skipping the current-CPU lookup when the event's any_cpu flag is set, since such events do not need to run on a specific CPU. Signed-off-by: Tony Luck Signed-off-by: Chen Yu --- fs/resctrl/monitor.c | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/fs/resctrl/monitor.c b/fs/resctrl/monitor.c index 9fd901c78dc6..371ccae04892 100644 --- a/fs/resctrl/monitor.c +++ b/fs/resctrl/monitor.c @@ -417,9 +417,33 @@ static void mbm_cntr_free(struct rdt_l3_mon_domain *d, int cntr_id) memset(&d->cntr_cfg[cntr_id], 0, sizeof(*d->cntr_cfg)); } +/* + * Called from preemptible context via a direct call of mon_event_count() for + * events that can be read on any CPU. + * Called from preemptible but non-migratable process context (mon_event_count() + * via smp_call_on_cpu()) OR non-preemptible context (mon_event_count() via + * smp_call_function_any()) for events that need to be read on a specific CPU. + */ +static bool cpu_on_correct_domain(struct rmid_read *rr) +{ + int cpu; + + /* Any CPU is OK for this event */ + if (rr->evt->any_cpu) + return true; + + cpu = smp_processor_id(); + + /* Single domain. Must be on a CPU in that domain. */ + if (rr->hdr) + return cpumask_test_cpu(cpu, &rr->hdr->cpu_mask); + + /* Summing domains that share a cache, must be on a CPU for that cache. */ + return cpumask_test_cpu(cpu, &rr->ci->shared_cpu_map); +} + static int __l3_mon_event_count(struct rdtgroup *rdtgrp, struct rmid_read *rr) { - int cpu = smp_processor_id(); u32 closid = rdtgrp->closid; u32 rmid = rdtgrp->mon.rmid; struct rdt_l3_mon_domain *d; @@ -452,9 +476,6 @@ static int __l3_mon_event_count(struct rdtgroup *rdtgrp, struct rmid_read *rr) return 0; } - /* Reading a single domain, must be on a CPU in that domain. */ - if (!cpumask_test_cpu(cpu, &d->hdr.cpu_mask)) - return -EINVAL; if (rr->is_mbm_cntr) rr->err = resctrl_arch_cntr_read(rr->r, d, closid, rmid, cntr_id, rr->evt->evtid, &tval); @@ -472,7 +493,6 @@ static int __l3_mon_event_count(struct rdtgroup *rdtgrp, struct rmid_read *rr) static int __l3_mon_event_count_sum(struct rdtgroup *rdtgrp, struct rmid_read *rr) { - int cpu = smp_processor_id(); u32 closid = rdtgrp->closid; u32 rmid = rdtgrp->mon.rmid; struct rdt_l3_mon_domain *d; @@ -490,10 +510,6 @@ static int __l3_mon_event_count_sum(struct rdtgroup *rdtgrp, struct rmid_read *r return -EINVAL; } - /* Summing domains that share a cache, must be on a CPU for that cache. */ - if (!cpumask_test_cpu(cpu, &rr->ci->shared_cpu_map)) - return -EINVAL; - /* * Legacy files must report the sum of an event across all * domains that share the same L3 cache instance. @@ -524,7 +540,9 @@ static int __mon_event_count(struct rdtgroup *rdtgrp, struct rmid_read *rr) { switch (rr->r->rid) { case RDT_RESOURCE_L3: - WARN_ON_ONCE(rr->evt->any_cpu); + if (!cpu_on_correct_domain(rr)) + return -EINVAL; + if (rr->hdr) return __l3_mon_event_count(rdtgrp, rr); else -- 2.25.1