[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PATCH 27/32] PPC: Introduce an alias cache for faster lookup
From: |
Alexander Graf |
Subject: |
[Qemu-ppc] [PATCH 27/32] PPC: Introduce an alias cache for faster lookups |
Date: |
Sun, 30 Jun 2013 03:45:04 +0200 |
When running QEMU with "-cpu ?" we walk through every alias for every
target CPU we know about. This takes several seconds on my very fast
host system.
Let's introduce a class object cache in the alias table. Using that we
don't have to go through the tedious work of finding our target class.
Instead, we can just go directly from the alias name to the target class
pointer.
This patch brings -cpu "?" to reasonable times again.
Before:
real 0m4.716s
After:
real 0m0.025s
Signed-off-by: Alexander Graf <address@hidden>
---
target-ppc/cpu-models.c | 2 +-
target-ppc/cpu-models.h | 3 ++-
target-ppc/translate_init.c | 32 +++++++++++++++++++++++++++-----
3 files changed, 30 insertions(+), 7 deletions(-)
diff --git a/target-ppc/cpu-models.c b/target-ppc/cpu-models.c
index 17f56b7..9bb68c8 100644
--- a/target-ppc/cpu-models.c
+++ b/target-ppc/cpu-models.c
@@ -1227,7 +1227,7 @@
/***************************************************************************/
/* PowerPC CPU aliases */
-const PowerPCCPUAlias ppc_cpu_aliases[] = {
+PowerPCCPUAlias ppc_cpu_aliases[] = {
{ "403", "403GC" },
{ "405", "405D4" },
{ "405CR", "405CRc" },
diff --git a/target-ppc/cpu-models.h b/target-ppc/cpu-models.h
index a94f835..262ca47 100644
--- a/target-ppc/cpu-models.h
+++ b/target-ppc/cpu-models.h
@@ -31,9 +31,10 @@
typedef struct PowerPCCPUAlias {
const char *alias;
const char *model;
+ ObjectClass *klass;
} PowerPCCPUAlias;
-extern const PowerPCCPUAlias ppc_cpu_aliases[];
+extern PowerPCCPUAlias ppc_cpu_aliases[];
/*****************************************************************************/
/* PVR definitions for most known PowerPC */
diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c
index f01e9e7..45b4053 100644
--- a/target-ppc/translate_init.c
+++ b/target-ppc/translate_init.c
@@ -7934,6 +7934,28 @@ static gint ppc_cpu_compare_class_name(gconstpointer a,
gconstpointer b)
#include <ctype.h>
+static ObjectClass *ppc_cpu_class_by_name(const char *name);
+
+static ObjectClass *ppc_cpu_class_by_alias(PowerPCCPUAlias *alias)
+{
+ ObjectClass *invalid_class = (void*)ppc_cpu_class_by_alias;
+
+ /* Cache target class lookups in the alias table */
+ if (!alias->klass) {
+ alias->klass = ppc_cpu_class_by_name(alias->model);
+ if (!alias->klass) {
+ /* Fast check for non-existing aliases */
+ alias->klass = invalid_class;
+ }
+ }
+
+ if (alias->klass == invalid_class) {
+ return NULL;
+ } else {
+ return alias->klass;
+ }
+}
+
static ObjectClass *ppc_cpu_class_by_name(const char *name)
{
GSList *list, *item;
@@ -7961,7 +7983,7 @@ static ObjectClass *ppc_cpu_class_by_name(const char
*name)
for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) {
if (strcmp(ppc_cpu_aliases[i].alias, name) == 0) {
- return ppc_cpu_class_by_name(ppc_cpu_aliases[i].model);
+ return ppc_cpu_class_by_alias(&ppc_cpu_aliases[i]);
}
}
@@ -8051,8 +8073,8 @@ static void ppc_cpu_list_entry(gpointer data, gpointer
user_data)
(*s->cpu_fprintf)(s->file, "PowerPC %-16s PVR %08x\n",
name, pcc->pvr);
for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) {
- const PowerPCCPUAlias *alias = &ppc_cpu_aliases[i];
- ObjectClass *alias_oc = ppc_cpu_class_by_name(alias->model);
+ PowerPCCPUAlias *alias = &ppc_cpu_aliases[i];
+ ObjectClass *alias_oc = ppc_cpu_class_by_alias(alias);
if (alias_oc != oc) {
continue;
@@ -8119,12 +8141,12 @@ CpuDefinitionInfoList *arch_query_cpu_definitions(Error
**errp)
g_slist_free(list);
for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) {
- const PowerPCCPUAlias *alias = &ppc_cpu_aliases[i];
+ PowerPCCPUAlias *alias = &ppc_cpu_aliases[i];
ObjectClass *oc;
CpuDefinitionInfoList *entry;
CpuDefinitionInfo *info;
- oc = ppc_cpu_class_by_name(alias->model);
+ oc = ppc_cpu_class_by_alias(alias);
if (oc == NULL) {
continue;
}
--
1.8.1.4
- [Qemu-ppc] [PATCH 11/32] intc/openpic_kvm: Fix QOM and build issues, (continued)
- [Qemu-ppc] [PATCH 11/32] intc/openpic_kvm: Fix QOM and build issues, Alexander Graf, 2013/06/29
- [Qemu-ppc] [PATCH 30/32] PPC: Newworld: Add second uninorth control register set, Alexander Graf, 2013/06/29
- [Qemu-ppc] [PATCH 28/32] PPC: Add clock-frequency export for Mac machines, Alexander Graf, 2013/06/29
- [Qemu-ppc] [PATCH 21/32] pseries: Update MAINTAINERS information, Alexander Graf, 2013/06/29
- [Qemu-ppc] [PATCH 04/32] openpic: factor out some common defines into openpic.h, Alexander Graf, 2013/06/29
- [Qemu-ppc] [PATCH 20/32] target-ppc kvm: save cr register, Alexander Graf, 2013/06/29
- [Qemu-ppc] [PATCH 17/32] target-ppc: Change default machine for 64-bit, Alexander Graf, 2013/06/29
- [Qemu-ppc] [PATCH 25/32] PPC: Add dump_mmu() for 6xx, Alexander Graf, 2013/06/29
- [Qemu-ppc] [PATCH 31/32] mac-io: Add escc-legacy memory alias region, Alexander Graf, 2013/06/29
- [Qemu-ppc] [PATCH 24/32] target-ppc: Introduce unrealizefn for PowerPCCPU, Alexander Graf, 2013/06/29
- [Qemu-ppc] [PATCH 27/32] PPC: Introduce an alias cache for faster lookups,
Alexander Graf <=
- [Qemu-ppc] [PATCH 32/32] PPC: Ignore writes to L2CR, Alexander Graf, 2013/06/29
- [Qemu-ppc] [PATCH 18/32] spapr-rtas: add CPU argument to RTAS calls, Alexander Graf, 2013/06/29
- [Qemu-ppc] [PATCH 15/32] target-ppc: Drop redundant flags assignments from CPU families, Alexander Graf, 2013/06/29
- [Qemu-ppc] [PATCH 08/32] kvm/openpic: in-kernel mpic support, Alexander Graf, 2013/06/29
- Re: [Qemu-ppc] [PULL 00/32] ppc patch queue 2013-06-30, Alexander Graf, 2013/06/30