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 11:43:21 +0100 [thread overview]
Message-ID: <51C2DCC9.80209@eu.citrix.com> (raw)
In-Reply-To: <alpine.DEB.2.02.1306201136280.4548@kaball.uk.xensource.com>
On 20/06/13 11:40, Stefano Stabellini wrote:
> On Thu, 20 Jun 2013, George Dunlap wrote:
>> 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?
> You could just add:
>
> if (resource == &mem_resource)
> low_mmio_left -= bar_sz;
>
> right below the resource size check. This way we would have only one
> check to see if the bar fits.
Actually I just changed v3 to rid of low_mmio_left altogether, and just
use "mem_resource.max - mem_resource.base" for the one and only time the
value is needed.
-George
next prev parent reply other threads:[~2013-06-20 10:43 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
2013-06-20 10:40 ` Stefano Stabellini
2013-06-20 10:43 ` George Dunlap [this message]
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=51C2DCC9.80209@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.