* [PATCH] ARM: perf_event: support dual-core with single PMU IRQ
@ 2011-02-04 6:29 Rabin Vincent
0 siblings, 0 replies; 2+ messages in thread
From: Rabin Vincent @ 2011-02-04 6:29 UTC (permalink / raw)
To: linux-arm-kernel
DB8500 (dual-core) has the PMU interrupts of both cores ORed into one. Support
this by setting the affinity of the interrupt to the other core when the
current core finds that its counter has not overflowed when an interrupt
occurred.
Signed-off-by: Rabin Vincent <rabin.vincent@stericsson.com>
---
arch/arm/kernel/perf_event.c | 33 ++++++++++++++++++++++++++++++++-
1 files changed, 32 insertions(+), 1 deletions(-)
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c
index 5efa264..d07990e 100644
--- a/arch/arm/kernel/perf_event.c
+++ b/arch/arm/kernel/perf_event.c
@@ -377,9 +377,27 @@ validate_group(struct perf_event *event)
return 0;
}
+static irqreturn_t armpmu_bounce_interrupt(int irq, void *dev)
+{
+ irqreturn_t ret = armpmu->handle_irq(irq, dev);
+
+ if (ret == IRQ_NONE) {
+ int other = !smp_processor_id();
+ irq_set_affinity(irq, cpumask_of(other));
+ }
+
+ /*
+ * We should be able to get away with the amount of IRQ_NONEs we give,
+ * while still having the spurious IRQ detection code kick in if the
+ * interrupt really starts hitting spuriously.
+ */
+ return ret;
+}
+
static int
armpmu_reserve_hardware(void)
{
+ irq_handler_t irq_handler = armpmu->handle_irq;
int i, err = -ENODEV, irq;
pmu_device = reserve_pmu(ARM_PMU_DEVICE_CPU);
@@ -395,12 +413,25 @@ armpmu_reserve_hardware(void)
return -ENODEV;
}
+ /*
+ * Some SoCs have the PMU IRQ lines of two cores wired together into a
+ * single interrupt.
+ */
+ if (pmu_device->num_resources < num_online_cpus()) {
+ if (num_online_cpus() > 2) {
+ pr_err(">2 cpus not supported for single-irq workaround");
+ return -ENODEV;
+ }
+
+ irq_handler = armpmu_bounce_interrupt;
+ }
+
for (i = 0; i < pmu_device->num_resources; ++i) {
irq = platform_get_irq(pmu_device, i);
if (irq < 0)
continue;
- err = request_irq(irq, armpmu->handle_irq,
+ err = request_irq(irq, irq_handler,
IRQF_DISABLED | IRQF_NOBALANCING,
"armpmu", NULL);
if (err) {
--001636c5aa55c3c736049baacb0b
Content-Type: application/octet-stream;
name="0001-ARM-perf_event-support-dual-core-with-single-PMU-IRQ.patch"
Content-Disposition: attachment;
filename="0001-ARM-perf_event-support-dual-core-with-single-PMU-IRQ.patch"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gjuykx4u0
RnJvbSA0MTBlZTgzMWRkNjk2OWVjMDQ3YmE5OGIxY2QzMmFjMjA0NGYxNWNlIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBSYWJpbiBWaW5jZW50IDxyYWJpbi52aW5jZW50QHN0ZXJpY3Nz
b24uY29tPgpEYXRlOiBGcmksIDQgRmViIDIwMTEgMTE6NTk6MjYgKzA1MzAKU3ViamVjdDogW1BB
VENIXSBBUk06IHBlcmZfZXZlbnQ6IHN1cHBvcnQgZHVhbC1jb3JlIHdpdGggc2luZ2xlIFBNVSBJ
UlEKCkRCODUwMCAoZHVhbC1jb3JlKSBoYXMgdGhlIFBNVSBpbnRlcnJ1cHRzIG9mIGJvdGggY29y
ZXMgT1JlZCBpbnRvIG9uZS4gIFN1cHBvcnQKdGhpcyBieSBzZXR0aW5nIHRoZSBhZmZpbml0eSBv
ZiB0aGUgaW50ZXJydXB0IHRvIHRoZSBvdGhlciBjb3JlIHdoZW4gdGhlCmN1cnJlbnQgY29yZSBm
aW5kcyB0aGF0IGl0cyBjb3VudGVyIGhhcyBub3Qgb3ZlcmZsb3dlZCB3aGVuIGFuIGludGVycnVw
dApvY2N1cnJlZC4KClNpZ25lZC1vZmYtYnk6IFJhYmluIFZpbmNlbnQgPHJhYmluLnZpbmNlbnRA
c3Rlcmljc3Nvbi5jb20+Ci0tLQogYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnQuYyB8ICAgMzMg
KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystCiAxIGZpbGVzIGNoYW5nZWQsIDMyIGlu
c2VydGlvbnMoKyksIDEgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVs
L3BlcmZfZXZlbnQuYyBiL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50LmMKaW5kZXggNWVmYTI2
NC4uZDA3OTkwZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnQuYworKysg
Yi9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudC5jCkBAIC0zNzcsOSArMzc3LDI3IEBAIHZhbGlk
YXRlX2dyb3VwKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIAlyZXR1cm4gMDsKIH0KIAorc3Rh
dGljIGlycXJldHVybl90IGFybXBtdV9ib3VuY2VfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRl
dikKK3sKKwlpcnFyZXR1cm5fdCByZXQgPSBhcm1wbXUtPmhhbmRsZV9pcnEoaXJxLCBkZXYpOwor
CisJaWYgKHJldCA9PSBJUlFfTk9ORSkgeworCQlpbnQgb3RoZXIgPSAhc21wX3Byb2Nlc3Nvcl9p
ZCgpOworCQlpcnFfc2V0X2FmZmluaXR5KGlycSwgY3B1bWFza19vZihvdGhlcikpOworCX0KKwor
CS8qCisJICogV2Ugc2hvdWxkIGJlIGFibGUgdG8gZ2V0IGF3YXkgd2l0aCB0aGUgYW1vdW50IG9m
IElSUV9OT05FcyB3ZSBnaXZlLAorCSAqIHdoaWxlIHN0aWxsIGhhdmluZyB0aGUgc3B1cmlvdXMg
SVJRIGRldGVjdGlvbiBjb2RlIGtpY2sgaW4gaWYgdGhlCisJICogaW50ZXJydXB0IHJlYWxseSBz
dGFydHMgaGl0dGluZyBzcHVyaW91c2x5LgorCSAqLworCXJldHVybiByZXQ7Cit9CisKIHN0YXRp
YyBpbnQKIGFybXBtdV9yZXNlcnZlX2hhcmR3YXJlKHZvaWQpCiB7CisJaXJxX2hhbmRsZXJfdCBp
cnFfaGFuZGxlciA9IGFybXBtdS0+aGFuZGxlX2lycTsKIAlpbnQgaSwgZXJyID0gLUVOT0RFViwg
aXJxOwogCiAJcG11X2RldmljZSA9IHJlc2VydmVfcG11KEFSTV9QTVVfREVWSUNFX0NQVSk7CkBA
IC0zOTUsMTIgKzQxMywyNSBAQCBhcm1wbXVfcmVzZXJ2ZV9oYXJkd2FyZSh2b2lkKQogCQlyZXR1
cm4gLUVOT0RFVjsKIAl9CiAKKwkvKgorCSAqIFNvbWUgU29DcyBoYXZlIHRoZSBQTVUgSVJRIGxp
bmVzIG9mIHR3byBjb3JlcyB3aXJlZCB0b2dldGhlciBpbnRvIGEKKwkgKiBzaW5nbGUgaW50ZXJy
dXB0LgorCSAqLworCWlmIChwbXVfZGV2aWNlLT5udW1fcmVzb3VyY2VzIDwgbnVtX29ubGluZV9j
cHVzKCkpIHsKKwkJaWYgKG51bV9vbmxpbmVfY3B1cygpID4gMikgeworCQkJcHJfZXJyKCI+MiBj
cHVzIG5vdCBzdXBwb3J0ZWQgZm9yIHNpbmdsZS1pcnEgd29ya2Fyb3VuZCIpOworCQkJcmV0dXJu
IC1FTk9ERVY7CisJCX0KKworCQlpcnFfaGFuZGxlciA9IGFybXBtdV9ib3VuY2VfaW50ZXJydXB0
OworCX0KKwogCWZvciAoaSA9IDA7IGkgPCBwbXVfZGV2aWNlLT5udW1fcmVzb3VyY2VzOyArK2kp
IHsKIAkJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwbXVfZGV2aWNlLCBpKTsKIAkJaWYgKGlycSA8
IDApCiAJCQljb250aW51ZTsKIAotCQllcnIgPSByZXF1ZXN0X2lycShpcnEsIGFybXBtdS0+aGFu
ZGxlX2lycSwKKwkJZXJyID0gcmVxdWVzdF9pcnEoaXJxLCBpcnFfaGFuZGxlciwKIAkJCQkgIElS
UUZfRElTQUJMRUQgfCBJUlFGX05PQkFMQU5DSU5HLAogCQkJCSAgImFybXBtdSIsIE5VTEwpOwog
CQlpZiAoZXJyKSB7Ci0tIAoxLjcuMi5kaXJ0eQoK
--001636c5aa55c3c736049baacb0b--
^ permalink raw reply related [flat|nested] 2+ messages in thread
* [PATCH] ARM: perf_event: support dual-core with single PMU IRQ
@ 2011-02-04 6:29 Rabin Vincent
0 siblings, 0 replies; 2+ messages in thread
From: Rabin Vincent @ 2011-02-04 6:29 UTC (permalink / raw)
To: linux-arm-kernel
DB8500 (dual-core) has the PMU interrupts of both cores ORed into one. Sup=
port
this by keeping the interrupt directed at Core0 and IPIing Core1 when Core0
receives the interrupt and finds that its counter has not overflowed.
Signed-off-by: Rabin Vincent <rabin.vincent@stericsson.com>
---
arch/arm/kernel/perf_event.c | 48 ++++++++++++++++++++++++++++++++++++++=
+++-
1 files changed, 47 insertions(+), 1 deletions(-)
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c
index 5efa264..a97e50f 100644
--- a/arch/arm/kernel/perf_event.c
+++ b/arch/arm/kernel/perf_event.c
@@ -19,6 +19,7 @@
#include <linux/platform_device.h>
#include <linux/spinlock.h>
#include <linux/uaccess.h>
+#include <linux/smp.h>
#include <asm/cputype.h>
#include <asm/irq.h>
@@ -377,9 +378,40 @@ validate_group(struct perf_event *event)
return 0;
}
+static irqreturn_t armpmu_core2_irqret;
+
+/* Called via IPI on the second core */
+static void armpmu_kick(void *data)
+{
+ int irq =3D (int) data;
+
+ armpmu_core2_irqret =3D armpmu->handle_irq(irq, NULL);
+ smp_wmb();
+}
+
+static irqreturn_t armpmu_single_interrupt(int irq, void *dev)
+{
+ irqreturn_t irqret =3D armpmu->handle_irq(irq, dev);
+ int err;
+
+ if (irqret !=3D IRQ_NONE)
+ return irqret;
+
+ local_irq_enable();
+ err =3D smp_call_function_single(1, armpmu_kick, (void *) irq, true);
+ local_irq_disable();
+
+ if (err)
+ return irqret;
+
+ smp_rmb();
+ return armpmu_core2_irqret;
+}
+
static int
armpmu_reserve_hardware(void)
{
+ irq_handler_t irq_handler =3D armpmu->handle_irq;
int i, err =3D -ENODEV, irq;
pmu_device =3D reserve_pmu(ARM_PMU_DEVICE_CPU);
@@ -395,12 +427,26 @@ armpmu_reserve_hardware(void)
return -ENODEV;
}
+ /*
+ * Some SoCs have the PMU IRQ lines of two cores wired together into a
+ * single interrupt. Support these by poking the second core with an
+ * IPI when its counters overflow.
+ */
+ if (pmu_device->num_resources < num_online_cpus()) {
+ if (num_online_cpus() > 2) {
+ pr_err(">2 cpus not supported for single-irq workaround");
+ return -ENODEV;
+ }
+
+ irq_handler =3D armpmu_single_interrupt;
+ }
+
for (i =3D 0; i < pmu_device->num_resources; ++i) {
irq =3D platform_get_irq(pmu_device, i);
if (irq < 0)
continue;
- err =3D request_irq(irq, armpmu->handle_irq,
+ err =3D request_irq(irq, irq_handler,
IRQF_DISABLED | IRQF_NOBALANCING,
"armpmu", NULL);
if (err) {
--=20
1.7.2.dirty
--0016e6d7efd7e78534049baae5b4
Content-Type: application/octet-stream;
name="0001-ARM-perf_event-support-dual-core-with-single-PMU-IRQ.patch"
Content-Disposition: attachment;
filename="0001-ARM-perf_event-support-dual-core-with-single-PMU-IRQ.patch"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gjuywsfn0
RnJvbSA4NGU1OTM2ZjkyODVmYjAzODQ1YWMwNDgwMTQzMDc2MmMxYzliNjBkIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBSYWJpbiBWaW5jZW50IDxyYWJpbi52aW5jZW50QHN0ZXJpY3Nz
b24uY29tPgpEYXRlOiBGcmksIDQgRmViIDIwMTEgMTE6NTk6MjYgKzA1MzAKU3ViamVjdDogW1BB
VENIXSBBUk06IHBlcmZfZXZlbnQ6IHN1cHBvcnQgZHVhbC1jb3JlIHdpdGggc2luZ2xlIFBNVSBJ
UlEKCkRCODUwMCAoZHVhbC1jb3JlKSBoYXMgdGhlIFBNVSBpbnRlcnJ1cHRzIG9mIGJvdGggY29y
ZXMgT1JlZCBpbnRvIG9uZS4gIFN1cHBvcnQKdGhpcyBieSBrZWVwaW5nIHRoZSBpbnRlcnJ1cHQg
ZGlyZWN0ZWQgYXQgQ29yZTAgYW5kIElQSWluZyBDb3JlMSB3aGVuIENvcmUwCnJlY2VpdmVzIHRo
ZSBpbnRlcnJ1cHQgYW5kIGZpbmRzIHRoYXQgaXRzIGNvdW50ZXIgaGFzIG5vdCBvdmVyZmxvd2Vk
LgoKU2lnbmVkLW9mZi1ieTogUmFiaW4gVmluY2VudCA8cmFiaW4udmluY2VudEBzdGVyaWNzc29u
LmNvbT4KLS0tCiBhcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudC5jIHwgICA0OCArKysrKysrKysr
KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0KIDEgZmlsZXMgY2hhbmdlZCwgNDcgaW5z
ZXJ0aW9ucygrKSwgMSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwv
cGVyZl9ldmVudC5jIGIvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnQuYwppbmRleCA1ZWZhMjY0
Li5hOTdlNTBmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudC5jCisrKyBi
L2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50LmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRl
IDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgog
I2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KIAogI2lu
Y2x1ZGUgPGFzbS9jcHV0eXBlLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgpAQCAtMzc3LDkgKzM3
OCw0MCBAQCB2YWxpZGF0ZV9ncm91cChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiAJcmV0dXJu
IDA7CiB9CiAKK3N0YXRpYyBpcnFyZXR1cm5fdCBhcm1wbXVfY29yZTJfaXJxcmV0OworCisvKiBD
YWxsZWQgdmlhIElQSSBvbiB0aGUgc2Vjb25kIGNvcmUgKi8KK3N0YXRpYyB2b2lkIGFybXBtdV9r
aWNrKHZvaWQgKmRhdGEpCit7CisJaW50IGlycSA9IChpbnQpIGRhdGE7CisKKwlhcm1wbXVfY29y
ZTJfaXJxcmV0ID0gYXJtcG11LT5oYW5kbGVfaXJxKGlycSwgTlVMTCk7CisJc21wX3dtYigpOwor
fQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYXJtcG11X3NpbmdsZV9pbnRlcnJ1cHQoaW50IGlycSwg
dm9pZCAqZGV2KQoreworCWlycXJldHVybl90IGlycXJldCA9IGFybXBtdS0+aGFuZGxlX2lycShp
cnEsIGRldik7CisJaW50IGVycjsKKworCWlmIChpcnFyZXQgIT0gSVJRX05PTkUpCisJCXJldHVy
biBpcnFyZXQ7CisKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJZXJyID0gc21wX2NhbGxfZnVuY3Rp
b25fc2luZ2xlKDEsIGFybXBtdV9raWNrLCAodm9pZCAqKSBpcnEsIHRydWUpOworCWxvY2FsX2ly
cV9kaXNhYmxlKCk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gaXJxcmV0OworCisJc21wX3JtYigp
OworCXJldHVybiBhcm1wbXVfY29yZTJfaXJxcmV0OworfQorCiBzdGF0aWMgaW50CiBhcm1wbXVf
cmVzZXJ2ZV9oYXJkd2FyZSh2b2lkKQogeworCWlycV9oYW5kbGVyX3QgaXJxX2hhbmRsZXIgPSBh
cm1wbXUtPmhhbmRsZV9pcnE7CiAJaW50IGksIGVyciA9IC1FTk9ERVYsIGlycTsKIAogCXBtdV9k
ZXZpY2UgPSByZXNlcnZlX3BtdShBUk1fUE1VX0RFVklDRV9DUFUpOwpAQCAtMzk1LDEyICs0Mjcs
MjYgQEAgYXJtcG11X3Jlc2VydmVfaGFyZHdhcmUodm9pZCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJ
fQogCisJLyoKKwkgKiBTb21lIFNvQ3MgaGF2ZSB0aGUgUE1VIElSUSBsaW5lcyBvZiB0d28gY29y
ZXMgd2lyZWQgdG9nZXRoZXIgaW50byBhCisJICogc2luZ2xlIGludGVycnVwdC4gIFN1cHBvcnQg
dGhlc2UgYnkgcG9raW5nIHRoZSBzZWNvbmQgY29yZSB3aXRoIGFuCisJICogSVBJIHdoZW4gaXRz
IGNvdW50ZXJzIG92ZXJmbG93LgorCSAqLworCWlmIChwbXVfZGV2aWNlLT5udW1fcmVzb3VyY2Vz
IDwgbnVtX29ubGluZV9jcHVzKCkpIHsKKwkJaWYgKG51bV9vbmxpbmVfY3B1cygpID4gMikgewor
CQkJcHJfZXJyKCI+MiBjcHVzIG5vdCBzdXBwb3J0ZWQgZm9yIHNpbmdsZS1pcnEgd29ya2Fyb3Vu
ZCIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQlpcnFfaGFuZGxlciA9IGFybXBtdV9z
aW5nbGVfaW50ZXJydXB0OworCX0KKwogCWZvciAoaSA9IDA7IGkgPCBwbXVfZGV2aWNlLT5udW1f
cmVzb3VyY2VzOyArK2kpIHsKIAkJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwbXVfZGV2aWNlLCBp
KTsKIAkJaWYgKGlycSA8IDApCiAJCQljb250aW51ZTsKIAotCQllcnIgPSByZXF1ZXN0X2lycShp
cnEsIGFybXBtdS0+aGFuZGxlX2lycSwKKwkJZXJyID0gcmVxdWVzdF9pcnEoaXJxLCBpcnFfaGFu
ZGxlciwKIAkJCQkgIElSUUZfRElTQUJMRUQgfCBJUlFGX05PQkFMQU5DSU5HLAogCQkJCSAgImFy
bXBtdSIsIE5VTEwpOwogCQlpZiAoZXJyKSB7Ci0tIAoxLjcuMi5kaXJ0eQoK
--0016e6d7efd7e78534049baae5b4--
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2011-02-04 6:29 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-02-04 6:29 [PATCH] ARM: perf_event: support dual-core with single PMU IRQ Rabin Vincent
-- strict thread matches above, loose matches on Subject: below --
2011-02-04 6:29 Rabin Vincent
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).