I remember dealing with analgous situations in System V many many years
ago. If the cache flushes are virtual, then either there must be
bullet-proof protection (hardware or software) against virtual aliasing,
or they must be flushed on deallocation, before the mapping is
destroyed. The good news is that, provided that DMA buffer management
is done correctly, one should be able to use hit-invalidate instead of
hit-writeback-invalidate on the deallocated pages. That won't save that
many CPU cycles, but it will save some number of memory cycles and
milliwatts.
Regards,
Kevin K.
David VomLehn wrote:
On the MIPS processor, cache flushing is done based on virtual
addresses. However, in the Linux kernel, there are a lot of places
where memory is mapped with kmap or kmap_atomic, then unmapped with
the corresponding kunmap or kunmap_atomic and only *then* is the cache
flushed. In other words, we only flush the cache after we have dropped
the mapping of memory into a virtual address. I think this is
generally wrong.
This may really only affect those of us who have enabled high memory,
but it's pretty prevalent in kernel code. We noted this before, but
have apparently just been bitten by it. Is it just me or is there a
fairly widespread problem for processors that flush the cache using
virtual addresses?
- - - - -
Cisco - - - - - This e-mail and any
attachments may contain information which is confidential,
proprietary, privileged or otherwise protected by law. The information
is solely intended for the named addressee (or a person responsible
for delivering it to the addressee). If you are not the intended
recipient of this message, you are not authorized to read, print,
retain, copy or disseminate this message or any part of it. If you
have received this e-mail in error, please notify the sender
immediately by return e-mail and delete it from your computer.