All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Chen, Tiejun" <tiejun.chen@intel.com>
To: Wei Liu <wei.liu2@citrix.com>
Cc: kevin.tian@intel.com, ian.campbell@citrix.com,
	andrew.cooper3@citrix.com, tim@xen.org, xen-devel@lists.xen.org,
	stefano.stabellini@citrix.com, jbeulich@suse.com,
	yang.z.zhang@intel.com, Ian.Jackson@eu.citrix.com
Subject: Re: [v3][PATCH 13/16] tools/libxl: detect and avoid conflicts with RDM
Date: Mon, 15 Jun 2015 09:50:49 +0800	[thread overview]
Message-ID: <557E2F79.7050502@intel.com> (raw)
In-Reply-To: <20150612163944.GZ14606@zion.uk.xensource.com>

On 2015/6/13 0:39, Wei Liu wrote:
> On Thu, Jun 11, 2015 at 09:15:22AM +0800, Tiejun Chen wrote:
> [...]
>> +++ b/tools/libxc/xc_hvm_build_x86.c
>> @@ -21,6 +21,7 @@
>>   #include <stdlib.h>
>>   #include <unistd.h>
>>   #include <zlib.h>
>> +#include <assert.h>
>>
>>   #include "xg_private.h"
>>   #include "xc_private.h"
>> @@ -270,7 +271,7 @@ static int setup_guest(xc_interface *xch,
>>
>>       elf_parse_binary(&elf);
>>       v_start = 0;
>> -    v_end = args->mem_size;
>> +    v_end = args->lowmem_end;
>
> Why is this needed?

This was left to handle something inside modules_init(). But I think 
this change can be removed now.

>>
>>       if ( nr_pages > target_pages )
>>           memflags |= XENMEMF_populate_on_demand;
>> @@ -754,6 +755,8 @@ int xc_hvm_build_target_mem(xc_interface *xch,
>>       args.mem_size = (uint64_t)memsize << 20;
>>       args.mem_target = (uint64_t)target << 20;
>>       args.image_file_name = image_name;
> [...]
>>
>> +static struct xen_reserved_device_memory
>> +*xc_device_get_rdm(libxl__gc *gc,
>> +                   uint32_t flag,
>> +                   uint16_t seg,
>> +                   uint8_t bus,
>> +                   uint8_t devfn,
>> +                   unsigned int *nr_entries)
>> +{
>> +    struct xen_reserved_device_memory *xrdm;
>> +    int rc;
>> +
>> +    rc = xc_reserved_device_memory_map(CTX->xch, flag, seg, bus, devfn,
>> +                                       NULL, nr_entries);
>
> xc_reserved_device_memory_map dereferences nr_entries. You need to make
> sure there is no garbage value in nr_entries. I.e. you need to
> initialise nr_entries to 0 before passing it in.

Sure, so what about this?

/*
  * We really can't presume how many entries we can get in advance.
  */
if (*nr_entries)
     *nr_entries = 0;

>
>> +    assert(rc <= 0);
>> +    /* "0" means we have no any rdm entry. */
>> +    if (!rc)
>> +        goto out;
>> +
>> +    if (errno == ENOBUFS) {
>> +        xrdm = malloc(*nr_entries * sizeof(xen_reserved_device_memory_t));
>> +        if (!xrdm) {
>> +            LOG(ERROR, "Could not allocate RDM buffer!\n");
>> +            goto out;
>> +        }
>> +        rc = xc_reserved_device_memory_map(CTX->xch, flag, seg, bus, devfn,
>> +                                           xrdm, nr_entries);
>> +        if (rc) {
>> +            LOG(ERROR, "Could not get reserved device memory maps.\n");
>> +            *nr_entries = 0;
>> +            free(xrdm);
>> +            xrdm = NULL;
>> +        }
>> +    } else
>> +        LOG(ERROR, "Could not get reserved device memory maps.\n");
>> +
>> + out:
>> +    return xrdm;
>> +}
>> +
>> +/*
>> + * Check whether there exists rdm hole in the specified memory range.
>> + * Returns true if exists, else returns false.
>> + */
>> +static bool overlaps_rdm(uint64_t start, uint64_t memsize,
>> +                         uint64_t rdm_start, uint64_t rdm_size)
>> +{
>> +    return (start + memsize > rdm_start) && (start < rdm_start + rdm_size);
>> +}
>> +
>> +/*
>> + * Check reported RDM regions and handle potential gfn conflicts according
>> + * to user preferred policy.
>> + *
>> + * RMRR can reside in address space beyond 4G theoretically, but we never
>> + * see this in real world. So in order to avoid breaking highmem layout
>> + * we don't solve highmem conflict. Note this means highmem rmrr could still
>> + * be supported if no conflict.
>> + *
>> + * But in the case of lowmem, RMRR probably scatter the whole RAM space.
>> + * Especially multiple RMRR entries would worsen this to lead a complicated
>> + * memory layout. And then its hard to extend hvm_info_table{} to work
>> + * hvmloader out. So here we're trying to figure out a simple solution to
>> + * avoid breaking existing layout. So when a conflict occurs,
>> + *
>> + * #1. Above a predefined boundary (default 2G)
>> + * - Move lowmem_end below reserved region to solve conflict;
>> + *
>> + * #2. Below a predefined boundary (default 2G)
>> + * - Check strict/relaxed policy.
>> + * "strict" policy leads to fail libxl. Note when both policies
>> + * are specified on a given region, 'strict' is always preferred.
>> + * "relaxed" policy issue a warning message and also mask this entry
>> + * INVALID to indicate we shouldn't expose this entry to hvmloader.
>> + */
>
> This looks sensible. Thanks.
>
>> diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
>> index 4364ba4..85d74fd 100644
>> --- a/tools/libxl/xl_cmdimpl.c
>> +++ b/tools/libxl/xl_cmdimpl.c
>> @@ -1374,6 +1374,9 @@ static void parse_config_data(const char *config_source,
>>       if (!xlu_cfg_get_long (config, "videoram", &l, 0))
>>           b_info->video_memkb = l * 1024;
>>
>> +    if (!xlu_cfg_get_long (config, "rdm_mem_boundary", &l, 0))
>> +        b_info->rdm_mem_boundary_memkb = l * 1024;
>> +
>
> Maybe you need to rearrange this patch series a bit more. The toolstack
> side patches have mixed libxc, libxl and xl changes which is a bit hard
> for me to tell what is needed by what. We can discuss this if you have
> questions.

Okay, just let me try firstly.

Thanks
Tiejun

>
> Wei.
>
>>       if (!xlu_cfg_get_long(config, "max_event_channels", &l, 0))
>>           b_info->event_channels = l;
>>
>> --
>> 1.9.1
>

  reply	other threads:[~2015-06-15  1:50 UTC|newest]

Thread overview: 114+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-11  1:15 [v3][PATCH 00/16] Fix RMRR Tiejun Chen
2015-06-11  1:15 ` [v3][PATCH 01/16] xen: introduce XENMEM_reserved_device_memory_map Tiejun Chen
2015-06-11  8:56   ` Tian, Kevin
2015-06-11  1:15 ` [v3][PATCH 02/16] xen/x86/p2m: introduce set_identity_p2m_entry Tiejun Chen
2015-06-11  7:33   ` Jan Beulich
2015-06-11  8:23     ` Chen, Tiejun
2015-06-11  9:23       ` Jan Beulich
2015-06-11  9:25         ` Chen, Tiejun
2015-06-11  9:00   ` Tian, Kevin
2015-06-11  9:18     ` Chen, Tiejun
2015-06-11  1:15 ` [v3][PATCH 03/16] xen/vtd: create RMRR mapping Tiejun Chen
2015-06-11  9:14   ` Tian, Kevin
2015-06-11  9:31     ` Chen, Tiejun
2015-06-11 14:07       ` Tim Deegan
2015-06-12  2:43         ` Chen, Tiejun
2015-06-12  5:58           ` Chen, Tiejun
2015-06-12  5:59             ` Tian, Kevin
2015-06-12  6:13               ` Chen, Tiejun
2015-06-18 10:07                 ` Tim Deegan
2015-06-19  0:37                   ` Chen, Tiejun
2015-06-17 10:03   ` Jan Beulich
2015-06-18  6:23     ` Chen, Tiejun
2015-06-11  1:15 ` [v3][PATCH 04/16] xen/passthrough: extend hypercall to support rdm reservation policy Tiejun Chen
2015-06-11  9:28   ` Tian, Kevin
2015-06-12  6:31     ` Chen, Tiejun
2015-06-12  8:45       ` Jan Beulich
2015-06-12  9:20         ` Chen, Tiejun
2015-06-12  9:26           ` Jan Beulich
2015-06-15  7:39           ` Chen, Tiejun
2015-06-16  2:30       ` Tian, Kevin
2015-06-17 10:11   ` Jan Beulich
2015-06-18  7:14     ` Chen, Tiejun
2015-06-18  7:53       ` Jan Beulich
2015-06-18  8:48         ` Chen, Tiejun
2015-06-18  9:13           ` Jan Beulich
2015-06-18  9:31             ` Chen, Tiejun
2015-06-11  1:15 ` [v3][PATCH 05/16] xen: enable XENMEM_memory_map in hvm Tiejun Chen
2015-06-11  9:29   ` Tian, Kevin
2015-06-17 10:14   ` Jan Beulich
2015-06-18  8:53     ` Chen, Tiejun
2015-06-11  1:15 ` [v3][PATCH 06/16] hvmloader: get guest memory map into memory_map[] Tiejun Chen
2015-06-11  9:38   ` Tian, Kevin
2015-06-12  7:33     ` Chen, Tiejun
2015-06-17 10:22   ` Jan Beulich
2015-06-18  9:13     ` Chen, Tiejun
2015-06-11  1:15 ` [v3][PATCH 07/16] hvmloader/pci: skip reserved ranges Tiejun Chen
2015-06-11  9:51   ` Tian, Kevin
2015-06-12  7:53     ` Chen, Tiejun
2015-06-16  5:47       ` Tian, Kevin
2015-06-16  9:29         ` Chen, Tiejun
2015-06-16  9:40           ` Jan Beulich
2015-06-17  7:10             ` Chen, Tiejun
2015-06-17  7:19               ` Jan Beulich
2015-06-17  7:54                 ` Chen, Tiejun
2015-06-17  8:05                   ` Jan Beulich
2015-06-17  8:26                     ` Chen, Tiejun
2015-06-17  8:47                       ` Chen, Tiejun
2015-06-17  9:02                       ` Jan Beulich
2015-06-17  9:18                         ` Chen, Tiejun
2015-06-17  9:24                           ` Jan Beulich
2015-06-18  6:17                             ` Chen, Tiejun
2015-06-18  6:29                               ` Jan Beulich
2015-06-18  7:01                                 ` Chen, Tiejun
2015-06-18  8:05                                   ` Jan Beulich
2015-06-19  2:02                                     ` Chen, Tiejun
2015-06-23  9:46                                       ` Chen, Tiejun
2015-06-11  1:15 ` [v3][PATCH 08/16] hvmloader/e820: construct guest e820 table Tiejun Chen
2015-06-11  9:59   ` Tian, Kevin
2015-06-12  8:19     ` Chen, Tiejun
2015-06-16  5:54       ` Tian, Kevin
2015-06-11  1:15 ` [v3][PATCH 09/16] tools/libxc: Expose new hypercall xc_reserved_device_memory_map Tiejun Chen
2015-06-11 10:00   ` Tian, Kevin
2015-06-11  1:15 ` [v3][PATCH 10/16] tools: extend xc_assign_device() to support rdm reservation policy Tiejun Chen
2015-06-11 10:02   ` Tian, Kevin
2015-06-12  8:25     ` Chen, Tiejun
2015-06-16  2:28       ` Tian, Kevin
2015-06-12 15:43   ` Wei Liu
2015-06-15  1:12     ` Chen, Tiejun
2015-06-15 14:58       ` Wei Liu
2015-06-16  2:31         ` Chen, Tiejun
2015-06-11  1:15 ` [v3][PATCH 11/16] tools: introduce some new parameters to set rdm policy Tiejun Chen
2015-06-12 16:02   ` Wei Liu
2015-06-15  1:19     ` Chen, Tiejun
2015-06-11  1:15 ` [v3][PATCH 12/16] tools/libxl: passes rdm reservation policy Tiejun Chen
2015-06-12 16:17   ` Wei Liu
2015-06-15  1:26     ` Chen, Tiejun
2015-06-15 15:00       ` Wei Liu
2015-06-11  1:15 ` [v3][PATCH 13/16] tools/libxl: detect and avoid conflicts with RDM Tiejun Chen
2015-06-11 10:19   ` Tian, Kevin
2015-06-12  8:30     ` Chen, Tiejun
2015-06-12 16:39   ` Wei Liu
2015-06-15  1:50     ` Chen, Tiejun [this message]
2015-06-15 15:01       ` Wei Liu
2015-06-16  1:44         ` Chen, Tiejun
2015-06-11  1:15 ` [v3][PATCH 14/16] tools/libxl: extend XENMEM_set_memory_map Tiejun Chen
2015-06-12 16:43   ` Wei Liu
2015-06-15  2:15     ` Chen, Tiejun
2015-06-11  1:15 ` [v3][PATCH 15/16] xen/vtd: enable USB device assignment Tiejun Chen
2015-06-11 10:22   ` Tian, Kevin
2015-06-12  8:59     ` Chen, Tiejun
2015-06-16  5:58       ` Tian, Kevin
2015-06-16  6:09         ` Chen, Tiejun
2015-06-11  1:15 ` [v3][PATCH 16/16] xen/vtd: prevent from assign the device with shared rmrr Tiejun Chen
2015-06-11 10:25   ` Tian, Kevin
2015-06-12  8:44     ` Chen, Tiejun
2015-06-17 10:28   ` Jan Beulich
2015-06-18  9:23     ` Chen, Tiejun
2015-06-11  7:27 ` [v3][PATCH 00/16] Fix RMRR Jan Beulich
2015-06-11  8:42   ` Tian, Kevin
2015-06-11  9:06     ` Chen, Tiejun
2015-06-11 12:52 ` Tim Deegan
2015-06-12  2:10   ` Chen, Tiejun
2015-06-12  8:04     ` Jan Beulich
2015-06-12  8:20       ` Chen, Tiejun

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=557E2F79.7050502@intel.com \
    --to=tiejun.chen@intel.com \
    --cc=Ian.Jackson@eu.citrix.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=ian.campbell@citrix.com \
    --cc=jbeulich@suse.com \
    --cc=kevin.tian@intel.com \
    --cc=stefano.stabellini@citrix.com \
    --cc=tim@xen.org \
    --cc=wei.liu2@citrix.com \
    --cc=xen-devel@lists.xen.org \
    --cc=yang.z.zhang@intel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.