From nobody Sat Feb 7 06:13:43 2026 Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1A39A3164B7 for ; Wed, 31 Dec 2025 09:15:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767172514; cv=none; b=A0vVyBUq0InSNdPghCw7iaYTDEz2tl9aF6m21N72Ay5ZLvBfNymZj6H6RxP4a1r+cw+S9Aqs9MQarSLYpQXRyN0iY0JoVyMbW41tfuXpCxLRc+FHpIlqU5EsaTrHccBm4MpDuAVy5tsZRCEfXmQZiPA8uz0kLfkQy1Ay3n7R2t4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767172514; c=relaxed/simple; bh=z+kguRRaqZHMZx2XZis3aztpcnjb4raCwVyceh6uPlY=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=RMsQcvg8j7ubUyMr/Cw4EGXDy/VCspulnlYiOQlJcjOv77NfFMp1I1qBy+35/QGdlnpUR921Y/DesYIArNy2+mF1CPNSrsOvW4QHJLRc0tcVStZOkkKQsgEaSxHfrgcOKoY7GexwImrOJSZ/S85cOVCl5AglnVwbkzeRnHNY3Yg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=bytefly.space; spf=pass smtp.mailfrom=bytefly.space; dkim=pass (2048-bit key) header.d=bytefly-space.20230601.gappssmtp.com header.i=@bytefly-space.20230601.gappssmtp.com header.b=uvnixW4k; arc=none smtp.client-ip=209.85.214.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=bytefly.space Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bytefly.space Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bytefly-space.20230601.gappssmtp.com header.i=@bytefly-space.20230601.gappssmtp.com header.b="uvnixW4k" Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-2a0c20ee83dso136363345ad.2 for ; Wed, 31 Dec 2025 01:15:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytefly-space.20230601.gappssmtp.com; s=20230601; t=1767172511; x=1767777311; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=cqaN5izDEsgH/os+tYDrb4IvKYYnm+SnIE1Vz4Q+hU8=; b=uvnixW4kp8r/k1SAGmsf97cvMOvZfQorgwqiamYy1j2YUFgiGePYPMf293FDIt16vL cctTLi4WftbO81YZjTnVTNR930LA1FYZK5KN7hnY/RUZ9BHK19Qtge052YBeZ48IMV7c dKCnbTq2J5ctaYe2L0BtXmAjzGw+BzXDWInKsdpyqahM/2WbM53QKkFOrf7m3WFPzApI Zr4A6GVzc0wL9M5wseg8tjKMgmZ9UqpKeRTve9sNTo7i7i5VWuxa/w6ES7UVpT7czNOf 8NlxD1Z8RvwMuSpLQ+KAc6m3hXQOPi+VBjBOM+psc1yqC/8DZSH28vTN+6gFvZS6riQA R3Uw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767172511; x=1767777311; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=cqaN5izDEsgH/os+tYDrb4IvKYYnm+SnIE1Vz4Q+hU8=; b=fKzvru3zSpMUaOGOT3PFYNUAq714HpCLx6fbRzcCs6FGjvfoHObQ+FWQGLcY3GuRND PJIVrBo4TH31/8+2foV4NYy5vUsvt0CnhW5Kfx68SuZDE4v4pRpsFiGsHfjheswK/mJm jc0YM3w7t80zH/K0/HP2cTbsqPqQrvE46Q8gu4JLml3uxHQpztlMBU4P/cx9PKZOa+ST RNOk3jVnUWLhfJ9khRrosRBsgHBJYkil2wUZeOB7BFteCHFb2b7EmUhrWzVUs8h1jp+O q39K4qWdQmCSy6P9BdvU6zsvHkxggDhYFhpqictKpPSlfuKI0zBjzsLUu6ofiPN1KI6T ycKA== X-Forwarded-Encrypted: i=1; AJvYcCVz3Sh6lLxRGKMOaosm6u02tlgt7EOGhKRfC8BaSc0QiVSXDsJ8B8ofCo1fmDzQxQV/ZRyPabRzJmH51sU=@vger.kernel.org X-Gm-Message-State: AOJu0YzIGU9XZ0AMvh4iCSYqVazzS+scbmBPOc/X+GMGAFu5MOo7w9O6 32G3KPvatKoIt6tuN7mKriSWYQkhmskjtO0mewcICdZXDGNg4q/Idu4PKG62xqKW540= X-Gm-Gg: AY/fxX58vVAxEArvfyHMGXIR80r4Bj9UMIuMUKh/BMy5KPMAkJ/gaKYEFQAkRUsLZ7W Y6p1xnDQcflQ+H/GZDdpsYPigzlRhjVP8n8H8Jvs7eJn0Tu1sPY/IURNvy+g5W/kdBHbOGuAnHH kl6HGeCbqN4JKMgOqPvwp89aKjDwlkw0fzuJ38dt+ryIbIGRAuXG/3H3oK5JNNR5JdBaRTLypCP y8zHq7/P2lNmFEw+sSs7sHsN2ipzgOIp3OeO083u6P3y/vxW37JahIpAIzibAl99rkRfH9W3i/J e1udshjS0fw10gDJmQBn7ZC5hs9lJ7zOAh/cql4RoyHyxk/0lWohooVc8BZrXh4S7iy0veYiVwJ pAaT9XnvBc7YB0ypT1ObluRsuGHnmYZlKAekWjR8h15hTNNE0rjUOoz/ah3Ulm8TDWctL8bE= X-Google-Smtp-Source: AGHT+IEEHAEmUHoBPsk2VWXa0Bxxl2Wl+1W1VgdLinYqxfVL+B8yrv2/848F+XVxTJyQxSLPq3mDmg== X-Received: by 2002:a17:902:ce92:b0:2a2:d066:b668 with SMTP id d9443c01a7336-2a2f222adc2mr292537615ad.12.1767172511271; Wed, 31 Dec 2025 01:15:11 -0800 (PST) Received: from xpc ([2400:8902:e002:dec1:95fc:f49b:fe:1151]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a2f3c666casm319258255ad.3.2025.12.31.01.15.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 31 Dec 2025 01:15:10 -0800 (PST) From: Lisa Robinson To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Huacai Chen Cc: Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , James Clark , WANG Xuerui , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, loongarch@lists.linux.dev, Lisa Robinson Subject: [PATCH] LoongArch: Fix PMU counter allocation for mixed-type event groups Date: Wed, 31 Dec 2025 17:15:00 +0800 Message-ID: <20251231091500.530432-1-lisa@bytefly.space> X-Mailer: git-send-email 2.52.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When validating a perf event group, validate_group() unconditionally attempts to allocate hardware PMU counters for the leader, sibling events and the new event being added. This is incorrect for mixed-type groups. If a PERF_TYPE_SOFTWARE event ispart of the group, the current code still tries to allocate a hardware PMU counter for it, which can wrongly consume hardware PMU resources and cause spurious allocation failures. Fix this by only allocating PMU counters for hardware events during group validation, and skipping software events. A trimmed down reproducer is as simple as this: #include #include #include #include #include #include int main (int argc, char *argv[]) { struct perf_event_attr attr =3D { 0 }; int fds[5]; attr.disabled =3D 1; attr.exclude_kernel =3D 1; attr.exclude_hv =3D 1; attr.read_format =3D PERF_FORMAT_TOTAL_TIME_ENABLED | PERF_FORMAT_TOTAL_TIME_RUNNING | PERF_FORMAT_ID | PERF_FORMAT_GROUP; attr.size =3D sizeof (attr); attr.type =3D PERF_TYPE_SOFTWARE; attr.config =3D PERF_COUNT_SW_DUMMY; fds[0] =3D syscall (SYS_perf_event_open, &attr, 0, -1, -1, 0); assert (fds[0] >=3D 0); attr.type =3D PERF_TYPE_HARDWARE; attr.config =3D PERF_COUNT_HW_CPU_CYCLES; fds[1] =3D syscall (SYS_perf_event_open, &attr, 0, -1, fds[0], 0); assert (fds[1] >=3D 0); attr.type =3D PERF_TYPE_HARDWARE; attr.config =3D PERF_COUNT_HW_INSTRUCTIONS; fds[2] =3D syscall (SYS_perf_event_open, &attr, 0, -1, fds[0], 0); assert (fds[2] >=3D 0); attr.type =3D PERF_TYPE_HARDWARE; attr.config =3D PERF_COUNT_HW_BRANCH_MISSES; fds[3] =3D syscall (SYS_perf_event_open, &attr, 0, -1, fds[0], 0); assert (fds[3] >=3D 0); attr.type =3D PERF_TYPE_HARDWARE; attr.config =3D PERF_COUNT_HW_CACHE_REFERENCES; fds[4] =3D syscall (SYS_perf_event_open, &attr, 0, -1, fds[0], 0); assert (fds[4] >=3D 0); printf ("PASSED\n"); return 0; } Fixes: b37042b2bb7c ("LoongArch: Add perf events support") Signed-off-by: Lisa Robinson --- arch/loongarch/kernel/perf_event.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/arch/loongarch/kernel/perf_event.c b/arch/loongarch/kernel/per= f_event.c index 9d257c8519c9..82cc08c2b056 100644 --- a/arch/loongarch/kernel/perf_event.c +++ b/arch/loongarch/kernel/perf_event.c @@ -633,15 +633,24 @@ static int validate_group(struct perf_event *event) =20 memset(&fake_cpuc, 0, sizeof(fake_cpuc)); =20 - if (loongarch_pmu_alloc_counter(&fake_cpuc, &leader->hw) < 0) + if ((PERF_TYPE_HARDWARE =3D=3D leader->attr.type || + PERF_TYPE_HW_CACHE =3D=3D leader->attr.type || + PERF_TYPE_RAW =3D=3D leader->attr.type) && + loongarch_pmu_alloc_counter(&fake_cpuc, &leader->hw) < 0) return -EINVAL; =20 for_each_sibling_event(sibling, leader) { - if (loongarch_pmu_alloc_counter(&fake_cpuc, &sibling->hw) < 0) + if ((PERF_TYPE_HARDWARE =3D=3D sibling->attr.type || + PERF_TYPE_HW_CACHE =3D=3D sibling->attr.type || + PERF_TYPE_RAW =3D=3D sibling->attr.type) && + loongarch_pmu_alloc_counter(&fake_cpuc, &sibling->hw) < 0) return -EINVAL; } =20 - if (loongarch_pmu_alloc_counter(&fake_cpuc, &event->hw) < 0) + if ((PERF_TYPE_HARDWARE =3D=3D event->attr.type || + PERF_TYPE_HW_CACHE =3D=3D event->attr.type || + PERF_TYPE_RAW =3D=3D event->attr.type) && + loongarch_pmu_alloc_counter(&fake_cpuc, &event->hw) < 0) return -EINVAL; =20 return 0; --=20 2.52.0