[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 6/7] xen/arm: flush D-cache and I-cache when appropriate
At 12:01 +0000 on 13 Nov (1352808094), Stefano Stabellini wrote: > > I think we should have two functions. One should look almost like that > > and be for flushing large ranges, and one much simpler for flushing > > small items. Like this (totally untested, uncompiled even): > > > > #define MIN_CACHELINE_BYTES 32 // or whatever > > > > /* In setup.c somewhere. */ > > if ( READ_CP32(CCSIDR) < MIN_CACHELINE_BYTES ) > > panic("CPU has preposterously small cache lines"); > > > > /* Function for flushing medium-sized areas. > > * if 'range' is large enough we might want to use model-specific > > * full-cache flushes. */ > > static inline void flush_xen_dcache_va_range(void *p, unsigned long size) > > { > > void *end; > > unsigned long cacheline_bytes = READ_CP32(CCSIDR); > > barrier(); /* So the compiler issues all writes to the range */ > > dsb(); /* So the CPU issues all writes to the range */ > > for ( end = p + size; p < end; p += cacheline_bytes ) > > WRITE_CP32(DCCMVAC, p); > > dsb(); /* So we know the flushes happen before continuing */ > > } > > > > /* Macro for flushing a single small item. The predicate is always > > * compile-time constant so this will compile down to 3 instructions in > > * the common case. Make sure to call it with the correct type of > > * pointer! */ > > #define flush_xen_dcache_va(p) do { \ > > typeof(p) _p = (p); \ > > if ( (sizeof *_p) > MIN_CACHELINE_BYTES ) \ > > flush_xen_dcache_va_range(_p, sizeof *_p); \ > > else \ > > asm volatile ( \ > > "dsb;" /* Finish all earlier writes */ \ > > STORE_CP32(0, DCCMVAC) \ > > "dsb;" /* Finish flush before continuing */ \ > > : : "r" (_p), "m" (*_p)); \ > > } while (0) > > > > What do you think? > > I think that is OK, but I would like to avoid reading CCSIDR every > single time we need to do a dcache flush The code above only reads it once for each large dcache flush. When I was writing it I did think of just stashing cacheline_bytes in a read_mostly somewhere, but I had the opposite concern -- wouldn't reading this constant from on-chip be quicker than going to the memory bus for it? :) I'm happy either way. Tim. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |