Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 16 Jun 2021 22:16:56 -0700
From:      Neel Chauhan <nc@FreeBSD.org>
To:        Mark Johnston <markj@freebsd.org>
Cc:        current@freebsd.org
Subject:   Re: Kernel/driver hacking: panic: Assertion vm_object_busied((m->object)) failed at /usr/src/sys/vm/vm_page.c:5455
Message-ID:  <8bd27c2a72ebfa9299bca7d930297faf@FreeBSD.org>
In-Reply-To: <YMpnf3DcEw6A/rzD@nuc>
References:  <e542a0c737f24d15df0fadd985e94938@neelc.org> <YMpnf3DcEw6A/rzD@nuc>

next in thread | previous in thread | raw e-mail | index | archive | help
Hi Mark,

Thank you so much for your response!

On 2021-06-16 14:05, Mark Johnston wrote:
> 
> The function in question appears to implement a device page fault
> handler.  In FreeBSD, such handlers are responsible only for ensuring
> that the requested page(s) are present in the VM object backing the
> mapping that was faulted on.  The generic fault handler in
> sys/vm/vm_fault.c is responsible for actually updating the faulting
> process' page tables by calling pmap_enter().  In other words, our 
> fault
> handler interface is quite different from OpenBSD's and their example
> should not be followed exactly.  Adding a vm_object_busy() call in the
> loop will silence the assertion I guess but the handler is still wrong.

Good to hear. No wonder why I still had the "blank screen of death" with 
the (now previous) code.

> If you look further down at vm_fault_gtt() (and in earlier versions of
> the DRM drivers, i915_gem_fault()), the remap_io_mapping()
> implementation in the LinuxKPI does basically what I'm describing.
> Something similar is required for vm_fault_cpu(), though I don't quite
> understand when vm_fault_cpu() is supposed to be used.

I have some code to implement remap_io_sg() based on remap_io_mapping(), 
but it's not complete.

I am still trying to figure out how to get the physical address. Right 
now, I have:

https://github.com/neelchauhan/drm-kmod/commit/92a3d9bb585acb55c1dab9c5ed11190f7db73ecf

My get_pfn() function (Lines 221-231) attempts to get the physical 
address, and it is called at Line 248.

Note: This code is probably incorrect, since it gives me an "page 
already inserted" panic.

Any hints on where the physical address is? Should we have an 
FreeBSD-specific "pa" argument for the physical address if it's needed?

Sorry for the kernel newbie questions.

-Neel (nc@)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?8bd27c2a72ebfa9299bca7d930297faf>