xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Don Slutz <dslutz@verizon.com>
To: George Dunlap <George.Dunlap@eu.citrix.com>,
	Don Slutz <dslutz@verizon.com>,
	Ian Campbell <ian.campbell@citrix.com>
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Ian Jackson <ian.jackson@eu.citrix.com>,
	Jan Beulich <jbeulich@suse.com>,
	"xen-devel@lists.xen.org" <xen-devel@lists.xen.org>
Subject: Re: [PATCH v5 1/1] Add mmio_hole_size
Date: Wed, 01 Oct 2014 12:33:31 -0400	[thread overview]
Message-ID: <542C2CDB.4090307@terremark.com> (raw)
In-Reply-To: <CAFLBxZZ-JDHML-Ctp9+3vCAcpgUV0q7jkMBTAM7VSw85S8Wjfg@mail.gmail.com>


On 09/30/14 09:15, George Dunlap wrote:
> On Thu, Sep 11, 2014 at 5:20 PM, Don Slutz <dslutz@verizon.com> wrote:
>> If you add enough PCI devices then all mmio may 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 and
>> therefore in more cases not have any mmio that is above 4G.
>>
>> There are real PCI cards that do not support mmio over 4G, so if you
>> want to emulate them precisely, you may also need to increase the
>> space below 4G for them. There are drivers for these cards that also
>> do not work if they have their mmio space mapped above 4G.
>>
>> This allows growing the MMIO hole to the size needed.
>>
>> This may help with using pci passthru and HVM.
>>
>> Signed-off-by: Don Slutz <dslutz@verizon.com>
> FYI you'll have to rebase this since it doesn't apply cleanly anymore.

Or, I have rebased.

> Also, I've been meaning to look at this for months; sorry it's taken so long.
>
> Overall looks fine, just a few comments:
>
>> @@ -237,26 +243,49 @@ void pci_setup(void)
>>           pci_writew(devfn, PCI_COMMAND, cmd);
>>       }
>>
>> -    /*
>> -     * At the moment qemu-xen can't deal with relocated memory regions.
>> -     * It's too close to the release to make a proper fix; for now,
>> -     * only allow the MMIO hole to grow large enough to move guest memory
>> -     * if we're running qemu-traditional.  Items that don't fit will be
>> -     * relocated into the 64-bit address space.
>> -     *
>> -     * This loop now does the following:
>> -     * - If allow_memory_relocate, increase the MMIO hole until it's
>> -     *   big enough, or until it's 2GiB
>> -     * - If !allow_memory_relocate, increase the MMIO hole until it's
>> -     *   big enough, or until it's 2GiB, or until it overlaps guest
>> -     *   memory
>> -     */
>> -    while ( (mmio_total > (pci_mem_end - pci_mem_start))
>> -            && ((pci_mem_start << 1) != 0)
>> -            && (allow_memory_relocate
>> -                || (((pci_mem_start << 1) >> PAGE_SHIFT)
>> -                    >= hvm_info->low_mem_pgend)) )
>> -        pci_mem_start <<= 1;
>> +    if ( mmio_hole_size )
>> +    {
>> +        uint64_t max_ram_below_4g = (1ULL << 32) - mmio_hole_size;
>> +
>> +        if ( max_ram_below_4g > HVM_BELOW_4G_MMIO_START )
>> +        {
>> +            printf("max_ram_below_4g=0x"PRIllx
>> +                   " too big for mmio_hole_size=0x"PRIllx
>> +                   " has been ignored.\n",
>> +                   PRIllx_arg(max_ram_below_4g),
>> +                   PRIllx_arg(mmio_hole_size));
>> +        }
>> +        else
>> +        {
>> +            pci_mem_start = max_ram_below_4g;
>> +            printf("pci_mem_start=0x%lx (was 0x%x) for mmio_hole_size=%lu\n",
>> +                   pci_mem_start, HVM_BELOW_4G_MMIO_START,
>> +                   (long)mmio_hole_size);
>> +        }
>> +    }
>> +    else
>> +    {
>> +        /*
>> +         * At the moment qemu-xen can't deal with relocated memory regions.
>> +         * It's too close to the release to make a proper fix; for now,
>> +         * only allow the MMIO hole to grow large enough to move guest memory
>> +         * if we're running qemu-traditional.  Items that don't fit will be
>> +         * relocated into the 64-bit address space.
>> +         *
>> +         * This loop now does the following:
>> +         * - If allow_memory_relocate, increase the MMIO hole until it's
>> +         *   big enough, or until it's 2GiB
>> +         * - If !allow_memory_relocate, increase the MMIO hole until it's
>> +         *   big enough, or until it's 2GiB, or until it overlaps guest
>> +         *   memory
>> +         */
>> +        while ( (mmio_total > (pci_mem_end - pci_mem_start))
>> +                && ((pci_mem_start << 1) != 0)
>> +                && (allow_memory_relocate
>> +                    || (((pci_mem_start << 1) >> PAGE_SHIFT)
>> +                        >= hvm_info->low_mem_pgend)) )
>> +            pci_mem_start <<= 1;
>> +    }
> I don't think these need to be disjoint.  There's no reason you
> couldn't set the size for the default, and then allow the code to make
> it bigger for guests which allow that.

The support for changing mmio_hole_size is still "missing" from QEMU.
So this code only works for qemu-traditional.  I think Jan said
back on v1 or v2 (sorry, e-mail issues) that since this is a config,
disable the auto changing code.


 >  But if this needs to be rushed to get in, this is fine with me.

:)

>>       if ( mmio_total > (pci_mem_end - pci_mem_start) )
>>       {
>> diff --git a/tools/libxc/xc_hvm_build_x86.c b/tools/libxc/xc_hvm_build_x86.c
>> index c81a25b..94da7fa 100644
>> --- a/tools/libxc/xc_hvm_build_x86.c
>> +++ b/tools/libxc/xc_hvm_build_x86.c
>> @@ -628,14 +628,40 @@ int xc_hvm_build_target_mem(xc_interface *xch,
>>                              int target,
>>                              const char *image_name)
>>   {
>> +    return xc_hvm_build_target_mem_with_hole(xch, domid, memsize, target,
>> +                                             image_name, 0);
>> +}
>> +
>> +int xc_hvm_build_with_hole(xc_interface *xch, uint32_t domid,
>> +                           struct xc_hvm_build_args *args,
>> +                           uint64_t mmio_hole_size)
>> +{
>> +    if (mmio_hole_size)
>> +    {
>> +        uint64_t max_ram_below_4g = (1ULL << 32) - mmio_hole_size;
>> +
>> +        if (max_ram_below_4g < HVM_BELOW_4G_MMIO_START)
>> +        {
>> +            args->mmio_size = mmio_hole_size;
>> +        }
>> +    }
>> +    return xc_hvm_build(xch, domid, args);
>> +}
>> +
>> +int xc_hvm_build_target_mem_with_hole(xc_interface *xch,
>> +                                      uint32_t domid,
>> +                                      int memsize,
>> +                                      int target,
>> +                                      const char *image_name,
>> +                                      uint64_t mmio_hole_size)
>> +{
>>       struct xc_hvm_build_args args = {};
>>
>>       memset(&args, 0, sizeof(struct xc_hvm_build_args));
>>       args.mem_size = (uint64_t)memsize << 20;
>>       args.mem_target = (uint64_t)target << 20;
>>       args.image_file_name = image_name;
>> -
>> -    return xc_hvm_build(xch, domid, &args);
>> +    return xc_hvm_build_with_hole(xch, domid, &args, mmio_hole_size);
>>   }
>>
>>   /*
>> diff --git a/tools/libxc/xenguest.h b/tools/libxc/xenguest.h
>> index 40bbac8..d35f38d 100644
>> --- a/tools/libxc/xenguest.h
>> +++ b/tools/libxc/xenguest.h
>> @@ -244,12 +244,23 @@ struct xc_hvm_build_args {
>>   int xc_hvm_build(xc_interface *xch, uint32_t domid,
>>                    struct xc_hvm_build_args *hvm_args);
>>
>> +int xc_hvm_build_with_hole(xc_interface *xch, uint32_t domid,
>> +                           struct xc_hvm_build_args *args,
>> +                           uint64_t mmio_hole_size);
>> +
>>   int xc_hvm_build_target_mem(xc_interface *xch,
>>                               uint32_t domid,
>>                               int memsize,
>>                               int target,
>>                               const char *image_name);
>>
>> +int xc_hvm_build_target_mem_with_hole(xc_interface *xch,
>> +                                      uint32_t domid,
>> +                                      int memsize,
>> +                                      int target,
>> +                                      const char *image_name,
>> +                                      uint64_t mmio_hole_size);
> Why on earth do we need all of these extra functions?  Particularly
> ones like xc_hvm_build_target_mem_with_hole(), which isn't even called
> by anyone, AFAICT?

int xc_hvm_build_target_mem(xc_interface *xch,
                            uint32_t domid,
                            int memsize,
                            int target,
                            const char *image_name)
{
     return xc_hvm_build_target_mem_with_hole(xch, domid, memsize, target,
                                              image_name, 0);
}

So it is called...

>
> libxc isn't a stable interface -- can't we just have the callers set
> mmio_size in hvm_args and have them call xc_hvm_build()?

I am looking into this.  I have was not sure that I could change or
drop xc_hvm_build_target_mem().


>> @@ -696,10 +698,28 @@ static char ** libxl__build_device_model_args_new(libxl__gc *gc,
>>               /* Switching here to the machine "pc" which does not add
>>                * the xen-platform device instead of the default "xenfv" machine.
>>                */
>> -            flexarray_append(dm_args, "pc,accel=xen");
>> +            machinearg = libxl__sprintf(gc, "pc,accel=xen");
>>           } else {
>> -            flexarray_append(dm_args, "xenfv");
>> +            machinearg = libxl__sprintf(gc, "xenfv");
>>           }
>> +        if (b_info->u.hvm.mmio_hole_size) {
>> +            uint64_t max_ram_below_4g = (1ULL << 32) -
>> +                b_info->u.hvm.mmio_hole_size;
>> +
>> +            if (max_ram_below_4g > HVM_BELOW_4G_MMIO_START) {
>> +                LIBXL__LOG(ctx, LIBXL__LOG_WARNING,
>> +                           "max-ram-below-4g=%"PRIu64
>> +                           " (mmio_hole_size=%"PRIu64
>> +                           ") too big > %u ignored.\n",
>> +                           max_ram_below_4g,
>> +                           b_info->u.hvm.mmio_hole_size,
>> +                           HVM_BELOW_4G_MMIO_START);
>> +            } else {
>> +                machinearg = libxl__sprintf(gc, "%s,max-ram-below-4g=%"PRIu64,
>> +                                            machinearg, max_ram_below_4g);
>> +            }
>> +        }
> What happens if the version of qemu that's installed doesn't support
> max-ram-below-4g?

QEMU will report an error and abort.  Guest will not start.

     -Don Slutz

>   -George

  reply	other threads:[~2014-10-01 16:33 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-11 16:20 [PATCH v5 0/1] Add mmio_hole_size (was Add pci_hole_min_size) Don Slutz
2014-09-11 16:20 ` [PATCH v5 1/1] Add mmio_hole_size Don Slutz
2014-09-30  1:27   ` Boris Ostrovsky
2014-09-30 13:22     ` George Dunlap
2014-09-30 15:36       ` Boris Ostrovsky
2014-09-30 16:06         ` George Dunlap
2014-10-01  9:31           ` Slutz, Donald Christopher
2014-10-01  9:11       ` Slutz, Donald Christopher
2014-10-01  9:45         ` George Dunlap
2014-10-01  9:39     ` Slutz, Donald Christopher
2014-09-30 13:15   ` George Dunlap
2014-10-01 16:33     ` Don Slutz [this message]
2014-10-02  7:36       ` Jan Beulich
2014-10-07 11:25         ` George Dunlap

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=542C2CDB.4090307@terremark.com \
    --to=dslutz@verizon.com \
    --cc=George.Dunlap@eu.citrix.com \
    --cc=boris.ostrovsky@oracle.com \
    --cc=ian.campbell@citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=jbeulich@suse.com \
    --cc=stefano.stabellini@eu.citrix.com \
    --cc=xen-devel@lists.xen.org \
    /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).