This is needed to map kvmppc_xive_set_xive() behavior
to kvmppc_xics_set_xive().
As we store the server, kvmppc_xive_get_xive() can return
the good value and we can also allow kvmppc_xive_int_on().
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
---
arch/powerpc/kvm/book3s_xive.c | 20 ++++++++------------
1 file changed, 8 insertions(+), 12 deletions(-)
@@ -646,14 +650,6 @@ int kvmppc_xive_int_on(struct kvm *kvm, u32 irq)pr_devel("int_on(irq=0x%x)\n",irq);-/*-*Checkifinterruptwasnottargetted-*/-if(state->act_priority==MASKED){-pr_devel("int_on on untargetted interrupt\n");-return-EINVAL;-}-/* If saved_priority is 0xff, do nothing */if(state->saved_priority==MASKED)return0;
From: Benjamin Herrenschmidt <benh@kernel.crashing.org> Date: 2017-11-23 20:38:33
On Thu, 2017-11-23 at 10:06 +0100, Laurent Vivier wrote:
quoted hunk
This is needed to map kvmppc_xive_set_xive() behavior
to kvmppc_xics_set_xive().
As we store the server, kvmppc_xive_get_xive() can return
the good value and we can also allow kvmppc_xive_int_on().
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
---
arch/powerpc/kvm/book3s_xive.c | 20 ++++++++------------
1 file changed, 8 insertions(+), 12 deletions(-)
That leads to another problem with this code. My current implementation
is such that is a target queue is full, it will pick another target.
But here, we still update act_server to the passed-in server and
not the actual target...
quoted hunk
/*
* Perform the final unmasking of the interrupt source
@@ -646,14 +650,6 @@ int kvmppc_xive_int_on(struct kvm *kvm, u32 irq) pr_devel("int_on(irq=0x%x)\n", irq);- /*- * Check if interrupt was not targetted- */- if (state->act_priority == MASKED) {- pr_devel("int_on on untargetted interrupt\n");- return -EINVAL;- }-
So my thinking here was that act_priority was never going to be MASKED
except if the interrupt had never been targetted anywhere at machine
startup time. Thus if act_priority is masked, the act_server field
cannot be trusted.
/* If saved_priority is 0xff, do nothing */
if (state->saved_priority == MASKED)
return 0;
From: Paul Mackerras <hidden> Date: 2017-12-05 03:05:24
On Fri, Nov 24, 2017 at 07:38:13AM +1100, Benjamin Herrenschmidt wrote:
On Thu, 2017-11-23 at 10:06 +0100, Laurent Vivier wrote:
quoted
This is needed to map kvmppc_xive_set_xive() behavior
to kvmppc_xics_set_xive().
As we store the server, kvmppc_xive_get_xive() can return
the good value and we can also allow kvmppc_xive_int_on().
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
---
arch/powerpc/kvm/book3s_xive.c | 20 ++++++++------------
1 file changed, 8 insertions(+), 12 deletions(-)
That leads to another problem with this code. My current implementation
is such that is a target queue is full, it will pick another target.
But here, we still update act_server to the passed-in server and
not the actual target...
So does that amount to a NAK?
quoted
/*
* Perform the final unmasking of the interrupt source
@@ -646,14 +650,6 @@ int kvmppc_xive_int_on(struct kvm *kvm, u32 irq) pr_devel("int_on(irq=0x%x)\n", irq);- /*- * Check if interrupt was not targetted- */- if (state->act_priority == MASKED) {- pr_devel("int_on on untargetted interrupt\n");- return -EINVAL;- }-
So my thinking here was that act_priority was never going to be MASKED
except if the interrupt had never been targetted anywhere at machine
startup time. Thus if act_priority is masked, the act_server field
cannot be trusted.
quoted
/* If saved_priority is 0xff, do nothing */
if (state->saved_priority == MASKED)
return 0;
How do you think this should be fixed?
Laurent, are you reworking the patch at the moment?
Paul.
On Fri, Nov 24, 2017 at 07:38:13AM +1100, Benjamin Herrenschmidt wrote:
quoted
On Thu, 2017-11-23 at 10:06 +0100, Laurent Vivier wrote:
quoted
This is needed to map kvmppc_xive_set_xive() behavior
to kvmppc_xics_set_xive().
As we store the server, kvmppc_xive_get_xive() can return
the good value and we can also allow kvmppc_xive_int_on().
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
---
arch/powerpc/kvm/book3s_xive.c | 20 ++++++++------------
1 file changed, 8 insertions(+), 12 deletions(-)
That leads to another problem with this code. My current implementation
is such that is a target queue is full, it will pick another target.
But here, we still update act_server to the passed-in server and
not the actual target...
So does that amount to a NAK?
quoted
quoted
/*
* Perform the final unmasking of the interrupt source
@@ -646,14 +650,6 @@ int kvmppc_xive_int_on(struct kvm *kvm, u32 irq) pr_devel("int_on(irq=0x%x)\n", irq);- /*- * Check if interrupt was not targetted- */- if (state->act_priority == MASKED) {- pr_devel("int_on on untargetted interrupt\n");- return -EINVAL;- }-
So my thinking here was that act_priority was never going to be MASKED
except if the interrupt had never been targetted anywhere at machine
startup time. Thus if act_priority is masked, the act_server field
cannot be trusted.
quoted
/* If saved_priority is 0xff, do nothing */
if (state->saved_priority == MASKED)
return 0;
How do you think this should be fixed?
Laurent, are you reworking the patch at the moment?
Not for the moment.
The easy way is to forbid to set interrupt value to the MASKED one with
xive_set_xive. I think it's allowed by the specs.
I've got another bug in the XICS emulation: when we migrate a guest
under stress, the pending interrupt is lost and the guest hangs on the
destination side. I'm trying to understand why.
Thanks,
Laurent