diff mbox series

xen/pv: Add PV specific legacy_pic struct to expose legacy IRQs.

Message ID 1553025739-92245-1-git-send-email-jennifer.herbert@citrix.com (mailing list archive)
State New, archived
Headers show
Series xen/pv: Add PV specific legacy_pic struct to expose legacy IRQs. | expand

Commit Message

Jennifer Herbert March 19, 2019, 8:02 p.m. UTC
The ACPI tables doesn't always contain all IRQs for legacy devices
such as RTC.  Since no PIC controller is visible for a PV linux guest,
under Xen, legacy_pic currently defaults to the null_legacy_pic - with
reports no legacy IRQs.  Since the commit "rtc: cmos: Do not assume
irq 8 for rtc when there are no legacy irqs" by Hans de Goede
(commit id: a1e23a42f1bdc00e32fc4869caef12e4e6272f26), the rtc now
incorrectly decides it has no irq it can use, for some hardware.

This patch rectifies the problem by providing a xen legacy_pic
struct, which is much like the null_legacy_pic except that it
reports NR_IRQS_LEGACY irqs.

Signed-off-by: Jennifer Herbert <jennifer.herbert@citrix.com>
---
 arch/x86/xen/enlighten_pv.c | 39 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

Comments

Boris Ostrovsky March 19, 2019, 11:06 p.m. UTC | #1
On 3/19/19 4:02 PM, Jennifer Herbert wrote:
> The ACPI tables doesn't always contain all IRQs for legacy devices
> such as RTC.  Since no PIC controller is visible for a PV linux guest,
> under Xen, legacy_pic currently defaults to the null_legacy_pic - with
> reports no legacy IRQs.  Since the commit "rtc: cmos: Do not assume
> irq 8 for rtc when there are no legacy irqs" by Hans de Goede
> (commit id: a1e23a42f1bdc00e32fc4869caef12e4e6272f26), the rtc now
> incorrectly decides it has no irq it can use, for some hardware.
>
> This patch rectifies the problem by providing a xen legacy_pic
> struct, which is much like the null_legacy_pic except that it
> reports NR_IRQS_LEGACY irqs.

I assume this is for dom0?

Could there be the same problem with PVH dom0? (and if yes then this
should probably go into arch/x86/xen/enlighten.c).

-boris
Jennifer Herbert March 21, 2019, 5:49 p.m. UTC | #2
On 19/03/19 23:06, Boris Ostrovsky wrote:
> On 3/19/19 4:02 PM, Jennifer Herbert wrote:
>> The ACPI tables doesn't always contain all IRQs for legacy devices
>> such as RTC.  Since no PIC controller is visible for a PV linux guest,
>> under Xen, legacy_pic currently defaults to the null_legacy_pic - with
>> reports no legacy IRQs.  Since the commit "rtc: cmos: Do not assume
>> irq 8 for rtc when there are no legacy irqs" by Hans de Goede
>> (commit id: a1e23a42f1bdc00e32fc4869caef12e4e6272f26), the rtc now
>> incorrectly decides it has no irq it can use, for some hardware.
>>
>> This patch rectifies the problem by providing a xen legacy_pic
>> struct, which is much like the null_legacy_pic except that it
>> reports NR_IRQS_LEGACY irqs.
> I assume this is for dom0?
>
> Could there be the same problem with PVH dom0? (and if yes then this
> should probably go into arch/x86/xen/enlighten.c).
>
> -boris
>

I am doing this to fix a problem with dom0.  DomU doesn't seem to have 
an RTC, and so it is unaffected.

I'm not familiar with PVH, but have now done some experiments.  The RTC 
on PVH seems broken - but not quite in the same way as PV. More research 
is needed, however simply doing the same trick I did with PV will not 
fix the issue.

I'll look further into it.

Cheer,

-jenny
Jennifer Herbert March 25, 2019, 2:23 p.m. UTC | #3
On 21/03/19 17:49, Jennifer Herbert wrote:
>
>
> On 19/03/19 23:06, Boris Ostrovsky wrote:
>> On 3/19/19 4:02 PM, Jennifer Herbert wrote:
>>> The ACPI tables doesn't always contain all IRQs for legacy devices
>>> such as RTC.  Since no PIC controller is visible for a PV linux guest,
>>> under Xen, legacy_pic currently defaults to the null_legacy_pic - with
>>> reports no legacy IRQs.  Since the commit "rtc: cmos: Do not assume
>>> irq 8 for rtc when there are no legacy irqs" by Hans de Goede
>>> (commit id: a1e23a42f1bdc00e32fc4869caef12e4e6272f26), the rtc now
>>> incorrectly decides it has no irq it can use, for some hardware.
>>>
>>> This patch rectifies the problem by providing a xen legacy_pic
>>> struct, which is much like the null_legacy_pic except that it
>>> reports NR_IRQS_LEGACY irqs.
>> I assume this is for dom0?
>>
>> Could there be the same problem with PVH dom0? (and if yes then this
>> should probably go into arch/x86/xen/enlighten.c).
>>
>> -boris
>>
>
> I am doing this to fix a problem with dom0.  DomU doesn't seem to have 
> an RTC, and so it is unaffected.
>
> I'm not familiar with PVH, but have now done some experiments. The RTC 
> on PVH seems broken - but not quite in the same way as PV. More 
> research is needed, however simply doing the same trick I did with PV 
> will not fix the issue.
>
> I'll look further into it.
>

The same problem does exist with PVH - however its worse with the 
presence of the IO-APIC, as with my patch it tries to set up with IRQ, 
and fails.  I'm not sure how would be best to deal with this.
However, the RTC seems broken even for machines without the ACPI omission.
I can see fixing it for just PV doesn't seem too nice, but unsure how to 
fix this for PVH.  I'm open to suggestions, but otherwise I'll put this 
on hold.
Paul Durrant March 25, 2019, 2:40 p.m. UTC | #4
> -----Original Message-----
> From: Xen-devel [mailto:xen-devel-bounces@lists.xenproject.org] On Behalf Of Jennifer Herbert
> Sent: 25 March 2019 14:24
> To: Boris Ostrovsky <boris.ostrovsky@oracle.com>; x86@kernel.org; xen-devel@lists.xenproject.org;
> linux-kernel@vger.kernel.org
> Cc: Juergen Gross <jgross@suse.com>; Stefano Stabellini <sstabellini@kernel.org>; Ingo Molnar
> <mingo@redhat.com>; Borislav Petkov <bp@alien8.de>; H. Peter Anvin <hpa@zytor.com>; Thomas Gleixner
> <tglx@linutronix.de>
> Subject: Re: [Xen-devel] [PATCH] xen/pv: Add PV specific legacy_pic struct to expose legacy IRQs.
> 
> 
> 
> On 21/03/19 17:49, Jennifer Herbert wrote:
> >
> >
> > On 19/03/19 23:06, Boris Ostrovsky wrote:
> >> On 3/19/19 4:02 PM, Jennifer Herbert wrote:
> >>> The ACPI tables doesn't always contain all IRQs for legacy devices
> >>> such as RTC.  Since no PIC controller is visible for a PV linux guest,
> >>> under Xen, legacy_pic currently defaults to the null_legacy_pic - with
> >>> reports no legacy IRQs.  Since the commit "rtc: cmos: Do not assume
> >>> irq 8 for rtc when there are no legacy irqs" by Hans de Goede
> >>> (commit id: a1e23a42f1bdc00e32fc4869caef12e4e6272f26), the rtc now
> >>> incorrectly decides it has no irq it can use, for some hardware.
> >>>
> >>> This patch rectifies the problem by providing a xen legacy_pic
> >>> struct, which is much like the null_legacy_pic except that it
> >>> reports NR_IRQS_LEGACY irqs.
> >> I assume this is for dom0?
> >>
> >> Could there be the same problem with PVH dom0? (and if yes then this
> >> should probably go into arch/x86/xen/enlighten.c).
> >>
> >> -boris
> >>
> >
> > I am doing this to fix a problem with dom0.  DomU doesn't seem to have
> > an RTC, and so it is unaffected.
> >
> > I'm not familiar with PVH, but have now done some experiments. The RTC
> > on PVH seems broken - but not quite in the same way as PV. More
> > research is needed, however simply doing the same trick I did with PV
> > will not fix the issue.
> >
> > I'll look further into it.
> >
> 
> The same problem does exist with PVH - however its worse with the
> presence of the IO-APIC, as with my patch it tries to set up with IRQ,
> and fails.  I'm not sure how would be best to deal with this.
> However, the RTC seems broken even for machines without the ACPI omission.
> I can see fixing it for just PV doesn't seem too nice, but unsure how to
> fix this for PVH.  I'm open to suggestions, but otherwise I'll put this
> on hold.

AFAICT from the code in libxl__arch_domain_prepare_config(), PVH domains don't get an RTC, just a local APIC.

  Paul 

> 
> 
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xenproject.org
> https://lists.xenproject.org/mailman/listinfo/xen-devel
Boris Ostrovsky March 27, 2019, 3:02 p.m. UTC | #5
On 3/25/19 10:40 AM, Paul Durrant wrote:
>> -----Original Message-----
>> From: Xen-devel [mailto:xen-devel-bounces@lists.xenproject.org] On Behalf Of Jennifer Herbert
>> Sent: 25 March 2019 14:24
>> To: Boris Ostrovsky <boris.ostrovsky@oracle.com>; x86@kernel.org; xen-devel@lists.xenproject.org;
>> linux-kernel@vger.kernel.org
>> Cc: Juergen Gross <jgross@suse.com>; Stefano Stabellini <sstabellini@kernel.org>; Ingo Molnar
>> <mingo@redhat.com>; Borislav Petkov <bp@alien8.de>; H. Peter Anvin <hpa@zytor.com>; Thomas Gleixner
>> <tglx@linutronix.de>
>> Subject: Re: [Xen-devel] [PATCH] xen/pv: Add PV specific legacy_pic struct to expose legacy IRQs.
>>
>>
>>
>> On 21/03/19 17:49, Jennifer Herbert wrote:
>>>
>>> On 19/03/19 23:06, Boris Ostrovsky wrote:
>>>> On 3/19/19 4:02 PM, Jennifer Herbert wrote:
>>>>> The ACPI tables doesn't always contain all IRQs for legacy devices
>>>>> such as RTC.  Since no PIC controller is visible for a PV linux guest,
>>>>> under Xen, legacy_pic currently defaults to the null_legacy_pic - with
>>>>> reports no legacy IRQs.  Since the commit "rtc: cmos: Do not assume
>>>>> irq 8 for rtc when there are no legacy irqs" by Hans de Goede
>>>>> (commit id: a1e23a42f1bdc00e32fc4869caef12e4e6272f26), the rtc now
>>>>> incorrectly decides it has no irq it can use, for some hardware.
>>>>>
>>>>> This patch rectifies the problem by providing a xen legacy_pic
>>>>> struct, which is much like the null_legacy_pic except that it
>>>>> reports NR_IRQS_LEGACY irqs.
>>>> I assume this is for dom0?
>>>>
>>>> Could there be the same problem with PVH dom0? (and if yes then this
>>>> should probably go into arch/x86/xen/enlighten.c).
>>>>
>>>> -boris
>>>>
>>> I am doing this to fix a problem with dom0.  DomU doesn't seem to have
>>> an RTC, and so it is unaffected.
>>>
>>> I'm not familiar with PVH, but have now done some experiments. The RTC
>>> on PVH seems broken - but not quite in the same way as PV. More
>>> research is needed, however simply doing the same trick I did with PV
>>> will not fix the issue.
>>>
>>> I'll look further into it.
>>>
>> The same problem does exist with PVH - however its worse with the
>> presence of the IO-APIC, as with my patch it tries to set up with IRQ,
>> and fails.  I'm not sure how would be best to deal with this.
>> However, the RTC seems broken even for machines without the ACPI omission.
>> I can see fixing it for just PV doesn't seem too nice, but unsure how to
>> fix this for PVH.  I'm open to suggestions, but otherwise I'll put this
>> on hold.
> AFAICT from the code in libxl__arch_domain_prepare_config(), PVH domains don't get an RTC, just a local APIC.
>


That's true for domU but not for PVH dom0 I believe. Roger?

-boris
diff mbox series

Patch

diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c
index c54a493..7644bdf 100644
--- a/arch/x86/xen/enlighten_pv.c
+++ b/arch/x86/xen/enlighten_pv.c
@@ -33,6 +33,7 @@ 
 #include <linux/gfp.h>
 #include <linux/edd.h>
 #include <linux/frame.h>
+#include <linux/irq.h>
 
 #include <xen/xen.h>
 #include <xen/events.h>
@@ -49,6 +50,7 @@ 
 #include <xen/acpi.h>
 
 #include <asm/paravirt.h>
+#include <asm/i8259.h>
 #include <asm/apic.h>
 #include <asm/page.h>
 #include <asm/xen/pci.h>
@@ -1188,6 +1190,41 @@  static void __init xen_dom0_set_legacy_features(void)
 	x86_platform.legacy.rtc = 1;
 }
 
+/*
+ * The ACPI tables doesn't always contain all IRQ's for legacy devices
+ * such as RTC.  Since no PIC controller is visible, we'd otherwise
+ * default to the null_legacy_pic - with no legacy IRQs.  To allow drivers
+ * to use these IRQs despite this, provide a xen specific legacy_pic
+ * structure, which is noop, other then reporting NR_IRQS_LEGACY irqs.
+ */
+
+static void xen_legacy_pic_noop(void) { };
+static void xen_legacy_pic_uint_noop(unsigned int unused) { };
+static void xen_legacy_pic_int_noop(int unused) { };
+static int xen_legacy_pic_irq_pending_noop(unsigned int irq)
+{
+	return 0;
+}
+
+static int xen_legacy_pic_probe(void)
+{
+	pr_info("Using Xen legacy PIC\n");
+	return nr_legacy_irqs();
+}
+
+struct legacy_pic xen_legacy_pic = {
+	.nr_legacy_irqs = NR_IRQS_LEGACY,
+	.chip = &dummy_irq_chip,
+	.mask = xen_legacy_pic_uint_noop,
+	.unmask = xen_legacy_pic_uint_noop,
+	.mask_all = xen_legacy_pic_noop,
+	.restore_mask = xen_legacy_pic_noop,
+	.init = xen_legacy_pic_int_noop,
+	.probe = xen_legacy_pic_probe,
+	.irq_pending = xen_legacy_pic_irq_pending_noop,
+	.make_irq = xen_legacy_pic_uint_noop,
+};
+
 /* First C function to be called on Xen boot */
 asmlinkage __visible void __init xen_start_kernel(void)
 {
@@ -1267,6 +1304,8 @@  asmlinkage __visible void __init xen_start_kernel(void)
 
 	xen_init_capabilities();
 
+	legacy_pic = &xen_legacy_pic;
+
 #ifdef CONFIG_X86_LOCAL_APIC
 	/*
 	 * set up the basic apic ops.