Mailing List Archive

[PATCH v2 3/5] xen/events: only register debug interrupt for 2-level events
xen_debug_interrupt() is specific to 2-level event handling. So don't
register it with fifo event handling being active.

Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
---
V2:
- rename fifo_events variable to xen_fifo_events (Jan Beulich)
---
arch/x86/xen/smp.c | 19 +++++++++++--------
arch/x86/xen/xen-ops.h | 2 ++
drivers/xen/events/events_base.c | 10 ++++++----
3 files changed, 19 insertions(+), 12 deletions(-)

diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c
index 2097fa0ebdb5..c1b2f764b29a 100644
--- a/arch/x86/xen/smp.c
+++ b/arch/x86/xen/smp.c
@@ -88,14 +88,17 @@ int xen_smp_intr_init(unsigned int cpu)
per_cpu(xen_callfunc_irq, cpu).irq = rc;
per_cpu(xen_callfunc_irq, cpu).name = callfunc_name;

- debug_name = kasprintf(GFP_KERNEL, "debug%d", cpu);
- rc = bind_virq_to_irqhandler(VIRQ_DEBUG, cpu, xen_debug_interrupt,
- IRQF_PERCPU | IRQF_NOBALANCING,
- debug_name, NULL);
- if (rc < 0)
- goto fail;
- per_cpu(xen_debug_irq, cpu).irq = rc;
- per_cpu(xen_debug_irq, cpu).name = debug_name;
+ if (!xen_fifo_events) {
+ debug_name = kasprintf(GFP_KERNEL, "debug%d", cpu);
+ rc = bind_virq_to_irqhandler(VIRQ_DEBUG, cpu,
+ xen_debug_interrupt,
+ IRQF_PERCPU | IRQF_NOBALANCING,
+ debug_name, NULL);
+ if (rc < 0)
+ goto fail;
+ per_cpu(xen_debug_irq, cpu).irq = rc;
+ per_cpu(xen_debug_irq, cpu).name = debug_name;
+ }

callfunc_name = kasprintf(GFP_KERNEL, "callfuncsingle%d", cpu);
rc = bind_ipi_to_irqhandler(XEN_CALL_FUNCTION_SINGLE_VECTOR,
diff --git a/arch/x86/xen/xen-ops.h b/arch/x86/xen/xen-ops.h
index 45d556f71858..9546c3384c75 100644
--- a/arch/x86/xen/xen-ops.h
+++ b/arch/x86/xen/xen-ops.h
@@ -29,6 +29,8 @@ extern struct start_info *xen_start_info;
extern struct shared_info xen_dummy_shared_info;
extern struct shared_info *HYPERVISOR_shared_info;

+extern bool xen_fifo_events;
+
void xen_setup_mfn_list_list(void);
void xen_build_mfn_list_list(void);
void xen_setup_machphys_mapping(void);
diff --git a/drivers/xen/events/events_base.c b/drivers/xen/events/events_base.c
index 1c25580c7691..6038c4c35db5 100644
--- a/drivers/xen/events/events_base.c
+++ b/drivers/xen/events/events_base.c
@@ -2050,8 +2050,8 @@ void xen_setup_callback_vector(void) {}
static inline void xen_alloc_callback_vector(void) {}
#endif

-static bool fifo_events = true;
-module_param(fifo_events, bool, 0);
+bool xen_fifo_events = true;
+module_param_named(fifo_events, xen_fifo_events, bool, 0);

static int xen_evtchn_cpu_prepare(unsigned int cpu)
{
@@ -2080,10 +2080,12 @@ void __init xen_init_IRQ(void)
int ret = -EINVAL;
evtchn_port_t evtchn;

- if (fifo_events)
+ if (xen_fifo_events)
ret = xen_evtchn_fifo_init();
- if (ret < 0)
+ if (ret < 0) {
xen_evtchn_2l_init();
+ xen_fifo_events = false;
+ }

xen_cpu_init_eoi(smp_processor_id());

--
2.26.2
Re: [PATCH v2 3/5] xen/events: only register debug interrupt for 2-level events [ In reply to ]
On 22.10.2020 11:49, Juergen Gross wrote:
> @@ -2080,10 +2080,12 @@ void __init xen_init_IRQ(void)
> int ret = -EINVAL;
> evtchn_port_t evtchn;
>
> - if (fifo_events)
> + if (xen_fifo_events)
> ret = xen_evtchn_fifo_init();
> - if (ret < 0)
> + if (ret < 0) {
> xen_evtchn_2l_init();
> + xen_fifo_events = false;
> + }

Another note: While it may not matter right here, maybe better
first set the variable and the call the function?

Jan
Re: [PATCH v2 3/5] xen/events: only register debug interrupt for 2-level events [ In reply to ]
On 22.10.20 12:35, Jan Beulich wrote:
> On 22.10.2020 11:49, Juergen Gross wrote:
>> @@ -2080,10 +2080,12 @@ void __init xen_init_IRQ(void)
>> int ret = -EINVAL;
>> evtchn_port_t evtchn;
>>
>> - if (fifo_events)
>> + if (xen_fifo_events)
>> ret = xen_evtchn_fifo_init();
>> - if (ret < 0)
>> + if (ret < 0) {
>> xen_evtchn_2l_init();
>> + xen_fifo_events = false;
>> + }
>
> Another note: While it may not matter right here, maybe better
> first set the variable and the call the function?

I don't think this is really important, TBH.

This code is executed before other cpus are up and we'd have major
other problems in case the sequence would really matter here.


Juergen
Re: [PATCH v2 3/5] xen/events: only register debug interrupt for 2-level events [ In reply to ]
On 22.10.2020 15:09, Jürgen Groß wrote:
> On 22.10.20 12:35, Jan Beulich wrote:
>> On 22.10.2020 11:49, Juergen Gross wrote:
>>> @@ -2080,10 +2080,12 @@ void __init xen_init_IRQ(void)
>>> int ret = -EINVAL;
>>> evtchn_port_t evtchn;
>>>
>>> - if (fifo_events)
>>> + if (xen_fifo_events)
>>> ret = xen_evtchn_fifo_init();
>>> - if (ret < 0)
>>> + if (ret < 0) {
>>> xen_evtchn_2l_init();
>>> + xen_fifo_events = false;
>>> + }
>>
>> Another note: While it may not matter right here, maybe better
>> first set the variable and the call the function?
>
> I don't think this is really important, TBH.
>
> This code is executed before other cpus are up and we'd have major
> other problems in case the sequence would really matter here.

Fair enough; I was thinking in particular that it ought to be
legitimate for xen_evtchn_2l_init() to BUG_ON(xen_fifo_events).

Jan