On Tue, Jan 3, 2017 at 3:22 PM, Al Viro <viro(a)zeniv.linux.org.uk> wrote:
On Tue, Jan 03, 2017 at 01:14:11PM -0800, Dan Williams wrote:
> Robert was describing the overall flow / mechanics, but I think it is
> easier to visualize the sfence as a flush command sent to a disk
> device with a volatile cache. In fact, that's how we implemented it in
> the pmem block device driver. The pmem block device registers itself
> as requiring REQ_FLUSH to be sent to persist writes. The driver issues
> sfence on the assumption that all writes to pmem have either bypassed
> the cache with movnt, or are scheduled for write-back via one of the
> flush instructions (clflush, clwb, or clflushopt).
1) memcpy_to_pmem() seems to rely upon the __copy_from_user_nocache()
having only used movnt; it does not attempt clwb at all.
Yes, and there was a fix a while back to make sure it always used
movnt so clwb after the fact is not required:
a82eee742452 x86/uaccess/64: Handle the caching of 4-byte nocache
copies properly in __copy_user_nocache()
2) __copy_from_user_nocache() for short copies does not use movnt at
In that case neither sfence nor clwb is issued.
For the 32bit case, yes, but the pmem driver should warn about this
when it checks platform persistent memory capabilities (i.e. x86 32bit
not supported). Ugh, we may have lost that warning for this specific
case recently, I'll go double check and fix it up.
3) it uses movnt only for part of copying in case of misaligned
No clwb is issued, but sfence *is* - at the very end in 64bit case,
between movnt and copying the tail - in 32bit one. Incidentally,
while 64bit case takes care to align the destination for movnt part,
32bit one does not.
How much of the above is broken and what do the callers rely upon?
32bit issues are known, but 64bit path is ok since that fix above.
In particular, is that sfence the right thing for pmem usecases?
That sfence is not there for pmem purposes. The dax / pmem usage does
not expect memcpy_to_pmem() to fence as it may have more writes to
queue up and amortize all the writes with a later fence. This seems to
be even more evidence for moving this functionality away from the
uaccess routines to somewhere more pmem specific.