{"id":809751,"url":"http://patchwork.ozlabs.org/api/1.0/patches/809751/?format=json","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/1.0/projects/14/?format=json","name":"QEMU Development","link_name":"qemu-devel","list_id":"qemu-devel.nongnu.org","list_email":"qemu-devel@nongnu.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20170904154316.4148-16-david@redhat.com>","date":"2017-09-04T15:43:12","name":"[v2,15/19] s390x: print CPU definitions in sorted order","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"c2fadb2126f0578bd72e2f4049b82f9de51b6c1c","submitter":{"id":70402,"url":"http://patchwork.ozlabs.org/api/1.0/people/70402/?format=json","name":"David Hildenbrand","email":"david@redhat.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20170904154316.4148-16-david@redhat.com/mbox/","series":[{"id":1412,"url":"http://patchwork.ozlabs.org/api/1.0/series/1412/?format=json","date":"2017-09-04T15:42:57","name":"s390x cleanups and CPU hotplug via device_add","version":2,"mbox":"http://patchwork.ozlabs.org/series/1412/mbox/"}],"check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/809751/checks/","tags":{},"headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@bilbo.ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=nongnu.org\n\t(client-ip=2001:4830:134:3::11; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)","ext-mx06.extmail.prod.ext.phx2.redhat.com;\n\tdmarc=none (p=none dis=none) header.from=redhat.com","ext-mx06.extmail.prod.ext.phx2.redhat.com;\n\tspf=fail smtp.mailfrom=david@redhat.com"],"Received":["from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11])\n\t(using TLSv1 with cipher AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xmF026KMKz9sNq\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue,  5 Sep 2017 01:59:14 +1000 (AEST)","from localhost ([::1]:54558 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.71) (envelope-from\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1dotmK-0007ur-TC\n\tfor incoming@patchwork.ozlabs.org; Mon, 04 Sep 2017 11:59:12 -0400","from eggs.gnu.org ([2001:4830:134:3::10]:37851)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <david@redhat.com>) id 1dotXk-0004n0-FH\n\tfor qemu-devel@nongnu.org; Mon, 04 Sep 2017 11:44:15 -0400","from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <david@redhat.com>) id 1dotXf-0001JJ-Nk\n\tfor qemu-devel@nongnu.org; Mon, 04 Sep 2017 11:44:08 -0400","from mx1.redhat.com ([209.132.183.28]:11054)\n\tby eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32)\n\t(Exim 4.71) (envelope-from <david@redhat.com>) id 1dotXf-0001Hs-GA\n\tfor qemu-devel@nongnu.org; Mon, 04 Sep 2017 11:44:03 -0400","from smtp.corp.redhat.com\n\t(int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13])\n\t(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby mx1.redhat.com (Postfix) with ESMTPS id 81C32432CB;\n\tMon,  4 Sep 2017 15:44:02 +0000 (UTC)","from t460s.redhat.com (ovpn-116-139.ams2.redhat.com\n\t[10.36.116.139])\n\tby smtp.corp.redhat.com (Postfix) with ESMTP id 9D882121E24;\n\tMon,  4 Sep 2017 15:44:00 +0000 (UTC)"],"DMARC-Filter":"OpenDMARC Filter v1.3.2 mx1.redhat.com 81C32432CB","From":"David Hildenbrand <david@redhat.com>","To":"qemu-devel@nongnu.org","Date":"Mon,  4 Sep 2017 17:43:12 +0200","Message-Id":"<20170904154316.4148-16-david@redhat.com>","In-Reply-To":"<20170904154316.4148-1-david@redhat.com>","References":"<20170904154316.4148-1-david@redhat.com>","X-Scanned-By":"MIMEDefang 2.79 on 10.5.11.13","X-Greylist":"Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t(mx1.redhat.com [10.5.110.30]);\n\tMon, 04 Sep 2017 15:44:02 +0000 (UTC)","X-detected-operating-system":"by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]\n\t[fuzzy]","X-Received-From":"209.132.183.28","Subject":"[Qemu-devel] [PATCH v2 15/19] s390x: print CPU definitions in\n\tsorted order","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.21","Precedence":"list","List-Id":"<qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<http://lists.nongnu.org/archive/html/qemu-devel/>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Cc":"thuth@redhat.com, Eduardo Habkost <ehabkost@redhat.com>, david@redhat.com,\n\tcohuck@redhat.com, Richard Henderson <richard.henderson@linaro.org>, \n\tAlexander Graf <agraf@suse.de>, borntraeger@de.ibm.com","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"\"Qemu-devel\"\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>"},"content":"Other architectures provide nicely sorted lists, let's do it similarly on\ns390x.\n\nWhile at it, clean up the code we have to touch either way.\n\nSigned-off-by: David Hildenbrand <david@redhat.com>\n---\n target/s390x/cpu_models.c | 63 ++++++++++++++++++++++++++++++-----------------\n 1 file changed, 41 insertions(+), 22 deletions(-)","diff":"diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c\nindex 8e20e7637b..092db34258 100644\n--- a/target/s390x/cpu_models.c\n+++ b/target/s390x/cpu_models.c\n@@ -270,41 +270,60 @@ const S390CPUDef *s390_find_cpu_def(uint16_t type, uint8_t gen, uint8_t ec_ga,\n     return last_compatible;\n }\n \n-struct S390PrintCpuListInfo {\n-    FILE *f;\n-    fprintf_function print;\n-};\n-\n-static void print_cpu_model_list(ObjectClass *klass, void *opaque)\n+static void s390_print_cpu_model_list_entry(gpointer data, gpointer user_data)\n {\n-    struct S390PrintCpuListInfo *info = opaque;\n-    S390CPUClass *scc = S390_CPU_CLASS(klass);\n-    char *name = g_strdup(object_class_get_name(klass));\n-    const char *details = \"\";\n-\n-    if (scc->is_static) {\n-        details = \"(static, migration-safe)\";\n-    } else if (scc->is_migration_safe) {\n-        details = \"(migration-safe)\";\n-    }\n+    CPUListState *s = user_data;\n+    const S390CPUClass *scc = S390_CPU_CLASS((ObjectClass *)data);\n+    char *name = g_strdup(object_class_get_name((ObjectClass *)data));\n \n     /* strip off the -s390-cpu */\n     g_strrstr(name, \"-\" TYPE_S390_CPU)[0] = 0;\n-    (*info->print)(info->f, \"s390 %-15s %-35s %s\\n\", name, scc->desc,\n-                   details);\n+    (*s->cpu_fprintf)(s->file, \"s390 %-15s %-35s (%smigration-safe)\\n\", name,\n+                      scc->desc, scc->is_static ? \"static, \" : \"\");\n     g_free(name);\n }\n \n+static gint s390_cpu_list_compare(gconstpointer a, gconstpointer b)\n+{\n+    const S390CPUClass *cc_a = S390_CPU_CLASS((ObjectClass *)a);\n+    const S390CPUClass *cc_b = S390_CPU_CLASS((ObjectClass *)b);\n+    const char *name_a = object_class_get_name((ObjectClass *)a);\n+    const char *name_b = object_class_get_name((ObjectClass *)b);\n+\n+    /* move qemu and host to the top of the list, qemu first, host second */\n+    if (name_a[0] == 'q') {\n+        return -1;\n+    } else if (name_b[0] == 'q') {\n+        return 1;\n+    } else if (name_a[0] == 'h') {\n+        return -1;\n+    } else if (name_b[0] == 'h') {\n+        return 1;\n+    }\n+\n+    /* keep the same order we have in our table (sorted by release date) */\n+    if (cc_a->cpu_def != cc_b->cpu_def) {\n+        return cc_a->cpu_def - cc_b->cpu_def;\n+    }\n+\n+    /* exact same definition - list base model first */\n+    return cc_a->is_static ? -1 : 1;\n+}\n+\n void s390_cpu_list(FILE *f, fprintf_function print)\n {\n-    struct S390PrintCpuListInfo info = {\n-        .f = f,\n-        .print = print,\n+    CPUListState s = {\n+        .file = f,\n+        .cpu_fprintf = print,\n     };\n     S390FeatGroup group;\n     S390Feat feat;\n+    GSList *list;\n \n-    object_class_foreach(print_cpu_model_list, TYPE_S390_CPU, false, &info);\n+    list = object_class_get_list(TYPE_S390_CPU, false);\n+    list = g_slist_sort(list, s390_cpu_list_compare);\n+    g_slist_foreach(list, s390_print_cpu_model_list_entry, &s);\n+    g_slist_free(list);\n \n     (*print)(f, \"\\nRecognized feature flags:\\n\");\n     for (feat = 0; feat < S390_FEAT_MAX; feat++) {\n","prefixes":["v2","15/19"]}