qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Alexander Graf <agraf@suse.de>
To: qemu-devel qemu-devel <qemu-devel@nongnu.org>
Cc: Blue Swirl <blauwirbel@gmail.com>,
	"qemu-ppc@nongnu.org List" <qemu-ppc@nongnu.org>,
	Aurelien Jarno <aurelien@aurel32.net>,
	David Gibson <david@gibson.dropbear.id.au>
Subject: [Qemu-devel] [PATCH 25/34] pseries: Remove unnecessary locking from PAPR hash table hcalls
Date: Thu,  4 Oct 2012 15:56:47 +0200	[thread overview]
Message-ID: <1349359016-13107-26-git-send-email-agraf@suse.de> (raw)
In-Reply-To: <1349359016-13107-1-git-send-email-agraf@suse.de>

From: David Gibson <david@gibson.dropbear.id.au>

In the paravirtualized environment provided by PAPR, there is a standard
locking scheme so that hypercalls updating the hash page table from
different guest threads don't corrupt the haah table state.  We implement
this HVLOCK bit in out page table hypercalls.  However, it is not necessary
in our case, since the hypercalls all run in the qemu environment under the
big qemu lock.

Therefore, this patch removes the locking code.  This has the additional
advantage of freeing up a hash PTE bit which will be useful for migration
support.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Alexander Graf <agraf@suse.de>
---
 hw/spapr_hcall.c |   42 ++++--------------------------------------
 1 files changed, 4 insertions(+), 38 deletions(-)

diff --git a/hw/spapr_hcall.c b/hw/spapr_hcall.c
index 2df94d1..826ca67 100644
--- a/hw/spapr_hcall.c
+++ b/hw/spapr_hcall.c
@@ -39,22 +39,6 @@
 #define HPTE_V_1TB_SEG          0x4000000000000000ULL
 #define HPTE_V_VRMA_MASK        0x4001ffffff000000ULL
 
-#define HPTE_V_HVLOCK           0x40ULL
-
-static inline int lock_hpte(void *hpte, target_ulong bits)
-{
-    uint64_t pteh;
-
-    pteh = ldq_p(hpte);
-
-    /* We're protected by qemu's global lock here */
-    if (pteh & bits) {
-        return 0;
-    }
-    stq_p(hpte, pteh | HPTE_V_HVLOCK);
-    return 1;
-}
-
 static target_ulong compute_tlbie_rb(target_ulong v, target_ulong r,
                                      target_ulong pte_index)
 {
@@ -151,8 +135,7 @@ static target_ulong h_enter(CPUPPCState *env, sPAPREnvironment *spapr,
             if (i == 8) {
                 return H_PTEG_FULL;
             }
-            if (((ldq_p(hpte) & HPTE_V_VALID) == 0) &&
-                lock_hpte(hpte, HPTE_V_HVLOCK | HPTE_V_VALID)) {
+            if ((ldq_p(hpte) & HPTE_V_VALID) == 0) {
                 break;
             }
             hpte += HASH_PTE_SIZE_64;
@@ -160,7 +143,7 @@ static target_ulong h_enter(CPUPPCState *env, sPAPREnvironment *spapr,
     } else {
         i = 0;
         hpte = env->external_htab + (pte_index * HASH_PTE_SIZE_64);
-        if (!lock_hpte(hpte, HPTE_V_HVLOCK | HPTE_V_VALID)) {
+        if (ldq_p(hpte) & HPTE_V_VALID) {
             return H_PTEG_FULL;
         }
     }
@@ -168,7 +151,6 @@ static target_ulong h_enter(CPUPPCState *env, sPAPREnvironment *spapr,
     /* eieio();  FIXME: need some sort of barrier for smp? */
     stq_p(hpte, pteh);
 
-    assert(!(ldq_p(hpte) & HPTE_V_HVLOCK));
     args[0] = pte_index + i;
     return H_SUCCESS;
 }
@@ -193,11 +175,6 @@ static target_ulong remove_hpte(CPUPPCState *env, target_ulong ptex,
     }
 
     hpte = env->external_htab + (ptex * HASH_PTE_SIZE_64);
-    while (!lock_hpte(hpte, HPTE_V_HVLOCK)) {
-        /* We have no real concurrency in qemu soft-emulation, so we
-         * will never actually have a contested lock */
-        assert(0);
-    }
 
     v = ldq_p(hpte);
     r = ldq_p(hpte + (HASH_PTE_SIZE_64/2));
@@ -205,16 +182,13 @@ static target_ulong remove_hpte(CPUPPCState *env, target_ulong ptex,
     if ((v & HPTE_V_VALID) == 0 ||
         ((flags & H_AVPN) && (v & ~0x7fULL) != avpn) ||
         ((flags & H_ANDCOND) && (v & avpn) != 0)) {
-        stq_p(hpte, v & ~HPTE_V_HVLOCK);
-        assert(!(ldq_p(hpte) & HPTE_V_HVLOCK));
         return REMOVE_NOT_FOUND;
     }
-    *vp = v & ~HPTE_V_HVLOCK;
+    *vp = v;
     *rp = r;
     stq_p(hpte, 0);
     rb = compute_tlbie_rb(v, r, ptex);
     ppc_tlb_invalidate_one(env, rb);
-    assert(!(ldq_p(hpte) & HPTE_V_HVLOCK));
     return REMOVE_SUCCESS;
 }
 
@@ -324,19 +298,12 @@ static target_ulong h_protect(CPUPPCState *env, sPAPREnvironment *spapr,
     }
 
     hpte = env->external_htab + (pte_index * HASH_PTE_SIZE_64);
-    while (!lock_hpte(hpte, HPTE_V_HVLOCK)) {
-        /* We have no real concurrency in qemu soft-emulation, so we
-         * will never actually have a contested lock */
-        assert(0);
-    }
 
     v = ldq_p(hpte);
     r = ldq_p(hpte + (HASH_PTE_SIZE_64/2));
 
     if ((v & HPTE_V_VALID) == 0 ||
         ((flags & H_AVPN) && (v & ~0x7fULL) != avpn)) {
-        stq_p(hpte, v & ~HPTE_V_HVLOCK);
-        assert(!(ldq_p(hpte) & HPTE_V_HVLOCK));
         return H_NOT_FOUND;
     }
 
@@ -350,8 +317,7 @@ static target_ulong h_protect(CPUPPCState *env, sPAPREnvironment *spapr,
     ppc_tlb_invalidate_one(env, rb);
     stq_p(hpte + (HASH_PTE_SIZE_64/2), r);
     /* Don't need a memory barrier, due to qemu's global lock */
-    stq_p(hpte, v & ~HPTE_V_HVLOCK);
-    assert(!(ldq_p(hpte) & HPTE_V_HVLOCK));
+    stq_p(hpte, v);
     return H_SUCCESS;
 }
 
-- 
1.6.0.2

  parent reply	other threads:[~2012-10-04 13:57 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-10-04 13:56 [Qemu-devel] [PULL 00/34] ppc patch queue 2012-10-04 Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 01/34] MAINTAINERS: Document sPAPR (pSeries) machine Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 02/34] MAINTAINERS: Document e500 machines and devices Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 03/34] MAINTAINERS: Downgrade ppc405 to Odd Fixes Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 04/34] MAINTAINERS: Document Bamboo machine and ppc4xx devices Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 05/34] MAINTAINERS: Document virtex_ml507 machine Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 06/34] target-ppc: simplify NaN propagation for vector functions Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 07/34] target-ppc: use the softfloat min/max functions Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 08/34] target-ppc: use the softfloat float32_muladd function Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 09/34] target-ppc: get rid of the HANDLE_NAN{1, 2, 3} macros Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 10/34] ppc: Make kvm_arch_put_registers() put *all* the registers Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 11/34] pseries: Fix and cleanup CPU initialization and reset Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 12/34] pseries: Use new method to correct reset sequence Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 13/34] pseries: Add support for new KVM hash table control call Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 14/34] pseries: Clear TCE and signal state when resetting PAPR VIO devices Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 15/34] pseries: Reset emulated PCI TCE tables on system reset Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 16/34] pseries: Fix XICS reset Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 17/34] pseries: Small cleanup to H_CEDE implementation Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 18/34] pseries: Remove C bitfields from xics code Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 19/34] pseries: Remove XICS irq type enum type Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 20/34] pseries: Remove never used flags field from spapr vio devices Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 21/34] pseries: Rework implementation of TCE bypass Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 22/34] pseries: Fix semantics of RTAS int-on, int-off and set-xive functions Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 23/34] target-ppc: KVM: Fix some kernel version edge cases for kvmppc_reset_htab() Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 24/34] ppc405_uc: Fix buffer overflow Alexander Graf
2012-10-04 13:56 ` Alexander Graf [this message]
2012-10-04 13:56 ` [Qemu-devel] [PATCH 26/34] pseries: Set hash table size based on RAM size Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 27/34] target-ppc: Remove unused power_mode field from cpu state Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 28/34] target-ppc: Extend FPU state for newer POWER CPUs Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 29/34] fdt: move dumpdtb interpretation code to device_tree.c Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 30/34] device tree: simplify dumpdtb code Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 31/34] PPC: e500: increase DTC_LOAD_PAD Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 32/34] PPC: e500: calculate initrd_base like dt_base Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 33/34] pseries: Don't test for MSR_PR for hypercalls under KVM Alexander Graf
2012-10-04 13:56 ` [Qemu-devel] [PATCH 34/34] ppc/pseries: Reset VPA registration on CPU reset Alexander Graf
2012-10-06 18:35 ` [Qemu-devel] [PULL 00/34] ppc patch queue 2012-10-04 Aurelien Jarno

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=1349359016-13107-26-git-send-email-agraf@suse.de \
    --to=agraf@suse.de \
    --cc=aurelien@aurel32.net \
    --cc=blauwirbel@gmail.com \
    --cc=david@gibson.dropbear.id.au \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.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 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).