|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 1/7] VT-d: parse ACPI "SoC Integrated Address Translation Cache Reporting Structure"s
On 09.02.2024 10:00, Roger Pau Monné wrote:
> On Thu, Feb 08, 2024 at 04:29:34PM +0100, Jan Beulich wrote:
>> On 08.02.2024 10:17, Roger Pau Monné wrote:
>>> On Mon, Feb 05, 2024 at 02:55:17PM +0100, Jan Beulich wrote:
>>>> + {
>>>> + dprintk(XENLOG_WARNING VTDPREFIX,
>>>> + " Non-existent device (%pp) is reported in SATC
>>>> scope!\n",
>>>> + &PCI_SBDF(satcu->segment, b, d, f));
>>>> + ignore = true;
>>>
>>> This is kind of reporting is incomplete: as soon as one device is
>>> found the loop is exited and no further detection happens. If we want
>>> to print such information, we should do the full scan and avoid
>>> exiting early when a populated device is detected.
>>
>> Not sure I follow, but first of all - these are dprintk()s only, so
>> meant to only help in dev environments. Specifically ...
>>
>>>> + }
>>>> + else
>>>> + {
>>>> + ignore = false;
>>>> + break;
>>>> + }
>>>> + }
>>>> +
>>>> + if ( ignore )
>>>> + {
>>>> + dprintk(XENLOG_WARNING VTDPREFIX,
>>>> + " Ignore SATC for seg %04x as no device under its scope
>>>> is PCI discoverable!\n",
>>
>> ... this message is then issued only bogus entries were found. IOW
>> when a real device was found, there's no real reason to report N
>> other bogus ones, I think.
>
> I guess it's a question of taste. I do find it odd (asymmetric
> maybe?) that we stop reporting non-existing devices once a valid
> device is found. Makes me wonder what's the point of reporting them
> in the first place, if the list of non-existing devices is not
> complete?
Since you look to not be taking this into account, let me re-emphasize
that these are dprintk() only. In the event of an issue, seeing the
log messages you at least get a hint of one device that poses a
problem. That may or may not be enough of an indication for figuring
what's wrong. Making the loop run for longer than necessary when
especially in a release build there's not going to be any change (but
the logic would become [slightly] more complex, as after setting
"ignore" to true we'd need to avoid clearing it back to false) is just
pointless imo. IOW I view this 1st message as merely a courtesy for
the case where the 2nd one would end up also being logged.
>> Plus, whatever we change here ought to also / first change in
>> register_one_rmrr().
>
> I could live with those looking differently, or register_one_rmrr()
> can be adjusted later. Existing examples shouldn't be an argument to
> not make new additions better.
While I generally agree with this principle, in cases like this one it
needs weighing against consistency. Which I consider more important
here, to reduce the chance of making mistakes when fiddling with this
code later again.
>>>> + satcu = xzalloc(struct acpi_satc_unit);
>>>> + if ( !satcu )
>>>> + return -ENOMEM;
>>>> +
>>>> + satcu->segment = satc->segment;
>>>> + satcu->atc_required = satc->flags & 1;
>>>
>>> I would add this as a define in actbl2.h:
>>>
>>> #define ACPI_DMAR_ATC_REQUIRED (1U << 0)
>>>
>>> Or some such (maybe just using plain 1 is also fine).
>>
>> I intended to do so, but strictly staying in line with what Linux has.
>> To my surprise they use a literal number and have no #define. Hence I
>> didn't add any either.
>
> I would prefer the define unless you have strong objections, even if
> that means diverging from Linux.
I could probably accept such a #define living in one of dmar.[ch]. I'd
rather not see it go into actbl2.h.
>>>> +
>>>> + dev_scope_start = (const void *)(satc + 1);
>>>> + dev_scope_end = (const void *)satc + header->length;
>>>> + ret = acpi_parse_dev_scope(dev_scope_start, dev_scope_end,
>>>> + &satcu->scope, SATC_TYPE, satc->segment);
>>>> +
>>>> + if ( !ret && satcu->scope.devices_cnt )
>>>> + {
>>>> + ret = register_one_satc(satcu);
>>>> + /*
>>>> + * register_one_satc() returns greater than 0 when a specified
>>>> + * PCIe device cannot be detected. To prevent VT-d from being
>>>> + * disabled in such cases, reset the return value to 0 here.
>>>> + */
>>>> + if ( ret > 0 )
>>>> + ret = 0;
>>>> + }
>>>> + else
>>>> + xfree(satcu);
>>>
>>> You can safely use scope_devices_free() even if acpi_parse_dev_scope()
>>> failed, so you could unify the freeing here, instead of doing it in
>>> register_one_satc() also.
>>
>> Moving that out of acpi_parse_dev_scope() would feel wrong - if a
>> function fails, it would better not leave cleanup to its caller(s).
>
> Given that the caller here is the one that did the allocation my
> preference would be to also do the cleanup there - register_one_satc()
> has no need to know what needs freeing, and allows unifying the
> cleanup in a single place.
Hmm, you're right about the odd freeing behavior. I guess I really
ought to change that, but then first for register_one_rmrr() (seeing
that DRHD and ATSR parsing also do it that way). Which then of course
means also touching add_one_user_rmrr().
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |