> > I found an performance bug in c-r4k.c:r4k_dma_cache_inv, where a
> > Hit_Writeback_Inv instead of Hit_Invalidate is done.
The MIPS64 spec (which is really all there is to set standards in this
area) regards Hit_Invalidate as optional. So it would be nice not to
use it. CPUs have no standard "configuration" register you can read
to establish which cacheops work, so to identify capable CPUs you must
use a table of CPU attributes indexed by the CPU ID, which encourages
the crime of building software which can't possibly run on a new CPU...
So long as the buffer is in fact clean, then in most implementations a
Hit_Writeback_Invalidate will be just as efficient.
Moreover, CPUs always "post" writes to some extent, so a small
percentage of dirty lines can be handled without any great overhead.
So a significant advantage can only occur when the buffer you want to
invalidate (prior to DMA-in) was fairly recently densely written by
the CPU; and this is only safe when all that data can be guaranteed to
now be of no importance to anyone.
Randomly and retrospectively discarding writes could generate some
very interesting bugs, or (indeed) usually hide some very interesting
bugs. It's the kind of thing one would lik to avoid!
I suppose where DMA data subsequently gets decorated by the CPU then
handed on to some other layer, then the buffer is freed...?
> FYI, for R4k DECstations the need to flush the cache for newly allocated
> skbs reduces throughput of FDDI reception by about a half (!), down from
> about 90Mbps (that's for the /260)...
How did you measure the high throughput? Have you got a
machine with DMA-coherency you can turn on and off?