On 09.09.2021 08:13, Oleksandr Andrushchenko wrote:
>
> On 06.09.21 17:51, Jan Beulich wrote:
>> On 03.09.2021 12:08, Oleksandr Andrushchenko wrote:
>>> @@ -37,12 +41,28 @@ static int map_range(unsigned long s, unsigned long e,
>>> void *data,
>>> unsigned long *c)
>>> {
>>> const struct map_data *map = data;
>>> + gfn_t start_gfn;
>>> int rc;
>>>
>>> for ( ; ; )
>>> {
>>> unsigned long size = e - s + 1;
>>>
>>> + /*
>>> + * Any BAR may have holes in its memory we want to map, e.g.
>>> + * we don't want to map MSI regions which may be a part of that
>>> BAR,
>>> + * e.g. when a single BAR is used for both MMIO and MSI.
>>> + * In this case MSI regions are subtracted from the mapping, but
>>> + * map->start_gfn still points to the very beginning of the BAR.
>>> + * So if there is a hole present then we need to adjust start_gfn
>>> + * to reflect the fact of that substraction.
>>> + */
>>> + start_gfn = gfn_add(map->start_gfn, s - mfn_x(map->start_mfn));
>> I may be missing something, but don't you need to adjust "size" then
>> as well?
>
> No, as range sets get consumed we have e and s updated accordingly,
> so each time size represents the right value.
It feels like something's wrong with the rangeset construction then:
Either it represents _all_ holes (including degenerate ones at the
start of end of a range), or none of them.
Jan