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)
