From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.10]) (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 0AF8B2DB78C for ; Sun, 2 Aug 2026 16:13:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.10 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785687232; cv=none; b=Wd8iYIBX2rnNusR7z4h+X5mmW47URHhLxCiTHv5YhB9jgBoE1Fr2iqmGuCas76sgtXDG33Jee2XISlmPV7q1IKgqqp/BqwiuLG/VIMO2gWaOKsRGYr5WgmZQvjd2lOfeSmyiokzEYVk+FECfBiva8k54HDSvQH0XPxA9sC8Z6U0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785687232; c=relaxed/simple; bh=1uB+YFvlcvZ66EHPGO31Vyz9apHZzaUbGloIWOph/AU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Z6EebfIHCP2AUTz2GHr2Ywsu+R30jTQzvPRJ2C06KTwGW9fY1r4HgvlI5ShHaj9dB+hN5hKBHL0ZMTe5eN8vD0TMN7oESxkOGtGUjNnhFixdDy4mVany6i8JygwjrdlQJso7QtRBSrp/YTjl2zUZC+xcvDzFx1bcikTo/8yVdTU= 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=H/epsKS2; arc=none smtp.client-ip=192.198.163.10 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="H/epsKS2" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1785687230; x=1817223230; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=1uB+YFvlcvZ66EHPGO31Vyz9apHZzaUbGloIWOph/AU=; b=H/epsKS2aAwWPOy0wRWV4oreUZrImaaE3krssz0KYIG860KwmFOQPN1O MuKlC+nEQwQMmAdWrBfExmjtrGsm0AcsPbA0CAuWahTtlhLqFXEfs4IzL 1DNFhm97MhUFDW7XJr4l1y6lUV7cNmGM+ulWuiMUNROEPL76mCumPnyQu Z5mQJEmSZ1Qwby69HVbs+RQ+58xJv3IN41GaJK9B1ggz/vhQ80Bl1WeGF ZCQFrPkt4bFIDijNvidlka4mXNWTrAZ670/3L5P+nGbNaxrClmAxiVIfj 8UacxEuFsClX969ycc1xGM5tv/UkJdHPNS4WFDTR555NlyXl2gk4nvm5o g==; X-CSE-ConnectionGUID: 1NubylDXTdWv62/UytTguQ== X-CSE-MsgGUID: tdeJ2BmJTq2IvjAK9Vfewg== X-IronPort-AV: E=McAfee;i="6800,10657,11863"; a="97612252" X-IronPort-AV: E=Sophos;i="6.25,200,1779174000"; d="scan'208";a="97612252" Received: from orviesa007.jf.intel.com ([10.64.159.147]) by fmvoesa104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Aug 2026 09:13:49 -0700 X-CSE-ConnectionGUID: ORawG+pVRoKSQq5dRPs7wQ== X-CSE-MsgGUID: 2hh1aIgITKa6EKfzYRB5iw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,200,1779174000"; d="scan'208";a="261068056" Received: from chenyu-dev.sh.intel.com ([10.239.62.107]) by orviesa007.jf.intel.com with ESMTP; 02 Aug 2026 09:13:47 -0700 From: Chen Yu To: Reinette Chatre , Tony Luck Cc: Ben Horgan , "James Morse" , Dave Martin , Babu Moger , Fenghua Yu , Borislav Petkov , Thomas Gleixner , "Dave Hansen" , Peter Newman , chen.yu@linux.dev, x86@kernel.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH 07/31] fs/resctrl: Do not invoke smp_processor_id() in preemptible context Date: Mon, 3 Aug 2026 00:04:04 +0800 Message-Id: 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 LLC occupancy can be read on any CPU when the counter is accessed via MMIO, so such an event is read from task context on whatever CPU the caller happens to be running on rather than being bounced to a CPU in the monitoring domain. mon_evt::any_cpu marks these CPU-agnostic events. __l3_mon_event_count() calls smp_processor_id() to find the CPU to read from. For an any_cpu event that lookup is unsafe: the code runs in preemptible task context, so smp_processor_id() emits a debug warning. Skip the current-CPU lookup when an event's any_cpu flag is set, events with this flag do not require execution on a specific CPU. For legacy MSR-based access, update rmid_read::err if the reading of the event was dispatched to a wrong CPU, according to the change at: https://lore.kernel.org/lkml/6b3c66a49788828bd8c04a6911bd74c91ccd56f3.1782857711.git.reinette.chatre@intel.com/ Signed-off-by: Tony Luck Tested-by: Hongyu Ning Signed-off-by: Chen Yu --- fs/resctrl/monitor.c | 48 +++++++++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/fs/resctrl/monitor.c b/fs/resctrl/monitor.c index 8dfc54f8a1f2..89baed73bcd6 100644 --- a/fs/resctrl/monitor.c +++ b/fs/resctrl/monitor.c @@ -417,9 +417,37 @@ 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)); } +/** + * cpu_on_correct_domain() - Check if current CPU is in the correct + * domain for the event. + * @rr: The rmid_read structure containing event and domain information. + * + * Context: Preemptible process context when @rr->evt->any_cpu is set. + * Non-migratable process context (via smp_call_on_cpu()) or + * non-preemptible context (via smp_call_function_any()) when + * the event must be read on a specific CPU. + * Return: true if the current CPU can read this event, false otherwise. + */ +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,11 +480,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)) { - rr->err = -EIO; - return -EINVAL; - } if (rr->is_mbm_cntr) rr->err = resctrl_arch_cntr_read(rr->r, d, closid, rmid, cntr_id, rr->evt->evtid, &tval); @@ -474,7 +497,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; @@ -492,12 +514,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)) { - rr->err = -EIO; - return -EINVAL; - } - /* * Legacy files must report the sum of an event across all * domains that share the same L3 cache instance. @@ -528,7 +544,11 @@ 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)) { + rr->err = -EIO; + return -EINVAL; + } + if (rr->hdr) return __l3_mon_event_count(rdtgrp, rr); else -- 2.43.0