[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [v3][PATCH 07/16] hvmloader/pci: skip reserved ranges
>>> On 17.06.15 at 09:54, <tiejun.chen@xxxxxxxxx> wrote: > On 2015/6/17 15:19, Jan Beulich wrote: >>>>> On 17.06.15 at 09:10, <tiejun.chen@xxxxxxxxx> wrote: >>> Yeah, this may waste some spaces in this worst case but I this think >>> this can guarantee our change don't impact on the original expectation, >>> right? >> >> "Some space" may be multiple Gb (e.g. the frame buffer of a graphics > > Sure. > >> card), which is totally unacceptable. >> > > But then I don't understand what's your way. How can we fit all pci > devices just with "the smallest power-of-2 region enclosing the reserved > device memory"? > > For example, the whole pci memory is sitting at > [0xa0000000, 0xa2000000]. And there are two PCI devices, A and B. Note > each device needs to be allocated with 0x1000000. So if without > concerning RMRR, > > A. [0xa0000000,0xa1000000] > B. [0xa1000000,0xa2000000] > > But if one RMRR resides at [0xa0f00000, 0xa1f00000] which obviously > generate its own alignment with 0x1000000. So the pci memory is expended > as [0xa0000000, 0xa3000000], right? > > Then actually the whole pci memory can be separated three segments like, > > #1. [0xa0000000, 0xa0f00000] > #2. [0xa0f00000, 0xa1f00000] -> RMRR would occupy > #3. [0xa1f00000, 0xa3000000] > > So just #3 can suffice to allocate but just for one device, right? Right, i.e. this isn't even sufficient - you need [a0000000,a3ffffff] to fit everything (but of course you can put smaller BARs into the unused ranges [a0000000,a0efffff] and [a1f00000,a1ffffff]). That's why I said it's not going to be tricky to get all corner cases right _and_ not use up more space than needed. >>>> ought to work out the smallest power-of-2 region enclosing the >>> >>> Okay. I remember the smallest size of a given PCI I/O space is 8 bytes, >>> and the smallest size of a PCI memory space is 16 bytes. So >>> >>> /* At least 16 bytes to align a PCI BAR size. */ >>> uint64_t align = 16; >>> >>> reserved_start = memory_map.map[j].addr; >>> reserved_size = memory_map.map[j].size; >>> >>> reserved_start = (reserved_star + align) & ~(align - 1); >>> reserved_size = (reserved_size + align) & ~(align - 1); >>> >>> Is this correct? >> >> Simply aligning the region doesn't help afaict. You need to fit it >> with the other MMIO allocations. > > I guess you're saying just those mmio allocations conflicting with RMRR? > But we don't know these exact addresses until we finalize to allocate > them, right? That's the point - you need to allocate them _around_ the reserved regions. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |