Messages in this thread |  | | | Date | Tue, 3 Jul 2001 10:38:09 +0100 | | From | "Stephen C. Tweedie" <> | | Subject | Re: about kmap_high function |
| |
Hi,
On Fri, Jun 29, 2001 at 03:06:01PM +0800, michaelc wrote: > I found that the kmap_high function didn't call __flush_tlb_one() > when it mapped a highmem page sucessfully, and I think it maybe > cause the problem that TLB may store obslete page table entries, but > the kmap_atomic() function do call the __flush_tlb_one(), someone tell > me what's the differenc between the kmap_atomic and kmap_high except > that kmap_atomic can be used in IRQ contexts. I appreciate in advance.
kmap_high is intended to be called routinely for access to highmem pages. It is coded to be as fast as possible as a result. TLB flushes are expensive, especially on SMP, so kmap_high tries hard to avoid unnecessary flushes.
The way it does it is to do only a single, complete TLB flush of the whole kmap VA range once every time the kmap address ring cycles. That's what flush_all_zero_pkmaps() does --- it evicts old, unused kmap mappings and flushes the whole TLB range, so that we are guaranteed that there is a TLB flush between any two different uses of any given kmap virtual address.
That way, we can avoid the cost of having to flush the TLB for every single kmap mapping we create.
Cheers, Stephen - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
|  |