Messages in this thread | | | Date | Sat, 27 Mar 2004 09:48:39 -0600 | From | Matt Mackall <> | Subject | Re: Fw: potential /dev/urandom scalability improvement |
| |
On Sat, Mar 27, 2004 at 02:29:12AM +0100, Andi Kleen wrote: > Andrew Morton <akpm@osdl.org> writes: > > > > I think this gets it right, but I probably screwed something up. > > > > static inline void prefetch_range(void *addr, size_t len) > > { > > #ifdef ARCH_HAS_PREFETCH > > char *cp; > > unsigned long end; > > > > end = ((unsigned long)addr + len + PREFETCH_STRIDE - 1); > > end &= ~(PREFETCH_STRIDE - 1); > > > > for (cp = addr; cp < (char *)end; cp += PREFETCH_STRIDE) > > prefetch(cp); > > #endif > > } > > The memory/bus controller usually only has a limited queue of > outstanding transactions and for a big buffer you will likely overflow > it. Also usually on modern CPUs it is enough to do prefetch for 2-3 > cache lines at the beginning, then an automatic hardware prefetcher > will kick in and take care of the rest.
Presumable the automatic prefetcher doesn't deal well with non-sequential access patterns. But I suspect the right thing to do is put the knowledge of what's sensible for prefetch priming inside an arch-specific prefetch_range.
-- Matt Mackall : http://www.selenic.com : Linux development and consulting - 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/
| |