|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [v8][PATCH 06/16] hvmloader/pci: disable all pci devices conflicting with rdm
On Thu, Jul 16, 2015 at 12:52 PM, Chen, Tiejun <tiejun.chen@xxxxxxxxx> wrote:
>>> + for ( i = 0; i < memory_map.nr_map ; i++ )
>>> + {
>>> + if ( memory_map.map[i].type != E820_RAM )
>>
>>
>> Here we're assuming that any region not marked as RAM is an RMRR. Is that
>> true?
>>
>> In any case, it would be just as strange to have a device BAR overlap
>> with guest RAM as with an RMRR, wouldn't it?
>
>
> OOPS! Actually I should take this,
>
> if ( memory_map.map[i].type == E820_RESERVED )
>
> This is same as when I check [RESERVED_MEMORY_DYNAMIC_START,
> RESERVED_MEMORY_DYNAMIC_END).
>
>
>>
>>> + {
>>> + uint64_t reserved_start, reserved_size;
>>> + reserved_start = memory_map.map[i].addr;
>>> + reserved_size = memory_map.map[i].size;
>>> + if ( check_overlap(bar_data , bar_sz,
>>> + reserved_start, reserved_size) )
>>> + {
>>> + is_conflict = true;
>>> + /* Now disable the memory or I/O mapping. */
>>> + printf("pci dev %02x:%x bar %02x : 0x%08x :
>>> conflicts "
>>> + "reserved resource so disable this
>>> device.!\n",
>>> + devfn>>3, devfn&7, bar_reg, bar_data);
>>> + cmd = pci_readw(devfn, PCI_COMMAND);
>>> + pci_writew(devfn, PCI_COMMAND, ~cmd);
>>> + break;
>>> + }
>>> + }
>>> +
>>> + /* Jump next device. */
>>> + if ( is_conflict )
>>> + {
>>> + is_conflict = false;
>>> + break;
>>> + }
>>
>>
>> This conditional is still inside the memory_map loop; you want it one
>> loop futher out, in the bar loop, don't you?
>
>
> Here what I intended to do is if one of all bars specific to one given
> device already conflicts with RDM, its not necessary to continue check other
> remaining bars of this device and other RDM regions, we just disable this
> device simply then check next device.
I know what you're trying to do; what I'm saying is I don't think it
does what you want it to do.
You have loops nested 3 deep:
1. for each dev
2. for each bar
3. for each memory range
This conditional is in loop 3; you want it to be in loop 2.
(In fact, when you set is_conflict, you then break out of loop 3 back
into loop 2; so this code will never actually be run.)
>> Also, if you declare is_conflict inside the devfn loop, rather than in
>> the main function, then you don't need this "is_conflict=false" here.
>>
>> It might also be more sensible to use a goto instead; but this is one
>
>
> This can work for me so it may be as follows:
>
> for ( devfn = 0; devfn < 256; devfn++ )
> {
> check_next_device:
> vendor_id = pci_readw(devfn, PCI_VENDOR_ID);
> device_id = pci_readw(devfn, PCI_DEVICE_ID);
> if ( (vendor_id == 0xffff) && (device_id == 0xffff) )
> continue;
> ...
> if ( check_overlap(bar_data , bar_sz,
> reserved_start, reserved_size) )
> {
> ...
> /* Jump next device. */
> devfn++;
> goto check_next_device;
> }
I'm not a fan of hard-coding the loop continuing condition like this;
if I were going to do a goto, I'd want to go to the end of the loop.
Anyway, the code is OK as it is; I'd rather spend time working on
something that's more of a blocker.
-George
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |