On 26 Mar 2015, at 13:13, Taylor R Campbell 
<[email protected]> wrote:

> Various DRM graphics drivers, including Intel, Radeon, and Nouveau,
> sometimes need to unmap all virtual mappings of certain physical
> pages for which there is no struct vm_page.  The issue is explained in
> detail here:
> 
> https://mail-index.netbsd.org/tech-kern/2014/07/23/msg017392.html
> 
> It's not desirable to simply add struct vm_pages on a freelist that
> uvm_pagealloc ignores, because struct vm_page is large (120 bytes on
> amd64, for example), most of it is unnecessary for P->V tracking, and
> the physical regions that need P->V tracking are large (hundreds of
> megabytes, or gigabytes).
> 
> The attached patch implements the following extension to pmap(9) on
> x86 and uses it in DRM[*].  The implementation uses a linear list of
> pv-tracked ranges, since it is expected to be short (one to three
> elements).  The list is managed with pserialize(9) so it adds no
> locking overhead to existing pmap operations that need to look up
> entries in it.

If you plan to use pserialize here it is time to change
pserialize_perform() to not kpause() every xc_broadcast.

Currently pserialize_perform() takes at least two ticks to complete.

It should be modified as:

        i = 0;
        do {
                mutex_spin_exit(&psz_lock);
                xc = xc_broadcast(XC_HIGHPRI, (xcfunc_t)nullop, NULL, NULL);
                xc_wait(xc);
                if (i++ > 1)
                        kpause("psrlz", false, 1, NULL);
                mutex_spin_enter(&psz_lock);
        } while (!kcpuset_iszero(psz->psz_target));

to become faster in the usual "two activity switches" case.

--
J. Hannken-Illjes - [email protected] - TU Braunschweig (Germany)

Reply via email to