From: Li Zhong <zhong@linux.vnet.ibm.com>
To: kvm-ppc@vger.kernel.org,
PowerPC email list <linuxppc-dev@lists.ozlabs.org>
Cc: agraf@suse.com, Benjamin Herrenschmidt <benh@kernel.crashing.org>,
Paul Mackerras <paulus@samba.org>,
Michael Ellerman <mpe@ellerman.id.au>,
Boqun Feng <boqun.feng@linux.vnet.ibm.com>
Subject: [RFC PATCH 2/2] KVM: PPC: Don't take lock when check irq's resend flag
Date: Mon, 16 May 2016 07:02:13 +0000 [thread overview]
Message-ID: <1463382133.19947.10.camel@TP420> (raw)
In-Reply-To: <1463381898.19947.6.camel@TP420>
It seems that we don't need to take the lock before evaluating irq's
resend flag. What needed is to make sure when we clear the ics's bit
in the icp's resend_map, we don't miss the resend flag of the irqs
that set the bit.
And seems this could be ordered through the barrier in test_and_clear_bit(),
and an newly added wmb when setting irq's resend flag, and icp's resend_map.
Signed-off-by: Li Zhong <zhong@linux.vnet.ibm.com>
---
arch/powerpc/kvm/book3s_hv_rm_xics.c | 14 +++++++-------
arch/powerpc/kvm/book3s_xics.c | 22 +++++++---------------
2 files changed, 14 insertions(+), 22 deletions(-)
diff --git a/arch/powerpc/kvm/book3s_hv_rm_xics.c b/arch/powerpc/kvm/book3s_hv_rm_xics.c
index c3f604e..c3fa386 100644
--- a/arch/powerpc/kvm/book3s_hv_rm_xics.c
+++ b/arch/powerpc/kvm/book3s_hv_rm_xics.c
@@ -39,14 +39,9 @@ static void ics_rm_check_resend(struct kvmppc_xics *xics,
for (i = 0; i < KVMPPC_XICS_IRQ_PER_ICS; i++) {
struct ics_irq_state *state = &ics->irq_state[i];
- arch_spin_lock(&state->lock);
-
- if (!state->resend) {
- arch_spin_unlock(&state->lock);
+ if (!state->resend)
continue;
- }
- arch_spin_unlock(&state->lock);
icp_rm_deliver_irq(xics, icp, state->number);
}
}
@@ -374,8 +369,13 @@ static void icp_rm_deliver_irq(struct kvmppc_xics *xics, struct kvmppc_icp *icp,
* We failed to deliver the interrupt we need to set the
* resend map bit and mark the ICS state as needing a resend
*/
- set_bit(ics->icsid, icp->resend_map);
state->resend = 1;
+ /*
+ * Make sure when checking resend, we don't miss the resend if
+ * resend_map bit is seen and cleared.
+ */
+ smp_wmb();
+ set_bit(ics->icsid, icp->resend_map);
/*
* If the need_resend flag got cleared in the ICP some time
diff --git a/arch/powerpc/kvm/book3s_xics.c b/arch/powerpc/kvm/book3s_xics.c
index b9dbf75..420c4fc 100644
--- a/arch/powerpc/kvm/book3s_xics.c
+++ b/arch/powerpc/kvm/book3s_xics.c
@@ -110,30 +110,17 @@ static void ics_check_resend(struct kvmppc_xics *xics, struct kvmppc_ics *ics,
{
int i;
- unsigned long flags;
-
- local_irq_save(flags);
-
for (i = 0; i < KVMPPC_XICS_IRQ_PER_ICS; i++) {
struct ics_irq_state *state = &ics->irq_state[i];
- arch_spin_lock(&state->lock);
-
- if (!state->resend) {
- arch_spin_unlock(&state->lock);
+ if (!state->resend)
continue;
- }
XICS_DBG("resend %#x prio %#x\n", state->number,
state->priority);
- arch_spin_unlock(&state->lock);
- local_irq_restore(flags);
icp_deliver_irq(xics, icp, state->number);
- local_irq_save(flags);
}
-
- local_irq_restore(flags);
}
static bool write_xive(struct kvmppc_xics *xics, struct kvmppc_ics *ics,
@@ -474,8 +461,13 @@ static void icp_deliver_irq(struct kvmppc_xics *xics, struct kvmppc_icp *icp,
* We failed to deliver the interrupt we need to set the
* resend map bit and mark the ICS state as needing a resend
*/
- set_bit(ics->icsid, icp->resend_map);
state->resend = 1;
+ /*
+ * Make sure when checking resend, we don't miss the resend if
+ * resend_map bit is seen and cleared.
+ */
+ smp_wmb();
+ set_bit(ics->icsid, icp->resend_map);
/*
* If the need_resend flag got cleared in the ICP some time
--
1.8.3.1
WARNING: multiple messages have this Message-ID (diff)
From: Li Zhong <zhong@linux.vnet.ibm.com>
To: kvm-ppc@vger.kernel.org,
PowerPC email list <linuxppc-dev@lists.ozlabs.org>
Cc: agraf@suse.com, Benjamin Herrenschmidt <benh@kernel.crashing.org>,
Paul Mackerras <paulus@samba.org>,
Michael Ellerman <mpe@ellerman.id.au>,
Boqun Feng <boqun.feng@linux.vnet.ibm.com>
Subject: [RFC PATCH 2/2] KVM: PPC: Don't take lock when check irq's resend flag
Date: Mon, 16 May 2016 15:02:13 +0800 [thread overview]
Message-ID: <1463382133.19947.10.camel@TP420> (raw)
In-Reply-To: <1463381898.19947.6.camel@TP420>
It seems that we don't need to take the lock before evaluating irq's
resend flag. What needed is to make sure when we clear the ics's bit
in the icp's resend_map, we don't miss the resend flag of the irqs
that set the bit.
And seems this could be ordered through the barrier in test_and_clear_bit(),
and an newly added wmb when setting irq's resend flag, and icp's resend_map.
Signed-off-by: Li Zhong <zhong@linux.vnet.ibm.com>
---
arch/powerpc/kvm/book3s_hv_rm_xics.c | 14 +++++++-------
arch/powerpc/kvm/book3s_xics.c | 22 +++++++---------------
2 files changed, 14 insertions(+), 22 deletions(-)
diff --git a/arch/powerpc/kvm/book3s_hv_rm_xics.c b/arch/powerpc/kvm/book3s_hv_rm_xics.c
index c3f604e..c3fa386 100644
--- a/arch/powerpc/kvm/book3s_hv_rm_xics.c
+++ b/arch/powerpc/kvm/book3s_hv_rm_xics.c
@@ -39,14 +39,9 @@ static void ics_rm_check_resend(struct kvmppc_xics *xics,
for (i = 0; i < KVMPPC_XICS_IRQ_PER_ICS; i++) {
struct ics_irq_state *state = &ics->irq_state[i];
- arch_spin_lock(&state->lock);
-
- if (!state->resend) {
- arch_spin_unlock(&state->lock);
+ if (!state->resend)
continue;
- }
- arch_spin_unlock(&state->lock);
icp_rm_deliver_irq(xics, icp, state->number);
}
}
@@ -374,8 +369,13 @@ static void icp_rm_deliver_irq(struct kvmppc_xics *xics, struct kvmppc_icp *icp,
* We failed to deliver the interrupt we need to set the
* resend map bit and mark the ICS state as needing a resend
*/
- set_bit(ics->icsid, icp->resend_map);
state->resend = 1;
+ /*
+ * Make sure when checking resend, we don't miss the resend if
+ * resend_map bit is seen and cleared.
+ */
+ smp_wmb();
+ set_bit(ics->icsid, icp->resend_map);
/*
* If the need_resend flag got cleared in the ICP some time
diff --git a/arch/powerpc/kvm/book3s_xics.c b/arch/powerpc/kvm/book3s_xics.c
index b9dbf75..420c4fc 100644
--- a/arch/powerpc/kvm/book3s_xics.c
+++ b/arch/powerpc/kvm/book3s_xics.c
@@ -110,30 +110,17 @@ static void ics_check_resend(struct kvmppc_xics *xics, struct kvmppc_ics *ics,
{
int i;
- unsigned long flags;
-
- local_irq_save(flags);
-
for (i = 0; i < KVMPPC_XICS_IRQ_PER_ICS; i++) {
struct ics_irq_state *state = &ics->irq_state[i];
- arch_spin_lock(&state->lock);
-
- if (!state->resend) {
- arch_spin_unlock(&state->lock);
+ if (!state->resend)
continue;
- }
XICS_DBG("resend %#x prio %#x\n", state->number,
state->priority);
- arch_spin_unlock(&state->lock);
- local_irq_restore(flags);
icp_deliver_irq(xics, icp, state->number);
- local_irq_save(flags);
}
-
- local_irq_restore(flags);
}
static bool write_xive(struct kvmppc_xics *xics, struct kvmppc_ics *ics,
@@ -474,8 +461,13 @@ static void icp_deliver_irq(struct kvmppc_xics *xics, struct kvmppc_icp *icp,
* We failed to deliver the interrupt we need to set the
* resend map bit and mark the ICS state as needing a resend
*/
- set_bit(ics->icsid, icp->resend_map);
state->resend = 1;
+ /*
+ * Make sure when checking resend, we don't miss the resend if
+ * resend_map bit is seen and cleared.
+ */
+ smp_wmb();
+ set_bit(ics->icsid, icp->resend_map);
/*
* If the need_resend flag got cleared in the ICP some time
--
1.8.3.1
next prev parent reply other threads:[~2016-05-16 7:02 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-16 6:58 [RFC PATCH 1/2] KVM: PPC: divide the ics lock into smaller ones for each irq Li Zhong
2016-05-16 6:58 ` Li Zhong
2016-05-16 7:02 ` Li Zhong [this message]
2016-05-16 7:02 ` [RFC PATCH 2/2] KVM: PPC: Don't take lock when check irq's resend flag Li Zhong
2016-06-20 5:27 ` Paul Mackerras
2016-06-20 5:27 ` Paul Mackerras
2016-06-21 2:57 ` Li Zhong
2016-06-21 2:57 ` Li Zhong
2016-06-20 5:25 ` [RFC PATCH 1/2] KVM: PPC: divide the ics lock into smaller ones for each irq Paul Mackerras
2016-06-20 5:25 ` Paul Mackerras
2016-06-21 2:47 ` Li Zhong
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=1463382133.19947.10.camel@TP420 \
--to=zhong@linux.vnet.ibm.com \
--cc=agraf@suse.com \
--cc=benh@kernel.crashing.org \
--cc=boqun.feng@linux.vnet.ibm.com \
--cc=kvm-ppc@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=mpe@ellerman.id.au \
--cc=paulus@samba.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.