Revision 209887
Mark Tinguely
marktinguely at gmail.com
Tue Jul 13 20:24:31 UTC 2010
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
More information about the freebsd-arm
mailing list