From: Pierre Morel <pmorel@linux.ibm.com>
To: qemu-s390x@nongnu.org
Cc: qemu-devel@nongnu.org, borntraeger@de.ibm.com,
pasic@linux.ibm.com, richard.henderson@linaro.org,
david@redhat.com, thuth@redhat.com, cohuck@redhat.com,
mst@redhat.com, pbonzini@redhat.com, kvm@vger.kernel.org,
ehabkost@redhat.com, marcel.apfelbaum@gmail.com,
eblake@redhat.com, armbru@redhat.com, seiden@linux.ibm.com,
nrb@linux.ibm.com, nsg@linux.ibm.com, frankja@linux.ibm.com,
berrange@redhat.com, clg@kaod.org
Subject: [PATCH v18 08/17] qapi/s390x/cpu topology: set-cpu-topology qmp command
Date: Wed, 15 Mar 2023 15:34:53 +0100 [thread overview]
Message-ID: <20230315143502.135750-9-pmorel@linux.ibm.com> (raw)
In-Reply-To: <20230315143502.135750-1-pmorel@linux.ibm.com>
The modification of the CPU attributes are done through a monitor
command.
It allows to move the core inside the topology tree to optimize
the cache usage in the case the host's hypervisor previously
moved the CPU.
The same command allows to modify the CPU attributes modifiers
like polarization entitlement and the dedicated attribute to notify
the guest if the host admin modified scheduling or dedication of a vCPU.
With this knowledge the guest has the possibility to optimize the
usage of the vCPUs.
The command has a feature unstable for the moment.
Signed-off-by: Pierre Morel <pmorel@linux.ibm.com>
---
qapi/machine-target.json | 37 ++++++++++++
hw/s390x/cpu-topology.c | 119 +++++++++++++++++++++++++++++++++++++++
2 files changed, 156 insertions(+)
diff --git a/qapi/machine-target.json b/qapi/machine-target.json
index 42a6a40333..3b7a0b77f4 100644
--- a/qapi/machine-target.json
+++ b/qapi/machine-target.json
@@ -4,6 +4,8 @@
# This work is licensed under the terms of the GNU GPL, version 2 or later.
# See the COPYING file in the top-level directory.
+{ 'include': 'machine-common.json' }
+
##
# @CpuModelInfo:
#
@@ -354,3 +356,38 @@
{ 'enum': 'CpuS390Polarization',
'prefix': 'S390_CPU_POLARIZATION',
'data': [ 'horizontal', 'vertical' ] }
+
+##
+# @set-cpu-topology:
+#
+# @core-id: the vCPU ID to be moved
+# @socket-id: optional destination socket where to move the vCPU
+# @book-id: optional destination book where to move the vCPU
+# @drawer-id: optional destination drawer where to move the vCPU
+# @entitlement: optional entitlement
+# @dedicated: optional, if the vCPU is dedicated to a real CPU
+#
+# Features:
+# @unstable: This command may still be modified.
+#
+# Modifies the topology by moving the CPU inside the topology
+# tree or by changing a modifier attribute of a CPU.
+# Default value for optional parameter is the current value
+# used by the CPU.
+#
+# Returns: Nothing on success, the reason on failure.
+#
+# Since: 8.1
+##
+{ 'command': 'set-cpu-topology',
+ 'data': {
+ 'core-id': 'uint16',
+ '*socket-id': 'uint16',
+ '*book-id': 'uint16',
+ '*drawer-id': 'uint16',
+ '*entitlement': 'CpuS390Entitlement',
+ '*dedicated': 'bool'
+ },
+ 'features': [ 'unstable' ],
+ 'if': { 'all': [ 'TARGET_S390X' , 'CONFIG_KVM' ] }
+}
diff --git a/hw/s390x/cpu-topology.c b/hw/s390x/cpu-topology.c
index 5f8ca904bf..1cf3adec31 100644
--- a/hw/s390x/cpu-topology.c
+++ b/hw/s390x/cpu-topology.c
@@ -18,6 +18,7 @@
#include "target/s390x/cpu.h"
#include "hw/s390x/s390-virtio-ccw.h"
#include "hw/s390x/cpu-topology.h"
+#include "qapi/qapi-commands-machine-target.h"
/*
* s390_topology is used to keep the topology information.
@@ -304,6 +305,26 @@ static void s390_topology_add_core_to_socket(S390CPU *cpu, int drawer_id,
}
}
+/**
+ * s390_topology_need_report
+ * @cpu: Current cpu
+ * @drawer_id: future drawer ID
+ * @book_id: future book ID
+ * @socket_id: future socket ID
+ *
+ * A modified topology change report is needed if the
+ */
+static int s390_topology_need_report(S390CPU *cpu, int drawer_id,
+ int book_id, int socket_id,
+ uint16_t entitlement, bool dedicated)
+{
+ return cpu->env.drawer_id != drawer_id ||
+ cpu->env.book_id != book_id ||
+ cpu->env.socket_id != socket_id ||
+ cpu->env.entitlement != entitlement ||
+ cpu->env.dedicated != dedicated;
+}
+
/**
* s390_update_cpu_props:
* @ms: the machine state
@@ -396,3 +417,101 @@ void s390_topology_setup_cpu(MachineState *ms, S390CPU *cpu, Error **errp)
/* topology tree is reflected in props */
s390_update_cpu_props(ms, cpu);
}
+
+static void s390_change_topology(uint16_t core_id,
+ bool has_socket_id, uint16_t socket_id,
+ bool has_book_id, uint16_t book_id,
+ bool has_drawer_id, uint16_t drawer_id,
+ bool has_entitlement, uint16_t entitlement,
+ bool has_dedicated, bool dedicated,
+ Error **errp)
+{
+ MachineState *ms = current_machine;
+ S390CPU *cpu;
+ int report_needed;
+ ERRP_GUARD();
+
+ if (core_id >= ms->smp.max_cpus) {
+ error_setg(errp, "Core-id %d out of range!", core_id);
+ return;
+ }
+
+ cpu = (S390CPU *)ms->possible_cpus->cpus[core_id].cpu;
+ if (!cpu) {
+ error_setg(errp, "Core-id %d does not exist!", core_id);
+ return;
+ }
+
+ /* Get attributes not provided from cpu and verify the new topology */
+ if (!has_entitlement) {
+ entitlement = cpu->env.entitlement;
+ }
+ if (!has_dedicated) {
+ dedicated = cpu->env.dedicated;
+ }
+ if (!has_socket_id) {
+ socket_id = cpu->env.socket_id;
+ }
+ if (!has_book_id) {
+ book_id = cpu->env.book_id;
+ }
+ if (!has_drawer_id) {
+ drawer_id = cpu->env.drawer_id;
+ }
+
+ s390_topology_check(socket_id, book_id, drawer_id,
+ entitlement, dedicated, errp);
+ if (*errp) {
+ return;
+ }
+
+ /* Move the CPU into its new socket */
+ s390_topology_add_core_to_socket(cpu, drawer_id, book_id,
+ socket_id, false, errp);
+ if (*errp) {
+ return;
+ }
+
+ /* Check if we need to report the modified topology */
+ report_needed = s390_topology_need_report(cpu, drawer_id, book_id,
+ socket_id, entitlement,
+ dedicated);
+
+ /* All checks done, report new topology into the vCPU */
+ cpu->env.drawer_id = drawer_id;
+ cpu->env.book_id = book_id;
+ cpu->env.socket_id = socket_id;
+ cpu->env.dedicated = dedicated;
+ cpu->env.entitlement = entitlement;
+
+ /* Setup shadow and effective entitlement */
+ s390_normalize_entitlement(cpu);
+
+ /* topology tree is reflected in props */
+ s390_update_cpu_props(ms, cpu);
+
+ /* Advertise the topology change */
+ if (report_needed) {
+ s390_cpu_topology_set_changed(true);
+ }
+}
+
+void qmp_set_cpu_topology(uint16_t core,
+ bool has_socket, uint16_t socket,
+ bool has_book, uint16_t book,
+ bool has_drawer, uint16_t drawer,
+ bool has_entitlement, CpuS390Entitlement entitlement,
+ bool has_dedicated, bool dedicated,
+ Error **errp)
+{
+ ERRP_GUARD();
+
+ if (!s390_has_topology()) {
+ error_setg(errp, "This machine doesn't support topology");
+ return;
+ }
+
+ s390_change_topology(core, has_socket, socket, has_book, book,
+ has_drawer, drawer, has_entitlement, entitlement,
+ has_dedicated, dedicated, errp);
+}
--
2.31.1
next prev parent reply other threads:[~2023-03-15 14:37 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-15 14:34 [PATCH v18 00/17] s390x: CPU Topology Pierre Morel
2023-03-15 14:34 ` [PATCH v18 01/17] s390x/cpu topology: add s390 specifics to CPU topology Pierre Morel
2023-03-27 21:34 ` Nina Schoetterl-Glausch
2023-03-28 11:29 ` Pierre Morel
2023-03-15 14:34 ` [PATCH v18 02/17] s390x/cpu topology: add topology entries on CPU hotplug Pierre Morel
2023-03-15 14:34 ` [PATCH v18 03/17] target/s390x/cpu topology: handle STSI(15) and build the SYSIB Pierre Morel
2023-03-15 14:34 ` [PATCH v18 04/17] s390x/sclp: reporting the maximum nested topology entries Pierre Morel
2023-03-15 14:34 ` [PATCH v18 05/17] s390x/cpu topology: resetting the Topology-Change-Report Pierre Morel
2023-03-15 14:34 ` [PATCH v18 06/17] s390x/cpu topology: interception of PTF instruction Pierre Morel
2023-03-15 14:34 ` [PATCH v18 07/17] target/s390x/cpu topology: activate CPU topology Pierre Morel
2023-03-15 14:34 ` Pierre Morel [this message]
2023-03-15 14:34 ` [PATCH v18 09/17] machine: adding s390 topology to query-cpu-fast Pierre Morel
2023-03-15 14:34 ` [PATCH v18 10/17] machine: adding s390 topology to info hotpluggable-cpus Pierre Morel
2023-03-15 14:34 ` [PATCH v18 11/17] qapi/s390x/cpu topology: CPU_POLARIZATION_CHANGE qapi event Pierre Morel
2023-03-15 14:34 ` [PATCH v18 12/17] docs/s390x/cpu topology: document s390x cpu topology Pierre Morel
2023-03-15 14:34 ` [PATCH v18 13/17] tests/avocado: s390x cpu topology core Pierre Morel
2023-03-15 14:34 ` [PATCH v18 14/17] tests/avocado: s390x cpu topology polarisation Pierre Morel
2023-03-15 14:35 ` [PATCH v18 15/17] tests/avocado: s390x cpu topology entitlement tests Pierre Morel
2023-03-15 14:35 ` [PATCH v18 16/17] tests/avocado: s390x cpu topology test dedicated CPU Pierre Morel
2023-03-15 14:35 ` [PATCH v18 17/17] tests/avocado: s390x cpu topology test socket full Pierre Morel
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=20230315143502.135750-9-pmorel@linux.ibm.com \
--to=pmorel@linux.ibm.com \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=borntraeger@de.ibm.com \
--cc=clg@kaod.org \
--cc=cohuck@redhat.com \
--cc=david@redhat.com \
--cc=eblake@redhat.com \
--cc=ehabkost@redhat.com \
--cc=frankja@linux.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=marcel.apfelbaum@gmail.com \
--cc=mst@redhat.com \
--cc=nrb@linux.ibm.com \
--cc=nsg@linux.ibm.com \
--cc=pasic@linux.ibm.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-s390x@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=seiden@linux.ibm.com \
--cc=thuth@redhat.com \
/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).