On Sat, 2010-10-09 at 23:44 +0200, Michael S. Tsirkin wrote: > On Fri, Oct 08, 2010 at 09:12:52AM -0600, Alex Williamson wrote: > > On Fri, 2010-10-08 at 10:40 +0200, Michael S. Tsirkin wrote: > > > On Thu, Oct 07, 2010 at 10:02:25PM -0600, Alex Williamson wrote: > > > > On Fri, 2010-10-08 at 00:45 +0200, Michael S. Tsirkin wrote: > > > > > On Thu, Oct 07, 2010 at 11:34:01AM -0600, Alex Williamson wrote: > > > > > > On Thu, 2010-10-07 at 19:18 +0200, Michael S. Tsirkin wrote: > > > > > > > On Mon, Oct 04, 2010 at 03:26:30PM -0600, Alex Williamson wrote: > > > > > > > > --- a/hw/device-assignment.c > > > > > > > > +++ b/hw/device-assignment.c > > > > > > ... > > > > > > > > @@ -1644,58 +1621,64 @@ void add_assigned_devices(PCIBus *bus, const char **devices, int n_devices) > > > > > > > > */ > > > > > > > > static void assigned_dev_load_option_rom(AssignedDevice *dev) > > > > > > > > { > > > > > > > > - int size, len, ret; > > > > > > > > - void *buf; > > > > > > > > + char name[32], rom_file[64]; > > > > > > > > FILE *fp; > > > > > > > > - uint8_t i = 1; > > > > > > > > - char rom_file[64]; > > > > > > > > + uint8_t val; > > > > > > > > + struct stat st; > > > > > > > > + void *ptr; > > > > > > > > + > > > > > > > > + /* If loading ROM from file, pci handles it */ > > > > > > > > + if (dev->dev.romfile || !dev->dev.rom_bar) > > > > > > > > + return; > > > > > > > > > > > > > > > > snprintf(rom_file, sizeof(rom_file), > > > > > > > > "/sys/bus/pci/devices/%04x:%02x:%02x.%01x/rom", > > > > > > > > dev->host.seg, dev->host.bus, dev->host.dev, dev->host.func); > > > > > > > > > > > > > > > > - if (access(rom_file, F_OK)) > > > > > > > > + if (stat(rom_file, &st)) { > > > > > > > > return; > > > > > > > > + } > > > > > > > > > > > > > > > > > > > > > > Just a note that stat on the ROM sysfs file returns window size, > > > > > > > not the ROM size. So this allocates more ram than really necessary for > > > > > > > ROM. Real size is returned by fread. > > > > > > > > > > > > > > Do we care? > > > > > > > > > > > > That was my intention with using stat. I thought that by default the > > > > > > ROM BAR should match physical hardware, so even if the contents could be > > > > > > rounded down to a smaller size, we maintain the size of the physical > > > > > > device. To use the minimum size, the contents could be extracted using > > > > > > pci-sysfs and passed with the romfile option, or the ROM could be > > > > > > disabled altogether with the rombar=0 option. Sound reasonable? > > > > > > Thanks, > > > > > > > > > > > > Alex > > > > > > > > > > For BAR size yes, but we do not need the buffer full of 0xff as it is > > > > > never accessed: let's have buffer size match real ROM, avoid wasting > > > > > memory: this can come up to megabytes easily. > > > > > Makes sense? > > > > > > > > I tend to doubt that hardware vendors are going to waste money putting > > > > seriously oversized eeproms on devices. It does seem pretty typical to > > > > find graphics cards with 128K ROM BARs where the actual ROM squeezes > > > > just under 64K, but that's a long way from megabytes of wasted memory. > > > > The only device I have with a ROM BAR in the megabytes is an 82576, but > > > > it comes up as an invalid rom through pci-sysfs, so we skip it. I > > > > assume that just means someone was lazy and didn't bother to fuse a > > > > transistor that disables the ROM BAR, leaving it at it's maximum > > > > aperture w/ no eeprom to back it. Anyone know? Examples to the > > > > contrary welcome. > > > > > > > > So I think the question comes down to whether there's any value to > > > > trying to exactly mimic the resource layout of the device. I'm doubtful > > > > that there is, but at the potential cost of 10-100s of KBs of memory, I > > > > thought it might be worthwhile. If you feel strongly otherwise, I'll > > > > follow-up with a patch to size it by the actual readable contents. > > > > Thanks, > > > > > > > > Alex > > > > > > I actually agree sizing ROM BAR exactly the same as the device > > > is a good idea. I just thought we can save the extra memory > > > by not allocating the RAM in question, and writing code > > > to return 0xff on reads within the BAR but outside ROM. > > > And no, I don't feel strongly about this optimization. > > > > > > > Ok, so you're looking for something like below. We can no longer map > > the ROM into the guest, > > but it's a ROM, so we don't care about speed. > > Why can't we map ROM? Map full pages, leave 0xff unmapped. > The reason there will be such is because BAR is power of 2. If I understand correctly, you're suggesting we round the ROM up to a power of two, allocate a full buffer to back that, and map that to the guest. If the physical device has a larger ROM BAR, the remainder is pointed to a set of read functions that return 0xff and probably never get called. > > Here's the big problem... it breaks migration. The ramblock live > > migration code isn't going to deal well with migration from a VM with a > > BAR sized ramblock to a ROM sized ramblock (likewise the reverse). > > You mean cross-version migration? Otherwise, why would not both > sides be ROM sized? Yes, cross-version migration, though probably not an issue with the above since it doesn't change the size of existing emulated device ROMs. > > So > > we could do it for passthrough devices since they can't migrate anyway, > > but then we have to go back to separate code to handle assigned device > > ROMs vs emulated device ROMs. > > I think this is based on the assumption we do not map ROM. > If we do map it, then most of the code is still same, > just add 0xff handling for pages after end of ROM. > These typically are unaccessed anyway. Not on the no mapping assumption, but the assumption that you were looking to use the minimum buffer to back the ROM. If we agree that it's ok to waste memory rounding the ROM up to a power of two, then things work out a little better, though I'm still dubious whether the memory savings is worth the code necessary to potentially handle the ROM as two discrete pieces. Thanks, Alex -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html