On Tue, 11 Jun 2019 at 15:29, Eric Auger <[email protected]> wrote: > > An IOVA/ASID invalidation is notified to all IOMMU Memory Regions > through smmuv3_inv_notifiers_iova/smmuv3_notify_iova. > > When the notification occurs it is possible that some of the > PCIe devices associated to the notified regions do not have a > valid stream table entry. In that case we output a LOG_GUEST_ERROR > message. > > invalid sid=<SID> (L1STD span=0) > "smmuv3_notify_iova error decoding the configuration for iommu mr=<MR> > > This is unfortunate as the user gets the impression that there > are some translation decoding errors whereas there are not. > > This patch adds a new field in SMMUEventInfo that tells whether > the detction of an invalid STE msut lead to an error report. > invalid_ste_allowed is set before doing the invalidations and > kept unset on actual translation. > > Signed-off-by: Eric Auger <[email protected]> > > --- > > I also experimented to pass Error handles to all the subfunctions > and handle the Error at top level but that's intricate to sort > out the various kinds of errors, whether they need to be logged, > and if so if they match LOG_GUEST_ERRoR mask or unimplemented > mask. So I think just passing this boolean has a lesser impact on > the code base. > --- > hw/arm/smmuv3-internal.h | 1 + > hw/arm/smmuv3.c | 11 +++++------ > 2 files changed, 6 insertions(+), 6 deletions(-) > > diff --git a/hw/arm/smmuv3-internal.h b/hw/arm/smmuv3-internal.h > index b160289cd1..d190181ef1 100644 > --- a/hw/arm/smmuv3-internal.h > +++ b/hw/arm/smmuv3-internal.h > @@ -381,6 +381,7 @@ typedef struct SMMUEventInfo { > uint32_t sid; > bool recorded; > bool record_trans_faults; > + bool inval_ste_allowed; > union { > struct { > uint32_t ssid; > diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c > index fd8ec7860e..e2f07d2864 100644 > --- a/hw/arm/smmuv3.c > +++ b/hw/arm/smmuv3.c > @@ -404,7 +404,7 @@ static int smmu_find_ste(SMMUv3State *s, uint32_t sid, > STE *ste, > > span = L1STD_SPAN(&l1std); > > - if (!span) { > + if (!span && !event->inval_ste_allowed) { > /* l2ptr is not valid */ > qemu_log_mask(LOG_GUEST_ERROR, > "invalid sid=%d (L1STD span=0)\n", sid);
Why is this specific qemu_log_mask() the only one we need to suppress ? thanks -- PMM
