Hi Anton,
I'm going to give you a little bit of a long answer...
When a write is in-flight to a block storage device, what happens if you lose power? Many programs assume that a sector will not be torn by power failure, so afterwards, the sector contains either the old data or the new data or, perhaps in rare cases, some sort of error saying the sector's ECC shows it got corrupted.
But in reality this was not guaranteed on traditional storage for years, it was just an assumption made by lots of SW and the case is so rare, the SW was never fixed to deal with torn sectors. More recent specifications, like the NVMe SSD specification, require at least a single sector power fail atomicity, so you know a single sector won't be torn by power failure.
With persistent memory, when you use the storage APIs (like read(2) and write(2) to the device), those just turn into memcpy() calls in the driver. So if you lose power, you are likely to have some of the old data, some of the new data, and no indication of a corrupted block. Again, that should be fine if the SW is designed to handle torn sectors (for example, if it uses checksums or something similar to detect and recover from that case). But there's lots of SW out there written that erroneously thinks sectors cannot be torn by a power failure, including some file systems! And since the memcpy() calls in the driver make this case more common, we invented the BTT algorithm (block translation table) for making sector writes power fail atomic. When you use a "sectored" device for pmem, you are getting the power fail atomic sector writes added for you by the kernel. It has an overhead, depending on the workload, I would expect an extra three 32-bit writes for every sector write. For 4k sectors, that's a small overhead, but it is definitely there. There's an extra "map" lookup (another 32-bit read) that happens on each block read as well.
If you have SW that checksums its log, or uses other mechanisms to detect torn writes, then you can turn off the sectored mode and just get that performance back. But it depends on the SW and if you are not sure, I recommend sticking to the sectored mode to be safe. Lots of database-like applications do indeed write their changes to a log and include a CRC or something similar, so lots of people have figured out the correct way to deal with this already.
The sectored support is not available when you're using DAX. So even if you stick to the standard storage APIs, read and write on DAX will not be protected (and will not use the page cache, since that is what DAX is all about). And, of course, if you memory map a DAX file, the application is taking on full responsibility for detecting torn writes, and only the align 8-byte store is power fail atomic. This is where PMDK comes in, to help make that programming easier.
All that said, we have found applications that check for torn writes already, benefit from skipping the page cache, so run great by just running the unmodified app on top of a DAX file system using standard storage APIs.
Hope that helps,
-andy