Le Mon, Feb 01, 2021 at 01:49:09PM +0100, Alexandr Nedvedicky a écrit :
> Hello Denis,
>
> I think we need to refresh expected value in 'flags'
> with every loop iteration. does diff below help?
>
Thank you but it does not help. Same panic and also same panic if I test with
loop++ > 100000.
If loop++ > 1000000, no more panic but I get :
xnf0 detached
xen0: failed to attach "device/vif/"
> regards
> sashan
>
> --------8<---------------8<---------------8<------------------8<--------
> diff --git a/sys/dev/pv/xen.c b/sys/dev/pv/xen.c
> index 11ce4ca99cd..c93e68614b4 100644
> --- a/sys/dev/pv/xen.c
> +++ b/sys/dev/pv/xen.c
> @@ -1202,20 +1202,22 @@ xen_grant_table_remove(struct xen_softc *sc,
> grant_ref_t ref)
> flags = (ge->ge_table[ref].flags & ~(GTF_reading|GTF_writing)) |
> (ge->ge_table[ref].domid << 16);
> loop = 0;
> while (atomic_cas_uint(ptr, flags, GTF_invalid) != flags) {
> if (loop++ > 10) {
> panic("grant table reference %u is held "
> "by domain %d: frame %#x flags %#x",
> ref + ge->ge_start, ge->ge_table[ref].domid,
> ge->ge_table[ref].frame, ge->ge_table[ref].flags);
> }
> + flags = (ge->ge_table[ref].flags & ~(GTF_reading|GTF_writing)) |
> + (ge->ge_table[ref].domid << 16);
> #if (defined(__amd64__) || defined(__i386__))
> __asm volatile("pause": : : "memory");
> #endif
> }
> ge->ge_table[ref].frame = 0xffffffff;
> }
>
> int
> xen_bus_dmamap_create(bus_dma_tag_t t, bus_size_t size, int nsegments,
> bus_size_t maxsegsz, bus_size_t boundary, int flags, bus_dmamap_t *dmamp)