From: Wei Wang <wei.wang2@amd.com>
To: Dario Faggioli <raistlin@linux.it>
Cc: Tim Deegan <tim@xen.org>,
"allen.m.kay@intel.com" <allen.m.kay@intel.com>,
xen-devel@lists.xensource.com, Keir Fraser <keir@xen.org>,
Jan Beulich <JBeulich@suse.com>
Subject: Re: [PATCHv3] Move IOMMU faults handling into softirq for AMD-Vi.
Date: Wed, 18 Jan 2012 16:53:16 +0100 [thread overview]
Message-ID: <4F16EAEC.5090102@amd.com> (raw)
In-Reply-To: <1326894667.5856.17.camel@Solace>
On 01/18/2012 02:51 PM, Dario Faggioli wrote:
> Hello Wei,
>
> Here it is, and it seems to work for me, but of course I'm not testing
> PPR. If you could give this a go and let me know... I'll repost in a
> separate thread if it happens to be fine.
Hi,
It works on my machine with PPR log enabled.
Thanks,
Wei
Tested-by: Wei Wang <wei.wang2@amd.com>
> Thanks again,
> Dario
>
> --
>
> Move IOMMU faults handling into softirq for AMD-Vi.
>
> Dealing with interrupts from AMD-Vi IOMMU(s) is deferred to a softirq-tasklet,
> 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 low
> level IRQ handler and enabled back in the tasklet body. Notice that this may
> cause the log to overflow, but none of the existing entry will be overwritten.
>
> Signed-off-by: Dario Faggioli<dario.faggioli@citrix.com>
>
> 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 +0000
> +++ b/xen/drivers/passthrough/amd/iommu_init.c Wed Jan 18 13:01:23 2012 +0100
> @@ -32,6 +32,8 @@
>
> static int __initdata nr_amd_iommus;
>
> +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);
> }
>
> +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 != 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 = dev_id;
> - iommu_check_event_log(iommu);
>
> - if ( iommu->ppr_log.buffer != NULL )
> - iommu_check_ppr_log(iommu);
> + spin_lock_irqsave(&iommu->lock, flags);
> +
> + /* Silence interrupts from both event and PPR logging */
> + entry = 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);
> }
>
> 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++;
>
> + softirq_tasklet_init(&amd_iommu_irq_tasklet, do_amd_iommu_irq, 0);
> +
> return 0;
>
> error_out:
>
>
next prev parent reply other threads:[~2012-01-18 15:53 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-01-05 15:10 [PATCHv2 0 of 2] Deal with IOMMU faults in softirq context Dario Faggioli
2012-01-05 15:25 ` [PATCHv2 1 of 2] Move IOMMU faults handling into softirq for VT-d Dario Faggioli
2012-01-17 11:17 ` Keir Fraser
2012-01-05 15:27 ` [PATCHv2 2 of 2] Move IOMMU faults handling into softirq for AMD-Vi Dario Faggioli
2012-01-17 11:17 ` Keir Fraser
2012-01-18 8:53 ` Dario Faggioli
2012-01-18 10:40 ` Wei Wang
2012-01-18 10:59 ` Dario Faggioli
2012-01-18 13:51 ` [PATCHv3] " Dario Faggioli
2012-01-18 15:53 ` Wei Wang [this message]
2012-01-18 15:57 ` Dario Faggioli
-- strict thread matches above, loose matches on Subject: below --
2012-01-18 15:56 Dario Faggioli
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4F16EAEC.5090102@amd.com \
--to=wei.wang2@amd.com \
--cc=JBeulich@suse.com \
--cc=allen.m.kay@intel.com \
--cc=keir@xen.org \
--cc=raistlin@linux.it \
--cc=tim@xen.org \
--cc=xen-devel@lists.xensource.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).