|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] AMD/IOMMU: Common the #732/#733 errata handling in iommu_read_log()
On 14.02.2020 19:55, Andrew Cooper wrote:
> There is no need to have both helpers implement the same workaround. The size
> and layout of the the Event and PPR logs (and others for that matter) share a
> lot of commonality.
>
> Use MASK_EXTR() to locate the code field, and use ACCESS_ONCE() rather than
> barrier() to prevent hoisting of the repeated read.
>
> Avoid unnecessary zeroing by only clobbering the 'code' field - this alone is
> sufficient to spot the errata when the rings wrap.
>
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
with one remark / adjustment request:
> @@ -319,11 +319,36 @@ static int iommu_read_log(struct amd_iommu *iommu,
>
> while ( tail != log->head )
> {
> - /* read event log entry */
> - entry = log->buffer + log->head;
> + uint32_t *entry = log->buffer + log->head;
> + unsigned int count = 0;
> +
> + /* Event and PPR logs have their code field in the same position. */
> + unsigned int code = MASK_EXTR(entry[1], IOMMU_EVENT_CODE_MASK);
> +
> + /*
> + * Workaround for errata #732, #733:
> + *
> + * It can happen that the tail pointer is updated before the actual
> + * entry got written. As suggested by RevGuide, we initialize the
> + * buffer to all zeros and clear entries after processing them.
I don't think "clear entries" is applicable anymore with ...
> + */
> + while ( unlikely(code == 0) )
> + {
> + if ( unlikely(++count == IOMMU_LOG_ENTRY_TIMEOUT) )
> + {
> + AMD_IOMMU_DEBUG("AMD-Vi: No entry written to %s Log\n",
> + log == &iommu->event_log ? "Event" : "PPR");
> + return 0;
> + }
> + udelay(1);
> + code = MASK_EXTR(ACCESS_ONCE(entry[1]), IOMMU_EVENT_CODE_MASK);
> + }
>
> parse_func(iommu, entry);
>
> + /* Clear 'code' to be able to spot the erratum when the ring wraps.
> */
> + ACCESS_ONCE(entry[1]) = 0;
... this. Perhaps at least add "sufficiently"?
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |