On 02/20/2015 02:31 AM, tip-bot for Ross Zwisler wrote: > > This function shows how to properly use clwb/clflushopt/clflush > and pcommit with appropriate fencing: > > void flush_and_commit_buffer(void *vaddr, unsigned int size) > { > void *vend = vaddr + size - 1; > > for (; vaddr < vend; vaddr += boot_cpu_data.x86_clflush_size) > clwb(vaddr); > > /* Flush any possible final partial cacheline */ > clwb(vend); > > /* > * sfence to order clwb/clflushopt/clflush cache flushes > * mfence via mb() also works > */ > wmb(); > > /* pcommit and the required sfence for ordering */ > pcommit_sfence(); > } > That may cause the same line to be flushed twice. I would suggest, instead, also removing the arithmetic on void *: Totally untested, yadda yadda... void flush_and_commit_buffer(void *vaddr, unsigned int size) { unsigned long clflush_mask = boot_cpu_data.x86_clflush_size - 1; char *vend = (char *)vaddr + size; char *p; for (p = (char *)((unsigned long)vaddr & ~clflush_mask); p < vend; p += boot_cpu_data.x86_clflush_size) clwb(vaddr); /* * sfence to order clwb/clflushopt/clflush cache flushes * mfence via mb() also works */ wmb(); /* pcommit and the required sfence for ordering */ pcommit_sfence(); } -- To unsubscribe from this list: send the line "unsubscribe linux-tip-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html
![]() |