|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 03/12] VT-d: parse ACPI "SoC Integrated Address Translation Cache Reporting Structure"s
On 06.05.2024 12:29, Roger Pau Monné wrote:
> On Thu, Feb 15, 2024 at 11:14:31AM +0100, Jan Beulich wrote:
>> This is a prereq to us, in particular, respecting the "ATC required"
>> flag.
>>
>> Note that ACPI_SATC_ATC_REQUIRED has its #define put in dmar.h, as we
>> try to keep actbl*.h in sync what Linux (who in turn inherit from ACPI
>> CA) has.
>>
>> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
>> ---
>> Lovely: On the SPR system with the SATC I tried passing "ats" (the
>> "required" flag is clear there), just to then hit "IOMMU#4: QI dev wait
>> descriptor taking too long" while setting up Dom0. The 2nd message there
>> doesn't ever appear, so the request never completes. Not sure whether
>> that's us doing something wrong or the hardware acting up. In the former
>> case I'd generally expect an IOMMU fault to be raised, though. FTR same
>> on 4.18 with just "VT-d: correct ATS checking for root complex
>> integrated devices" backported there.
>
> Great, so we likely have a bug in our ATS implementation?
Or there's a hardware / firmware issue. As said in the remark, while I'm
not really sure which one it is, I'd kind of expect some form of error
indication rather than just a hang if we did something wrong.
>> --- a/xen/drivers/passthrough/vtd/dmar.c
>> +++ b/xen/drivers/passthrough/vtd/dmar.c
>> @@ -47,6 +47,7 @@ LIST_HEAD_READ_MOSTLY(acpi_drhd_units);
>> LIST_HEAD_READ_MOSTLY(acpi_rmrr_units);
>> static LIST_HEAD_READ_MOSTLY(acpi_atsr_units);
>> static LIST_HEAD_READ_MOSTLY(acpi_rhsa_units);
>> +static LIST_HEAD_READ_MOSTLY(acpi_satc_units);
>
> We could even make this one RO after init.
Maybe, after first introducing LIST_HEAD_RO_AFTER_INIT() and then
perhaps switching the others up front. IOW I'd prefer to keep those
consistent and then (if so desired) update them all in one go.
>> @@ -750,6 +751,93 @@ acpi_parse_one_rhsa(struct acpi_dmar_hea
>> return ret;
>> }
>>
>> +static int __init register_one_satc(struct acpi_satc_unit *satcu)
>> +{
>> + bool ignore = false;
>> + unsigned int i = 0;
>> + int ret = 0;
>> +
>> + /* Skip checking if segment is not accessible yet. */
>> + if ( !pci_known_segment(satcu->segment) )
>> + i = UINT_MAX;
>> +
>> + for ( ; i < satcu->scope.devices_cnt; i++ )
>> + {
>> + uint8_t b = PCI_BUS(satcu->scope.devices[i]);
>> + uint8_t d = PCI_SLOT(satcu->scope.devices[i]);
>> + uint8_t f = PCI_FUNC(satcu->scope.devices[i]);
>> +
>> + if ( !pci_device_detect(satcu->segment, b, d, f) )
>> + {
>> + dprintk(XENLOG_WARNING VTDPREFIX,
>> + " Non-existent device (%pp) is reported in SATC
>> scope!\n",
>> + &PCI_SBDF(satcu->segment, b, d, f));
>> + ignore = true;
>> + }
>> + 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",
>> + satcu->segment);
>
> Re the error messages: won't it be better to print them using plain
> printk and gate on iommu_verbose being enabled if anything?
>
> It does seem a bit odd that such messages won't be printed when
> iommu={debug,verbose} is enabled on the command line.
Well, perhaps yes. Yet I'm trying here to stay (largely) in sync with how
in particular register_one_rmrr() behaves. Do you strictly think I should
diverge here?
>> +static int __init
>> +acpi_parse_one_satc(const struct acpi_dmar_header *header)
>> +{
>> + const struct acpi_dmar_satc *satc =
>> + container_of(header, const struct acpi_dmar_satc, header);
>> + struct acpi_satc_unit *satcu;
>> + const void *dev_scope_start, *dev_scope_end;
>> + int ret = acpi_dmar_check_length(header, sizeof(*satc));
>> +
>> + if ( ret )
>> + return ret;
>> +
>> + satcu = xzalloc(struct acpi_satc_unit);
>> + if ( !satcu )
>> + return -ENOMEM;
>> +
>> + satcu->segment = satc->segment;
>> + satcu->atc_required = satc->flags & ACPI_SATC_ATC_REQUIRED;
>> +
>> + dev_scope_start = (const void *)(satc + 1);
>> + dev_scope_end = (const void *)satc + header->length;
>
> Isn't it enough to just cast to void * and inherit the const from the
> left side variable declaration?
Misra won't like the (transient) removal of const, afaict. Personally I
also consider it bad practice to omit such const.
> You could even initialize dev_scope_{start,end} at definition.
Right. This is again the way it is to be in sync with other
acpi_parse_one_...() functions. It's always hard to judge where to diverge
and where consistency is weighed higher. Whichever way you do it, you may
get comment asking for the opposite ...
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |