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)