Page MenuHomeFreeBSD

D59481-LIFECYCLE-TRACE.txt

Authored By
oleglelchuk_gmail.com
Sep 15 2026, 10:39 PM
Size
5 KB
Referenced Files
None
Subscribers
None

D59481-LIFECYCLE-TRACE.txt

D59481 managed-PFN lifecycle trace
Software:
FreeBSD main: 7f8feee5ab922e6645f4061e9ca29109411aadef (unmodified GENERIC)
drm-kmod: 1d04976c1870bce01094b78e46c48f6eab810867 (unmodified)
Capture context:
This 12-second DTrace capture followed the formal Sway hang on the same boot.
A seven-second vkcube run supplied a short, bounded graphics trigger.
It proves the ownership-transfer and orphan-free lifecycle, but does not
identify the particular Sway buffer involved in the earlier hang.
--- DTRACE PROGRAM ---
#!/usr/sbin/dtrace -qs
#pragma D option quiet
fbt:kernel:lkpi_vmf_insert_pfn_prot_locked:entry
{
self->pfn_insert_active = 1;
@pfn_insert[execname] = count();
}
fbt:kernel:swap_pager_unswapped:entry
/self->pfn_insert_active/
{
@swap_backing_discard[execname] = count();
}
fbt:kernel:vm_page_remove:entry
/self->pfn_insert_active/
{
@source_page_remove[execname] = count();
}
fbt:kernel:vm_page_iter_insert:entry
/self->pfn_insert_active/
{
@target_page_insert[execname] = count();
}
fbt:kernel:lkpi_vmf_insert_pfn_prot_locked:return
/self->pfn_insert_active/
{
self->pfn_insert_active = 0;
}
fbt:i915kms:shmem_get_pages:entry
{
@shmem_get[execname] = count();
}
fbt:i915kms:__i915_gem_object_put_pages:entry
{
self->put_pages = 1;
@put_pages[execname] = count();
}
fbt:i915kms:i915_gem_object_release_mmap_offset:entry
/self->put_pages/
{
self->release_mmap = 1;
@release_mmap[execname] = count();
}
fbt:kernel:lkpi_unmap_mapping_range:entry
/self->release_mmap/
{
self->unmap_range = 1;
@unmap_range[execname] = count();
}
fbt:kernel:cdev_mgtdev_pager_free_pages:entry
/self->unmap_range/
{
@cdev_free_pages[execname] = count();
}
fbt:kernel:cdev_mgtdev_pager_free_page:entry
/self->unmap_range/
{
@cdev_remove_page[execname] = count();
}
fbt:kernel:vm_page_iter_remove:entry
/self->unmap_range/
{
@page_iter_remove[execname] = count();
}
fbt:kernel:vm_page_remove:entry
/self->unmap_range/
{
@page_remove_in_unmap[execname] = count();
}
fbt:kernel:lkpi_unmap_mapping_range:return
/self->unmap_range/
{
self->unmap_range = 0;
}
fbt:i915kms:shmem_sg_free_table:entry
/self->put_pages/
{
self->free_sg = 1;
@shmem_sg_free[execname] = count();
}
fbt:kernel:vm_page_unwire:entry
/self->free_sg/
{
this->m = (struct vm_page *)arg0;
@page_unwire_in_sg_free[execname] = count();
@unwire_object_null[execname, (int)(this->m->object == 0)] = count();
@unwire_ref_count[execname, this->m->ref_count] = count();
}
fbt:kernel:vm_page_free:entry
/self->free_sg/
{
@page_free_in_sg_free[execname] = count();
}
fbt:kernel:vm_page_free_toq:entry
/self->free_sg/
{
@page_free_toq_in_sg_free[execname] = count();
}
fbt:i915kms:shmem_sg_free_table:return
/self->free_sg/
{
self->free_sg = 0;
}
fbt:i915kms:__i915_gem_object_put_pages:return
/self->put_pages/
{
self->release_mmap = 0;
self->put_pages = 0;
}
tick-12s
{
exit(0);
}
END
{
printa("pfn_insert %-16s %@d\n", @pfn_insert);
printa("swap_backing_discard %-16s %@d\n", @swap_backing_discard);
printa("source_page_remove %-16s %@d\n", @source_page_remove);
printa("target_page_insert %-16s %@d\n", @target_page_insert);
printa("shmem_get %-16s %@d\n", @shmem_get);
printa("put_pages %-16s %@d\n", @put_pages);
printa("release_mmap %-16s %@d\n", @release_mmap);
printa("unmap_range %-16s %@d\n", @unmap_range);
printa("cdev_free_pages %-16s %@d\n", @cdev_free_pages);
printa("cdev_remove_page %-16s %@d\n", @cdev_remove_page);
printa("page_iter_remove %-16s %@d\n", @page_iter_remove);
printa("page_remove_in_unmap %-16s %@d\n", @page_remove_in_unmap);
printa("shmem_sg_free %-16s %@d\n", @shmem_sg_free);
printa("page_unwire_in_sg_free %-16s %@d\n", @page_unwire_in_sg_free);
printa("unwire_object_null %-16s null=%d %@d\n", @unwire_object_null);
printa("unwire_ref_count %-16s ref=%u %@d\n", @unwire_ref_count);
printa("page_free_in_sg_free %-16s %@d\n", @page_free_in_sg_free);
printa("page_free_toq_in_sg_free %-16s %@d\n", @page_free_toq_in_sg_free);
}
--- RAW AGGREGATE OUTPUT ---
pfn_insert sway 512
pfn_insert vkcube 3151
swap_backing_discard sway 512
swap_backing_discard vkcube 3151
source_page_remove sway 512
source_page_remove vkcube 3151
target_page_insert sway 512
target_page_insert vkcube 3151
shmem_get sway 1
shmem_get vkcube 31
put_pages vkcube 3
put_pages pagedaemon 4
put_pages kernel 268
release_mmap vkcube 3
release_mmap kernel 268
shmem_sg_free vkcube 3
shmem_sg_free kernel 28
page_unwire_in_sg_free vkcube 70
page_unwire_in_sg_free kernel 4820
unwire_object_null vkcube null=0 6
unwire_object_null vkcube null=1 64
unwire_object_null kernel null=0 1733
unwire_object_null kernel null=1 3087
unwire_ref_count vkcube ref=2147483649 6
unwire_ref_count vkcube ref=1 64
unwire_ref_count kernel ref=2147483649 1733
unwire_ref_count kernel ref=1 3087
page_free_toq_in_sg_free vkcube 64
page_free_toq_in_sg_free kernel 3130

File Metadata

Mime Type
text/x-c
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
39033838
Default Alt Text
D59481-LIFECYCLE-TRACE.txt (5 KB)

Event Timeline