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)

Reply via email to