[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-ppc] [Qemu-devel] [PATCH v1 2/4] machine: factor out enforce_a
From: |
David Hildenbrand |
Subject: |
Re: [Qemu-ppc] [Qemu-devel] [PATCH v1 2/4] machine: factor out enforce_aligned_dimm into memory_device_align |
Date: |
Tue, 19 Jun 2018 19:06:38 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.8.0 |
On 19.06.2018 17:59, Igor Mammedov wrote:
> On Mon, 18 Jun 2018 16:47:58 +0200
> David Hildenbrand <address@hidden> wrote:
>
>> We want to handle memory device address assignment without passing
>> compatibility parameters ("*align").
>>
>> As x86 and Power use different strategies to determine an alignment and
>> we need clean support for compat handling, let's introduce an enum on
>> the machine class level. This is the machine configuration on how to
>> align memory devices in guest physical memory.
>>
>> The three introduced types represent what is being done on x86 and Power
>> right now.
>
> commit message doesn't deliver purpose of the path,
"We want to handle memory device address assignment without passing
compatibility parameters ("*align")."
So in order to do patch nr 4 without this, I would basically have to
move the align parameter to pc_dimm_pre_plug, along with the code for
"detecting" the alignment in e.g. pc_memory_plug. And I want to avoid
this because ...
> So I'm no conviced it's necessary.
> we probably discussed it in previous revisions but could you reiterate
> it here WHY do you need this and 3/4
>
.. I want to get rid of the align parameter in the long run. Alignment
is some memory device specific property that can be easily detected
using a detection configuration (this patch). This approach looks much
cleaner to me. This way we can use the same alignment strategy for all
memory devices.
In follow up series I want to factor out address assignment completely
into memory_device_pre_plug(). And I also don't want to have an align
parameter at that function. I want to avoid moving the same code around
two times (pc.c).
>
>
>> Signed-off-by: David Hildenbrand <address@hidden>
>> ---
>> hw/core/machine.c | 3 +++
>> hw/i386/pc.c | 13 +++++++------
>> hw/i386/pc_piix.c | 2 +-
>> include/hw/boards.h | 13 +++++++++++++
>> include/hw/i386/pc.h | 3 ---
>> 5 files changed, 24 insertions(+), 10 deletions(-)
>>
>> diff --git a/hw/core/machine.c b/hw/core/machine.c
>> index 617e5f8d75..d34b205125 100644
>> --- a/hw/core/machine.c
>> +++ b/hw/core/machine.c
>> @@ -531,6 +531,9 @@ static void machine_class_init(ObjectClass *oc, void
>> *data)
>> mc->numa_mem_align_shift = 23;
>> mc->numa_auto_assign_ram = numa_default_auto_assign_ram;
>>
>> + /* Default: use memory region alignment as memory devices alignment */
>> + mc->memory_device_align = MEMORY_DEVICE_ALIGN_REGION;
>> +
>> object_class_property_add_str(oc, "accel",
>> machine_get_accel, machine_set_accel, &error_abort);
>> object_class_property_set_description(oc, "accel",
>> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
>> index bf986baf91..04a97e89e7 100644
>> --- a/hw/i386/pc.c
>> +++ b/hw/i386/pc.c
>> @@ -1331,6 +1331,7 @@ void pc_memory_init(PCMachineState *pcms,
>> FWCfgState *fw_cfg;
>> MachineState *machine = MACHINE(pcms);
>> PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
>> + MachineClass *mc = MACHINE_GET_CLASS(machine);
>>
>> assert(machine->ram_size == pcms->below_4g_mem_size +
>> pcms->above_4g_mem_size);
>> @@ -1363,8 +1364,6 @@ void pc_memory_init(PCMachineState *pcms,
>> if (!pcmc->has_reserved_memory &&
>> (machine->ram_slots ||
>> (machine->maxram_size > machine->ram_size))) {
>> - MachineClass *mc = MACHINE_GET_CLASS(machine);
>> -
>> error_report("\"-memory 'slots|maxmem'\" is not supported by: %s",
>> mc->name);
>> exit(EXIT_FAILURE);
>> @@ -1394,7 +1393,7 @@ void pc_memory_init(PCMachineState *pcms,
>> machine->device_memory->base =
>> ROUND_UP(0x100000000ULL + pcms->above_4g_mem_size, 1ULL << 30);
>>
>> - if (pcmc->enforce_aligned_dimm) {
>> + if (mc->memory_device_align != MEMORY_DEVICE_ALIGN_PAGE) {
>> /* size device region assuming 1G page max alignment per slot */
>> device_mem_size += (1ULL << 30) * machine->ram_slots;
>> }
>> @@ -1705,14 +1704,16 @@ static void pc_memory_plug(HotplugHandler
>> *hotplug_dev,
>> HotplugHandlerClass *hhc;
>> Error *local_err = NULL;
>> PCMachineState *pcms = PC_MACHINE(hotplug_dev);
>> - PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
>> + MachineClass *mc = MACHINE_GET_CLASS(hotplug_dev);
>> PCDIMMDevice *dimm = PC_DIMM(dev);
>> PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
>> MemoryRegion *mr = ddc->get_memory_region(dimm, &error_abort);
>> uint64_t align = TARGET_PAGE_SIZE;
>> bool is_nvdimm = object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM);
>>
>> - if (memory_region_get_alignment(mr) && pcmc->enforce_aligned_dimm) {
>> +
>> + if (memory_region_get_alignment(mr) &&
>> + mc->memory_device_align != MEMORY_DEVICE_ALIGN_PAGE) {
>> align = memory_region_get_alignment(mr);
>> }
>>
>> @@ -2374,7 +2375,6 @@ static void pc_machine_class_init(ObjectClass *oc,
>> void *data)
>> pcmc->gigabyte_align = true;
>> pcmc->has_reserved_memory = true;
>> pcmc->kvmclock_enabled = true;
>> - pcmc->enforce_aligned_dimm = true;
>> /* BIOS ACPI tables: 128K. Other BIOS datastructures: less than 4K
>> reported
>> * to be used at the moment, 32K should be enough for a while. */
>> pcmc->acpi_data_size = 0x20000 + 0x8000;
>> @@ -2398,6 +2398,7 @@ static void pc_machine_class_init(ObjectClass *oc,
>> void *data)
>> hc->unplug = pc_machine_device_unplug_cb;
>> nc->nmi_monitor_handler = x86_nmi;
>> mc->default_cpu_type = TARGET_DEFAULT_CPU_TYPE;
>> + mc->memory_device_align = MEMORY_DEVICE_ALIGN_REGION_OR_PAGE;
>>
>> object_class_property_add(oc, PC_MACHINE_DEVMEM_REGION_SIZE, "int",
>> pc_machine_get_device_memory_region_size, NULL,
>> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
>> index 3b87f3cedb..cc11856c24 100644
>> --- a/hw/i386/pc_piix.c
>> +++ b/hw/i386/pc_piix.c
>> @@ -566,7 +566,7 @@ static void pc_i440fx_2_1_machine_options(MachineClass
>> *m)
>> m->default_display = NULL;
>> SET_MACHINE_COMPAT(m, PC_COMPAT_2_1);
>> pcmc->smbios_uuid_encoded = false;
>> - pcmc->enforce_aligned_dimm = false;
>> + m->memory_device_align = MEMORY_DEVICE_ALIGN_PAGE;
>> }
>>
>> DEFINE_I440FX_MACHINE(v2_1, "pc-i440fx-2.1", pc_compat_2_1,
>> diff --git a/include/hw/boards.h b/include/hw/boards.h
>> index ef7457f5dd..3f151207c1 100644
>> --- a/include/hw/boards.h
>> +++ b/include/hw/boards.h
>> @@ -105,6 +105,15 @@ typedef struct {
>> CPUArchId cpus[0];
>> } CPUArchIdList;
>>
>> +typedef enum MemoryDeviceAlign {
>> + /* use specified memory region alignment */
>> + MEMORY_DEVICE_ALIGN_REGION = 0,
>> + /* use target page size as alignment */
>> + MEMORY_DEVICE_ALIGN_PAGE,
>> + /* use target page size if no memory region alignment has been
>> specified */
>> + MEMORY_DEVICE_ALIGN_REGION_OR_PAGE,
>> +} MemoryDeviceAlign;
>> +
>> /**
>> * MachineClass:
>> * @max_cpus: maximum number of CPUs supported. Default: 1
>> @@ -156,6 +165,9 @@ typedef struct {
>> * should instead use "unimplemented-device" for all memory ranges where
>> * the guest will attempt to probe for a device that QEMU doesn't
>> * implement and a stub device is required.
>> + * @memory_device_align: The alignment that will be used as default when
>> + * searching for a guest physical memory address while plugging a
>> + * memory device. This is relevant for compatibility handling.
>> */
>> struct MachineClass {
>> /*< private >*/
>> @@ -202,6 +214,7 @@ struct MachineClass {
>> const char **valid_cpu_types;
>> strList *allowed_dynamic_sysbus_devices;
>> bool auto_enable_numa_with_memhp;
>> + MemoryDeviceAlign memory_device_align;
>> void (*numa_auto_assign_ram)(MachineClass *mc, NodeInfo *nodes,
>> int nb_nodes, ram_addr_t size);
>>
>> diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
>> index fc8dedca12..ffb4654fc8 100644
>> --- a/include/hw/i386/pc.h
>> +++ b/include/hw/i386/pc.h
>> @@ -86,8 +86,6 @@ struct PCMachineState {
>> *
>> * Compat fields:
>> *
>> - * @enforce_aligned_dimm: check that DIMM's address/size is aligned by
>> - * backend's alignment value if provided
>> * @acpi_data_size: Size of the chunk of memory at the top of RAM
>> * for the BIOS ACPI tables and other BIOS
>> * datastructures.
>> @@ -124,7 +122,6 @@ struct PCMachineClass {
>> /* RAM / address space compat: */
>> bool gigabyte_align;
>> bool has_reserved_memory;
>> - bool enforce_aligned_dimm;
>> bool broken_reserved_end;
>>
>> /* TSC rate migration: */
>
--
Thanks,
David / dhildenb
[Qemu-ppc] [PATCH v1 3/4] pc-dimm/memory-device: detect alignment internally, David Hildenbrand, 2018/06/18
[Qemu-ppc] [PATCH v1 4/4] pc-dimm: assign and verify the "addr" property during pre_plug, David Hildenbrand, 2018/06/18