Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 13 Jul 2010 15:24:25 -0500
From:      Mark Tinguely <marktinguely@gmail.com>
To:        Alan Cox <alc@cs.rice.edu>
Cc:        alc@freebsd.org, freebsd-arm@freebsd.org
Subject:   Re: Revision 209887
Message-ID:  <4C3CCB79.8050708@gmail.com>
In-Reply-To: <4C3CB61A.1030905@cs.rice.edu>
References:  <4C3C7B4E.604@gmail.com> <4C3CB61A.1030905@cs.rice.edu>

next in thread | previous in thread | raw e-mail | index | archive | help
Alan Cox wrote:
> Mark Tinguely wrote:
>> pmap_qenter() is pretty expensive on the ARM processor with VIPT 
>> caches, because remapping a KVA can potentially cause the shared 
>> mappings to have their cache turned back on and then immediately 
>> turned back off and force a cache flush. Revision 209887 makes 
>> amd64/i386 pmap_qenter() make smart decisions on the remapping which 
>> would help the ARM.
>>
>> Looking at the buffer code 2 or 3 weeks ago, and  noticed that most 
>> of the pmap_qenter() calls were done wisely. At that time, I was 
>> wondering if we could/should fix the few places that involved a page 
>> by page loop doing bogus_page substitutions and then calling 
>> pmap_qenter() for a full buffer re-map instead of the changed page. 
>> It appeared to me that we call pmap_qenter() L*B times where L is the 
>> number of pages in the buffer and B is the number of bogus pages in 
>> the buffer. We only need to change B pages. I can understand it would 
>> not be worth the change if typically the number of pages in a buffer 
>> and the number of bogus pages in the buffer is small.
>
> I think that vfs_unbusy_pages(), which is used exclusively by NFS, is 
> the only remaining case.  I see no reason not to change it.  Go for it.
>
> Alan
Gee thanks :)

I will do a complete search of pmap_qenter(). Unless I am reading it 
wrong, a quick example is a B_VMIO case in routine bufdone_finish() in 
source file sys/kern/vfs_bio.c:

     for (i = 0; i < bp->b_npages; i++) {
        if (bogus_page) {
            find/substitution page
             pmap_qenter() the entire buffer rather than just the single 
page
        }
       other page operations
    }

--Mark



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