xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: "Chen, Tiejun" <tiejun.chen@intel.com>
To: Jan Beulich <JBeulich@suse.com>
Cc: Wei Liu <wei.liu2@citrix.com>,
	Ian Campbell <ian.campbell@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Andrew Cooper <andrew.cooper3@citrix.com>,
	Ian Jackson <ian.jackson@eu.citrix.com>,
	xen-devel@lists.xen.org, Keir Fraser <keir@xen.org>
Subject: Re: [v7][PATCH 06/16] hvmloader/pci: skip reserved ranges
Date: Tue, 14 Jul 2015 14:39:04 +0800	[thread overview]
Message-ID: <55A4AE88.2000200@intel.com> (raw)
In-Reply-To: <55A3D5600200007800090330@mail.emea.novell.com>

>> -    } *resource, mem_resource, high_mem_resource, io_resource;
>> +    } *resource, mem_resource, high_mem_resource, io_resource, exp_mem_resource;
>
> Despite having gone through description and the rest of the patch I
> can't seem to be able to guess what "exp_mem" stands for.
> Meaningful variable names are quite helpful though, often avoiding
> the need for comments.

exp_mem_resource() is the expanded mem_resource in the case of 
populating RAM.

Maybe I should use the whole word, expand_mem_resource.

>
>>       /* Create a list of device BARs in descending order of size. */

[snip]

>> @@ -309,29 +339,31 @@ void pci_setup(void)
>>       }
>>
>>       /* Relocate RAM that overlaps PCI space (in 64k-page chunks). */
>> +    cur_pci_mem_start = pci_mem_start;
>>       while ( (pci_mem_start >> PAGE_SHIFT) < hvm_info->low_mem_pgend )
>> +        relocate_ram_for_pci_memory(cur_pci_mem_start);
>
> Please be consistent which variable to want to use in the loop
> (pci_mem_start vs cur_pci_mem_start).

Overall I just call relocate_ram_for_pci_memory() twice and each I 
always pass cur_pci_mem_start. Any inconsistent place?

>
> Also, this being the first substantial change to the function makes
> clear that you _still_ leave the sizing loop untouched, and instead
> make the allocation logic below more complicated. I said before a

But this may be more reasonable than it used to do. In my point of view 
we always need to first allocate 32bit mmio and then allocate 64bit mmio 
since as you said we don't want to expand high memory if possible.

> number of times that I don't think this helps maintainability of this
> already convoluted code. Among other things this manifests itself
> in your second call to relocate_ram_for_pci_memory() in no way
> playing by the constraints explained a few lines up from here in an
> extensive comment.

Can't all variables/comments express what I intend to do here? Except 
for that exp_mem_resource.
               /* 

              * We have to populate more RAM to further allocate 

              * the remaining 32bars. 

              */ 

             if ( mmio32_unallocated_total ) 

             { 

                 cur_pci_mem_start = pci_mem_start - 
mmio32_unallocated_total;
                 relocate_ram_for_pci_memory(cur_pci_mem_start); 

                 exp_mem_resource.base = cur_pci_mem_start; 

                 exp_mem_resource.max = pci_mem_start; 

             }

>
> Therefore I'll not make any further comments on the rest of the
> patch, but instead outline an allocation model that I think would
> fit our needs: Subject to the constraints mentioned above, set up
> a bitmap (maximum size 64k [2Gb = 2^^19 pages needing 2^^19
> bits], i.e. reasonably small a memory block). Each bit represents a
> page usable for MMIO: First of all you remove the range from
> PCI_MEM_END upwards. Then remove all RDM pages. Now do a
> first pass over all devices, allocating (in the bitmap) space for only
> the 32-bit MMIO BARs, starting with the biggest one(s), by finding
> a best fit (i.e. preferably a range not usable by any bigger BAR)
> from top down. For example, if you have available
>
> [f0000000,f8000000)
> [f9000000,f9001000)
> [fa000000,fa003000)
> [fa010000,fa012000)
>
> and you're looking for a single page slot, you should end up
> picking fa002000.

Why is this [f9000000,f9001000]? Just one page in this slot.

>
> After this pass you should be able to do RAM relocation in a
> single attempt just like we do today (you may still grow the MMIO
> window if you know you need to and can fit some of the 64-bit
> BARs in there, subject to said constraints; this is in an attempt
> to help OSes not comfortable with 64-bit resources).
>
> In a 2nd pass you'd then assign 64-bit resources: If you can fit
> them below 4G (you still have the bitmap left of what you've got
> available), put them there. Allocation strategy could be the same

I think basically, your logic is similar to what I did as I described in 
changelog,

   1>. The first allocation round just to 32bit-bar

   If we can finish allocating all 32bit-bar, we just go to allocate 
64bit-bar
   with all remaining resources including low pci memory.

   If not, we need to calculate how much RAM should be populated to 
allocate the
   remaining 32bit-bars, then populate sufficient RAM as 
exp_mem_resource to go
   to the second allocation round 2>.

   2>. The second allocation round to the remaining 32bit-bar

   We should can finish allocating all 32bit-bar in theory, then go to 
the third
   allocation round 3>.

   3>. The third allocation round to 64bit-bar

   We'll try to first allocate from the remaining low memory resource. 
If that
   isn't enough, we try to expand highmem to allocate for 64bit-bar. 
This process
   should be same as the original.

> as above (biggest first), perhaps allowing for some factoring out
> of logic, but here smallest first probably could work equally well.
> The main thought to decide between the two is whether it is
> better to fit as many (small) or as big (in total) as possible a set
> under 4G. I'd generally expect the former (as many as possible,
> leaving only a few huge ones to go above 4G) to be the better
> approach, but that's more a gut feeling than based on hard data.
>

I think bitmap mechanism is a good idea but honestly, its not easy to 
cover all requirements here. And just like bootmem on Linux side, so its 
a little complicated to implement this entirely. So I prefer not to 
introduce this way in current phase.

Thanks
Tiejun

  reply	other threads:[~2015-07-14  6:39 UTC|newest]

Thread overview: 119+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-09  5:33 [v7][PATCH 00/16] Fix RMRR Tiejun Chen
2015-07-09  5:33 ` [v7][PATCH 01/16] xen: introduce XENMEM_reserved_device_memory_map Tiejun Chen
2015-07-09  5:33 ` [v7][PATCH 02/16] xen/vtd: create RMRR mapping Tiejun Chen
2015-07-09  5:33 ` [v7][PATCH 03/16] xen/passthrough: extend hypercall to support rdm reservation policy Tiejun Chen
2015-07-10 13:26   ` George Dunlap
2015-07-10 15:01     ` Jan Beulich
2015-07-10 15:07       ` George Dunlap
2015-07-13  6:37         ` Chen, Tiejun
2015-07-13  5:57       ` Chen, Tiejun
2015-07-13  6:47     ` Chen, Tiejun
2015-07-13  8:57       ` Jan Beulich
2015-07-14 10:46       ` George Dunlap
2015-07-14 10:53         ` Chen, Tiejun
2015-07-14 11:30           ` George Dunlap
2015-07-14 11:45             ` Jan Beulich
2015-07-14 13:25               ` George Dunlap
2015-07-09  5:33 ` [v7][PATCH 04/16] xen: enable XENMEM_memory_map in hvm Tiejun Chen
2015-07-09  5:33 ` [v7][PATCH 05/16] hvmloader: get guest memory map into memory_map[] Tiejun Chen
2015-07-10 13:49   ` George Dunlap
2015-07-13  7:03     ` Chen, Tiejun
2015-07-09  5:33 ` [v7][PATCH 06/16] hvmloader/pci: skip reserved ranges Tiejun Chen
2015-07-13 13:12   ` Jan Beulich
2015-07-14  6:39     ` Chen, Tiejun [this message]
2015-07-14  9:27       ` Jan Beulich
2015-07-14 10:54         ` Chen, Tiejun
2015-07-14 11:50           ` Jan Beulich
2015-07-15  0:55             ` Chen, Tiejun
2015-07-15  4:27               ` Chen, Tiejun
2015-07-15  8:34                 ` Jan Beulich
2015-07-15  8:59                   ` Chen, Tiejun
2015-07-15  9:10                     ` Chen, Tiejun
2015-07-15  9:27                     ` Jan Beulich
2015-07-15 10:34                       ` Chen, Tiejun
2015-07-15 11:25                         ` Jan Beulich
2015-07-15 11:34                           ` Chen, Tiejun
2015-07-15 13:56                             ` George Dunlap
2015-07-15 16:14                               ` George Dunlap
2015-07-16  2:05                                 ` Chen, Tiejun
2015-07-16  9:40                                   ` George Dunlap
2015-07-16 10:01                                     ` Chen, Tiejun
2015-07-15 11:05                       ` George Dunlap
2015-07-15 11:20                         ` Chen, Tiejun
2015-07-15 12:43                           ` George Dunlap
2015-07-15 13:23                             ` Chen, Tiejun
2015-07-15 11:24                         ` Jan Beulich
2015-07-15 11:38                           ` George Dunlap
2015-07-15 11:27                         ` Jan Beulich
2015-07-15 11:40                           ` Chen, Tiejun
2015-07-15  8:32               ` Jan Beulich
2015-07-15  9:04                 ` Chen, Tiejun
2015-07-15 12:57                 ` Wei Liu
2015-07-15 13:40     ` George Dunlap
2015-07-15 14:00       ` Jan Beulich
2015-07-15 15:19         ` George Dunlap
2015-07-09  5:33 ` [v7][PATCH 07/16] hvmloader/e820: construct guest e820 table Tiejun Chen
2015-07-13 13:35   ` Jan Beulich
2015-07-14  5:22     ` Chen, Tiejun
2015-07-14  9:32       ` Jan Beulich
2015-07-14 10:22         ` Chen, Tiejun
2015-07-14 10:48           ` Jan Beulich
2015-07-15 16:00   ` George Dunlap
2015-07-16  1:58     ` Chen, Tiejun
2015-07-16  9:41       ` George Dunlap
2015-07-09  5:33 ` [v7][PATCH 08/16] tools/libxc: Expose new hypercall xc_reserved_device_memory_map Tiejun Chen
2015-07-09  5:34 ` [v7][PATCH 09/16] tools: extend xc_assign_device() to support rdm reservation policy Tiejun Chen
2015-07-09  5:34 ` [v7][PATCH 10/16] tools: introduce some new parameters to set rdm policy Tiejun Chen
2015-07-09  9:20   ` Wei Liu
2015-07-09  9:44     ` Chen, Tiejun
2015-07-09 10:37       ` Ian Jackson
2015-07-09 10:53         ` Chen, Tiejun
2015-07-09 18:02   ` Ian Jackson
2015-07-10  0:46     ` Chen, Tiejun
2015-07-09  5:34 ` [v7][PATCH 11/16] tools/libxl: detect and avoid conflicts with RDM Tiejun Chen
2015-07-09  9:11   ` Wei Liu
2015-07-09  9:41     ` Chen, Tiejun
2015-07-09 18:14   ` Ian Jackson
2015-07-10  3:19     ` Chen, Tiejun
2015-07-10 10:14       ` Ian Jackson
2015-07-13  9:19         ` Chen, Tiejun
2015-07-09  5:34 ` [v7][PATCH 12/16] tools: introduce a new parameter to set a predefined rdm boundary Tiejun Chen
2015-07-09 18:14   ` Ian Jackson
2015-07-09  5:34 ` [v7][PATCH 13/16] libxl: construct e820 map with RDM information for HVM guest Tiejun Chen
2015-07-09 18:17   ` Ian Jackson
2015-07-10  5:40     ` Chen, Tiejun
2015-07-10  9:18       ` Ian Campbell
2015-07-13  9:47         ` Chen, Tiejun
2015-07-13 10:15           ` Ian Campbell
2015-07-14  5:44             ` Chen, Tiejun
2015-07-14  7:42               ` Ian Campbell
2015-07-14  8:03                 ` Chen, Tiejun
2015-07-10 10:15       ` Ian Jackson
2015-07-09  5:34 ` [v7][PATCH 14/16] xen/vtd: enable USB device assignment Tiejun Chen
2015-07-09  5:34 ` [v7][PATCH 15/16] xen/vtd: prevent from assign the device with shared rmrr Tiejun Chen
2015-07-13 13:41   ` Jan Beulich
2015-07-14  1:42     ` Chen, Tiejun
2015-07-14  9:19       ` Jan Beulich
2015-07-09  5:34 ` [v7][PATCH 16/16] tools: parse to enable new rdm policy parameters Tiejun Chen
2015-07-09 18:23   ` Ian Jackson
2015-07-10  6:05     ` Chen, Tiejun
2015-07-10 10:23       ` Ian Jackson
2015-07-13  9:31         ` Chen, Tiejun
2015-07-13  9:40           ` Ian Campbell
2015-07-13  9:55             ` Chen, Tiejun
2015-07-13 10:17               ` Ian Campbell
2015-07-13 17:08                 ` Ian Jackson
2015-07-14  1:29                   ` Chen, Tiejun
2015-07-10 14:50 ` [v7][PATCH 00/16] Fix RMRR George Dunlap
2015-07-10 14:56   ` Jan Beulich
2015-07-16  7:55   ` Jan Beulich
2015-07-16  8:03     ` Chen, Tiejun
2015-07-16  8:08       ` Jan Beulich
2015-07-16  8:13         ` Chen, Tiejun
2015-07-16  8:26           ` Jan Beulich
2015-07-16  9:27             ` George Dunlap
2015-07-16  9:44               ` Jan Beulich
2015-07-16  9:59                 ` George Dunlap
2015-07-16  8:30         ` Ian Campbell
2015-07-16  8:46           ` Wei Liu
2015-07-16  9:45           ` Lars Kurth

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=55A4AE88.2000200@intel.com \
    --to=tiejun.chen@intel.com \
    --cc=JBeulich@suse.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=ian.campbell@citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=keir@xen.org \
    --cc=stefano.stabellini@eu.citrix.com \
    --cc=wei.liu2@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).