[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v2 31/38] s390x: generate sclp cpu information from p
From: |
Cornelia Huck |
Subject: |
[Qemu-devel] [PULL v2 31/38] s390x: generate sclp cpu information from possible_cpus |
Date: |
Tue, 19 Sep 2017 18:43:30 +0200 |
From: David Hildenbrand <address@hidden>
This is the first step to allow hot plugging of CPUs in a non-sequential
order. If a cpu is available ("plugged") can directly be decided by
looking at the cpu state pointer.
This makes sure, that really only cpus attached to the machine are
reported.
Signed-off-by: David Hildenbrand <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Cornelia Huck <address@hidden>
---
hw/s390x/sclp.c | 34 ++++++++++++++--------------------
1 file changed, 14 insertions(+), 20 deletions(-)
diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c
index fd097262c7..30aefbfd15 100644
--- a/hw/s390x/sclp.c
+++ b/hw/s390x/sclp.c
@@ -34,16 +34,21 @@ static inline SCLPDevice *get_sclp_device(void)
return sclp;
}
-static void prepare_cpu_entries(SCLPDevice *sclp, CPUEntry *entry, int count)
+static void prepare_cpu_entries(SCLPDevice *sclp, CPUEntry *entry, int *count)
{
+ MachineState *ms = MACHINE(qdev_get_machine());
uint8_t features[SCCB_CPU_FEATURE_LEN] = { 0 };
int i;
s390_get_feat_block(S390_FEAT_TYPE_SCLP_CPU, features);
- for (i = 0; i < count; i++) {
- entry[i].address = i;
- entry[i].type = 0;
- memcpy(entry[i].features, features, sizeof(entry[i].features));
+ for (i = 0, *count = 0; i < ms->possible_cpus->len; i++) {
+ if (!ms->possible_cpus->cpus[i].cpu) {
+ continue;
+ }
+ entry[*count].address = ms->possible_cpus->cpus[i].arch_id;
+ entry[*count].type = 0;
+ memcpy(entry[*count].features, features, sizeof(features));
+ (*count)++;
}
}
@@ -53,17 +58,13 @@ static void read_SCP_info(SCLPDevice *sclp, SCCB *sccb)
ReadInfo *read_info = (ReadInfo *) sccb;
MachineState *machine = MACHINE(qdev_get_machine());
sclpMemoryHotplugDev *mhd = get_sclp_memory_hotplug_dev();
- CPUState *cpu;
- int cpu_count = 0;
+ int cpu_count;
int rnsize, rnmax;
int slots = MIN(machine->ram_slots, s390_get_memslot_count());
IplParameterBlock *ipib = s390_ipl_get_iplb();
- CPU_FOREACH(cpu) {
- cpu_count++;
- }
-
/* CPU information */
+ prepare_cpu_entries(sclp, read_info->entries, &cpu_count);
read_info->entries_cpu = cpu_to_be16(cpu_count);
read_info->offset_cpu = cpu_to_be16(offsetof(ReadInfo, entries));
read_info->highest_cpu = cpu_to_be16(max_cpus);
@@ -76,8 +77,6 @@ static void read_SCP_info(SCLPDevice *sclp, SCCB *sccb)
s390_get_feat_block(S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT,
read_info->conf_char_ext);
- prepare_cpu_entries(sclp, read_info->entries, cpu_count);
-
read_info->facilities = cpu_to_be64(SCLP_HAS_CPU_INFO |
SCLP_HAS_IOA_RECONFIG);
@@ -333,13 +332,9 @@ static void unassign_storage(SCLPDevice *sclp, SCCB *sccb)
static void sclp_read_cpu_info(SCLPDevice *sclp, SCCB *sccb)
{
ReadCpuInfo *cpu_info = (ReadCpuInfo *) sccb;
- CPUState *cpu;
- int cpu_count = 0;
-
- CPU_FOREACH(cpu) {
- cpu_count++;
- }
+ int cpu_count;
+ prepare_cpu_entries(sclp, cpu_info->entries, &cpu_count);
cpu_info->nr_configured = cpu_to_be16(cpu_count);
cpu_info->offset_configured = cpu_to_be16(offsetof(ReadCpuInfo, entries));
cpu_info->nr_standby = cpu_to_be16(0);
@@ -348,7 +343,6 @@ static void sclp_read_cpu_info(SCLPDevice *sclp, SCCB *sccb)
cpu_info->offset_standby = cpu_to_be16(cpu_info->offset_configured
+ cpu_info->nr_configured*sizeof(CPUEntry));
- prepare_cpu_entries(sclp, cpu_info->entries, cpu_count);
sccb->h.response_code = cpu_to_be16(SCLP_RC_NORMAL_READ_COMPLETION);
}
--
2.13.5
- [Qemu-devel] [PULL v2 20/38] target/s390x: use program_interrupt() in per_check_exception(), (continued)
- [Qemu-devel] [PULL v2 20/38] target/s390x: use program_interrupt() in per_check_exception(), Cornelia Huck, 2017/09/19
- [Qemu-devel] [PULL v2 21/38] s390x: allow only 1 CPU with TCG, Cornelia Huck, 2017/09/19
- [Qemu-devel] [PULL v2 22/38] target/s390x: set cpu->id for linux user when realizing, Cornelia Huck, 2017/09/19
- [Qemu-devel] [PULL v2 23/38] target/s390x: use "core-id" for cpu number/address/id handling, Cornelia Huck, 2017/09/19
- [Qemu-devel] [PULL v2 24/38] target/s390x: rename next_cpu_id to next_core_id, Cornelia Huck, 2017/09/19
- [Qemu-devel] [PULL v2 25/38] s390x: print CPU definitions in sorted order, Cornelia Huck, 2017/09/19
- [Qemu-devel] [PULL v2 26/38] s390x: allow cpu hotplug via device_add, Cornelia Huck, 2017/09/19
- [Qemu-devel] [PULL v2 27/38] s390x: CPU hot unplug via device_del cannot work for now, Cornelia Huck, 2017/09/19
- [Qemu-devel] [PULL v2 28/38] s390x: implement query-hotpluggable-cpus, Cornelia Huck, 2017/09/19
- [Qemu-devel] [PULL v2 29/38] s390x: get rid of cpu_states and use possible_cpus instead, Cornelia Huck, 2017/09/19
- [Qemu-devel] [PULL v2 31/38] s390x: generate sclp cpu information from possible_cpus,
Cornelia Huck <=
- [Qemu-devel] [PULL v2 30/38] s390x: get rid of cpu_s390x_create(), Cornelia Huck, 2017/09/19
- [Qemu-devel] [PULL v2 32/38] s390x: allow CPU hotplug in random core-id order, Cornelia Huck, 2017/09/19
- [Qemu-devel] [PULL v2 33/38] virtio-ccw: remove stale comments on endianness, Cornelia Huck, 2017/09/19
- [Qemu-devel] [PULL v2 35/38] s390x/ccw: create s390 phb for compat reasons as well, Cornelia Huck, 2017/09/19
- [Qemu-devel] [PULL v2 34/38] configure: Allow --enable-seccomp on s390x, too, Cornelia Huck, 2017/09/19
- [Qemu-devel] [PULL v2 36/38] virtio-gpu: Handle endian conversion, Cornelia Huck, 2017/09/19
- [Qemu-devel] [PULL v2 37/38] virtio-ccw: Create a virtio gpu device for the ccw bus, Cornelia Huck, 2017/09/19
- [Qemu-devel] [PULL v2 38/38] MAINTAINERS/s390x: add terminal3270.c, Cornelia Huck, 2017/09/19
- Re: [Qemu-devel] [PULL v2 00/38] various s390x patches (+some fixes), Christian Borntraeger, 2017/09/19