From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dario Faggioli Subject: [PATCHv3] Move IOMMU faults handling into softirq for AMD-Vi. Date: Wed, 18 Jan 2012 16:56:21 +0100 Message-ID: <1326902181.5856.19.camel@Solace> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="===============5030118704337303872==" Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Keir Fraser Cc: Wei Wang , "allen.m.kay@intel.com" , xen-devel@lists.xensource.com, Tim Deegan , Jan Beulich List-Id: xen-devel@lists.xenproject.org --===============5030118704337303872== Content-Type: multipart/signed; micalg="pgp-sha1"; protocol="application/pgp-signature"; boundary="=-6qpda0J42k3/VqT79iK9" --=-6qpda0J42k3/VqT79iK9 Content-Type: multipart/mixed; boundary="=-ELDboK5eggB2H88FJXyb" --=-ELDboK5eggB2H88FJXyb Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Dealing with interrupts from AMD-Vi IOMMU(s) is deferred to a softirq-taskl= et, raised by the actual IRQ handler. To avoid more interrupts being generated (because of further faults), they must be masked in the IOMMU within the lo= w level IRQ handler and enabled back in the tasklet body. Notice that this ma= y cause the log to overflow, but none of the existing entry will be overwritt= en. =20 Signed-off-by: Dario Faggioli diff -r 15ab61865ecb xen/drivers/passthrough/amd/iommu_init.c --- a/xen/drivers/passthrough/amd/iommu_init.c Tue Jan 17 12:40:52 2012 +00= 00 +++ b/xen/drivers/passthrough/amd/iommu_init.c Wed Jan 18 13:01:23 2012 +01= 00 @@ -32,6 +32,8 @@ =20 static int __initdata nr_amd_iommus; =20 +static struct tasklet amd_iommu_irq_tasklet; + unsigned short ivrs_bdf_entries; static struct radix_tree_root ivrs_maps; struct list_head amd_iommu_head; @@ -689,14 +691,48 @@ static void iommu_check_ppr_log(struct a spin_unlock_irqrestore(&iommu->lock, flags); } =20 +static void do_amd_iommu_irq(unsigned long data) +{ + struct amd_iommu *iommu; + + if ( !iommu_found() ) + { + AMD_IOMMU_DEBUG("no device found, something must be very wrong!\n"= ); + return; + } + + /* + * No matter from where the interrupt came from, check all the + * IOMMUs present in the system. This allows for having just one + * tasklet (instead of one per each IOMMUs). + */ + for_each_amd_iommu ( iommu ) { + iommu_check_event_log(iommu); + + if ( iommu->ppr_log.buffer !=3D NULL ) + iommu_check_ppr_log(iommu); + } +} + static void iommu_interrupt_handler(int irq, void *dev_id, struct cpu_user_regs *regs) { + u32 entry; + unsigned long flags; struct amd_iommu *iommu =3D dev_id; - iommu_check_event_log(iommu); =20 - if ( iommu->ppr_log.buffer !=3D NULL ) - iommu_check_ppr_log(iommu); + spin_lock_irqsave(&iommu->lock, flags); + + /* Silence interrupts from both event and PPR logging */ + entry =3D readl(iommu->mmio_base + IOMMU_STATUS_MMIO_OFFSET); + iommu_clear_bit(&entry, IOMMU_STATUS_EVENT_LOG_INT_SHIFT); + iommu_clear_bit(&entry, IOMMU_STATUS_PPR_LOG_INT_SHIFT); + writel(entry, iommu->mmio_base+IOMMU_STATUS_MMIO_OFFSET); + + spin_unlock_irqrestore(&iommu->lock, flags); + + /* It is the tasklet that will clear the logs and re-enable interrupts= */ + tasklet_schedule(&amd_iommu_irq_tasklet); } =20 static int __init set_iommu_interrupt_handler(struct amd_iommu *iommu) @@ -876,6 +912,8 @@ static int __init amd_iommu_init_one(str printk("AMD-Vi: IOMMU %d Enabled.\n", nr_amd_iommus ); nr_amd_iommus++; =20 + softirq_tasklet_init(&amd_iommu_irq_tasklet, do_amd_iommu_irq, 0); + return 0; =20 error_out: --=20 <> (Raistlin Majere) ------------------------------------------------------------------- Dario Faggioli, http://retis.sssup.it/people/faggioli Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK) PhD Candidate, ReTiS Lab, Scuola Superiore Sant'Anna, Pisa (Italy) --=-ELDboK5eggB2H88FJXyb Content-Disposition: attachment; filename="iommu-fault-tasklet_amd.patch" Content-Transfer-Encoding: base64 Content-Type: text/x-patch; name="iommu-fault-tasklet_amd.patch"; charset="UTF-8" IyBIRyBjaGFuZ2VzZXQgcGF0Y2gNCiMgUGFyZW50IDE1YWI2MTg2NWVjYmQxNDZmNmNlNjVmYmVh NWJmNDliZmQ5YzZjYjENCk1vdmUgSU9NTVUgZmF1bHRzIGhhbmRsaW5nIGludG8gc29mdGlycSBm b3IgQU1ELVZpLg0KICAgICAgICAgICAgICAgICAgDQpEZWFsaW5nIHdpdGggaW50ZXJydXB0cyBm cm9tIEFNRC1WaSBJT01NVShzKSBpcyBkZWZlcnJlZCB0byBhIHNvZnRpcnEtdGFza2xldCwNCnJh aXNlZCBieSB0aGUgYWN0dWFsIElSUSBoYW5kbGVyLiBUbyBhdm9pZCBtb3JlIGludGVycnVwdHMg YmVpbmcgZ2VuZXJhdGVkDQooYmVjYXVzZSBvZiBmdXJ0aGVyIGZhdWx0cyksIHRoZXkgbXVzdCBi ZSBtYXNrZWQgaW4gdGhlIElPTU1VIHdpdGhpbiB0aGUgbG93DQpsZXZlbCBJUlEgaGFuZGxlciBh bmQgZW5hYmxlZCBiYWNrIGluIHRoZSB0YXNrbGV0IGJvZHkuIE5vdGljZSB0aGF0IHRoaXMgbWF5 DQpjYXVzZSB0aGUgbG9nIHRvIG92ZXJmbG93LCBidXQgbm9uZSBvZiB0aGUgZXhpc3RpbmcgZW50 cnkgd2lsbCBiZSBvdmVyd3JpdHRlbi4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IA0KU2lnbmVkLW9mZi1ieTogRGFyaW8gRmFnZ2lvbGkgPGRhcmlvLmZhZ2dpb2xpQGNpdHJpeC5j b20+DQoNCmRpZmYgLXIgMTVhYjYxODY1ZWNiIHhlbi9kcml2ZXJzL3Bhc3N0aHJvdWdoL2FtZC9p b21tdV9pbml0LmMNCi0tLSBhL3hlbi9kcml2ZXJzL3Bhc3N0aHJvdWdoL2FtZC9pb21tdV9pbml0 LmMJVHVlIEphbiAxNyAxMjo0MDo1MiAyMDEyICswMDAwDQorKysgYi94ZW4vZHJpdmVycy9wYXNz dGhyb3VnaC9hbWQvaW9tbXVfaW5pdC5jCVdlZCBKYW4gMTggMTM6MDE6MjMgMjAxMiArMDEwMA0K QEAgLTMyLDYgKzMyLDggQEANCiANCiBzdGF0aWMgaW50IF9faW5pdGRhdGEgbnJfYW1kX2lvbW11 czsNCiANCitzdGF0aWMgc3RydWN0IHRhc2tsZXQgYW1kX2lvbW11X2lycV90YXNrbGV0Ow0KKw0K IHVuc2lnbmVkIHNob3J0IGl2cnNfYmRmX2VudHJpZXM7DQogc3RhdGljIHN0cnVjdCByYWRpeF90 cmVlX3Jvb3QgaXZyc19tYXBzOw0KIHN0cnVjdCBsaXN0X2hlYWQgYW1kX2lvbW11X2hlYWQ7DQpA QCAtNjg5LDE0ICs2OTEsNDggQEAgc3RhdGljIHZvaWQgaW9tbXVfY2hlY2tfcHByX2xvZyhzdHJ1 Y3QgYQ0KICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOw0K IH0NCiANCitzdGF0aWMgdm9pZCBkb19hbWRfaW9tbXVfaXJxKHVuc2lnbmVkIGxvbmcgZGF0YSkN Cit7DQorICAgIHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11Ow0KKw0KKyAgICBpZiAoICFpb21tdV9m b3VuZCgpICkNCisgICAgew0KKyAgICAgICAgQU1EX0lPTU1VX0RFQlVHKCJubyBkZXZpY2UgZm91 bmQsIHNvbWV0aGluZyBtdXN0IGJlIHZlcnkgd3JvbmchXG4iKTsNCisgICAgICAgIHJldHVybjsN CisgICAgfQ0KKw0KKyAgICAvKg0KKyAgICAgKiBObyBtYXR0ZXIgZnJvbSB3aGVyZSB0aGUgaW50 ZXJydXB0IGNhbWUgZnJvbSwgY2hlY2sgYWxsIHRoZQ0KKyAgICAgKiBJT01NVXMgcHJlc2VudCBp biB0aGUgc3lzdGVtLiBUaGlzIGFsbG93cyBmb3IgaGF2aW5nIGp1c3Qgb25lDQorICAgICAqIHRh c2tsZXQgKGluc3RlYWQgb2Ygb25lIHBlciBlYWNoIElPTU1VcykuDQorICAgICAqLw0KKyAgICBm b3JfZWFjaF9hbWRfaW9tbXUgKCBpb21tdSApIHsNCisgICAgICAgIGlvbW11X2NoZWNrX2V2ZW50 X2xvZyhpb21tdSk7DQorDQorICAgICAgICBpZiAoIGlvbW11LT5wcHJfbG9nLmJ1ZmZlciAhPSBO VUxMICkNCisgICAgICAgICAgICBpb21tdV9jaGVja19wcHJfbG9nKGlvbW11KTsNCisgICAgfQ0K K30NCisNCiBzdGF0aWMgdm9pZCBpb21tdV9pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lk ICpkZXZfaWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNw dV91c2VyX3JlZ3MgKnJlZ3MpDQogew0KKyAgICB1MzIgZW50cnk7DQorICAgIHVuc2lnbmVkIGxv bmcgZmxhZ3M7DQogICAgIHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11ID0gZGV2X2lkOw0KLSAgICBp b21tdV9jaGVja19ldmVudF9sb2coaW9tbXUpOw0KIA0KLSAgICBpZiAoIGlvbW11LT5wcHJfbG9n LmJ1ZmZlciAhPSBOVUxMICkNCi0gICAgICAgIGlvbW11X2NoZWNrX3Bwcl9sb2coaW9tbXUpOw0K KyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsNCisNCisgICAgLyog U2lsZW5jZSBpbnRlcnJ1cHRzIGZyb20gYm90aCBldmVudCBhbmQgUFBSIGxvZ2dpbmcgKi8NCisg ICAgZW50cnkgPSByZWFkbChpb21tdS0+bW1pb19iYXNlICsgSU9NTVVfU1RBVFVTX01NSU9fT0ZG U0VUKTsNCisgICAgaW9tbXVfY2xlYXJfYml0KCZlbnRyeSwgSU9NTVVfU1RBVFVTX0VWRU5UX0xP R19JTlRfU0hJRlQpOw0KKyAgICBpb21tdV9jbGVhcl9iaXQoJmVudHJ5LCBJT01NVV9TVEFUVVNf UFBSX0xPR19JTlRfU0hJRlQpOw0KKyAgICB3cml0ZWwoZW50cnksIGlvbW11LT5tbWlvX2Jhc2Ur SU9NTVVfU1RBVFVTX01NSU9fT0ZGU0VUKTsNCisNCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9y ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsNCisNCisgICAgLyogSXQgaXMgdGhlIHRhc2tsZXQgdGhh dCB3aWxsIGNsZWFyIHRoZSBsb2dzIGFuZCByZS1lbmFibGUgaW50ZXJydXB0cyAqLw0KKyAgICB0 YXNrbGV0X3NjaGVkdWxlKCZhbWRfaW9tbXVfaXJxX3Rhc2tsZXQpOw0KIH0NCiANCiBzdGF0aWMg aW50IF9faW5pdCBzZXRfaW9tbXVfaW50ZXJydXB0X2hhbmRsZXIoc3RydWN0IGFtZF9pb21tdSAq aW9tbXUpDQpAQCAtODc2LDYgKzkxMiw4IEBAIHN0YXRpYyBpbnQgX19pbml0IGFtZF9pb21tdV9p bml0X29uZShzdHINCiAgICAgcHJpbnRrKCJBTUQtVmk6IElPTU1VICVkIEVuYWJsZWQuXG4iLCBu cl9hbWRfaW9tbXVzICk7DQogICAgIG5yX2FtZF9pb21tdXMrKzsNCiANCisgICAgc29mdGlycV90 YXNrbGV0X2luaXQoJmFtZF9pb21tdV9pcnFfdGFza2xldCwgZG9fYW1kX2lvbW11X2lycSwgMCk7 DQorDQogICAgIHJldHVybiAwOw0KIA0KIGVycm9yX291dDoNCg== --=-ELDboK5eggB2H88FJXyb-- --=-6qpda0J42k3/VqT79iK9 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: This is a digitally signed message part Content-Transfer-Encoding: 7bit -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iEYEABECAAYFAk8W66UACgkQk4XaBE3IOsRMuwCaAyeXyLeQRO8an7HK+x3DdnQ7 c+sAnia136T0udjxhbientXncQahUARL =bvqO -----END PGP SIGNATURE----- --=-6qpda0J42k3/VqT79iK9-- --===============5030118704337303872== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --===============5030118704337303872==--