All of lore.kernel.org
 help / color / mirror / Atom feed
From: George Dunlap <george.dunlap@eu.citrix.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Cc: Ian Jackson <ian.jackson@citrix.com>,
	Hanweidong <hanweidong@huawei.com>,
	Stefano Stabellini <stefano.stabellini@citrix.com>,
	Ian Campbell <ian.campbell@citrix.com>,
	xen-devel@lists.xen.org
Subject: Re: [PATCH v2 1/5] hvmloader: Correct bug in low mmio region accounting
Date: Thu, 20 Jun 2013 09:56:06 +0100	[thread overview]
Message-ID: <51C2C3A6.1040406@eu.citrix.com> (raw)
In-Reply-To: <alpine.DEB.2.02.1306191813380.4548@kaball.uk.xensource.com>

On 19/06/13 18:18, Stefano Stabellini wrote:
> On Tue, 18 Jun 2013, George Dunlap wrote:
>> When deciding whether to map a device in low MMIO space (<4GiB),
>> hvmloader compares it with "mmio_left", which is set to the size of
>> the low MMIO range (pci_mem_end - pci_mem_start).  However, even if it
>> does map a device in high MMIO space, it still removes the size of its
>> BAR from mmio_left.
>>
>> This patch first changes the name of this variable to "low_mmio_left"
>> to distinguish it from generic MMIO, and corrects the logic to only
>> subtract the size of the BAR for devices maped in the low MMIO region.
>>
>> Also make low_mmio_left unsigned, and don't allow it to go negative.
>> Since its main use is to be compared to a 64-bit unsigned int, this
>> may have undefined (and in practice almost certainly incorrect)
>> results.  Not subtracting is OK because if there's not enough room, it
>> won't actually be mapped.
>>
>> Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
>> CC: Ian Jackson <ian.jackson@citrix.com>
>> CC: Ian Campbell <ian.campbell@citrix.com>
>> CC: Stefano Stabellini <stefano.stabellini@citrix.com>
>> CC: Hanweidong <hanweidong@huawei.com>
>> ---
>>   tools/firmware/hvmloader/pci.c |   10 +++++-----
>>   1 file changed, 5 insertions(+), 5 deletions(-)
>>
>> diff --git a/tools/firmware/hvmloader/pci.c b/tools/firmware/hvmloader/pci.c
>> index c78d4d3..8691a19 100644
>> --- a/tools/firmware/hvmloader/pci.c
>> +++ b/tools/firmware/hvmloader/pci.c
>> @@ -38,11 +38,10 @@ void pci_setup(void)
>>   {
>>       uint8_t is_64bar, using_64bar, bar64_relocate = 0;
>>       uint32_t devfn, bar_reg, cmd, bar_data, bar_data_upper;
>> -    uint64_t base, bar_sz, bar_sz_upper, mmio_total = 0;
>> +    uint64_t base, bar_sz, bar_sz_upper, low_mmio_left, mmio_total = 0;
>>       uint32_t vga_devfn = 256;
>>       uint16_t class, vendor_id, device_id;
>>       unsigned int bar, pin, link, isa_irq;
>> -    int64_t mmio_left;
>>   
>>       /* Resources assignable to PCI devices via BARs. */
>>       struct resource {
>> @@ -244,7 +243,7 @@ void pci_setup(void)
>>       io_resource.base = 0xc000;
>>       io_resource.max = 0x10000;
>>   
>> -    mmio_left = pci_mem_end - pci_mem_start;
>> +    low_mmio_left = pci_mem_end - pci_mem_start;
>>   
>>       /* Assign iomem and ioport resources in descending order of size. */
>>       for ( i = 0; i < nr_bars; i++ )
>> @@ -253,7 +252,7 @@ void pci_setup(void)
>>           bar_reg = bars[i].bar_reg;
>>           bar_sz  = bars[i].bar_sz;
>>   
>> -        using_64bar = bars[i].is_64bar && bar64_relocate && (mmio_left < bar_sz);
>> +        using_64bar = bars[i].is_64bar && bar64_relocate && (low_mmio_left < bar_sz);
>>           bar_data = pci_readl(devfn, bar_reg);
>>   
>>           if ( (bar_data & PCI_BASE_ADDRESS_SPACE) ==
>> @@ -273,9 +272,10 @@ void pci_setup(void)
>>               }
>>               else {
>>                   resource = &mem_resource;
>> +                if ( bar_sz <= low_mmio_left )
>> +                    low_mmio_left -= bar_sz;
> Why do you need this check? Isn't the above if(using_64bar && (bar_sz >
> PCI_MIN_BIG_BAR_SIZE)) enough?

This is in the lowmem region.  There may be regions which can't be 
relocated to the high PCI region that nevertheless don't fit in the low 
PCI region.  If it doesn't fit, it will hit the "no space for resource" 
conditional below and not be mapped; we need to make sure not to 
subtract it off.

I suppose a more robust method might be to use resource->max - 
resource->base instead of keeping a separate accounting... I had 
originally thought that would be too invasive a change, but I'm not so 
sure now... any thoughts?

  -George

  reply	other threads:[~2013-06-20  8:56 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-18 16:46 [PATCH v2 1/5] hvmloader: Correct bug in low mmio region accounting George Dunlap
2013-06-18 16:46 ` [PATCH v2 2/5] hvmloader: Load large devices into high MMIO space as needed George Dunlap
2013-06-19 17:18   ` Stefano Stabellini
2013-06-20  9:23     ` George Dunlap
2013-06-20  9:47   ` Jan Beulich
2013-06-18 16:46 ` [PATCH v2 3/5] hvmloader: Remove minimum size for BARs to relocate to 64-bit space George Dunlap
2013-06-19 17:18   ` Stefano Stabellini
2013-06-19 21:14   ` Wei Liu
2013-06-20  9:01     ` George Dunlap
2013-06-20  9:48   ` Jan Beulich
2013-06-18 16:46 ` [PATCH v2 4/5] hvmloader: Fix check for needing a 64-bit bar George Dunlap
2013-06-19 17:18   ` Stefano Stabellini
2013-06-20 10:01   ` Jan Beulich
2013-06-20 10:21     ` George Dunlap
2013-06-18 16:46 ` [PATCH v2 5/5] libxl, hvmloader: Don't relocate memory for MMIO hole George Dunlap
2013-06-18 17:16   ` George Dunlap
2013-06-19 17:18   ` Stefano Stabellini
2013-06-20  9:22     ` George Dunlap
2013-06-20 10:12       ` Jan Beulich
2013-06-20 10:20         ` George Dunlap
2013-06-20 10:29           ` Stefano Stabellini
2013-06-20 10:56             ` Jan Beulich
2013-06-20 10:59               ` George Dunlap
2013-06-20 11:01             ` George Dunlap
2013-06-20 13:35               ` Ian Jackson
2013-06-20 14:06                 ` George Dunlap
2013-06-20 10:37           ` Ian Jackson
2013-06-20 10:44             ` George Dunlap
2013-06-20 10:52           ` Jan Beulich
2013-06-20 10:49       ` Stefano Stabellini
2013-06-25  9:56       ` Ian Campbell
2013-06-25 10:15         ` George Dunlap
2013-06-18 16:53 ` [PATCH v2 1/5] hvmloader: Correct bug in low mmio region accounting George Dunlap
2013-06-19 17:18 ` Stefano Stabellini
2013-06-20  8:56   ` George Dunlap [this message]
2013-06-20 10:40     ` Stefano Stabellini
2013-06-20 10:43       ` George Dunlap
2013-06-20  9:36 ` Jan Beulich

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=51C2C3A6.1040406@eu.citrix.com \
    --to=george.dunlap@eu.citrix.com \
    --cc=hanweidong@huawei.com \
    --cc=ian.campbell@citrix.com \
    --cc=ian.jackson@citrix.com \
    --cc=stefano.stabellini@citrix.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 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.