[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 Mon, May 06, 2024 at 01:01:48PM +0200, Jan Beulich wrote: > 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> Acked-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> I think however it should be mentioned in the description that introduced code attempts to stay in sync with the existing register_one_satc and acpi_parse_one_*() functions. > >> --- > >> 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 ... Oh, yes, IIRC you already mentioned this in v1, yet I've forgot when reviewing this one. Thanks, Roger.
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |