xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Don Slutz <dslutz@verizon.com>
To: "Andreas Färber" <afaerber@suse.de>, "Don Slutz" <dslutz@verizon.com>
Cc: xen-devel@lists.xensource.com,
	Eduardo Habkost <ehabkost@redhat.com>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	qemu-devel@nongnu.org, Anthony Liguori <aliguori@amazon.com>,
	Igor Mammedov <imammedo@redhat.com>
Subject: Re: [PATCH v3 3/4] pc & q35: Add new object pc-memory-layout.
Date: Tue, 22 Apr 2014 19:54:32 -0400	[thread overview]
Message-ID: <53570138.2020408@terremark.com> (raw)
In-Reply-To: <535148AE.9030500@suse.de>

On 04/18/14 11:45, Andreas Färber wrote:
> Am 25.03.2014 00:55, schrieb Don Slutz:
>> This new object has the property max-ram-below-4g.
>>
>> If you add enough PCI devices then all mmio for them will not fit
>> below 4G which may not be the layout the user wanted. This allows
>> you to increase the below 4G address space that PCI devices can use
>> (aka decrease ram below 4G) and therefore in more cases not have any
>> mmio that is above 4G.
>>
>> For example adding "-global pc-memory-layout.max-ram-below-4g=2G" to
>> the command line will limit the amount of ram that is below 4G to
>> 2G.
>>
>> Signed-off-by: Don Slutz <dslutz@verizon.com>
>> ---
>>   hw/i386/pc.c         | 42 ++++++++++++++++++++++++++++++++++++++++++
>>   hw/i386/pc_piix.c    | 23 +++++++++++++++++++++--
>>   hw/i386/pc_q35.c     | 23 +++++++++++++++++++++--
>>   include/hw/i386/pc.h |  2 ++
>>   4 files changed, 86 insertions(+), 4 deletions(-)
>>
>> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
>> index 14f0d91..45339f3 100644
>> --- a/hw/i386/pc.c
>> +++ b/hw/i386/pc.c
>> @@ -1429,3 +1429,45 @@ void ioapic_init_gsi(GSIState *gsi_state, const char *parent_name)
>>           gsi_state->ioapic_irq[i] = qdev_get_gpio_in(dev, i);
>>       }
>>   }
>> +
>> +/* pc-memory-layout stuff */
>> +
>> +typedef struct PcMemoryLayoutState PcMemoryLayoutState;
> PCMemoryLayoutState?

Fine with me.

>> +
>> +/**
>> + * @PcMemoryLayoutState:
> Please drop @.

Will do.

>> + */
>> +struct PcMemoryLayoutState {
>> +    /*< private >*/
>> +    Object parent_obj;
>> +    /*< public >*/
>> +
>> +    uint64_t max_ram_below_4g;
>> +};
>> +
>> +static Property pc_memory_layout_props[] = {
>> +    DEFINE_PROP_SIZE("max-ram-below-4g", PcMemoryLayoutState,
>> +                     max_ram_below_4g, 0),
>> +    DEFINE_PROP_END_OF_LIST(),
>> +};
>> +
>> +static void pc_memory_layout_class_init(ObjectClass *klass, void *data)
>> +{
>> +    DeviceClass *dc = DEVICE_CLASS(klass);
>> +
>> +    dc->props = pc_memory_layout_props;
>> +}
>> +
>> +static const TypeInfo pc_memory_layout_info = {
>> +    .name = TYPE_PC_MEMORY_LAYOUT,
>> +    .parent = TYPE_DEVICE,
>> +    .instance_size = sizeof(PcMemoryLayoutState),
>> +    .class_init = pc_memory_layout_class_init,
>> +};
>> +
>> +static void pc_memory_layout_register_types(void)
>> +{
>> +    type_register_static(&pc_memory_layout_info);
>> +}
>> +
>> +type_init(pc_memory_layout_register_types)
>> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
>> index bd52f6e..81d730d 100644
>> --- a/hw/i386/pc_piix.c
>> +++ b/hw/i386/pc_piix.c
>> @@ -95,6 +95,23 @@ static void pc_init1(QEMUMachineInitArgs *args,
>>       DeviceState *icc_bridge;
>>       FWCfgState *fw_cfg = NULL;
>>       PcGuestInfo *guest_info;
>> +    Object *pc_memory_layout;
>> +    uint64_t max_ram_below_4g;
>> +    ram_addr_t lowmem = 0xe0000000;
>> +
>> +    pc_memory_layout = object_new(TYPE_PC_MEMORY_LAYOUT);
>> +    max_ram_below_4g = object_property_get_int(pc_memory_layout,
>> +                                               "max-ram-below-4g",
>> +                                               NULL);
>> +    if (max_ram_below_4g) {
> Isn't this always zero due to the default value?

Nope. I forget if object_new() or object_property_get_int()
check the global list.  So if the user sets this, the value is
found at this time.

>> +        if (max_ram_below_4g > (1ULL << 32)) {
>> +            fprintf(stderr,
>> +                    "%s: max_ram_below_4g=%lld too big adjusted to %lld\n",
>> +                    __func__, (long long)max_ram_below_4g, 1ULL << 32);
> Is this forgotten debug output? For a user, __func__ is not helpful and
> error_report() would be preferable. Also please just use PRIx64 for
> max_ram_below_4g rather than casting.

Nope.  Will change to use error_report() without __func__ and PRIx64.


>> +            max_ram_below_4g = 1ULL << 32;
>> +        }
>> +        lowmem = max_ram_below_4g;
>> +    }
>>   
>>       /* Check whether RAM fits below 4G (leaving 1/2 GByte for IO memory).
>>        * If it doesn't, we need to split it in chunks below and above 4G.
>> @@ -103,8 +120,10 @@ static void pc_init1(QEMUMachineInitArgs *args,
>>        * For old machine types, use whatever split we used historically to avoid
>>        * breaking migration.
>>        */
>> -    if (args->ram_size >= 0xe0000000) {
>> -        ram_addr_t lowmem = gigabyte_align ? 0xc0000000 : 0xe0000000;
>> +    if (args->ram_size >= lowmem) {
>> +        if (!max_ram_below_4g && gigabyte_align) {
>> +            lowmem = 0xc0000000;
>> +        }
>>           above_4g_mem_size = args->ram_size - lowmem;
>>           below_4g_mem_size = lowmem;
>>       } else {
> We don't have central, recursive realization of devices yet. That means
> your device is instantiated but never realized, and while you're not
> exposing any global state it allows to tweak the property value
> throughout device lifetime.

Not sure how to mark this as read only.  I have not considered
how this can be changed.  There are a lot of other internals that
are generated off of this like ram_size_below_4g.

>
> Also you're forgetting to add this device to the composition tree via
> object_property_add_child(). Neither ACPI code nor future QOM code can
> discover it that way.

Ok, will add a call on object_property_add_child(). Or is the
fact that this ends up in PcGuestInfoState and passed directly
to acpi_setup() mean that it should not be?



>> diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
>> index 6e34fe1..529f53d 100644
>> --- a/hw/i386/pc_q35.c
>> +++ b/hw/i386/pc_q35.c
>> @@ -82,6 +82,23 @@ static void pc_q35_init(QEMUMachineInitArgs *args)
>>       PCIDevice *ahci;
>>       DeviceState *icc_bridge;
>>       PcGuestInfo *guest_info;
>> +    Object *pc_memory_layout;
>> +    uint64_t max_ram_below_4g;
>> +    ram_addr_t lowmem = 0xb0000000;
>> +
>> +    pc_memory_layout = object_new(TYPE_PC_MEMORY_LAYOUT);
>> +    max_ram_below_4g = object_property_get_int(pc_memory_layout,
>> +                                               "max-ram-below-4g",
>> +                                               NULL);
>> +    if (max_ram_below_4g) {
>> +        if (max_ram_below_4g > (1ULL << 32)) {
>> +            fprintf(stderr,
>> +                    "%s: max_ram_below_4g=%lld too big adjusted to %lld\n",
>> +                    __func__, (long long)max_ram_below_4g, 1ULL << 32);
>> +            max_ram_below_4g = 1ULL << 32;
>> +        }
>> +        lowmem = max_ram_below_4g;
>> +    }
>>   
>>       /* Check whether RAM fits below 4G (leaving 1/2 GByte for IO memory
>>        * and 256 Mbytes for PCI Express Enhanced Configuration Access Mapping
>> @@ -92,8 +109,10 @@ static void pc_q35_init(QEMUMachineInitArgs *args)
>>        * For old machine types, use whatever split we used historically to avoid
>>        * breaking migration.
>>        */
>> -    if (args->ram_size >= 0xb0000000) {
>> -        ram_addr_t lowmem = gigabyte_align ? 0x80000000 : 0xb0000000;
>> +    if (args->ram_size >= lowmem) {
>> +        if (!max_ram_below_4g && gigabyte_align) {
>> +            lowmem = 0x80000000;
>> +        }
>>           above_4g_mem_size = args->ram_size - lowmem;
>>           below_4g_mem_size = lowmem;
>>       } else {
> Dito here for all pc_piix.c comments.

Same as above.
     -Don Slutz

>> diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
>> index 9010246..9162d61 100644
>> --- a/include/hw/i386/pc.h
>> +++ b/include/hw/i386/pc.h
>> @@ -163,6 +163,8 @@ void cpu_smm_register(cpu_set_smm_t callback, void *arg);
>>   
>>   void ioapic_init_gsi(GSIState *gsi_state, const char *parent_name);
>>   
>> +#define TYPE_PC_MEMORY_LAYOUT "pc-memory-layout"
>> +
>>   /* acpi_piix.c */
>>   
>>   I2CBus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
> Regards,
> Andreas
>

  reply	other threads:[~2014-04-22 23:54 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-03-24 23:55 [PATCH v3 0/4] Add max-ram-below-4g (was Add pci_hole_min_size machine option) Don Slutz
2014-03-24 23:55 ` [PATCH v3 1/4] xen-all: Fix xen_hvm_init() to adjust pc memory layout Don Slutz
2014-04-18 14:23   ` Andreas Färber
2014-04-22 16:29     ` Don Slutz
2014-03-24 23:55 ` [PATCH v3 2/4] GlobalProperty: Display warning about unused -global Don Slutz
2014-04-18 15:21   ` Andreas Färber
2014-04-18 15:36     ` [Xen-devel] " Fabio Fantoni
2014-04-18 15:59       ` Andreas Färber
2014-04-18 16:54         ` Fabio Fantoni
2014-04-19 10:56           ` Fabio Fantoni
2014-04-22 18:44             ` Don Slutz
2014-04-19 20:54     ` Paolo Bonzini
2014-04-22 23:13       ` Don Slutz
2014-04-23  0:28         ` Paolo Bonzini
2014-04-23 12:58           ` Don Slutz
2014-04-23 13:33         ` Andreas Färber
2014-04-22 20:23     ` Don Slutz
2014-04-23  0:28       ` Paolo Bonzini
2014-04-23 13:25         ` Don Slutz
2014-03-24 23:55 ` [PATCH v3 3/4] pc & q35: Add new object pc-memory-layout Don Slutz
2014-04-18 15:45   ` Andreas Färber
2014-04-22 23:54     ` Don Slutz [this message]
2014-04-21 12:27   ` Paolo Bonzini
2014-04-23  0:13     ` Don Slutz
2014-04-23  3:27       ` Paolo Bonzini
2014-04-23  6:51       ` Marcel Apfelbaum
2014-03-24 23:55 ` [PATCH v3 4/4] xen-all: Pass max_ram_below_4g to xen_hvm_init Don Slutz
2014-03-25 11:17   ` Stefano Stabellini
2014-04-18 16:19   ` Andreas Färber
2014-04-22 18:27     ` Don Slutz
2014-03-25  9:08 ` [PATCH v3 0/4] Add max-ram-below-4g (was Add pci_hole_min_size machine option) Michael S. Tsirkin
2014-04-17 18:27   ` PING " Don Slutz
2014-04-18 14:10   ` Andreas Färber
2014-04-22 16:31     ` Don Slutz
2014-05-05  8:12       ` [Qemu-devel] " Michael S. Tsirkin
2014-05-05 16:16         ` Don Slutz

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=53570138.2020408@terremark.com \
    --to=dslutz@verizon.com \
    --cc=afaerber@suse.de \
    --cc=aliguori@amazon.com \
    --cc=ehabkost@redhat.com \
    --cc=imammedo@redhat.com \
    --cc=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefano.stabellini@eu.citrix.com \
    --cc=xen-devel@lists.xensource.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).