]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
s390/pai: Deny all events not handled by this PMU
authorThomas Richter <tmricht@linux.ibm.com>
Mon, 25 Aug 2025 07:53:27 +0000 (09:53 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 19 Sep 2025 14:35:44 +0000 (16:35 +0200)
[ Upstream commit 85941afd2c404247e583c827fae0a45da1c1d92c ]

Each PAI PMU device driver returns -EINVAL when an event is out of
its accepted range. This return value aborts the search for an
alternative PMU device driver to handle this event.
Change the return value to -ENOENT. This return value is used to
try other PMUs instead.  This makes the PMUs more robust when
the sequence of PMU device driver initialization changes (at boot time)
or by using modules.

Fixes: 39d62336f5c12 ("s390/pai: add support for cryptography counters")
Acked-by: Sumanth Korikkar <sumanthk@linux.ibm.com>
Signed-off-by: Thomas Richter <tmricht@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
arch/s390/kernel/perf_pai_crypto.c
arch/s390/kernel/perf_pai_ext.c

index 10725f5a6f0fd12fd4fe46c5aa7af26298a54b90..11200880a96c18f228232c96c1679cd09a62fa47 100644 (file)
@@ -286,10 +286,10 @@ static int paicrypt_event_init(struct perf_event *event)
        /* PAI crypto PMU registered as PERF_TYPE_RAW, check event type */
        if (a->type != PERF_TYPE_RAW && event->pmu->type != a->type)
                return -ENOENT;
-       /* PAI crypto event must be in valid range */
+       /* PAI crypto event must be in valid range, try others if not */
        if (a->config < PAI_CRYPTO_BASE ||
            a->config > PAI_CRYPTO_BASE + paicrypt_cnt)
-               return -EINVAL;
+               return -ENOENT;
        /* Allow only CRYPTO_ALL for sampling */
        if (a->sample_period && a->config != PAI_CRYPTO_BASE)
                return -EINVAL;
index a8f0bad99cf04fa1b4c1fb45d9b33345f36cc23a..28398e313b58d1a4487c793b61a460be54a34bce 100644 (file)
@@ -266,7 +266,7 @@ static int paiext_event_valid(struct perf_event *event)
                event->hw.config_base = offsetof(struct paiext_cb, acc);
                return 0;
        }
-       return -EINVAL;
+       return -ENOENT;
 }
 
 /* Might be called on different CPU than the one the event is intended for. */