+ F=sys/dev/drm/drm_gem.c + sed -n 576,588p sys/dev/drm/drm_gem.c obj->map_list.key = alloc_unr(mm->idxunr); ret = drm_ht_insert_item(&mm->offset_hash, &obj->map_list); if (ret != 0) { DRM_ERROR("failed to add to map hash\n"); free_unr(mm->idxunr, obj->map_list.key); return (ret); } obj->on_map = true; return drm_vma_offset_add(dev->vma_offset_manager, &obj->vma_node, size / PAGE_SIZE); } EXPORT_SYMBOL(drm_gem_create_mmap_offset_size); + echo -- on_map=true precedes the vma_offset_add return value -- -- on_map=true precedes the vma_offset_add return value -- + grep -n obj->on_map = true sys/dev/drm/drm_gem.c 583: obj->on_map = true; + grep -n return drm_vma_offset_add sys/dev/drm/drm_gem.c 585: return drm_vma_offset_add(dev->vma_offset_manager, &obj->vma_node, + echo -- retry path returns early on on_map, hiding the failed state -- -- retry path returns early on on_map, hiding the failed state -- + grep -n if (obj->on_map) sys/dev/drm/drm_gem.c 573: if (obj->on_map) + grep -n if (obj->on_map) sys/dev/drm/drm_gem.c + head -1 + cut -d: -f1 + sed -n 573,+2p sys/dev/drm/drm_gem.c if (obj->on_map) return (0); + echo -- cleanup only happens at object release (drm_gem_free_mmap_offset) -- -- cleanup only happens at object release (drm_gem_free_mmap_offset) -- + grep -n obj->on_map = false sys/dev/drm/drm_gem.c 543: obj->on_map = false;