Add kerneldoc comments for pcommit_sfence() describing the purpose of the pcommit instruction and demonstrating the usage of that instruction.
Signed-off-by: Ross Zwisler <ross.zwis...@linux.intel.com> Cc: H Peter Anvin <h.peter.an...@intel.com> Cc: Ingo Molnar <mi...@kernel.org> Cc: Thomas Gleixner <t...@linutronix.de> Cc: Borislav Petkov <b...@alien8.de> --- arch/x86/include/asm/special_insns.h | 37 ++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/arch/x86/include/asm/special_insns.h b/arch/x86/include/asm/special_insns.h index aeb4666e0c0a..1ae81757c05b 100644 --- a/arch/x86/include/asm/special_insns.h +++ b/arch/x86/include/asm/special_insns.h @@ -215,6 +215,43 @@ static inline void clwb(volatile void *__p) : [pax] "a" (p)); } +/** + * pcommit_sfence() - persistent commit and fence + * + * The pcommit instruction ensures that data that has been flushed from the + * processor's cache hierarchy with clwb, clflushopt or clflush is accepted to + * memory and is durable on the DIMM. The primary use case for this is + * persistent memory. + * + * 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) + * { + * 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(p); + * + * // sfence to order clwb/clflushopt/clflush cache flushes + * // mfence via mb() also works + * wmb(); + * + * // pcommit and the required sfence for ordering + * pcommit_sfence(); + * } + * + * After this function completes the data pointed to by vaddr is has been + * accepted to memory and will be durable if the vaddr points to persistent + * memory. + * + * Pcommit must always be ordered by an mfence or sfence, so to help simplify + * things we include both the pcommit and the required sfence in the + * alternatives generated by pcommit_sfence(). + */ static inline void pcommit_sfence(void) { alternative(ASM_NOP7, -- 1.9.3 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/